From 568e38a95cb6fb20fe16b53d17f610aefc6f744f Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期四, 09 十月 2025 18:29:29 +0800
Subject: [PATCH] 钉钉通知 与钥匙柜开发

---
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java                   |   45 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java          |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java                      |   19 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java     |  299 +++++++++----
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java             |   45 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java  |    3 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java                |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java        |  147 ++++--
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java        |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java               |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java          |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java  |   18 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java                  |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java                      |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java       |  193 ++++++++-
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java |  175 +++++--
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java                      |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java                |    3 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java         |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java               |   18 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java              |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java                         |  180 ++++----
 22 files changed, 859 insertions(+), 363 deletions(-)

diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java
index 5000734..cf0044a 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java
@@ -35,57 +35,64 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:jkcabinet:create")
-    public ApiResponse create(@RequestBody JkCabinet jkCabinet) {
+    public ApiResponse create(@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkCabinet.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(jkCabinetService.create(jkCabinet));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:jkcabinet:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jkCabinetService.deleteById(id);
         return ApiResponse.success(null);
     }
 
-    @ApiOperation("鎵归噺鍒犻櫎")
-    @GetMapping("/delete/batch")
-    @CloudRequiredPermission("business:jkcabinet:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
-        String [] idArray = ids.split(",");
-        List<Integer> idList = new ArrayList<>();
-        for (String id : idArray) {
-            idList.add(Integer.valueOf(id));
-        }
-        jkCabinetService.deleteByIdInBatch(idList);
-        return ApiResponse.success(null);
-    }
 
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:jkcabinet:update")
-    public ApiResponse updateById(@RequestBody JkCabinet jkCabinet) {
+    public ApiResponse updateById(@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkCabinet.setLoginUserInfo(this.getLoginUser(token));
         jkCabinetService.updateById(jkCabinet);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼鐘舵��")
+    @PostMapping("/updateStatusById")
+    @CloudRequiredPermission("business:jkcabinet:update")
+    public ApiResponse updateStatusById(@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkCabinet.setLoginUserInfo(this.getLoginUser(token));
+        jkCabinetService.updateStatusById(jkCabinet);
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:jkcabinet:query")
-    public ApiResponse<PageData<JkCabinet>> findPage (@RequestBody PageWrap<JkCabinet> pageWrap) {
+    public ApiResponse<PageData<JkCabinet>> findPage (@RequestBody PageWrap<JkCabinet> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetService.findPage(pageWrap));
     }
+
+    @ApiOperation("鍒楄〃鏌ヨ")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:jkcabinet:query")
+    public ApiResponse<List<JkCabinet>> findList (@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(jkCabinetService.findList(jkCabinet));
+    }
+
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkcabinet:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<JkCabinet> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<JkCabinet> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(JkCabinet.class).export(jkCabinetService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滃熀鏈俊鎭〃", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:jkcabinet:query")
-    public ApiResponse findById(@PathVariable Integer id) {
-        return ApiResponse.success(jkCabinetService.findById(id));
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(jkCabinetService.getDetail(id));
     }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java
index 0b9de85..14dcffe 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java
@@ -35,14 +35,14 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:jkcabinetgrid:create")
-    public ApiResponse create(@RequestBody JkCabinetGrid jkCabinetGrid) {
+    public ApiResponse create(@RequestBody JkCabinetGrid jkCabinetGrid,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetGridService.create(jkCabinetGrid));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:jkcabinetgrid:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jkCabinetGridService.deleteById(id);
         return ApiResponse.success(null);
     }
@@ -50,7 +50,7 @@
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:jkcabinetgrid:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
@@ -63,7 +63,7 @@
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:jkcabinetgrid:update")
-    public ApiResponse updateById(@RequestBody JkCabinetGrid jkCabinetGrid) {
+    public ApiResponse updateById(@RequestBody JkCabinetGrid jkCabinetGrid,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jkCabinetGridService.updateById(jkCabinetGrid);
         return ApiResponse.success(null);
     }
@@ -71,21 +71,21 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:jkcabinetgrid:query")
-    public ApiResponse<PageData<JkCabinetGrid>> findPage (@RequestBody PageWrap<JkCabinetGrid> pageWrap) {
+    public ApiResponse<PageData<JkCabinetGrid>> findPage (@RequestBody PageWrap<JkCabinetGrid> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetGridService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkcabinetgrid:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<JkCabinetGrid> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<JkCabinetGrid> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(JkCabinetGrid.class).export(jkCabinetGridService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:jkcabinetgrid:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetGridService.findById(id));
     }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java
index 0299c8e..b04f026 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java
@@ -35,14 +35,14 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:jkcabinetlog:create")
-    public ApiResponse create(@RequestBody JkCabinetLog jkCabinetLog) {
+    public ApiResponse create(@RequestBody JkCabinetLog jkCabinetLog,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetLogService.create(jkCabinetLog));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:jkcabinetlog:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jkCabinetLogService.deleteById(id);
         return ApiResponse.success(null);
     }
@@ -50,7 +50,7 @@
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:jkcabinetlog:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
@@ -63,7 +63,7 @@
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:jkcabinetlog:update")
-    public ApiResponse updateById(@RequestBody JkCabinetLog jkCabinetLog) {
+    public ApiResponse updateById(@RequestBody JkCabinetLog jkCabinetLog,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jkCabinetLogService.updateById(jkCabinetLog);
         return ApiResponse.success(null);
     }
@@ -71,21 +71,21 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:jkcabinetlog:query")
-    public ApiResponse<PageData<JkCabinetLog>> findPage (@RequestBody PageWrap<JkCabinetLog> pageWrap) {
+    public ApiResponse<PageData<JkCabinetLog>> findPage (@RequestBody PageWrap<JkCabinetLog> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetLogService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkcabinetlog:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<JkCabinetLog> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<JkCabinetLog> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(JkCabinetLog.class).export(jkCabinetLogService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滃紑鍏抽棬璁板綍", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:jkcabinetlog:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCabinetLogService.findById(id));
     }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java
index 4fe9b33..b32f626 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java
@@ -35,14 +35,15 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:jkkeys:create")
-    public ApiResponse create(@RequestBody JkKeys jkKeys) {
+    public ApiResponse create(@RequestBody JkKeys jkKeys,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkKeys.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(jkKeysService.create(jkKeys));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:jkkeys:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jkKeysService.deleteById(id);
         return ApiResponse.success(null);
     }
@@ -50,7 +51,7 @@
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:jkkeys:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
@@ -63,7 +64,8 @@
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:jkkeys:update")
-    public ApiResponse updateById(@RequestBody JkKeys jkKeys) {
+    public ApiResponse updateById(@RequestBody JkKeys jkKeys,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkKeys.setLoginUserInfo(this.getLoginUser(token));
         jkKeysService.updateById(jkKeys);
         return ApiResponse.success(null);
     }
@@ -71,21 +73,21 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:jkkeys:query")
-    public ApiResponse<PageData<JkKeys>> findPage (@RequestBody PageWrap<JkKeys> pageWrap) {
+    public ApiResponse<PageData<JkKeys>> findPage (@RequestBody PageWrap<JkKeys> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkKeysService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkkeys:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<JkKeys> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<JkKeys> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(JkKeys.class).export(jkKeysService.findPage(pageWrap).getRecords(), "閽ュ寵鍩烘湰淇℃伅琛�", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:jkkeys:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkKeysService.findById(id));
     }
 }
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 0f41075..2291752 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
@@ -373,20 +373,25 @@
      * api 鍦板潃 https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
      * @throws ApiException
      */
-    public void workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg)throws ApiException {
-        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
-        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
-        request.setAgentId(agentId);
-        request.setUseridList(userIds);
-        request.setToAllUser(false);
+    public void workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg){
+        try{
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+            request.setAgentId(agentId);
+            request.setUseridList(userIds);
+            request.setToAllUser(false);
 
-        request.setMsg(msg);
-        OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, "60c2df248ca93d4eafb4a04a2330d3d3");//getToken());
-        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+            request.setMsg(msg);
+            OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, "60c2df248ca93d4eafb4a04a2330d3d3");//getToken());
+            if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
 
-        }else{
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+            }
+        }catch (ApiException apiException){
+
         }
+
     }
 
 
@@ -532,79 +537,83 @@
      * unionIdList 寰呭姙閫氱煡浜哄憳闆嗗悎
      * @throws Exception
      */
-    public String toDoNotice(String title,List<String> unionIdList,List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> fieldList) throws Exception {
-        com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
-        CreateTodoTaskHeaders createTodoTaskHeaders = new CreateTodoTaskHeaders();
-        createTodoTaskHeaders.xAcsDingtalkAccessToken = "43cf8213909f34ef81e7447905b822fb";//getToken();
-        //寰呭姙鎴鍓嶇殑鎻愰啋
-        CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs remindNotifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs()
-                .setDingNotify("1")
-                .setSendTodoApn("true");
-        //寰呭姙閫氱煡閰嶇疆
-        CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs notifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs()
-                .setDingNotify("1")
-                .setSendTodoApn("true")
-                .setSendAssistantChat("true");
-        //鎸夐挳浜嬩欢
-        CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam actionList0Param = new CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam()
-                .setBody("");
-        CreateTodoTaskRequest.CreateTodoTaskRequestActionList actionList0 = new CreateTodoTaskRequest.CreateTodoTaskRequestActionList()
-                .setTitle("鍘诲鐞�")
-                .setActionType(2)
-                .setParam(actionList0Param)
-                .setUrl("https://www.baidu.com") //TODO 璇︽儏鍦板潃
-                .setActionKey("ak-1-1");
-        //璇︽儏椤祏rl璺宠浆鍦板潃
-        CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl detailUrl = new CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl()
-                .setAppUrl("https://www.baidu.com")
-                .setPcUrl("https://www.baidu.com");
-        CreateTodoTaskRequest createTodoTaskRequest = new CreateTodoTaskRequest()
-                .setSubject(title)
-                .setCreatorId(unionIdList.get(Constants.ZERO))
-                .setDescription(title)
-                .setExecutorIds(unionIdList)
-                .setDetailUrl(detailUrl)
-                .setContentFieldList(fieldList)
-                .setIsOnlyShowExecutor(true)
-                .setPriority(20)
-                .setNotifyConfigs(notifyConfigs)
-                .setActionList(java.util.Arrays.asList(actionList0))
-                .setTodoType("TODO")
-                .setRemindNotifyConfigs(remindNotifyConfigs);
-        try {
-            CreateTodoTaskResponse response = client.createTodoTaskWithOptions(unionIdList.get(Constants.ZERO), createTodoTaskRequest, createTodoTaskHeaders, new com.aliyun.teautil.models.RuntimeOptions());
-            log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
-            return response.getBody().getId();
-        } catch (TeaException err) {
-            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+    public String toDoNotice(String title,List<String> unionIdList,List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> fieldList,String url) {
+        try{
+            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
+            CreateTodoTaskHeaders createTodoTaskHeaders = new CreateTodoTaskHeaders();
+            createTodoTaskHeaders.xAcsDingtalkAccessToken = getToken();
+            //寰呭姙鎴鍓嶇殑鎻愰啋
+            CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs remindNotifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs()
+                    .setDingNotify("1")
+                    .setSendTodoApn("true");
+            //寰呭姙閫氱煡閰嶇疆
+            CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs notifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs()
+                    .setDingNotify("1")
+                    .setSendTodoApn("true")
+                    .setSendAssistantChat("true");
+            //鎸夐挳浜嬩欢
+            CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam actionList0Param = new CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam()
+                    .setBody("");
+            CreateTodoTaskRequest.CreateTodoTaskRequestActionList actionList0 = new CreateTodoTaskRequest.CreateTodoTaskRequestActionList()
+                    .setTitle("鍘诲鐞�")
+                    .setActionType(2)
+                    .setParam(actionList0Param)
+                    .setUrl("https://www.baidu.com") //TODO 璇︽儏鍦板潃
+                    .setActionKey("ak-1-1");
+            //璇︽儏椤祏rl璺宠浆鍦板潃
+            CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl detailUrl = new CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl()
+                    .setAppUrl("https://www.baidu.com")
+                    .setPcUrl("https://www.baidu.com");
+            CreateTodoTaskRequest createTodoTaskRequest = new CreateTodoTaskRequest()
+                    .setSubject(title)
+                    .setCreatorId(unionIdList.get(Constants.ZERO))
+                    .setDescription(title)
+                    .setExecutorIds(unionIdList)
+                    .setDetailUrl(detailUrl)
+                    .setContentFieldList(fieldList)
+                    .setIsOnlyShowExecutor(true)
+                    .setPriority(20)
+                    .setNotifyConfigs(notifyConfigs)
+                    .setActionList(java.util.Arrays.asList(actionList0))
+                    .setTodoType("TODO")
+                    .setRemindNotifyConfigs(remindNotifyConfigs);
+            try {
+                CreateTodoTaskResponse response = client.createTodoTaskWithOptions(unionIdList.get(Constants.ZERO), createTodoTaskRequest, createTodoTaskHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+                log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
+                return response.getBody().getId();
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+                }
+            } catch (Exception _err) {
+                TeaException err = new TeaException(_err.getMessage(), _err);
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                    log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+                }
             }
-        } catch (Exception _err) {
-            TeaException err = new TeaException(_err.getMessage(), _err);
-            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
-                log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
-            }
+            return null;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽夐拤寰呭姙浠诲姟閫氱煡鍙戦�佸け璐�");
         }
-        return null;
     }
 
 
     /**
-     * 澶勭悊鍏ㄩ儴浜虹殑寰呭姙淇℃伅
+     * 澶勭悊鍏ㄩ儴浜虹殑寰呭姙淇℃伅 锛堟祦绋嬪鎵瑰畬鎴愩�佹湰绾у鎵瑰畬鎴� 浣跨敤锛�
      * @param unionId
      * @param taskId
      * api鍦板潃 https://open.dingtalk.com/document/orgapp/updates-dingtalk-to-do-tasks
      * @throws Exception
      */
-    public void updToDoNoticeInfoStatus(String unionId,String taskId) throws Exception {
-        com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
-        UpdateTodoTaskHeaders updateTodoTaskHeaders = new UpdateTodoTaskHeaders();
-        updateTodoTaskHeaders.xAcsDingtalkAccessToken = "43cf8213909f34ef81e7447905b822fb";//getToken();
-        UpdateTodoTaskRequest updateTodoTaskRequest = new UpdateTodoTaskRequest()
-                .setOperatorId(unionId)
-                .setDone(true);
+    public void updToDoNoticeInfoStatus(String unionId,String taskId){
         try {
+            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
+            UpdateTodoTaskHeaders updateTodoTaskHeaders = new UpdateTodoTaskHeaders();
+            updateTodoTaskHeaders.xAcsDingtalkAccessToken = getToken();
+            UpdateTodoTaskRequest updateTodoTaskRequest = new UpdateTodoTaskRequest()
+                    .setOperatorId(unionId)
+                    .setDone(true);
             UpdateTodoTaskResponse response = client.updateTodoTaskWithOptions(unionId, taskId, updateTodoTaskRequest, updateTodoTaskHeaders, new RuntimeOptions());
             log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
         } catch (TeaException err) {
@@ -612,7 +621,6 @@
                 // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
                 log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
             }
-
         } catch (Exception _err) {
             TeaException err = new TeaException(_err.getMessage(), _err);
             if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
@@ -630,18 +638,18 @@
      * api 鍦板潃 https://open.dingtalk.com/document/orgapp/update-dingtalk-to-do-status
      * @throws Exception
      */
-    public void updUserToDoNoticeInfoStatus(String unionId,String taskId,String dealUnionId) throws Exception {
-        com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
-        UpdateTodoTaskExecutorStatusHeaders updateTodoTaskExecutorStatusHeaders = new UpdateTodoTaskExecutorStatusHeaders();
-        updateTodoTaskExecutorStatusHeaders.xAcsDingtalkAccessToken = "43cf8213909f34ef81e7447905b822fb";//getToken();
-        UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList executorStatusList0 = new UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList()
-                .setId(dealUnionId)
-                .setIsDone(true);
-        UpdateTodoTaskExecutorStatusRequest updateTodoTaskExecutorStatusRequest = new UpdateTodoTaskExecutorStatusRequest()
-                .setExecutorStatusList(java.util.Arrays.asList(
-                        executorStatusList0
-                ));
+    public void updUserToDoNoticeInfoStatus(String unionId,String taskId,String dealUnionId){
         try {
+            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
+            UpdateTodoTaskExecutorStatusHeaders updateTodoTaskExecutorStatusHeaders = new UpdateTodoTaskExecutorStatusHeaders();
+            updateTodoTaskExecutorStatusHeaders.xAcsDingtalkAccessToken = getToken();
+            UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList executorStatusList0 = new UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList()
+                    .setId(dealUnionId)
+                    .setIsDone(true);
+            UpdateTodoTaskExecutorStatusRequest updateTodoTaskExecutorStatusRequest = new UpdateTodoTaskExecutorStatusRequest()
+                    .setExecutorStatusList(java.util.Arrays.asList(
+                            executorStatusList0
+                    ));
             UpdateTodoTaskExecutorStatusResponse response = client.updateTodoTaskExecutorStatusWithOptions(unionId, taskId, updateTodoTaskExecutorStatusRequest, updateTodoTaskExecutorStatusHeaders, new RuntimeOptions());
             log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
         } catch (TeaException err) {
@@ -729,10 +737,10 @@
         carUseBook.setType(Constants.ZERO);
 
 
-        dingTalk.workInfoOANotice(4015267031L,"1568490244651036",dingTalk.getCarUseNoticeMsg(carUseBook,"鐢ㄨ溅鐢宠"));
+//        dingTalk.workInfoOANotice(4015267031L,"1568490244651036",dingTalk.getCarUseNoticeMsg(carUseBook,"鐢ㄨ溅鐢宠"));
 
 
-//        dingTalk.toDoNotice("灏忚眴涓佹彁浜ょ殑鍏姟杞︾敤杞�",java.util.Arrays.asList("iPsP86axviPHiSP4nm5YgQNCQiEiE","XiPYJKRAv9eCoO4UPM20HQQiEiE","eWbHiSp3uRtrMtiiOX5LXamgiEiE") ,dingTalk.getToDoCarUseBookFiledInfo(carUseBook));
+        dingTalk.toDoNotice("灏忚眴涓佹彁浜ょ殑鍏姟杞︾敤杞�",java.util.Arrays.asList("iPsP86axviPHiSP4nm5YgQNCQiEiE","XiPYJKRAv9eCoO4UPM20HQQiEiE","eWbHiSp3uRtrMtiiOX5LXamgiEiE") ,dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"");
 //
 
 //        dingTalk.updUserToDoNoticeInfoStatus("iPsP86axviPHiSP4nm5YgQNCQiEiE",
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java
index 69cdf93..f5e0ee8 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java
@@ -2,11 +2,13 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.JkCabinetGrid;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+import com.github.yulichang.interfaces.MPJBaseJoin;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/09/28 09:01
  */
-public interface JkCabinetGridMapper extends BaseMapper<JkCabinetGrid> {
+public interface JkCabinetGridMapper extends MPJJoinMapper<JkCabinetGrid> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java
index 63566fe..4bf0c72 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.JkCabinetLog;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/09/28 09:01
  */
-public interface JkCabinetLogMapper extends BaseMapper<JkCabinetLog> {
+public interface JkCabinetLogMapper extends MPJJoinMapper<JkCabinetLog> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java
index b854736..233ea58 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.JkKeys;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/09/28 09:01
  */
-public interface JkKeysMapper extends BaseMapper<JkKeys> {
+public interface JkKeysMapper extends MPJJoinMapper<JkKeys> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java
index 3376b70..cc1f7cd 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java
@@ -145,6 +145,12 @@
     //@ExcelColumn(name="鍙告満缂栫爜锛堝叧鑱攎emberId锛�")
     private Integer driverId;
 
+    @ApiModelProperty(value = "閽夐拤寰呭姙浠诲姟涓婚敭")
+    private String ddToDoId;
+
+    @ApiModelProperty(value = "閽夐拤寰呭姙浠诲姟褰掑睘浜轰富閿�")
+    private String ddBelongToUnionId;
+
     @ApiModelProperty(value = "鍙告満濮撳悕", example = "1")
     @TableField(exist = false)
     private String driverName;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
index 26f0b8c..e9e3f6c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.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;
@@ -11,6 +12,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 閽ュ寵鏌滃熀鏈俊鎭〃
@@ -73,17 +75,27 @@
     @ExcelColumn(name="閫氳鍦板潃")
     private String linkAddr;
 
-    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
     private Integer status;
+
+    @ApiModelProperty(value = "杩愯鐘舵�� 0=鍦ㄧ嚎 1=绂荤嚎", example = "1")
+    @ExcelColumn(name="杩愯鐘舵�� 0=鍦ㄧ嚎 1=绂荤嚎")
+    private Integer runStatus;
+
 
     @ApiModelProperty(value = "绔彛", example = "1")
     @ExcelColumn(name="绔彛")
     private Integer port;
 
-    @ApiModelProperty(value = "璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)", example = "1")
+    @ApiModelProperty(value = "璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member) 澶氫釜浠�,鍒嗗壊", example = "1")
     @ExcelColumn(name="璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)")
-    private Integer managerId;
+    private String managerId;
+
+    @ApiModelProperty(value = "楠岃瘉浜虹紪鐮侊紙鍏宠仈member)", example = "1")
+    @ExcelColumn(name="楠岃瘉浜虹紪鐮侊紙鍏宠仈member)")
+    private String authMemberId;
+
 
     @ApiModelProperty(value = "浣跨敤鏃堕暱(绉�)", example = "1")
     @ExcelColumn(name="浣跨敤鏃堕暱(绉�)")
@@ -93,10 +105,6 @@
     @ExcelColumn(name="鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�")
     private Integer doubleAuth;
 
-    @ApiModelProperty(value = "楠岃瘉浜虹紪鐮侊紙鍏宠仈member)", example = "1")
-    @ExcelColumn(name="楠岃瘉浜虹紪鐮侊紙鍏宠仈member)")
-    private Integer authMemberId;
-
     @ApiModelProperty(value = "鎺掓暟", example = "1")
     @ExcelColumn(name="鎺掓暟")
     private Integer rowNum;
@@ -104,6 +112,10 @@
     @ApiModelProperty(value = "鍒楁暟", example = "1")
     @ExcelColumn(name="鍒楁暟")
     private Integer columnNum;
+
+    @ApiModelProperty(value = "鎺掑簭椤哄簭锛�0=浠庡乏鍚戝彸锛�1=浠庝笂鍚戜笅", example = "1")
+    @ExcelColumn(name="鎺掑簭椤哄簭")
+    private Integer sortType;
 
     @ApiModelProperty(value = "鏈�鍚庨�氳鏃堕棿")
     @ExcelColumn(name="鏈�鍚庨�氳鏃堕棿")
@@ -138,4 +150,21 @@
     @ExcelColumn(name="璧峰缂栫爜")
     private Integer noIndex;
 
+    @ApiModelProperty(value = "缁忕含搴︿俊鎭� 鍙傛暟鍊硷細缁忓害,绾害")
+    @TableField(exist = false)
+    private String jwd;
+
+    @ApiModelProperty(value = "鏌滄牸鏁伴噺", example = "1")
+    @TableField(exist = false)
+    private Integer gridNum;
+
+    @ApiModelProperty(value = "璁惧绠$悊浜哄憳鏁扮粍", example = "1")
+    @TableField(exist = false)
+    private List<String> managerIdList;
+
+    @ApiModelProperty(value = "楠岃瘉浜虹紪鐮佹暟缁�", example = "1")
+    @TableField(exist = false)
+    private List<String> authMemberIdList;
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java
index 35fa13a..8e30971 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.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;
@@ -68,12 +69,23 @@
     @ExcelColumn(name="搴忓垪鍙�")
     private String serialNo;
 
-    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤锛�1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤锛�1=绂佺敤")
     private Integer status;
 
-    @ApiModelProperty(value = "杩愯鐘舵��", example = "1")
+    @ApiModelProperty(value = "杩愯鐘舵�� 0姝e父 1鏁呴殰 ", example = "1")
     @ExcelColumn(name="杩愯鐘舵��")
     private Integer workingStatus;
 
+    @ApiModelProperty(value = "缁戝畾鐘舵�� 0鏈粦瀹氾紱1宸茬粦瀹�", example = "1")
+    @TableField(exist = false)
+    private Integer bindStatus;
+
+    @ApiModelProperty(value = "閽ュ寵鏌滃悕绉�", example = "1")
+    @TableField(exist = false)
+    private String cabinetName;
+
+    @ApiModelProperty(value = "閽ュ寵缂栫爜", example = "1")
+    @TableField(exist = false)
+    private String keyCode;
 }
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 2148e5c..198fb8c 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
@@ -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;
@@ -54,7 +55,7 @@
 
     @ApiModelProperty(value = "閽ュ寵缂栧彿", example = "1")
     @ExcelColumn(name="閽ュ寵缂栧彿")
-    private Integer code;
+    private String code;
 
     @ApiModelProperty(value = "杞︾墝鍙�")
     @ExcelColumn(name="杞︾墝鍙�")
@@ -72,8 +73,20 @@
     @ExcelColumn(name="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟")
     private Integer roleType;
 
-    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    @ApiModelProperty(value = " 鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭 3缁翠慨淇濆吇", example = "1")
+    @ExcelColumn(name=" 鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭 3缁翠慨淇濆吇")
     private Integer status;
 
+    @ApiModelProperty(value = "瀛樻斁浣嶇疆", example = "1")
+    @TableField(exist = false)
+    private String gridCode;
+
+    @ApiModelProperty(value = "缁戝畾閽ュ寵鏌�", example = "1")
+    @TableField(exist = false)
+    private String cabinetName;
+
+    @ApiModelProperty(value = "鏄惁缁戝畾锛�0=鍚︼紱1=鏄紱", example = "1")
+    @TableField(exist = false)
+    private Integer isBinding;
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
index 0c23522..244311f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -242,6 +242,11 @@
     @ExcelColumn(name="鏂藉伐浜嬬敱")
     private String constructionReason;
 
+    @ApiModelProperty(value = "閽夐拤寰呭姙浠诲姟涓婚敭")
+    private String ddToDoId;
+
+    @ApiModelProperty(value = "閽夐拤寰呭姙浠诲姟褰掑睘浜轰富閿�")
+    private String ddBelongToUnionId;
     @ApiModelProperty(value = "鏅�氳瀹㈢敵璇烽殢璁夸汉鍛�")
     @TableField(exist = false)
     private List<Visits> withUserList;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java
index 508b858..f3080cd 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java
@@ -1,7 +1,5 @@
 package com.doumee.service.business;
 
-//import com.doumee.service.business.third.model.PageData;
-//import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.JkCabinetGrid;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
@@ -97,4 +95,12 @@
      * @return long
      */
     long count(JkCabinetGrid jkCabinetGrid);
+
+    /**
+     * 缁戝畾閽ュ寵
+     * @param jkCabinetGrid
+     */
+    void bindingKeys(JkCabinetGrid jkCabinetGrid);
+
+    void unBindKeys(List<Integer> idList);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
index ad0bc17..c9f2469 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
@@ -48,6 +48,8 @@
      */
     void updateById(JkCabinet jkCabinet);
 
+    void updateStatusById(JkCabinet jkCabinet);
+
     /**
      * 鎵归噺涓婚敭鏇存柊
      *
@@ -63,6 +65,7 @@
      */
     JkCabinet findById(Integer id);
 
+    JkCabinet getDetail(Integer id);
     /**
      * 鏉′欢鏌ヨ鍗曟潯璁板綍
      *
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
index b352a5e..fe94066 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -3,6 +3,7 @@
 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.exception.BusinessException;
 import com.doumee.core.haikang.model.HKConstants;
 import com.doumee.core.haikang.model.param.BaseResponse;
@@ -124,6 +125,8 @@
     private SmsEmailMapper smsEmailMapper;
     @Autowired
     private EmayService emayService;
+    @Autowired
+    private DingTalk dingTalk;
     @Override
     public Integer create(Approve approve) {
         approveMapper.insert(approve);
@@ -621,6 +624,7 @@
                                     Arrays.asList(member.getSystemOpenid().split(","))
                             );
                         }
+                        
                     }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visitReporting)){
                         //璁垮鎶ュ
                         SmsEmailServiceImpl.sendVisitReportSms(systemDictDataBiz,
@@ -659,9 +663,44 @@
                             }
                         }
                     }
+                } 
+            }
+            if(Constants.equalsInteger(i,Constants.ZERO) && CollectionUtils.isNotEmpty(memberList)){
+                //鐢熸垚绗竴鎵归拤閽夊鎵归�氱煡淇℃伅
+                List<String> erpId = memberList.stream().filter(m->StringUtils.isNotBlank(m.getErpId())).map(m->m.getErpId()).collect(Collectors.toList());
+                if(CollectionUtils.isNotEmpty(erpId)){
+                    if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.useCar)){
+                        CarUseBook carUseBook = carUseBookMapper.selectJoinOne(CarUseBook.class,
+                                new MPJLambdaWrapper<CarUseBook>()
+                                        .selectAll(CarUseBook.class)
+                                        .selectAs(Member::getName,CarUseBook::getMemberName)
+                                        .leftJoin(Member.class,Member::getId,CarUseBook::getMemberId)
+                                        .eq(CarUseBook::getId,businessId)
+                                        .last(" limit 1 ")
+                        );
+                        if(Objects.nonNull(carUseBook)){
+                            if(CollectionUtils.isNotEmpty(erpId)){
+                                String ddTalkId = dingTalk.toDoNotice(StringUtils.isNotBlank(carUseBook.getMemberName())?(carUseBook.getMemberName()+"鎻愪氦鐨勫叕鍔$敤杞︾敵璇�"):"鍏姟杞︾敤杞︾敵璇�",
+                                        erpId ,
+                                        dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"pages/staff/vehicle/sendACarDetail?id="+carUseBook.getId());
+                                carUseBookMapper.update(new UpdateWrapper<CarUseBook>().lambda()
+                                        .set(CarUseBook::getDdBelongToUnionId,erpId.get(Constants.ZERO))
+                                        .set(CarUseBook::getDdToDoId,ddTalkId).eq(CarUseBook::getId,carUseBook.getId()));
+                            }
+                        }
+                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visit) || Constants.equalsInteger(noticeType,Constants.noticesObjectType.visitReporting)) {
+                        Visits visits = visitsMapper.selectById(businessId);
+                        if (Objects.nonNull(visits)) {
+                            //TODO 缂哄皯鍩熷悕鍓嶇紑鍐呭
+                            String ddTalkId = dingTalk.toDoNotice(visits.getName() + "鐨勮瀹㈢敵璇�",
+                                    erpId,
+                                    dingTalk.getToDoVisitFiledInfo(visits), "pages/appointmentDetails/appointmentDetails?id=" + visits.getId());
+                            visitsMapper.update(new UpdateWrapper<Visits>().lambda()
+                                            .set(Visits::getDdBelongToUnionId,erpId.get(Constants.ZERO))
+                                    .set(Visits::getDdToDoId, ddTalkId).eq(Visits::getId, visits.getId()));
+                        }
+                    }
                 }
-
-
             }
         }
     }
@@ -1285,6 +1324,7 @@
         approveMapper.updateById(approve);
         //鏄惁澶勭悊 涓氬姟鏁版嵁
         Boolean dealBusinessBean = false;
+        Boolean dealDDToDo = false;
         //瀹℃壒椹冲洖鎯呭喌
         if(approveDTO.getStatus().equals(Constants.THREE)){
             dealBusinessBean = true;
@@ -1347,7 +1387,6 @@
                             .in(Approve::getId,approveList.stream().map(m->m.getId()).collect(Collectors.toList())));
                 }
                 /**寮�鍚笅涓�绾у埆鐨勬暟鎹负寰呭鏍�**/
-
                 List<Approve> waitAuditList = approveJoinMapper.selectJoinList(Approve.class,
                         new MPJLambdaWrapper<Approve>()
                                 .selectAll(Approve.class)
@@ -1383,13 +1422,17 @@
 //                }
             }else if(approve.getApproveType().equals(Constants.ONE)){
                 //浼氱 涓旂粓瀹�
+                if(!Constants.equalsInteger(approveList.size(),Constants.ZERO)&&Constants.equalsInteger(approve.getIsEndCheck(),Constants.ZERO)){
+                    //鏍囪閽夐拤閫氱煡鑷繁宸插鐞�
+                    dealDDToDo = true;
+                }
+
                 //鏃犱粬浜哄鎵圭殑鎯呭喌 鍒欎慨鏀规暟鎹姸鎬�
                 if(Constants.equalsInteger(approveList.size(),Constants.ZERO)&&Constants.equalsInteger(approve.getIsEndCheck(),Constants.ONE)){
                     dealBusinessBean = true;
                 }else{
                     if(Constants.equalsInteger(approveList.size(),Constants.ZERO)&&Constants.equalsInteger(approve.getIsEndCheck(),Constants.ZERO)){
                         /**寮�鍚笅涓�绾у埆鐨勬暟鎹负寰呭鏍�**/
-
                         List<Approve> waitAuditList = approveJoinMapper.selectJoinList(Approve.class,
                                 new MPJLambdaWrapper<Approve>()
                                         .selectAll(Approve.class)
@@ -1419,6 +1462,7 @@
                         List<String> memberPhone = waitAuditList.stream().filter(i->StringUtils.isNotBlank(i.getMemberPhone())).map(i->i.getMemberPhone()).collect(Collectors.toList());
                         List<String> openIdList =waitAuditList.stream().filter(i->StringUtils.isNotBlank(i.getSystemOpenid())).map(i->i.getSystemOpenid()).collect(Collectors.toList());
 
+
                         this.sendNextLvSms(approve,approveDTO,memberPhone,openIdList);
 
                     }
@@ -1428,7 +1472,7 @@
 //                    }
                 }
             }
-            this.passNextNotices(dealBusinessBean,notices,approve,approveList,approveCopyList,approveDTO);
+            this.passNextNotices(dealBusinessBean,notices,approve,approveList,approveCopyList,approveDTO,dealDDToDo);
         }
         //澶勭悊涓氬姟鏁版嵁
         if(dealBusinessBean){
@@ -1442,6 +1486,12 @@
     public void sendNextLvSms(Approve approve ,ApproveDTO approveDTO , List<String> memberPhone ,List<String> openIdList){
         WxPlatNotice wxPlatNotice = new WxPlatNotice();
         //鐗╂祦杞﹂绾�
+        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                .in(Member::getPhone,memberPhone)
+                .eq(Member::getIsdeleted,Constants.ZERO)
+                .eq(Member::getStatus,Constants.ZERO)
+                .isNotNull(Member::getErpId)
+         );
         if(approveDTO.getObjType().equals(Constants.approveObjectType.reason)){
             SmsEmailServiceImpl.sendPlatformBookSms(systemDictDataBiz,
                     emayService,smsEmailMapper,smsConfigMapper,platformBooksMapper,approveDTO.getObjId(),
@@ -1468,9 +1518,15 @@
                     SmsConstants.carUseBookContent.carUseBookWaitAudit,
                     approveDTO.getCheckInfo(),memberPhone);
             //鍙戦�佸叕浼楀彿閫氱煡
-            if(CollectionUtils.isNotEmpty(openIdList)){
-                CarUseBook carUseBook = carUseBookMapper.selectById(approve.getObjId());
-                if(Objects.nonNull(carUseBook)){
+            CarUseBook carUseBook = carUseBookMapper.selectJoinOne(CarUseBook.class,
+                    new MPJLambdaWrapper<CarUseBook>()
+                            .selectAll(CarUseBook.class)
+                            .selectAs(Member::getName,CarUseBook::getMemberName)
+                            .leftJoin(Member.class,Member::getId,CarUseBook::getMemberId)
+                            .eq(CarUseBook::getId,approve.getObjId())
+                            .last(" limit 1 ")
+            );
+            if(CollectionUtils.isNotEmpty(openIdList)&&Objects.nonNull(carUseBook)){ 
                     SystemUser systemUser = systemUserMapper.selectById(carUseBook.getCreator());
                     if(Objects.nonNull(systemUser)){
                         carUseBook.setMemberName(systemUser.getRealname());
@@ -1479,9 +1535,19 @@
                                 wxNoticeConfigMapper,carUseBook,
                                 WxPlatConstants.carUseBookContent.carUseBookWaitAudit, 
                                 openIdList,1);
-                    }
-                }
+                    } 
             }
+            //鍙戦�侀拤閽夊緟鍔� 鍏姟杞︾敵璇�
+            if(Objects.nonNull(carUseBook)&&Objects.nonNull(memberList)){
+                //鏍囪褰撳墠瀹℃壒浜哄凡瀹屾垚
+                dingTalk.updToDoNoticeInfoStatus(carUseBook.getDdBelongToUnionId(),carUseBook.getDdToDoId());
+                //TODO 缂哄皯鍩熷悕鍓嶇紑鍐呭
+                String ddTalkId = dingTalk.toDoNotice(StringUtils.isNotBlank(carUseBook.getMemberName())?(carUseBook.getMemberName()+"鎻愪氦鐨勫叕鍔$敤杞︾敵璇�"):"鍏姟杞︾敤杞︾敵璇�",
+                        memberList.stream().map(i->i.getErpId()).collect(Collectors.toList()) ,
+                        dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"pages/staff/vehicle/sendACarDetail?id="+carUseBook.getId());
+                carUseBookMapper.update(new UpdateWrapper<CarUseBook>().lambda()
+                        .set(CarUseBook::getDdToDoId,ddTalkId).eq(CarUseBook::getId,carUseBook.getId()));
+            } 
         }else
             //璁垮鐢宠/鎶ュ
             if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
@@ -1506,6 +1572,16 @@
                                 openIdList
                         );
                     }
+                    if(Objects.nonNull(visits)&&Objects.nonNull(memberList)){
+                        //鏍囪褰撳墠瀹℃壒浜哄凡瀹屾垚
+                        dingTalk.updToDoNoticeInfoStatus(visits.getDdBelongToUnionId(),visits.getDdToDoId());
+                        //TODO 缂哄皯鍩熷悕鍓嶇紑鍐呭
+                        String ddTalkId = dingTalk.toDoNotice(visits.getName()+"鐨勮瀹㈢敵璇�",
+                                memberList.stream().map(i->i.getErpId()).collect(Collectors.toList()) ,
+                                dingTalk.getToDoVisitFiledInfo(visits),"pages/appointmentDetails/appointmentDetails?id="+visits.getId());
+                        visitsMapper.update(new UpdateWrapper<Visits>().lambda()
+                                .set(Visits::getDdToDoId,ddTalkId).eq(Visits::getId,visits.getId()));
+                    }
 
                 }
             }
@@ -1518,15 +1594,15 @@
      * @param dealBusinessBean  鏄惁闇�瑕佽繘琛屾洿鏂颁笟鍔℃暟鎹姸鎬�
      * @param approve  瀹℃壒璁板綍
      * @param approveList  鍚岀骇寰呭鎵规暟鎹�
+     * @param dealDDToDo  鏄惁澶勭悊 褰撳墠瀹℃壒淇℃伅浜虹殑閽夐拤鐨勫伐浣滈�氱煡
+     *
      */
-    public void passNextNotices(Boolean dealBusinessBean,Notices notices,Approve approve,List<Approve> approveList,List<Approve> copyList,ApproveDTO approveDTO){
+    public void passNextNotices(Boolean dealBusinessBean,Notices notices,Approve approve,List<Approve> approveList,List<Approve> copyList,ApproveDTO approveDTO,Boolean dealDDToDo){
         //鏈紑鍚笅涓�绾ф椂锛屾搷浣滃悗鐨勫緟瀹℃壒浜�
         String memberNames =notices.getParam5()
                 .replaceAll(","+notices.getRemark(),"")
                 .replaceAll(notices.getRemark()+",","")
                 .replaceAll(notices.getRemark(),"");
-
-
 
         //1銆佷慨鏀硅嚜宸辩殑鏁版嵁璁板綍
         noticesJoinMapper.update(null,new UpdateWrapper<Notices>().lambda()
@@ -1607,6 +1683,30 @@
                 }
             }
         }
+        if(dealDDToDo){
+            if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
+                    ||approveDTO.getObjType().equals(Constants.approveObjectType.constructionVisit)
+                    ||approveDTO.getObjType().equals(Constants.approveObjectType.visitReporting)) {
+                Member member = memberMapper.selectById(approve.getChekorId());
+                // 璁垮 涓夌被涓氬姟鏁版嵁
+                Visits visits = visitsMapper.selectById(approveDTO.getObjId());
+                if(Objects.nonNull(member)&&Objects.nonNull(member.getErpId())
+                        &&Objects.nonNull(visits)&&Objects.nonNull(visits.getDdToDoId())&&Objects.nonNull(visits.getDdBelongToUnionId())){
+                    dingTalk.updUserToDoNoticeInfoStatus(visits.getDdBelongToUnionId(),visits.getDdToDoId(),member.getErpId());
+                }
+            }else if(approveDTO.getObjType().equals(Constants.approveObjectType.cityUseCar)||approveDTO.getObjType().equals(
+                    Constants.approveObjectType.unCityUseCar)){
+                Member member = memberMapper.selectById(approve.getChekorId());
+                CarUseBook carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
+                if(Objects.nonNull(member)&&Objects.nonNull(member.getErpId())
+                        &&Objects.nonNull(carUseBook)&&Objects.nonNull(carUseBook.getDdToDoId())&&Objects.nonNull(carUseBook.getDdBelongToUnionId())){
+                    dingTalk.updUserToDoNoticeInfoStatus(carUseBook.getDdBelongToUnionId(),carUseBook.getDdToDoId(),member.getErpId());
+                }
+            }
+
+
+
+        }
     }
 
 
@@ -1654,11 +1754,13 @@
 
     public void dealBusinessData(ApproveDTO approveDTO,Approve approve){
         WxPlatNotice wxPlatNotice = new WxPlatNotice();
+        Visits visits = new Visits();
+        CarUseBook carUseBook = new CarUseBook();
         if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
                 ||approveDTO.getObjType().equals(Constants.approveObjectType.constructionVisit)
                 ||approveDTO.getObjType().equals(Constants.approveObjectType.visitReporting)){
             // 璁垮 涓夌被涓氬姟鏁版嵁
-            Visits visits = visitsMapper.selectById(approveDTO.getObjId());
+            visits = visitsMapper.selectById(approveDTO.getObjId());
             if(Objects.isNull(visits)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐢宠璁板綍");
             }
@@ -1762,12 +1864,25 @@
                             Arrays.asList(visits.getOpenid().split(","))
                     );
                 }
+                //閽夐拤閫氱煡 璁垮琚浜烘垨鎶ュ鎻愪氦浜�
+                Member beVisitMember = memberMapper.selectById(Constants.equalsInteger(visits.getType(),Constants.TWO)?visits.getMemberId():visits.getReceptMemberId());
+                if(Objects.nonNull(beVisitMember)&&StringUtils.isNotBlank(beVisitMember.getDdId())){
+                    dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                            beVisitMember.getDdId(),
+                            dingTalk.getVisitNoticeMsg(visits,visits.getName()+"鐨�"+(Constants.equalsInteger(visits.getType(),Constants.TWO)?"璁垮鎶ュ":"璁垮鐢宠")+"锛�"+
+                                    (Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? "宸插鎵归�氳繃":"宸插鎵归┏鍥�"))
+                    );
+                }
             }
-
+            if(StringUtils.isNotBlank(visits.getDdBelongToUnionId())
+                    && StringUtils.isNotBlank(visits.getDdToDoId())){
+                //鏍囪褰撳墠閽夐拤瀹℃壒宸插畬鎴�
+                dingTalk.updToDoNoticeInfoStatus(visits.getDdBelongToUnionId(),visits.getDdToDoId());
+            }
         }else if(approveDTO.getObjType().equals(Constants.approveObjectType.cityUseCar)||approveDTO.getObjType().equals(
                 Constants.approveObjectType.unCityUseCar)){
             this.updDriver(approveDTO,approve,true);
-            CarUseBook carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
+            carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
             if(Objects.nonNull(carUseBook)){
                 SystemUser systemUser = systemUserMapper.selectById(carUseBook.getCreator());
                 //鍙戦�侀�氱煡鐭伅
@@ -1787,6 +1902,20 @@
                             Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)?WxPlatConstants.carUseBookContent.carUseBookAuditSuccess: WxPlatConstants.carUseBookContent.carUseBookAuditFail,
                             Arrays.asList(systemUser.getOpenid().split(",")),0);
                 }
+            }
+            //閽夐拤閫氱煡鍙戣捣浜�
+            Member creatMember = memberMapper.selectById(carUseBook.getMemberId());
+            if(Objects.nonNull(creatMember)&&StringUtils.isNotBlank(creatMember.getDdId())){
+                dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                        creatMember.getErpId(),
+                                dingTalk.getCarUseNoticeMsg(carUseBook,carUseBook.getMemberName() + "鎻愪氦鐨勫叕鍔$敤杞︼紝"+
+                                        (Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? "宸插鎵归�氳繃":"宸插鎵归┏鍥�"))
+                );
+            }
+            if(StringUtils.isNotBlank(carUseBook.getDdBelongToUnionId())
+                && StringUtils.isNotBlank(carUseBook.getDdToDoId())){
+                //鏍囪褰撳墠閽夐拤瀹℃壒宸插畬鎴�
+                dingTalk.updToDoNoticeInfoStatus(carUseBook.getDdBelongToUnionId(),carUseBook.getDdToDoId());
             }
 
         }else if(approveDTO.getObjType().equals(Constants.approveObjectType.reason)){
@@ -1862,13 +1991,33 @@
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         if(Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)){
-            //澶勭悊閫氳繃 鏄剧ず鎵�鏈夌殑鎶勯�佽褰�
-            approveMapper.update(null,new UpdateWrapper<Approve>().lambda().set(Approve::getStatus,Constants.TWO)
-                    .set(Approve::getCheckDate,new Date())
-                    .eq(Approve::getObjId,approve.getObjId())
+            List<Approve> approveList = approveMapper.selectList(new QueryWrapper<Approve>().lambda().eq(Approve::getObjId,approve.getObjId())
                     .eq(Approve::getObjType,approve.getObjType())
-                    .eq(Approve::getType,Constants.ONE)
-            );
+                    .eq(Approve::getType,Constants.ONE));
+            if(CollectionUtils.isNotEmpty(approveList)){
+                //澶勭悊閫氳繃 鏄剧ず鎵�鏈夌殑鎶勯�佽褰�
+                approveMapper.update(null,new UpdateWrapper<Approve>().lambda().set(Approve::getStatus,Constants.TWO)
+                        .set(Approve::getCheckDate,new Date())
+                        .eq(Approve::getObjId,approve.getObjId())
+                        .eq(Approve::getObjType,approve.getObjType())
+                        .eq(Approve::getType,Constants.ONE)
+                );
+                List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                        .eq(Member::getIsdeleted,Constants.ZERO)
+                        .eq(Member::getStatus,Constants.ZERO)
+                        .isNotNull(Member::getDdId)
+                        .in(Member::getId,approveList.stream().map(i->i.getChekorId()).collect(Collectors.toList())));
+                if(CollectionUtils.isNotEmpty(memberList)){
+                    if(Objects.nonNull(visits)||Objects.nonNull(carUseBook)){
+                        dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                                StringUtils.join(memberList.stream().map(i->i.getDdId()).collect(Collectors.toList()),","),
+                                Objects.nonNull(visits)?
+                                        dingTalk.getVisitNoticeMsg(visits,visits.getName()+"鐨�"+(Constants.equalsInteger(visits.getType(),Constants.TWO)?"璁垮鎶ュ":"璁垮鐢宠")+"锛屾妱閫佺粰鎮紝璇风煡鏅�"):
+                                        dingTalk.getCarUseNoticeMsg(carUseBook,carUseBook.getMemberName() + "鎻愪氦鐨勫叕鍔$敤杞︼紝鎶勯�佺粰鎮紝璇风煡鏅�")
+                        );
+                    }
+                }
+            }
         }
     }
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
index 7db1430..bc8fae7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.dingTalk.DingTalk;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.dao.business.dao.*;
 import com.doumee.dao.business.vo.GeneralDataVO;
