From 57eea78f9841586d4d21e38537b5dddd6829f682 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 05 十一月 2025 15:15:58 +0800
Subject: [PATCH] Merge branch 'wuhuyancao' of http://139.186.142.91:10010/r/productDev/dmvisit into wuhuyancao

---
 server/system_timer/src/main/resources/bootstrap-dev.yml                                                                       |    6 
 server/system_timer/src/main/resources/bootstrap-pro.yml                                                                       |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java                                 |    2 
 keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java                        |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java                               |    5 
 admin/src/views/business/deletePersonnel.vue                                                                                   |    1 
 server/visits/dmvisit_admin/pom.xml                                                                                            |   26 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml                                                              |    6 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java                               |   10 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java                                      |    2 
 server/visits/pom.xml                                                                                                          |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java                                    |   10 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java                                |    6 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java                            |  117 +++
 server/visits/dmvisit_screen/pom.xml                                                                                           |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java                          |    8 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java                              |   15 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java                              |   14 
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                                       |   25 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml                                                               |    4 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml                                                               |    2 
 keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml                                                                |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/QueryUserByCodeDTO.java                                |   22 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java                            |   17 
 server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java                                         |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java                                |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java                                        |   21 
 server/system_gateway/src/main/resources/bootstrap-dev.yml                                                                     |    4 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java                                           |   29 
 server/system_gateway/src/main/resources/bootstrap-self.yml                                                                    |    4 
 server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java                                          |    2 
 keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java                               |    9 
 server/visits/admin_timer/src/main/resources/bootstrap-pro.yml                                                                 |    2 
 server/visits/admin_timer/src/main/resources/bootstrap-dev.yml                                                                 |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java                       |    2 
 keyCabinet-android/app/src/main/res/layout/main_activity.xml                                                                   |   30 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java                                    |    3 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java                                      |    2 
 server/startsh/admin_start.sh                                                                                                  |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AbnormalOpenGridDTO.java                               |   25 
 server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml                                                              |    6 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java                                                      |    2 
 keyCabinet-android/app/src/main/AndroidManifest.xml                                                                            |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseParamRequest.java  |   18 
 server/system_gateway/src/main/resources/bootstrap-test.yml                                                                    |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java |    2 
 server/system_service/pom.xml                                                                                                  |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java                                          |    5 
 keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml                                                         |   12 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java                               |  113 ++
 keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml                                                           |    4 
 server/visits/dmvisit_service/pom.xml                                                                                          |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java     |    3 
 keyCabinet-android/app/src/main/res/layout/layout_download.xml                                                                 |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java                               |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java                                     |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java                                        |    2 
 keyCabinet-android/app/build.gradle                                                                                            |    4 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java                                              |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java                                  |    2 
 server/system_timer/src/main/resources/bootstrap-test.yml                                                                      |    6 
 server/visits/admin_timer/pom.xml                                                                                              |   12 
 server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java                                                        |    7 
 server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java                                                 |    3 
 keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml                                                                |    2 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml                                                              |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java                          |   15 
 server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml                                                              |    2 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java                                  |    6 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java                                             |   17 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java                                    |    9 
 keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java                                       |   10 
 server/system_timer/src/main/resources/bootstrap-self.yml                                                                      |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java                                      |    2 
 server/system_service/src/main/java/com/doumee/core/utils/Monitor.java                                                         |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java                                                 |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java                                             |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java                                       |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java                      |  121 +++
 server/visits/dmvisit_admin/src/main/resources/bootstrap.yml                                                                   |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java                                            |   13 
 keyCabinet-android/app/src/main/res/layout/face_activity.xml                                                                   |   57 +
 keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java                                |    4 
 server/visits/admin_timer/src/main/resources/bootstrap-test.yml                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseInfoRequest.java   |   19 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java                     |  358 +++++++++-
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java                                             |   37 
 server/visits/admin_timer/src/main/java/com/doumee/api/JkCabinetTimerController.java                                           |   40 +
 server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml                                                             |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java                               |    3 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java                                                 |    9 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java                                           |  394 ++++++++---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java                                   |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java                         |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseRequest.java       |   14 
 server/visits/admin_timer/src/main/resources/bootstrap-self.yml                                                                |    6 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java                                                 |   14 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java                                              |    4 
 server/startsh/启动脚本和日志处理脚本说明.txt                                                                                               |    6 
 keyCabinet-android/app/src/main/res/values/strings.xml                                                                         |    4 
 server/visits/openapi/pom.xml                                                                                                  |   12 
 server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml                                                             |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java                       |    2 
 103 files changed, 1,531 insertions(+), 444 deletions(-)

diff --git a/admin/src/views/business/deletePersonnel.vue b/admin/src/views/business/deletePersonnel.vue
index 8c54c70..b759df5 100644
--- a/admin/src/views/business/deletePersonnel.vue
+++ b/admin/src/views/business/deletePersonnel.vue
@@ -82,7 +82,6 @@
         </template>
     </TableLayout>
 </template>
-
 <script>
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
diff --git a/keyCabinet-android/app/build.gradle b/keyCabinet-android/app/build.gradle
index 903c1df..ff276e1 100644
--- a/keyCabinet-android/app/build.gradle
+++ b/keyCabinet-android/app/build.gradle
@@ -10,8 +10,8 @@
         applicationId "com.doumee.keyCabinet"
         minSdkVersion build_versions.min_sdk
         targetSdkVersion build_versions.target_sdk
-        versionCode 1
-        versionName "1.0.0"
+        versionCode 2
+        versionName "1.0.1"
 
         //鏀寔vectorDrawables鐭㈤噺鍥�
         vectorDrawables.useSupportLibrary = true
diff --git a/keyCabinet-android/app/src/main/AndroidManifest.xml b/keyCabinet-android/app/src/main/AndroidManifest.xml
index 31877b1..9b7b0e1 100644
--- a/keyCabinet-android/app/src/main/AndroidManifest.xml
+++ b/keyCabinet-android/app/src/main/AndroidManifest.xml
@@ -76,19 +76,19 @@
                 android:resource="@xml/provider_paths" />
         </provider>
 
-        <receiver
+        <!--<receiver
             android:name="com.doumee.keyCabinet.ui.service.BootCompleteReceiver"
             android:enabled="true"
             android:exported="true">
 
-            <!-- 鎺ユ敹鍚姩瀹屾垚鐨勫箍鎾� -->
+            &lt;!&ndash; 鎺ユ敹鍚姩瀹屾垚鐨勫箍鎾� &ndash;&gt;
             <intent-filter android:priority="1000">
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
-        </receiver>
+        </receiver>-->
 
-        <service android:name="com.doumee.keyCabinet.ui.service.HeartbeatService" />
-        <service android:name="com.doumee.keyCabinet.ui.service.FaceUpdateService" />
+        <!--<service android:name="com.doumee.keyCabinet.ui.service.HeartbeatService" />
+        <service android:name="com.doumee.keyCabinet.ui.service.FaceUpdateService" />-->
 
         <uses-library
             android:name="org.apache.http.legacy"
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java
index f271c05..b73d5bc 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java
@@ -8,7 +8,7 @@
     private Integer memberId;
     private String memberName;
 
-    //0:绠$悊鍛橈紝1锛氱敤鎴�
+    //0:绠$悊鍛橈紝1锛氬徃鏈�
     private String groupId;
 
     private boolean checked;
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java
new file mode 100644
index 0000000..3f00a57
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java
@@ -0,0 +1,17 @@
+package com.doumee.keyCabinet.event;
+
+public class OpenErrEvent {
+    private String key;
+
+    public OpenErrEvent(String key) {
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java
index 2996037..5c140c5 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java
@@ -5,12 +5,25 @@
     private String channelCode;
     //鏉垮彿
     private String boardCode;
+    private String key;
 
     public OpenGridEvent(String channelCode, String boardCode) {
         this.channelCode = channelCode;
         this.boardCode = boardCode;
     }
 
+    public OpenGridEvent(String key) {
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
     public String getChannelCode() {
         return channelCode;
     }
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 423637c..cecbf1b 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
@@ -61,7 +61,7 @@
      * 鑾峰彇IC鍗$敤鎴蜂富閿� - 鍙告満
      */
     @POST("visitsAdmin/cloudService/web/cabinet/getMemberIdByCode")
-    Observable<BaseResponse<Integer>> getMemberIdByCode(@Query("code")String code);
+    Observable<BaseResponse<Integer>> getMemberIdByCode(@Body RequestBody requestBody);
 
     /**
      * 閰掔簿妫�娴嬪憡璀�
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 f39bb62..d263064 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
@@ -1,6 +1,8 @@
 package com.doumee.keyCabinet.http.param;
 
 public class AlcoholTestAlarmParam {
+    //鏌滃瓙id
+    private Integer cabinetId;
     //浼氬憳id
     private Integer memberId;
     private String alcoholNum;
@@ -20,4 +22,12 @@
     public void setAlcoholNum(String alcoholNum) {
         this.alcoholNum = alcoholNum;
     }
+
+    public Integer getCabinetId() {
+        return cabinetId;
+    }
+
+    public void setCabinetId(Integer cabinetId) {
+        this.cabinetId = cabinetId;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java
index 67fbdf9..244247e 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java
@@ -1,11 +1,9 @@
 package com.doumee.keyCabinet.http.param;
 
 public class GetMemberIdByCodeParam {
+    //鍏宠仈浜哄憳绫诲瀷锛�0=鍙告満锛�1=鏍¢獙浜哄憳
+    private Integer userType;
     private String code;
-
-    public GetMemberIdByCodeParam(String code) {
-        this.code = code;
-    }
 
     public String getCode() {
         return code;
@@ -14,4 +12,12 @@
     public void setCode(String code) {
         this.code = code;
     }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java
index b46bdf9..1ac2b4b 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java
@@ -51,13 +51,13 @@
                                 List<FaceUserBean> datas = new ArrayList<>();
                                 if(faceBean!=null&&faceBean.getAutoFaceList()!=null){
                                     for(FaceUserBean bean:faceBean.getAutoFaceList()){
-                                        bean.setGroupId("1");
+                                        bean.setGroupId("0");
                                     }
                                     datas.addAll(faceBean.getAutoFaceList());
                                 }
                                 if(faceBean!=null&&faceBean.getDriverFaceList()!=null){
                                     for(FaceUserBean bean:faceBean.getDriverFaceList()){
-                                        bean.setGroupId("0");
+                                        bean.setGroupId("1");
                                     }
                                     datas.addAll(faceBean.getDriverFaceList());
                                 }
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 e935ae4..c4c3570 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
@@ -27,6 +27,7 @@
 import com.doumee.keyCabinet.base.MyBaseActivity;
 import com.doumee.keyCabinet.databinding.FaceActivityBinding;
 import com.doumee.keyCabinet.event.FaceStatusChangeEvent;
+import com.doumee.keyCabinet.event.HttpEvent;
 import com.doumee.keyCabinet.event.JiujinBeginEvent;
 import com.doumee.keyCabinet.event.JiujinResultEvent;
 import com.doumee.keyCabinet.event.TimeClockEvent;
@@ -130,6 +131,7 @@
     private void statusFsm(int toStatus){
         status = toStatus;
         isToChose = false;
+        getDB().etEwm.requestFocus();
         switch (toStatus){
             case 0:
                 //鍙�-绠$悊鍛樹汉鑴搁獙璇�
@@ -141,7 +143,6 @@
             case 1:
                 //鍙�-绠$悊鍛樺埛鍗¢獙璇�
                 getDB().etEwm.setText("");
-                getDB().etEwm.requestFocus();
                 getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
@@ -198,7 +199,7 @@
                 //鍙�-鍙告満閰掔簿妫�娴嬪け璐�
                 //Toast.makeText(mContext, "鍙告満閰掔簿妫�娴嬪け璐�", Toast.LENGTH_SHORT).show();
                 getDB().clJiu.setVisibility(View.GONE);
-                getDB().tvJg1.setText("閰掔簿妫�娴嬪紓甯革紝璇烽噸鏂版娴�");
+                getDB().tvJg1.setText("閰掔簿妫�娴嬫搷浣滀笉褰擄紝璇烽噸鏂版娴�");
                 getDB().clTip1.setVisibility(View.VISIBLE);
                 break;
             case 7:
@@ -297,6 +298,14 @@
                     finish();
                 }
                 break;
+            case 8:
+                getDB().message.setText(data.getData().get("obj").toString());
+                getDB().message.setVisibility(View.VISIBLE);
+                handler.sendEmptyMessageDelayed(6,2000);
+                getDB().message.invalidate();
+                getDB().message.requestLayout();
+                EventBus.getDefault().post(new HttpEvent("ic鍗�+++++++"+data.getData().get("type").toString()));
+                break;
             default:
                 break;
         }
@@ -328,7 +337,7 @@
         //ic鍗¤鍙�
         getDB().etEwm.requestFocus();
         getDB().etEwm.setFocusable(true);
-        getDB().etEwm.setShowSoftInputOnFocus(true);
+        getDB().etEwm.setShowSoftInputOnFocus(false);
         hideSoftKeyboard(getDB().etEwm);
         getDB().etEwm.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
             @Override
@@ -336,6 +345,7 @@
                 hideSoftKeyboard(getDB().etEwm);
             }
         });
+
         getDB().etEwm.addTextChangedListener(new TextWatcher() {
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -354,6 +364,8 @@
                     return;
                 }
                 if(status!=1&&status!=3&&status!=8){
+                    getDB().etEwm.setText("");
+                    getDB().etEwm.requestFocus();
                     return;
                 }
                 if(handler.hasMessages(5)){
@@ -498,6 +510,8 @@
                         getVM().alcoholTestAlarm(resultEvent.getConcentration().toString());
                         //Toast.makeText(mContext, "閰掔簿妫�娴嬭秴鏍�", Toast.LENGTH_SHORT).show();
                         statusFsm(9);
+                        //鍐嶆娴嬶紝灏嗗0闊冲叧闂�
+                        EventBus.getDefault().post(new JiujinBeginEvent());
                     }
                     break;
                 case 4:
@@ -515,6 +529,9 @@
                     }
                     getDB().etEwm.setText("");
                     getDB().etEwm.requestFocus();
+                    break;
+                case 6:
+                    getDB().message.setVisibility(View.GONE);
                     break;
                 default:
                     break;
@@ -593,6 +610,7 @@
                     User user = livenessModel.getUser();
                     if (user == null) {
                         mUser = null;
+                        //EventBus.getDefault().post(new HttpEvent("浜鸿劯鐢ㄦ埛妫�娴嬪け璐�------->"+(status==0?"绠$悊鍛樹汉鑴告娴嬶細":"鍙告満浜鸿劯妫�娴嬶細")));
                         if (isCompareCheck) {
                             /*getDB().clFail.setVisibility(View.VISIBLE);
                             getDB().tv4.setText(getString(R.string.face_tip2));
@@ -601,6 +619,8 @@
 
                     } else {
                         mUser = user;
+                        /*EventBus.getDefault().post(new HttpEvent("浜鸿劯鐢ㄦ埛------->"+(status==0?"绠$悊鍛樹汉鑴告娴嬶細":"鍙告満浜鸿劯妫�娴嬶細")
+                                +(user.getGroupId().equals("0")?"绠$悊鍛�":"鍙告満")));*/
                         if (isCompareCheck) {
                             getDB().clFail.setVisibility(View.GONE);
                             if(handler.hasMessages(0)) {
@@ -665,6 +685,9 @@
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void JiujinResultEvent(JiujinResultEvent e){
         if(!isFinishing()){
+            if(status!=4&&status!=6){
+                return;
+            }
             //Toast.makeText(mContext, "閰掔簿妫�娴嬭繑鍥烇細"+e.isOk(), Toast.LENGTH_SHORT).show();
             if(!e.isOk()){
                 getDB().clJiujinProgress.setVisibility(View.GONE);
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 db88e0b..e1a695a 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
@@ -49,8 +49,10 @@
      * @param type //0锛氱鐞嗗憳锛�1锛氬徃鏈�
      */
     public void getMemberIdByCode(String code,String type){
-        //showLoading(true);
-        getRetrofitService(Apis.class).getMemberIdByCode(code)
+        GetMemberIdByCodeParam param = new GetMemberIdByCodeParam();
+        param.setUserType("0".equals(type)?1:0);
+        param.setCode(code);
+        getRetrofitService(Apis.class).getMemberIdByCode(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse<Integer>>(rxJavaGcManager) {
                     @Override
@@ -70,7 +72,7 @@
                                 }
                             }
                         }else {
-                            //toast(response.getMessage());
+                            doAction(8,response.getMessage());
                         }
                     }
 
@@ -92,6 +94,7 @@
      */
     public void alcoholTestAlarm(String data){
         AlcoholTestAlarmParam param = new AlcoholTestAlarmParam();
+        param.setCabinetId(MApplication.getConfigBean().getId());
         param.setMemberId(MApplication.getLoginBean().getMemberId());
         param.setAlcoholNum(data);
         showLoading(true);
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java
index c5ce604..057eab0 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java
@@ -69,7 +69,7 @@
         // 娣诲姞鏁版嵁
         holder.text_user_ctime.setText(mList.get(position).getId()+"");
         holder.textUserName.setText(mList.get(position).getUserName());
-        holder.textSf.setText(mList.get(position).getGroupId().equals("0")?
+        holder.textSf.setText(mList.get(position).getGroupId().equals("1")?
                 MApplication.mContext.getString(R.string.face_hy) :MApplication.mContext.getString(R.string.face_xy));
         FrescoUtils.displayImageFresco(mList.get(position).getImageName(),holder.circleUserHead);
     }
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 91a9912..ad4c731 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
@@ -45,7 +45,7 @@
     @Override
     public void initData(@Nullable Bundle savedInstanceState) {
         getDB().etUrl.setText(SpUtil.getString("base_url", Apis.HTTP));
-        getDB().etTime.setText(SpUtil.getInt("loop_time",30)+"");
+        getDB().etTime.setText(SpUtil.getInt("loop_time",60)+"");
     }
 
     @Override
@@ -57,7 +57,9 @@
                     ToastView.show(MApplication.mContext,"鎺ュ彛鍦板潃涓嶈兘涓虹┖");
                     return;
                 }
-                if(!url.startsWith("http://")||!url.startsWith("https://")||!url.endsWith("/")){
+                if((url.startsWith("http://")||url.startsWith("https://"))&&url.endsWith("/")){
+                    //姝g‘
+                }else {
                     ToastView.show(MApplication.mContext,"鎺ュ彛鍦板潃閿欒");
                     return;
                 }
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 b9a76ca..2377446 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
@@ -25,6 +25,7 @@
 import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
 import com.doumee.keyCabinet.event.KeyResultEvent;
 import com.doumee.keyCabinet.event.GetKeyStatusEvent;
+import com.doumee.keyCabinet.event.OpenErrEvent;
 import com.doumee.keyCabinet.event.OpenGridEvent;
 import com.doumee.keyCabinet.event.OpenGridListEvent;
 import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -58,6 +59,7 @@
     private int status;
 
     private int ysDownCount = 10;
+    private boolean isChose;
 
     @Override
     public int getLayoutId() {
@@ -73,6 +75,9 @@
         adapter = new CabinetRcvAdapter(this, R.layout.cabinet_rcv_item, new CabinetRcvAdapter.OnItemClick() {
             @Override
             public void onItemClick(KeyCabinetBean item) {
+                if(isChose){
+                    return;
+                }
                 selectBean = item;
             }
         });
@@ -151,6 +156,10 @@
                     Toast.makeText(mContext, "璇烽�夋嫨鏌滈棬", Toast.LENGTH_SHORT).show();
                     return;
                 }
+                if(isChose){
+                    return;
+                }
+                isChose = true;
                 if(isOpening){
                     return;
                 }
@@ -160,7 +169,7 @@
                 downTime = 60;
                 break;
             case 2:
-                getDB().clTip1.setVisibility(View.GONE);
+                //getDB().clTip1.setVisibility(View.GONE);
                 if(status==0) {
                     //閲嶆柊寮�闂�
                     openTime = StringUtil.DateToStr(new Date());
@@ -183,7 +192,7 @@
                 isOpening = false;
                 //寮�鍚垚鍔�
                 status=1;
-                if("0".equals(flag)) {
+                if(flag==0) {
                     getDB().imgTip2.setImageResource(R.mipmap.ic_notclose_key);
                     getDB().tvTip22.setText("璇烽鍙栭挜鍖欏悗鍏抽棴鏌滈棬");
                 }else {
@@ -193,7 +202,6 @@
                 getDB().tvTip21.setText(getTipText(selectBean.getCode(),"鏌滈棬鎵撳紑鎴愬姛"), TextView.BufferType.SPANNABLE);
                 getDB().clTip1.setVisibility(View.GONE);
                 getDB().clTip2.setVisibility(View.VISIBLE);
-                EventBus.getDefault().post(new GetKeyStatusEvent());
                 ysDownCount = 8;
                 break;
             case 7:
@@ -291,6 +299,8 @@
     @Override
     protected void onDestroy() {
         super.onDestroy();
+        handler.removeCallbacksAndMessages(null);
+        handler = null;
     }
 
     private String openTime = "";
@@ -300,6 +310,10 @@
             if(selectBean!=null){
                 String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                         +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
+                //寮�闂ㄦ垚鍔燂紝绉婚櫎寮�闂�
+                if(handler.hasMessages(1)){
+                    handler.removeMessages(1);
+                }
                 if(key.equals(e.getKey())) {
                     if (e.getIsOpen()==1) {
                         //寮�闂ㄦ垚鍔�
@@ -307,8 +321,7 @@
                             return;
                         }
                         isOpened = true;
-                        Toast.makeText(mContext, "鎿嶄綔4", Toast.LENGTH_LONG).show();
-                        doRegister(4, null);
+                        getVM().doAction(4);
                     } else {
                         //澶辫触
                         //濡傛灉鏄挜鍖欎笉瀵圭户缁紑闂�
@@ -321,25 +334,35 @@
                             }
                             if (!gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                 //閽ュ寵涓嶅尮閰�
-                                doRegister(10,null);
+                                getVM().doAction(10,null);
                                 EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                 return;
                             }
                         }
-                        doRegister(3, null);
+                        getVM().doAction(3);
                     }
                 }
             }
         }
     }
 
+    private Long keyTime;
     private boolean isOpened = false;
     @Subscribe(threadMode= ThreadMode.MAIN)
     public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
         if(!isFinishing()){
+            //鍏抽棬鎴愬姛锛岀Щ闄ゅ紑闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+            }
             //鑾峰彇鍗″彿
             EventBus.getDefault().post(new GetKeyStatusEvent());
-            if(selectBean!=null){
+            keyTime = new Date().getTime()+500;
+            if(handler.hasMessages(0)){
+                handler.removeMessages(0);
+            }
+            handler.sendEmptyMessageDelayed(0,1200);
+            /*if(selectBean!=null){
                 String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                         +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                 if(key.equals(e.getKey())) {
@@ -361,18 +384,17 @@
                                     if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                         //棰嗗彇澶辫触
                                         isOpened = false;
-                                        doRegister(6, null);
+                                        getVM().doAction(6);
                                         getVM().closeGrid(gridDo);
                                     }else {
                                         //閽ュ寵涓嶅尮閰�
-                                        //Toast.makeText(mContext, "鎿嶄綔10", Toast.LENGTH_LONG).show();
-                                        doRegister(10,null);
+                                        getVM().doAction(10,null);
                                         EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                     }
                                 } else {
                                     //閽ュ寵鎷胯蛋浜�
                                     isOpened = false;
-                                    doRegister(5, null);
+                                    getVM().doAction(5);
                                     getVM().closeGrid(gridDo);
                                 }
                             }else {
@@ -398,17 +420,17 @@
                                     if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                         //鐩稿悓褰掕繕鎴愬姛
                                         isOpened = false;
-                                        doRegister(8, null);
+                                        getVM().doAction(8);
                                         getVM().closeGrid(gridDo);
                                     }else {
                                         //閽ュ寵涓嶅尮閰�
-                                        doRegister(10,null);
+                                        getVM().doAction(10,null);
                                         EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                     }
                                 } else {
                                     //閽ュ寵鏈綊杩�
                                     isOpened = false;
-                                    doRegister(9, null);
+                                    getVM().doAction(9);
                                     getVM().closeGrid(gridDo);
                                 }
                             }else {
@@ -419,7 +441,20 @@
                         }
                     }
                 }
+            }*/
+        }
+    }
+
+    @Subscribe(threadMode= ThreadMode.MAIN)
+    public void OpenErrEvent(OpenErrEvent e){
+        //寮�闂ㄥけ璐�
+        if(!isFinishing()){
+            //寮�闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
             }
+            EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
+            handler.sendEmptyMessageDelayed(1,1000);
         }
     }
 
@@ -427,6 +462,17 @@
     public void KeyResultEvent(KeyResultEvent e){
         if(!isFinishing()){
             if(selectBean!=null){
+                //鏍¢獙鏃堕棿
+                if(keyTime==null){
+                    return;
+                }
+                if(keyTime!=null&&keyTime>System.currentTimeMillis()){
+                    //鏍¢獙杩斿洖鏃堕棿<鍛戒护鏃堕棿
+                    return;
+                }
+                if(handler.hasMessages(0)){
+                    handler.removeMessages(0);
+                }
                 String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                         +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                 if(flag==0) {
@@ -440,25 +486,24 @@
                                 if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                     //棰嗗彇澶辫触
                                     isOpened = false;
-                                    doRegister(6, null);
+                                    getVM().doAction(6);
                                     getVM().closeGrid(gridDo);
                                 }else {
                                     //閽ュ寵涓嶅尮閰�
-                                    //Toast.makeText(mContext, "鎿嶄綔10", Toast.LENGTH_LONG).show();
-                                    doRegister(10,null);
+                                    getVM().doAction(10);
                                     EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                 }
                             } else {
                                 //閽ュ寵鎷胯蛋浜�
                                 isOpened = false;
-                                doRegister(5, null);
+                                getVM().doAction(5);
                                 getVM().closeGrid(gridDo);
                             }
                         }else {
                             //娌″叧闂�
                             if(TextUtils.isEmpty(gridDo.getCurKeyCode())){
                                 //绌轰簡
-                                doRegister(7,null);
+                                getVM().doAction(7);
                             }
                         }
                     }else {
@@ -474,24 +519,24 @@
                                 if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                     //鐩稿悓褰掕繕鎴愬姛
                                     isOpened = false;
-                                    doRegister(8, null);
+                                    getVM().doAction(8);
                                     getVM().closeGrid(gridDo);
                                 }else {
                                     //閽ュ寵涓嶅尮閰�
-                                    doRegister(10,null);
+                                    getVM().doAction(10);
                                     EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                 }
                             } else {
                                 //閽ュ寵鏈綊杩�
                                 isOpened = false;
-                                doRegister(9, null);
+                                getVM().doAction(9);
                                 getVM().closeGrid(gridDo);
                             }
                         }else {
                             //娌″叧闂�
                             if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                                 //鏈夐挜鍖欎簡
-                                doRegister(7,null);
+                                getVM().doAction(7);
                             }
                         }
                     } else {
@@ -501,4 +546,24 @@
             }
         }
     }
