From d5397923196daf2c54f00e927492261d66e1feb2 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期六, 11 十月 2025 18:19:34 +0800
Subject: [PATCH] 钥匙柜开发

---
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java             |   25 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/AdminCabinetVO.java                 |   27 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java     |   90 +++++++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java                |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java        |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/CloseGridDTO.java                  |   31 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetGridInfoVO.java              |   50 ++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java          |   40 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java                |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/GetDriverGridDTO.java              |   24 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java |  284 ++++++++++++++++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetDetailVO.java                |   53 ++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java               |   15 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java                    |   24 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java              |   18 +
 15 files changed, 682 insertions(+), 13 deletions(-)

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 b32f626..b814911 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
@@ -5,6 +5,7 @@
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.JkCabinet;
 import com.doumee.dao.business.model.JkKeys;
 import com.doumee.service.business.JkKeysService;
 import com.doumee.service.business.third.model.ApiResponse;
@@ -77,6 +78,14 @@
         return ApiResponse.success(jkKeysService.findPage(pageWrap));
     }
 
+    @ApiOperation("鍒楄〃鏌ヨ")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:jkkeys:query")
+    public ApiResponse<List<JkKeys>> findList (@RequestBody JkKeys jkKeys, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(jkKeysService.findList(jkKeys));
+    }
+
+
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkkeys:exportExcel")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/CloseGridDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/CloseGridDTO.java
new file mode 100644
index 0000000..d48db4c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/CloseGridDTO.java
@@ -0,0 +1,31 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.service.business.third.model.LoginUserModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/10/11 16:01
+ */
+@Data
+public class CloseGridDTO{
+
+    @ApiModelProperty(value = "閽ュ寵鏌滀富閿�")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱 2绠$悊鍛樻搷浣�")
+    private Integer authType;
+
+    @ApiModelProperty(value = "鏌滄牸涓婚敭")
+    private Integer gridId;
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "閽ュ寵鐘舵�侊細1鍦ㄤ綅 2鍊熷嚭")
+    private Integer keyStatus;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/GetDriverGridDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/GetDriverGridDTO.java
new file mode 100644
index 0000000..6b63c22
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/GetDriverGridDTO.java
@@ -0,0 +1,24 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.service.business.third.model.LoginUserModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/10/11 16:01
+ */
+@Data
+public class GetDriverGridDTO{
+
+    @ApiModelProperty(value = "閽ュ寵鏌滀富閿�")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "0=鍙� 1=杩�")
+    private Integer type;
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭")
+    private Integer memberId;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
new file mode 100644
index 0000000..2f76d84
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.service.business.third.model.LoginUserModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/10/11 16:01
+ */
+@Data
+public class OpenGridDriverDTO extends LoginUserModel {
+
+    @ApiModelProperty(value = "閽ュ寵鏌滀富閿�")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱")
+    private Integer authType;
+
+    @ApiModelProperty(value = "鏌滄牸涓婚敭")
+    private Integer gridId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
new file mode 100644
index 0000000..64db8b0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
@@ -0,0 +1,24 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.service.business.third.model.LoginUserModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/10/11 16:01
+ */
+@Data
+public class OptGridDTO extends LoginUserModel {
+
+    @ApiModelProperty(value = "閽ュ寵鏌滀富閿�")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "鏌滄牸涓婚敭鍒楄〃")
+    private List<Integer> gridIdList;
+
+}
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 b4d4302..84cb250 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
@@ -86,8 +86,6 @@
     private String channelCode;
 
 
-
-
     @ApiModelProperty(value = "缁戝畾鐘舵�� 0鏈粦瀹氾紱1宸茬粦瀹�", example = "1")
     @TableField(exist = false)
     private Integer bindStatus;
@@ -99,4 +97,17 @@
     @ApiModelProperty(value = "閽ュ寵缂栫爜", example = "1")
     @TableField(exist = false)
     private String keyCode;
