From 8d459194e620a691994fb8226fb08c51a3dd8065 Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期三, 29 十月 2025 21:33:24 +0800
Subject: [PATCH] 钥匙柜

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java           |    5 
 keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java          |    4 
 keyCabinet-android/app/src/main/res/layout/main_activity.xml                                        |   29 +
 keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml                              |   12 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CircularQueue.java                 |   27 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java    |  135 ++++++---
 keyCabinet-android/app/src/main/res/layout/face_activity.xml                                        |   55 +++
 keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml                                |    8 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java                      |   27 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java    |    9 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java     |   68 ++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java |  127 +++++++--
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java                |   88 +++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/CheckGridStatusEvent.java          |    5 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java           |    3 
 keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml                                 |    4 
 keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java                  |   15 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java                      |   19 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java                |  175 ++++++++----
 19 files changed, 627 insertions(+), 188 deletions(-)

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/CheckGridStatusEvent.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/CheckGridStatusEvent.java
new file mode 100644
index 0000000..28bd59b
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/CheckGridStatusEvent.java
@@ -0,0 +1,5 @@
+package com.doumee.keyCabinet.event;
+
+//鏌ヨ鎵�鏈夐棬鐘舵��
+public class CheckGridStatusEvent {
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java
index b6fd389..f39bb62 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java
@@ -3,6 +3,7 @@
 public class AlcoholTestAlarmParam {
     //浼氬憳id
     private Integer memberId;
+    private String alcoholNum;
 
     public Integer getMemberId() {
         return memberId;
@@ -11,4 +12,12 @@
     public void setMemberId(Integer memberId) {
         this.memberId = memberId;
     }
+
+    public String getAlcoholNum() {
+        return alcoholNum;
+    }
+
+    public void setAlcoholNum(String alcoholNum) {
+        this.alcoholNum = alcoholNum;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
index bcc9095..e935ae4 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -9,9 +9,11 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.text.Editable;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.text.style.TextAppearanceSpan;
 import android.view.View;
 import android.view.ViewTreeObserver;
@@ -35,6 +37,7 @@
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
 import com.doumee.lib_coremodel.util.SpUtil;
 import com.doumee.lib_coremodel.util.StringUtil;
+import com.doumee.lib_coremodel.view.ToastView;
 import com.example.datalibrary.callback.CameraDataCallback;
 import com.example.datalibrary.callback.FaceDetectCallBack;
 import com.example.datalibrary.gatecamera.CameraPreviewManager;
@@ -137,6 +140,8 @@
                 break;
             case 1:
                 //鍙�-绠$悊鍛樺埛鍗¢獙璇�
+                getDB().etEwm.setText("");
+                getDB().etEwm.requestFocus();
                 getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
@@ -162,6 +167,8 @@
                 break;
             case 3:
                 //鍙�-鍙告満鍒峰崱楠岃瘉
+                getDB().etEwm.setText("");
+                getDB().etEwm.requestFocus();
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clSjXuan.setVisibility(View.GONE);
@@ -183,14 +190,15 @@
                     //寮�濮嬫娴�
                     EventBus.getDefault().post(new JiujinBeginEvent());
                 }else {
-                    ToastUtils.toast(this,"鏈幏鍙栧埌閰掔簿娴撳害鎶ヨ鍊�");
+                    ToastView.show(this,"鏈幏鍙栧埌閰掔簿娴撳害鎶ヨ鍊�");
                     statusFsm(6);
                 }
                 break;
             case 6:
                 //鍙�-鍙告満閰掔簿妫�娴嬪け璐�
-                Toast.makeText(mContext, "鍙告満閰掔簿妫�娴嬪け璐�", Toast.LENGTH_SHORT).show();
+                //Toast.makeText(mContext, "鍙告満閰掔簿妫�娴嬪け璐�", Toast.LENGTH_SHORT).show();
                 getDB().clJiu.setVisibility(View.GONE);
+                getDB().tvJg1.setText("閰掔簿妫�娴嬪紓甯革紝璇烽噸鏂版娴�");
                 getDB().clTip1.setVisibility(View.VISIBLE);
                 break;
             case 7:
@@ -202,10 +210,18 @@
                 break;
             case 8:
                 //杩�-鍙告満鍒峰崱楠岃瘉
+                getDB().etEwm.setText("");
+                getDB().etEwm.requestFocus();
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                break;
+            case 9:
+                //鍙�-鍙告満閰掔簿妫�娴嬪け璐�
+                getDB().clJiu.setVisibility(View.GONE);
+                getDB().tvJg1.setText("閰掔簿妫�娴嬭秴鏍�");
+                getDB().clTip1.setVisibility(View.VISIBLE);
                 break;
             default:
                 break;
@@ -266,6 +282,21 @@
             case 5:
                 statusFsm(4);
                 break;
+            case 6:
+                //绠$悊鍛榠c鍗℃垚鍔�
+                statusFsm(5);
+                break;
+            case 7:
+                //鍙告満ic鍗℃垚鍔�
+                if(flag==0) {
+                    //鍙�
+                    statusFsm(4);
+                }else {
+                    //杩�
+                    startActivity(KeyCabinetActivity.class);
+                    finish();
+                }
+                break;
             default:
                 break;
         }
@@ -296,12 +327,39 @@
 
         //ic鍗¤鍙�
         getDB().etEwm.requestFocus();
-        getDB().etEwm.setShowSoftInputOnFocus(false);
+        getDB().etEwm.setFocusable(true);
+        getDB().etEwm.setShowSoftInputOnFocus(true);
         hideSoftKeyboard(getDB().etEwm);
         getDB().etEwm.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
             @Override
             public void onGlobalLayout() {
                 hideSoftKeyboard(getDB().etEwm);
+            }
+        });
+        getDB().etEwm.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                String m = s.toString();
+                if(TextUtils.isEmpty(m)){
+                    return;
+                }
+                if(status!=1&&status!=3&&status!=8){
+                    return;
+                }
+                if(handler.hasMessages(5)){
+                    handler.removeMessages(5);
+                }
+                handler.sendEmptyMessageDelayed(5,500);
             }
         });
     }
@@ -428,7 +486,8 @@
                     //isCheckFace = false;
                     break;
                 case 3:
-                    Toast.makeText(mContext, "閰掔簿妫�鏌ヨ繑鍥�", Toast.LENGTH_SHORT).show();
+                    getDB().clJiujinProgress.setVisibility(View.GONE);
+                    //Toast.makeText(mContext, "閰掔簿妫�鏌ヨ繑鍥�", Toast.LENGTH_SHORT).show();
                     if(new BigDecimal(MApplication.getConfigBean().getCabinetConfigDataVO().getConcentration())
                             .compareTo(resultEvent.getConcentration())>=0){
                         //閰掔簿閫氳繃
@@ -436,14 +495,26 @@
                         handler.sendEmptyMessageDelayed(4,1000);
                     }else {
                         //閰掔簿涓嶉�氳繃
-                        getVM().alcoholTestAlarm("");
-                        Toast.makeText(mContext, "閰掔簿妫�娴嬩笉閫氳繃", Toast.LENGTH_SHORT).show();
-                        statusFsm(6);
+                        getVM().alcoholTestAlarm(resultEvent.getConcentration().toString());
+                        //Toast.makeText(mContext, "閰掔簿妫�娴嬭秴鏍�", Toast.LENGTH_SHORT).show();
+                        statusFsm(9);
                     }
                     break;
                 case 4:
                     startActivity(KeyCabinetActivity.class);
                     finish();