+
+    private Handler handler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            switch (msg.what){
+                case 0:
+                    //閲嶆柊鍙戦�侀挜鍖欐煡璇�
+                    //鍙戦�佹煡璇㈤挜鍖欏彿
+                    EventBus.getDefault().post(new GetKeyStatusEvent());
+                    handler.sendEmptyMessageDelayed(0,1200);
+                    break;
+                case 1:
+                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
+                    handler.sendEmptyMessageDelayed(1,1000);
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
 }
\ 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 a38a64b..7ab3232 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
@@ -1,10 +1,13 @@
 package com.doumee.keyCabinet.ui.keyCabinet;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.lifecycle.Observer;
 
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
@@ -14,6 +17,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.doumee.keyCabinet.MApplication;
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
 import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
@@ -27,6 +31,7 @@
 import com.doumee.keyCabinet.event.KeyResultEvent;
 import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
 import com.doumee.keyCabinet.event.OpenAllGridEvent;
+import com.doumee.keyCabinet.event.OpenErrEvent;
 import com.doumee.keyCabinet.event.OpenGridEvent;
 import com.doumee.keyCabinet.event.OpenGridListEvent;
 import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -37,6 +42,7 @@
 import com.doumee.lib_coremodel.util.RecyclerHelp;
 import com.doumee.lib_coremodel.util.StringUtil;
 import com.example.datalibrary.db.DBManager;
+import com.innohi.YNHAPI;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -100,6 +106,15 @@
             }
         });
         getVM().getCabinetDetail();
+        getDB().tvTitle.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                //鍙互涓嬫媺
+                YNHAPI mAPI = YNHAPI.getInstance();
+                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+                return true;
+            }
+        });
     }
 
     private void updateBtnStatus(){
@@ -168,11 +183,6 @@
             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);
@@ -344,7 +354,7 @@
         }
         if(isShowOpenTip){
             if(openTipDownCount==0){
-                doRegister(9,null);
+                getVM().doAction(9);
             }else {
                 openTipDownCount--;
                 getDB().tvClKmClose.setText(openTipDownCount+"s 鑷姩鍏抽棴");
@@ -526,15 +536,14 @@
         }
     }
 
-    private String sygKey;
     @Subscribe
     public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
         if(!isFinishing()){
+            //寮�闂ㄦ垚鍔燂紝绉婚櫎寮�闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+            }
             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)+""));
@@ -542,6 +551,8 @@
         }
     }
 
+    private Long keyTime;
+    private HashMap<String,String> closeMap = new HashMap<>();
     /**
      * 鍏抽棬
      * @param e
@@ -549,12 +560,23 @@
     @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); 
             }
+            //鍏抽棬鎴愬姛锛岀Щ闄ゅ紑闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+            }
+            //鍙戦�佹煡璇㈤挜鍖欏彿
+            EventBus.getDefault().post(new GetKeyStatusEvent());
+            keyTime = new Date().getTime()+500;
+            if(handler.hasMessages(0)){
+                handler.removeMessages(0);
+            }
+            handler.sendEmptyMessageDelayed(0,1200);
+            closeMap.put(e.getKey(),"");
+            /*111
             //鏍¢獙鍗″彿
             CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
             if(gridDo!=null){
@@ -580,20 +602,51 @@
                         }
                     }
                 }
-                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�==>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
+                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�***************************>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
                 getVM().closeGrid(gridDo);
+            }*/
+        }
+    }
+
+    @Subscribe(threadMode= ThreadMode.MAIN)
+    public void OpenErrEvent(OpenErrEvent e){
+        //寮�闂ㄥけ璐�
+        if(!isFinishing()){
+            //寮�闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
             }
+            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
+            Message msg = Message.obtain();
+            msg.what=1;
+            msg.obj = e.getKey();
+            handler.sendMessageDelayed(msg,1000);
         }
     }
 
     @Subscribe
     public void KeyResultEvent(KeyResultEvent e){
         if(!isFinishing()){
+            //鏍¢獙鏃堕棿
+            if(keyTime==null){
+                return;
+            }
+            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
+                //鏍¢獙杩斿洖鏃堕棿<鍛戒护鏃堕棿
+                return;
+            }
+            if(handler.hasMessages(0)){
+                handler.removeMessages(0);
+            }
+            HashMap<String,String> copyMap = new HashMap<>();
+            copyMap.putAll(closeMap);
+            closeMap.clear();
             //鏍¢獙鍗″彿涓嶅鐨勶紝鐩存帴寮瑰嚭
             List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
             List<String> keys = new ArrayList<>();
             StringBuilder sb = new StringBuilder();
             for(CabinetGridDo gridDo:gridDos){
+                boolean isFail = false;
                 if(TextUtils.isEmpty(gridDo.getGridKey())){
                     if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
                         //鏈粦瀹氱殑瀛樻斁浜嗛挜鍖�
@@ -602,6 +655,7 @@
                             sb.append("銆�");
                         }
                         sb.append(gridDo.getCabinetName());
+                        isFail = true;
                     }
                 }else {
                     if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
@@ -612,7 +666,15 @@
                                 sb.append("銆�");
                             }
                             sb.append(gridDo.getCabinetName());
+                            isFail = true;
                         }
+                    }
+                }
+                if(!isFail){
+                    if(copyMap.containsKey(gridDo.getGridKey())){
+                        //鍏抽棬鎴愬姛
+                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�***************************>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
+                        getVM().closeGrid(gridDo);
                     }
                 }
             }
@@ -625,4 +687,31 @@
             }
         }
     }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        handler.removeCallbacksAndMessages(null);
+        handler = null;
+    }
+
+    private Handler handler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            switch (msg.what){
+                case 0:
+                    //閲嶆柊鍙戦�侀挜鍖欐煡璇�
+                    //鍙戦�佹煡璇㈤挜鍖欏彿
+                    EventBus.getDefault().post(new GetKeyStatusEvent());
+                    handler.sendEmptyMessageDelayed(0,1200);
+                    break;
+                case 1:
+                    EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
+                    handler.sendEmptyMessageDelayed(1,1000);
+                    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 94a9439..780a18c 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
@@ -296,7 +296,7 @@
                     @Override
                     public void onNext(@NonNull BaseResponse response) {
                         if(response.getCode()==200){
-                            EventBus.getDefault().post(new HttpEvent("鍏抽棴鏌滄牸鎺ュ彛鎴愬姛"));
+                            EventBus.getDefault().post(new HttpEvent("鍏抽棴鏌滄牸鎺ュ彛鎴愬姛:"+gridDo.getCurKeyCode()));
                             getCabinetDetail();
                             doAction(11);
                         }
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 96baac9..2a1ffe1 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
@@ -11,12 +11,14 @@
 import android.widget.Toast;
 
 import com.doumee.keyCabinet.BuildConfig;
+import com.doumee.keyCabinet.MApplication;
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
 import com.doumee.keyCabinet.databinding.ManageLoginActivityBinding;
 import com.doumee.keyCabinet.event.TimeClockEvent;
 import com.doumee.keyCabinet.utils.LMobileInfo;
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
+import com.innohi.YNHAPI;
 
 import org.greenrobot.eventbus.Subscribe;
 
@@ -44,7 +46,18 @@
         getDB().tvNo.setText("NO锛�"+ LMobileInfo.getDeviceUniqueId());
         getDB().tvV.setText("V"+ BuildConfig.VERSION_NAME);
 
-
+        getDB().tv1.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                if(MApplication.getConfigBean().getId()==null){
+                    //鍙互涓嬫媺
+                    YNHAPI mAPI = YNHAPI.getInstance();
+                    mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+                    return true;
+                }
+                return false;
+            }
+        });
     }
 
     @Override
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 13b914e..2584140 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
@@ -6,9 +6,11 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
+import android.graphics.PixelFormat;
 import android.graphics.drawable.BitmapDrawable;
 import android.hardware.Camera;
 import android.opengl.Visibility;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -20,6 +22,7 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.widget.PopupWindow;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
@@ -60,6 +63,7 @@
 import com.doumee.keyCabinet.event.KeyResultEvent;
 import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
 import com.doumee.keyCabinet.event.OpenAllGridEvent;
+import com.doumee.keyCabinet.event.OpenErrEvent;
 import com.doumee.keyCabinet.event.OpenGridEvent;
 import com.doumee.keyCabinet.event.OpenGridListEvent;
 import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -109,6 +113,7 @@
 import com.example.datalibrary.model.User;
 import com.example.datalibrary.utils.ToastUtils;
 import com.example.datalibrary.view.PreviewTexture;
+import com.innohi.YNHAPI;
 import com.yanzhenjie.permission.runtime.Permission;
 
 import org.greenrobot.eventbus.EventBus;
@@ -171,8 +176,21 @@
                         getVM().getFaceLD();
                     }
                     getVM().upBraceletLog();*/
+                    case 1:
+                        if(isShowing) {
+                            EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
+                            handler.sendEmptyMessageDelayed(1, 1000);
+                        }
+                        break;
                     case 2:
-
+                        if(isShowing){
+                            //閲嶆柊鍙戦�侀挜鍖欐煡璇�
+                            //鍙戦�佹煡璇㈤挜鍖欏彿
+                            EventBus.getDefault().post(new GetKeyStatusEvent());
+                            handler.sendEmptyMessageDelayed(2,1200);
+                        }
+                        break;
+                    default:
                         break;
                 }
             }