@@ -98,6 +99,9 @@
 
     @Autowired
     private ApproveMapper approveMapper;
+
+    @Autowired
+    private DingTalk dingTalk;
 
 
     @Override
@@ -247,6 +251,13 @@
                     systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                     Arrays.asList(checkUser.getOpenid().split(",")));
         }
+
+        if(StringUtils.isNotBlank(member.getDdId())){
+            dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                    member.getDdId(),
+                    dingTalk.getHiddenDangerNoticeMsg(hiddenDanger));
+        }
+
         return hiddenDanger.getId();
     }
 
@@ -794,6 +805,13 @@
                     systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                     Arrays.asList(checkUser.getOpenid().split(",")));
         }
+
+        if(StringUtils.isNotBlank(member.getDdId())){
+            dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
+                    member.getDdId(),
+                    dingTalk.getHiddenDangerNoticeMsg(hiddenDanger));
+        }
+
     }
 
 
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 d197518..0cdc384 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,5 +1,14 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.druid.sql.visitor.functions.Concat;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.JkKeysMapper;
+import com.doumee.dao.business.model.Cars;
+import com.doumee.dao.business.model.JkCabinet;
+import com.doumee.dao.business.model.JkKeys;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.JkCabinetGridMapper;
@@ -10,11 +19,17 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.doumee.service.business.third.model.PageWrap;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃Service瀹炵幇
@@ -26,6 +41,9 @@
 
     @Autowired
     private JkCabinetGridMapper jkCabinetGridMapper;