+                    break;
+                case 5:
+                    String m = getDB().etEwm.getText().toString();
+                    int index = m.indexOf("\r");
+                    if(index!=-1){
+                        m = m.substring(0,index);
+                    }
+                    if(!TextUtils.isEmpty(m)){
+                        getVM().getMemberIdByCode(m,status==1?"0":"1");
+                    }
+                    getDB().etEwm.setText("");
+                    getDB().etEwm.requestFocus();
                     break;
                 default:
                     break;
@@ -596,8 +667,10 @@
         if(!isFinishing()){
             //Toast.makeText(mContext, "閰掔簿妫�娴嬭繑鍥烇細"+e.isOk(), Toast.LENGTH_SHORT).show();
             if(!e.isOk()){
+                getDB().clJiujinProgress.setVisibility(View.GONE);
                 statusFsm(6);
             }else {
+                getDB().clJiujinProgress.setVisibility(View.VISIBLE);
                 if(resultEvent==null){
                     resultEvent = e;
                 }else if(resultEvent.getConcentration().compareTo(e.getConcentration())<0){
@@ -611,4 +684,5 @@
             }
         }
     }
+
 }
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java
index 3b5c511..db88e0b 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java
@@ -9,6 +9,7 @@
 import com.doumee.keyCabinet.bean.CabinetFaceBean;
 import com.doumee.keyCabinet.bean.FaceUserBean;
 import com.doumee.keyCabinet.bean.KeyCabinetBean;
+import com.doumee.keyCabinet.event.HttpEvent;
 import com.doumee.keyCabinet.http.Apis;
 import com.doumee.keyCabinet.http.param.AlcoholTestAlarmParam;
 import com.doumee.keyCabinet.http.param.BaseResponse;
@@ -21,9 +22,14 @@
 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.GsonTools;
 import com.doumee.lib_coremodel.http.utils.RxUtils;
+import com.doumee.lib_coremodel.util.StringUtil;
+
+import org.greenrobot.eventbus.EventBus;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 public class FaceVM extends DataViewModel {
@@ -43,26 +49,28 @@
      * @param type //0锛氱鐞嗗憳锛�1锛氬徃鏈�
      */
     public void getMemberIdByCode(String code,String type){
-        showLoading(true);
+        //showLoading(true);
         getRetrofitService(Apis.class).getMemberIdByCode(code)
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse<Integer>>(rxJavaGcManager) {
                     @Override
                     public void onNext(@NonNull BaseResponse<Integer> response) {
+                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
+                                "鑾峰彇IC鍗$敤鎴蜂富閿� - 鍙告満:"+code+", 杩斿洖锛�"+ GsonTools.changeGsonToJson(response)));
                         if(200==response.getCode()){
                             //鏌ヨ鏁版嵁
                             if(response.getData()!=null){
                                 if("0".equals(type)){
                                     MApplication.getLoginBean().setAutoMemberId(response.getData());
-                                    //doAction();
+                                    doAction(6);
                                 }else {
                                     MApplication.getLoginBean().setMemberId(response.getData());
                                     MApplication.getLoginBean().setAuthType(1);
-                                    //doAction();
+                                    doAction(7);
                                 }
                             }
                         }else {
-                            toast(response.getMessage());
+                            //toast(response.getMessage());
                         }
                     }
 
@@ -73,7 +81,7 @@
 
                     @Override
                     public void onComplete() {
-                        hideLoading();
+                        //hideLoading();
                     }
                 });
     }
@@ -85,6 +93,7 @@
     public void alcoholTestAlarm(String data){
         AlcoholTestAlarmParam param = new AlcoholTestAlarmParam();
         param.setMemberId(MApplication.getLoginBean().getMemberId());
+        param.setAlcoholNum(data);
         showLoading(true);
         getRetrofitService(Apis.class).alcoholTestAlarm(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
index ebae917..91a9912 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
@@ -3,11 +3,25 @@
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
+import android.text.TextUtils;
 
+import com.doumee.keyCabinet.MApplication;
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
 import com.doumee.keyCabinet.databinding.ChangeUrlActivityBinding;
+import com.doumee.keyCabinet.http.Apis;
+import com.doumee.keyCabinet.ui.main.MainActivity;
+import com.doumee.keyCabinet.utils.LMobileInfo;
+import com.doumee.keyCabinet.utils.i485.SportUtils;
+import com.doumee.lib_coremodel.bean.event.ActionEventData;
+import com.doumee.lib_coremodel.util.SpUtil;
+import com.doumee.lib_coremodel.view.ToastView;
+import com.example.datalibrary.utils.ToastUtils;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -24,11 +38,63 @@
         isAddCountTimer = false;
         normalConfig();
         getDB().setModel(getVM());
-
+        getDB().etNo.setText(LMobileInfo.getDeviceUniqueId());
+        getDB().etNo.setEnabled(false);
     }
 
     @Override
     public void initData(@Nullable Bundle savedInstanceState) {
+        getDB().etUrl.setText(SpUtil.getString("base_url", Apis.HTTP));
+        getDB().etTime.setText(SpUtil.getInt("loop_time",30)+"");
+    }
 
+    @Override
+    protected void doRegister(int type, ActionEventData data) {
+        switch (type){
+            case 2:
+                String url = getDB().etUrl.getText().toString();
+                if(TextUtils.isEmpty(url)){
+                    ToastView.show(MApplication.mContext,"鎺ュ彛鍦板潃涓嶈兘涓虹┖");
+                    return;
+                }
+                if(!url.startsWith("http://")||!url.startsWith("https://")||!url.endsWith("/")){
+                    ToastView.show(MApplication.mContext,"鎺ュ彛鍦板潃閿欒");
+                    return;
+                }
+                if(TextUtils.isEmpty(getDB().etTime.getText().toString())){
+                    ToastView.show(MApplication.mContext,"鎺ュ彛璋冪敤闂撮殧涓嶈兘涓虹┖");
+                    return;
+                }
+                int time = Integer.parseInt(getDB().etTime.getText().toString());
+                if(time<=0){
+                    ToastView.show(MApplication.mContext,"鎺ュ彛璋冪敤闂撮殧閿欒");
+                    return;
+                }
+                String oldUrl = SpUtil.getString("base_url", Apis.HTTP);
+                SpUtil.saveString("base_url",url);
+                SpUtil.saveInt("loop_time",time);
+                ToastView.show(MApplication.mContext,"淇濆瓨鎴愬姛");
+                if(!oldUrl.equals(url)){
+                    //鎺ュ彛涓嶅悓锛岄噸鏂板惎鍔�
+                    restartApp();
+                }
+                break;
+        }
+    }
+
+    private void restartApp(){
+        // 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
+        Intent intent = new Intent(mContext, MainActivity.class);
+        // 璁剧疆FLAG_ACTIVITY_CLEAR_TASK鏍囧織浣�
+        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        // 浣跨敤PendingIntent鍖呰鍚姩鎰忓浘
+        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+        // 鑾峰彇AlarmManager瀹炰緥
+        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+        // 鍦�500姣鍚庤Е鍙戦噸鍚搷浣�
+        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
+
+        android.os.Process.killProcess(android.os.Process.myPid());
+        System.exit(1);
     }
 }
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java
index 547666e..d782073 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java
@@ -13,4 +13,9 @@
     public ChangeUrlVM(@NonNull Application application, BaseModel model) {
         super(application, model);
     }