+
+    @ApiModelProperty(value = "杞︾墝鍙�", example = "1")
+    @TableField(exist = false)
+    private String carCode;
+
+    @ApiModelProperty(value = "杞﹁締涓婚敭", example = "1")
+    @TableField(exist = false)
+    private Integer carId;
+
+    @ApiModelProperty(value = "閽ュ寵鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭 3缁翠慨淇濆吇", example = "1")
+    @TableField(exist = false)
+    private Integer keyStatus;
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
index 81db5e1..91d1265 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
@@ -77,6 +77,9 @@
     @ExcelColumn(name="鐘舵��",index = 6,width = 10,valueMapping = "0=鎴愬姛;1=澶辫触;")
     private Integer status;
 
+    @ApiModelProperty(value = "鎿嶄綔绫诲瀷锛�0=寮�闂�;1=鍏抽棬;", example = "1")
+    private Integer type;
+
     @ApiModelProperty(value = "鎿嶄綔浜洪儴闂�", example = "1",hidden = true)
     @TableField(exist = false)
     private String companyName;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/AdminCabinetVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/AdminCabinetVO.java
new file mode 100644
index 0000000..5b54199
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/AdminCabinetVO.java
@@ -0,0 +1,27 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/5/23 14:56
+ */
+@Data
+public class AdminCabinetVO {
+
+    @ApiModelProperty(value = "璁惧涓婚敭锛堢郴缁熷唴锛�")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private String devId;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetDetailVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetDetailVO.java
new file mode 100644
index 0000000..618ffb5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetDetailVO.java
@@ -0,0 +1,53 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/5/23 14:56
+ */
+@Data
+public class CabinetDetailVO {
+
+    @ApiModelProperty(value = "璁惧涓婚敭锛堢郴缁熷唴锛�")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private String devId;
+
+    @ApiModelProperty(value = "鏌滄牸鎬绘暟")
+    private Integer gridNum;
+
+    @ApiModelProperty(value = "鍦ㄤ綅閽ュ寵鏁�")
+    private Integer onlineKeyNum;
+
+    @ApiModelProperty(value = "鍊熷嚭閽ュ寵鏁�")
+    private Integer outKeyNum;
+
+    @ApiModelProperty(value = "缁翠慨淇濆吇閽ュ寵鏁�")
+    private Integer serviceKeyNum;
+
+    @ApiModelProperty(value = "鏁呴殰鏌滀綋鏁伴噺")
+    private Integer errGridNum;
+
+    @ApiModelProperty(value = "鏈粦瀹氭煖浣撴暟閲�")
+    private Integer unBindGridNum;
+
+    @ApiModelProperty(value = "鏌滄牸淇℃伅")
+    private List<CabinetGridInfoVO> cabinetGridInfoVOList;
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetGridInfoVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetGridInfoVO.java
new file mode 100644
index 0000000..9045686
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetGridInfoVO.java
@@ -0,0 +1,50 @@
+package com.doumee.dao.business.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/5/23 14:56
+ */
+@Data
+public class CabinetGridInfoVO {
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "缂栫爜")
+    private String code;
+
+    @ApiModelProperty(value = "閽ュ寵缂栫爜锛堝叧鑱攋k_keys)", example = "1")
+    private Integer keyId;
+
+    @ApiModelProperty(value = "鏌滀綋杩愯鐘舵�� 0姝e父 1鏁呴殰 ", example = "1")
+    private Integer workingStatus;
+
+    @ApiModelProperty(value = "缁戝畾鐘舵�� 0鏈粦瀹氾紱1宸茬粦瀹�", example = "1")
+    private Integer bindStatus;
+
+    @ApiModelProperty(value = "閽ュ寵鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭 3缁翠慨淇濆吇", example = "1")
+    private Integer keyStatus;
+
+    @ApiModelProperty(value = "鏉垮彿")
+    private String boardCode;
+
+    @ApiModelProperty(value = "閫氶亾鍙�")
+    private String channelCode;
+
+    @ApiModelProperty(value = "杞︾墝鍙�", example = "1")
+    private String carCode;
+
+
+}
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 f08d092..eee512d 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,6 +1,11 @@
 package com.doumee.service.business;
 
+import com.doumee.dao.business.dto.OptGridDTO;
+import com.doumee.dao.business.dto.CloseGridDTO;
+import com.doumee.dao.business.dto.GetDriverGridDTO;
+import com.doumee.dao.business.dto.OpenGridDriverDTO;
 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;
 
@@ -99,4 +104,39 @@
     void updateStatusById(JkCabinetGrid jkCabinetGrid);
 
     void unBindKeys(List<Integer> idList);
+
+    /**
+     * 鏍囪鏌滄牸鏁呴殰
+     * @param loginUserInfo
+     * @param cabinetId
+     * @param gridIdList
+     */
+    void markFault(OptGridDTO dto);
+
+    /**
+     * 鏍囪鏌滄牸姝e父
+     * @param loginUserInfo
+     * @param cabinetId
+     * @param gridIdList
+     */
+    void cancelFault(OptGridDTO dto);
+
+    /**
+     * 鎵归噺寮�闂� - 绠$悊鍛�
+     */
+    void batchOpenGridAdmin(OptGridDTO dto);
+    /**
+     * 鏍囪缁翠慨淇濆吇 - 绠$悊鍛�
+     * @param loginUserInfo
+     * @param cabinetId
+     * @param gridIdList
+     */
+    void markRepair(OptGridDTO dto);
+
+    void closeGrid(CloseGridDTO dto);
+
+    List<JkCabinetGrid> getDriverGrid(GetDriverGridDTO getDriverGridDTO);
+
+    void openGridDriver(OpenGridDriverDTO openGridDriverDTO);
+
 }
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 c11b9c5..95caaf0 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
@@ -1,6 +1,9 @@
 package com.doumee.service.business;
 