@@ -193,12 +211,12 @@
         getDB().setModel(getVM());
         initRGBCheck();
         handler.sendEmptyMessageDelayed(0, 1000);
-        //鍚姩蹇冭烦
+        /*//鍚姩蹇冭烦
         Intent intent = new Intent(MainActivity.this, HeartbeatService.class);
         startService(intent);
         //鍚姩鏇存柊浜鸿劯
         Intent intent2 = new Intent(MainActivity.this, FaceUpdateService.class);
-        startService(intent2);
+        startService(intent2);*/
         getPermission();
         Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
     }
@@ -212,10 +230,10 @@
         long availableMemory = memoryInfo.availMem/(1024*1024);
         long usedMemory = totalMemory - availableMemory;
         //getDB().tvM.setText("鎬诲唴瀛橈細"+totalMemory+",浣跨敤鍐呭瓨锛�"+usedMemory+",鍙敤鍐呭瓨锛�"+availableMemory);
-        if((availableMemory<400&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
+        if((availableMemory<100&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
                 ("02:00:00".equals(StringUtil.getHM()))){
             //鍙敤鍐呭瓨灏忎簬400M,鎴栬�呮瘡澶╁噷鏅�2鐐癸紝閲嶅惎app
-            //restartApp();
+            restartApp();
         }
     }
 
@@ -270,7 +288,7 @@
                 lastDownTime1 = System.currentTimeMillis();
                 downCount1++;
                 System.out.println();
-                Timber.tag("==>").d(""+downCount1);
+                //Timber.tag("==>").d(""+downCount1);
                 if(downCount1>4) {
                     downCount1=0;
                     lastDownTime1=null;
@@ -296,24 +314,18 @@
                 }
             }
         });
-        getDB().tvVersion.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                //todo 涓存椂浠g爜
-                //setJiuConfig();
-                SpUtil.saveString("rbgCameraId","0");
-            }
-        });
+
         getDB().imgLeft.setOnClickListener(new View.OnClickListener() {
             @Override
-            public void onClick(View v) {
+            public void onClick(View v1) {
                 //todo 涓存椂浠g爜
                 if (getDB().nsv.getVisibility()== View.VISIBLE) {
                     getDB().nsv.setVisibility(View.GONE);
                 }else {
                     getDB().nsv.setVisibility(View.VISIBLE);
                 }
-
+                YNHAPI mAPI = YNHAPI.getInstance();
+                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
             }
         });
         upErrInfo();
@@ -458,6 +470,9 @@
     protected void onResume() {
         super.onResume();
         isShowing = true;
+        YNHAPI mAPI = YNHAPI.getInstance();
+        mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.ALWAYS_INVISIBLE);
+        mAPI.setBootLaunchApk("com.doumee.keyCabinet", true);
         showTime = System.currentTimeMillis();
         if(!isFaceOk) {
             initLicense();
@@ -773,7 +788,63 @@
             waitBeans.clear();
             selectBeans.addAll(userBeans);
             finishCount=0;
-            faceHandler.sendEmptyMessage(0);
+            /*//鍒犻櫎鍏ㄩ儴
+            FaceApi.getInstance().userClean();
+            faceHandler.sendEmptyMessage(0);*/
+
+            HashMap<String,String> uMap = new HashMap<>();
+            for(FaceUserBean d:selectBeans){
+                String key = d.getMemberId().toString()+"_"+d.getGroupId();
+                uMap.put(key,"");
+            }
+            //鍒犻櫎涓嶅瓨鍦ㄧ敤鎴�
+            List<User> users = FaceApi.getInstance().getAllUserList();
+            List<User> dels = new ArrayList<>();
+            for(User u:users){
+                String key = u.getUserId()+"_"+u.getGroupId();
+                if(!uMap.containsKey(key)){
+                    dels.add(u);
+                }
+            }
+            if(dels.size()>0){
+                UserInfoManager.getInstance().deleteUserListInfo(dels,
+                        "", new UserInfoManager.UserInfoListener() {
+                            @Override
+                            public void userListDeleteSuccess() {
+                                // 鐢ㄦ埛鍒楄〃鍒犻櫎鎴愬姛
+                                faceHandler.sendEmptyMessage(0);
+                            }
+
+                            @Override
+                            public void userListDeleteFailure(String message) {
+                                // 鐢ㄦ埛鍒楄〃鍒犻櫎澶辫触
+                                faceHandler.sendEmptyMessage(0);
+                            }
+                        },
+                        new DBLoadListener() {
+                            @Override
+                            public void onStart(int successCount) {
+
+                            }
+
+                            @Override
+                            public void onLoad(int finishCount, int successCount, float progress) {
+
+                            }
+
+                            @Override
+                            public void onComplete(List<User> features, int successCount) {
+
+                            }
+
+                            @Override
+                            public void onFail(int finishCount, int successCount, List<User> features) {
+
+                            }
+                        });
+            }else {
+                faceHandler.sendEmptyMessage(0);
+            }
         }
     }
 
@@ -1041,14 +1112,21 @@
         }
     }
 
+    private UpdateUtil updateUtil;
     private void checkUpdate(){
         //鐗堟湰鏇存柊
-        new UpdateUtil(this).setShowToast(false).getServerVerCode(new UpdateUtil.VersionCallBack() {
-            @Override
-            public void isNeedUpdate(boolean isUpdate) {
-                isUpdateVersion = isUpdate;
-            }
-        });
+        if(updateUtil==null){
+            updateUtil = new UpdateUtil(this);
+            updateUtil.setShowToast(false);
+        }
+        if(!updateUtil.isShowing()){
+            updateUtil.getServerVerCode(new UpdateUtil.VersionCallBack() {
+                @Override
+                public void isNeedUpdate(boolean isUpdate) {
+                    isUpdateVersion = isUpdate;
+                }
+            });
+        }
     }
 
     private PermissiondDialog permissiondDialog;
@@ -1080,7 +1158,7 @@
     }
 
     private int tipDownCount = 10;
-    private int loopDownCount = 30;
+    private int loopDownCount = 60;
     private boolean isShowTip;
     @Subscribe
     public void TimeClockEvent(TimeClockEvent e){
@@ -1095,9 +1173,12 @@
                 }
             }
             if(loopDownCount==0){
-                loopDownCount = SpUtil.getInt("loop_time",30);
+                loopDownCount = SpUtil.getInt("loop_time",60);
                 //瀹氭椂鎷夊彇鍩烘湰淇℃伅
                 getVM().devLogin();
+                getPermission();
+                getVM().devHeart();
+                EventBus.getDefault().post(new GetFacesEvent());
             }else {
                 loopDownCount--;
             }
@@ -1112,8 +1193,12 @@
     public void OpenGridEvent(OpenGridEvent e){
         if(!isFinishing()){
             //寮�鍚煖闂�
-            String code = "8A"+SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
-                    +SportUtils.intToHex(Integer.parseInt(e.getChannelCode()))+"11";
+            String key = e.getKey();
+            if(TextUtils.isEmpty(key)) {
+                key = SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
+                        + SportUtils.intToHex(Integer.parseInt(e.getChannelCode()));
+            }
+            String code = "8A" + key + "11";
             code += SportUtils.getBCC(code);
             send485(0,code);
         }
@@ -1176,38 +1261,6 @@
         }
     }
 
-
-    @Subscribe
-    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
-        if(!isFinishing()&&isShowing){
-            //鍦ㄩ椤碉紝鏍¢獙鍏抽棬鐨勯挜鍖欐槸鍚﹀尮閰�
-            if (e.getIsOpen() == 0) {
-                //鍏抽棬鎴愬姛
-                //鏌ヨ閽ュ寵鍙�
-                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
-                if (gridDo != null) {
-                    getVM().addInfo("姣旇緝閽ュ寵锛氬綋鍓嶏細"+gridDo.getCurKeyCode()+", 鍏宠仈閽ュ寵锛�"+gridDo.getKeyCode());
-                    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(e.getKey().substring(2,4), 16)+"",
-                                Integer.parseInt(e.getKey().substring(0,2), 16)+""));
-                    }else {
-                        if(isShowTip){
-                            doRegister(5,null);
-                        }
-                        if(isShowing){
-                            //鍦ㄩ椤靛叧闂ㄦ垚鍔燂紝闇�璋冪敤鍏抽棬鏂规硶
-                            getVM().closeGrid(gridDo);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
     private SerialPortModel gridPort;
     private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
         @Override
@@ -1267,30 +1320,18 @@
                     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) + ""));
-                                }
-                            }
+                            EventBus.getDefault().post(new OpenErrEvent(key));
                         }else {
-                            //寮�闂ㄦ垚鍔�
+                            //寮�闂ㄨ繑鍥�
+                            EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                         }
                     }
-                    //寮�闂ㄨ繑鍥�
-                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
+
                 }else if(data.length()==16){
                     //鎵归噺
                     //8A 02 00 00 00 00 11 99
@@ -1314,14 +1355,6 @@
                                 updateList.add(gridDo);
                             }
                         }
-                        runOnUiThread(() -> {
-                            getVM().addInfo("鎵归噺寮�闂ㄦ洿鏂板簱鏁版嵁:鐗堝彿锛�" +bh+","+updateList.size());
-                        });
-                        //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());
@@ -1341,16 +1374,13 @@
                 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,"00".equals(open)?1:0));
                 if(isShowing&&isShowTip){
                     //淇敼鏄剧ず鎻愰啋
-                    doRegister(5,null);
+                    getVM().doAction(5);
                 }
             }else if(data.startsWith("80")){
                 //鏌ヨ鎵�鏈夐棬鐘舵��
@@ -1393,12 +1423,6 @@
                         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){
@@ -1520,12 +1544,6 @@
                 }
             }
         }
-        //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());
@@ -1552,12 +1570,9 @@
             }
             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")));
-                });
                 if(data.contains("blow fail")){
                     //妫�娴嬪け璐�
                     EventBus.getDefault().post(new JiujinResultEvent(false,null));
@@ -1691,18 +1706,35 @@
         sendPortHandlerMsg(2,"A002010000000003",time+400);
     }
 
+    private String jiu_blow;
+    private String jiu_mic_ad;
+    private String jiu_alarm;
+    private String jiu_unit;
     private void setJiuConfig(long time){
         CabinetConfigDataBean config = MApplication.getConfigBean().getCabinetConfigDataVO();
-        //璁剧疆鍚规皵鏃堕棿
-        sendPortHandlerMsg(3,"blow:"+config.getBlowTime(),time+100);
-        //鍘嬪姏鍊�
-        sendPortHandlerMsg(3,"mic_ad:"+config.getPressure(),time+300);
-        //娴撳害闃堝��
-        sendPortHandlerMsg(3,"alarm:"+config.getConcentration(),time+600);
-        //娴撳害闃堝�煎崟浣� (1=mg/100ml;2=mg/L;3=%BAC)
-        sendPortHandlerMsg(3,"unit:"+config.getThreshold(),time+900);
-
-        sendPortHandlerMsg(3,"read"+config.getThreshold(),time+1200);
+        if(!config.getBlowTime().equals(jiu_blow)) {
+            //璁剧疆鍚规皵鏃堕棿
+            jiu_blow = config.getBlowTime();
+            sendPortHandlerMsg(3, "blow:" + config.getBlowTime(), time += 100);
+        }
+        if(!config.getPressure().equals(jiu_mic_ad)) {
+            //鍘嬪姏鍊�
+            jiu_mic_ad = config.getPressure();
+            sendPortHandlerMsg(3, "mic_ad:" + config.getPressure(), time += 300);
+        }
+        if(!config.getConcentration().equals(jiu_alarm)) {
+            //娴撳害闃堝��
+            jiu_alarm = config.getConcentration();
+            sendPortHandlerMsg(3, "alarm:" + config.getConcentration(), time += 300);
+        }
+        if("3".equals(config.getThreshold())){
+            config.setThreshold("0");
+        }
+        if(!config.getThreshold().equals(jiu_unit)) {
+            //娴撳害闃堝�煎崟浣� (1=mg/100ml;2=mg/L;3=%BAC)
+            jiu_unit = config.getThreshold();
+            sendPortHandlerMsg(3, "unit:" + config.getThreshold(), time += 300);
+        }
     }
 
     private void sendPortHandlerMsg(int what,String obj,long time){
@@ -1715,15 +1747,15 @@
     private boolean isInitPort;
     //鍒濆鍖栦覆鍙�
     private void initPort(){
-        SpUtil.setString("port_grid","/dev/ttyS7");
-        SpUtil.setString("port_key","/dev/ttyS1");
-        SpUtil.setString("port_jiu","/dev/ttyS2");
+        //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"))){
@@ -1867,10 +1899,6 @@
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                //todo 鍘绘帀
-                if(type==2){
-                    return;
-                }
                 getVM().addInfo("鍙戦�佹寚浠わ細"+StringUtil.DateToStrSS(new Date())+"==>"+code);
             }
         });
@@ -1937,4 +1965,124 @@
         getVM().addInfo("涓插彛鍏ㄩ儴閾炬帴鎴愬姛锛�");
         return true;
     }
+
+    //寮�闂�
+    @Subscribe
+    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
+        if(!isFinishing()&&isShowing){
+            //寮�闂ㄦ垚鍔燂紝绉婚櫎寮�闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+                getVM().addInfo("==绉婚櫎寮�闂ㄤ换鍔�");
+            }
+        }
+    }
+
+    private Long keyTime;
+    private HashMap<String,String> closeMap = new HashMap<>();
+    /**
+     * 鍏抽棬
+     * @param e
+     */
+    @Subscribe(threadMode= ThreadMode.MAIN)
+    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
+        if(!isFinishing()&&isShowing){
+            //鍏抽棬鎴愬姛锛岀Щ闄ゅ紑闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+                getVM().addInfo("==绉婚櫎寮�闂ㄤ换鍔�");
+            }
+            closeMap.put(e.getKey(),"");
+            //鍙戦�佹煡璇㈤挜鍖欏彿
+            EventBus.getDefault().post(new GetKeyStatusEvent());
+            keyTime = new Date().getTime()+500;
+            if(handler.hasMessages(2)){
+                handler.removeMessages(2);
+            }
+            handler.sendEmptyMessageDelayed(2,1200);
+        }
+    }
+
+    @Subscribe(threadMode= ThreadMode.MAIN)
+    public void OpenErrEvent(OpenErrEvent e){
+        //寮�闂ㄥけ璐�
+        if(!isFinishing()&&isShowing){
+            //寮�闂�
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+                getVM().addInfo("==绉婚櫎寮�闂ㄤ换鍔�");
+            }
+            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
+            Message msg = Message.obtain();
+            msg.what=1;
+            msg.obj = e.getKey();
+            handler.sendMessageDelayed(msg,1000);
+        }
+    }
+
+    @Subscribe
+    public void KeyResultEvent(KeyResultEvent e){
+        if(!isFinishing()&&isShowing){
+            //鏍¢獙鏃堕棿
+            if(keyTime==null){
+                return;
+            }
+            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
+                //鏍¢獙杩斿洖鏃堕棿<鍛戒护鏃堕棿
+                return;
+            }
+            if(handler.hasMessages(2)){
+                handler.removeMessages(2);
+            }
+
+            HashMap<String,String> copyMap = new HashMap<>();
+            copyMap.putAll(closeMap);
+            closeMap.clear();
+            //鏍¢獙鍗″彿涓嶅鐨勶紝鐩存帴寮瑰嚭
+            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
+            List<String> keys = new ArrayList<>();
+            StringBuilder sb = new StringBuilder();
+            for(CabinetGridDo gridDo:gridDos){
+                //瑕佸湪鑼冨洿鍐�
+                if(copyMap.containsKey(gridDo.getGridKey())){
+                    boolean isFail = false;
+                    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());
+                            isFail = true;
+                        }
+                    }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());
+                                isFail = true;
+                            }
+                        }
+                    }
+                    if(!isFail){
+                        //鍏抽棬鎴愬姛
+                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�***************************>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
+                        getVM().closeGrid(gridDo);
+                    }
+                }
+            }
+            if(sb.length()>0){
+                ToastView.show(MApplication.mContext, sb.toString() + "閽ュ寵瀛樻斁浣嶇疆閿欒");
+            }
+            if(keys.size()>0){
+                //寮�闂�
+                EventBus.getDefault().post(new OpenGridListEvent(keys));
+            }
+        }
+    }
 }
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 c511e94..40f82bc 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
@@ -71,7 +71,6 @@
 
     public void devLogin(){
         //娓呴櫎鐧诲綍淇℃伅
-        MApplication.saveConfigBean(new DevConfigBean());
         EventBus.getDefault().post(new HttpEvent("鑾峰彇閽ュ寵鏌滃熀鏈俊鎭�-璇锋眰"));
         getRetrofitService(Apis.class).getCabinetInfoForDriver(LMobileInfo.getDeviceUniqueId())
                 .compose(RxUtils.schedulersTransformer())
@@ -89,6 +88,7 @@
                                 toast(MApplication.mContext.getString(R.string.guide_toast_1));
                             }
                         }else {
+                            MApplication.saveConfigBean(new DevConfigBean());
                             toast(response.getMessage());
                         }
                     }