+
+    @Override
+    protected void clickByTypeCommand(int type) {
+        doAction(type);
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
index f062a3f..b9a76ca 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
@@ -26,12 +26,15 @@
 import com.doumee.keyCabinet.event.KeyResultEvent;
 import com.doumee.keyCabinet.event.GetKeyStatusEvent;
 import com.doumee.keyCabinet.event.OpenGridEvent;
+import com.doumee.keyCabinet.event.OpenGridListEvent;
 import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
 import com.doumee.keyCabinet.ui.keyCabinet.adapter.CabinetRcvAdapter;
 import com.doumee.keyCabinet.utils.i485.SportUtils;
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
 import com.doumee.lib_coremodel.util.RecyclerHelp;
 import com.doumee.lib_coremodel.util.StringUtil;
+import com.doumee.lib_coremodel.view.ToastView;
+import com.example.datalibrary.utils.ToastUtils;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -106,7 +109,6 @@
         for(CabinetGridDo d:gridDos){
             oldMap.put(d.getGridKey(),d);
         }
-        List<CabinetGridDo> addList = new ArrayList<>();
         List<CabinetGridDo> updateList = new ArrayList<>();
         for(KeyCabinetBean bean:beans){
             String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode()))+SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
@@ -122,23 +124,7 @@
                 gridDo.setKeyStatus(bean.getKeyStatus());
                 gridDo.setWorkingStatus(bean.getWorkingStatus());
                 updateList.add(gridDo);
-            }else {
-                //鏂板
-                CabinetGridDo gridDo = new CabinetGridDo();
-                gridDo.setGridId(bean.getId());
-                gridDo.setCabinetName(bean.getCode());
-                gridDo.setGridKey(key);
-                gridDo.setKeyCode(bean.getKeyCode());
-                gridDo.setBindStatus(bean.getBindStatus());
-                gridDo.setGridStatus(bean.getStatus());
-                gridDo.setKeyStatus(bean.getKeyStatus());
-                gridDo.setWorkingStatus(bean.getWorkingStatus());
-                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
-                addList.add(gridDo);
             }
-        }
-        if(addList.size()>0){
-            DaoManager.getCabinetGridDao().insert(addList);
         }
         if(updateList.size()>0){
             CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
@@ -302,34 +288,6 @@
         }
     }
 
-    @Subscribe(threadMode= ThreadMode.MAIN)
-    public void KeyResultEvent(KeyResultEvent e){
-        if(!isFinishing()){
-            //閽ュ寵鍙樻洿浜�
-            if(selectBean!=null) {
-                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
-                        + SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
-                //鏌ヨ鏌滄牸
-                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
-                if (gridDo != null) {
-                    if(flag==0){
-                        //鍙�
-                        if(TextUtils.isEmpty(gridDo.getCurKeyCode())){
-                            //绌轰簡
-                            doRegister(7,null);
-                        }
-                    }else {
-                        //杩�
-                        if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
-                            //鏈夐挜鍖欎簡
-                            doRegister(7,null);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
     @Override
     protected void onDestroy() {
         super.onDestroy();
@@ -379,6 +337,8 @@
     @Subscribe(threadMode= ThreadMode.MAIN)
     public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
         if(!isFinishing()){
+            //鑾峰彇鍗″彿
+            EventBus.getDefault().post(new GetKeyStatusEvent());
             if(selectBean!=null){
                 String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                         +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
@@ -405,7 +365,7 @@
                                         getVM().closeGrid(gridDo);
                                     }else {
                                         //閽ュ寵涓嶅尮閰�
-                                        Toast.makeText(mContext, "鎿嶄綔10", Toast.LENGTH_LONG).show();
+                                        //Toast.makeText(mContext, "鎿嶄綔10", Toast.LENGTH_LONG).show();
                                         doRegister(10,null);
                                         EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                     }
@@ -416,7 +376,7 @@
                                     getVM().closeGrid(gridDo);
                                 }
                             }else {
-                                Toast.makeText(mContext, "鏈煡璇㈠埌", Toast.LENGTH_LONG).show();
+                                ToastView.show(MApplication.mContext, "鏈煡璇㈠埌瑙勬牸淇℃伅");
                             }
                         } else {
                             //鍏抽棬澶辫触
@@ -452,7 +412,7 @@
                                     getVM().closeGrid(gridDo);
                                 }
                             }else {
-                                Toast.makeText(mContext, "鏈煡璇㈠埌", Toast.LENGTH_LONG).show();
+                                ToastView.show(MApplication.mContext, "鏈煡璇㈠埌瑙勬牸淇℃伅");
                             }
                         } else {
                             //鍏抽棬澶辫触
@@ -462,4 +422,83 @@
             }
         }
     }
+
+    @Subscribe(threadMode= ThreadMode.MAIN)
+    public void KeyResultEvent(KeyResultEvent e){
+        if(!isFinishing()){
+            if(selectBean!=null){
+                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
+                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
+                if(flag==0) {
+                    //棰嗗彇
+                    //鏌ヨ閽ュ寵鍙�
+                    CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
+                    if (gridDo != null) {
+                        if (gridDo.getIsOpen() == 0) {
+                            //鍏抽棬鎴愬姛
+                            if (!TextUtils.isEmpty(gridDo.getCurKeyCode())) {
+                                if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
+                                    //棰嗗彇澶辫触
+                                    isOpened = false;
+                                    doRegister(6, null);
+                                    getVM().closeGrid(gridDo);
+                                }else {
+                                    //閽ュ寵涓嶅尮閰�
+                                    //Toast.makeText(mContext, "鎿嶄綔10", Toast.LENGTH_LONG).show();
+                                    doRegister(10,null);
+                                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
+                                }
+                            } else {
+                                //閽ュ寵鎷胯蛋浜�
+                                isOpened = false;
+                                doRegister(5, null);
+                                getVM().closeGrid(gridDo);
+                            }
+                        }else {
+                            //娌″叧闂�
+                            if(TextUtils.isEmpty(gridDo.getCurKeyCode())){
+                                //绌轰簡
+                                doRegister(7,null);
+                            }
+                        }
+                    }else {
+                        ToastView.show(MApplication.mContext, "鏈煡璇㈠埌瑙勬牸淇℃伅");
+                    }
+                }else {
+                    //褰掕繕
+                    CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
+                    if (gridDo != null) {
+                        if (gridDo.getIsOpen() == 0) {
+                            //鍏抽棬鎴愬姛
+                            if (!TextUtils.isEmpty(gridDo.getCurKeyCode())) {
+                                if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
+                                    //鐩稿悓褰掕繕鎴愬姛
+                                    isOpened = false;
+                                    doRegister(8, null);
+                                    getVM().closeGrid(gridDo);
+                                }else {
+                                    //閽ュ寵涓嶅尮閰�
+                                    doRegister(10,null);
+                                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
+                                }
+                            } else {
+                                //閽ュ寵鏈綊杩�
+                                isOpened = false;
+                                doRegister(9, null);
+                                getVM().closeGrid(gridDo);
+                            }
+                        }else {
+                            //娌″叧闂�
+                            if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
+                                //鏈夐挜鍖欎簡
+                                doRegister(7,null);
+                            }
+                        }
+                    } else {
+                        ToastView.show(MApplication.mContext, "鏈煡璇㈠埌瑙勬牸淇℃伅");
+                    }
+                }
+            }
+        }
+    }
 }
\ No newline at end of file
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 f982e43..a38a64b 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
@@ -20,18 +20,23 @@
 import com.doumee.keyCabinet.dao.CabinetGridDo;
 import com.doumee.keyCabinet.dao.DaoManager;
 import com.doumee.keyCabinet.databinding.ManageCabinetActivityBinding;
+import com.doumee.keyCabinet.event.CheckGridStatusEvent;
 import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
+import com.doumee.keyCabinet.event.GetKeyStatusEvent;
 import com.doumee.keyCabinet.event.HttpEvent;
+import com.doumee.keyCabinet.event.KeyResultEvent;
 import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
 import com.doumee.keyCabinet.event.OpenAllGridEvent;
 import com.doumee.keyCabinet.event.OpenGridEvent;
 import com.doumee.keyCabinet.event.OpenGridListEvent;
