doum
19 小时以前 6c12dd77bc481aeabec568bfed3dd68e81b80f8b
Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao
已添加5个文件
已修改15个文件
980 ■■■■ 文件已修改
keyCabinet-android/app/build.gradle 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/LoginCabinetParam.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortReadObserver.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/build.gradle
@@ -126,6 +126,8 @@
    //implementation 'com.github.Shouheng88:compressor:latest-version'
    //压缩图片
    implementation "id.zelory:compressor:1.0.3"
    //串口
    implementation 'com.licheedev:android-serialport:2.1.3'
    //二维码生成
    implementation 'com.journeyapps:zxing-android-embedded:3.4.0'
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java
@@ -5,7 +5,6 @@
import lombok.Data;
@Data
public class CabinetDetailBean implements Serializable {
    //设备编号
    private String code;
@@ -29,101 +28,8 @@
    private Integer unBindGridNum;
    //柜格信息
    private List<CabinetGridInfoVOListBean> cabinetGridInfoVOList;
    private List<ManageKeyCabinetBean> cabinetGridInfoVOList;
    @Data
    public static class CabinetGridInfoVOListBean implements Serializable {
        //绑定状态 0未绑定;1已绑定
        private Integer bindStatus;
        //板号
        private String boardCode;
        //车牌号
        private int carCode;
        //通道号
        private String channelCode;
        //编码
        private String code;
        //主键
        private Integer id;
        //钥匙编码
        private Integer keyId;
        //钥匙状态 0未绑定 1在位 2借出 3维修保养
        private Integer keyStatus;
        //柜体运行状态 0正常 1故障
        private Integer workingStatus;
        public Integer getBindStatus() {
            return bindStatus;
        }
        public void setBindStatus(Integer bindStatus) {
            this.bindStatus = bindStatus;
        }
        public String getBoardCode() {
            return boardCode;
        }
        public void setBoardCode(String boardCode) {
            this.boardCode = boardCode;
        }
        public int getCarCode() {
            return carCode;
        }
        public void setCarCode(int carCode) {
            this.carCode = carCode;
        }
        public String getChannelCode() {
            return channelCode;
        }
        public void setChannelCode(String channelCode) {
            this.channelCode = channelCode;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public Integer getKeyId() {
            return keyId;
        }
        public void setKeyId(Integer keyId) {
            this.keyId = keyId;
        }
        public Integer getKeyStatus() {
            return keyStatus;
        }
        public void setKeyStatus(Integer keyStatus) {
            this.keyStatus = keyStatus;
        }
        public Integer getWorkingStatus() {
            return workingStatus;
        }
        public void setWorkingStatus(Integer workingStatus) {
            this.workingStatus = workingStatus;
        }
    }
    public String getCode() {
        return code;
@@ -205,11 +111,11 @@
        this.unBindGridNum = unBindGridNum;
    }
    public List<CabinetGridInfoVOListBean> getCabinetGridInfoVOList() {
    public List<ManageKeyCabinetBean> getCabinetGridInfoVOList() {
        return cabinetGridInfoVOList;
    }
    public void setCabinetGridInfoVOList(List<CabinetGridInfoVOListBean> cabinetGridInfoVOList) {
    public void setCabinetGridInfoVOList(List<ManageKeyCabinetBean> cabinetGridInfoVOList) {
        this.cabinetGridInfoVOList = cabinetGridInfoVOList;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java
@@ -10,6 +10,7 @@
    //0:取,1:还
    private int flag ;
    private String token;
    public Integer getAutoMemberId() {
        return autoMemberId;
@@ -42,4 +43,12 @@
    public void setFlag(int flag) {
        this.flag = flag;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java
@@ -1,5 +1,101 @@
package com.doumee.keyCabinet.bean;
public class ManageKeyCabinetBean {
import androidx.databinding.ObservableField;
public class ManageKeyCabinetBean {
    //绑定状态 0未绑定;1已绑定
    private Integer bindStatus;
    //板号
    private String boardCode;
    //车牌号
    private int carCode;
    //通道号
    private String channelCode;
    //编码
    private String code;
    //主键
    private Integer id;
    //钥匙编码
    private Integer keyId;
    //钥匙状态 0未绑定 1在位 2借出 3维修保养
    private Integer keyStatus;
    //柜体运行状态 0正常 1故障
    private Integer workingStatus;
    private ObservableField<Boolean> isSelected = new ObservableField<>(false);
    public ObservableField<Boolean> getIsSelected() {
        return isSelected;
    }
    public Integer getBindStatus() {
        return bindStatus;
    }
    public void setBindStatus(Integer bindStatus) {
        this.bindStatus = bindStatus;
    }
    public String getBoardCode() {
        return boardCode;
    }
    public void setBoardCode(String boardCode) {
        this.boardCode = boardCode;
    }
    public int getCarCode() {
        return carCode;
    }
    public void setCarCode(int carCode) {
        this.carCode = carCode;
    }
    public String getChannelCode() {
        return channelCode;
    }
    public void setChannelCode(String channelCode) {
        this.channelCode = channelCode;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getKeyId() {
        return keyId;
    }
    public void setKeyId(Integer keyId) {
        this.keyId = keyId;
    }
    public Integer getKeyStatus() {
        return keyStatus;
    }
    public void setKeyStatus(Integer keyStatus) {
        this.keyStatus = keyStatus;
    }
    public Integer getWorkingStatus() {
        return workingStatus;
    }
    public void setWorkingStatus(Integer workingStatus) {
        this.workingStatus = workingStatus;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
@@ -83,7 +83,7 @@
     * èŽ·å–é’¥åŒ™æŸœè¯¦æƒ… - ç®¡ç†å‘˜
     */
    @GET("/visitsAdmin/cloudService/web/cabinet/getCabinetDetail")
    Observable<BaseResponse<List<CabinetDetailBean>>> getCabinetDetail(@Header("dm_user_token") String token,@Query("cabinetId")Integer cabinetId);
    Observable<BaseResponse<CabinetDetailBean>> getCabinetDetail(@Header("dm_user_token") String token,@Query("cabinetId")Integer cabinetId);
    /**
     * æ‰¹é‡å¼€é—¨ - ç®¡ç†å‘˜
@@ -109,6 +109,11 @@
    @POST("/visitsAdmin/cloudService/web/cabinet/markRepair")
    Observable<BaseResponse> markRepair(@Header("dm_user_token") String token,@Body RequestBody requestBody);
    /**
     * æ ‡è®°ç»´ä¿®ä¿å…» - ç®¡ç†å‘˜
     */
    @POST("/loginCabinet")
    Observable<BaseResponse<String>> loginCabinet(@Body RequestBody requestBody);
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/LoginCabinetParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.doumee.keyCabinet.http.param;
public class LoginCabinetParam {
    private String password;
    private String username;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -2,19 +2,30 @@
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.bean.CabinetDetailBean;
import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
import com.doumee.keyCabinet.databinding.ManageCabinetActivityBinding;
import com.doumee.keyCabinet.ui.keyCabinet.adapter.ManageCabinetRcvAdapter;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import java.util.ArrayList;
import java.util.List;
import dagger.hilt.android.AndroidEntryPoint;
@AndroidEntryPoint
public class ManageCabinetActivity extends MyBaseActivity<ManageCabinetVM, ManageCabinetActivityBinding> {
    private ManageCabinetRcvAdapter adapter;
    //1待全开,2待批量开
    private int status;
    @Override
    public int getLayoutId() {
@@ -31,6 +42,96 @@
    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        getVM().getDatasLD().observe(this, new Observer<List<ManageKeyCabinetBean>>() {
            @Override
            public void onChanged(List<ManageKeyCabinetBean> gridInfoBeans) {
    }
        });
        getVM().getCabinetDetail();
    }
    private List<Integer> bjIds = new ArrayList<>();
    private boolean isGz = true;
    @Override
    protected void doRegister(int type, ActionEventData data) {
        switch (type){
            case 1:
                //todo wmf æ ¡éªŒæŸœå­æ˜¯å¦éƒ½å·²å…³é—­
                finish();
                break;
            case 2:
                //全开
                status = 1;
                //todo å…¨å¼€
                break;
            case 3: {
                //批量开门,校验是否可打开
                List<Integer> ids = new ArrayList<>();
                List<ManageKeyCabinetBean> datas = adapter.getListData();
                for (ManageKeyCabinetBean bean : datas) {
                    if (bean.getIsSelected().get()) {
                        ids.add(bean.getId());
                    }
                }
                if (ids.size() == 0) {
                    Toast.makeText(mContext, "请选择柜格", Toast.LENGTH_SHORT).show();
                    return;
                }
                getVM().batchOpenGridAdmin(ids);
                }break;
            case 8:
                status = 2;
                //todo æ‰¹é‡å¼€
                break;
            case 4: {
                //标记
                bjIds.clear();
                isGz = true;
                List<ManageKeyCabinetBean> datas = adapter.getListData();
                for (ManageKeyCabinetBean bean : datas) {
                    if (bean.getIsSelected().get()) {
                        bjIds.add(bean.getId());
                        if(bean.getWorkingStatus()==0){
                            isGz = false;
                        }
                    }
                }
                if (bjIds.size() == 0) {
                    Toast.makeText(mContext, "请选择柜格", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(isGz){
                    //全为故障
                    getDB().tvBjgz.setText("标记为正常");
                    getDB().tvBjgz.setTextColor(0xff279BAA);
                    getDB().tvBjgz.setBackgroundResource(R.drawable.shape_mb_cz_2_bg);
                }else {
                    //标记故障
                    getDB().tvBjgz.setText("标记为故障");
                    getDB().tvBjgz.setTextColor(0xffFF3600);
                    getDB().tvBjgz.setBackgroundResource(R.drawable.shape_mb_cz_1_bg);
                }
                getDB().clCz.setVisibility(View.VISIBLE);
                }break;
            case 5:
                getDB().clCz.setVisibility(View.GONE);
                break;
            case 6:
                //ç»´ä¿®
                getVM().markRepair(bjIds);
                break;
            case 7:
                if(isGz) {
                    //正常
                    getVM().cancelFault(bjIds);
                }else {
                    //故障
                    getVM().markFault(bjIds);
                }
                break;
            default:
                break;
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
@@ -3,12 +3,32 @@
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableField;
import androidx.hilt.lifecycle.ViewModelInject;
import androidx.lifecycle.MutableLiveData;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.bean.CabinetDetailBean;
import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
import com.doumee.keyCabinet.http.Apis;
import com.doumee.keyCabinet.http.param.BaseResponse;
import com.doumee.keyCabinet.http.param.BatchOpenGridAdminParam;
import com.doumee.keyCabinet.http.param.CancelFaultParam;
import com.doumee.keyCabinet.http.param.MarkFaultParam;
import com.doumee.keyCabinet.http.param.MarkRepairParam;
import com.doumee.keyCabinet.utils.ParamsUtil;
import com.doumee.lib_coremodel.base.BaseModel;
import com.doumee.lib_coremodel.base.DataViewModel;
import com.doumee.lib_coremodel.http.rxJava.SimpleObserver;
import com.doumee.lib_coremodel.http.utils.RxUtils;
import java.util.ArrayList;
import java.util.List;
public class ManageCabinetVM extends DataViewModel {
    public ObservableField<CabinetDetailBean> dataOb = new ObservableField<>();
    private MutableLiveData<List<ManageKeyCabinetBean>> datasLD = new MutableLiveData<>();
    @ViewModelInject
    public ManageCabinetVM(@NonNull Application application, BaseModel model) {
        super(application, model);
@@ -18,4 +38,164 @@
    protected void clickByTypeCommand(int type) {
        doAction(type);
    }
    public void getCabinetDetail(){
        showLoading(true);
        getRetrofitService(Apis.class).getCabinetDetail(MApplication.getLoginBean().getToken(),
                        MApplication.getConfigBean().getId())
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse<CabinetDetailBean>>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse<CabinetDetailBean> response) {
                        if(200==response.getCode()){
                            dataOb.set(response.getData());
                            if(response.getData()!=null){
                                if(response.getData().getCabinetGridInfoVOList()!=null){
                                    datasLD.setValue(response.getData().getCabinetGridInfoVOList());
                                }else {
                                    datasLD.setValue(new ArrayList<>());
                                }
                            }else {
                                datasLD.setValue(new ArrayList<>());
                            }
                        }else {
                            toast(response.getMessage());
                        }
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                        toast(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                        hideLoading();
                    }
                });
    }
    public void batchOpenGridAdmin(List<Integer> gridIdList){
        showLoading(true);
        BatchOpenGridAdminParam param = new BatchOpenGridAdminParam();
        param.setCabinetId(MApplication.getConfigBean().getId());
        param.setGridIdList(gridIdList);
        getRetrofitService(Apis.class).batchOpenGridAdmin(MApplication.getLoginBean().getToken(),
                        ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        if(200==response.getCode()){
                            doAction(8);
                        }else {
                            toast(response.getMessage());
                        }
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                        toast(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                        hideLoading();
                    }
                });
    }
    public void cancelFault(List<Integer> gridIdList){
        showLoading(true);
        CancelFaultParam param = new CancelFaultParam();
        param.setCabinetId(MApplication.getConfigBean().getId());
        param.setGridIdList(gridIdList);
        getRetrofitService(Apis.class).cancelFault(MApplication.getLoginBean().getToken(),
                        ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        if(200==response.getCode()){
                            getCabinetDetail();
                        }else {
                            toast(response.getMessage());
                        }
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                        toast(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                        hideLoading();
                    }
                });
    }
    public void markFault(List<Integer> gridIdList){
        showLoading(true);
        MarkFaultParam param = new MarkFaultParam();
        param.setCabinetId(MApplication.getConfigBean().getId());
        param.setGridIdList(gridIdList);
        getRetrofitService(Apis.class).markFault(MApplication.getLoginBean().getToken(),
                        ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        if(200==response.getCode()){
                            getCabinetDetail();
                        }else {
                            toast(response.getMessage());
                        }
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                        toast(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                        hideLoading();
                    }
                });
    }
    public void markRepair(List<Integer> gridIdList){
        showLoading(true);
        MarkRepairParam param = new MarkRepairParam();
        param.setCabinetId(MApplication.getConfigBean().getId());
        param.setGridIdList(gridIdList);
        getRetrofitService(Apis.class).markRepair(MApplication.getLoginBean().getToken(),
                        ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        if(200==response.getCode()){
                            getCabinetDetail();
                        }else {
                            toast(response.getMessage());
                        }
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                        toast(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                        hideLoading();
                    }
                });
    }
    public MutableLiveData<List<ManageKeyCabinetBean>> getDatasLD() {
        return datasLD;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
@@ -4,10 +4,14 @@
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.databinding.ManageLoginActivityBinding;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import dagger.hilt.android.AndroidEntryPoint;
@@ -31,4 +35,36 @@
    public void initData(@Nullable Bundle savedInstanceState) {
    }
    @Override
    protected void doRegister(int type, ActionEventData data) {
        switch (type){
            case 1:
                //显示密码
                break;
            case 2:
                if(TextUtils.isEmpty(getDB().etName.getText().toString())){
                    Toast.makeText(mContext, "请输入登录账号", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(TextUtils.isEmpty(getDB().etPw.getText().toString())){
                    Toast.makeText(mContext, "请输入账号密码", Toast.LENGTH_SHORT).show();
                    return;
                }
                getVM().loginCabinet(getDB().etName.getText().toString(),getDB().etPw.getText().toString());
                break;
            case 3:
                //显示加载
                getDB().clProgress.setVisibility(View.VISIBLE);
                getDB().clTip.setVisibility(View.GONE);
                break;
            case 4:
                getDB().clProgress.setVisibility(View.GONE);
                getDB().clTip.setVisibility(View.VISIBLE);
                break;
            default:
                break;
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java
@@ -5,8 +5,17 @@
import androidx.annotation.NonNull;
import androidx.hilt.lifecycle.ViewModelInject;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.bean.KeyCabinetBean;
import com.doumee.keyCabinet.http.Apis;
import com.doumee.keyCabinet.http.param.BaseResponse;
import com.doumee.keyCabinet.http.param.LoginCabinetParam;
import com.doumee.keyCabinet.http.param.OpenGridDriverParam;
import com.doumee.keyCabinet.utils.ParamsUtil;
import com.doumee.lib_coremodel.base.BaseModel;
import com.doumee.lib_coremodel.base.DataViewModel;
import com.doumee.lib_coremodel.http.rxJava.SimpleObserver;
import com.doumee.lib_coremodel.http.utils.RxUtils;
public class ManageLoginVM extends DataViewModel {
    @ViewModelInject
@@ -18,4 +27,34 @@
    protected void clickByTypeCommand(int type) {
        doAction(type);
    }
    public void loginCabinet(String userName,String pw){
        LoginCabinetParam param = new LoginCabinetParam();
        param.setUsername(userName);
        param.setPassword(pw);
        doAction(3);
        getRetrofitService(Apis.class).loginCabinet(ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse<String>>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse<String> response) {
                        if(200==response.getCode()){
                            MApplication.getLoginBean().setToken(response.getData());
                            startActivity(ManageCabinetActivity.class);
                        }else {
                            doAction(4);
                        }
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                        doAction(4);
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java
@@ -3,6 +3,7 @@
import android.content.Context;
import android.view.View;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.bean.KeyCabinetBean;
import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
import com.doumee.keyCabinet.databinding.CabinetRcvItemBinding;
@@ -11,25 +12,47 @@
import com.doumee.lib_coremodel.view.recyclerview.adapter.BindingHolder;
public class ManageCabinetRcvAdapter extends BindingAdapter<ManageKeyCabinetBean, ManageCabinetRcvItemBinding> {
    public static interface OnItemClick{
        void onItemClick(ManageKeyCabinetBean item);
    }
    private OnItemClick onItemClick;
    public ManageCabinetRcvAdapter(Context context, int layoutId, OnItemClick onItemClick) {
    public ManageCabinetRcvAdapter(Context context, int layoutId) {
        super(context, layoutId);
        this.onItemClick = onItemClick;
    }
    @Override
    public void bindViewDatas(BindingHolder<ManageCabinetRcvItemBinding> holder, ManageKeyCabinetBean item, int position) {
        holder.getBinding().setData(item);
        holder.getBinding().clRoot.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(onItemClick!=null){
                    onItemClick.onItemClick(item);
        if(item.getWorkingStatus()==1){
            //故障
            holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c04_6_bg);
        }else {
            //0未绑定 1在位 2借出 3维修保养
            switch (item.getKeyStatus()){
                case 0:
                    holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c05_6_bg);
                    break;
                case 1:
                    holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c01_6_bg);
                    break;
                case 2:
                    holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c02_6_bg);
                    break;
                default:
                    holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c03_6_bg);
                    break;
                }
                return true;
        }
        if(item.getWorkingStatus()==0&&item.getKeyStatus()==3){
            //ç»´ä¿®
            holder.getBinding().tv1.setTextColor(0xff279BAA);
            holder.getBinding().tv2.setTextColor(0xff279BAA);
        }else {
            holder.getBinding().tv1.setTextColor(0xffffffff);
            holder.getBinding().tv2.setTextColor(0xffffffff);
        }
        holder.getBinding().clRoot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                item.getIsSelected().set(!item.getIsSelected().get());
            }
        });
    }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -8,6 +8,8 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.Camera;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -75,6 +77,9 @@
import com.doumee.keyCabinet.utils.face.ImportFileManager;
import com.doumee.keyCabinet.utils.face.RegisterConfigUtils;
import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig;
import com.doumee.keyCabinet.utils.i485.SerialPortModel;
import com.doumee.keyCabinet.utils.i485.SerialPortReadObserver;
import com.doumee.keyCabinet.utils.i485.SportUtils;
import com.doumee.keyCabinet.utils.update.PermissionUtils;
import com.doumee.keyCabinet.utils.update.PermissiondDialog;
import com.doumee.keyCabinet.utils.update.UpdateUtil;
@@ -101,6 +106,7 @@
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.Timer;
@@ -182,6 +188,7 @@
        startService(intent2);
        getPermission();
        Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
        initPort();
    }
    private void initM(){
@@ -388,6 +395,8 @@
        handler = null;
        faceHandler.removeCallbacksAndMessages(null);
        faceHandler = null;
        portHandler.removeCallbacksAndMessages(null);
        portHandler = null;
    }
    private void restartApp(){
@@ -1042,4 +1051,136 @@
        }
    }
    private SerialPortModel gridPort;
    private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
        @Override
        public void onResult(String result) {
        }
        @Override
        public void onResultBytes(byte[] bytes) {
            if(gridPort!=null && !gridPort.isOk()){
                gridPort.setOk(true);
            }
        }
    };
    private SerialPortModel keyPort;
    private SerialPortReadObserver keyReadObserver = new SerialPortReadObserver() {
        @Override
        public void onResult(String result) {
        }
        @Override
        public void onResultBytes(byte[] bytes) {
            if(keyPort!=null && !keyPort.isOk()){
                keyPort.setOk(true);
            }
        }
    };
    private SerialPortModel jiuPort;
    private SerialPortReadObserver jiuReadObserver = new SerialPortReadObserver() {
        @Override
        public void onResult(String result) {
        }
        @Override
        public void onResultBytes(byte[] bytes) {
            if(jiuPort!=null && !jiuPort.isOk()){
                jiuPort.setOk(true);
            }
        }
    };
    List<String> ports;
    private int index = 0;
    private Handler portHandler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 0:
                    if(index>=1&&!checkEnd()){
                        index--;
                        chosePort(ports.get(index));
                    }
                    break;
                default:
                    break;
            }
        }
    };
    //初始化串口
    private void initPort(){
        ports = SportUtils.getSerialPortPaths(this);
        if(ports.size()>0){
            index = ports.size()-1;
            chosePort(ports.get(ports.size()-1));
        }
    }
    private void chosePort(String path){
        if(gridPort==null||!gridPort.isOk()){
            closePort(gridPort);
            gridPort = new SerialPortModel(path,9600 ,8
                    ,1 , 0);
            boolean isSucc = gridPort.open();
            if(isSucc) {
                String msg = isSucc ? "成功" : "失败";
                //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
                gridPort.startRead(gridReadObserver);
                //todo å‘送柜格校验信息
            }
        }
        if(keyPort==null||!keyPort.isOk()){
            closePort(keyPort);
            keyPort = new SerialPortModel(path,115200 ,8
                    ,1 , 0);
            boolean isSucc = keyPort.open();
            if(isSucc) {
                String msg = isSucc ? "成功" : "失败";
                //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
                keyPort.startRead(keyReadObserver);
                //todo å‘送钥匙校验信息
            }
        }
        if(jiuPort==null||!jiuPort.isOk()){
            closePort(jiuPort);
            jiuPort = new SerialPortModel(path,9600 ,8
                    ,1 , 0);
            boolean isSucc = jiuPort.open();
            if(isSucc) {
                String msg = isSucc ? "成功" : "失败";
                //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
                jiuPort.startRead(jiuReadObserver);
                //todo å‘送酒精校验信息
            }
        }
        portHandler.sendEmptyMessageDelayed(0,2000);
    }
    private void closePort(SerialPortModel port){
        if(port==null){
            return;
        }
        port.startRead(null);
        port.stopRead();
        port.close();
        port = null;
    }
    private boolean checkEnd(){
        if(gridPort==null||!gridPort.isOk()){
            return false;
        }
        if(keyPort==null||!keyPort.isOk()){
            return false;
        }
        if(jiuPort==null||!jiuPort.isOk()){
            return false;
        }
        return true;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.doumee.keyCabinet.utils.i485;
import android.serialport.SerialPort;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class SerialPortModel {
    public static final String TAG = SerialPortModel.class.getSimpleName();
    private void logI(String str) {
        Log.i(TAG, str);
    }
    private String serialPortPath;
    private int baudrate;
    private int dataBits;
    private int stopBits;
    private int parity;
    private SerialPort serialPort;
    private ScheduledExecutorService scheduledExecutorService;
    private ExecutorService singleThreadExecutor;
    private ScheduledFuture scheduledFuture;
    private boolean isOk = false;
    private final Object writeLock = new Object();
    public SerialPortModel(String serialPortPath, int baudrate, int dataBits, int stopBits, int parity) {
        this.serialPortPath = serialPortPath;
        this.baudrate = baudrate;
        this.dataBits = dataBits;
        this.stopBits = stopBits;
        this.parity = parity;
    }
    public boolean open() {
        try {
            File device = new File(serialPortPath);
            serialPort = SerialPort
                    .newBuilder(device, baudrate)
                    .dataBits(dataBits)
                    .stopBits(stopBits)
                    .parity(parity)
                    .build();
            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
            singleThreadExecutor = Executors.newSingleThreadExecutor();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    public void close() {
        try {
            serialPort.getInputStream().close();
            serialPort.getOutputStream().close();
            serialPort.close();
            serialPort = null;
            scheduledExecutorService.shutdown();
            singleThreadExecutor.shutdown();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void startRead(SerialPortReadObserver serialPortReadObserver) {
        scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
            InputStream inputStream = serialPort.getInputStream();
            byte[] bytes = new byte[2048];
            int length = 0;
            try {
                length = inputStream.read(bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
//            logI("startRead - length: " + length);
            if (length <= 0) return;
            //String result = new String(bytes, 0, length);
            byte[] bytes2 = new byte[length];
            for(int i=0;i<length;i++){
                bytes2[i] = bytes[i];
            }
            serialPortReadObserver.onResultBytes(bytes2);
        }, 0, 50, TimeUnit.MILLISECONDS);
    }
    public void stopRead() {
        scheduledFuture.cancel(true);
    }
    public void write(byte[] bytes,SerialPortReadObserver serialPortReadObserver) {
        singleThreadExecutor.execute(() -> {
            synchronized (writeLock) {
                try {
                    serialPort.getOutputStream().write(bytes);
                    serialPortReadObserver.onResult(null);
                } catch (IOException e) {
                    e.printStackTrace();
                    serialPortReadObserver.onResult(e.getMessage());
                }
            }
        });
    }
    public boolean isOk() {
        return isOk;
    }
    public void setOk(boolean ok) {
        isOk = ok;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortReadObserver.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.doumee.keyCabinet.utils.i485;
public interface SerialPortReadObserver {
 void onResult(String result);
 void onResultBytes(byte[] bytes);
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.keyCabinet.utils.i485;
import android.content.Context;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import java.util.ArrayList;
import java.util.List;
public class SportUtils {
    public static List<String> getSerialPortPaths(Context context) {
        UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
        List<UsbDevice> devices = new ArrayList<>(usbManager.getDeviceList().values());
        List<String> serialPaths = new ArrayList<>();
        for (UsbDevice device : devices) {
            for (int i = 0; i < device.getInterfaceCount(); i++) {
                UsbInterface intf = device.getInterface(i);
                if (intf.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) {
                    serialPaths.add(device.getDeviceName());
                    break;
                }
            }
        }
        return serialPaths;
    }
}
keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml
@@ -2,6 +2,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle"
    >
    <solid android:color="#279BAA" />
    <solid android:color="#26279BAA" />
    <corners android:radius="6dp" />
</shape>
keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml
@@ -44,7 +44,7 @@
            android:id="@+id/tv_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:text='@{model.dataOb.gridNum+""}'
            android:textColor="#111111"
            android:textSize="22sp"
            app:layout_constraintTop_toTopOf="@+id/tv1"
@@ -121,7 +121,7 @@
                    android:id="@+id/tv_zw_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0"
                    android:text='@{model.dataOb.onlineKeyNum+""}'
                    android:textColor="#ff111111"
                    android:textSize="21sp"
                    android:paddingBottom="3dp"/>
@@ -156,7 +156,7 @@
                    android:id="@+id/tv_jc_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0"
                    android:text='@{model.dataOb.outKeyNum+""}'
                    android:textColor="#ff111111"
                    android:textSize="21sp"
                    android:paddingBottom="3dp"/>
@@ -191,7 +191,7 @@
                    android:id="@+id/tv_wx_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0"
                    android:text='@{model.dataOb.serviceKeyNum+""}'
                    android:textColor="#ff111111"
                    android:textSize="21sp"
                    android:paddingBottom="3dp"/>
@@ -250,7 +250,7 @@
                    android:id="@+id/tv_gz_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0"
                    android:text='@{model.dataOb.errGridNum+""}'
                    android:textColor="#ff111111"
                    android:textSize="21sp"
                    android:paddingBottom="3dp"/>
@@ -285,7 +285,7 @@
                    android:id="@+id/tv_wbd_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0"
                    android:text='@{model.dataOb.unBindGridNum+""}'
                    android:textColor="#ff111111"
                    android:textSize="21sp"
                    android:paddingBottom="3dp"/>
@@ -382,7 +382,7 @@
            android:id="@+id/cl_cz"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone">
            android:visibility="visible">
            <View
                android:layout_width="match_parent"
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="android.view.View"/>
        <variable
            name="data"
            type="com.doumee.keyCabinet.bean.ManageKeyCabinetBean" />
@@ -10,31 +11,40 @@
        android:id="@+id/cl_root"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="9dp"
        android:background="@drawable/shape_r6_cabinet_unsel_bg">
        android:background="@drawable/shape_c01_6_bg">
        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="A02"
            android:text="@{data.code}"
            android:textColor="#ff111111"
            android:textSize="24sp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>
            android:layout_marginLeft="15dp"
            android:layout_marginTop="9dp" />
        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="苏A18812"
            android:text="@{data.carCode}"
            android:textColor="#ff279baa"
            android:textSize="24sp"
            app:layout_constraintTop_toBottomOf="@+id/tv1"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="10dp"
            android:paddingBottom="9dp"/>
        <ImageView
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:src="@mipmap/ic_sel"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginTop="7dp"/>
            app:layout_constraintBottom_toBottomOf="parent"
            android:visibility="@{data.isSelected?View.VISIBLE:View.GONE}"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml
@@ -72,6 +72,7 @@
                android:layout_marginLeft="22dp"/>
            <EditText
                android:id="@+id/et_name"
                android:layout_width="0dp"
                android:layout_height="75dp"
                android:background="@null"
@@ -121,6 +122,7 @@
                android:layout_marginLeft="22dp"/>
            <EditText
                android:id="@+id/et_pw"
                android:layout_width="0dp"
                android:layout_height="75dp"
                android:background="@null"
keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png