@@ -158,12 +158,6 @@
             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++){
@@ -215,13 +209,13 @@
                                 List<FaceUserBean> datas = new ArrayList<>();
                                 if(faceBean!=null&&faceBean.getAutoFaceList()!=null){
                                     for(FaceUserBean bean:faceBean.getAutoFaceList()){
-                                        bean.setGroupId("1");
+                                        bean.setGroupId("0");
                                     }
                                     datas.addAll(faceBean.getAutoFaceList());
                                 }
                                 if(faceBean!=null&&faceBean.getDriverFaceList()!=null){
                                     for(FaceUserBean bean:faceBean.getDriverFaceList()){
-                                        bean.setGroupId("0");
+                                        bean.setGroupId("1");
                                     }
                                     datas.addAll(faceBean.getDriverFaceList());
                                 }
@@ -330,7 +324,7 @@
                 .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                     @Override
                     public void onNext(@NonNull BaseResponse response) {
-                        toast("鍏抽棬鎺ュ彛璋冪敤鎴愬姛");
+
                     }
 
                     @Override
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
index 56a801a..2eb455d 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
@@ -14,6 +14,7 @@
 import com.doumee.keyCabinet.ui.guide.GuideActivity;
 import com.doumee.keyCabinet.ui.main.MainActivity;
 import com.doumee.lib_coremodel.util.SpUtil;
+import com.innohi.YNHAPI;
 
 import java.io.BufferedWriter;
 import java.io.ByteArrayOutputStream;
@@ -86,22 +87,30 @@
 	public void uncaughtException(Thread thread, Throwable ex) {
 		try {
 			//瀵煎嚭寮傚父淇℃伅鍒癝D鍗′腑
+			YNHAPI mAPI = YNHAPI.getInstance();
+			mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
 			dumpExceptionToSDCard(ex);
-			//System.out.println("閲嶅惎搴旂敤");
-			// 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
-			/*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);
+			long time = SpUtil.getLong("err_app");
+			SpUtil.saveLong("err_app",System.currentTimeMillis());
+			if(System.currentTimeMillis()-time>60000){
+				//鎶ラ敊闂撮殧60绉掞紝鎵嶉噸鍚�
+				//System.out.println("閲嶅惎搴旂敤");
+				// 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
+				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);*/
+				android.os.Process.killProcess(android.os.Process.myPid());
+				System.exit(1);
+			}
 			//杩欓噷鍙互閫氳繃缃戠粶涓婁紶寮傚父淇℃伅鍒版湇鍔″櫒锛屼究浜庡紑鍙戜汉鍛樺垎鏋愭棩蹇椾粠鑰岃В鍐砨ug
+
 		} catch (IOException e) {
 			e.printStackTrace();
 			System.out.println("閿欒鏃ュ織1"+e.getMessage());
@@ -263,7 +272,7 @@
 			dumpPhoneInfo(print);
 			print.println();
 			ex.printStackTrace(print);
-			SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
+			//SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
 			print.close();
 		} catch (Exception e) {
 			e.printStackTrace();
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 1849b2c..ae6dbef 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
@@ -66,7 +66,7 @@
             }
             return;
         }
-        // todo 澧炲姞鍒ょ┖澶勭悊
+
         if (listener != null) {
             listener.initStart();
         }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java
index 3f6aba7..7ae003d 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java
@@ -55,7 +55,7 @@
 				}
 			}
 		});
-		getWritePermision();
+		//getWritePermision();
 	}
 
 	public void setOnOtemListener(UpdialogListener lister) {
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java
index cd748b5..3ee3621 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java
@@ -57,6 +57,17 @@
         // thread.interrupt();
         // }
     }
+
+    public boolean isShowing() {
+        if(updateDialog!=null&&updateDialog.isShowing()){
+            return true;
+        }
+        if(downloadDialog!=null&&downloadDialog.isShowing()){
+            return true;
+        }
+        return false;
+    }
+
     public static interface VersionCallBack{
         void isNeedUpdate(boolean isUpdate);
     }
@@ -81,8 +92,8 @@
                                     versionCallBack.isNeedUpdate(true);
                                     upgradeurl=data.getFullFileUrl();
                                     updatelog=data.getContent();
-                                    newVerName = response.getData().getVersionInfo();
-                                    doNewVersionUpdate(true);
+                                    newVerName = data.getVersionInfo();
+                                    doNewVersionUpdate(data.getIsForce()==1);
                                 }else {
                                     versionCallBack.isNeedUpdate(false);
                                 }
@@ -117,6 +128,7 @@
         }
     }
 
+    private UpdateDialog updateDialog;
     // 鏇存柊鏂扮増鏈�
     public void doNewVersionUpdate(boolean type) {
         StringBuffer sb = new StringBuffer();
@@ -132,7 +144,10 @@
         }
         // sb.append(updatelog+"\n\n\r");
         // new UpdateDialog(activity).show();