+import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
 import com.doumee.keyCabinet.event.TimeClockEvent;
 import com.doumee.keyCabinet.ui.keyCabinet.adapter.ManageCabinetRcvAdapter;
 import com.doumee.keyCabinet.utils.i485.SportUtils;
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
 import com.doumee.lib_coremodel.util.RecyclerHelp;
 import com.doumee.lib_coremodel.util.StringUtil;
+import com.example.datalibrary.db.DBManager;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -105,6 +110,7 @@
         for(ManageKeyCabinetBean d:datas){
             if(d.getIsSelected().get()){
                 isCanPL = true;
+                isCanBJ = true;
                 if(keyStatus==-1){
                     keyStatus = getGridStatus(d);
                 }else {
@@ -120,8 +126,7 @@
         }else {
             getDB().tvPlOpen.setBackgroundResource(R.drawable.shape_mb_bt_faile);
         }
-        if(keyStatus==2||keyStatus==4){
-            isCanBJ = true;
+        if(isCanBJ){
             getDB().tvBj.setBackgroundResource(R.drawable.shape_mb_bt_ok);
         }else {
             getDB().tvBj.setBackgroundResource(R.drawable.shape_mb_bt_faile);
@@ -142,7 +147,6 @@
         for(CabinetGridDo d:gridDos){
             oldMap.put(d.getGridKey(),d);
         }
-        List<CabinetGridDo> addList = new ArrayList<>();
         List<CabinetGridDo> updateList = new ArrayList<>();
         for(ManageKeyCabinetBean bean:beans){
             String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode()))+SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
@@ -158,29 +162,19 @@
                 gridDo.setKeyStatus(bean.getKeyStatus());
                 gridDo.setWorkingStatus(bean.getWorkingStatus());
                 updateList.add(gridDo);
-            }else {
-                //鏂板
-                CabinetGridDo gridDo = new CabinetGridDo();
-                gridDo.setGridId(bean.getId());
-                gridDo.setCabinetName(bean.getCode());
-                gridDo.setGridKey(key);
-                gridDo.setKeyCode(bean.getKeyCode());
-                gridDo.setBindStatus(bean.getBindStatus());
-                gridDo.setGridStatus(bean.getStatus());
-                gridDo.setKeyStatus(bean.getKeyStatus());
-                gridDo.setWorkingStatus(bean.getWorkingStatus());
-                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
-                addList.add(gridDo);
             }
-        }
-        if(addList.size()>0){
-            DaoManager.getCabinetGridDao().insert(addList);
         }
         if(updateList.size()>0){
             CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
             for(int i=0;i<updateList.size();i++){
                 upList[i] = updateList.get(i);
             }
+            //todo 鍘绘帀
+            CabinetGridDo gridDo = oldMap.get("0101");
+            if(gridDo!=null){
+                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>鏇存柊鏁版嵁褰撳墠閽ュ寵2锛�"+gridDo.getCurKeyCode()));
+            }
+
             DaoManager.getCabinetGridDao().update(upList);
         }
     }
@@ -240,6 +234,7 @@
                             SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
                     waitOpenMap.put(key,bean.getCode());
                 }
+                waitResultCount = 2;
                 EventBus.getDefault().post(new OpenAllGridEvent());
                 }break;
             case 10: {
@@ -255,11 +250,12 @@
                         keys.add(key);
                     }
                 }
+                waitResultCount = keys.size();
                 EventBus.getDefault().post(new OpenGridListEvent(keys));
                 }break;
             case 4: {
                 //鏍囪
-                if(!isCanPL){
+                if(!isCanBJ){
                     return;
                 }
                 bjIds.clear();
@@ -285,7 +281,12 @@
                     getDB().tvBjgz.setText("鏍囪涓烘晠闅�");
                     getDB().tvBjgz.setTextColor(0xffFF3600);
                     getDB().tvBjgz.setBackgroundResource(R.drawable.shape_mb_cz_1_bg);
-                    getDB().tvBy.setVisibility(View.VISIBLE);
+                    if(keyStatus==2) {
+                        //0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭 3缁翠慨淇濆吇
+                        getDB().tvBy.setVisibility(View.VISIBLE);
+                    }else {
+                        getDB().tvBy.setVisibility(View.GONE);
+                    }
                 }
                 getDB().clCz.setVisibility(View.VISIBLE);
                 }break;
@@ -336,7 +337,6 @@
             if(tipDownCount==0){
                 isShowTip = false;
                 getDB().clTip.setVisibility(View.GONE);
-                finish();
             }else {
                 tipDownCount--;
                 getDB().tvDjs.setText(tipDownCount+"s");
@@ -404,10 +404,10 @@
         return styledText;
     }
 