+import com.doumee.dao.business.vo.AdminCabinetVO;
 import com.doumee.dao.business.vo.CabinetConfigDataVO;
+import com.doumee.dao.business.vo.CabinetDetailVO;
+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.dao.business.model.JkCabinet;
@@ -102,4 +105,19 @@
     CabinetConfigDataVO getCabinetConfigDataVO();
 
     void updCabinetConfig(CabinetConfigDataVO cabinetConfigDataVO);
+
+
+    /**
+     * 閽ュ寵鏌滅鐞嗗憳 鑾峰彇鍙鐞嗙殑閽ュ寵鏌滃垪琛�
+     * @param loginUserInfo
+     * @return
+     */
+    List<AdminCabinetVO> getAdminCabinetInfo(LoginUserInfo loginUserInfo);
+
+    /**
+     * 鑾峰彇閽ュ寵鏌滆鎯�
+     * @param cabinetId
+     * @return
+     */
+    CabinetDetailVO getCabinetDetail(Integer cabinetId);
 }
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 4cc4c61..28633c9 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,26 +1,24 @@
 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.dao.business.*;
+import com.doumee.dao.business.dto.OptGridDTO;
+import com.doumee.dao.business.dto.CloseGridDTO;
+import com.doumee.dao.business.dto.GetDriverGridDTO;
+import com.doumee.dao.business.dto.OpenGridDriverDTO;
+import com.doumee.dao.business.model.*;
 import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.JkCabinetGridMapper;
-import com.doumee.dao.business.model.JkCabinetGrid;
 import com.doumee.service.business.JkCabinetGridService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.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;
@@ -28,8 +26,7 @@
 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.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +42,13 @@
 
     @Autowired
     private JkKeysMapper jkKeysMapper;
+
+    @Autowired
+    private JkCabinetMapper jkCabinetMapper;
+    @Autowired
+    private JkCabinetLogMapper jkCabinetLogMapper;
+
+
 
     @Override
     public Integer create(JkCabinetGrid jkCabinetGrid) {
@@ -237,7 +241,267 @@
     }
 
 