+
+    @Autowired
+    private JkKeysMapper jkKeysMapper;
 
     @Override
     public Integer create(JkCabinetGrid jkCabinetGrid) {
@@ -87,57 +105,25 @@
     @Override
     public PageData<JkCabinetGrid> findPage(PageWrap<JkCabinetGrid> pageWrap) {
         IPage<JkCabinetGrid> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<JkCabinetGrid> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getId, pageWrap.getModel().getId());
+        JkCabinetGrid model = pageWrap.getModel();
+        MPJLambdaWrapper<JkCabinetGrid> wrapper = new MPJLambdaWrapper<JkCabinetGrid>()
+                .selectAll(JkCabinetGrid.class)
+                .selectAs(JkCabinet::getName,JkCabinetGrid::getCabinetName)
+                .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetGrid::getCabinetId)
+                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
+                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(Objects.nonNull(model.getCabinetId()),JkCabinetGrid::getCabinetId,model.getCabinetId())
+                .eq(Objects.nonNull(model.getStatus()),JkCabinetGrid::getStatus,model.getStatus())
+                .isNull(Objects.nonNull(model.getBindStatus())&&Constants.equalsInteger(model.getBindStatus(),Constants.ZERO),JkCabinetGrid::getKeyId)
+                .isNotNull(Objects.nonNull(model.getBindStatus())&&Constants.equalsInteger(model.getBindStatus(),Constants.ONE),JkCabinetGrid::getKeyId)
+                .like(StringUtils.isNotBlank(model.getKeyCode()),JkKeys::getCode,model.getKeyCode());
+        IPage<JkCabinetGrid> iPage = jkCabinetGridMapper.selectJoinPage(page,JkCabinetGrid.class,wrapper);
+        for (JkCabinetGrid jkCabinetGrid:iPage.getRecords()) {
+            jkCabinetGrid.setBindStatus(Objects.isNull(jkCabinetGrid.getKeyId())?Constants.ZERO:Constants.ONE);
         }