-        final UpdateDialog updateDialog = new UpdateDialog(activity);
+        if(updateDialog!=null&&updateDialog.isShowing()){
+            updateDialog.dismiss();
+        }
+        updateDialog = new UpdateDialog(activity);
         updateDialog.setText(sb.toString(),newVerName);
         updateDialog.setOnOtemListener(new UpdateDialog.UpdialogListener() {
 
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 53880b2..bd91c0e 100644
--- a/keyCabinet-android/app/src/main/res/layout/face_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/face_activity.xml
@@ -17,6 +17,18 @@
         android:background="@color/white"
         >
 
+        <EditText
+            android:id="@+id/et_ewm"
+            android:layout_width="100dp"
+            android:layout_height="wrap_content"
+            android:text=""
+            android:inputType="number"
+            app:layout_constraintTop_toTopOf="@+id/viewBack"
+            app:layout_constraintBottom_toBottomOf="@+id/viewBack"
+            app:layout_constraintStart_toStartOf="parent"
+            android:background="@null"
+            />
+
         <View
             android:id="@+id/viewBack"
             android:layout_width="0dp"
@@ -482,20 +494,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             android:background="@color/white"
-            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"
-                />
+            android:visibility="gone">
 
             <View
                 android:id="@+id/v_c_sl"
@@ -703,10 +702,10 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:background="@drawable/shape_jiujin_ok"
-            android:paddingLeft="80dp"
-            android:paddingRight="80dp"
-            android:paddingTop="50dp"
-            android:paddingBottom="50dp"
+            android:paddingLeft="60dp"
+            android:paddingRight="60dp"
+            android:paddingTop="40dp"
+            android:paddingBottom="40dp"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toStartOf="parent"
@@ -715,8 +714,8 @@
 
             <pl.droidsonroids.gif.GifImageView
                 android:id="@+id/img_progress"
-                android:layout_width="150dp"
-                android:layout_height="150dp"
+                android:layout_width="90dp"
+                android:layout_height="90dp"
                 android:src="@mipmap/zhuanquan"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
@@ -736,5 +735,23 @@
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
+        <TextView
+            android:id="@+id/message"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/activity_vertical_margin"
+            android:layout_marginRight="@dimen/activity_vertical_margin"
+            android:text=""
+            android:textColor="@color/white"
+            android:textSize="24sp"
+            android:padding="@dimen/activity_horizontal_margin"
+            android:background="@drawable/toast_view_bg"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:gravity="center"
+            android:visibility="gone"/>
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/res/layout/layout_download.xml b/keyCabinet-android/app/src/main/res/layout/layout_download.xml
index 1a118fc..e72e791 100644
--- a/keyCabinet-android/app/src/main/res/layout/layout_download.xml
+++ b/keyCabinet-android/app/src/main/res/layout/layout_download.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
+    android:layout_width="450dp"
     android:layout_height="wrap_content"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_gravity="center"
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 36f24dc..4b4fc50 100644
--- a/keyCabinet-android/app/src/main/res/layout/main_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/main_activity.xml
@@ -22,21 +22,6 @@
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintStart_toStartOf="parent"/>
 
-        <TextView
-            android:id="@+id/tv_m"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="鍐呭瓨"
-            android:textSize="30sp"
-            android:textColor="@color/white"
-            android:gravity="center"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            android:paddingLeft="0dp"
-            android:paddingRight="10dp"
-            android:visibility="gone"
-            />
-
         <com.facebook.drawee.view.SimpleDraweeView
             android:id="@+id/img1"
             android:layout_width="match_parent"
@@ -420,5 +405,20 @@
             app:layout_constraintStart_toStartOf="parent"
             />
 
+        <TextView
+            android:id="@+id/tv_m"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text=""
+            android:textSize="30sp"
+            android:textColor="@color/black"
+            android:gravity="center"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            android:paddingLeft="0dp"
+            android:paddingRight="10dp"
+            android:visibility="gone"
+            />
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>
\ No newline at end of file
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 01997ec..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
@@ -37,18 +37,6 @@
             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 c40e433..12b356e 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
@@ -88,7 +88,7 @@
                 android:layout_width="0dp"
                 android:layout_height="75dp"
                 android:background="@null"
-                android:text="18656077929"
+                android:text=""
                 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="Whyc2025"
+                android:text=""
                 android:hint="璇疯緭鍏ヨ处鍙峰瘑鐮�"
                 android:textColorHint="#999999"
                 android:textSize="24sp"
diff --git a/keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml b/keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml
index d43f87a..8bb1d94 100644
--- a/keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml
+++ b/keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml
@@ -2,7 +2,7 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/rl_root"
-    android:layout_width="match_parent"
+    android:layout_width="450dp"
     android:layout_height="wrap_content">
 
     <androidx.constraintlayout.widget.ConstraintLayout
diff --git a/keyCabinet-android/app/src/main/res/values/strings.xml b/keyCabinet-android/app/src/main/res/values/strings.xml
index e02f541..65190e7 100644
--- a/keyCabinet-android/app/src/main/res/values/strings.xml
+++ b/keyCabinet-android/app/src/main/res/values/strings.xml
@@ -114,8 +114,8 @@
     <string name="main_tip3">浜鸿劯搴撳姞杞藉け璐�,鍏�%1$d鏉℃暟鎹�, 宸插姞杞�%2$d鏉℃暟鎹�</string>
     <string name="main_tip4">妯″瀷鍔犺浇鎴愬姛锛屾杩庝娇鐢�</string>
     <string name="main_tip5">妯″瀷鍔犺浇澶辫触锛岃灏濊瘯閲嶅惎搴旂敤</string>
-    <string name="face_hy">浼氬憳</string>
-    <string name="face_xy">绠$悊鍛�</string>
+    <string name="face_hy">鍙告満</string>
+    <string name="face_xy">楠岃瘉浜�</string>
     <string name="guide_2">璁惧鏈櫥褰�</string>
     <string name="face_login">浜鸿劯璇嗗埆涓�</string>
     <string name="face_tip1">璇锋瑙嗗墠鏂癸紝涓嶈閬尅鑴搁儴</string>
diff --git a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
index cd1a90f..fe9db72 100644
--- a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
+++ b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -309,15 +309,14 @@
 
     private static BDFaceImageInstance rgbInstance =null;
     private LivenessModel livenessModel;
+    private String groupId;
 
     /**
      * 0:绠$悊鍛橈紝1锛氱敤鎴�
      * @param groupId
      */
     public void setGroupId(String groupId){
-        if(livenessModel!=null){
-            livenessModel.setGroupId(groupId);
-        }
+        this.groupId = groupId;
     }
     /**
      * 妫�娴�-娲讳綋-鐗瑰緛-浜鸿劯妫�绱㈡祦绋�
@@ -1215,7 +1214,7 @@
                     //System.out.println("==isOk==>鍖归厤鍒版暟閲�"+featureResult.size());
                     User user = null;
                     Feature topFeature = null;
-                    if(TextUtils.isEmpty(livenessModel.getGroupId())){
+                    if(TextUtils.isEmpty(groupId)){
                         //涓虹┖锛岄渶瑕佹帓搴忥紝浼樺厛鍙栦細鍛�
                         for(Feature feat:featureResult) {
                             threholdScore = bdFaceCheckConfig.scoreThreshold;
@@ -1242,7 +1241,7 @@
                                 //System.out.println("==isOk==>50");
                                 // 褰撳墠featureEntity 鍙湁id+feature 绱㈠紩锛屽湪鏁版嵁搴撲腑鏌ュ埌瀹屾暣淇℃伅
                                 User userOld = FaceApi.getInstance().getUserListById(feat.getId());
-                                if(livenessModel.getGroupId().equals(userOld.getGroupId())){
+                                if(groupId.equals(userOld.getGroupId())){
                                     user = userOld;
                                     topFeature = feat;
                                     break;
diff --git a/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java b/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java
index 9f62235..8b49bc5 100644
--- a/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java
+++ b/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java
@@ -228,6 +228,10 @@
         actionEvent.setValue(new ActionEventData(type));
     }
 
+    public void doAction(int type,String obj){
+        actionEvent.setValue(new ActionEventData(type,obj));
+    }
+
     public LifecycleOwner getLifecycleOwner() {
         return lifecycleOwner;
     }
diff --git a/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java b/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java
index 8085cdc..8f727c1 100644
--- a/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java
+++ b/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java
@@ -28,6 +28,13 @@
         this.data.put("type",type);
     }
 
+    public ActionEventData(int type,String obj){
+        this.action = ActionEvent.Action.DO;
+        this.data = new HashMap<>();
+        this.data.put("type",type);
+        this.data.put("obj",obj);
+    }
+
     public ActionEventData(int action,Object value) {
         this.action = action;
         this.data = new HashMap<>();
diff --git a/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java b/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java
index d3eeb11..c071a81 100644
--- a/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java
+++ b/keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java
@@ -104,6 +104,16 @@
         return getSharedPreferences().getInt(key, 0);
     }
 
+    public static void saveLong(String key, Long value){
+        SharedPreferences.Editor editor = getSharedPreferences().edit();
+        editor.putLong(key, value);
+        editor.commit();
+    }
+
+    public static Long getLong(String key){
+        return getSharedPreferences().getLong(key, 0L);
+    }
+
     public static boolean getBoolean(String key){
         return getSharedPreferences().getBoolean(key, false);
     }
diff --git a/keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml b/keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml
index cfd3abf..8255037 100644
--- a/keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml
+++ b/keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml
@@ -8,4 +8,5 @@
     <color name="line">#E5E5E5</color>
     <color name="bg">#fff4f6f9</color>
     <color name="f7">#F7F7F7</color>
+    <color name="dialog_bg">#80000000</color>
 </resources>
\ No newline at end of file
diff --git a/server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml b/server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml
index 7cb826c..14830a4 100644
--- a/server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml
+++ b/server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       config:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_dev
 #        namespace: dev_renkang
         username: nacos
@@ -23,7 +23,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dev_renkang
         namespace: dmvisit
         username: nacos
diff --git a/server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml b/server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml
index d0061b0..d1178ca 100644
--- a/server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml
+++ b/server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml
@@ -14,7 +14,7 @@
       username: nacos
       password: Atwl@2024
       #      config:
-      #        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      #        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       #        namespace: dmvisit
       #        username: nacos
       #        password: nacos
diff --git a/server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml b/server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml
index e7893a9..2c5332f 100644
--- a/server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml
+++ b/server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       config:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_dev
 #        namespace: dev_renkang
         username: nacos
@@ -23,7 +23,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: wuhu_visit_dev
         namespace: dmvisit_dev
         username: nacos
diff --git a/server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml b/server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml
index cc75624..f201cd7 100644
--- a/server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml
+++ b/server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       config:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_test
         username: nacos
         password: nacos
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_test
         username: nacos
         password: nacos
diff --git a/server/startsh/admin_start.sh b/server/startsh/admin_start.sh
index ae7e192..d980965 100644
--- a/server/startsh/admin_start.sh
+++ b/server/startsh/admin_start.sh
@@ -8,8 +8,15 @@
 
 /usr/local/nacos/nacos/bin/startup.sh -m standalone
 
-nohup java -jar /usr/local/jars/system_gateway.jar > /dev/null 2>&1 &
-nohup java -jar /usr/local/jars/admin_timer.jar > /dev/null 2>&1 &
-nohup java -jar /usr/local/jars/system_timer.jar > /dev/null 2>&1 &
-nohup java -jar /usr/local/jars/admin_interface.jar > /dev/null 2>&1 &
-nohup java -jar /usr/local/jars/meeting_admin.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/wuhuyancao/system_gateway.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/wuhuyancao/admin_timer.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/wuhuyancao/system_timer.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/wuhuyancao/admin_interface.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/wuhuyancao/meeting_admin.jar > /dev/null 2>&1 &
+
+
+
+cd /usr/local/ortools/java_or-tools
+
+
+tail -f /usr/local/jars/logs/visitsAdmin/info.2025-10-31.0.log
diff --git "a/server/startsh/\345\220\257\345\212\250\350\204\232\346\234\254\345\222\214\346\227\245\345\277\227\345\244\204\347\220\206\350\204\232\346\234\254\350\257\264\346\230\216.txt" "b/server/startsh/\345\220\257\345\212\250\350\204\232\346\234\254\345\222\214\346\227\245\345\277\227\345\244\204\347\220\206\350\204\232\346\234\254\350\257\264\346\230\216.txt"
index c8720f2..ecf18c1 100644
--- "a/server/startsh/\345\220\257\345\212\250\350\204\232\346\234\254\345\222\214\346\227\245\345\277\227\345\244\204\347\220\206\350\204\232\346\234\254\350\257\264\346\230\216.txt"
+++ "b/server/startsh/\345\220\257\345\212\250\350\204\232\346\234\254\345\222\214\346\227\245\345\277\227\345\244\204\347\220\206\350\204\232\346\234\254\350\257\264\346\230\216.txt"
@@ -11,3 +11,9 @@
 #鎸塃sc閿悗鍐嶈緭鍏�:wq锛�,鍥炶溅淇濆瓨
 #鏌ョ湅鏄惁鍒涘缓鎴愬姛
 crontab -l
+
+#JAVA spring boot涓娇鐢╣oogle鐨刼rtools(绠楁硶鍖�)
+
+Linux绯荤粺瀹夎瀵瑰簲鐨勭増鏈湇鍔★細
+https://developers.google.cn/optimization/install/java/pkg_linux?hl=zh-cn#ubuntu
+ https://modelers.csdn.net/68db8ec14b11580edfa299c6.html?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-5-134512600-blog-119785705.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-5-134512600-blog-119785705.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=10
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java
index d0ca87e..0614b95 100644
--- a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java
@@ -1,6 +1,6 @@
 package com.doumee.config.swagger;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilter;
 import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
diff --git a/server/system_gateway/src/main/resources/bootstrap-dev.yml b/server/system_gateway/src/main/resources/bootstrap-dev.yml
index 053c927..acef110 100644
--- a/server/system_gateway/src/main/resources/bootstrap-dev.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-dev.yml
@@ -1,11 +1,11 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
         namespace: wuhu_visit_dev1
         username: nacos
diff --git a/server/system_gateway/src/main/resources/bootstrap-self.yml b/server/system_gateway/src/main/resources/bootstrap-self.yml
index b5dfadd..a375799 100644
--- a/server/system_gateway/src/main/resources/bootstrap-self.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-self.yml
@@ -1,11 +1,11 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
         namespace: wuhu_visit_dev
         username: nacos
diff --git a/server/system_gateway/src/main/resources/bootstrap-test.yml b/server/system_gateway/src/main/resources/bootstrap-test.yml
index 34f9986..033273f 100644
--- a/server/system_gateway/src/main/resources/bootstrap-test.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-test.yml
@@ -1,11 +1,11 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         #        namespace: dmvisit
         namespace: wuhu_visit_test
         username: nacos
diff --git a/server/system_service/pom.xml b/server/system_service/pom.xml
index 1439845..2483770 100644
--- a/server/system_service/pom.xml
+++ b/server/system_service/pom.xml
@@ -356,22 +356,5 @@
              </exclusions>
         </dependency>
 -->
-        <dependency>
-            <groupId>com.google.protobuf</groupId>
-            <artifactId>protobuf-java</artifactId>
-            <version>4.31.1</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.google.ortools</groupId>
-            <artifactId>ortools-java</artifactId>
-            <version>9.14.6206</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.protobuf</groupId>
-                    <artifactId>protobuf-java</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java b/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
index c3298bb..1a03476 100644
--- a/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
+++ b/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
@@ -150,7 +150,7 @@
 
     @Override
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
-    public void create(CreateSystemUserDTO systemUser) {
+    public void  create(CreateSystemUserDTO systemUser) {
         // 楠岃瘉鐢ㄦ埛鍚�
         SystemUser queryUserDto = new SystemUser();
         queryUserDto.setUsername(systemUser.getUsername());
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index 392fe0a..f6daf8d 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -790,7 +790,7 @@
                 String t = reversedHex.substring(i*2,i*2+2);
                 result += new StringBuilder(t).reverse().toString();
             }
-            return result;
+            return result.toUpperCase();
         }catch (Exception e){
 
         }
@@ -1130,7 +1130,7 @@
         WAIT_CALL(2, "宸茬鍒�","宸茬鍒�"),
         IN_WAIT(3, "鍏ュ洯绛夊緟","鍏ュ洯绛夊緟" ),
         CALLED(4, "宸插彨鍙�","宸插彨鍙�" ),
-         WORKING(5, "浣滀笟涓�","浣滀笟涓�" ),
+        WORKING(5, "浣滀笟涓�","浣滀笟涓�" ),
         DONE(6, "浣滀笟瀹屾垚 ","浣滀笟瀹屾垚" ),
         TRANSFERING(7, "杞Щ涓�","杞Щ涓�" ),
         EXCEPTION(8, "寮傚父鎸傝捣","寮傚父鎸傝捣" ),
@@ -1194,7 +1194,7 @@
         IN_CITY_CAR_USE(3, "鍏溅甯傚唴鐢ㄨ溅 ", "鍏溅甯傚唴鐢ㄨ溅 "),
         OUT_CITY_CAR_USE(4, "鍏溅瀹ゅ鐢ㄨ溅 ", "鍏溅瀹ゅ鐢ㄨ溅 "),
         CITY_WLC_BOOK(5, "甯傚叕鍙哥墿娴佽溅棰勭害 ", "5甯傚叕鍙哥墿娴佽溅棰勭害 "),
-        PLATFROM_REASON(6, "鏈堝彴鍏ュ洯鍘熷洜瀹℃壒 ", "鏈堝彴鍏ュ洯鍘熷洜瀹℃壒 "),
+        PLATFROM_REASON(6, "鏈堝彴鍏ュ洯鍘熷洜瀹℃壒 ", "鏈堝彴鍏ュ洯鍘熷洜瀹℃壒 ")
         ;
         // 鎴愬憳鍙橀噺
         private String name;
@@ -1523,18 +1523,20 @@
 
 
     public  enum WarningConfig {
-        ALARM_TEST(10002, "閰掔簿娴嬭瘯"),
-        GRID_TIME_OUT_INFO(10003, "寮�闂ㄨ秴鏃舵湭鍏抽棴"),
-        KEY_TIME_OUT_BACK(10004, "閽ュ寵瓒呮椂鏈綊杩�"),
+        ALARM_TEST(10002, "銆愰挜鍖欐煖銆戦厭绮炬祴璇曞紓甯�",0),
+        GRID_TIME_OUT_INFO(10003, "銆愰挜鍖欐煖銆戝紑闂ㄨ秴鏃舵湭鍏抽棴",0),
+        KEY_TIME_OUT_BACK(10004, "銆愰挜鍖欐煖銆戦挜鍖欒秴鏃舵湭褰掕繕",0),
         ;
         // 鎴愬憳鍙橀噺
         private int key;
         private String info;
+        private int processArea;
 
         // 鏋勯�犳柟娉�
-        WarningConfig(int key,String info) {
+        WarningConfig(int key,String info,int processArea) {
             this.key = key;
             this.info = info;
+            this.processArea = processArea;
         }
 
 
@@ -1554,6 +1556,15 @@
             this.info = info;
         }
 
+        public int getProcessArea() {
+            return processArea;
+        }
+
+        public void setProcessArea(int processArea) {
+            this.processArea = processArea;
+        }
+
+
     }
 
 
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java b/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
index d989500..6213c15 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -16,7 +16,6 @@
 import cn.hutool.core.date.DateUnit;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
-
 /**
  * 鏃ユ湡宸ュ叿绫�
  * @author: jiangping
@@ -2972,7 +2971,7 @@
 //            Date date1 = getISO8601DateByStr("2024-06-14T08:46:36.014+08:00");
 //            System.out.println(DateUtil.afterMinutesDate(-5));
 
-            System.out.println(DateUtil.getFirstThisMonthDate());
+            System.out.println(DateUtil.getWeekZhouOfDate(getDateFromString2("2025-11-06 00:00:00")));
 
 //            System.out.println(getPlusTime2(DateUtil.addMonthToDate(new Date(),-1)));
 //            System.out.println(DateUtil.getBeforMonthStr(new Date(),12));
@@ -3114,7 +3113,6 @@
         String temp = sdf.format(date);
         String firstDayInMoth = "";
         firstDayInMoth = temp + "-01";
-
         return firstDayInMoth;
 
     }
@@ -3147,7 +3145,8 @@
      */
     public static String getWeekZhouOfDate(Date dt) {
         String[] weekDays = { "鍛ㄦ棩", "鍛ㄤ竴", "鍛ㄤ簩", "鍛ㄤ笁", "鍛ㄥ洓", "鍛ㄤ簲", "鍛ㄥ叚" };
-        Calendar cal = Calendar.getInstance();
+        TimeZone china = TimeZone.getTimeZone("Asia/Shanghai");
+        Calendar cal = Calendar.getInstance(china);
         cal.setTime(dt);
 
         int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Monitor.java b/server/system_service/src/main/java/com/doumee/core/utils/Monitor.java
index 4da8296..238e569 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Monitor.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Monitor.java
@@ -1,7 +1,6 @@
 package com.doumee.core.utils;
 
 import com.doumee.core.utils.monitor.*;
-import com.sun.jna.platform.mac.DiskArbitration;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
diff --git a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
index 3464add..fd72b31 100644
--- a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
+++ b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -115,4 +115,7 @@
     @PostMapping("/timer/systemUserJob/jobForOpenProhibitStatus")
     ApiResponse jobForOpenProhibitStatus();
 
+    @ApiOperation("銆愰挜鍖欐煖銆戝畾鏃跺彂閫侀挜鍖欐湭鍙婃椂褰掕繕閫氱煡")
+    @PostMapping("/timer/jkCabinet/timeOutUnBackAlarm")
+    ApiResponse timeOutUnBackAlarm();
 }
diff --git a/server/system_timer/src/main/resources/bootstrap-dev.yml b/server/system_timer/src/main/resources/bootstrap-dev.yml
index ad3bb37..2553983 100644
--- a/server/system_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/system_timer/src/main/resources/bootstrap-dev.yml
@@ -12,11 +12,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
-      #        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      #        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       #        namespace: dmvisit
       #        username: nacos
       #        password: nacos
@@ -24,7 +24,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_dev
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/system_timer/src/main/resources/bootstrap-pro.yml b/server/system_timer/src/main/resources/bootstrap-pro.yml
index 64495e6..caac07c 100644
--- a/server/system_timer/src/main/resources/bootstrap-pro.yml
+++ b/server/system_timer/src/main/resources/bootstrap-pro.yml
@@ -16,7 +16,7 @@
       username: nacos
       password: nacos
       #      config:
-      #        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      #        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       #        namespace: dmvisit
       #        username: nacos
       #        password: nacos
diff --git a/server/system_timer/src/main/resources/bootstrap-self.yml b/server/system_timer/src/main/resources/bootstrap-self.yml
index 28a6e0a..d9a7b7c 100644
--- a/server/system_timer/src/main/resources/bootstrap-self.yml
+++ b/server/system_timer/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
-      #        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      #        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       #        namespace: dmvisit
       #        username: nacos
       #        password: nacos
@@ -22,7 +22,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_dev
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/system_timer/src/main/resources/bootstrap-test.yml b/server/system_timer/src/main/resources/bootstrap-test.yml
index 2f69748..284ae5b 100644
--- a/server/system_timer/src/main/resources/bootstrap-test.yml
+++ b/server/system_timer/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
-      #        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      #        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       #        namespace: dmvisit
       #        username: nacos
       #        password: nacos
@@ -22,7 +22,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_test
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/visits/admin_timer/pom.xml b/server/visits/admin_timer/pom.xml
index 63b40a5..eb4aa16 100644
--- a/server/visits/admin_timer/pom.xml
+++ b/server/visits/admin_timer/pom.xml
@@ -22,6 +22,18 @@
             <groupId>com.doumee</groupId>
             <artifactId>dmvisit_service</artifactId>
             <version>1.0.0-SNAPSHOT</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.protobuf</groupId>
+                    <artifactId>protobuf-java</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>4.31.1</version>
+            <scope>compile</scope>
         </dependency>
     </dependencies>
 
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/JkCabinetTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/JkCabinetTimerController.java
new file mode 100644
index 0000000..fba3f5e
--- /dev/null
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/JkCabinetTimerController.java
@@ -0,0 +1,40 @@
+package com.doumee.api;
+
+import com.doumee.service.business.JkCabinetLogService;
+import com.doumee.service.business.JkCustomerService;
+import com.doumee.service.business.impl.JkCabinetGridServiceImpl;
+import com.doumee.service.business.third.model.ApiResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.mgt.DefaultSecurityManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Api(tags = "閽ュ寵鏌滃畾鏃跺櫒")
+@RestController
+@RequestMapping("/timer/jkCabinet")
+public class JkCabinetTimerController extends BaseController {
+    @Autowired
+    private JkCabinetLogService jkCabinetLogService;
+
+    @Autowired
+    private JkCabinetGridServiceImpl impl;
+
+
+    @ApiOperation("瀹氭椂鍙戦�侀挜鍖欐湭鍙婃椂褰掕繕閫氱煡")
+    @PostMapping("/timeOutUnBackAlarm")
+    public ApiResponse timeOutUnBackAlarm() {
+        jkCabinetLogService.timeOutUnBackAlarm(impl);
+        return ApiResponse.success("瀹氭椂鍙戦�侀挜鍖欐湭鍙婃椂褰掕繕閫氱煡");
+    }
+
+
+
+}
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
index 02b55bb..f2e0425 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
-#        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+#        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
 #        username: nacos
 #        password: nacos
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_dev
         username: nacos
         password: nacos
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-pro.yml b/server/visits/admin_timer/src/main/resources/bootstrap-pro.yml
index 045c13c..c8032c1 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-pro.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-pro.yml
@@ -14,7 +14,7 @@
       username: nacos
       password: nacos
       #      config:
-      #        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      #        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       #        namespace: dmvisit
       #        username: nacos
       #        password: nacos
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-self.yml b/server/visits/admin_timer/src/main/resources/bootstrap-self.yml
index e6d644d..a9e0f19 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-self.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
-#        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+#        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
 #        username: nacos
 #        password: nacos
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: dmvisit
         username: nacos
         password: nacos
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-test.yml b/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
index 3d1de90..86e309f 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
-#        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+#        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
 #        username: nacos
 #        password: nacos
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_test
         username: nacos
         password: nacos
diff --git a/server/visits/dmvisit_admin/pom.xml b/server/visits/dmvisit_admin/pom.xml
index 0bcd92a..66052ae 100644
--- a/server/visits/dmvisit_admin/pom.xml
+++ b/server/visits/dmvisit_admin/pom.xml
@@ -49,6 +49,32 @@
                     <fork>true</fork>
                     <mainClass>com.doumee.VisitsAdminApplication</mainClass>
                     <layout>ZIP</layout>
+                    <requiresUnpack>
+                        <dependency>
+                            <groupId>com.google.ortools</groupId>
+                            <artifactId>ortools-java</artifactId>
+                        </dependency>
+                        <dependency>
+                            <groupId>com.google.ortools</groupId>
+                            <artifactId>ortools-linux-x86-64</artifactId>
+                        </dependency>
+                        <dependency>
+                            <groupId>com.google.ortools</groupId>
+                            <artifactId>ortools-darwin-x86-64</artifactId>
+                        </dependency>
+                        <dependency>
+                            <groupId>com.google.ortools</groupId>
+                            <artifactId>ortools-win32-x86-64</artifactId>
+                        </dependency>
+                        <dependency>
+                            <groupId>com.google.ortools</groupId>
+                            <artifactId>ortools-linux-aarch64</artifactId>
+                        </dependency>
+                        <dependency>
+                            <groupId>com.google.ortools</groupId>
+                            <artifactId>ortools-darwin-aarch64</artifactId>
+                        </dependency>
+                    </requiresUnpack>
                 </configuration>
                 <executions>
                     <execution>
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
index 65d569e..5d1cdd4 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -7,6 +7,7 @@
 import com.doumee.config.annotation.LoginNoRequired;
 import com.doumee.config.jwt.JwtProperties;
 import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.haikang.model.HKConstants;
 import com.doumee.core.haikang.model.param.BaseResponse;
 import com.doumee.core.haikang.model.param.request.*;
 import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
@@ -171,6 +172,14 @@
         String result = hkSyncPushService.dealVisitEvent(param,response);
         return ApiResponse.success(result);
     }
+    @ApiOperation("銆愭捣搴枫�戝叾浠栬闃呬簨浠惰闃呮帹閫佸鎺ュ鐞嗘帴鍙�")
+    @PostMapping("/push/notice")
+    @LoginNoRequired
+    public ApiResponse pushNotice(@RequestBody EventVisitRequest param, HttpServletResponse response){
+        String result = hkSyncPushService.dealVisitEvent(param,response);
+
+        return ApiResponse.success(result);
+    }
     @ApiOperation("銆愭捣搴枫�戣瀹CCM浜嬩欢璁㈤槄鎺ㄩ�佸鎺ュ鐞嗘帴鍙�")
     @PostMapping("/push/visitIccm")
     @LoginNoRequired
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java
index f9f1183..cc05592 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java
@@ -183,9 +183,9 @@
     @LoginNoRequired
     @ApiOperation("鑾峰彇IC鍗$敤鎴蜂富閿� - 鍙告満")
     @PostMapping("/getMemberIdByCode")
-    public ApiResponse<Integer> getMemberIdByCode(@RequestParam String code) {
-        this.saveInterfaceLog(Constants.strToJson("code",code), null,"getMemberIdByCode","鑾峰彇IC鍗$敤鎴蜂富閿� - 鍙告満");
-        return ApiResponse.success(jkIccardService.getMemberIdByCode(code));
+    public ApiResponse<Integer> getMemberIdByCode(@RequestBody QueryUserByCodeDTO dto) {
+        this.saveInterfaceLog(JSONObject.toJSONString(dto), null,"getMemberIdByCode","鑾峰彇IC鍗$敤鎴蜂富閿� - 鍙告満");
+        return ApiResponse.success(jkIccardService.getMemberIdByCode(dto));
     }
 
     private void saveInterfaceLog(String s, String result,String url,String name) {
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
index 9730a74..49606a5 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
         namespace: wuhu_visit_dev1
         username: nacos
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml
index 072d0b7..f0af774 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml
@@ -14,7 +14,7 @@
       username: nacos
       password: nacos
 #      config:
-#        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+#        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
 #        username: nacos
 #        password: nacos
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml
index c810f26..3ac195f 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
-#        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+#        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
 #        username: nacos
 #        password: nacos
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
         namespace: wuhu_visit_dev
         username: nacos
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
index 733291a..daac276 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
-#        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+#        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
 #        username: nacos
 #        password: nacos
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
         namespace: wuhu_visit_test
         username: nacos
         password: nacos
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
index 9dc10e9..86e11a3 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: test
   application:
     name: visitsAdmin
     # 瀹夊叏閰嶇疆
diff --git a/server/visits/dmvisit_screen/pom.xml b/server/visits/dmvisit_screen/pom.xml
index cfddbb3..0d47f29 100644
--- a/server/visits/dmvisit_screen/pom.xml
+++ b/server/visits/dmvisit_screen/pom.xml
@@ -21,6 +21,18 @@
             <groupId>com.doumee</groupId>
             <artifactId>dmvisit_service</artifactId>
             <version>1.0.0-SNAPSHOT</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.protobuf</groupId>
+                    <artifactId>protobuf-java</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>4.31.1</version>
+            <scope>compile</scope>
         </dependency>
     </dependencies>
     <build>
diff --git a/server/visits/dmvisit_service/pom.xml b/server/visits/dmvisit_service/pom.xml
index c79fde7..923a209 100644
--- a/server/visits/dmvisit_service/pom.xml
+++ b/server/visits/dmvisit_service/pom.xml
@@ -21,6 +21,11 @@
             <groupId>com.doumee</groupId>
             <artifactId>system_service</artifactId>
             <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.ortools</groupId>
+            <artifactId>ortools-java</artifactId>
+            <version>9.14.6206</version>
             <exclusions>
                 <exclusion>
                     <groupId>com.google.protobuf</groupId>
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
index 2832e4e..87e5ffc 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -27,7 +27,7 @@
 import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -519,7 +519,6 @@
 
     /**
      * 瀹夐槻/娑堥槻 markdown
-     * @param hiddenDanger
      * @return
      */
     public OapiMessageCorpconversationAsyncsendV2Request.Msg getAlarmNoticeMsg(String areaName,String submitTime,String infoType){
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseInfoRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseInfoRequest.java
new file mode 100644
index 0000000..53821ce
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseInfoRequest.java
@@ -0,0 +1,19 @@
+package com.doumee.core.haikang.model.param.request.event.base;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.core.haikang.model.param.request.event.visit.EventVisitDataRequest;
+import lombok.Data;
+
+@Data
+public class EventBaseInfoRequest {
+    private String  eventId;//	String	浜嬩欢鍞竴鏍囪瘑	鏄�	64
+    private String  srcIndex;//	String	浜嬩欢婧愮紪鍙凤紝鐗╃悊璁惧鏄祫婧愮紪鍙�	鏄�	64
+    private String  srcType;//	String	浜嬩欢婧愮被鍨�	鏄�	16
+    private Integer  eventType	;//Number	浜嬩欢绫诲瀷	鏄�
+    private String  srcName;//	String	浜嬩欢婧愬悕绉�	鍚�	64
+    private Integer   status	;//Number	浜嬩欢鐘舵��	鏄�		0-鐬椂1-寮�濮�2-鍋滄3-浜嬩欢鑴夊啿4-浜嬩欢鑱斿姩缁撴灉鏇存柊5-寮傛鍥剧墖涓婁紶
+    private Integer  timeout	;//Number	鑴夊啿瓒呮椂鏃堕棿	鏄�		鍗曚綅锛氱
+    private String  happenTime	;//String	浜嬩欢鍙戠敓鏃堕棿锛堣澶囨椂闂达級	鏄�	64
+    private String   srcParentIndex	;//String	浜嬩欢鍙戠敓鐨勪簨浠舵簮鐖惰澶囩紪鍙�	鍚�	64
+    private JSONObject data;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseParamRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseParamRequest.java
new file mode 100644
index 0000000..f743d60
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseParamRequest.java
@@ -0,0 +1,18 @@
+package com.doumee.core.haikang.model.param.request.event.base;
+
+import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EventBaseParamRequest {
+
+
+    private String   sendTime;//	P	String	浜嬩欢浠庢帴鏀惰�咃紙绋嬪簭澶勭悊鍚庯級鍙戝嚭鐨勬椂闂�	鏄�	32	浜嬩欢鍙戦�佹椂闂�
+    private String    ability;//	P	String	浜嬩欢绫诲埆	鏄�	64	鏍囪瘑鍋滆溅鍦轰簨浠�
+    private String[] uids;//	String[]	鐢ㄦ埛id	鍚�	涓嶉檺
+    private String[] clients	;//String[]	缁勪欢鏍囪瘑	鍚�	涓嶉檺
+    private List<EventBaseInfoRequest> events;//	P	Events[]	浜嬩欢淇℃伅	鏄�	涓嶉檺
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseRequest.java
new file mode 100644
index 0000000..014e535
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseRequest.java
@@ -0,0 +1,14 @@
+package com.doumee.core.haikang.model.param.request.event.base;
+
+import com.doumee.core.haikang.model.param.request.event.visit.EventVisitParamRequest;
+import lombok.Data;
+
+@Data
+public class EventBaseRequest {
+
+//    private String  parkIndexCodes	;//	string	False	鍋滆溅搴撳敮涓�鏍囪瘑闆嗗悎  澶氫釜鍊间娇鐢ㄨ嫳鏂囬�楀彿鍒嗛殧锛屼笉瓒呰繃1000涓�
+
+    private String   method	;//	String	鏂规硶鍚嶏紝鐢ㄤ簬鏍囪瘑鎶ユ枃鐢ㄩ��	鏄�	16	浜嬩欢鍥哄畾OnEventNotify
+    private EventBaseParamRequest params	;//	Params	浜嬩欢鍙傛暟淇℃伅	鏄�	涓嶉檺	鍏蜂綋鍙傛暟淇℃伅
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java
index 8db98a6..cf5e81f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java
@@ -6,7 +6,6 @@
 
 @Data
 public class EventVisitDataRequest {
-
         private String   visitorId	;//String	璁垮id	鏄�	64	瀵瑰簲璁垮鏉ヨ璁板綍涓殑orderId瀛楁
         private String   personName;//	String	濮撳悕	鏄�	32
         private Integer  sex;//	Number	鎬у埆	鏄�		1-鐢�2-濂�
@@ -27,5 +26,4 @@
         private String   svrIndexCode;//	String	鍥剧墖瀛樺偍鏈嶅姟鍣ㄥ敮涓�鏍囪瘑	鍚�
         private String   beVisitedPersonId;//	String	琚闂汉Id	鏄�
         private String   beVisitedPersonOrgId;//	String	琚闂汉鎵�灞炵粍缁嘔d	鏄�
-
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java
index 4093801..67b7e46 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java
@@ -5,8 +5,7 @@
 @Data
 public class EventVisitRequest {
 
-//    private String  parkIndexCodes	;//	string	False	鍋滆溅搴撳敮涓�鏍囪瘑闆嗗悎  澶氫釜鍊间娇鐢ㄨ嫳鏂囬�楀彿鍒嗛殧锛屼笉瓒呰繃1000涓�
-
+//    private String  parkIndexCodes;//	string	False	鍋滆溅搴撳敮涓�鏍囪瘑闆嗗悎  澶氫釜鍊间娇鐢ㄨ嫳鏂囬�楀彿鍒嗛殧锛屼笉瓒呰繃1000涓�
     private String   method	;//	String	鏂规硶鍚嶏紝鐢ㄤ簬鏍囪瘑鎶ユ枃鐢ㄩ��	鏄�	16	浜嬩欢鍥哄畾OnEventNotify
     private EventVisitParamRequest params	;//	Params	浜嬩欢鍙傛暟淇℃伅	鏄�	涓嶉檺	鍏蜂綋鍙傛暟淇℃伅
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
index d8eaa4f..8d4ccdc 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
@@ -5,7 +5,7 @@
 import com.google.ortools.Loader;
 import com.google.ortools.constraintsolver.*;
 import lombok.extern.slf4j.Slf4j;
-import com.google.protobuf.Internal.IntListAdapter.IntConverter;
+import com.google.ortools.constraintsolver.mainJNI;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AbnormalOpenGridDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AbnormalOpenGridDTO.java
new file mode 100644
index 0000000..1c77070
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AbnormalOpenGridDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/10/11 16:01
+ */
+@Data
+public class AbnormalOpenGridDTO {
+
+    @ApiModelProperty(value = "閽ュ寵鏌滀富閿�")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "鏉垮彿")
+    private String boardCode;
+
+    @ApiModelProperty(value = "閫氶亾鍙�")
+    private String channelCode;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java
index 6be2ee6..bca03f5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java
@@ -18,5 +18,8 @@
     @ApiModelProperty(value = "閰掔簿搴︽暟")
     private String alcoholNum;
 
+    @ApiModelProperty(value = "閽ュ寵鏌滀富閿�")
+    private Integer cabinetId;
+
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
index 362dbdb..54b81ac 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
@@ -25,4 +25,6 @@
     @ApiModelProperty(value = "鐢ㄦ埛涓婚敭")
     private Integer memberId;
 
+    @ApiModelProperty(value = "寮�鍚柟寮忥細0=绯荤粺寮�鍚紱1=鎵嬪姩寮�鍚�")
+    private Integer openType;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
index 64db8b0..377601c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
@@ -21,4 +21,6 @@
     @ApiModelProperty(value = "鏌滄牸涓婚敭鍒楄〃")
     private List<Integer> gridIdList;
 
+    @ApiModelProperty(value = "寮�鍚柟寮忥細0=绯荤粺寮�鍚紱1=鎵嬪姩寮�鍚�")
+    private Integer openType;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/QueryUserByCodeDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/QueryUserByCodeDTO.java
new file mode 100644
index 0000000..6f09e1b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/QueryUserByCodeDTO.java
@@ -0,0 +1,22 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/10/11 16:01
+ */
+@Data
+public class QueryUserByCodeDTO {
+
+    @ApiModelProperty(value = "IC鍗″彿")
+    private String code;
+
+    @ApiModelProperty(value = "鍏宠仈浜哄憳绫诲瀷锛�0=鍙告満锛�1=鏍¢獙浜哄憳", example = "1")
+    private Integer userType;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
index 101647a..475a4e7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
@@ -44,7 +44,7 @@
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
     private Integer isdeleted;
 
-    @ApiModelProperty(value = "澶囨敞")
+    @ApiModelProperty(value = "澶囨敞 璁板綍寮�闂ㄦ柟寮�")
     private String info;
 
     @ApiModelProperty(value = "閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)", example = "1")
@@ -90,6 +90,8 @@
     @ApiModelProperty(value = "鎿嶄綔鍚庨挜鍖欑姸鎬侊細0鏈彉鍖�;1宸插綊杩�;2宸插�熷嚭;", example = "1")
     private Integer keyStatus;
 
+    @ApiModelProperty(value = "鏄惁鍙戦�侀�氱煡锛�0=鍚︼紱1=鏄紱", example = "1")
+    private Integer isNotice;
 
     @ApiModelProperty(value = "褰掕繕鏃堕棿")
     @TableField(exist = false)
@@ -101,7 +103,7 @@
     private String companyName;
 
     @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
-    @ExcelColumn(name="鎿嶄綔浜�",index = 1,width = 2)
+    @ExcelColumn(name="鎿嶄綔浜�",index = 1,width = 12)
     @TableField(exist = false)
     private String memberName;
 
@@ -125,4 +127,8 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date endDate;
 
+    @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
+    @TableField(exist = false)
+    private String location;
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
index d9f55d4..3773e1c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
@@ -79,7 +79,7 @@
     private String sortno;
 
     @ApiModelProperty(value = "缁忕含搴�", example = "1")
-    @ExcelColumn(name="缁忕含搴�",index = 3,width = 10)
+    @ExcelColumn(name="缁忕含搴�",index = 4,width = 10)
     @TableField(exist = false)
     private String locationInfo;
     @ApiModelProperty(value = "閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
index edf02f8..02dcd88 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
@@ -78,6 +78,11 @@
     private Integer status;
 
 
+    @ApiModelProperty(value = "鏍囩鏄庣爜 鍔犲瘑鍚庣敓鎴� rfid_lable", example = "1")
+    @ExcelColumn(name="鏍囩鏄庣爜 鍔犲瘑鍚庣敓鎴� rfid_lable")
+    private String rfidCode;
+
+
     @ApiModelProperty(value = "瀛樻斁浣嶇疆", example = "1")
     @TableField(exist = false)
     private String gridCode;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
index 2c33dd2..7798d8d 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
@@ -35,7 +35,6 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
@@ -44,7 +43,6 @@
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
     @ExcelColumn(name="鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java
index 62c7d9b..84ed096 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java
@@ -72,6 +72,9 @@
     @ExcelColumn(name="鎵�鍦ㄤ綅缃�",width=10,index = 5)
     private String region;
 
+    @ApiModelProperty(value = "浣嶇疆涓婚敭")
+    private String regionId;
+
     @ApiModelProperty(value = "鍞竴鏍囪瘑")
     //@ExcelColumn(name="鍞竴鏍囪瘑")
     private String eventId;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
index 8faea00..3a8d5a2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
@@ -82,7 +82,7 @@
     @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
     //@ExcelColumn(name="鎺ㄩ�佹爣璇�")
     private String pushId;
-    @ApiModelProperty(value = "鎺ㄩ�佹爣璇�")
+    @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
     @ExcelColumn(name="鎵�鍦ㄤ綅缃�",width=10,index = 5)
     private String region;
 
@@ -94,6 +94,15 @@
     //@ExcelColumn(name="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡")
     private Integer pushType;
 
+    @ApiModelProperty(value = "浜哄憳缂栫爜锛屽涓互,鍒嗗壊", example = "1")
+    //@ExcelColumn(name="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡")
+    private String memberIds;
+
+    @ApiModelProperty(value = "浜哄憳鍚嶇О锛屽涓互,鍒嗗壊", example = "1")
+    //@ExcelColumn(name="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡")
+    private String memberNames;
+
+
     @ApiModelProperty(value = "浜嬩欢鍒嗙被 0=瀹夐槻浜嬩欢锛�1=娑堥槻浜嬩欢锛�2=杞﹁浇浜嬩欢锛�3=閽ュ寵鏌滀簨浠讹紱 4=澶╂皵棰勮锛�", example = "1")
     @ExcelColumn(name="浜嬩欢鍒嗙被",valueMapping = "0=瀹夐槻浜嬩欢;1=娑堥槻浜嬩欢;2=杞﹁浇浜嬩欢;3=閽ュ寵鏌滀簨浠�;4=澶╂皵棰勮;",width=10,index = 3)
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
index 07409cf..9651da0 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
@@ -76,4 +77,11 @@
     @ExcelColumn(name="鍖哄煙涓婚敭")
     private String regionId;
 
+
+
+    @ApiModelProperty(value = "鍛婅绫诲瀷缂栫爜")
+    @TableField(exist = false)
+    private String code;
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java
index 4f7cd26..35e17eb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java
@@ -2,6 +2,7 @@
 
 import com.doumee.dao.business.dto.TelecomCabinetLogDTO;
 import com.doumee.dao.business.vo.TelecomJkCabinetLogVO;
+import com.doumee.service.business.impl.JkCabinetGridServiceImpl;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.JkCabinetLog;
@@ -103,4 +104,8 @@
      * @return
      */
     List<TelecomJkCabinetLogVO> getLogListForTelecom(TelecomCabinetLogDTO model);
+
+
+    void timeOutUnBackAlarm(JkCabinetGridServiceImpl impl);
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
index 4e8aa50..8077c0c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
@@ -1,5 +1,6 @@
 package com.doumee.service.business;
 
+import com.doumee.dao.business.dto.QueryUserByCodeDTO;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.JkIccard;
@@ -97,5 +98,5 @@
 
     void updateStatusById(JkIccard jkIccard);
 
-    Integer getMemberIdByCode(String code);
+    Integer getMemberIdByCode(QueryUserByCodeDTO dto);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java
index 7426367..cc19130 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java
@@ -24,7 +24,7 @@
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
index 72875bd..a14b88a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
@@ -1,6 +1,7 @@
 package com.doumee.service.business.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.dingTalk.DingTalk;
 import com.doumee.core.dingTalk.DingTalkStream;
@@ -25,6 +26,7 @@
 import com.doumee.service.business.third.model.PageWrap;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,13 +61,24 @@
     private JkCabinetLogMapper jkCabinetLogMapper;
 
     @Autowired
-    private WarningMapper warningMapper;
+    private WarningEventMapper warningEventMapper;
 
     @Autowired
     private MemberMapper memberMapper;
 
     @Autowired
+    private WarningMapper warningMapper;
+    @Autowired
     private WarningRuleMapper warningRuleMapper;
+
+    @Autowired
+    private WarningRuleDetailMapper warningRuleDetailMapper;
+
+    @Autowired
+    private WarningPushMapper warningPushMapper;
+    
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
     @Autowired
     private DingTalk dingTalk;
@@ -179,7 +192,7 @@
         MPJLambdaWrapper<JkCabinetGrid> wrapper = new MPJLambdaWrapper<JkCabinetGrid>()
                 .selectAll(JkCabinetGrid.class)
                 .selectAs(JkCabinet::getName,JkCabinetGrid::getCabinetName)
-                .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                 .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetGrid::getCabinetId)
                 .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                 .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
@@ -310,7 +323,7 @@
         }
         List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
                 new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
-                        .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                        .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                         .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                         .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
                 .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
@@ -392,6 +405,8 @@
                     jkCabinetLog.setAuthType(Constants.TWO);
                     jkCabinetLog.setMemberId(loginUserInfo.getMemberId());
                     jkCabinetLog.setStatus(Constants.ZERO);
+                    jkCabinetLog.setIsNotice(Constants.ZERO);
+                    jkCabinetLog.setInfo(Objects.isNull(dto.getOpenType())||Constants.equalsInteger(dto.getOpenType(),Constants.ZERO)?"绯荤粺寮�鍚�":"鎵嬪姩寮�鍚�");
                     if(Objects.nonNull(jkCabinetGrid.getKeyId())){
                         jkCabinetLog.setKeyId(jkCabinetGrid.getKeyId());
                         JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
@@ -406,6 +421,7 @@
                     jkCabinetLog.setType(Constants.ZERO);
                     jkCabinetLogs.add(jkCabinetLog);
                 }
+
                 jkCabinetLogMapper.insert(jkCabinetLogs);
             }
         }
@@ -464,18 +480,50 @@
                     }
                 }
             }
+            jkCabinetLog.setIsNotice(Constants.ZERO);
             jkCabinetLog.setType(Constants.ONE);
             jkCabinetLogMapper.insert(jkCabinetLog);
             //鏌ヨ閽ュ寵鐨勫紑闂ㄨ褰� 杩涜娣诲姞鍏抽棬璁板綍涓婚敭
-            jkCabinetLogMapper.update(null,new UpdateWrapper<JkCabinetLog>().lambda()
-                    .set(JkCabinetLog::getCloseLogId,jkCabinetLog.getId())
-                    .eq(JkCabinetLog::getKeyId,jkCabinetLog.getKeyId())
-                    .eq(JkCabinetLog::getType,Constants.ZERO)
-                    .isNull(JkCabinetLog::getCloseLogId));
+            if(Constants.equalsInteger(dto.getKeyStatus(),Constants.ONE)){
+                jkCabinetLogMapper.update(null,new UpdateWrapper<JkCabinetLog>().lambda()
+                        .set(JkCabinetLog::getCloseLogId,jkCabinetLog.getId())
+                        .eq(JkCabinetLog::getKeyId,jkCabinetLog.getKeyId())
+                        .eq(JkCabinetLog::getType,Constants.ONE)
+                        .eq(JkCabinetLog::getKeyStatus,Constants.TWO)
+                        .isNull(JkCabinetLog::getCloseLogId));
+            }
+
         }
     }
 
 
+
+//    public void saveAbnormalOpenGridLog(AbnormalOpenGridDTO dto){
+//        if(Objects.isNull(dto)
+//                || StringUtils.isBlank(dto.getBoardCode())
+//                || StringUtils.isBlank(dto.getBoardCode())
+//                || Objects.isNull(dto.getCabinetId())
+//                || Objects.isNull(dto.getKeyStatus())
+//                || Objects.isNull(dto.getAuthType())
+//        ){
+//            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+//        }
+//        JkCabinetGrid jkCabinetGrid = jkCabinetGridMapper.selectOne(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+//                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+//                .eq(JkCabinetGrid::getId,dto.getGridId())
+//                .last(" limit 1 ")
+//        );
+//        JkCabinetLog jkCabinetLog = new JkCabinetLog();
+//        jkCabinetLog.setCreateDate(new Date());
+//        jkCabinetLog.setIsdeleted(Constants.ZERO);
+//        jkCabinetLog.setCabinetId(dto.getCabinetId());
+//        jkCabinetLog.setGridId(jkCabinetGrid.getId());
+//        jkCabinetLog.setAuthType(dto.getAuthType());
+//        jkCabinetLog.setMemberId(dto.getMemberId());
+//        jkCabinetLog.setKeyStatus(Constants.ZERO);
+//        jkCabinetLog.setStatus(Constants.ZERO);
+//
+//    }
 
 
     /**
@@ -512,7 +560,7 @@
             }
             jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
                     new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
-                            .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                            .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                             .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                             .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
                             .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
@@ -551,10 +599,8 @@
         if(Objects.isNull(jkCabinetGrid)){
             return ;
         }
-//        LoginUserInfo loginUserInfo = openGridDriverDTO.getLoginUserInfo();
         JkCabinetLog jkCabinetLog = new JkCabinetLog();
         jkCabinetLog.setCreateDate(new Date());
-//        jkCabinetLog.setCreator(loginUserInfo.getId());
         jkCabinetLog.setIsdeleted(Constants.ZERO);
         jkCabinetLog.setCabinetId(openGridDriverDTO.getCabinetId());
         jkCabinetLog.setGridId(jkCabinetGrid.getId());
@@ -562,6 +608,7 @@
         jkCabinetLog.setMemberId(openGridDriverDTO.getMemberId());
         jkCabinetLog.setType(Constants.ZERO);
         jkCabinetLog.setStatus(Constants.ZERO);
+        jkCabinetLog.setInfo(Objects.isNull(openGridDriverDTO.getOpenType())||Constants.equalsInteger(openGridDriverDTO.getOpenType(),Constants.ZERO)?"绯荤粺寮�鍚�":"鎵嬪姩寮�鍚�");
         if(Objects.nonNull(jkCabinetGrid.getKeyId())){
             jkCabinetLog.setKeyId(jkCabinetGrid.getKeyId());
             JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
@@ -573,6 +620,7 @@
                 jkCabinetLog.setRoleType(jkKeys.getRoleType());
             }
         }
+        jkCabinetLog.setIsNotice(Constants.ZERO);
         jkCabinetLogMapper.insert(jkCabinetLog);
     }
 
@@ -590,59 +638,195 @@
                             .eq(JkCabinetGrid::getId,dto.getGridId())
                             .last(" limit 1 ")
             );
-
             if(Objects.nonNull(jkCabinetGrid)){
                 log.error("鏌滄牸寮�闂ㄨ秴鏃舵湭鍏抽棴鍛婅淇℃伅锛歿}"+JSONObject.toJSONString(jkCabinetGrid));
+                //瑙勫垯绫诲瀷
+                Constants.WarningConfig warningConfig = Constants.WarningConfig.GRID_TIME_OUT_INFO;
                 Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
-                        .eq(Warning::getType,Constants.THREE).eq(Warning::getCode,Constants.WarningConfig.GRID_TIME_OUT_INFO.getKey()).eq(Warning::getIsdeleted,Constants.ZERO).last("limt 1"));
+                        .eq(Warning::getIsdeleted,Constants.ZERO)
+                        .eq(Warning::getStatus,Constants.ONE)
+                        .eq(Warning::getCode,warningConfig.getKey())
+                        .last("limit 1")
+                );
                 if(Objects.isNull(warning)){
                     return;
                 }
-                List<Member> memberList = this.getWarningList(warning);
-                if(CollectionUtils.isEmpty(memberList)){
+                List<Integer> ruleIdList =  this.processWarnFront(warningConfig);
+                if(CollectionUtils.isEmpty(ruleIdList)){
                     return;
                 }
-                //todo 瀛樺偍寮傚父鏃ュ織
+                for (Integer ruleId:ruleIdList) {
+                    WarningRule warningRule = warningRuleMapper.selectById(ruleId);
+                    if(Objects.isNull(warningRule)){
+                        continue;
+                    }
+                    List<Member> memberList = this.getWarningRuleMemberList(warningRule);
+                    if(CollectionUtils.isEmpty(memberList)){
+                        return;
+                    }
 
+                    String content = "銆愰挜鍖欐煖-"+jkCabinetGrid.getCabinetName()+"銆戜笅銆愭煖鏍�-"+jkCabinetGrid.getCode()+"銆戣秴鏃舵湭鍏抽棴";
 
-            }else{
+                    JkCabinet jkCabinet = jkCabinetMapper.selectById(dto.getCabinetId());
+                    //瀛樺偍鎶ヨ寮傚父璁板綍
+                    WarningEvent warningEvent = new WarningEvent();
+                    warningEvent.setCreateDate(new Date());
+                    warningEvent.setWarningId(warning.getId());
+                    warningEvent.setTitle(warningConfig.getInfo());
+                    warningEvent.setContent(content );
+                    warningEvent.setStatus(Constants.ZERO);
+                    warningEvent.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"鏈煡浣嶇疆");
+                    warningEventMapper.insert(warningEvent);
 
-            }
-        }
-    }
+                    try {
+                        // 瀛樺偍寮傚父閫氱煡鏃ュ織
+                        WarningPush warningPush = new WarningPush();
+                        warningPush.setCreateDate(new Date());
+                        warningPush.setIsdeleted(Constants.ZERO);
+                        warningPush.setWarningId(warning.getId());
+                        warningPush.setTitle(warningConfig.getInfo());
+                        warningPush.setContent(content);
+                        warningPush.setStatus(Constants.ZERO);
+                        warningPush.setPushType(Constants.ZERO);
+                        warningPush.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"鏈煡浣嶇疆");
+                        warningPush.setMemberIds(
+                                StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
+                        );
+                        warningPush.setMemberIds(
+                                StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
+                        );
+                        warningPush.setMemberNames(StringUtils.join(memberList.stream().map(i->i.getName()).collect(Collectors.toList()),",")
+                        );
+                        //todo 鏆傛椂鍏抽棴 閽夐拤閫氱煡
 
+                        //            Boolean noticeFlag = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                        //                    StringUtils.join(memberList.stream().filter(i->StringUtils.isNotBlank(i.getDdId())).map(i->i.getDdId()).collect(Collectors.toList()),","),
+                        //                dingTalk.getAlarmNoticeMsg(warningPush.getRegion(),DateUtil.getCurrDateTime(),content));
+                        //            warningPush.setStatus(noticeFlag?Constants.ONE:Constants.TWO);
+                        warningPushMapper.insert(warningPush);
+                        warningEvent.setStatus(Constants.ONE);
+                        warningEventMapper.updateById(warningEvent);
+                    }catch (Exception e){
+                        warningEvent.setStatus(Constants.TWO);
+                        warningEventMapper.updateById(warningEvent);
+                    }
 
-    public List<Member> getWarningList(Warning warning){
-        if(Constants.equalsInteger(warning.getStatus(),Constants.ZERO)){
-            return null;
-        }
-        //鏌ヨ閫氱煡浜哄憳
-        List<WarningRule> warningRuleList = warningRuleMapper.selectList(new QueryWrapper<WarningRule>().lambda()
-                .eq(WarningRule::getIsdeleted,Constants.ZERO)
-                .apply(" id in ( select w.RULE_ID from warning_rule_detail w where w.WARNING_ID = '"+warning.getId()+"' and w.ISDELETED = 0  ) ")
-        );
-        List<Member> memberList = new ArrayList<>();
-        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(warningRuleList)){
-            List<String> memberIdStr =  warningRuleList.stream().map(i->i.getMemberIds()).collect(Collectors.toList());
-            if(org.apache.commons.collections.CollectionUtils.isNotEmpty(memberIdStr)){
-                List<String> memberIdList = new ArrayList<>();
-                for (String s:memberIdStr) {
-                    memberIdList.addAll(
-                            Arrays.asList(s.split(","))
-                    );
                 }
-                memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO)
-                        .notIn(Member::getErpId)
-                        .in(Member::getId,memberIdList)
-                );
+
             }
         }
-        return memberList;
+    }
 
+
+    public List<Integer> processWarnFront(Constants.WarningConfig warningConfig){
+        List<WarningRuleDetail> warningRuleDetailList = warningRuleDetailMapper.selectJoinList(WarningRuleDetail.class,new MPJLambdaWrapper<WarningRuleDetail>()
+                .selectAll(WarningRuleDetail.class)
+                .leftJoin(Warning.class,Warning::getId,WarningRuleDetail::getWarningId)
+                .eq(WarningRuleDetail::getIsdeleted,Constants.ZERO)
+                .eq(Warning::getIsdeleted,Constants.ZERO)
+                .eq(Warning::getStatus,Constants.ONE)
+                .eq(Warning::getCode,warningConfig.getKey())
+        );
+        if(CollectionUtils.isEmpty(warningRuleDetailList)){ 
+            return new ArrayList<>();
+        }
+        //鎵�鏈夋姤璀﹁鍒欓厤缃俊鎭�
+        List<Integer> ruleIdList = warningRuleDetailList.stream().map(i->i.getRuleId()).collect(Collectors.toList());;
+        Set<Integer> ruleIdSet = new HashSet<>(ruleIdList);
+        if(CollectionUtils.isNotEmpty(ruleIdSet)){
+            List<Integer> resultList = new ArrayList<>();
+            for (Integer ruleId:ruleIdSet) {
+                WarningRule warningRule = warningRuleMapper.selectById(ruleId);
+                //鏌ヨ鍏朵粬瑙勫垯淇℃伅
+                List<WarningRuleDetail> warningRuleDetails = warningRuleDetailMapper.selectJoinList(WarningRuleDetail.class,new MPJLambdaWrapper<WarningRuleDetail>()
+                        .selectAll(WarningRuleDetail.class)
+                        .selectAs(Warning::getCode,WarningRuleDetail::getCode)
+                        .leftJoin(Warning.class,Warning::getId,WarningRuleDetail::getWarningId)
+                        .eq(WarningRuleDetail::getIsdeleted,Constants.ZERO)
+                        .eq(Warning::getIsdeleted,Constants.ZERO)
+                        .eq(Warning::getStatus,Constants.ONE)
+                        .eq(WarningRuleDetail::getRuleId,ruleId)
+                        .in(Warning::getCode,Constants.WarningConfig.ALARM_TEST.getKey(),
+                                Constants.WarningConfig.GRID_TIME_OUT_INFO.getKey(),
+                                Constants.WarningConfig.KEY_TIME_OUT_BACK.getKey()
+                        )
+                );
+                //鏃犱换浣曡鍒� 鐩存帴璺宠繃
+                if(CollectionUtils.isEmpty(warningRuleDetails)){
+                    return resultList;
+                }else if(!Constants.equalsInteger(warningRuleDetails.stream().filter(i->!i.getCode().equals(warningConfig.getKey())).collect(Collectors.toList()).size(),Constants.ZERO)){
+                    List<WarningRuleDetail> wList = warningRuleDetails.stream().filter(i->!i.getCode().equals(warningConfig.getKey())).collect(Collectors.toList());
+                    //鑾峰彇鎵�鏈夊叾浠栨墍鏈変簨浠朵富閿俊鎭�
+                    List<Integer> warningIdList = wList.stream().map(i->i.getWarningId()).collect(Collectors.toList());
+                    Set<Integer> setWarningIdList = new HashSet<>(warningIdList);
+                    //鑾峰彇鏃堕棿鍐呮墍鏈変簨浠朵俊鎭�
+                    List<WarningEvent> warningEventList = warningEventMapper.selectList(new QueryWrapper<WarningEvent>().lambda()
+                            .eq(WarningEvent::getIsdeleted,Constants.ZERO)
+                            .in(WarningEvent::getWarningId,setWarningIdList)
+                            .apply(" DATE_ADD(CREATE_DATE , INTERVAL "+warningRule.getIntervalSec()+" SECOND) > now() ")
+                    );
+                    if(this.processWarnFlag(wList,warningEventList)){
+                        resultList.add(ruleId);
+                    };
+                }else{
+                    List<WarningRuleDetail> wList = warningRuleDetails.stream().filter(i->i.getCode().equals(warningConfig.getKey())).collect(Collectors.toList());
+                    //鑾峰彇鏈浜嬩欢涓婚敭淇℃伅
+                    List<Integer> warningIdList = wList.stream().map(i->i.getWarningId()).collect(Collectors.toList());
+                    Set<Integer> setWarningIdList = new HashSet<>(warningIdList);
+                    //鑾峰彇鏃堕棿鍐呮墍鏈変簨浠朵俊鎭�
+                    List<WarningEvent> warningEventList = warningEventMapper.selectList(new QueryWrapper<WarningEvent>().lambda()
+                            .eq(WarningEvent::getIsdeleted,Constants.ZERO)
+                            .in(WarningEvent::getWarningId,setWarningIdList)
+                            .apply(" DATE_ADD(CREATE_DATE , INTERVAL "+warningRule.getIntervalSec()+" SECOND) > now() ")
+                    );
+                    if(this.processWarnFlag(wList,warningEventList)){
+                        resultList.add(ruleId);
+                    }
+                } 
+            }
+            return resultList;
+        }
+        return new ArrayList<>();
 
 
     }
 
+
+
+    /**
+     * 鍒ゆ柇澶勭悊鏄惁鍙互鍙戦�侀�氱煡 褰撳墠鍛婅閰嶇疆鐨勬暟鎹垪琛ㄦ槸鍚︽弧瓒� 
+     * @param warningRuleDetails
+     * @return
+     */
+    public boolean processWarnFlag(List<WarningRuleDetail> warningRuleDetails,List<WarningEvent> warningEventList){
+        if(CollectionUtils.isEmpty(warningEventList)){
+            return false;
+        }
+        for (WarningRuleDetail warningRuleDetail:warningRuleDetails) {
+            if(Objects.nonNull(warningRuleDetail.getRegionId())){
+                if(warningEventList.stream().filter(i->Constants.equalsInteger(i.getWarningId(),warningRuleDetail.getWarningId())
+                        && StringUtils.isNotBlank(i.getRegionId()) && i.getRegionId().equals(warningRuleDetail.getRegionId())
+                ).collect(Collectors.toList()).size()<=Constants.ZERO){
+                    return false;
+                }
+            }else{
+                if(warningEventList.stream().filter(i->Constants.equalsInteger(i.getWarningId(),warningRuleDetail.getWarningId())
+                ).collect(Collectors.toList()).size()<=Constants.ZERO){
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+
+    public List<Member> getWarningRuleMemberList(WarningRule warningRule){
+        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO)
+                .isNotNull(Member::getErpId)
+                .in(Member::getId,Arrays.asList(warningRule.getMemberIds().split(",")))
+        );
+        return memberList;
+    }
 
 
     @Override
@@ -656,23 +840,97 @@
                             .last(" limit 1 ")
                     );
 
+            JkCabinet jkCabinet = jkCabinetMapper.selectById(dto.getCabinetId());
+            Constants.WarningConfig warningConfig = Constants.WarningConfig.ALARM_TEST;
             Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
-                    .eq(Warning::getType,Constants.THREE).eq(Warning::getCode,Constants.WarningConfig.KEY_TIME_OUT_BACK.getKey()).eq(Warning::getIsdeleted,Constants.ZERO).last("limt 1"));
+                    .eq(Warning::getIsdeleted,Constants.ZERO)
+                    .eq(Warning::getStatus,Constants.ONE)
+                    .eq(Warning::getCode,warningConfig.getKey())
+                    .last("limit 1")
+            );
             if(Objects.isNull(warning)){
                 return;
             }
-            List<Member> memberList = this.getWarningList(warning);
-            if(CollectionUtils.isEmpty(memberList)){
+            List<Integer> ruleIdList =  this.processWarnFront(warningConfig);
+            if(CollectionUtils.isEmpty(ruleIdList)){
                 return;
             }
-            //todo 瀛樺偍寮傚父鏃ュ織
+            if(CollectionUtils.isEmpty(ruleIdList)){
+                return;
+            }
+            for (Integer ruleId:ruleIdList) {
+                WarningRule warningRule = warningRuleMapper.selectById(ruleId);
+                if (Objects.isNull(warningRule)) {
+                    continue;
+                }
+                List<Member> memberList = this.getWarningRuleMemberList(warningRule);
 
-            //瀛樺偍寮傚父鏃ュ織
-            if(Objects.nonNull(systemUser)){
-                log.error("鍙告満閰掔簿妫�娴嬶紝瓒呭嚭閰掔簿鍊煎憡璀︿俊鎭細{}"+JSONObject.toJSONString(systemUser));
+                String content = "";
+                if(Objects.nonNull(systemUser.getRealname())){
+                    content = content + systemUser.getRealname();
+                }
+                if(Objects.nonNull(jkCabinet)){
+                    content = content + "浜�"+jkCabinet.getName()+"閽ュ寵鏌�";
+                }
+                content = content + "閰掔簿妫�娴嬪紓甯�";
+                if(Objects.nonNull(dto.getAlcoholNum())){
+                    content = content + "锛岄厭绮惧害鏁般��"+dto.getAlcoholNum()+"掳銆�";
+                }
+
+                //瀛樺偍鎶ヨ寮傚父璁板綍
+                WarningEvent warningEvent = new WarningEvent();
+                warningEvent.setCreateDate(new Date());
+                warningEvent.setWarningId(warning.getId());
+                warningEvent.setTitle(warningConfig.getInfo());
+                warningEvent.setContent(content );
+                warningEvent.setStatus(Constants.ZERO);
+                warningEvent.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"鏈煡浣嶇疆");
+                warningEventMapper.insert(warningEvent);
+
+                try{
+                    WarningPush warningPush = new WarningPush();
+                    warningPush.setCreateDate(new Date());
+                    warningPush.setIsdeleted(Constants.ZERO);
+                    warningPush.setWarningId(warning.getId());
+                    warningPush.setTitle(warningConfig.getInfo()); 
+                    warningPush.setContent(content);
+                    warningPush.setStatus(Constants.ZERO);
+                    warningPush.setPushType(Constants.ZERO);
+                    warningPush.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"鏈煡浣嶇疆");
+                    warningPush.setMemberId(dto.getMemberId());
+                    warningPush.setMemberIds(
+                            StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
+                    );
+                    warningPush.setMemberIds(
+                            StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
+                    );
+                    warningPush.setMemberNames(StringUtils.join(memberList.stream().map(i->i.getName()).collect(Collectors.toList()),",")
+                    );
+                    //todo 鏆傛椂鍏抽棴 閽夐拤閫氱煡
+        //            Boolean noticeFlag = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+        //                    StringUtils.join(memberList.stream().filter(i->StringUtils.isNotBlank(i.getDdId())).map(i->i.getDdId()).collect(Collectors.toList()),","),
+        //                dingTalk.getAlarmNoticeMsg(warningPush.getRegion(),DateUtil.getCurrDateTime(),warningConfig.getInfo()));
+        //            warningPush.setStatus(noticeFlag?Constants.ONE:Constants.TWO);
+                    warningPushMapper.insert(warningPush);
+                    warningEvent.setStatus(Constants.ONE);
+                    warningEventMapper.updateById(warningEvent);
+                }catch (Exception e){
+                    warningEvent.setStatus(Constants.TWO);
+                    warningEventMapper.updateById(warningEvent);
+                }
+
+
+                //瀛樺偍寮傚父鏃ュ織
+                if(Objects.nonNull(systemUser)){
+                    log.error("鍙告満閰掔簿妫�娴嬶紝瓒呭嚭閰掔簿鍊煎憡璀︿俊鎭細{}"+JSONObject.toJSONString(systemUser));
+                }
+
             }
         }
     }
 
 