+    /**
+     * 鏍囪鏁呴殰
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void markFault(OptGridDTO dto){
+        if(Objects.isNull(dto)
+                || Objects.isNull(dto.getCabinetId())
+                || CollectionUtils.isEmpty(dto.getGridIdList())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getWorkingStatus,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+                .in(JkCabinetGrid::getId,dto.getGridIdList())
+        );
+        if(CollectionUtils.isEmpty(jkCabinetGridList)){
+            return;
+        }
+        LoginUserInfo loginUserInfo = dto.getLoginUserInfo();
+        for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
+            jkCabinetGrid.setEditor(loginUserInfo.getId());
+            jkCabinetGrid.setEditDate(new Date());
+            jkCabinetGrid.setWorkingStatus(Constants.ONE);
+            jkCabinetGridMapper.updateById(jkCabinetGrid);
+        }
+    }
+
+    /**
+     * 鏍囪缁翠慨淇濆吇
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void markRepair(OptGridDTO dto){
+        if(Objects.isNull(dto)
+                || Objects.isNull(dto.getCabinetId())
+                || CollectionUtils.isEmpty(dto.getGridIdList())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
+                new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
+                        .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                        .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
+                        .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
+                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
+                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkKeys::getStatus,Constants.ONE)
+                .eq(JkCabinetGrid::getWorkingStatus,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+                .isNotNull(JkCabinetGrid::getKeyId)
+                .in(JkCabinetGrid::getId,dto.getGridIdList())
+        );
+        if(CollectionUtils.isEmpty(jkCabinetGridList)){
+            return;
+        }
+        for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
+            jkKeysMapper.update(null,new UpdateWrapper<JkKeys>().lambda()
+                    .set(JkKeys::getEditDate,DateUtil.getCurrDateTime())
+                    .set(JkKeys::getStatus,Constants.TWO)
+                    .eq(JkKeys::getId,jkCabinetGrid.getKeyId())
+            );
+        }
+    }
 
 
+    /**
+     * 鍙栨秷鏁呴殰
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void cancelFault(OptGridDTO dto){
+        if(Objects.isNull(dto)
+                || Objects.isNull(dto.getCabinetId())
+                || CollectionUtils.isEmpty(dto.getGridIdList())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getWorkingStatus,Constants.ONE)
+                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+                .in(JkCabinetGrid::getId,dto.getGridIdList())
+        );
+        if(CollectionUtils.isEmpty(jkCabinetGridList)){
+            return;
+        }
+        LoginUserInfo loginUserInfo = dto.getLoginUserInfo();
+        for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
+            jkCabinetGrid.setEditor(loginUserInfo.getId());
+            jkCabinetGrid.setEditDate(new Date());
+            jkCabinetGrid.setWorkingStatus(Constants.ZERO);
+            jkCabinetGridMapper.updateById(jkCabinetGrid);
+        }
+    }
+
+
+    /**
+     * 璁惧绠$悊鍛樻壒閲忓紑閿�
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void batchOpenGridAdmin(OptGridDTO dto){
+        if(Objects.isNull(dto)
+        || Objects.isNull(dto.getCabinetId())
+        || CollectionUtils.isEmpty(dto.getGridIdList())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+                .in(JkCabinetGrid::getId,dto.getGridIdList())
+        );
+        if(CollectionUtils.isEmpty(jkCabinetGridList)){
+            return;
+        }
+        LoginUserInfo loginUserInfo = dto.getLoginUserInfo();
+        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(jkCabinetGridList)){
+            List<JkCabinetLog> jkCabinetLogs = new ArrayList<>();
+            for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
+                JkCabinetLog jkCabinetLog = new JkCabinetLog();
+                jkCabinetLog.setCreateDate(new Date());
+                jkCabinetLog.setCreator(loginUserInfo.getId());
+                jkCabinetLog.setIsdeleted(Constants.ZERO);
+                jkCabinetLog.setCabinetId(dto.getCabinetId());
+                jkCabinetLog.setGridId(jkCabinetGrid.getId());
+                jkCabinetLog.setAuthType(Constants.TWO);
+                jkCabinetLog.setMemberId(loginUserInfo.getMemberId());
+                if(Objects.nonNull(jkCabinetGrid.getKeyId())){
+                    JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
+                    if(Objects.nonNull(jkKeys)){
+                        if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
+                            jkCabinetLog.setCarId(jkKeys.getCarId());
+                            jkCabinetLog.setKeyInfo(jkKeys.getCarCode() + "_" + jkKeys.getCode() );
+                        }
+                        jkCabinetLog.setRoleType(jkKeys.getRoleType());
+                    }
+                }
+                jkCabinetLog.setType(Constants.ZERO);
+                jkCabinetLogs.add(jkCabinetLog);
+            }
+            jkCabinetLogMapper.insert(jkCabinetLogs);
+        }
+    }
+
+
+    /**
+     * 閽ュ寵鏌滃叧闂�
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void closeGrid(CloseGridDTO dto){
+        if(Objects.isNull(dto)
+            || Objects.isNull(dto.getGridId())
+            || Objects.isNull(dto.getCabinetId())
+            || Objects.isNull(dto.getKeyStatus())
+            || Objects.isNull(dto.getAuthType())
+            || Objects.isNull(dto.getMemberId())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        JkCabinetGrid jkCabinetGrid = jkCabinetGridMapper.selectOne(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+                .eq(JkCabinetGrid::getId,dto.getGridId())
+                .last(" limit 1 ")
+        );
+        if(Objects.isNull(jkCabinetGrid)){
+            return;
+        }
+        JkCabinetLog jkCabinetLog = new JkCabinetLog();
+        jkCabinetLog.setCreateDate(new Date());
+        jkCabinetLog.setIsdeleted(Constants.ZERO);
+        jkCabinetLog.setCabinetId(dto.getCabinetId());
+        jkCabinetLog.setGridId(jkCabinetGrid.getId());
+        jkCabinetLog.setAuthType(dto.getAuthType());
+        jkCabinetLog.setMemberId(dto.getMemberId());
+        if(Objects.nonNull(jkCabinetGrid.getKeyId())){
+            //鍙湁閽ュ寵鏌滅粦瀹氫簡閽ュ寵淇℃伅 鎵嶄細鏇存柊閽ュ寵鐨勪俊鎭�
+            JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
+            if(Objects.nonNull(jkKeys)){
+                if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
+                    jkCabinetLog.setCarId(jkKeys.getCarId());
+                    jkCabinetLog.setKeyInfo(jkKeys.getCarCode() + "_" + jkKeys.getCode() );
+                }
+                jkCabinetLog.setRoleType(jkKeys.getRoleType());
+                //閽ュ寵鐘舵�佷笌褰撳墠鎿嶄綔鐘舵�佷笉涓�鑷达紝鍒欒繘琛屾洿鏂伴挜鍖欑姸鎬�
+                if(!Constants.equalsInteger(jkKeys.getStatus(),dto.getKeyStatus())){
+                    jkKeysMapper.update(null,new UpdateWrapper<JkKeys>().lambda()
+                            .set(JkKeys::getEditDate,DateUtil.getCurrDateTime())
+                            .set(JkKeys::getStatus,dto.getKeyStatus())
+                            .eq(JkKeys::getId,jkKeys.getId())
+                    );
+                }
+            }
+        }
+        jkCabinetLog.setType(Constants.ONE);
+        jkCabinetLogMapper.insert(jkCabinetLog);
+    }
+
+
+    /**
+     * 鍙告満鑾峰彇鍙搷浣滅殑閽ュ寵鏌滄煖鏍�
+     */
+    @Override
+    public List<JkCabinetGrid> getDriverGrid(GetDriverGridDTO dto){
+        if(Objects.isNull(dto.getCabinetId())
+            || Objects.isNull(dto.getCabinetId())
+            || Objects.isNull(dto.getMemberId())
+            || Objects.isNull(dto.getType())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
+                new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
+                        .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
+                        .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
+                        .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
+                        .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
+                        .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                        .eq(JkCabinetGrid::getWorkingStatus,Constants.ZERO)
+                        .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
+                        .in(Constants.equalsInteger(dto.getType(),Constants.ONE),JkKeys::getStatus,Constants.TWO,Constants.THREE)
+                        .in(Constants.equalsInteger(dto.getType(),Constants.ZERO),JkKeys::getStatus,Constants.ONE)
+                        .isNotNull(JkCabinetGrid::getKeyId)
+                        .apply(" t1.car_id in ( select c.CAR_ID from car_driver c left join cars c1 on c.car_id = c1.id  where c.ISDELETED = 0 and c.TYPE != 0 and   c.MEMBER_ID = "+dto.getMemberId()+" ) ")
+        );
+        return jkCabinetGridList;
+    }
+
+
+    /**
+     * 鍙告満寮�鍚煖鏍�
+     * @param openGridDriverDTO
+     */
+    @Override
+    public void openGridDriver(OpenGridDriverDTO openGridDriverDTO){
+        JkCabinetGrid jkCabinetGrid = jkCabinetGridMapper.selectOne(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,openGridDriverDTO.getCabinetId())
+                .eq(JkCabinetGrid::getId,openGridDriverDTO.getGridId())
+                .last(" limit 1 ")
+        );
+        if(Objects.isNull(jkCabinetGrid)){
+            return;
+        }
+        LoginUserInfo loginUserInfo = openGridDriverDTO.getLoginUserInfo();
+        List<JkCabinetLog> jkCabinetLogs = new ArrayList<>();
+        JkCabinetLog jkCabinetLog = new JkCabinetLog();
+        jkCabinetLog.setCreateDate(new Date());
+        jkCabinetLog.setCreator(loginUserInfo.getId());
+        jkCabinetLog.setIsdeleted(Constants.ZERO);
+        jkCabinetLog.setCabinetId(openGridDriverDTO.getCabinetId());
+        jkCabinetLog.setGridId(jkCabinetGrid.getId());
+        jkCabinetLog.setAuthType(openGridDriverDTO.getAuthType());
+        jkCabinetLog.setMemberId(loginUserInfo.getMemberId());
+        jkCabinetLog.setType(Constants.ZERO);
+        if(Objects.nonNull(jkCabinetGrid.getKeyId())){
+            JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
+            if(Objects.nonNull(jkKeys)){
+                if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
+                    jkCabinetLog.setCarId(jkKeys.getCarId());
+                    jkCabinetLog.setKeyInfo(jkKeys.getCarCode() + "_" + jkKeys.getCode() );
+                }
+                jkCabinetLog.setRoleType(jkKeys.getRoleType());
+            }
+        }
+        jkCabinetLogMapper.insert(jkCabinetLogs);
+    }
 
 }
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 6f1c80b..161d43f 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,6 @@
 package com.doumee.service.business.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