-    private void showKeyErrTip(CabinetGridDo gridDo){
+    private void showKeyErrTip(String name){
         getDB().imgClKm1.setImageResource(R.mipmap.ic_jjfail);
         getDB().tvClKm1.setText("璇嗗埆澶辫触");
-        getDB().tvClKm2.setText(getTipText2("閽ュ寵鏌�",gridDo.getCabinetName(),"璇嗗埆澶辫触"), TextView.BufferType.SPANNABLE);
+        getDB().tvClKm2.setText(getTipText2("閽ュ寵鏌�",name,"璇嗗埆澶辫触"), TextView.BufferType.SPANNABLE);
         getDB().tvClKmClose.setText("閲嶆柊瀛樻斁");
         getDB().tvClKmClose.setTextColor(0xffffffff);
         getDB().tvClKmClose.setBackgroundResource(R.drawable.shape_mb_bt_ok);
@@ -425,6 +425,7 @@
         return super.onKeyDown(keyCode, event);
     }
 
+    private int waitResultCount = 0;
     /**
      * 寮�闂ㄨ繑鍥�
      * @param e
@@ -432,6 +433,13 @@
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void ManageOpenGridResultEvent(ManageOpenGridResultEvent e){
         if(!isFinishing()){
+            if(waitResultCount>0){
+                waitResultCount--;
+            }
+            if(waitResultCount>0){
+                return;
+            }
+            EventBus.getDefault().post(new CheckGridStatusEvent());
             //鏍¢獙鏄惁宸插叏寮�
             List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
             List<String> msgList = new ArrayList<>();
@@ -518,6 +526,22 @@
         }
     }
 
+    private String sygKey;
+    @Subscribe
+    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
+        if(!isFinishing()){
+            if(e.getIsOpen()==0){
+                if(e.getKey().equals(sygKey)){
+                    return;
+                }
+                sygKey = e.getKey();
+                //寮�闂ㄥけ璐�,閲嶆柊寮�闂�
+                EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
+                        Integer.parseInt(e.getKey().substring(0,2), 16)+""));
+            }
+        }
+    }
+
     /**
      * 鍏抽棬
      * @param e
@@ -525,14 +549,19 @@
     @Subscribe(threadMode= ThreadMode.MAIN)
     public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
         if(!isFinishing()){
+            //鑾峰彇鍗″彿
+            EventBus.getDefault().post(new GetKeyStatusEvent());
+            if(isShowTip){
+                isShowTip = false;
+                getDB().clTip.setVisibility(View.GONE); 
+            }
             //鏍¢獙鍗″彿
             CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
             if(gridDo!=null){
-                //鏍¢獙閽ュ寵鏄惁鍖归厤
-                if(gridDo.getGridKey()==null){
+                if(TextUtils.isEmpty(gridDo.getGridKey())){
                     if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                         //鏈粦瀹氱殑瀛樻斁浜嗛挜鍖�
-                        showKeyErrTip(gridDo);
+                        showKeyErrTip(gridDo.getCabinetName()+"-"+gridDo.getCurKeyCode());
                         //寮�闂�
                         EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                 Integer.parseInt(e.getKey().substring(0,2), 16)+""));
@@ -542,7 +571,8 @@
                     if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                         if(!gridDo.getCurKeyCode().equals(gridDo.getKeyCode())){
                             //閽ュ寵涓嶅尮閰�
-                            showKeyErrTip(gridDo);
+                            showKeyErrTip(gridDo.getCabinetName()+"-"+gridDo.getCurKeyCode());
+                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"閽ュ寵涓嶅尮閰�==>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
                             //寮�闂�
                             EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                     Integer.parseInt(e.getKey().substring(0,2), 16)+""));
@@ -550,8 +580,49 @@
                         }
                     }
                 }
+                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�==>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
                 getVM().closeGrid(gridDo);
             }
         }
     }
+
+    @Subscribe
+    public void KeyResultEvent(KeyResultEvent e){
+        if(!isFinishing()){
+            //鏍¢獙鍗″彿涓嶅鐨勶紝鐩存帴寮瑰嚭
+            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
+            List<String> keys = new ArrayList<>();
+            StringBuilder sb = new StringBuilder();
+            for(CabinetGridDo gridDo:gridDos){
+                if(TextUtils.isEmpty(gridDo.getGridKey())){
+                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
+                        //鏈粦瀹氱殑瀛樻斁浜嗛挜鍖�
+                        keys.add(gridDo.getGridKey());
+                        if(sb.length()>0){
+                            sb.append("銆�");
+                        }
+                        sb.append(gridDo.getCabinetName());
+                    }
+                }else {
+                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
+                        if(!gridDo.getCurKeyCode().equals(gridDo.getKeyCode())&&gridDo.getIsOpen()==0){
+                            //閽ュ寵涓嶅尮閰�
+                            keys.add(gridDo.getGridKey());
+                            if(sb.length()>0){
+                                sb.append("銆�");
+                            }
+                            sb.append(gridDo.getCabinetName());
+                        }
+                    }
+                }
+            }
+            if(sb.length()>0){
+                showKeyErrTip(sb.toString());
+            }
+            if(keys.size()>0){
+                //寮�闂�
+                EventBus.getDefault().post(new OpenGridListEvent(keys));
+            }
+        }
+    }
 }
\ No newline at end of file
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 0a253eb..13b914e 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
@@ -49,6 +49,7 @@
 import com.doumee.keyCabinet.databinding.MainActivityBinding;
 import com.doumee.keyCabinet.event.CLGridEvent;
 import com.doumee.keyCabinet.event.CLKeyEvent;
+import com.doumee.keyCabinet.event.CheckGridStatusEvent;
 import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
 import com.doumee.keyCabinet.event.GetFacesEvent;
 import com.doumee.keyCabinet.event.GetKeyStatusEvent;
@@ -76,6 +77,7 @@
 import com.doumee.keyCabinet.ui.face.UserManagerActivity;
 import com.doumee.keyCabinet.ui.view.BannerViewImageHolder;
 import com.doumee.keyCabinet.utils.BraceletLogUtils;
+import com.doumee.keyCabinet.utils.CircularQueue;
 import com.doumee.keyCabinet.utils.CrashHandler;
 import com.doumee.keyCabinet.utils.LMobileInfo;
 import com.doumee.keyCabinet.utils.TimeUtils;
@@ -99,11 +101,13 @@
 import com.doumee.lib_coremodel.http.utils.GsonTools;
 import com.doumee.lib_coremodel.util.SpUtil;
 import com.doumee.lib_coremodel.util.StringUtil;
+import com.doumee.lib_coremodel.view.ToastView;
 import com.example.datalibrary.api.FaceApi;
 import com.example.datalibrary.listener.DBLoadListener;
 import com.example.datalibrary.listener.SdkInitListener;
 import com.example.datalibrary.model.ImportFeatureResult;
 import com.example.datalibrary.model.User;
+import com.example.datalibrary.utils.ToastUtils;
 import com.example.datalibrary.view.PreviewTexture;
 import com.yanzhenjie.permission.runtime.Permission;
 
@@ -277,7 +281,6 @@
         getDB().tvId.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                startActivity(ManageLoginActivity.class);
                 //鏇存敼url
                 if(lastDownTime2!=null){
                     if(System.currentTimeMillis()-lastDownTime2>1000){
@@ -469,7 +472,9 @@
         }else {
             getDB().banner.stopTurning();
         }
-        unCloseGrid();
+        //妫�鏌ユ墍鏈夋煖鏍奸棬銆侀挜鍖欑姸鎬�
+        checkKeyStatus(0);
+        checkGridStatus(900);
     }
 
     private void unCloseGrid(){
@@ -951,10 +956,7 @@
     }
 
     private void initRGBCheck(){
-        String index = SpUtil.getString("rbgCameraId");
-        if(!"1".equals(index)){
-            index = "0";
-        }
+        String index = SpUtil.getString("rbgCameraId","0");
         setRgbCameraId(Integer.parseInt(index));
         /*if (isSetCameraId()){
             setRgbCameraId(SingleBaseConfig.getBaseConfig().getRBGCameraId());
@@ -1078,16 +1080,26 @@
     }
 
     private int tipDownCount = 10;
+    private int loopDownCount = 30;
     private boolean isShowTip;
     @Subscribe
     public void TimeClockEvent(TimeClockEvent e){
-        if(isShowTip){
-            if(tipDownCount==0){
-                isShowTip = false;
-                getDB().clTip.setVisibility(View.GONE);
+        if(!isFinishing()) {
+            if(isShowTip){
+                if(tipDownCount==0){
+                    isShowTip = false;
+                    getDB().clTip.setVisibility(View.GONE);
+                }else {
+                    tipDownCount--;
+                    getDB().tvDjs.setText(tipDownCount+"s");
+                }
+            }
+            if(loopDownCount==0){
+                loopDownCount = SpUtil.getInt("loop_time",30);
+                //瀹氭椂鎷夊彇鍩烘湰淇℃伅
+                getVM().devLogin();
             }else {
-                tipDownCount--;
-                getDB().tvDjs.setText(tipDownCount+"s");
+                loopDownCount--;
             }
         }
     }
@@ -1179,7 +1191,7 @@
                             !TextUtils.isEmpty(gridDo.getKeyCode())&&
                             !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())){
                         //閽ュ寵涓嶄竴鏍凤紝寮�闂�
-                        Toast.makeText(mContext, "閽ュ寵瀛樻斁浣嶇疆閿欒", Toast.LENGTH_SHORT).show();
+                        ToastView.show(MApplication.mContext,gridDo.getCabinetName()+"閽ュ寵瀛樻斁浣嶇疆閿欒");
                         EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                 Integer.parseInt(e.getKey().substring(0,2), 16)+""));
                     }else {
@@ -1252,23 +1264,33 @@
                     });*/
                     String key = bh+tdh;
                     CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
-                    if(gridDo==null){
-                        //鏂板
-                        gridDo = new CabinetGridDo();
-                        gridDo.setIsOpen("00".equals(open)?1:0);
-                        gridDo.setGridKey(key);
-                        gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
-                        DaoManager.getCabinetGridDao().insert(gridDo);
-                    }else {
+                    if(gridDo!=null){
                         gridDo.setIsOpen("00".equals(open)?1:0);
                         gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
+                        //todo 鍘绘帀
+                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>鏇存柊鏁版嵁褰撳墠閽ュ寵3锛�"+gridDo.getCurKeyCode()));
+
                         DaoManager.getCabinetGridDao().update(gridDo);
+                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
+                        if(gridDo.getIsOpen()==0) {
+                            //寮�闂ㄥけ璐�
+                            if (isShowing) {
+                                //棣栭〉寮�闂ㄥけ璐ワ紝閽ュ寵涓嶅
+                                if (!TextUtils.isEmpty(gridDo.getCurKeyCode()) &&
+                                        !TextUtils.isEmpty(gridDo.getKeyCode()) &&
+                                        !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())) {
+                                    //閽ュ寵涓嶄竴鏍凤紝寮�闂�
+                                    ToastView.show(MApplication.mContext, gridDo.getCabinetName() + "閽ュ寵瀛樻斁浣嶇疆閿欒");
+                                    EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(gridDo.getGridKey().substring(2, 4), 16) + "",
+                                            Integer.parseInt(gridDo.getGridKey().substring(0, 2), 16) + ""));
+                                }
+                            }
+                        }else {
+                            //寮�闂ㄦ垚鍔�
+                        }
                     }
                     //寮�闂ㄨ繑鍥�
