From 221c873ee48ed5f44680578d32b0bbf19fd9e4c1 Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期六, 18 十月 2025 15:23:59 +0800
Subject: [PATCH] 钥匙柜

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java                                |    9 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java                 |  180 ++++++++++
 keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml                                               |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java                        |  100 -----
 keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml                                        |   22 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java |   47 ++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java                     |   98 +++++
 keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml                                        |   14 
 keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml                                          |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/LoginCabinetParam.java                  |   22 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java                    |  122 +++++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java           |  101 +++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java                                     |    7 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortReadObserver.java             |    7 
 keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png                                           |    0 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java             |   36 ++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java                         |   29 +
 keyCabinet-android/app/build.gradle                                                                           |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java                   |   39 ++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java                          |  141 ++++++++
 20 files changed, 855 insertions(+), 125 deletions(-)

diff --git a/keyCabinet-android/app/build.gradle b/keyCabinet-android/app/build.gradle
index 3932ece..903c1df 100644
--- a/keyCabinet-android/app/build.gradle
+++ b/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'
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java
index a43b7f2..52187a7 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java
+++ b/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姝e父 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;
     }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java
index 11b3255..8563de9 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java
+++ b/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;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java
index cc4b451..f7e1ae4 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java
+++ b/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姝e父 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;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
index f1cb425..641f088 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
+++ b/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);
 
 }
 
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/LoginCabinetParam.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/LoginCabinetParam.java
new file mode 100644
index 0000000..4620fb1
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
index 625a02f..8055157 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
+++ b/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) {
+                    //姝e父
+                    getVM().cancelFault(bjIds);
+                }else {
+                    //鏁呴殰
+                    getVM().markFault(bjIds);
+                }
+                break;
+            default:
+                break;
+        }
     }
 }
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
index 63968cc..e7c1ef5 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
+++ b/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;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
index cb5ea23..608e910 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
+++ b/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;
+        }
+    }
 }
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java
index cf9d90a..84d3a19 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java
+++ b/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() {
+
+                    }
+                });
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java
index 4799845..7acc26b 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java
+++ b/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() {
+        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;
+            }
+        }
+        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 boolean onLongClick(View v) {
-                if(onItemClick!=null){
-                    onItemClick.onItemClick(item);
-                }
-                return true;
+            public void onClick(View v) {
+                item.getIsSelected().set(!item.getIsSelected().get());
             }
         });
     }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
index 54fcdac..fcac3d4 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
+++ b/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;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java
new file mode 100644
index 0000000..af40f4e
--- /dev/null
+++ b/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;
+    }
+}
+
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortReadObserver.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortReadObserver.java
new file mode 100644
index 0000000..56f9ca5
--- /dev/null
+++ b/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);
+}
+
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java
new file mode 100644
index 0000000..1ce6dc4
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml b/keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml
index 08d573d..b653bea 100644
--- a/keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml
+++ b/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>
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml b/keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml
index 4a5ca0a..b72f283 100644
--- a/keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml
+++ b/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"
diff --git a/keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml b/keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
index 9f48d71..20f9de2 100644
--- a/keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
+++ b/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="鑻廇18812"
+            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>
diff --git a/keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml b/keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml
index ef21c77..f2f2c6e 100644
--- a/keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml
+++ b/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"
diff --git a/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png
new file mode 100644
index 0000000..2a76d6a
--- /dev/null
+++ b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png
Binary files differ

--
Gitblit v1.9.3