+
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
index 3147486..56eae5b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
@@ -1,14 +1,15 @@
 package com.doumee.service.business.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.dto.TelecomCabinetLogDTO;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.business.vo.TelecomJkCabinetLogVO;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.JkCabinetLogMapper;
 import com.doumee.service.business.JkCabinetLogService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -21,8 +22,10 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 閽ュ寵鏌滃紑鍏抽棬璁板綍Service瀹炵幇
@@ -35,6 +38,18 @@
     @Autowired
     private JkCabinetLogMapper jkCabinetLogMapper;
 
+    @Autowired
+    private WarningMapper warningMapper;
+    @Autowired
+    private WarningRuleMapper warningRuleMapper;
+
+    @Autowired
+    private WarningPushMapper warningPushMapper;
+
+    @Autowired
+    private WarningEventMapper warningEventMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
     @Override
     public Integer create(JkCabinetLog jkCabinetLog) {
         jkCabinetLogMapper.insert(jkCabinetLog);
@@ -154,6 +169,7 @@
                 .ge(Objects.nonNull(model.getStartDate()),JkCabinetLog::getCreateDate, Utils.Date.getStart(model.getStartDate()))
                 .le(Objects.nonNull(model.getEndDate()),JkCabinetLog::getCreateDate, Utils.Date.getEnd(model.getEndDate()))
                 .eq(JkCabinetLog::getIsdeleted, Constants.ZERO)
+                .eq(JkCabinetLog::getType,Constants.ONE)
                 .eq(JkCabinetLog::getKeyStatus,Constants.TWO)
                 .orderByDesc(JkCabinetLog::getCreateDate);
         List<JkCabinetLog> jkCabinetLogs = jkCabinetLogMapper.selectJoinList(JkCabinetLog.class,wrapper);
@@ -171,5 +187,108 @@
 
 
 
+    @Override
+    public void timeOutUnBackAlarm(JkCabinetGridServiceImpl impl){
+        Constants.WarningConfig warningConfig = Constants.WarningConfig.KEY_TIME_OUT_BACK;
+        Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
+                .eq(Warning::getIsdeleted,Constants.ZERO)
+                .eq(Warning::getStatus,Constants.ONE)
+                .eq(Warning::getCode,warningConfig.getKey())
+                .last("limit 1")
+        );
+        if(Objects.isNull(warning)){
+            return;
+        }
+        MPJLambdaWrapper<JkCabinetLog> wrapper = new MPJLambdaWrapper<JkCabinetLog>()
+                .selectAll(JkCabinetLog.class)
+                .selectAs(Member::getName,JkCabinetLog::getMemberName)
+                .selectAs(JkKeys::getCode,JkCabinetLog::getCarCode)
+                .selectAs(JkCabinet::getLocation,JkCabinetLog::getLocation)
+                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetLog::getCabinetId)
+                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetLog::getKeyId)
+                .leftJoin(Member.class,Member::getId,JkCabinetLog::getMemberId)
+                .eq(JkCabinetLog::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetLog::getType,Constants.ONE)
+                .eq(JkCabinetLog::getIsNotice,Constants.ZERO)
+                .eq(JkKeys::getStatus,Constants.TWO)
+                .isNull(JkCabinetLog::getCloseLogId)
+                .apply(" now() >  DATE_ADD(t.CREATE_DATE, INTERVAL ifnull(t1.USE_TIME,0) MINUTE) ")
+                .orderByDesc(JkCabinetLog::getCreateDate);
+        List<JkCabinetLog> jkCabinetLogs = jkCabinetLogMapper.selectJoinList(JkCabinetLog.class,wrapper);
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(jkCabinetLogs)){
+            List<Integer> ruleIdList =  impl.processWarnFront(warningConfig);
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ruleIdList)){
+                return;
+            }
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ruleIdList)){
+                return;
+            }
+            for (Integer ruleId:ruleIdList) {
+                WarningRule warningRule = warningRuleMapper.selectById(ruleId);
+                if (Objects.isNull(warningRule)) {
+                    continue;
+                }
+                List<Member> memberList = impl.getWarningRuleMemberList(warningRule);
+                if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(memberList)) {
+                    return;
+                }
+                for (JkCabinetLog jkCabinetLog:jkCabinetLogs) {
+
+                    String content = "銆愯溅杈�-"+jkCabinetLog.getCarCode()+"閽ュ寵銆戠敱+"+(StringUtils.isNotBlank(jkCabinetLog.getMemberName())?jkCabinetLog.getMemberName():"鏈煡浜哄憳")+"鍊熷嚭锛岃秴鏃舵湭褰掕繕";
+
+                    //瀛樺偍鎶ヨ寮傚父璁板綍
+                    WarningEvent warningEvent = new WarningEvent();
+                    warningEvent.setCreateDate(new Date());
+                    warningEvent.setWarningId(warning.getId());
+                    warningEvent.setTitle(warningConfig.getInfo());
+                    warningEvent.setContent(content );
+                    warningEvent.setStatus(Constants.ZERO);
+                    warningEvent.setRegion( StringUtils.isNotBlank(jkCabinetLog.getLocation())?jkCabinetLog.getLocation():"鏈煡浣嶇疆");
+                    warningEventMapper.insert(warningEvent);
+
+
+                    try {
+                        WarningPush warningPush = new WarningPush();
+                        warningPush.setCreateDate(new Date());
+                        warningPush.setIsdeleted(Constants.ZERO);
+                        warningPush.setWarningId(warning.getId());
+                        warningPush.setTitle(warningConfig.getInfo());
+
+                        warningPush.setContent(content);
+                        warningPush.setStatus(Constants.ZERO);
+                        warningPush.setPushType(Constants.ZERO);
+                        warningPush.setRegion(StringUtils.isNotBlank(jkCabinetLog.getLocation()) ? jkCabinetLog.getLocation() : "鏈煡浣嶇疆");
+                        warningPush.setMemberIds(
+                                StringUtils.join(memberList.stream().map(i -> i.getId()).collect(Collectors.toList()), ",")
+                        );
+                        warningPush.setMemberIds(
+                                StringUtils.join(memberList.stream().map(i -> i.getId()).collect(Collectors.toList()), ",")
+                        );
+                        warningPush.setMemberNames(StringUtils.join(memberList.stream().map(i -> i.getName()).collect(Collectors.toList()), ",")
+                        );
+                        //todo 鏆傛椂鍏抽棴 閽夐拤閫氱煡
+
+                        //            Boolean noticeFlag = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                        //                    StringUtils.join(memberList.stream().filter(i->StringUtils.isNotBlank(i.getDdId())).map(i->i.getDdId()).collect(Collectors.toList()),","),
+                        //                dingTalk.getAlarmNoticeMsg(warningPush.getRegion(),DateUtil.getCurrDateTime(),content));
+                        //            warningPush.setStatus(noticeFlag?Constants.ONE:Constants.TWO);
+                        warningPushMapper.insert(warningPush);
+                        warningEvent.setStatus(Constants.ONE);
+                        warningEventMapper.updateById(warningEvent);
+                    }catch (Exception e){
+                        warningEvent.setStatus(Constants.TWO);
+                        warningEventMapper.updateById(warningEvent);
+                    }
+                }
+
+
+
+            }
+        }
+
+
+    }
+
+
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
index 1332ee3..7f25156 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
@@ -85,7 +85,7 @@
             || Objects.isNull(jkCabinet.getSortType())
             || (
                 Constants.equalsInteger(jkCabinet.getNoType(),Constants.ONE)
-                && ( Objects.isNull(jkCabinet.getNoIndex()) || Objects.isNull(jkCabinet.getNoLength()) || StringUtils.isBlank(jkCabinet.getNoPrefix()) )
+                && ( Objects.isNull(jkCabinet.getNoIndex()) || Objects.isNull(jkCabinet.getNoLength()) )
                 )
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -134,7 +134,7 @@
             if(Constants.equalsInteger(jkCabinet.getNoType(),Constants.ZERO)){
                 grid.setCode(StringUtils.leftPad(startNo.toString(),maxNum.toString().length()+1,"0"));
             }else{
-                grid.setCode(jkCabinet.getNoPrefix() +  StringUtils.leftPad(startNo.toString(),jkCabinet.getNoLength(),"0"));
+                grid.setCode(StringUtils.isNotBlank(jkCabinet.getNoPrefix())?jkCabinet.getNoPrefix():"" +  StringUtils.leftPad(startNo.toString(),jkCabinet.getNoLength(),"0"));
             }
 
             jkCabinetGridList.add(grid);