-                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,gridDo.getIsOpen()));
-                    if(!portHandler.hasMessages(1)){
-                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
-                    }
+                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                 }else if(data.length()==16){
                     //鎵归噺
                     //8A 02 00 00 00 00 11 99
@@ -1281,12 +1303,7 @@
                     for(CabinetGridDo d:gridDos){
                         oldMap.put(d.getGridKey(),d);
                     }
-                    List<CabinetGridDo> addList = new ArrayList<>();
                     List<CabinetGridDo> updateList = new ArrayList<>();
-                    String finalDm = dm;
-                    /*runOnUiThread(() -> {
-                        getVM().addInfo("鎵归噺鏌ヨ杩斿洖锛�" +bh+","+ finalDm+",鎬绘暟鎹細"+oldMap.size());
-                    });*/
                     try {
                         for(int i=1;i<=dm.length();i++){
                             String key = bh+SportUtils.intToHex(i);
@@ -1295,22 +1312,19 @@
                                 gridDo.setIsOpen("1".equals(dm.substring(i-1,i))?0:1);
                                 gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                                 updateList.add(gridDo);
-                            }/*else {
-                                getVM().addInfo("鏂板key锛�" +key);
-                                CabinetGridDo gridDo = new CabinetGridDo();
-                                gridDo.setGridKey(key);
-                                gridDo.setIsOpen("1".equals(dm.substring(i-1,i))?0:1);
-                                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
-                                addList.add(gridDo);
-                            }*/
+                            }
                         }
                         runOnUiThread(() -> {
-                            getVM().addInfo("鎵归噺寮�闂ㄦ洿鏂板簱鏁版嵁:鐗堝彿锛�" +bh+","+ addList.size()+","+updateList.size());
+                            getVM().addInfo("鎵归噺寮�闂ㄦ洿鏂板簱鏁版嵁:鐗堝彿锛�" +bh+","+updateList.size());
                         });
-                        getVM().updateGrids(updateList);
-                        if(!portHandler.hasMessages(1)){
-                            EventBus.getDefault().post(new ManageOpenGridResultEvent());
+                        //todo 鍘绘帀
+                        CabinetGridDo gridDo = oldMap.get("0101");
+                        if(gridDo!=null) {
+                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>鏇存柊鏁版嵁褰撳墠閽ュ寵6锛�" + gridDo.getCurKeyCode()));
                         }
+
+                        getVM().updateGrids(updateList);
+                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                     }catch (Exception exception){
                         runOnUiThread(() -> {
                             getVM().addInfo("鎵归噺寮�闂ㄦ姤閿欙細" +exception.getMessage());
@@ -1324,20 +1338,16 @@
                 String open = data.substring(6,8);
                 String key = bh+tdh;
                 CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
-                if(gridDo==null){
-                    //鏂板
-                    gridDo = new CabinetGridDo();
-                    gridDo.setIsOpen("00".equals(open)?1:0);
-                    gridDo.setGridKey(key);
-                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
-                    DaoManager.getCabinetGridDao().insert(gridDo);
-                }else {
+                if(gridDo!=null){
                     gridDo.setIsOpen("00".equals(open)?1:0);
                     gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
+                    //todo 鍘绘帀
+                    EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>鏇存柊鏁版嵁褰撳墠閽ュ寵3锛�"+gridDo.getCurKeyCode()));
+
                     DaoManager.getCabinetGridDao().update(gridDo);
                 }
                 //鍏抽棬杩斿洖
-                EventBus.getDefault().post(new CloseGridOneResultEvent(key,gridDo.getIsOpen()));
+                EventBus.getDefault().post(new CloseGridOneResultEvent(key,"00".equals(open)?1:0));
                 if(isShowing&&isShowTip){
                     //淇敼鏄剧ず鎻愰啋
                     doRegister(5,null);
@@ -1383,7 +1393,17 @@
                         runOnUiThread(() -> {
                             getVM().addInfo("鏇存柊搴撴暟鎹�:鐗堝彿锛�" +bh+","+ addList.size()+","+updateList.size());
                         });
+                        //todo 鍘绘帀
+                        CabinetGridDo gridDo = oldMap.get("0101");
+                        if(gridDo!=null){
+                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
+                                    "=================>鏇存柊鏁版嵁褰撳墠閽ュ寵5锛�"+gridDo.getCurKeyCode()));
+                        }
+
                         getVM().updateGrids(updateList);
+                        if(isShowing){
+                            unCloseGrid();
+                        }
                     }catch (Exception exception){
                         runOnUiThread(() -> {
                             getVM().addInfo("鎶ラ敊锛�" +exception.getMessage());
@@ -1440,7 +1460,15 @@
                     String data2 = keyPreviousData+data;
                     runOnUiThread(() -> {
                         getVM().addInfo("鑾峰彇鍒伴挜鍖欐暟鎹�:" + data2);
-                        jxKey(data2);
+                        if(data2.contains("CC01")&&data2.contains("CC02")){
+                            String[] sp = data2.split("CC02");
+                            if(sp.length==2){
+                                jxKey(sp[0]);
+                                jxKey("CC02"+sp[1]);
+                            }
+                        }else {
+                            jxKey(data2);
+                        }
                     });
                     keyPreviousData = null;
                 }
@@ -1483,11 +1511,22 @@
                     }else {
                         gridDo.setCurKeyCode("");
                     }
+                    if("0101".equals(key)) {
+                        getVM().addInfo(key+" , "+isHaveKey+"  "+keyCode);
+                        getVM().addInfo(key + "璁剧疆閽ュ寵锛�" + gridDo.getCurKeyCode());
+                    }
                     gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                     updateList.add(gridDo);
                 }
             }
         }
+        //todo 鍘绘帀
+        CabinetGridDo gridDo = oldMap.get("0101");
+        if(gridDo!=null) {
+            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
+                    "=================>鏇存柊鏁版嵁褰撳墠閽ュ寵7锛�" + gridDo.getCurKeyCode()));
+        }
+
         getVM().updateGrids(updateList);
         EventBus.getDefault().post(new KeyResultEvent());
     }