-        if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getCreator, pageWrap.getModel().getCreator());
-        }
-        if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(JkCabinetGrid::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(JkCabinetGrid::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
-        }
-        if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getEditor, pageWrap.getModel().getEditor());
-        }
-        if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(JkCabinetGrid::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(JkCabinetGrid::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
-        }
-        if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getIsdeleted, pageWrap.getModel().getIsdeleted());
-        }
-        if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getInfo, pageWrap.getModel().getInfo());
-        }
-        if (pageWrap.getModel().getCabinetId() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getCabinetId, pageWrap.getModel().getCabinetId());
-        }
-        if (pageWrap.getModel().getCode() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getCode, pageWrap.getModel().getCode());
-        }
-        if (pageWrap.getModel().getKeyId() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getKeyId, pageWrap.getModel().getKeyId());
-        }
-        if (pageWrap.getModel().getSerialNo() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getSerialNo, pageWrap.getModel().getSerialNo());
-        }
-        if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getStatus, pageWrap.getModel().getStatus());
-        }
-        if (pageWrap.getModel().getWorkingStatus() != null) {
-            queryWrapper.lambda().eq(JkCabinetGrid::getWorkingStatus, pageWrap.getModel().getWorkingStatus());
-        }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(jkCabinetGridMapper.selectPage(page, queryWrapper));
+        return PageData.from(iPage);
     }
 
     @Override