@@ -412,7 +412,7 @@
                 jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class, new MPJLambdaWrapper<JkCabinetGrid>()
                 .selectAll(JkCabinetGrid.class)
                 .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
-                .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                 .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
                 .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                 .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
@@ -504,7 +504,7 @@
             List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                     .eq(Member::getIsdeleted,Constants.ZERO)
                     .isNotNull(Member::getFaceImg)
-                    .apply(" FIND_IN_SET( id ,'"+jkCabinet.getManagerId()+"') ")
+                    .apply(" FIND_IN_SET( id ,'"+jkCabinet.getAuthMemberId()+"') ")
             );
             if(CollectionUtils.isNotEmpty(memberList)){
                 for (Member member:memberList) {
@@ -541,7 +541,7 @@
                             .selectAll(JkCabinetGrid.class)
                             .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                             .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
-                            .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                            .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                             .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                             .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                             .eq(JkCabinetGrid::getCabinetId,jkCabinet.getId())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
index 7900f83..aa6b0dc 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
@@ -4,6 +4,7 @@
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.dto.QueryUserByCodeDTO;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.third.model.LoginUserInfo;
@@ -181,16 +182,24 @@
 
 
     @Override
-    public Integer getMemberIdByCode(String code){
+    public Integer getMemberIdByCode(QueryUserByCodeDTO dto){
+        if(Objects.isNull(dto)
+        || Objects.isNull(dto.getUserType())
+        || StringUtils.isBlank(dto.getCode())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
         JkIccard jkIccard = jkIccardMapper.selectOne(new QueryWrapper<JkIccard>().lambda()
                 .eq(JkIccard::getIsdeleted,Constants.ZERO)
-                .eq(JkIccard::getStatus,Constants.ONE)
-                .eq(JkIccard::getCode,code)
+                .eq(JkIccard::getUserType,dto.getUserType())
+                .eq(JkIccard::getCode,dto.getCode())
                 .last(" limit 1 ")
         );
         if(Objects.isNull(jkIccard)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
+        if(!Constants.equalsInteger(jkIccard.getStatus(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝褰撳墠IC鍗″凡琚鐢紒");
+        }
         return jkIccard.getMemberId();
 
     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
index 2082dc5..20134ae 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
@@ -49,7 +49,7 @@
         || Objects.isNull(jkKeys.getCarId())
         || Objects.isNull(jkKeys.getRoleType())
         || StringUtils.isBlank(jkKeys.getCode())
-        || StringUtils.isBlank(jkKeys.getRfidLable())
+        || StringUtils.isBlank(jkKeys.getRfidCode())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
@@ -65,10 +65,15 @@
         if(Objects.nonNull(carsKeys)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠杞﹁締宸茶閽ュ寵["+carsKeys.getCode()+"]缁戝畾浣跨敤锛�");
         }
-        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getRfidLable,jkKeys.getRfidLable()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
+        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getRfidCode,jkKeys.getRfidCode()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
         if(Objects.nonNull(rfidKeys)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠RFID鏍囩宸茶閽ュ寵["+rfidKeys.getCode()+"]浣跨敤锛�");
         }
+        String lable = Constants.getRFIDNumber(jkKeys.getRfidCode());
+        if(StringUtils.isEmpty(lable)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"RFID鏍囩璁剧疆澶辫触銆愭牸寮忎笉姝g‘銆�");
+        }
+        jkKeys.setRfidLable(lable);
         LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
         jkKeys.setCreateDate(new Date());
         jkKeys.setEditDate(jkKeys.getCreateDate());
@@ -114,10 +119,15 @@
                 || Objects.isNull(jkKeys.getCarId())
                 || Objects.isNull(jkKeys.getRoleType())
                 || StringUtils.isBlank(jkKeys.getCode())
-                || StringUtils.isBlank(jkKeys.getRfidLable())
+                || StringUtils.isBlank(jkKeys.getRfidCode())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
+        String lable = Constants.getRFIDNumber(jkKeys.getRfidCode());
+        if(StringUtils.isEmpty(lable)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"RFID鏍囩璁剧疆澶辫触銆愭牸寮忎笉姝g‘銆�");
+        }
+        jkKeys.setRfidLable(lable);
         //鏌ヨ缂栧彿鏄惁閲嶅
         if(jkKeysMapper.selectCount(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getCode,jkKeys.getCode()).eq(JkKeys::getIsdeleted,Constants.ZERO))>Constants.ZERO){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵缂栧彿宸插瓨鍦紒");
@@ -134,6 +144,7 @@
         if(Objects.nonNull(rfidKeys)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠RFID鏍囩宸茶閽ュ寵["+rfidKeys.getCode()+"]浣跨敤锛�");
         }
+
         LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
         jkKeys.setEditDate(new Date());
         jkKeys.setEditor(loginUserInfo.getId());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
index d580516..cbcb8bd 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
@@ -1323,7 +1323,7 @@
                 .leftJoin(Category.class,Category::getId,JkLine::getCategoryId )
                 .leftJoin(Cars.class,Cars::getId,JkLine::getCarId)
                 .and(StringUtils.isNotBlank(telecomLineInfoDTO.getSearchInfo()),i->i.like(Cars::getCode,telecomLineInfoDTO.getSearchInfo()).or().like(JkLine::getName,telecomLineInfoDTO.getSearchInfo()))
-                .eq(StringUtils.isNotBlank(telecomLineInfoDTO.getDateInfo()),JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo())
+                .like(StringUtils.isNotBlank(telecomLineInfoDTO.getDateInfo()),JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo())
                 .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkLine::getCategoryId, telecomLineInfoDTO.getCategoryId())
                 .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkLine::getId, telecomLineInfoDTO.getLineId());
 
@@ -1370,7 +1370,7 @@
                 .select(" ifnull((select count(1) from jk_sketch_customer jc where jc.ISDELETED= 0 and  jc.SKETCH_ID = t.id),0)" ,JkSketch::getCustomerNum)
                 .select(" ifnull((select count(1) from jk_sketch_line jc where   jc.TYPE = 0  and  jc.SKETCH_ID = t.id),0)" ,JkSketch::getBeforeLineNum)
                 .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId )
-                .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
+                .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
         List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper);
         if(CollectionUtils.isEmpty(sketchList)){
             return telecomLineCountVO;
@@ -1439,7 +1439,7 @@
         MPJLambdaWrapper<JkSketch> sketchMPJLambdaWrapper = new MPJLambdaWrapper<JkSketch>().selectAll(JkSketch.class )
                 .selectAs(Category::getName,JkSketch::getCategoryName)
                 .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId )
-                .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
+                .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
         List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper);
         if(CollectionUtils.isEmpty(sketchList)){
             return new ArrayList<TelecomCategoryDataVO>();
@@ -1503,7 +1503,7 @@
                 .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkSketchLine::getCategoryId,telecomLineInfoDTO.getCategoryId())
                 .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkSketchLine::getLineId,telecomLineInfoDTO.getLineId())
                 .apply(" ( t.TYPE = t1.OPT_STATUS ) ")