@@ -1513,11 +1552,11 @@
             }
             try {
                 runOnUiThread(() -> {
-                    getVM().addInfo("鑾峰彇鍒伴厭绮炬娴嬫暟鎹�:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
+                    //getVM().addInfo("鑾峰彇鍒伴厭绮炬娴嬫暟鎹�:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
                 });
                 String data = new String(bytes);
                 runOnUiThread(() -> {
-                    getVM().addInfo("鑾峰彇鍒伴厭绮炬娴嬫槸鍚︽娴嬪け璐�:" + (data.contains("blow fail")));
+                    //getVM().addInfo("鑾峰彇鍒伴厭绮炬娴嬫槸鍚︽娴嬪け璐�:" + (data.contains("blow fail")));
                 });
                 if(data.contains("blow fail")){
                     //妫�娴嬪け璐�
@@ -1633,6 +1672,13 @@
         }
     };
 
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void CheckGridStatusEvent(CheckGridStatusEvent e){
+        if(!isFinishing()){
+            checkGridStatus(0);
+        }
+    }
+
     //妫�鏌ユ墍鏈夐棬鐘舵��
     private void checkGridStatus(long time){
         sendPortHandlerMsg(1,"80010033B2",time+100);
@@ -1666,20 +1712,24 @@
         portHandler.sendMessageDelayed(mc,time);
     }
 
+    private boolean isInitPort;
     //鍒濆鍖栦覆鍙�
     private void initPort(){
         SpUtil.setString("port_grid","/dev/ttyS7");
         SpUtil.setString("port_key","/dev/ttyS1");
         SpUtil.setString("port_jiu","/dev/ttyS2");
         gridPath = SpUtil.getString("port_grid");
-        getVM().addInfo("闂ㄤ覆鍙i摼鎺ワ細"+gridPath);
+        //getVM().addInfo("闂ㄤ覆鍙i摼鎺ワ細"+gridPath);
         keyPath = SpUtil.getString("port_key");
-        getVM().addInfo("閽ュ寵涓插彛閾炬帴锛�"+keyPath);
+        //getVM().addInfo("閽ュ寵涓插彛閾炬帴锛�"+keyPath);
         jiuPath = SpUtil.getString("port_jiu");
-        getVM().addInfo("閰掔簿涓插彛閾炬帴锛�"+jiuPath);
+        //getVM().addInfo("閰掔簿涓插彛閾炬帴锛�"+jiuPath);
         if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))&&
                 !TextUtils.isEmpty(SpUtil.getString("port_key"))&&
                 !TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
+            if(isInitPort){
+                return;
+            }
             xhCount=0;
             closePort(chosePort);
             if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))){
@@ -1690,6 +1740,7 @@
                         ,1 , 0,gridReadObserver);
                 boolean isSucc = gridPort.open();
                 if(isSucc) {
+                    isInitPort = true;
                     getVM().addInfo("闂ㄤ覆鍙i摼鎺ユ垚鍔燂細"+path);
                     String msg = isSucc ? "鎴愬姛" : "澶辫触";
                     //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
@@ -1707,6 +1758,7 @@
                         ,1 , 0,keyReadObserver);
                 boolean isSucc = keyPort.open();
                 if(isSucc) {
+                    isInitPort = true;
                     getVM().addInfo("閽ュ寵涓插彛閾炬帴鎴愬姛锛�"+path);
                     String msg = isSucc ? "鎴愬姛" : "澶辫触";
                     //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
@@ -1723,6 +1775,7 @@
                         ,1 , 0,jiuReadObserver);
                 boolean isSucc = jiuPort.open();
                 if(isSucc) {
+                    isInitPort = true;
                     getVM().addInfo("閰掔簿涓插彛閾炬帴鎴愬姛锛�"+path);
                     String msg = isSucc ? "鎴愬姛" : "澶辫触";
                     //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
@@ -1809,15 +1862,23 @@
         portHandler.sendEmptyMessageDelayed(0,0);
     }
 
+    private CircularQueue openGridQueue = new CircularQueue();
     private void send485(int type,String code){
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
+                //todo 鍘绘帀
+                if(type==2){
+                    return;
+                }
                 getVM().addInfo("鍙戦�佹寚浠わ細"+StringUtil.DateToStrSS(new Date())+"==>"+code);
             }
         });
         if(type==0){
             if(gridPort!=null){
+                if(code.startsWith("8A")){
+                    openGridQueue.enqueue(code);
+                }
                 byte[] sendByte = SportUtils.hexToByteArray(code);
                 gridPort.write(sendByte);
             }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
index 4f0b4ab..c511e94 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
@@ -128,6 +128,7 @@
                 gridDo.setKeyStatus(bean.getKeyStatus());
                 gridDo.setWorkingStatus(bean.getWorkingStatus());
                 updateList.add(gridDo);
+                oldMap.remove(key);
             }else {
                 //鏂板
                 CabinetGridDo gridDo = new CabinetGridDo();
@@ -143,9 +144,26 @@
                 addList.add(gridDo);
             }
         }
+        if(oldMap.size()>0) {
+            CabinetGridDo[] dels = new CabinetGridDo[oldMap.size()];
+            int i=0;
+            for (String key : oldMap.keySet()) {
+                dels[i] = oldMap.get(key);
+                i++;
+            }
+            //鍒犻櫎澶氱殑
+            DaoManager.getCabinetGridDao().delete(dels);
+        }
         if(addList.size()>0){
             DaoManager.getCabinetGridDao().insert(addList);
         }