@@ -145,4 +131,93 @@
         QueryWrapper<JkCabinetGrid> wrapper = new QueryWrapper<>(jkCabinetGrid);
         return jkCabinetGridMapper.selectCount(wrapper);
     }
+
+    @Override
+    public void bindingKeys(JkCabinetGrid jkCabinetGrid){
+        if(Objects.isNull(jkCabinetGrid)
+        || Objects.isNull(jkCabinetGrid.getId())
+        || Objects.isNull(jkCabinetGrid.getKeyId())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        JkCabinetGrid model = jkCabinetGridMapper.selectById(jkCabinetGrid.getId());
+        if(Objects.isNull(model)|| Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(Objects.nonNull(model.getKeyId())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"宸茬粦瀹氾紝璇峰嬁閲嶅缁戝畾");
+        }
+        JkKeys keysModel = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
+        if(Objects.isNull(keysModel)|| Constants.equalsInteger(keysModel.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!Constants.equalsInteger(keysModel.getStatus(), (Constants.ZERO))){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵宸茶缁戝畾锛岃閫夋嫨鍏朵粬閽ュ寵缁戝畾");
+        }
+        //鏇存柊閽ュ寵鏌滀俊鎭�
+        jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
+                .set(JkCabinetGrid::getKeyId,jkCabinetGrid.getKeyId())
+                .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
+                .eq(JkCabinetGrid::getId,jkCabinetGrid.getId()));
+        //鏍囪閽ュ寵淇℃伅
+        jkKeysMapper.update(new UpdateWrapper<JkKeys>().lambda()
+                .set(JkKeys::getStatus,Constants.ONE)
+                .eq(JkKeys::getId,jkCabinetGrid.getKeyId())
+        );
+    }
+
+
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void unBindKeys(List<Integer> idList){
+        if(CollectionUtils.isEmpty(idList)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(idList.size()==Constants.ONE){
+            JkCabinetGrid model = jkCabinetGridMapper.selectById(idList.get(Constants.ZERO));
+            if(Objects.isNull(model)|| Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
+                throw new BusinessException(ResponseStatus.DATA_EMPTY);
+            }
+            if(Objects.isNull(model.getKeyId())){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠瑙勬牸鏈粦瀹氶挜鍖欙紝璇峰埛鏂版煡鐪�");
+            }else{
+                //鏇存柊閽ュ寵鏌滀俊鎭�
+                jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
+                        .set(JkCabinetGrid::getKeyId,null)
+                        .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
+                        .eq(JkCabinetGrid::getId,model.getId()));
+                JkKeys keysModel = jkKeysMapper.selectById(model.getKeyId());
+                if(Objects.nonNull(keysModel) && !Constants.equalsInteger(keysModel.getStatus(),Constants.ZERO)){
+                    jkKeysMapper.update(new UpdateWrapper<JkKeys>().lambda()
+                            .set(JkKeys::getStatus,Constants.ZERO)
+                            .eq(JkKeys::getId,keysModel.getId())
+                    );
+                }
+            }
+        }else{
+            List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda()
+                            .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                            .isNotNull(JkCabinetGrid::getKeyId)
+                    .in(JkCabinetGrid::getId,idList));
+            if(CollectionUtils.isNotEmpty(jkCabinetGridList)){
+                jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
+                        .set(JkCabinetGrid::getKeyId,null)
+                        .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
+                        .eq(JkCabinetGrid::getId,jkCabinetGridList.stream().map(i->i.getId()).collect(Collectors.toList())));
+                List<Integer> keyIdList = jkCabinetGridList.stream().filter(i->Objects.nonNull(i.getKeyId())).map(i->i.getKeyId()).collect(Collectors.toList());
+                if(CollectionUtils.isNotEmpty(keyIdList)){
+                    jkKeysMapper.update(new UpdateWrapper<JkKeys>().lambda()
+                            .set(JkKeys::getStatus,Constants.ZERO)
+                            .in(JkKeys::getId,keyIdList)
+                    );
+                }
+
+            }
+        }
+    }
+
+
+
+
+
 }
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 bb3b8da..4b57d27 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
@@ -89,6 +89,9 @@
         IPage<JkCabinetLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<JkCabinetLog> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        JkCabinetLog model = pageWrap.getModel();