-                .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
+                .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
         List<JkSketchLine> returnLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper);
 
 //        //浼樺寲鍓嶆暟鎹�
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
index 3fae3cf..694508b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
@@ -15,7 +15,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
diff --git a/server/visits/openapi/pom.xml b/server/visits/openapi/pom.xml
index d5ce8a1..ff7b4ad 100644
--- a/server/visits/openapi/pom.xml
+++ b/server/visits/openapi/pom.xml
@@ -21,6 +21,18 @@
             <groupId>com.doumee</groupId>
             <artifactId>dmvisit_service</artifactId>
             <version>1.0.0-SNAPSHOT</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.protobuf</groupId>
+                    <artifactId>protobuf-java</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>4.31.1</version>
+            <scope>compile</scope>
         </dependency>
     </dependencies>
     <build>
diff --git a/server/visits/pom.xml b/server/visits/pom.xml
index d608ffc..957c391 100644
--- a/server/visits/pom.xml
+++ b/server/visits/pom.xml
@@ -32,7 +32,6 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-           <!-- <version>2.2.7.RELEASE</version>-->
         </dependency>
         <!--<dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -41,7 +40,6 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-            <!-- <version>2.2.7.RELEASE</version>-->
         </dependency>
 
         <!-- 鎺ュ彛鏂囨。 -->

--
Gitblit v1.9.3