+
+        //todo 鍘绘帀
+        CabinetGridDo gridDo = oldMap.get("0101");
+        if(gridDo!=null){
+            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>鏇存柊鏁版嵁褰撳墠閽ュ寵1锛�"+gridDo.getCurKeyCode()));
+        }
+
         if(updateList.size()>0){
             CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
             for(int i=0;i<updateList.size();i++){
@@ -262,13 +280,6 @@
         return DaoManager.getCabinetGridDao().getOpenGrids();
     }
 
-    public void insertGrids(List<CabinetGridDo> addList){
-        if(addList.size()>0){
-            DaoManager.getCabinetGridDao().insert(addList);
-        }
-        addInfo("鏇存柊搴撴暟鎹�:鏂板" + addList.size());
-    }
-
     public void updateGrids(List<CabinetGridDo> updateList){
         if(updateList.size()>0){
             CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
@@ -340,7 +351,7 @@
 
     public void addInfo(String info){
         String s = infoObs.get();
-        s+=info+"\n";
+        s=info+"\n"+s;
         infoObs.set(s);
     }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CircularQueue.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CircularQueue.java
new file mode 100644
index 0000000..ca9ba11
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CircularQueue.java
@@ -0,0 +1,27 @@
+package com.doumee.keyCabinet.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// 椤哄簭闃熷垪绀轰緥锛堝惊鐜槦鍒�,鍏堣繘鍚庡嚭锛�
+public class CircularQueue {
+    List<String> list = new ArrayList<>(10);
+
+    public void enqueue(String element){
+        if(list.size()==10){
+            list.remove(0);
+        }
+        list.add(element);
+    }
+
+    public String dequeue(){
+        //浠庢渶鍚庡彇
+        if(list.size()==0){
+            return null;
+        }
+        String element = list.get(list.size()-1);
+        list.remove(list.size()-1);
+        return element;
+    }
+}
+
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java
index ce130a4..1849b2c 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java
@@ -8,6 +8,7 @@
 import com.baidu.idl.main.facesdk.license.BDFaceLicenseAuthInfo;
 import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
 import com.baidu.idl.main.facesdk.utils.PreferencesUtil;
+import com.doumee.lib_coremodel.view.ToastView;
 import com.example.datalibrary.listener.SdkInitListener;
 import com.example.datalibrary.utils.ToastUtils;
 
@@ -59,7 +60,7 @@
         // 濡傛灉licenseKey 涓嶅瓨鍦ㄦ彁绀烘巿鏉冪爜涓虹┖锛屽苟璺宠浆鎺堟潈椤甸潰鎺堟潈
         if (TextUtils.isEmpty(licenseOfflineKey) && TextUtils.isEmpty(licenseOnlineKey)
                 && TextUtils.isEmpty(licenseBatchlineKey)) {
-            ToastUtils.toast(context, "鏈巿鏉冭澶囷紝璇峰畬鎴愭巿鏉冩縺娲�");
+            ToastView.show(context, "鏈巿鏉冭澶囷紝璇峰畬鎴愭巿鏉冩縺娲�");
             if (listener != null) {
                 listener.initLicenseFail(-1, "鎺堟潈鐮佷笉瀛樺湪锛岃閲嶆柊杈撳叆锛�");
             }
diff --git a/keyCabinet-android/app/src/main/res/layout/face_activity.xml b/keyCabinet-android/app/src/main/res/layout/face_activity.xml
index af37448..53880b2 100644
--- a/keyCabinet-android/app/src/main/res/layout/face_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/face_activity.xml
@@ -482,7 +482,20 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             android:background="@color/white"
-            android:visibility="gone">
+            android:visibility="visible">
+
+            <EditText
+                android:id="@+id/et_ewm"
+                android:layout_width="100dp"
+                android:layout_height="wrap_content"
+                android:text=""
+                android:inputType="number"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                android:background="@null"
+                android:layout_marginTop="20dp"
+                />
 
             <View
                 android:id="@+id/v_c_sl"
@@ -685,17 +698,43 @@
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
-
-        <EditText
-            android:id="@+id/et_ewm"
-            android:layout_width="100dp"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/cl_jiujin_progress"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text=""
+            android:background="@drawable/shape_jiujin_ok"
+            android:paddingLeft="80dp"
+            android:paddingRight="80dp"
+            android:paddingTop="50dp"
+            android:paddingBottom="50dp"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            android:background="@null"
-            />
+            android:visibility="gone">
+
+            <pl.droidsonroids.gif.GifImageView
+                android:id="@+id/img_progress"
+                android:layout_width="150dp"
+                android:layout_height="150dp"
+                android:src="@mipmap/zhuanquan"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                android:layout_marginBottom="30dp"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="妫�娴嬩腑"
+                android:textColor="#ffffffff"
+                android:textSize="33sp"
+                app:layout_constraintTop_toBottomOf="@+id/img_progress"
+                android:layout_marginTop="10dp"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"/>
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/res/layout/main_activity.xml b/keyCabinet-android/app/src/main/res/layout/main_activity.xml
index d5bed45..36f24dc 100644
--- a/keyCabinet-android/app/src/main/res/layout/main_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/main_activity.xml
@@ -365,7 +365,7 @@
         <androidx.core.widget.NestedScrollView
             android:id="@+id/nsv"
             android:layout_width="match_parent"
-            android:layout_height="200dp"
+            android:layout_height="700dp"
             app:layout_constraintTop_toTopOf="parent"
             android:background="@color/white"
             android:visibility="gone">
@@ -384,23 +384,26 @@
 
                 </TextView>
 
-                <TextView
-                    android:id="@+id/tv11"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="娓呯┖"
-                    android:textColor="#ff279baa"
-                    android:textSize="20sp"
-                    android:textStyle="bold"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:commandType="@{55}"
-                    app:onClickCommand="@{model.myTypeCommand}"/>
+
 
             </androidx.constraintlayout.widget.ConstraintLayout>
 
         </androidx.core.widget.NestedScrollView>
 
+        <TextView
+            android:id="@+id/tv11"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="娓呯┖"
+            android:textColor="#ff279baa"
+            android:textSize="20sp"
+            android:textStyle="bold"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:commandType="@{55}"
+            app:onClickCommand="@{model.myTypeCommand}"/>
+
         <ImageView
             android:id="@+id/img"
             android:layout_width="50dp"
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 20f9de2..01997ec 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
@@ -37,6 +37,18 @@
             android:layout_marginLeft="15dp"
             android:layout_marginTop="10dp"
             android:paddingBottom="9dp"/>
+        <TextView
+            android:id="@+id/tv3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@{data.keyCode}"
+            android:textColor="#ff279baa"
+            android:textSize="14sp"
+            app:layout_constraintTop_toBottomOf="@+id/tv2"
+            app:layout_constraintStart_toStartOf="parent"
+            android:layout_marginLeft="15dp"
+            android:layout_marginTop="10dp"
+            android:paddingBottom="9dp"/>
 
         <ImageView
             android:layout_width="45dp"
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 25c4fab..c40e433 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
@@ -32,7 +32,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="30s"
-            android:textColor="#ff279baa"
+            android:textColor="@color/white"
             android:textSize="24sp"
             app:layout_constraintTop_toTopOf="parent"
             android:layout_marginTop="33dp"
@@ -88,7 +88,7 @@
                 android:layout_width="0dp"
                 android:layout_height="75dp"
                 android:background="@null"
-                android:text="15055153182"
+                android:text="18656077929"
                 android:textColor="#111111"
                 android:hint="璇疯緭鍏ョ櫥褰曡处鍙�"
                 android:textColorHint="#999999"
@@ -138,7 +138,7 @@
                 android:layout_width="0dp"
                 android:layout_height="75dp"
                 android:background="@null"
-                android:text="123456a"
+                android:text="Whyc2025"
                 android:hint="璇疯緭鍏ヨ处鍙峰瘑鐮�"
                 android:textColorHint="#999999"
                 android:textSize="24sp"
@@ -186,7 +186,7 @@
             android:id="@+id/tv_no"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="NO锛�28228293837"
+            android:text="NO锛�"
             android:textColor="#b3ffffff"
             android:textSize="18sp"
             app:layout_constraintBottom_toBottomOf="parent"
diff --git a/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java b/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
index 406da30..f2ea06b 100644
--- a/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
+++ b/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
@@ -1,6 +1,9 @@
 package com.doumee.ticketmachine;
 
+import com.doumee.keyCabinet.MApplication;
+import com.doumee.keyCabinet.utils.CircularQueue;
 import com.doumee.keyCabinet.utils.i485.SportUtils;
+import com.example.datalibrary.utils.ToastUtils;
 
 import org.junit.Test;
 
@@ -12,12 +15,14 @@
 public class ExampleUnitTest {
     @Test
     public void addition_isCorrect() {
-        String s = "Result:12.00mg/100ml";
-        Pattern pattern = Pattern.compile("([0-9]+\\.[0-9]+)");
-        Matcher matcher = pattern.matcher(s);
-        if (matcher.find()) {
-            System.out.println(matcher.group(1)); // 杈撳嚭: 12.00
+        CircularQueue queue = new CircularQueue();
+        for(int i=0;i<3;i++){
+            queue.enqueue(i+"");
         }
+        System.out.println(queue.dequeue());
+        System.out.println(queue.dequeue());
+        System.out.println(queue.dequeue());
+        System.out.println(queue.dequeue());
     }
 
 
diff --git a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java
index 36e3fa7..4cfb695 100644
--- a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java
+++ b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java
@@ -13,7 +13,7 @@
         handler.post(new Runnable() {
             @Override
             public void run() {
-                Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
+                Toast.makeText(context, text, Toast.LENGTH_LONG).show();
             }
         });
     }
@@ -22,7 +22,7 @@
         handler.post(new Runnable() {
             @Override
             public void run() {
-                Toast.makeText(context, resId, Toast.LENGTH_SHORT).show();
+                Toast.makeText(context, resId, Toast.LENGTH_LONG).show();
             }
         });
     }
diff --git a/keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml b/keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml
index 76cde9e..59e1211 100644
--- a/keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml
+++ b/keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml
@@ -3,7 +3,9 @@
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:gravity="center"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:focusable="false"
+    android:focusableInTouchMode="false">
 
     <TextView
         android:layout_width="wrap_content"

--
Gitblit v1.9.3