+
+
         if (pageWrap.getModel().getId() != null) {
             queryWrapper.lambda().eq(JkCabinetLog::getId, pageWrap.getModel().getId());
         }
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 be0bceb..36b38ff 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
@@ -1,5 +1,14 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.JkCabinetGridMapper;
+import com.doumee.dao.business.JkKeysMapper;
+import com.doumee.dao.business.model.JkCabinetGrid;
+import com.doumee.dao.business.model.JkKeys;
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Utils;
@@ -10,11 +19,15 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 閽ュ寵鏌滃熀鏈俊鎭〃Service瀹炵幇
@@ -27,15 +40,118 @@
     @Autowired
     private JkCabinetMapper jkCabinetMapper;
 
+    @Autowired
+    private JkCabinetGridMapper jkCabinetGridMapper;
+
+    @Autowired
+    private JkKeysMapper jkKeysMapper;
+
     @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public Integer create(JkCabinet jkCabinet) {
+        if(Objects.isNull(jkCabinet)
+            || StringUtils.isBlank(jkCabinet.getCode())
+            || StringUtils.isBlank(jkCabinet.getName())
+            || StringUtils.isBlank(jkCabinet.getDevId())
+            || StringUtils.isBlank(jkCabinet.getLinkAddr())
+            || StringUtils.isBlank(jkCabinet.getCode())
+
+            || Objects.isNull(jkCabinet.getPort())
+            || CollectionUtils.isEmpty(jkCabinet.getManagerIdList())
+            || CollectionUtils.isEmpty(jkCabinet.getAuthMemberIdList())
+            || Objects.isNull(jkCabinet.getDoubleAuth())
+
+            || Objects.isNull(jkCabinet.getRowNum())
+            || jkCabinet.getRowNum() <= Constants.ZERO
+            || Objects.isNull(jkCabinet.getColumnNum())
+            || jkCabinet.getColumnNum() <= Constants.ZERO
+            || Objects.isNull(jkCabinet.getNoType())
+            || Objects.isNull(jkCabinet.getSortType())
+            || (
+                Constants.equalsInteger(jkCabinet.getNoType(),Constants.ONE)
+                && ( Objects.isNull(jkCabinet.getNoIndex()) || Objects.isNull(jkCabinet.getNoLength()) || StringUtils.isBlank(jkCabinet.getNoPrefix()) )
+                )
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鏌ヨ缂栧彿鏄惁閲嶅
+        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().eq(JkCabinet::getCode,jkCabinet.getCode()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵鏌滆澶囩紪鍙峰凡瀛樺湪锛�");
+        }
+        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().eq(JkCabinet::getDevId,jkCabinet.getDevId()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵鏌滆澶嘔D宸插瓨鍦紒");
+        }
+        LoginUserInfo loginUserInfo = jkCabinet.getLoginUserInfo();
+        jkCabinet.setCreateDate(new Date());
+        jkCabinet.setEditDate(jkCabinet.getCreateDate());
+        jkCabinet.setCreator(loginUserInfo.getId());
+        jkCabinet.setEditor(loginUserInfo.getId());
+        jkCabinet.setIsdeleted(Constants.ZERO);
+        jkCabinet.setStatus(Constants.ZERO);
+        jkCabinet.setRunStatus(Constants.ONE);
+        if(StringUtils.isNotBlank(jkCabinet.getJwd())&&jkCabinet.getJwd().split(",").length>Constants.ONE){
+            jkCabinet.setLongitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ZERO]));
+            jkCabinet.setLatitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ONE]));
+        }
+        jkCabinet.setManagerId(String.join(",",jkCabinet.getManagerIdList()));
+        jkCabinet.setAuthMemberId(String.join(",",jkCabinet.getAuthMemberIdList()));
         jkCabinetMapper.insert(jkCabinet);