@@ -9,7 +10,10 @@
 import com.doumee.dao.business.JkKeysMapper;
 import com.doumee.dao.business.model.JkCabinetGrid;
 import com.doumee.dao.business.model.JkKeys;
+import com.doumee.dao.business.vo.AdminCabinetVO;
 import com.doumee.dao.business.vo.CabinetConfigDataVO;
+import com.doumee.dao.business.vo.CabinetDetailVO;
+import com.doumee.dao.business.vo.CabinetGridInfoVO;
 import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
@@ -22,11 +26,14 @@
 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.wrapper.MPJLambdaWrapper;
+import lombok.extern.java.Log;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -340,8 +347,89 @@
             systemDictData.setCode(cabinetConfigDataVO.getThreshold());
             systemDictDataBiz.updateByIdNew(systemDictData);
         }
+    }
 
 
+
+
+    @Override
+    public List<AdminCabinetVO> getAdminCabinetInfo(LoginUserInfo loginUserInfo){
+        List<AdminCabinetVO> adminCabinetVOList = new ArrayList<>();
+        List<JkCabinet> jkCabinetList = jkCabinetMapper.selectList(new QueryWrapper<JkCabinet>()
+                .lambda()
+                .eq(JkCabinet::getIsdeleted,Constants.ZERO)
+                .apply(" FIND_IN_SET("+loginUserInfo.getId()+",MANAGER_ID) ")
+                .orderByAsc(JkCabinet::getCreateDate)
+        );
+        if(CollectionUtils.isNotEmpty(jkCabinetList)){
+            for (JkCabinet jkCabinet:jkCabinetList) {
+                AdminCabinetVO adminCabinetVO = new AdminCabinetVO();
+                BeanUtil.copyProperties(jkCabinet,adminCabinetVO);
+                adminCabinetVOList.add(adminCabinetVO);
+            }
+        }
+        return adminCabinetVOList;
+    }
+
+
+    @Override
+    public CabinetDetailVO getCabinetDetail(Integer cabinetId){
+        CabinetDetailVO cabinetDetailVO = new CabinetDetailVO();
+        JkCabinet cabinet = jkCabinetMapper.selectOne(new QueryWrapper<JkCabinet>()
+                .lambda()
+                .eq(JkCabinet::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinet::getId,cabinetId)
+                .last(" limit 1")
+        );
+        if(Objects.isNull(cabinet)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌閽ュ寵鏌滀俊鎭�");
+        }
+        BeanUtil.copyProperties(cabinet,cabinetDetailVO);
+        cabinetDetailVO.setGridNum(Constants.ZERO);
+        cabinetDetailVO.setErrGridNum(Constants.ZERO);
+        cabinetDetailVO.setOnlineKeyNum(Constants.ZERO);
+        cabinetDetailVO.setServiceKeyNum(Constants.ZERO);
+        cabinetDetailVO.setOutKeyNum(Constants.ZERO);
+        cabinetDetailVO.setUnBindGridNum(Constants.ZERO);
+
+        //鎵�鏈夋煖鏍间俊鎭�
+        List<JkCabinetGrid> jkCabinetGridList =
+                jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class, new MPJLambdaWrapper<JkCabinetGrid>()
+                .selectAll(JkCabinetGrid.class)
+                .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
+                .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
+                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
+                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
+                .eq(JkCabinetGrid::getCabinetId,cabinet.getId())
+                .orderByDesc(JkCabinetGrid::getCode)
+        );
+
+        List<CabinetGridInfoVO> cabinetGridInfoVOList = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(jkCabinetGridList)){
+            cabinetDetailVO.setGridNum(jkCabinetGridList.size());
+            for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
+                CabinetGridInfoVO cabinetGridInfoVO = new CabinetGridInfoVO();
+                BeanUtil.copyProperties(jkCabinetGrid,cabinetGridInfoVO);
+                cabinetGridInfoVO.setBindStatus(Objects.isNull(jkCabinetGrid.getKeyId())?Constants.ZERO:Constants.ONE);
+                cabinetGridInfoVOList.add(cabinetGridInfoVO);
+            }
+            cabinetDetailVO.setErrGridNum(
+                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getWorkingStatus(),Constants.ONE)).collect(Collectors.toList()).size()
+            );
+            cabinetDetailVO.setOnlineKeyNum(
+                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getKeyStatus(),Constants.ONE)).collect(Collectors.toList()).size()
+            );
+            cabinetDetailVO.setOutKeyNum(
+                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getKeyStatus(),Constants.TWO)).collect(Collectors.toList()).size()
+            );
+            cabinetDetailVO.setServiceKeyNum(
+                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getKeyStatus(),Constants.THREE)).collect(Collectors.toList()).size()
+            );
+            cabinetDetailVO.setUnBindGridNum(
+                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getBindStatus(),Constants.ZERO)).collect(Collectors.toList()).size()
+            );
+        }
+        return cabinetDetailVO;
     }
 
 
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 713869d..d2b5382 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
@@ -164,6 +164,8 @@
 
     @Override
     public List<JkKeys> findList(JkKeys jkKeys) {
+        jkKeys.setIsdeleted(Constants.ZERO);
+        jkKeys.setStatus(Constants.ZERO);
         QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
         return jkKeysMapper.selectList(wrapper);
     }

--
Gitblit v1.9.3