+        this.createGrid(jkCabinet);
         return jkCabinet.getId();
+    }
+
+
+    public void createGrid(JkCabinet jkCabinet){
+        LoginUserInfo loginUserInfo = jkCabinet.getLoginUserInfo();
+        Integer startNo =  Constants.equalsInteger(jkCabinet.getNoType(),Constants.ZERO)?1:jkCabinet.getNoIndex() ;
+        List<JkCabinetGrid> jkCabinetGridList = new ArrayList<>();
+        Integer maxNum = jkCabinet.getRowNum() * jkCabinet.getColumnNum();
+        for (int i = 0; i < maxNum; i++) {
+            JkCabinetGrid grid = new JkCabinetGrid();
+            grid.setCreateDate(new Date());
+            grid.setEditDate(jkCabinet.getCreateDate());
+            grid.setCreator(loginUserInfo.getId());
+            grid.setEditor(loginUserInfo.getId());
+            grid.setIsdeleted(Constants.ZERO);
+            grid.setStatus(Constants.ZERO);
+            grid.setCabinetId(jkCabinet.getId());
+            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"));
+            }
+
+            jkCabinetGridList.add(grid);
+            startNo = startNo + 1;
+        }
+        jkCabinetGridMapper.insert(jkCabinetGridList);
     }
 
     @Override
     public void deleteById(Integer id) {
-        jkCabinetMapper.deleteById(id);
+        JkCabinet jkCabinet = jkCabinetMapper.selectById(id);
+        if(Constants.equalsInteger(jkCabinet.getStatus(),Constants.ZERO)){
+           throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炵鐢ㄦ暟鎹紝鏃犳硶杩涜鍒犻櫎");
+        }
+        //鏌ヨ閽ュ寵鏌滀笅鐨勬煖鏍间俊鎭�
+        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,jkCabinet.getId())
+        );
+        if(Objects.nonNull(jkCabinetGridList)){
+            jkCabinetGridMapper.update(null,new UpdateWrapper<JkCabinetGrid>().lambda().set(JkCabinetGrid::getIsdeleted,Constants.ONE)
+                    .in(JkCabinetGrid::getId,jkCabinetGridList.stream().map(i->i.getId()).collect(Collectors.toList()))
+            );
+            List<Integer> keyIdList = jkCabinetGridList.stream().filter(i->Objects.nonNull(i.getKeyId())).map(i->i.getKeyId()).collect(Collectors.toList());
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(keyIdList)){
+                jkKeysMapper.update(null,new UpdateWrapper<JkKeys>().lambda()
+                        .set(JkKeys::getStatus,Constants.ZERO)
+                        .in(JkKeys::getId,keyIdList)
+                );
+            }
+        }
+        jkCabinetMapper.update(null,new UpdateWrapper<JkCabinet>().lambda()
+                .set(JkCabinet::getIsdeleted,Constants.ONE)
+                .eq(JkCabinet::getId,jkCabinet.getId()));
     }
 
     @Override
@@ -54,8 +170,59 @@
 
     @Override
     public void updateById(JkCabinet jkCabinet) {
+        if(Objects.isNull(jkCabinet)
+                || Objects.isNull(jkCabinet.getId())
+                || StringUtils.isBlank(jkCabinet.getCode())
+                || StringUtils.isBlank(jkCabinet.getName())
+                || StringUtils.isBlank(jkCabinet.getDevId())
+                || StringUtils.isBlank(jkCabinet.getLinkAddr())
+                || StringUtils.isBlank(jkCabinet.getCode())
+                || CollectionUtils.isEmpty(jkCabinet.getManagerIdList())
+                || CollectionUtils.isEmpty(jkCabinet.getAuthMemberIdList())
+                || Objects.isNull(jkCabinet.getPort())
+                || Objects.isNull(jkCabinet.getDoubleAuth())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        jkCabinet.setRowNum(null);
+        jkCabinet.setColumnNum(null);
+        jkCabinet.setSortType(null);
+        jkCabinet.setNoType(null);
+        jkCabinet.setNoIndex(null);
+        jkCabinet.setNoLength(null);
+        jkCabinet.setNoPrefix(null);
+        //鏌ヨ缂栧彿鏄惁閲嶅
+        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().ne(JkCabinet::getId,jkCabinet.getId()).eq(JkCabinet::getCode,jkCabinet.getCode()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵鏌滆澶囩紪鍙峰凡瀛樺湪锛�");
+        }
+        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().ne(JkCabinet::getId,jkCabinet.getId()).eq(JkCabinet::getDevId,jkCabinet.getDevId()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵鏌滆澶嘔D宸插瓨鍦紒");
+        }
+        LoginUserInfo loginUserInfo = jkCabinet.getLoginUserInfo();
+        jkCabinet.setEditDate(new Date());
+        jkCabinet.setEditor(loginUserInfo.getId());
+        if(StringUtils.isNotBlank(jkCabinet.getJwd())&&jkCabinet.getJwd().split(",").length>Constants.ONE){
+            jkCabinet.setLongitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ZERO]));
+            jkCabinet.setLatitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ONE]));
+        }
+        jkCabinet.setManagerId(String.join(",",jkCabinet.getManagerIdList()));
+        jkCabinet.setAuthMemberId(String.join(",",jkCabinet.getAuthMemberIdList()));
         jkCabinetMapper.updateById(jkCabinet);
     }
+
+    @Override
+    public void updateStatusById(JkCabinet jkCabinet) {
+        if(Objects.isNull(jkCabinet)
+        || Objects.isNull(jkCabinet.getId())
+        || Objects.isNull(jkCabinet.getStatus())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        jkCabinetMapper.update(null,new UpdateWrapper<JkCabinet>()
+                .lambda().set(JkCabinet::getStatus,jkCabinet.getStatus())
+                .set(JkCabinet::getEditDate, DateUtil.getCurrDateTime())
+                .eq(JkCabinet::getId,jkCabinet.getId()));
+    }
+
 
     @Override
     public void updateByIdInBatch(List<JkCabinet> jkCabinets) {
@@ -72,6 +239,18 @@
         return jkCabinetMapper.selectById(id);
     }
 
+
+    @Override
+    public JkCabinet getDetail(Integer id){
+        JkCabinet jkCabinet = jkCabinetMapper.selectById(id);
+        if(Objects.nonNull(jkCabinet.getLongitude())
+            && Objects.nonNull(jkCabinet.getLatitude())){
+            jkCabinet.setJwd(jkCabinet.getLongitude() + "," + jkCabinet.getLatitude());
+        }
+        jkCabinet.setGridNum(jkCabinet.getColumnNum()*jkCabinet.getRowNum());
+        return jkCabinet;
+    }
+
     @Override
     public JkCabinet findOne(JkCabinet jkCabinet) {
         QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
@@ -80,6 +259,8 @@
 
     @Override
     public List<JkCabinet> findList(JkCabinet jkCabinet) {
+        jkCabinet.setIsdeleted(Constants.ZERO);
+        jkCabinet.setStatus(Constants.ZERO);
         QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
         return jkCabinetMapper.selectList(wrapper);
     }
@@ -87,103 +268,20 @@
     @Override
     public PageData<JkCabinet> findPage(PageWrap<JkCabinet> pageWrap) {
         IPage<JkCabinet> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<JkCabinet> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getId, pageWrap.getModel().getId());
+        JkCabinet model = pageWrap.getModel();
+        IPage<JkCabinet> iPage = jkCabinetMapper.selectPage(page, new QueryWrapper<JkCabinet>()
+                .lambda()
+                .eq(JkCabinet::getIsdeleted,Constants.ZERO)
+                .like(StringUtils.isNotBlank(model.getName()),JkCabinet::getName, model.getName())
+                .like(StringUtils.isNotBlank(model.getCode()),JkCabinet::getCode, model.getCode())
+                .eq(Objects.nonNull(model.getStatus()),JkCabinet::getStatus, model.getStatus())
+                .eq(Objects.nonNull(model.getRunStatus()),JkCabinet::getRunStatus, model.getRunStatus())
+        );
+        for (JkCabinet jkCabinet:iPage.getRecords()) {
+            jkCabinet.setGridNum(jkCabinet.getColumnNum()*jkCabinet.getRowNum());
         }
-        if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getCreator, pageWrap.getModel().getCreator());
-        }
-        if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(JkCabinet::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(JkCabinet::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
-        }
-        if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getEditor, pageWrap.getModel().getEditor());
-        }
-        if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(JkCabinet::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(JkCabinet::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
-        }
-        if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getIsdeleted, pageWrap.getModel().getIsdeleted());
-        }
-        if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getInfo, pageWrap.getModel().getInfo());
-        }
-        if (pageWrap.getModel().getCode() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getCode, pageWrap.getModel().getCode());
-        }
-        if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getName, pageWrap.getModel().getName());
-        }
-        if (pageWrap.getModel().getDevId() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getDevId, pageWrap.getModel().getDevId());
-        }
-        if (pageWrap.getModel().getSerialNo() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getSerialNo, pageWrap.getModel().getSerialNo());
-        }
-        if (pageWrap.getModel().getLinkAddr() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getLinkAddr, pageWrap.getModel().getLinkAddr());
-        }
-        if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getStatus, pageWrap.getModel().getStatus());
-        }
-        if (pageWrap.getModel().getPort() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getPort, pageWrap.getModel().getPort());
-        }
-        if (pageWrap.getModel().getManagerId() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getManagerId, pageWrap.getModel().getManagerId());
-        }
-        if (pageWrap.getModel().getUseTime() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getUseTime, pageWrap.getModel().getUseTime());
-        }
-        if (pageWrap.getModel().getDoubleAuth() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getDoubleAuth, pageWrap.getModel().getDoubleAuth());
-        }
-        if (pageWrap.getModel().getAuthMemberId() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getAuthMemberId, pageWrap.getModel().getAuthMemberId());
-        }
-        if (pageWrap.getModel().getRowNum() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getRowNum, pageWrap.getModel().getRowNum());
-        }
-        if (pageWrap.getModel().getColumnNum() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getColumnNum, pageWrap.getModel().getColumnNum());
-        }
-        if (pageWrap.getModel().getHaertTime() != null) {
-            queryWrapper.lambda().ge(JkCabinet::getHaertTime, Utils.Date.getStart(pageWrap.getModel().getHaertTime()));
-            queryWrapper.lambda().le(JkCabinet::getHaertTime, Utils.Date.getEnd(pageWrap.getModel().getHaertTime()));
-        }
-        if (pageWrap.getModel().getLocation() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getLocation, pageWrap.getModel().getLocation());
-        }
-        if (pageWrap.getModel().getLongitude() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getLongitude, pageWrap.getModel().getLongitude());
-        }
-        if (pageWrap.getModel().getLatitude() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getLatitude, pageWrap.getModel().getLatitude());
-        }
-        if (pageWrap.getModel().getNoType() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getNoType, pageWrap.getModel().getNoType());
-        }
-        if (pageWrap.getModel().getNoPrefix() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getNoPrefix, pageWrap.getModel().getNoPrefix());
-        }
-        if (pageWrap.getModel().getNoLength() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getNoLength, pageWrap.getModel().getNoLength());
-        }
-        if (pageWrap.getModel().getNoIndex() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getNoIndex, pageWrap.getModel().getNoIndex());
-        }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(jkCabinetMapper.selectPage(page, queryWrapper));
+        return PageData.from(iPage);
     }
 
     @Override
@@ -191,4 +289,11 @@
         QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
         return jkCabinetMapper.selectCount(wrapper);
     }
+
+
+
+
+
+
+
 }
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 dcb7279..e80144f 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
@@ -1,5 +1,13 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.CarsMapper;
+import com.doumee.dao.business.model.Cars;
+import com.doumee.dao.business.model.JkCabinet;
+import com.doumee.dao.business.model.JkCabinetGrid;
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Utils;
@@ -10,11 +18,16 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.interfaces.MPJBaseJoin;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 閽ュ寵鍩烘湰淇℃伅琛⊿ervice瀹炵幇
@@ -27,14 +40,55 @@
     @Autowired
     private JkKeysMapper jkKeysMapper;
 
+    @Autowired
+    private CarsMapper carsMapper;
+
     @Override
     public Integer create(JkKeys jkKeys) {
+        if(Objects.isNull(jkKeys)
+        || Objects.isNull(jkKeys.getCarId())
+        || Objects.isNull(jkKeys.getRoleType())
+        || StringUtils.isBlank(jkKeys.getCode())
+        || StringUtils.isBlank(jkKeys.getRfidLable())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鏌ヨ缂栧彿鏄惁閲嶅
+        if(jkKeysMapper.selectCount(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getCode,jkKeys.getCode()).eq(JkKeys::getIsdeleted,Constants.ZERO))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵缂栧彿宸插瓨鍦紒");
+        }
+        Cars cars = carsMapper.selectById(jkKeys.getCarId());
+        if(Objects.isNull(cars)||Constants.equalsInteger(cars.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"杞﹁締淇℃伅鏈煡璇㈠埌锛�");
+        }
+        JkKeys carsKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getCarId,jkKeys.getCarId()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
+        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"));
+        if(Objects.nonNull(rfidKeys)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠RFID鏍囩宸茶閽ュ寵["+rfidKeys.getCode()+"]浣跨敤锛�");
+        }
+        LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
+        jkKeys.setCreateDate(new Date());
+        jkKeys.setEditDate(jkKeys.getCreateDate());
+        jkKeys.setCreator(loginUserInfo.getId());
+        jkKeys.setEditor(loginUserInfo.getId());
+        jkKeys.setIsdeleted(Constants.ZERO);
+        jkKeys.setStatus(Constants.ZERO);
         jkKeysMapper.insert(jkKeys);
         return jkKeys.getId();
     }
 
     @Override
     public void deleteById(Integer id) {
+        JkKeys jkKeys = jkKeysMapper.selectById(id);
+        if(Objects.isNull(jkKeys)||Constants.equalsInteger(jkKeys.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽ュ寵宸茬粦瀹�,鏃犳硶杩涜鍒犻櫎");
+        }
         jkKeysMapper.deleteById(id);
     }
 
@@ -54,6 +108,34 @@
 
     @Override
     public void updateById(JkKeys jkKeys) {
+        if(Objects.isNull(jkKeys)
+                || Objects.isNull(jkKeys.getId())
+                || Objects.isNull(jkKeys.getCarId())
+                || Objects.isNull(jkKeys.getRoleType())
+                || StringUtils.isBlank(jkKeys.getCode())
+                || StringUtils.isBlank(jkKeys.getRfidLable())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鏌ヨ缂栧彿鏄惁閲嶅
+        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(),"閽ュ寵缂栧彿宸插瓨鍦紒");
+        }
+        Cars cars = carsMapper.selectById(jkKeys.getCarId());
+        if(Objects.isNull(cars)||Constants.equalsInteger(cars.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"杞﹁締淇℃伅鏈煡璇㈠埌锛�");
+        }
+        JkKeys carsKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getCarId,jkKeys.getCarId()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
+        if(Objects.nonNull(carsKeys)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠杞﹁締宸茶閽ュ寵["+carsKeys.getCode()+"]缁戝畾浣跨敤锛�");
+        }
+        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getRfidLable,jkKeys.getRfidLable()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
+        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());
         jkKeysMapper.updateById(jkKeys);
     }
 
@@ -89,57 +171,26 @@
         IPage<JkKeys> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<JkKeys> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(JkKeys::getId, pageWrap.getModel().getId());
+        JkKeys model = pageWrap.getModel();
+        MPJLambdaWrapper<JkKeys> wrapper = new MPJLambdaWrapper<JkKeys>()
+                .selectAll(JkKeys.class)
+                .selectAs(JkCabinetGrid::getCode,JkKeys::getGridCode)
+                .selectAs(JkCabinet::getName,JkKeys::getCabinetName)
+                .leftJoin(Cars.class,Cars::getId,JkKeys::getCarId)
+                .leftJoin(JkCabinetGrid.class,JkCabinetGrid::getKeyId,JkKeys::getId)
+                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetGrid::getCabinetId)
+                .eq(JkKeys::getIsdeleted,Constants.ZERO)
+                .like(StringUtils.isNotBlank(model.getCode()),JkKeys::getCode,model.getCode())
+                .like(StringUtils.isNotBlank(model.getCarCode()),JkKeys::getCarCode,model.getCode());
+        IPage<JkKeys> iPage = jkKeysMapper.selectJoinPage(page,JkKeys.class,wrapper);
+        for (JkKeys jkKeys:iPage.getRecords()) {
+            jkKeys.setIsBinding(StringUtils.isBlank(jkKeys.getGridCode())?Constants.ZERO:Constants.ONE);
         }
-        if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(JkKeys::getCreator, pageWrap.getModel().getCreator());
-        }
-        if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(JkKeys::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(JkKeys::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
-        }
-        if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(JkKeys::getEditor, pageWrap.getModel().getEditor());
-        }
-        if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(JkKeys::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(JkKeys::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
-        }
-        if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(JkKeys::getIsdeleted, pageWrap.getModel().getIsdeleted());
-        }
-        if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(JkKeys::getInfo, pageWrap.getModel().getInfo());
-        }
-        if (pageWrap.getModel().getCode() != null) {
-            queryWrapper.lambda().eq(JkKeys::getCode, pageWrap.getModel().getCode());
-        }
-        if (pageWrap.getModel().getCarCode() != null) {
-            queryWrapper.lambda().eq(JkKeys::getCarCode, pageWrap.getModel().getCarCode());
-        }
-        if (pageWrap.getModel().getCarId() != null) {
-            queryWrapper.lambda().eq(JkKeys::getCarId, pageWrap.getModel().getCarId());
-        }
-        if (pageWrap.getModel().getRfidLable() != null) {
-            queryWrapper.lambda().eq(JkKeys::getRfidLable, pageWrap.getModel().getRfidLable());
-        }
-        if (pageWrap.getModel().getRoleType() != null) {
-            queryWrapper.lambda().eq(JkKeys::getRoleType, pageWrap.getModel().getRoleType());
-        }
-        if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(JkKeys::getStatus, pageWrap.getModel().getStatus());
-        }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(jkKeysMapper.selectPage(page, queryWrapper));
+        return PageData.from(iPage);
     }
 
+
+
     @Override
     public long count(JkKeys jkKeys) {
         QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index bc1b948..40f62c5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -2491,7 +2491,7 @@
         if(Objects.nonNull(deptIdList)){
             List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().lambda().in(Company::getErpId,deptIdList)
                     .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
-//                    .isNotNull(Company::getHkId) 鏆傛椂鏃犳硶鍚屾寮�鑸� 鍏堟敞閲�
+//                    .isNotNull(Company::getHkId) 鏆傛椂鏃犳硶鍚屾娴峰悍 鍏堟敞閲�
             );
             if(CollectionUtils.isNotEmpty(companyList)){
                 member.setHkOrgId(companyList.get(Constants.ZERO).getHkId());

--
Gitblit v1.9.3