车车 2 сар өмнө
parent
commit
88ac70e30d
72 өөрчлөгдсөн 3352 нэмэгдсэн , 194 устгасан
  1. 3 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/exceptionmisplace/vo/ExceptionMisplaceRespVO.java
  2. 6 5
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/exceptionmisplace/vo/ExceptionMisplaceSaveReqVO.java
  3. 188 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/HardwareMaterialApiController.java
  4. 31 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/AutoReplaceMaterialVO.java
  5. 33 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/AutoReplaceReportVO.java
  6. 42 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetCheckVO.java
  7. 29 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetHomePageVO.java
  8. 39 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetMaterialVO.java
  9. 27 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetMaterialsVO.java
  10. 45 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CheckMaterialsDateVO.java
  11. 29 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CheckProgressVO.java
  12. 30 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CheckStandardVO.java
  13. 36 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/ExMaterialTypeVO.java
  14. 36 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/InstructionVO.java
  15. 28 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/MaterialsCheckInitVO.java
  16. 45 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/MaterialsCheckVO.java
  17. 33 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/MaterialsHomeVO.java
  18. 2 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsloan/MaterialsLoanController.java
  19. 10 4
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsplancabinet/vo/MaterialsPlanCabinetPageReqVO.java
  20. 11 5
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsplancabinet/vo/MaterialsPlanCabinetRespVO.java
  21. 9 5
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsplancabinet/vo/MaterialsPlanCabinetSaveReqVO.java
  22. 22 24
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialstype/MaterialsTypeController.java
  23. 28 5
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialstype/vo/MaterialsTypeRespVO.java
  24. 15 10
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/cabinetopenrecord/CabinetOpenRecordDO.java
  25. 13 9
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/exceptionmisplace/ExceptionMisplaceDO.java
  26. 10 12
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/mailsendtaskitem/MailSendTaskItemDO.java
  27. 20 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materials/MaterialsDO.java
  28. 8 8
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialschangerecord/MaterialsChangeRecordDO.java
  29. 2 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialscheckplan/MaterialsCheckPlanDO.java
  30. 23 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialscheckrecord/MaterialsCheckRecordDO.java
  31. 12 16
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialsloan/MaterialsLoanDO.java
  32. 8 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialsplancabinet/MaterialsPlanCabinetDO.java
  33. 27 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/AddLoanDTO.java
  34. 27 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/AutoChangeDTO.java
  35. 23 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/CabinetRfidListDTO.java
  36. 22 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/CheckParamDTO.java
  37. 37 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/CheckRecordDTO.java
  38. 22 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/OpenTimeoutDTO.java
  39. 26 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/RecRetMaterialDTO.java
  40. 22 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/RecRetParamDTO.java
  41. 49 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReplaceMaterialDTO.java
  42. 20 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReplaceMaterialParamDTO.java
  43. 28 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReplaceMaterialsDTO.java
  44. 26 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReturnLoanDTO.java
  45. 20 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/RfidListDTO.java
  46. 25 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/SignDTO.java
  47. 23 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/StartCheckPlanDTO.java
  48. 21 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/SubmitPlanDTO.java
  49. 5 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materials/MaterialsMapper.java
  50. 4 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materialscheckrecord/MaterialsCheckRecordMapper.java
  51. 5 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materialsloan/MaterialsLoanMapper.java
  52. 12 4
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materialstype/MaterialsTypeMapper.java
  53. 179 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/hardwareapi/HardwareMaterialApiService.java
  54. 1299 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/hardwareapi/HardwareMaterialApiServiceImpl.java
  55. 6 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materials/MaterialsService.java
  56. 11 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materials/MaterialsServiceImpl.java
  57. 2 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscabinet/MaterialsCabinetService.java
  58. 10 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscabinet/MaterialsCabinetServiceImpl.java
  59. 2 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialschangerecord/MaterialsChangeRecordServiceImpl.java
  60. 3 1
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckplan/MaterialsCheckPlanServiceImpl.java
  61. 3 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckrecord/MaterialsCheckRecordService.java
  62. 9 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckrecord/MaterialsCheckRecordServiceImpl.java
  63. 17 1
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsloan/MaterialsLoanService.java
  64. 278 6
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsloan/MaterialsLoanServiceImpl.java
  65. 67 63
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsplancabinet/MaterialsPlanCabinetService.java
  66. 74 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsplancabinet/MaterialsPlanCabinetServiceImpl.java
  67. 8 6
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialstype/MaterialsTypeService.java
  68. 3 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialstype/MaterialsTypeServiceImpl.java
  69. 17 0
      yudao-module-iscs/src/main/resources/mapper/MaterialsCheckRecordMapper.xml
  70. 13 0
      yudao-module-iscs/src/main/resources/mapper/MaterialsLoanMapper.xml
  71. 19 0
      yudao-module-iscs/src/main/resources/mapper/MaterialsMapper.xml
  72. 15 0
      yudao-module-iscs/src/main/resources/mapper/MaterialsTypeMapper.xml

+ 3 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/exceptionmisplace/vo/ExceptionMisplaceRespVO.java

@@ -22,6 +22,9 @@ public class ExceptionMisplaceRespVO {
     @ExcelProperty("物资ID")
     private Long materialsId;
 
+    @Schema(description = "物资RFID")
+    private String materialsRfid;
+
     @Schema(description = "物资")
     private String materialsName;
 

+ 6 - 5
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/exceptionmisplace/vo/ExceptionMisplaceSaveReqVO.java

@@ -1,10 +1,8 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.exceptionmisplace.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import jakarta.validation.constraints.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
+
 import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 物资归还异常新增/修改 Request VO")
@@ -17,6 +15,9 @@ public class ExceptionMisplaceSaveReqVO {
     @Schema(description = "物资ID", example = "30106")
     private Long materialsId;
 
+    @Schema(description = "物资RFID")
+    private String materialsRfid;
+
     @Schema(description = "出借主键ID", example = "13436")
     private Long materialsLoanId;
 
@@ -44,4 +45,4 @@ public class ExceptionMisplaceSaveReqVO {
     @Schema(description = "异常类型(字典exception_type)", example = "2")
     private String exceptionType;
 
-}
+}

+ 188 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/HardwareMaterialApiController.java

@@ -0,0 +1,188 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.*;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.cabinetopenrecord.CabinetOpenRecordDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.*;
+import cn.iocoder.yudao.module.iscs.service.hardwareapi.HardwareMaterialApiService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 硬件调用接口
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Tag(name = "管理后台 - 硬件物资调用接口")
+@RestController
+@Validated
+@RequestMapping("/iscs/hardware/material-api")
+public class HardwareMaterialApiController {
+    @Autowired
+    private HardwareMaterialApiService hardwareMaterialApiService;
+
+    // ----------------------------------手动更换物资-------------------------------------------------------
+    @Operation(summary = "获取物资柜手动更换物资类型和异常数量和物资信息")
+    @Parameter(name = "cabinetId / cabinetCode", description = "物资柜ID / 物资柜code")
+    @GetMapping(value = "/selectExMaterialTypeById")
+    public CommonResult<List<ExMaterialTypeVO>> selectExMaterialTypeById(Long cabinetId, String cabinetCode) throws JsonProcessingException {
+        return CommonResult.success(hardwareMaterialApiService.selectExMaterialTypeById(cabinetId, cabinetCode));
+    }
+
+
+    @Operation(summary = "手动更换物资-校验后的提交")
+    @PostMapping("/insertCheckedRecord")
+    public CommonResult<Boolean> insertCheckedRecord(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") ReplaceMaterialParamDTO dto) throws JsonProcessingException {
+        return CommonResult.success(hardwareMaterialApiService.insertCheckedRecord(dto));
+    }
+
+    @Operation(summary = "手动更换物资")
+    @PostMapping("/insertReplaceRecord")
+    public CommonResult<Boolean> insertReplaceRecord(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") ReplaceMaterialParamDTO dto) throws JsonProcessingException {
+        return CommonResult.success(hardwareMaterialApiService.insertReplaceRecord(dto));
+    }
+
+    @Operation(summary = "手动更换物资-实体操作")
+    @PostMapping("/updateMaterialsReplace")
+    public CommonResult<Boolean> updateMaterialsReplace(@RequestBody @Parameter(name = "dto", description = "修改数据类,放到body") ReplaceMaterialsDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.updateMaterialsReplace(dto));
+    }
+
+
+    // ----------------------------------物资柜开门异常-------------------------------------------------------
+
+    @Operation(summary = "新增物资柜开门超时异常")
+    @PostMapping("/insertCabinetOpenTimeout")
+    public CommonResult<Boolean> insertCabinetOpenTimeout(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") OpenTimeoutDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.insertCabinetOpenTimeout(dto));
+    }
+
+    @Operation(summary = "解除柜开门超时异常")
+    @PostMapping("/updateCabinetOpenTimeout")
+    public CommonResult<Boolean> updateCabinetOpenTimeout(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") OpenTimeoutDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.updateCabinetOpenTimeout(dto));
+    }
+
+    // ----------------------------------物资柜开门记录-------------------------------------------------------
+
+    @Operation(summary = "新增物资柜开门记录")
+    @PostMapping("/insertCabinetOpenRecord")
+    public CommonResult<Boolean> insertCabinetOpenRecord(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") CabinetOpenRecordDO dto) {
+        return CommonResult.success(hardwareMaterialApiService.insertCabinetOpenRecord(dto));
+    }
+
+    @Operation(summary = "物资柜关门")
+    @PostMapping("/updateCabinetClose")
+    public CommonResult<Boolean> updateCabinetClose(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") CabinetOpenRecordDO dto) {
+        return CommonResult.success(hardwareMaterialApiService.updateCabinetClose(dto));
+    }
+
+    // ----------------------------------物资取还-------------------------------------------------------
+    @Operation(summary = "获取物资柜物品分类及分类下物资数量和列表")
+    @Parameter(name = "cabinetId / cabinetCode", description = "物资柜ID / 物资柜CODE")
+    @GetMapping(value = "/selectMaterialsByCabinetId")
+    public CommonResult<List<CabinetMaterialVO>> selectMaterialsByCabinetId(Long cabinetId, String cabinetCode) throws JsonProcessingException {
+        return CommonResult.success(hardwareMaterialApiService.selectMaterialsByCabinetId(cabinetId, cabinetCode));
+    }
+
+    @Operation(summary = "通过RFID获取物资信息")
+    @Parameter(name = "rfid", description = "物资rfid")
+    @GetMapping(value = "/selectMaterialByRfid")
+    public CommonResult<MaterialsDO> selectMaterialByRfid(String rfid) {
+        return CommonResult.success(hardwareMaterialApiService.selectMaterialByRfid(rfid));
+    }
+
+    @Operation(summary = "通过RFID列表获取批量物资信息")
+    @Parameter(name = "list", description = "物资rfid列表")
+    @PostMapping(value = "/selectMaterialsByRfidList")
+    public CommonResult<List<MaterialsDO>> selectMaterialsByRfidList(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") RfidListDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.selectMaterialsByRfidList(dto));
+    }
+
+    @Operation(summary = "RFID所属柜子区分")
+    @Parameter(name = "list", description = "物资rfid列表")
+    @PostMapping(value = "/selectCabinetMaterials")
+    public CommonResult<CabinetMaterialsVO> selectCabinetMaterials(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") CabinetRfidListDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.selectCabinetMaterials(dto));
+    }
+
+    // ----------------------------------主界面-------------------------------------------------------
+    @Operation(summary = "主界面")
+    @Parameter(name = "cabinetCode", description = "物资柜CODE")
+    @GetMapping("/getCabinetHomePage")
+    public CommonResult<CabinetHomePageVO> getCabinetHomePage(String cabinetCode) {
+        CabinetHomePageVO result = hardwareMaterialApiService.getCabinetHomePage(cabinetCode);
+        return CommonResult.success(result);
+    }
+
+    // ----------------------------------物资使用说明-------------------------------------------------------
+    @Operation(summary = "查询物资使用说明")
+    @GetMapping("/getInstructionsList")
+    public CommonResult<List<InstructionVO>> getInstructionsList() {
+        List<InstructionVO> result = hardwareMaterialApiService.getInstructionsList();
+        return CommonResult.success(result);
+    }
+
+    // ----------------------------------物资检查计划-------------------------------------------------------
+    @Operation(summary = "在某个柜子上我的最近一次物资检查计划")
+    @Parameter(name = "cabinetCode", description = "物资柜CODE")
+    @GetMapping("/getLastCheckPlanByCabinetCode")
+    public CommonResult<CabinetCheckVO> getLastCheckPlanByCabinetCode(String cabinetCode) {
+        CabinetCheckVO result = hardwareMaterialApiService.getLastCheckPlanByCabinetCode(cabinetCode);
+        return CommonResult.success(result);
+    }
+
+    @Operation(summary = "物资检查表")
+    @Parameters({
+            @Parameter(name = "cabinetCode", description = "物资柜CODE"),
+            @Parameter(name = "planId", description = "物资计划id")}
+    )
+    @GetMapping("/getCheckMaterialsByCabinetCode")
+    public CommonResult<MaterialsCheckInitVO> getCheckMaterialsByCabinetCode(String cabinetCode, Long planId) {
+        MaterialsCheckInitVO result = hardwareMaterialApiService.getCheckMaterialsByCabinetCode(cabinetCode, planId);
+        return CommonResult.success(result);
+    }
+
+    @Operation(summary = "开始检查")
+    @PostMapping("/startCheckPlan")
+    public CommonResult<Boolean> startCheckPlan(@RequestBody @Parameter(name = "dto", description = "放到body") StartCheckPlanDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.startCheckPlan(dto));
+    }
+
+    @Operation(summary = "提交物资检查记录")
+    @PostMapping("/insertCheckRecord")
+    public CommonResult<Boolean> insertCheckRecord(@RequestBody @Parameter(name = "dto", description = "放到body") CheckParamDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.insertCheckRecord(dto));
+    }
+
+    @Operation(summary = "最终提交物资检查记录")
+    @PostMapping("/insertSubmitPlan")
+    public CommonResult<Boolean> insertSubmitPlan(@RequestBody @Parameter(name = "dto", description = "放到body") SubmitPlanDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.insertSubmitPlan(dto));
+    }
+
+    @Operation(summary = "检查签名")
+    @PostMapping("/insertSign")
+    public CommonResult<Boolean> insertSign(@RequestBody @Parameter(name = "dto", description = "放到body") SignDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.insertSign(dto));
+    }
+
+
+    // ----------------------------------自动更换-------------------------------------------------------
+    @Operation(summary = "自动更换")
+    @PostMapping("/insertAutoChange")
+    public CommonResult<AutoReplaceReportVO> insertAutoChange(@RequestBody @Parameter(name = "dto", description = "数据类,放到body") AutoChangeDTO dto) {
+        return CommonResult.success(hardwareMaterialApiService.insertAutoChange(dto));
+    }
+
+}

+ 31 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/AutoReplaceMaterialVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 物资更换记录对象 is_materials_change_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class AutoReplaceMaterialVO
+{
+
+    @Schema(description = "物资名称")
+    private String materialsName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "物资RFID")
+    private String materialsRfid;
+
+    @Schema(description = "物资状态(字典material_info_status)")
+    private String status;
+
+}

+ 33 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/AutoReplaceReportVO.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 物资更换记录对象 is_materials_change_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class AutoReplaceReportVO
+{
+
+    @JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+
+    @Schema(description = "用户名称")
+    private String nikeName;
+
+    @Schema(description = "放入物资")
+    private List<AutoReplaceMaterialVO> bindingList;
+
+    @Schema(description = "取出物资")
+    private List<AutoReplaceMaterialVO> unbindingList;
+
+}

+ 42 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetCheckVO.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CabinetCheckVO {
+
+    @Schema(description = "物资计划id")
+    private Long planId;
+
+    @Schema(description = "计划名称")
+    private String planName;
+
+    @Schema(description = "计划日期")
+    @JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd")
+    private Date planDate;
+
+    @Schema(description = "检查状态(0代表未开始,1代表已完成, 2代表进行中)")
+    private Integer status;
+
+    @Schema(description = "签名图片")
+    private String signatureImg;
+
+    @Schema(description = "签名时间")
+    @JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date signatureTime;
+
+    @Schema(description = "物资类型分类检查结果")
+    private List<MaterialsCheckVO> list;
+
+}

+ 29 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetHomePageVO.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CabinetHomePageVO {
+
+    @Schema(description = "物资取还数量")
+    private Integer rarNumber;
+
+    @Schema(description = "物资检查数量")
+    private Integer checkNumber;
+
+    @Schema(description = "物资更换数量")
+    private Integer changeNumber;
+
+    @Schema(description = "物资类型分类数据")
+    private List<MaterialsHomeVO> list;
+
+}

+ 39 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetMaterialVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.MaterialsRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CabinetMaterialVO {
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "物资数量")
+    private Integer number;
+
+    @Schema(description = "可借数量")
+    private Integer borrowableNumber;
+
+    @Schema(description = "物资列表(该物资柜所有物资)")
+    private List<MaterialsRespVO> materials;
+
+}

+ 27 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CabinetMaterialsVO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscabinet.MaterialsCabinetDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CabinetMaterialsVO {
+
+    @Schema(description = "柜子信息")
+    private MaterialsCabinetDO isMaterialsCabinet;
+
+    @Schema(description = "当前物资柜子物资RFID")
+    private List<String> cabinetRfidList;
+
+    @Schema(description = "非当前物资柜子的系统内物资")
+    private List<String> notCabinetRfidList;
+
+}

+ 45 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CheckMaterialsDateVO.java

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CheckMaterialsDateVO {
+
+    @Schema(description = "物资柜ID")
+    private Long materialsCabinetId;
+
+    @Schema(description = "物资ID")
+    private Long materialsId;
+
+    @Schema(description = "物资名称")
+    private String materialsName;
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资RFID")
+    private String materialsRfid;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "物资状态(字典material_info_status)")
+    private String status;
+
+    @Schema(description = "物资检查标准")
+    private String checkStandard;
+
+}

+ 29 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CheckProgressVO.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CheckProgressVO {
+
+
+    @Schema(description = "待检查")
+    private Integer checkNum;
+
+    @Schema(description = "正常")
+    private Integer normalNum;
+
+    @Schema(description = "过期")
+    private Integer timeOutNum;
+
+    @Schema(description = "损坏")
+    private Integer badNum;
+
+
+}

+ 30 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/CheckStandardVO.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CheckStandardVO {
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资检查标准")
+    private String checkStandard;
+
+}

+ 36 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/ExMaterialTypeVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.MaterialsRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class ExMaterialTypeVO {
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "异常数量")
+    private Integer exNumber;
+
+    @Schema(description = "异常的物资")
+    private List<MaterialsRespVO> materials;
+
+}

+ 36 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/InstructionVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsinstructions.MaterialsInstructionsDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class InstructionVO {
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "统计数据")
+    private Integer number;
+
+    @Schema(description = "该类型下的物资使用说明")
+    private List<MaterialsInstructionsDO> instructions;
+
+}

+ 28 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/MaterialsCheckInitVO.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckrecord.MaterialsCheckRecordDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class MaterialsCheckInitVO {
+
+    @Schema(description = "物资检查数据")
+    private List<MaterialsCheckRecordDO> list;
+
+    @Schema(description = "物资检查标准")
+    private List<CheckStandardVO> standards;
+
+    @Schema(description = "下方统计")
+    private CheckProgressVO checkProgressVO;
+
+
+}

+ 45 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/MaterialsCheckVO.java

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class MaterialsCheckVO {
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "物资总数量")
+    private Integer allNumber;
+
+    @Schema(description = "借出数量")
+    private Integer loanNumber;
+
+    @Schema(description = "待检数量")
+    private Integer checkNumber;
+
+    @Schema(description = "正常数量")
+    private Integer normalNumber;
+
+    @Schema(description = "过期数量")
+    private Integer timeoutNumber;
+
+    @Schema(description = "损坏数量")
+    private Integer badNumber;
+
+}

+ 33 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/hardwareapi/hardwareMaterialApi/MaterialsHomeVO.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class MaterialsHomeVO {
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资类型名称")
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    private String materialsTypePicture;
+
+    @Schema(description = "物资总数量")
+    private Integer allNumber;
+
+    @Schema(description = "可借数量")
+    private Integer borrowableNumber;
+
+}

+ 2 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsloan/MaterialsLoanController.java

@@ -36,12 +36,12 @@ public class MaterialsLoanController {
     @Resource
     private MaterialsLoanService materialsLoanService;
 
-    @PostMapping("/insertMaterialsLoan")
+    /*@PostMapping("/insertMaterialsLoan")
     @Operation(summary = "创建物资借出")
     @PreAuthorize("@ss.hasPermission('iscs:materials-loan:create')")
     public CommonResult<Long> insertMaterialsLoan(@Valid @RequestBody MaterialsLoanSaveReqVO createReqVO) {
         return success(materialsLoanService.createMaterialsLoan(createReqVO));
-    }
+    }*/
 
     @PutMapping("/updateMaterialsLoan")
     @Operation(summary = "更新物资借出")

+ 10 - 4
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsplancabinet/vo/MaterialsPlanCabinetPageReqVO.java

@@ -1,10 +1,10 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo;
 
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
+
 import java.time.LocalDateTime;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -23,8 +23,14 @@ public class MaterialsPlanCabinetPageReqVO extends PageParam {
     @Schema(description = "是否提交(0-否 1-是)")
     private String submit;
 
+    @Schema(description = "检查状态(0代表未开始,1代表已完成 2.进行中)")
+    private String status;
+
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
-}
+    @Schema(description = "检察员")
+    private Long checkUserId;
+
+}

+ 11 - 5
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsplancabinet/vo/MaterialsPlanCabinetRespVO.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
+
 import java.time.LocalDateTime;
-import com.alibaba.excel.annotation.*;
 
 @Schema(description = "管理后台 - 物资检查计划关联物资柜 Response VO")
 @Data
@@ -32,8 +32,14 @@ public class MaterialsPlanCabinetRespVO {
     @ExcelProperty("是否提交(0-否 1-是)")
     private String submit;
 
+    @Schema(description = "检查状态(0代表未开始,1代表已完成 2.进行中)")
+    private String status;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
-}
+    @Schema(description = "检察员")
+    private Long checkUserId;
+
+}

+ 9 - 5
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialsplancabinet/vo/MaterialsPlanCabinetSaveReqVO.java

@@ -1,10 +1,8 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import jakarta.validation.constraints.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
+
 import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 物资检查计划关联物资柜新增/修改 Request VO")
@@ -26,4 +24,10 @@ public class MaterialsPlanCabinetSaveReqVO {
     @Schema(description = "是否提交(0-否 1-是)")
     private String submit;
 
-}
+    @Schema(description = "检查状态(0代表未开始,1代表已完成 2.进行中)")
+    private String status;
+
+    @Schema(description = "检察员")
+    private Long checkUserId;
+
+}

+ 22 - 24
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialstype/MaterialsTypeController.java

@@ -1,33 +1,31 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.materialstype;
 
-import org.springframework.web.bind.annotation.*;
-import jakarta.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Operation;
-
-import jakarta.validation.constraints.*;
-import jakarta.validation.*;
-import jakarta.servlet.http.*;
-import java.util.*;
-import java.io.IOException;
-
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-
-import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
-import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
-
-import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.*;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeSaveReqVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialstype.MaterialsTypeDO;
 import cn.iocoder.yudao.module.iscs.service.materialstype.MaterialsTypeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 物资类型")
 @RestController
@@ -67,8 +65,8 @@ public class MaterialsTypeController {
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('iscs:materials-type:query')")
     public CommonResult<MaterialsTypeRespVO> selectMaterialsTypeById(@RequestParam("id") Long id) {
-        MaterialsTypeDO materialsType = materialsTypeService.getMaterialsType(id);
-        return success(BeanUtils.toBean(materialsType, MaterialsTypeRespVO.class));
+        MaterialsTypeRespVO materialsType = materialsTypeService.getMaterialsType(id);
+        return success(materialsType);
     }
 
     @GetMapping("/getMaterialsTypePage")

+ 28 - 5
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialstype/vo/MaterialsTypeRespVO.java

@@ -1,11 +1,13 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
+
 import java.time.LocalDateTime;
-import com.alibaba.excel.annotation.*;
 
 @Schema(description = "管理后台 - 物资类型 Response VO")
 @Data
@@ -80,4 +82,25 @@ public class MaterialsTypeRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
-}
+
+    @Schema(description = "物资规则ID")
+    @TableId(type = IdType.AUTO)
+    private Long ruleId;
+
+    @Schema(description = "是否需要归还")
+    private Integer restitutionRequired;
+
+    @Schema(description = "是否归还原位")
+    private Integer restorationRequired;
+
+    @Schema(description = "出借时长")
+    private Integer loanDuration;
+
+    @Schema(description = "提醒时间")
+    private Integer reminderTime;
+
+    @Schema(description = "超时报警")
+    private Integer timeoutAlarm;
+
+
+}

+ 15 - 10
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/cabinetopenrecord/CabinetOpenRecordDO.java

@@ -1,13 +1,14 @@
 package cn.iocoder.yudao.module.iscs.dal.dataobject.cabinetopenrecord;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
 
 /**
  * 物资柜开关门记录 DO
@@ -40,15 +41,19 @@ public class CabinetOpenRecordDO extends BaseDO {
     /**
      * 开门时间
      */
-    private LocalDateTime openTime;
+    private Date openTime;
     /**
      * 关门时间
      */
-    private LocalDateTime closeTime;
+    private Date closeTime;
     /**
      * 开门人员
      */
     private String userId;
 
+    @Schema(description = "物资柜code")
+    @TableField(exist = false)
+    private String cabinetCode;
+
 
-}
+}

+ 13 - 9
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/exceptionmisplace/ExceptionMisplaceDO.java

@@ -1,13 +1,14 @@
 package cn.iocoder.yudao.module.iscs.dal.dataobject.exceptionmisplace;
 
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
+
 import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import java.util.Date;
 
 /**
  * 物资归还异常 DO
@@ -33,6 +34,9 @@ public class ExceptionMisplaceDO extends BaseDO {
      * 物资ID
      */
     private Long materialsId;
+
+    @Schema(description = "物资RFID")
+    private String materialsRfid;
     /**
      * 出借主键ID
      */
@@ -52,11 +56,11 @@ public class ExceptionMisplaceDO extends BaseDO {
     /**
      * 异常处理时间
      */
-    private LocalDateTime handleTime;
+    private Date handleTime;
     /**
      * 异常发生时间
      */
-    private LocalDateTime occurTime;
+    private Date occurTime;
     /**
      * 备注
      */
@@ -71,4 +75,4 @@ public class ExceptionMisplaceDO extends BaseDO {
     private String exceptionType;
 
 
-}
+}

+ 10 - 12
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/mailsendtaskitem/MailSendTaskItemDO.java

@@ -1,14 +1,12 @@
 package cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.util.Date;
 
 /**
  * 系统邮件任务 DO
@@ -49,11 +47,11 @@ public class MailSendTaskItemDO extends BaseDO {
     /**
      * 实际发送时间
      */
-    private LocalDateTime sendTime;
+    private Date sendTime;
     /**
      * 计划发送时间
      */
-    private LocalDateTime scheduledSendTime;
+    private Date scheduledSendTime;
     /**
      * 所属计划id
      */
@@ -69,11 +67,11 @@ public class MailSendTaskItemDO extends BaseDO {
     /**
      * 取消时间
      */
-    private LocalDateTime cancelTime;
+    private Date cancelTime;
     /**
      * 备注
      */
     private String remark;
 
 
-}
+}

+ 20 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materials/MaterialsDO.java

@@ -2,12 +2,14 @@ package cn.iocoder.yudao.module.iscs.dal.dataobject.materials;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
-import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 物资 DO
@@ -68,7 +70,7 @@ public class MaterialsDO extends BaseDO {
     /**
      * 有效期
      */
-    private LocalDate expirationDate;
+    private Date expirationDate;
     /**
      * 物资RFID
      */
@@ -98,5 +100,21 @@ public class MaterialsDO extends BaseDO {
      */
     private String status;
 
+    @Schema(description = "物资类型图标")
+    @TableField(exist = false)
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    @TableField(exist = false)
+    private String materialsTypePicture;
+
+    @Schema(description = "物资规格属性项")
+    @TableField(exist = false)
+    private String propertyIds;
+
+    @Schema(description = "最近借取人id")
+    @TableField(exist = false)
+    private Long loanUserId;
+
 
 }

+ 8 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialschangerecord/MaterialsChangeRecordDO.java

@@ -1,12 +1,12 @@
 package cn.iocoder.yudao.module.iscs.dal.dataobject.materialschangerecord;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.util.Date;
 
 /**
  * 物资更换记录 DO
@@ -55,7 +55,7 @@ public class MaterialsChangeRecordDO extends BaseDO {
     /**
      * 更换时间
      */
-    private LocalDateTime changeDate;
+    private Date changeDate;
     /**
      * 更换类型(0-手动更换 1-自动更换)
      */
@@ -70,4 +70,4 @@ public class MaterialsChangeRecordDO extends BaseDO {
     private String status;
 
 
-}
+}

+ 2 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialscheckplan/MaterialsCheckPlanDO.java

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
-import java.time.LocalDate;
+import java.util.Date;
 
 /**
  * 物资检查计划 DO
@@ -39,7 +39,7 @@ public class MaterialsCheckPlanDO extends BaseDO {
     /**
      * 计划日期
      */
-    private LocalDate planDate;
+    private Date planDate;
     /**
      * 检察员
      */

+ 23 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialscheckrecord/MaterialsCheckRecordDO.java

@@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckrecord;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.util.Date;
@@ -69,5 +71,26 @@ public class MaterialsCheckRecordDO extends BaseDO {
      */
     private String remark;
 
+    @Schema(description = "物资名称")
+    @TableField(exist = false)
+    private String materialsName;
+
+    @Schema(description = "物资类型名称")
+    @TableField(exist = false)
+    private String materialsTypeName;
+
+    @Schema(description = "物资类型图标")
+    @TableField(exist = false)
+    private String materialsTypeIcon;
+
+    @Schema(description = "物资类型缩略图")
+    @TableField(exist = false)
+    private String materialsTypePicture;
+
+    @Schema(description = "物资RFID")
+    @TableField(exist = false)
+    private String materialsRfid;
+
+
 
 }

+ 12 - 16
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialsloan/MaterialsLoanDO.java

@@ -1,16 +1,12 @@
 package cn.iocoder.yudao.module.iscs.dal.dataobject.materialsloan;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.util.Date;
 
 /**
  * 物资借出 DO
@@ -47,11 +43,11 @@ public class MaterialsLoanDO extends BaseDO {
     /**
      * 领取时间
      */
-    private LocalDateTime loanTime;
+    private Date loanTime;
     /**
      * 提醒时间
      */
-    private LocalDateTime reminderTime;
+    private Date reminderTime;
     /**
      * 归还人ID
      */
@@ -63,15 +59,15 @@ public class MaterialsLoanDO extends BaseDO {
     /**
      * 理应归还时间
      */
-    private LocalDateTime restitutionTime;
+    private Date restitutionTime;
     /**
      * 实际归还时间
      */
-    private LocalDateTime actualRestitutionTime;
+    private Date actualRestitutionTime;
     /**
      * 超时报警
      */
-    private LocalDateTime timeoutAlarm;
+    private Date timeoutAlarm;
     /**
      * 是否需要归还
      */
@@ -86,4 +82,4 @@ public class MaterialsLoanDO extends BaseDO {
     private String status;
 
 
-}
+}

+ 8 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/materialsplancabinet/MaterialsPlanCabinetDO.java

@@ -3,9 +3,10 @@ package cn.iocoder.yudao.module.iscs.dal.dataobject.materialsplancabinet;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
-import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 物资检查计划关联物资柜 DO
@@ -30,6 +31,9 @@ public class MaterialsPlanCabinetDO extends BaseDO {
      * 物资柜ID
      */
     private Long cabinetId;
+
+    @Schema(description = "检察员")
+    private Long checkUserId;
     /**
      * 签名图片
      */
@@ -37,11 +41,13 @@ public class MaterialsPlanCabinetDO extends BaseDO {
     /**
      * 签名时间
      */
-    private LocalDateTime signatureTime;
+    private Date signatureTime;
     /**
      * 是否提交(0-否 1-是)
      */
     private String submit;
 
+    @Schema(description = "检查状态(0代表未开始,1代表已完成 2.进行中)")
+    private String status;
 
 }

+ 27 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/AddLoanDTO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 物资借出对象 is_materials_loan
+ *
+ * @author cgj
+ * @date 2024-11-08
+ */
+@Data
+public class AddLoanDTO
+{
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "物资ID")
+    private Long materialsId;
+
+    @Schema(description = "materialsRfid")
+    private String materialsRfid;
+
+    @Schema(description = "领取人ID")
+    private Long loanUserId;
+
+}

+ 27 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/AutoChangeDTO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 手动更换
+ *
+ * @author cgj
+ * @date 2024-10-18
+ */
+@Data
+public class AutoChangeDTO
+{
+    @Schema(description = "物资柜CODE")
+    private String cabinetCode;
+
+    @Schema(description = "此次需要绑定的物资数据")
+    private List<String> bindingMaterialRfidList;
+
+    @Schema(description = "此次需要解绑的物资数据")
+    private List<String> unbindMaterialRfidList;
+
+
+}

+ 23 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/CabinetRfidListDTO.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class CabinetRfidListDTO {
+
+    @Schema(description = "cabinetCode")
+    private String cabinetCode;
+
+    @Schema(description = "RFID列表")
+    private List<String> list;
+
+}

+ 22 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/CheckParamDTO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckrecord.MaterialsCheckRecordDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 物资检查记录对象 is_materials_check_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class CheckParamDTO
+{
+
+    @Schema(description = "提交的物资检查清单")
+    private List<MaterialsCheckRecordDO> list;
+
+}

+ 37 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/CheckRecordDTO.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物资检查记录对象 is_materials_check_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@EqualsAndHashCode(callSuper = false)
+@Data
+public class CheckRecordDTO
+{
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "计划id")
+    private Long planId;
+
+    @Schema(description = "物资柜id")
+    private Long cabinetId;
+
+    @Schema(description = "物资id")
+    private Long materialsId;
+
+    @Schema(description = "检查记录状态(0-正常 1-异常)")
+    private String status;
+
+    @Schema(description = "异常原因")
+    private String reason;
+
+    @Schema(description = "措施")
+    private String measure;
+
+}

+ 22 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/OpenTimeoutDTO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class OpenTimeoutDTO
+{
+
+    @Schema(description = "物资柜柜ID")
+    private Long loanFromId;
+
+    @Schema(description = "物资柜柜code")
+    private String loanFromCode;
+
+}

+ 26 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/RecRetMaterialDTO.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 物资对象 is_materials
+ *
+ * @author cgj
+ * @date 2024-11-08
+ */
+@Data
+public class RecRetMaterialDTO
+{
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "物资rfid")
+    private String materialsRfid;
+
+    @Schema(description = "状态(0-借出 1-柜中)")
+    private String loanState;
+
+    @Schema(description = "归还柜code")
+    private String restitutionToCabinetCode;
+
+}

+ 22 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/RecRetParamDTO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 物资对象 is_materials
+ *
+ * @author cgj
+ * @date 2024-11-08
+ */
+@Data
+public class RecRetParamDTO
+{
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "操作的物资列表")
+    private List<RecRetMaterialDTO> list;
+
+}

+ 49 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReplaceMaterialDTO.java

@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 物资更换记录对象 is_materials_change_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class ReplaceMaterialDTO
+{
+    @Schema(description = "旧物资id")
+    private Long oldMaterialsId;
+
+    @Schema(description = "物资名称")
+    private String materialsName;
+
+    @Schema(description = "物资类型ID")
+    private Long materialsTypeId;
+
+    @Schema(description = "物资规格id")
+    private String propertiesValueId;
+
+    @Schema(description = "物资规格")
+    private String propertiesValue;
+
+    @Schema(description = "物资规格种类id")
+    private String propertiesPropertyId;
+
+    @Schema(description = "物资规格种类")
+    private String propertiesProperty;
+
+    @Schema(description = "物资RFID")
+    private String materialsRfid;
+
+    @Schema(description = "有效期")
+    @JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd")
+    private Date expirationDate;
+
+    @Schema(description = "措施")
+    private String measure;
+
+}

+ 20 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReplaceMaterialParamDTO.java

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 物资更换记录对象 is_materials_change_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class ReplaceMaterialParamDTO
+{
+    @Schema(description = "list")
+    private List<ReplaceMaterialDTO> list;
+
+}

+ 28 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReplaceMaterialsDTO.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 隔离点对象 is_isolation_point
+ *
+ * @author cgj
+ * @date 2024-10-18
+ */
+@Data
+public class ReplaceMaterialsDTO
+{
+
+    @Schema(description = "物资柜code")
+    private String cabinetCode;
+
+    @Schema(description = "绑定的物资数据")
+    private List<String> bindingMaterialRfidList;
+
+    @Schema(description = "解绑的物资数据")
+    private List<String> unbindMaterialRfidList;
+
+
+}

+ 26 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/ReturnLoanDTO.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 物资借出对象 is_materials_loan
+ *
+ * @author cgj
+ * @date 2024-11-08
+ */
+@Data
+public class ReturnLoanDTO
+{
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "物资ID")
+    private Long materialsId;
+
+    @Schema(description = "归还人ID")
+    private Long restitutionUserId;
+
+    @Schema(description = "归还柜ID")
+    private Long restitutionToId;
+
+}

+ 20 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/RfidListDTO.java

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * UpdateTicketLockDTO
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Data
+public class RfidListDTO {
+
+    @Schema(description = "RFID列表")
+    private List<String> list;
+
+}

+ 25 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/SignDTO.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 物资检查记录对象 is_materials_check_record
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class SignDTO
+{
+
+    @Schema(description = "计划id")
+    private Long planId;
+
+    @Schema(description = "物资柜code")
+    private String cabinetCode;
+
+    @Schema(description = "签名图片")
+    private String signatureImg;
+
+}

+ 23 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/StartCheckPlanDTO.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author cgj
+ * @date 2025-01-14
+ */
+@EqualsAndHashCode(callSuper = false)
+@Data
+public class StartCheckPlanDTO
+{
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "计划id")
+    private Long planId;
+
+    @Schema(description = "物资柜code")
+    private String cabinetCode;
+
+}

+ 21 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dto/hardwareMaterialApi/SubmitPlanDTO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 手动更换
+ *
+ * @author cgj
+ * @date 2024-10-18
+ */
+@Data
+public class SubmitPlanDTO
+{
+    @Schema(description = "物资柜CODE")
+    private String cabinetCode;
+
+    @Schema(description = "检查计划id")
+    private Long planId;
+
+}

+ 5 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materials/MaterialsMapper.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.iscs.dal.mysql.materials;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.CheckMaterialsDateVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.MaterialsPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.MaterialsRespVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
@@ -47,5 +48,9 @@ public interface MaterialsMapper extends BaseMapperX<MaterialsDO> {
 
     List<MaterialsRespVO> getExMaterials(@Param(value = "materialsIds") List<Long> materialsIds);
 
+    List<CheckMaterialsDateVO> getCheckMaterialsByCabinetId(@Param(value = "cabinetId") Long cabinetId);
+
+    List<MaterialsDO> getMaterialListByRfid(@Param(value = "rfidList") List<String> rfidList);
+
 
 }

+ 4 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materialscheckrecord/MaterialsCheckRecordMapper.java

@@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 物资检查记录 Mapper
  *
@@ -36,4 +38,6 @@ public interface MaterialsCheckRecordMapper extends BaseMapperX<MaterialsCheckRe
 
     Page<MaterialsCheckRecordRespVO> getMaterialsCheckRecordPage(Page<MaterialsCheckRecordDO> page, @Param(value = "vo") MaterialsCheckRecordPageReqVO vo);
 
+    List<MaterialsCheckRecordDO> getCheckMaterialsByCabinetCode(@Param(value = "planId") Long planId, @Param(value = "cabinetId") Long cabinetId);
+
 }

+ 5 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materialsloan/MaterialsLoanMapper.java

@@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 物资借出 Mapper
  *
@@ -38,5 +40,8 @@ public interface MaterialsLoanMapper extends BaseMapperX<MaterialsLoanDO> {
 
     Page<MaterialsLoanRespVO> getMaterialsLoanPage(Page<MaterialsLoanDO> page, @Param(value = "vo") MaterialsLoanPageReqVO vo);
 
+    List<Long> getLastLoanRecord(@Param(value = "ids") List<Long> ids);
+
+
 
 }

+ 12 - 4
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/materialstype/MaterialsTypeMapper.java

@@ -1,13 +1,12 @@
 package cn.iocoder.yudao.module.iscs.dal.mysql.materialstype;
 
-import java.util.*;
-
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeRespVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialstype.MaterialsTypeDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.*;
 
 /**
  * 物资类型 Mapper
@@ -38,4 +37,13 @@ public interface MaterialsTypeMapper extends BaseMapperX<MaterialsTypeDO> {
                 .orderByDesc(MaterialsTypeDO::getId));
     }
 
+    /**
+     * 查询物资类型
+     *
+     * @param materialsTypeId 物资类型主键
+     * @return 物资类型
+     */
+    MaterialsTypeRespVO getMaterialsType(Long materialsTypeId);
+
+
 }

+ 179 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/hardwareapi/HardwareMaterialApiService.java

@@ -0,0 +1,179 @@
+package cn.iocoder.yudao.module.iscs.service.hardwareapi;
+
+import cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.*;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.cabinetopenrecord.CabinetOpenRecordDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.*;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import java.util.List;
+
+/**
+ * 硬件调用接口
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+public interface HardwareMaterialApiService {
+
+    /**
+     * 查询物资柜下物资类型,标注异常类型下的物资数量,展示异常物资
+     * @param cabinetId
+     * @return
+     */
+    List<ExMaterialTypeVO> selectExMaterialTypeById(Long cabinetId, String cabinetCode) throws JsonProcessingException;
+
+    /**
+     * 手动更换数据校验
+     * @param dto
+     * @return
+     */
+    Boolean checkReplaceData(ReplaceMaterialDTO dto);
+
+    /**
+     * 手动更换物资-校验后的提交
+     * @param dto
+     * @return
+     */
+    Boolean insertCheckedRecord(ReplaceMaterialParamDTO dto) throws JsonProcessingException;
+
+    /**
+     * 手动更换物资
+     * @param dto
+     * @return
+     */
+    Boolean insertReplaceRecord(ReplaceMaterialParamDTO dto) throws JsonProcessingException;
+
+    /**
+     * 手动更换物资-实体操作
+     * @param dto
+     * @return
+     */
+    Boolean updateMaterialsReplace(ReplaceMaterialsDTO dto);
+
+    /**
+     * 新增物资柜开门超时异常
+     * @param dto
+     * @return
+     */
+    Boolean insertCabinetOpenTimeout(OpenTimeoutDTO dto);
+
+    /**
+     * 解除柜开门超时异常
+     * @param dto
+     * @return
+     */
+    Boolean updateCabinetOpenTimeout(OpenTimeoutDTO dto);
+
+    /**
+     * 新增物资柜开门记录
+     * @param dto
+     * @return
+     */
+    Boolean insertCabinetOpenRecord(CabinetOpenRecordDO dto);
+
+    /**
+     * 物资柜关门
+     * @param dto
+     * @return
+     */
+    Boolean updateCabinetClose(CabinetOpenRecordDO dto);
+
+    /**
+     * 获取物资柜物品分类及分类下物资数量和列表
+     * @param cabinetId
+     * @return
+     */
+    List<CabinetMaterialVO> selectMaterialsByCabinetId(Long cabinetId, String cabinetCode) throws JsonProcessingException;
+
+    /**
+     * 通过RFID获取物资信息
+     * @param rfid
+     * @return
+     */
+    MaterialsDO selectMaterialByRfid(String rfid);
+
+    /**
+     * 通过RFID列表获取批量物资信息
+     * @param dto
+     * @return
+     */
+    List<MaterialsDO> selectMaterialsByRfidList(RfidListDTO dto);
+
+    /**
+     * 通过RFID列表获取批量物资信息
+     * @param dto
+     * @return
+     */
+    CabinetMaterialsVO selectCabinetMaterials(CabinetRfidListDTO dto);
+
+    /**
+     * 物资领取/归还
+     * @param dto
+     * @return
+     */
+    String updateMaterialReceiveReturn(RecRetParamDTO dto) throws Exception;
+
+    /**
+     * 查询物资使用说明
+     * @return
+     */
+    List<InstructionVO> getInstructionsList();
+
+    /**
+     * 我的在某个柜子上的最近一次物资检查计划
+     * @param cabinetCode
+     * @return
+     */
+    CabinetCheckVO getLastCheckPlanByCabinetCode(String cabinetCode);
+
+    /**
+     * 主界面
+     * @param cabinetCode
+     * @return
+     */
+    CabinetHomePageVO getCabinetHomePage(String cabinetCode);
+
+    /**
+     * 物资检查表
+     * @param cabinetCode
+     * @return
+     */
+    MaterialsCheckInitVO getCheckMaterialsByCabinetCode(String cabinetCode, Long planId);
+
+    /**
+     * 提交物资检查记录
+     * @param dto
+     * @return
+     */
+    Boolean insertCheckRecord(CheckParamDTO dto);
+
+    /**
+     * 最终提交物资检查记录
+     * @param dto
+     * @return
+     */
+    Boolean insertSubmitPlan(SubmitPlanDTO dto);
+
+    /**
+     * 检查签名
+     * @param dto
+     * @return
+     */
+    Boolean insertSign(SignDTO dto);
+
+    /**
+     * 自动更换
+     * @param dto
+     * @return
+     */
+    AutoReplaceReportVO insertAutoChange(AutoChangeDTO dto);
+
+    /**
+     * 开始检查
+     * @param dto
+     * @return
+     */
+    Boolean startCheckPlan(StartCheckPlanDTO dto);
+
+}

+ 1299 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/hardwareapi/HardwareMaterialApiServiceImpl.java

@@ -0,0 +1,1299 @@
+package cn.iocoder.yudao.module.iscs.service.hardwareapi;
+
+import cn.hutool.core.lang.Assert;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.*;
+import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.MaterialsRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.PropertyVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.cabinetopenrecord.CabinetOpenRecordDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.exceptionmisplace.ExceptionMisplaceDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscabinet.MaterialsCabinetDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialschangerecord.MaterialsChangeRecordDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckplan.MaterialsCheckPlanDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckrecord.MaterialsCheckRecordDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsinstructions.MaterialsInstructionsDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsloan.MaterialsLoanDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsplancabinet.MaterialsPlanCabinetDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialstype.MaterialsTypeDO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.*;
+import cn.iocoder.yudao.module.iscs.service.cabinetopenrecord.CabinetOpenRecordService;
+import cn.iocoder.yudao.module.iscs.service.exceptionmisplace.ExceptionMisplaceService;
+import cn.iocoder.yudao.module.iscs.service.materials.MaterialsService;
+import cn.iocoder.yudao.module.iscs.service.materialscabinet.MaterialsCabinetService;
+import cn.iocoder.yudao.module.iscs.service.materialschangerecord.MaterialsChangeRecordService;
+import cn.iocoder.yudao.module.iscs.service.materialscheckplan.MaterialsCheckPlanService;
+import cn.iocoder.yudao.module.iscs.service.materialscheckrecord.MaterialsCheckRecordService;
+import cn.iocoder.yudao.module.iscs.service.materialsinstructions.MaterialsInstructionsService;
+import cn.iocoder.yudao.module.iscs.service.materialsloan.MaterialsLoanService;
+import cn.iocoder.yudao.module.iscs.service.materialsplancabinet.MaterialsPlanCabinetService;
+import cn.iocoder.yudao.module.iscs.service.materialstype.MaterialsTypeService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname;
+
+/**
+ * 硬件Service业务层处理
+ *
+ * @author cgj
+ * @date 2024-10-16
+ */
+@Slf4j
+@Service
+public class HardwareMaterialApiServiceImpl implements HardwareMaterialApiService {
+    @Autowired
+    private MaterialsService materialsService;
+    @Autowired
+    private MaterialsCabinetService materialsCabinetService;
+    @Autowired
+    private MaterialsTypeService materialsTypeService;
+    @Lazy
+    @Autowired
+    private MaterialsChangeRecordService materialsChangeRecordService;
+    @Autowired
+    private ExceptionMisplaceService exceptionMisplaceService;
+    @Autowired
+    private CabinetOpenRecordService cabinetOpenRecordService;
+    @Lazy
+    @Autowired
+    private MaterialsCheckRecordService materialsCheckRecordService;
+    @Autowired
+    private MaterialsInstructionsService materialsInstructionsService;
+    @Lazy
+    @Autowired
+    private MaterialsCheckPlanService materialsCheckPlanService;
+    @Lazy
+    @Autowired
+    private MaterialsPlanCabinetService materialsPlanCabinetService;
+    @Autowired
+    private MaterialsLoanService materialsLoanService;
+
+
+    @Override
+    public List<ExMaterialTypeVO> selectExMaterialTypeById(Long cabinetId, String cabinetCode) throws JsonProcessingException {
+        // Assert.notNull(cabinetId, "物资柜ID不能为空!");
+        if (cabinetId != null) {
+        } else {
+            Assert.notBlank(cabinetCode, "物资柜code不能为空!");
+            MaterialsCabinetDO cabinet = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                    .eq(MaterialsCabinetDO::getCabinetCode, cabinetCode));
+            Assert.isFalse(cabinet == null, "物资柜信息不存在!");
+            cabinetId = cabinet.getId();
+        }
+        // 0.构造返回值
+        ArrayList<ExMaterialTypeVO> exMaterialTypeVOS = new ArrayList<>();
+        // 1.查询物资柜下有哪些物资
+        List<MaterialsDO> materials = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .eq(MaterialsDO::getMaterialsCabinetId, cabinetId));
+        // 1.1如果柜子下有物资,才有继续的必要
+        if (!materials.isEmpty()) {
+            // 2.找出这些物资有哪些分类,去掉重复的
+            Set<Long> materialsTypeIdSet = materials.stream().map(MaterialsDO::getMaterialsTypeId).filter(materialsTypeId -> materialsTypeId != null).collect(Collectors.toSet());
+            // 2.1查询分类的数据,需要拼接name
+            List<MaterialsTypeDO> isMaterialsTypes = materialsTypeService.listByIds(materialsTypeIdSet);
+            // 2.2如果这个类型有数据才有意义
+            if (!isMaterialsTypes.isEmpty()) {
+                // 3.构造’全部‘数据
+                ExMaterialTypeVO sumExMaterialTypeVO = new ExMaterialTypeVO();
+                sumExMaterialTypeVO.setMaterialsTypeId(0L);
+                sumExMaterialTypeVO.setMaterialsTypeName("全部");
+                // 承接’全部‘
+                int sumExNumber = 0;
+                ArrayList<MaterialsRespVO> isMaterials = new ArrayList<>();
+                // 解析物资规格
+                ObjectMapper objectMapper = new ObjectMapper();
+                // 3.1循环构造返回类
+                for (MaterialsTypeDO isMaterialsType : isMaterialsTypes) {
+                    ExMaterialTypeVO exMaterialTypeVO = new ExMaterialTypeVO();
+                    exMaterialTypeVO.setMaterialsTypeId(isMaterialsType.getId());
+                    exMaterialTypeVO.setMaterialsTypeName(isMaterialsType.getMaterialsTypeName());
+                    exMaterialTypeVO.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                    exMaterialTypeVO.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                    // 过滤获取该类型下的异常物资,1表示损坏 2表示过期
+                    List<MaterialsDO> exMaterials = materials.stream().filter(o -> o.getMaterialsTypeId().equals(isMaterialsType.getId())
+                            && ("1".equals(o.getStatus()) || "2".equals(o.getStatus()))).collect(Collectors.toList());
+                    // 解析物资规格
+                    List<MaterialsRespVO> beans = BeanUtils.toBean(exMaterials, MaterialsRespVO.class);
+                    for (MaterialsRespVO record : beans) {
+                        // String propertiesValue = propertyVOS.stream().map(PropertyVO::getValueName).collect(Collectors.joining(","));
+                        // 目前最多一条
+                        if (StringUtils.isNotBlank(record.getProperties())) {
+                            List<PropertyVO> propertyVOS = objectMapper.readValue(record.getProperties(), new TypeReference<>() {
+                            });
+                            record.setPropertiesValueId(propertyVOS.get(0).getRecordId());
+                            record.setPropertiesValue(propertyVOS.get(0).getValueName());
+                            record.setPropertiesPropertyId(propertyVOS.get(0).getPropertyId());
+                            record.setPropertiesProperty(propertyVOS.get(0).getPropertyName());
+                        }
+                        record.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                        record.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                    }
+                    exMaterialTypeVO.setExNumber(exMaterials.size());
+                    exMaterialTypeVO.setMaterials(beans);
+                    exMaterialTypeVOS.add(exMaterialTypeVO);
+                    // ’全部‘累加
+                    sumExNumber = sumExNumber + exMaterials.size();
+                    // ’全部‘集合
+                    isMaterials.addAll(beans);
+                }
+                // 3.2将‘全部’的数据补充完整
+                sumExMaterialTypeVO.setExNumber(sumExNumber);
+                sumExMaterialTypeVO.setMaterials(isMaterials);
+                exMaterialTypeVOS.add(0, sumExMaterialTypeVO);
+            }
+        }
+        return exMaterialTypeVOS;
+    }
+
+    @Override
+    public Boolean checkReplaceData(ReplaceMaterialDTO dto) {
+        Assert.notNull(dto.getOldMaterialsId(), "旧物资ID不能为空!");
+        Assert.notBlank(dto.getMaterialsRfid(), "新物资RFID不能为空!");
+        // 1.获取旧物资信息
+        MaterialsDO oldMaterials = materialsService.getById(dto.getOldMaterialsId());
+        // 判断旧物资和新物资的rfid是否更换
+        if (dto.getMaterialsRfid().equals(oldMaterials.getMaterialsRfid())) {
+            // 2.没有更换rfid
+
+
+        } else {
+            // 3.更换rfid
+            // 判断是否在柜子外 判断rfid是否重复,如果重复,判断重复数据是否绑定物资柜,如果没有绑定直接用,如果绑定,报异常
+            Assert.isFalse(oldMaterials.getLoanState().equals("1"), "需要更换的物资未取出!");
+            // 判断新物资RFID是否被使用
+            MaterialsDO one = materialsService.getOne(Wrappers.<MaterialsDO>lambdaQuery()
+                    .eq(MaterialsDO::getMaterialsRfid, dto.getMaterialsRfid()));
+            Assert.isFalse(one != null && one.getMaterialsCabinetId() != null && one.getMaterialsCabinetId() != 0, "该RFID已被使用!");
+            // 判断新物资是否在物资当前柜子中
+            /*if (one != null) {
+                IsMaterialsLoanException one1 = isMaterialsLoanExceptionService.getOne(Wrappers.<IsMaterialsLoanException>lambdaQuery()
+                        .eq(IsMaterialsLoanException::getMaterialsRfid, dto.getMaterialsRfid())
+                        .eq(IsMaterialsLoanException::getStatus, 0)
+                        .eq(IsMaterialsLoanException::getRestitutionToId, oldMaterials.getMaterialsCabinetId())
+                        .orderByDesc(IsMaterialsLoanException::getMisplaceId)
+                        .last("limit 1"));
+                Assert.isTrue(one1 != null, "请在该柜中放入新物资!");
+            }*/
+
+        }
+        return true;
+    }
+
+    @Transactional
+    @Override
+    public Boolean insertCheckedRecord(ReplaceMaterialParamDTO dto) throws JsonProcessingException {
+        Assert.isFalse(dto.getList().isEmpty(), "没有确定要维修或更换的物资!");
+        Long cabinetId = null;
+        // 因为比较复杂,循环处理
+        for (ReplaceMaterialDTO replaceMaterialDTO : dto.getList()) {
+            Boolean b = checkReplaceData(replaceMaterialDTO);
+            if (!b) {
+                System.out.println("进来了-------------------");
+                continue;
+            }
+            Assert.notNull(replaceMaterialDTO.getOldMaterialsId(), "旧物资ID不能为空!");
+            MaterialsDO oldMaterial = materialsService.getById(replaceMaterialDTO.getOldMaterialsId());
+            cabinetId = oldMaterial.getMaterialsCabinetId();
+            // 查询该物资的最新报异常记录
+            MaterialsCheckRecordDO checkRecord = materialsCheckRecordService.getOne(Wrappers.<MaterialsCheckRecordDO>lambdaQuery()
+                    .eq(MaterialsCheckRecordDO::getMaterialsId, replaceMaterialDTO.getOldMaterialsId())
+                    .eq(MaterialsCheckRecordDO::getStatus, "1")
+                    .orderByDesc(MaterialsCheckRecordDO::getId)
+                    .last("limit 1"));
+            // 判断物资是不是维修,如果是维修,做维修处理
+            if (StringUtils.isNotBlank(replaceMaterialDTO.getMeasure()) && replaceMaterialDTO.getMeasure().equals("维修")) {
+                // 如果是维修直接更新物资状态
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, replaceMaterialDTO.getOldMaterialsId())
+                        .set(MaterialsDO::getStatus, "0"));
+                // 生成维修记录
+                MaterialsChangeRecordDO isMaterialsChangeRecord = new MaterialsChangeRecordDO();
+                isMaterialsChangeRecord.setOldMaterialsId(replaceMaterialDTO.getOldMaterialsId());
+                isMaterialsChangeRecord.setOldMaterialsRfid(oldMaterial.getMaterialsRfid());
+                isMaterialsChangeRecord.setNewMaterialsId(oldMaterial.getId());
+                isMaterialsChangeRecord.setNewMaterialsRfid(oldMaterial.getMaterialsRfid());
+                isMaterialsChangeRecord.setChangeUserId(getLoginUserId());
+                isMaterialsChangeRecord.setChangeDate(new Date());
+                isMaterialsChangeRecord.setChangeType("0");
+                isMaterialsChangeRecord.setOperateType("3");
+                isMaterialsChangeRecord.setCheckRecordId(checkRecord != null ? checkRecord.getId() : null);
+                materialsChangeRecordService.save(isMaterialsChangeRecord);
+                return true;
+            }
+
+            // 1.对旧物资进行处理,如果新物资需要使用旧物资的rfid,则把旧物资的rfid清理掉,然后绑定给新物资,最后开柜门拿出旧物资解绑就可以了
+            if (StringUtils.isNotBlank(oldMaterial.getMaterialsRfid()) && oldMaterial.getMaterialsRfid().equals(replaceMaterialDTO.getMaterialsRfid())) {
+                // 1.1该情况属于新物资需要使用旧物资的rfid
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, replaceMaterialDTO.getOldMaterialsId())
+                        .set(MaterialsDO::getMaterialsCabinetId, null)
+                        .set(MaterialsDO::getMaterialsRfid, null));
+            }
+            // 1.2无论是否更换rfid,新物资的数据都要存储到物资清单之中
+            MaterialsDO newMaterial = new MaterialsDO();
+            if (oldMaterial.getMaterialsRfid().equals(replaceMaterialDTO.getMaterialsRfid())) {
+                // 如果更换物资的rfid相同
+                newMaterial.setMaterialsName(replaceMaterialDTO.getMaterialsName());
+                newMaterial.setMaterialsTypeId(replaceMaterialDTO.getMaterialsTypeId());
+                newMaterial.setMaterialsCabinetId(oldMaterial.getMaterialsCabinetId());
+                newMaterial.setLoanState(oldMaterial.getLoanState());
+                newMaterial.setMaterialsRfid(replaceMaterialDTO.getMaterialsRfid());
+                newMaterial.setSupplier(oldMaterial.getSupplier());
+                newMaterial.setExpirationDate(replaceMaterialDTO.getExpirationDate());
+                newMaterial.setStatus("0");
+
+                PropertyVO propertyVO = new PropertyVO();
+                propertyVO.setPropertyId(String.valueOf(replaceMaterialDTO.getPropertiesPropertyId()));
+                propertyVO.setPropertyName(replaceMaterialDTO.getPropertiesProperty());
+                propertyVO.setRecordId(String.valueOf(replaceMaterialDTO.getPropertiesValueId()));
+                propertyVO.setValueName(replaceMaterialDTO.getPropertiesValue());
+                // 使用 ObjectMapper 将对象转换为 JSON 字符串
+                ObjectMapper objectMapper = new ObjectMapper();
+                String jsonString = objectMapper.writeValueAsString(propertyVO);
+                newMaterial.setProperties("[" + jsonString + "]");
+                materialsService.save(newMaterial);
+            }
+
+            MaterialsDO newMaterials = materialsService.getOne(Wrappers.<MaterialsDO>lambdaQuery()
+                    .eq(MaterialsDO::getMaterialsRfid, replaceMaterialDTO.getMaterialsRfid()));
+            if (!oldMaterial.getMaterialsRfid().equals(replaceMaterialDTO.getMaterialsRfid()) && newMaterials == null) {
+                // 如果更换rfid,并且不在系统内的数据
+                newMaterial.setMaterialsName(replaceMaterialDTO.getMaterialsName());
+                newMaterial.setMaterialsTypeId(replaceMaterialDTO.getMaterialsTypeId());
+                newMaterial.setMaterialsCabinetId(oldMaterial.getMaterialsCabinetId());
+                newMaterial.setLoanState("1");
+                newMaterial.setMaterialsRfid(replaceMaterialDTO.getMaterialsRfid());
+                newMaterial.setSupplier(oldMaterial.getSupplier());
+                newMaterial.setExpirationDate(replaceMaterialDTO.getExpirationDate());
+                newMaterial.setStatus("0");
+
+                PropertyVO propertyVO = new PropertyVO();
+                propertyVO.setPropertyId(String.valueOf(replaceMaterialDTO.getPropertiesPropertyId()));
+                propertyVO.setPropertyName(replaceMaterialDTO.getPropertiesProperty());
+                propertyVO.setRecordId(String.valueOf(replaceMaterialDTO.getPropertiesValueId()));
+                propertyVO.setValueName(replaceMaterialDTO.getPropertiesValue());
+                // 使用 ObjectMapper 将对象转换为 JSON 字符串
+                ObjectMapper objectMapper = new ObjectMapper();
+                String jsonString = objectMapper.writeValueAsString(propertyVO);
+                newMaterial.setProperties("[" + jsonString + "]");
+                materialsService.save(newMaterial);
+
+                // 将旧物资解绑
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getMaterialsRfid, oldMaterial.getMaterialsRfid())
+                        .set(MaterialsDO::getMaterialsCabinetId, null));
+            }
+
+            if (!oldMaterial.getMaterialsRfid().equals(replaceMaterialDTO.getMaterialsRfid()) && newMaterials != null) {
+                // 如果发现物资是存在的,判断下有没有绑定柜子
+                Assert.isFalse(newMaterials.getMaterialsCabinetId() != null && newMaterials.getMaterialsCabinetId() != 0, "该物资存在所属柜子,不可更换!");
+                Assert.isTrue(newMaterials.getStatus().equals("0"), "更换的物资异常,不可更换!");
+                // 如果没有绑定柜子,则可以开始绑定
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, newMaterials.getId())
+                        .set(MaterialsDO::getMaterialsCabinetId, oldMaterial.getMaterialsCabinetId()));
+                // 解绑老物资
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, oldMaterial.getId())
+                        .set(MaterialsDO::getMaterialsCabinetId, null));
+            }
+
+            // 2.新增物资更换记录
+            MaterialsChangeRecordDO isMaterialsChangeRecord = new MaterialsChangeRecordDO();
+            isMaterialsChangeRecord.setOldMaterialsId(replaceMaterialDTO.getOldMaterialsId());
+            isMaterialsChangeRecord.setOldMaterialsRfid(oldMaterial.getMaterialsRfid());
+            isMaterialsChangeRecord.setNewMaterialsId(newMaterial.getId());
+            isMaterialsChangeRecord.setNewMaterialsRfid(newMaterial.getMaterialsRfid());
+            isMaterialsChangeRecord.setChangeUserId(getLoginUserId());
+            isMaterialsChangeRecord.setChangeDate(new Date());
+            isMaterialsChangeRecord.setChangeType("0");
+
+            if (checkRecord != null) {
+                isMaterialsChangeRecord.setCheckRecordId(checkRecord.getId());
+            } else {
+                isMaterialsChangeRecord.setCheckRecordId(0L);
+            }
+            materialsChangeRecordService.save(isMaterialsChangeRecord);
+
+            // 删除旧物资的取出记录和新物资的存入异常---曹特殊要求,改成完成的数据
+            materialsLoanService.update(Wrappers.<MaterialsLoanDO>lambdaUpdate()
+                    .eq(MaterialsLoanDO::getMaterialsId, oldMaterial.getId())
+                    .ne(MaterialsLoanDO::getStatus, "1")
+                    .set(MaterialsLoanDO::getRemark, "物资更换")
+                    .set(MaterialsLoanDO::getStatus, "1")
+                    .set(MaterialsLoanDO::getRestitutionUserId, getLoginUserId())
+                    .set(MaterialsLoanDO::getActualRestitutionTime, new Date()));
+            // 删除新物资的存入异常---曹特殊要求,改成完成的数据
+            exceptionMisplaceService.update(Wrappers.<ExceptionMisplaceDO>lambdaUpdate()
+                    .eq(ExceptionMisplaceDO::getMaterialsRfid, replaceMaterialDTO.getMaterialsRfid())
+                    .eq(ExceptionMisplaceDO::getStatus, "0")
+                    .set(ExceptionMisplaceDO::getRemark, "物资更换")
+                    .set(ExceptionMisplaceDO::getStatus, "1")
+                    .set(ExceptionMisplaceDO::getHandleTime, new Date()));
+        }
+        // 更新检查记录
+        if (cabinetId != null) {
+            MaterialsCabinetDO byId = materialsCabinetService.getById(cabinetId);
+            if (byId != null) {
+                materialsPlanCabinetService.autoChangeCheckRecord(byId.getCabinetCode());
+            }
+        }
+        return true;
+    }
+
+    @Transactional
+    @Override
+    public Boolean insertReplaceRecord(ReplaceMaterialParamDTO dto) throws JsonProcessingException {
+        Assert.isFalse(dto.getList().isEmpty(), "没有确定要维修或更换的物资!");
+        // 因为比较复杂,循环处理
+        for (ReplaceMaterialDTO replaceMaterialDTO : dto.getList()) {
+            Assert.notNull(replaceMaterialDTO.getOldMaterialsId(), "旧物资ID不能为空!");
+            MaterialsDO oldMaterial = materialsService.getById(replaceMaterialDTO.getOldMaterialsId());
+            // 1.查询该物资的最新报异常记录
+            MaterialsCheckRecordDO checkRecord = materialsCheckRecordService.getOne(Wrappers.<MaterialsCheckRecordDO>lambdaQuery()
+                    .eq(MaterialsCheckRecordDO::getMaterialsId, replaceMaterialDTO.getOldMaterialsId())
+                    .eq(MaterialsCheckRecordDO::getStatus, "1")
+                    .orderByDesc(MaterialsCheckRecordDO::getId)
+                    .last("limit 1"));
+            if (checkRecord != null && StringUtils.isNotBlank(checkRecord.getMeasure()) && checkRecord.getMeasure().equals("维修")) {
+                // 如果是维修直接更新物资状态
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, replaceMaterialDTO.getOldMaterialsId())
+                        .set(MaterialsDO::getStatus, "0"));
+                // 生成维修记录
+                MaterialsChangeRecordDO isMaterialsChangeRecord = new MaterialsChangeRecordDO();
+                isMaterialsChangeRecord.setOldMaterialsId(replaceMaterialDTO.getOldMaterialsId());
+                isMaterialsChangeRecord.setOldMaterialsRfid(oldMaterial.getMaterialsRfid());
+                isMaterialsChangeRecord.setNewMaterialsId(oldMaterial.getId());
+                isMaterialsChangeRecord.setNewMaterialsRfid(oldMaterial.getMaterialsRfid());
+                isMaterialsChangeRecord.setChangeUserId(getLoginUserId());
+                isMaterialsChangeRecord.setChangeDate(new Date());
+                isMaterialsChangeRecord.setChangeType("0");
+                isMaterialsChangeRecord.setOperateType("3");
+                isMaterialsChangeRecord.setCheckRecordId(checkRecord.getId());
+                materialsChangeRecordService.save(isMaterialsChangeRecord);
+                return true;
+            }
+            // 2.对旧物资进行处理,如果新物资需要使用旧物资的rfid,则把旧物资的rfid清理掉,然后绑定给新物资,最后开柜门拿出旧物资解绑就可以了
+            if (StringUtils.isNotBlank(oldMaterial.getMaterialsRfid()) && oldMaterial.getMaterialsRfid().equals(replaceMaterialDTO.getMaterialsRfid())) {
+                // 2.1该情况属于新物资需要使用旧物资的rfid
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, replaceMaterialDTO.getOldMaterialsId())
+                        .set(MaterialsDO::getMaterialsCabinetId, null)
+                        .set(MaterialsDO::getMaterialsRfid, null));
+            }
+            // 2.2无论是否更换rfid,新物资的数据都要存储到物资清单之中
+            MaterialsDO newMaterial = new MaterialsDO();
+            newMaterial.setMaterialsName(replaceMaterialDTO.getMaterialsName());
+            newMaterial.setMaterialsTypeId(replaceMaterialDTO.getMaterialsTypeId());
+            newMaterial.setMaterialsCabinetId(oldMaterial.getMaterialsCabinetId());
+            newMaterial.setLoanState("0");
+            newMaterial.setMaterialsRfid(replaceMaterialDTO.getMaterialsRfid());
+            newMaterial.setSupplier(oldMaterial.getSupplier());
+            newMaterial.setExpirationDate(replaceMaterialDTO.getExpirationDate());
+            newMaterial.setStatus("0");
+
+            PropertyVO propertyVO = new PropertyVO();
+            propertyVO.setPropertyId(String.valueOf(replaceMaterialDTO.getPropertiesPropertyId()));
+            propertyVO.setPropertyName(replaceMaterialDTO.getPropertiesProperty());
+            propertyVO.setRecordId(String.valueOf(replaceMaterialDTO.getPropertiesValueId()));
+            propertyVO.setValueName(replaceMaterialDTO.getPropertiesValue());
+            // 使用 ObjectMapper 将对象转换为 JSON 字符串
+            ObjectMapper objectMapper = new ObjectMapper();
+            String jsonString = objectMapper.writeValueAsString(propertyVO);
+            newMaterial.setProperties("[" + jsonString + "]");
+            materialsService.save(newMaterial);
+
+            // 3.新增物资更换记录
+            MaterialsChangeRecordDO isMaterialsChangeRecord = new MaterialsChangeRecordDO();
+            isMaterialsChangeRecord.setOldMaterialsId(replaceMaterialDTO.getOldMaterialsId());
+            isMaterialsChangeRecord.setOldMaterialsRfid(oldMaterial.getMaterialsRfid());
+            isMaterialsChangeRecord.setNewMaterialsId(newMaterial.getId());
+            isMaterialsChangeRecord.setNewMaterialsRfid(newMaterial.getMaterialsRfid());
+            isMaterialsChangeRecord.setChangeUserId(getLoginUserId());
+            isMaterialsChangeRecord.setChangeDate(new Date());
+            isMaterialsChangeRecord.setChangeType("0");
+            if (checkRecord != null) {
+                isMaterialsChangeRecord.setCheckRecordId(checkRecord.getId());
+            } else {
+                isMaterialsChangeRecord.setCheckRecordId(0L);
+            }
+            materialsChangeRecordService.save(isMaterialsChangeRecord);
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean updateMaterialsReplace(ReplaceMaterialsDTO dto) {
+        Assert.notBlank(dto.getCabinetCode(), "物资柜不能为空!");
+        MaterialsCabinetDO cabinetByCode = materialsCabinetService.getCabinetByCode(dto.getCabinetCode());
+        // 1.开始解绑
+        if (!dto.getUnbindMaterialRfidList().isEmpty()) {
+            materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                    .in(MaterialsDO::getMaterialsRfid, dto.getUnbindMaterialRfidList())
+                    .set(MaterialsDO::getMaterialsCabinetId, null)
+                    .set(MaterialsDO::getLoanState, "0"));
+        }
+        // 2.开始绑定
+        if (!dto.getBindingMaterialRfidList().isEmpty()) {
+            materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                    .in(MaterialsDO::getMaterialsRfid, dto.getBindingMaterialRfidList())
+                    .set(MaterialsDO::getMaterialsCabinetId, cabinetByCode.getId())
+                    .set(MaterialsDO::getLoanState, "1")
+                    .set(MaterialsDO::getStatus, "0"));
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean insertCabinetOpenTimeout(OpenTimeoutDTO dto) {
+        // Assert.notNull(dto.getLoanFromId(), "物资柜不能为空");
+        if (dto.getLoanFromId() != null) {
+        } else {
+            Assert.notBlank(dto.getLoanFromCode(), "物资柜code不能空!");
+            MaterialsCabinetDO cabinetByCode = materialsCabinetService.getCabinetByCode(dto.getLoanFromCode());
+            Assert.isTrue(cabinetByCode != null, "物资柜不存在!");
+            dto.setLoanFromId(cabinetByCode.getId());
+        }
+        ExceptionMisplaceDO loanException = new ExceptionMisplaceDO();
+        loanException.setLoanFromId(dto.getLoanFromId());
+        loanException.setRestitutionUserId(getLoginUserId());
+        loanException.setOccurTime(new Date());
+        loanException.setExceptionType("1");
+        exceptionMisplaceService.save(loanException);
+        return true;
+    }
+
+    @Override
+    public Boolean updateCabinetOpenTimeout(OpenTimeoutDTO dto) {
+        // Assert.notNull(dto.getLoanFromId(), "物资柜不能为空");
+        if (dto.getLoanFromId() != null) {
+        } else {
+            Assert.notBlank(dto.getLoanFromCode(), "物资柜code不能空!");
+            MaterialsCabinetDO cabinetByCode = materialsCabinetService.getCabinetByCode(dto.getLoanFromCode());
+            Assert.isTrue(cabinetByCode != null, "物资柜不存在!");
+            dto.setLoanFromId(cabinetByCode.getId());
+        }
+        exceptionMisplaceService.update(Wrappers.<ExceptionMisplaceDO>lambdaUpdate()
+                .eq(ExceptionMisplaceDO::getLoanFromId, dto.getLoanFromId())
+                .eq(ExceptionMisplaceDO::getExceptionType, "1")
+                .eq(ExceptionMisplaceDO::getStatus, "0")
+                .set(ExceptionMisplaceDO::getStatus, "1")
+                .set(ExceptionMisplaceDO::getHandleTime, new Date()));
+        return true;
+    }
+
+    @Override
+    public Boolean insertCabinetOpenRecord(CabinetOpenRecordDO dto) {
+        // Assert.notNull(dto.getCabinetId(), "物资柜ID不能为空!");
+        if (dto.getCabinetId() != null) {
+        } else {
+            Assert.notBlank(dto.getCabinetCode(), "请告诉我物资柜code!");
+            MaterialsCabinetDO one = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                    .eq(MaterialsCabinetDO::getCabinetCode, dto.getCabinetCode()));
+            Assert.isFalse(one == null, "物资柜信息不存在!");
+            dto.setCabinetId(one.getId());
+        }
+        Assert.notBlank(dto.getOpenType(), "开门类型不可为空!");
+        dto.setOpenTime(new Date());
+        dto.setUserId(String.valueOf(getLoginUserId()));
+        cabinetOpenRecordService.save(dto);
+        return true;
+    }
+
+    @Override
+    public Boolean updateCabinetClose(CabinetOpenRecordDO dto) {
+        // Assert.notNull(dto.getCabinetId(), "物资柜ID不能为空!");
+        if (dto.getCabinetId() != null) {
+        } else {
+            Assert.notBlank(dto.getCabinetCode(), "请告诉我物资柜code!");
+            MaterialsCabinetDO one = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                    .eq(MaterialsCabinetDO::getCabinetCode, dto.getCabinetCode()));
+            Assert.isFalse(one == null, "物资柜信息不存在!");
+            dto.setCabinetId(one.getId());
+        }
+        cabinetOpenRecordService.update(Wrappers.<CabinetOpenRecordDO>lambdaUpdate()
+                .eq(CabinetOpenRecordDO::getCabinetId, dto.getCabinetId())
+                .isNull(CabinetOpenRecordDO::getCloseTime)
+                .set(CabinetOpenRecordDO::getCloseTime, new Date()));
+        // 检查该柜子有没有关门异常,如果有现在解除一下
+        exceptionMisplaceService.update(Wrappers.<ExceptionMisplaceDO>lambdaUpdate()
+                .eq(ExceptionMisplaceDO::getLoanFromId, dto.getCabinetId())
+                .eq(ExceptionMisplaceDO::getExceptionType, "1")
+                .eq(ExceptionMisplaceDO::getStatus, "0")
+                .set(ExceptionMisplaceDO::getStatus, "1")
+                .set(ExceptionMisplaceDO::getHandleTime, new Date()));
+        return true;
+    }
+
+    @Override
+    public List<CabinetMaterialVO> selectMaterialsByCabinetId(Long cabinetId, String cabinetCode) {
+        Assert.isFalse(cabinetId == null && StringUtils.isBlank(cabinetCode), "请告诉我物资柜身份(cabinetId / cabinetCode)!");
+        if (cabinetId != null) {
+        } else {
+            MaterialsCabinetDO one = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                    .eq(MaterialsCabinetDO::getCabinetCode, cabinetCode));
+            Assert.isFalse(one == null, "无法识别" + cabinetCode + "物资柜身份!");
+            cabinetId = one.getId();
+        }
+        // 0.构造返回值
+        ArrayList<CabinetMaterialVO> vo = new ArrayList<>();
+        // 1.查询物资柜下有哪些物资
+        List<MaterialsDO> materials = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .eq(MaterialsDO::getMaterialsCabinetId, cabinetId));
+        // 1.1如果柜子下有物资,才有继续的必要
+        if (!materials.isEmpty()) {
+            // 4.给物资赋值最新一次借取人员的数据
+            List<MaterialsDO> collect = materials.stream().filter(o -> StringUtils.isNotBlank(o.getLoanState()) && o.getLoanState().equals("0")).collect(Collectors.toList());
+            if (!collect.isEmpty()) {
+                List<Long> collect1 = collect.stream().map(MaterialsDO::getId).collect(Collectors.toList());
+                List<Long> lastLoanRecordIds = materialsLoanService.getLastLoanRecord(collect1);
+                if (!lastLoanRecordIds.isEmpty()) {
+                    List<MaterialsLoanDO> isMaterialsLoans = materialsLoanService.listByIds(lastLoanRecordIds);
+                    for (MaterialsLoanDO isMaterialsLoan : isMaterialsLoans) {
+                        for (MaterialsDO material : materials) {
+                            if (isMaterialsLoan.getMaterialsId().equals(material.getId())) {
+                                material.setLoanUserId(isMaterialsLoan.getLoanUserId());
+                            }
+                        }
+                    }
+                }
+            }
+
+            // 2.找出这些物资有哪些分类,去掉重复的
+            Set<Long> materialsTypeIdSet = materials.stream().map(MaterialsDO::getMaterialsTypeId).filter(materialsTypeId -> materialsTypeId != null).collect(Collectors.toSet());
+            // 2.1查询分类的数据,需要拼接name
+            List<MaterialsTypeDO> isMaterialsTypes = materialsTypeService.listByIds(materialsTypeIdSet);
+            // 2.2如果这个类型有数据才有意义
+            if (!isMaterialsTypes.isEmpty()) {
+                // 3.构造’全部‘数据
+                CabinetMaterialVO sumExMaterialTypeVO = new CabinetMaterialVO();
+                sumExMaterialTypeVO.setMaterialsTypeId(0L);
+                sumExMaterialTypeVO.setMaterialsTypeName("全部");
+                // 承接’全部‘
+                int sumNumber = 0;
+                ArrayList<MaterialsRespVO> isMaterials = new ArrayList<>();
+                // 3.1循环构造返回类
+                for (MaterialsTypeDO isMaterialsType : isMaterialsTypes) {
+                    CabinetMaterialVO cabinetMaterialVO = new CabinetMaterialVO();
+                    cabinetMaterialVO.setMaterialsTypeId(isMaterialsType.getId());
+                    cabinetMaterialVO.setMaterialsTypeName(isMaterialsType.getMaterialsTypeName());
+                    // 过滤获取该类型下的异常物资,1表示损坏 2表示过期
+                    List<MaterialsDO> exMaterials = materials.stream().filter(o -> o.getMaterialsTypeId() != null
+                            && isMaterialsType.getId() != null
+                            && o.getMaterialsTypeId().equals(isMaterialsType.getId())).collect(Collectors.toList());
+                    // 解析物资规格
+                    List<MaterialsRespVO> beans = BeanUtils.toBean(exMaterials, MaterialsRespVO.class);
+                    for (MaterialsRespVO record : beans) {
+                        record.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                        record.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                        record.setMaterialsTypeName(isMaterialsType.getMaterialsTypeName());
+                    }
+                    cabinetMaterialVO.setNumber(exMaterials.size());
+                    cabinetMaterialVO.setBorrowableNumber((int) exMaterials.stream().filter(o -> o.getStatus().equals("0") && o.getLoanState().equals("1")).count());
+                    cabinetMaterialVO.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                    cabinetMaterialVO.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                    cabinetMaterialVO.setMaterials(beans);
+                    vo.add(cabinetMaterialVO);
+                    // ’全部‘累加
+                    sumNumber = sumNumber + exMaterials.size();
+                    // ’全部‘集合
+                    isMaterials.addAll(beans);
+                }
+                // 3.2将‘全部’的数据补充完整
+                sumExMaterialTypeVO.setNumber(sumNumber);
+                sumExMaterialTypeVO.setMaterials(isMaterials);
+                vo.add(0, sumExMaterialTypeVO);
+            }
+        }
+        return vo;
+    }
+
+    @Override
+    public MaterialsDO selectMaterialByRfid(String rfid) {
+        Assert.notBlank(rfid, "物资RFID不能为空!");
+        MaterialsDO materials = materialsService.getOne(Wrappers.<MaterialsDO>lambdaQuery()
+                .eq(MaterialsDO::getMaterialsRfid, rfid));
+        if (materials != null && materials.getMaterialsTypeId() != null) {
+            MaterialsTypeDO materialsType = materialsTypeService.getById(materials.getMaterialsTypeId());
+            if (materialsType != null) {
+                materials.setMaterialsTypeIcon(materialsType.getMaterialsTypeIcon());
+                materials.setMaterialsTypePicture(materialsType.getMaterialsTypePicture());
+                materials.setPropertyIds(materialsType.getPropertyIds());
+            }
+        }
+        return materials;
+    }
+
+    @Override
+    public List<MaterialsDO> selectMaterialsByRfidList(RfidListDTO dto) {
+        Assert.isFalse(dto.getList().isEmpty(), "物资RFID不能为空!");
+        List<MaterialsDO> materialsList = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .in(MaterialsDO::getMaterialsRfid, dto.getList()));
+        if (!materialsList.isEmpty()) {
+            List<Long> materialsTypeIds = materialsList.stream().map(MaterialsDO::getMaterialsTypeId).distinct().collect(Collectors.toList());
+            if (!materialsTypeIds.isEmpty()) {
+                List<MaterialsTypeDO> isMaterialsTypes = materialsTypeService.listByIds(materialsTypeIds);
+                for (MaterialsDO materials : materialsList) {
+                    for (MaterialsTypeDO materialsType : isMaterialsTypes) {
+                        if (materials.getMaterialsTypeId().equals(materialsType.getId())) {
+                            materials.setMaterialsTypeIcon(materialsType.getMaterialsTypeIcon());
+                            materials.setMaterialsTypePicture(materialsType.getMaterialsTypePicture());
+                            materials.setPropertyIds(materialsType.getPropertyIds());
+                        }
+                    }
+                }
+            }
+        }
+        return materialsList;
+    }
+
+    @Override
+    public CabinetMaterialsVO selectCabinetMaterials(CabinetRfidListDTO dto) {
+        Assert.notBlank(dto.getCabinetCode(), "物资柜子code不能为空!");
+        Assert.isFalse(dto.getList().isEmpty(), "物资中无物资!");
+        MaterialsCabinetDO cabinet = materialsCabinetService.getCabinetByCode(dto.getCabinetCode());
+        Assert.isFalse(cabinet == null, dto.getCabinetCode() + "物资柜code不存在!");
+        List<MaterialsDO> list = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .eq(MaterialsDO::getMaterialsCabinetId, cabinet.getId())
+                .in(MaterialsDO::getMaterialsRfid, dto.getList()));
+        // 假设都是不属于该柜子的
+        List<String> notCabinetRfidList = dto.getList();
+        // 属于该柜子的rfid
+        List<String> cabinetRfidList = new ArrayList<>();
+        if (!list.isEmpty()) {
+            cabinetRfidList = list.stream().map(MaterialsDO::getMaterialsRfid).collect(Collectors.toList());
+            // 把假设的里面的是属于该柜子的删除掉
+            notCabinetRfidList.removeIf(cabinetRfidList::contains);
+        }
+        CabinetMaterialsVO cabinetMaterialsVO = new CabinetMaterialsVO();
+        cabinetMaterialsVO.setIsMaterialsCabinet(cabinet);
+        cabinetMaterialsVO.setCabinetRfidList(cabinetRfidList);
+        cabinetMaterialsVO.setNotCabinetRfidList(notCabinetRfidList);
+        return cabinetMaterialsVO;
+    }
+
+    @Override
+    public String updateMaterialReceiveReturn(RecRetParamDTO recRetParamDTO) {
+        if (!recRetParamDTO.getList().isEmpty()) {
+            Long userId = getLoginUserId();
+            List<String> failRfidList = new ArrayList<>();
+            for (RecRetMaterialDTO dto : recRetParamDTO.getList()) {
+                // 1.断言判断
+                Assert.notBlank(dto.getMaterialsRfid(), "请告诉我物资的rfid!");
+                Assert.notBlank(dto.getLoanState(), "请告诉我是借出还是归还!");
+                try {
+                    // 1.1 开始查询物资,物资柜传的rfid
+                    MaterialsDO materials = materialsService.getOne(Wrappers.<MaterialsDO>lambdaQuery()
+                            .eq(MaterialsDO::getMaterialsRfid, dto.getMaterialsRfid()));
+                    Assert.isFalse(materials == null, "通过RFID:" + dto.getMaterialsRfid() + "未查询到物资!");
+                    // 如果物资是借出状态,又来借出就报错
+                    if ("0".equals(materials.getLoanState()) && "0".equals(dto.getLoanState())) {
+                        failRfidList.add(dto.getMaterialsRfid() + "物资已经是借出状态,无法再借出!");
+                        Assert.isFalse(true, dto.getMaterialsRfid() + "物资已经是借出状态,无法再借出!");
+                    }
+                    // 如果已经再柜中,又来放入
+                    if ("1".equals(materials.getLoanState()) && "1".equals(dto.getLoanState())) {
+                        failRfidList.add(dto.getMaterialsRfid() + "物资已经是柜中状态,无法再放入!");
+                        Assert.isFalse(true, dto.getMaterialsRfid() + "物资已经是柜中状态,无法再放入!");
+                    }
+                    // 2.开始更新物资状态
+                    materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                            .eq(MaterialsDO::getMaterialsRfid, dto.getMaterialsRfid())
+                            .set(MaterialsDO::getLoanState, dto.getLoanState())
+                            .set(MaterialsDO::getUpdateTime, new Date()));
+                    // 4.开始更新借出表信息
+                    if ("0".equals(dto.getLoanState())) {
+                        // 4.1开始新增借出记录表
+                        AddLoanDTO addMaterialsLoan = new AddLoanDTO();
+                        addMaterialsLoan.setMaterialsId(materials.getId());
+                        addMaterialsLoan.setLoanUserId(userId);
+                        materialsLoanService.createMaterialsLoan(addMaterialsLoan);
+                    } else if ("1".equals(dto.getLoanState())) {
+                        // 1.2 开始查询物资柜子,物资柜传的code
+                        MaterialsCabinetDO cabinet = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                                .eq(MaterialsCabinetDO::getCabinetCode, dto.getRestitutionToCabinetCode()));
+                        Assert.isFalse(cabinet == null, "通过物资柜code:" + dto.getRestitutionToCabinetCode() + "未查询到物资柜信息!");
+                        // 4.2开始更新归还记录表
+                        ReturnLoanDTO returnLoanDTO = new ReturnLoanDTO();
+                        returnLoanDTO.setMaterialsId(materials.getId());
+                        returnLoanDTO.setRestitutionUserId(userId);
+                        returnLoanDTO.setRestitutionToId(cabinet.getId());
+                        materialsLoanService.returnIsMaterialsLoan(returnLoanDTO);
+                    }
+                } catch (Exception e) {
+                    log.error("存在异常的存取数据:{}", e);
+                    failRfidList.add(dto.getMaterialsRfid());
+                }
+            }
+            // 5.检查有没有异常的物资,如果有,则返回提示
+            if (!failRfidList.isEmpty()) {
+                return "以下RFID本次存取失败:" + failRfidList;
+            }
+        }
+        return "true";
+    }
+
+    @Override
+    public List<InstructionVO> getInstructionsList() {
+        // 1.获取所有使用说明
+        List<MaterialsInstructionsDO> instructions = materialsInstructionsService.list();
+        ArrayList<InstructionVO> instructionVOS = new ArrayList<>();
+        ArrayList<MaterialsInstructionsDO> isMaterialsInstructions = new ArrayList<>();
+        int allSum = 0;
+        if (!instructions.isEmpty()) {
+            // 2.有值才有意义,获取所属的物资类型
+            List<Long> typeIds = instructions.stream().map(MaterialsInstructionsDO::getMaterialsTypeId).distinct().collect(Collectors.toList());
+            if (!typeIds.isEmpty()) {
+                // 3.查询物资分类数据
+                List<MaterialsTypeDO> isMaterialsTypes = materialsTypeService.listByIds(typeIds);
+                if (!isMaterialsTypes.isEmpty()) {
+                    for (MaterialsTypeDO isMaterialsType : isMaterialsTypes) {
+                        InstructionVO instructionVO = new InstructionVO();
+                        instructionVO.setMaterialsTypeId(isMaterialsType.getId());
+                        instructionVO.setMaterialsTypeName(isMaterialsType.getMaterialsTypeName());
+                        instructionVO.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                        instructionVO.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                        List<MaterialsInstructionsDO> instructionsList = instructions.stream().filter(o -> o.getMaterialsTypeId().equals(isMaterialsType.getId())).collect(Collectors.toList());
+                        instructionVO.setInstructions(instructionsList);
+                        instructionVO.setNumber(instructionsList.size());
+                        allSum = allSum + instructionsList.size();
+                        instructionVOS.add(instructionVO);
+                        isMaterialsInstructions.addAll(instructionsList);
+                    }
+                }
+            }
+        }
+        InstructionVO instructionVOAll = new InstructionVO();
+        instructionVOAll.setMaterialsTypeId(0L);
+        instructionVOAll.setMaterialsTypeName("全部");
+        instructionVOAll.setInstructions(isMaterialsInstructions);
+        instructionVOAll.setNumber(allSum);
+        instructionVOS.add(0, instructionVOAll);
+        return instructionVOS;
+    }
+
+    @Override
+    public CabinetCheckVO getLastCheckPlanByCabinetCode(String cabinetCode) {
+        Assert.notBlank(cabinetCode, "请告诉我这是哪台物资柜!");
+        // 1.获取物资柜信息
+        MaterialsCabinetDO cabinet = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                .eq(MaterialsCabinetDO::getCabinetCode, cabinetCode)
+                .orderByDesc(MaterialsCabinetDO::getId)
+                .last("limit 1"));
+        Assert.isFalse(cabinet == null, "物资柜信息不存在!");
+        // 2.获取用户信息
+        Long userId = getLoginUserId();
+        // 3.获取这个物资柜当前最近一次未完成的检查计划
+        MaterialsPlanCabinetDO planCabinet = materialsPlanCabinetService.getOne(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinet.getId())
+                .eq(MaterialsPlanCabinetDO::getCheckUserId, userId)
+                .ne(MaterialsPlanCabinetDO::getStatus, "1")
+                .orderByDesc(MaterialsPlanCabinetDO::getPlanId)
+                .last("limit 1"));
+        Assert.isFalse(planCabinet == null, "该物资柜当前无您的检查计划!");
+        // 3.1检查当前登陆人的账号是否有检查计划
+        MaterialsCheckPlanDO checkPlan = materialsCheckPlanService.getOne(Wrappers.<MaterialsCheckPlanDO>lambdaQuery()
+                .eq(MaterialsCheckPlanDO::getId, planCabinet.getPlanId())
+                .eq(MaterialsCheckPlanDO::getCheckUserId, userId));
+        Assert.isFalse(checkPlan == null, "当前物资柜无需您执行的检查计划!");
+        // 3.2查询此次检查记录
+        List<MaterialsCheckRecordDO> checkRecords = materialsCheckRecordService.list(Wrappers.<MaterialsCheckRecordDO>lambdaQuery()
+                .eq(MaterialsCheckRecordDO::getPlanId, planCabinet.getPlanId()));
+        List<Long> checkMaterialsIds = null;
+        if (!checkRecords.isEmpty()) {
+            checkMaterialsIds = checkRecords.stream().map(MaterialsCheckRecordDO::getMaterialsId).collect(Collectors.toList());
+
+        }
+        // 4.确实都存在,那就开始查数据了
+        // 4.1 开始更新这个检查计划的状态,分为总状态和该物资柜的状态
+        // updateCheckPlanStatus(planCabinet, checkPlan);
+        // 4.2查询该物资柜的所有物资
+        List<MaterialsDO> materials = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .in(checkMaterialsIds != null && !checkMaterialsIds.isEmpty(), MaterialsDO::getId, checkMaterialsIds)
+                .eq(MaterialsDO::getMaterialsCabinetId, cabinet.getId())
+        );
+        List<MaterialsCheckVO> materialsCheckVOS = new ArrayList<>();
+        if (!materials.isEmpty()) {
+            List<Long> typeIds = materials.stream().map(MaterialsDO::getMaterialsTypeId).distinct().collect(Collectors.toList());
+            if (!typeIds.isEmpty()) {
+                List<MaterialsTypeDO> isMaterialsTypes = materialsTypeService.listByIds(typeIds);
+                if (!isMaterialsTypes.isEmpty()) {
+                    for (MaterialsTypeDO isMaterialsType : isMaterialsTypes) {
+                        // 该分类下所有的物资
+                        List<MaterialsDO> allMaterials = materials.stream().filter(o -> o.getMaterialsTypeId() != null && o.getMaterialsTypeId().equals(isMaterialsType.getId())).toList();
+                        // 该分类下借出数量
+                        int loanNumber = (int) allMaterials.stream().filter(o -> "0".equals(o.getLoanState())).count();
+                        // 该分类下待检数量
+                        int checkNumber = 0;
+                        // 该分类下正常数量
+                        Integer normalNumber = null;
+                        // 该分类下过期数量
+                        Integer timeoutNumber = null;
+                        // 该分类下损坏数量
+                        Integer badNumber = null;
+                        // --获取所有在柜子里的,在柜子需要检查
+                        List<MaterialsDO> checkMaterials = allMaterials.stream().filter(o -> "1".equals(o.getLoanState())).collect(Collectors.toList());
+                        // --查询已经检测的
+                        if (!checkMaterials.isEmpty()) {
+                            List<Long> checkMaterialIds = checkMaterials.stream().map(MaterialsDO::getId).collect(Collectors.toList());
+                            List<MaterialsCheckRecordDO> checkedMaterials = materialsCheckRecordService.list(Wrappers.<MaterialsCheckRecordDO>lambdaQuery()
+                                    .eq(MaterialsCheckRecordDO::getCabinetId, cabinet.getId())
+                                    .eq(MaterialsCheckRecordDO::getPlanId, checkPlan.getId())
+                                    .isNotNull(MaterialsCheckRecordDO::getStatus)
+                                    .ne(MaterialsCheckRecordDO::getStatus, "")
+                                    .in(MaterialsCheckRecordDO::getMaterialsId, checkMaterialIds));
+                            int checkedNumber = checkedMaterials.isEmpty() ? 0 : checkedMaterials.size();
+                            // --所有的在柜子中的物资 - 这些物资已经在这次计划中检查过的
+                            checkNumber = checkMaterials.size() - checkedNumber;
+                            // 该分类下正常数量
+                            normalNumber = (int) checkedMaterials.stream().filter(o -> "0".equals(o.getStatus())).count();
+                            // 该分类下过期数量
+                            timeoutNumber = (int) checkedMaterials.stream().filter(o -> "1".equals(o.getStatus()) && "2".equals(o.getReason())).count();
+                            // 该分类下损坏数量
+                            badNumber = (int) checkedMaterials.stream().filter(o -> "1".equals(o.getStatus()) && "1".equals(o.getReason())).count();
+                        }
+                        MaterialsCheckVO materialsCheckVO = new MaterialsCheckVO();
+                        materialsCheckVO.setMaterialsTypeId(isMaterialsType.getId());
+                        materialsCheckVO.setMaterialsTypeName(isMaterialsType.getMaterialsTypeName());
+                        materialsCheckVO.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                        materialsCheckVO.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                        materialsCheckVO.setAllNumber(allMaterials.size());
+                        materialsCheckVO.setLoanNumber(loanNumber);
+                        materialsCheckVO.setCheckNumber(checkNumber);
+                        materialsCheckVO.setNormalNumber(normalNumber);
+                        materialsCheckVO.setTimeoutNumber(timeoutNumber);
+                        materialsCheckVO.setBadNumber(badNumber);
+                        materialsCheckVOS.add(materialsCheckVO);
+                    }
+                }
+            }
+        }
+        CabinetCheckVO cabinetCheckVO = new CabinetCheckVO();
+        cabinetCheckVO.setPlanId(checkPlan.getId());
+        cabinetCheckVO.setPlanName(checkPlan.getPlanName());
+        cabinetCheckVO.setPlanDate(checkPlan.getPlanDate());
+        cabinetCheckVO.setStatus(checkPlan.getStatus());
+        cabinetCheckVO.setSignatureTime(planCabinet.getSignatureTime());
+        cabinetCheckVO.setSignatureImg(planCabinet.getSignatureImg());
+        cabinetCheckVO.setList(materialsCheckVOS);
+        return cabinetCheckVO;
+    }
+
+    private Boolean updateCheckPlanStatus(MaterialsPlanCabinetDO planCabinet, MaterialsCheckPlanDO checkPlan) {
+        // 1.如果柜子的检查状态是未开始,则更新成进行中
+        if (checkPlan.getStatus().equals(0)) {
+            materialsCheckPlanService.update(Wrappers.<MaterialsCheckPlanDO>lambdaUpdate()
+                    .eq(MaterialsCheckPlanDO::getId, checkPlan.getId())
+                    .set(MaterialsCheckPlanDO::getStatus, "2"));
+            if (planCabinet.getStatus().equals("0")) {
+                materialsPlanCabinetService.update(Wrappers.<MaterialsPlanCabinetDO>lambdaUpdate()
+                        .eq(MaterialsPlanCabinetDO::getPlanId, planCabinet.getPlanId())
+                        .eq(MaterialsPlanCabinetDO::getCabinetId, planCabinet.getCabinetId())
+                        .set(MaterialsPlanCabinetDO::getStatus, "2"));
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public CabinetHomePageVO getCabinetHomePage(String cabinetCode) {
+        Assert.notBlank(cabinetCode, "请告诉我这是哪台物资柜!");
+        // 1.获取物资柜信息
+        MaterialsCabinetDO cabinet = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                .eq(MaterialsCabinetDO::getCabinetCode, cabinetCode)
+                .orderByDesc(MaterialsCabinetDO::getId)
+                .last("limit 1"));
+        Assert.isFalse(cabinet == null, "物资柜信息不存在!");
+        // 1.1柜子中的物资信息
+        List<MaterialsDO> isMaterials = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .eq(MaterialsDO::getMaterialsCabinetId, cabinet.getId()));
+        // 2.获取用户信息
+        Long userId = getLoginUserId();
+        // 3.获取本人在该物资柜子上有效取还数据
+        Integer rarNumber = null;
+        if (isMaterials.isEmpty()) {
+            rarNumber = 0;
+        } else {
+            List<Long> materialsIds = isMaterials.stream()
+                    .filter(o -> StringUtils.isNotBlank(o.getLoanState()) && o.getLoanState().equals("0"))
+                    .map(MaterialsDO::getId).collect(Collectors.toList());
+            if (!materialsIds.isEmpty()) {
+                List<MaterialsLoanDO> loanList = materialsLoanService.list(Wrappers.<MaterialsLoanDO>lambdaQuery()
+                        .in(MaterialsLoanDO::getMaterialsId, materialsIds)
+                        .eq(MaterialsLoanDO::getLoanFromId, cabinet.getId())
+                        .eq(MaterialsLoanDO::getLoanUserId, userId)
+                        .ne(MaterialsLoanDO::getStatus, "1"));
+                if (!loanList.isEmpty()) {
+                    rarNumber = loanList.size();
+                }
+            }
+        }
+        // 4.获取该物资柜的需要更换数量,在柜子里,损坏或者过期
+        int changeNumber = (int) isMaterials.stream().filter(o ->
+                StringUtils.isNotBlank(o.getLoanState()) && StringUtils.isNotBlank(o.getStatus()) && (o.getStatus().equals("1") || o.getStatus().equals("2"))
+        ).count();
+        // 5.获取本人在该物资柜上未完成的检查计划
+        Integer checkNumber = null;
+        /*List<IsMaterialsPlanCabinet> planCabinets = materialsPlanCabinetService.list(Wrappers.<IsMaterialsPlanCabinet>lambdaQuery()
+                .eq(IsMaterialsPlanCabinet::getCabinetId, cabinet.getCabinetId())
+                .isNull(IsMaterialsPlanCabinet::getSignatureImg)
+                .isNull(IsMaterialsPlanCabinet::getSignatureTime));
+        if (!planCabinets.isEmpty()) {
+            List<Long> planIds = planCabinets.stream().map(IsMaterialsPlanCabinet::getPlanId).distinct().collect(Collectors.toList());
+            List<IsMaterialsCheckPlan> myCheckPlans = materialsCheckPlanService.list(Wrappers.<IsMaterialsCheckPlan>lambdaQuery()
+                    .eq(IsMaterialsCheckPlan::getCheckUserId, userId)
+                    .in(IsMaterialsCheckPlan::getPlanId, planIds)
+                    .eq(IsMaterialsCheckPlan::getStatus, "0"));
+            if (!myCheckPlans.isEmpty()) {
+                checkNumber = myCheckPlans.size();
+            }
+        }*/
+        List<MaterialsPlanCabinetDO> myNotFinishPlans = materialsPlanCabinetService.list(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getCheckUserId, userId)
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinet.getId())
+                .ne(MaterialsPlanCabinetDO::getSubmit, "1")
+                .ne(MaterialsPlanCabinetDO::getStatus, "1"));
+        if (!myNotFinishPlans.isEmpty()) {
+            checkNumber = 1;
+        }
+        // 6.获取物资分类下的可借数据
+        List<MaterialsHomeVO> materialsHomeVOS = new ArrayList<>();
+        List<MaterialsDO> materials = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                .eq(MaterialsDO::getMaterialsCabinetId, cabinet.getId()));
+        if (!materials.isEmpty()) {
+            List<Long> typeIds = materials.stream().map(MaterialsDO::getMaterialsTypeId).distinct().collect(Collectors.toList());
+            if (!typeIds.isEmpty()) {
+                List<MaterialsTypeDO> isMaterialsTypes = materialsTypeService.listByIds(typeIds);
+                if (!isMaterialsTypes.isEmpty()) {
+                    for (MaterialsTypeDO isMaterialsType : isMaterialsTypes) {
+                        MaterialsHomeVO materialsHomeVO = new MaterialsHomeVO();
+                        materialsHomeVO.setMaterialsTypeId(isMaterialsType.getId());
+                        materialsHomeVO.setMaterialsTypeName(isMaterialsType.getMaterialsTypeName());
+                        materialsHomeVO.setMaterialsTypeIcon(isMaterialsType.getMaterialsTypeIcon());
+                        materialsHomeVO.setMaterialsTypePicture(isMaterialsType.getMaterialsTypePicture());
+                        List<MaterialsDO> allMaterials = materials.stream().filter(o -> o.getMaterialsTypeId() != null && o.getMaterialsTypeId().equals(isMaterialsType.getId())).toList();
+                        materialsHomeVO.setAllNumber(allMaterials.size());
+                        int borrowableNumber = (int) allMaterials.stream().filter(o -> "1".equals(o.getLoanState()) && "0".equals(o.getStatus())).count();
+                        materialsHomeVO.setBorrowableNumber(borrowableNumber);
+                        materialsHomeVOS.add(materialsHomeVO);
+                    }
+                }
+            }
+        }
+        CabinetHomePageVO cabinetHomePageVO = new CabinetHomePageVO();
+        cabinetHomePageVO.setRarNumber(rarNumber);
+        cabinetHomePageVO.setCheckNumber(checkNumber);
+        cabinetHomePageVO.setChangeNumber(changeNumber);
+        cabinetHomePageVO.setList(materialsHomeVOS);
+        return cabinetHomePageVO;
+    }
+
+    @Override
+    public MaterialsCheckInitVO getCheckMaterialsByCabinetCode(String cabinetCode, Long planId) {
+        Assert.notBlank(cabinetCode, "cabinetCode不能为空!");
+        Assert.notNull(planId, "检查计划planId不能为空!");
+        MaterialsCabinetDO cabinet = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                .eq(MaterialsCabinetDO::getCabinetCode, cabinetCode));
+        Assert.isFalse(cabinet == null, "物资柜信息不存在!");
+        MaterialsCheckInitVO materialsCheckInitVO = new MaterialsCheckInitVO();
+        // 检查此次数据是否初始化,初始化了,就不用生成直接查
+        List<MaterialsCheckRecordDO> checkRecords = materialsCheckRecordService.getCheckMaterialsByCabinetCode(planId, cabinet.getId());
+        ArrayList<MaterialsCheckRecordDO> checkRecordArrayList = new ArrayList<>();
+        List<CheckMaterialsDateVO> vos = materialsService.getCheckMaterialsByCabinetId(cabinet.getId());
+        if (!checkRecords.isEmpty()) {
+            materialsCheckInitVO.setList(checkRecords);
+        } else {
+            for (CheckMaterialsDateVO vo : vos) {
+                MaterialsCheckRecordDO checkRecord = new MaterialsCheckRecordDO();
+                checkRecord.setPlanId(planId);
+                checkRecord.setCabinetId(cabinet.getId());
+                checkRecord.setMaterialsId(vo.getMaterialsId());
+                checkRecord.setCheckUserId(getLoginUserId());
+                checkRecord.setCheckDate(new Date());
+                checkRecord.setMaterialsRfid(vo.getMaterialsRfid());
+                checkRecord.setMaterialsTypeIcon(vo.getMaterialsTypeIcon());
+                checkRecord.setMaterialsTypePicture(vo.getMaterialsTypePicture());
+                checkRecord.setMaterialsTypeName(vo.getMaterialsTypeName());
+                checkRecord.setMaterialsName(vo.getMaterialsName());
+                checkRecordArrayList.add(checkRecord);
+                materialsCheckRecordService.save(checkRecord);
+            }
+            materialsCheckInitVO.setList(checkRecordArrayList);
+        }
+
+        // 查询物资检查标准
+        Set<CheckStandardVO> sets = new HashSet<>();
+        for (CheckMaterialsDateVO vo : vos) {
+            CheckStandardVO checkStandardVO = new CheckStandardVO();
+            checkStandardVO.setMaterialsTypeId(vo.getMaterialsTypeId());
+            checkStandardVO.setMaterialsTypeName(vo.getMaterialsTypeName());
+            checkStandardVO.setMaterialsTypeIcon(vo.getMaterialsTypeIcon());
+            checkStandardVO.setMaterialsTypePicture(vo.getMaterialsTypePicture());
+            checkStandardVO.setCheckStandard(vo.getCheckStandard());
+            sets.add(checkStandardVO);
+        }
+        materialsCheckInitVO.setStandards(new ArrayList<>(sets));
+        // 获取下方检查统计
+        CheckProgressVO checkProgressVO = new CheckProgressVO();
+        checkProgressVO.setCheckNum(0);
+        checkProgressVO.setNormalNum(0);
+        checkProgressVO.setTimeOutNum(0);
+        checkProgressVO.setBadNum(0);
+        if (checkRecords.isEmpty()) {
+            checkProgressVO.setCheckNum(materialsCheckInitVO.getList().size());
+        } else {
+            int checkNum = (int) checkRecords.stream().filter(o -> StringUtils.isBlank(o.getStatus())).count();
+            int normalNum = (int) checkRecords.stream().filter(o -> StringUtils.isNotBlank(o.getStatus()) && "0".equals(o.getStatus())).count();
+            int timeOutNum = (int) checkRecords.stream().filter(o -> StringUtils.isNotBlank(o.getStatus()) && "1".equals(o.getStatus())
+                    && "2".equals(o.getReason())).count();
+            int badNum = (int) checkRecords.stream().filter(o -> StringUtils.isNotBlank(o.getStatus()) && "1".equals(o.getStatus())
+                    && "1".equals(o.getReason())).count();
+            checkProgressVO.setCheckNum(checkNum);
+            checkProgressVO.setNormalNum(normalNum);
+            checkProgressVO.setTimeOutNum(timeOutNum);
+            checkProgressVO.setBadNum(badNum);
+        }
+        materialsCheckInitVO.setCheckProgressVO(checkProgressVO);
+        return materialsCheckInitVO;
+    }
+
+    @Override
+    public Boolean insertCheckRecord(CheckParamDTO dto) {
+        if (!dto.getList().isEmpty()) {
+            Long userId = getLoginUserId();
+            // 0.检查是否已经提交,如果已经提交则不允许再次提交
+            List<Long> cabinetIds = dto.getList().stream().map(MaterialsCheckRecordDO::getCabinetId).distinct().collect(Collectors.toList());
+            Assert.isFalse(cabinetIds.isEmpty(), "物资柜不能为空!");
+            Assert.notNull(dto.getList().get(0).getPlanId(), "检查计划ID不能为空!");
+            List<MaterialsPlanCabinetDO> list1 = materialsPlanCabinetService.list(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                    .eq(MaterialsPlanCabinetDO::getPlanId, dto.getList().get(0).getPlanId())
+                    .in(MaterialsPlanCabinetDO::getCabinetId, cabinetIds)
+                    .eq(MaterialsPlanCabinetDO::getSubmit, "1"));
+            Assert.isTrue(list1.isEmpty(), "存在重复提交检查记录,请检查!");
+
+            for (MaterialsCheckRecordDO isMaterialsCheckRecord : dto.getList()) {
+                Assert.notNull(isMaterialsCheckRecord.getId(), "记录id不能为空!");
+                isMaterialsCheckRecord.setCheckDate(new Date());
+                isMaterialsCheckRecord.setCheckUserId(userId);
+                materialsCheckRecordService.updateById(isMaterialsCheckRecord);
+            }
+        }
+        return true;
+    }
+
+    @Transactional
+    @Override
+    public Boolean insertSubmitPlan(SubmitPlanDTO dto) {
+        Assert.notNull(dto.getPlanId(), "计划id不能空!");
+        Assert.notBlank(dto.getCabinetCode(), "物资柜code不能为空!");
+        MaterialsCabinetDO cabinetByCode = materialsCabinetService.getCabinetByCode(dto.getCabinetCode());
+        Assert.isFalse(cabinetByCode == null, "物资柜信息不存在!");
+        // 1.检查初始化的物资检查数据有没有检查完毕
+        List<MaterialsCheckRecordDO> list = materialsCheckRecordService.list(Wrappers.<MaterialsCheckRecordDO>lambdaQuery()
+                .eq(MaterialsCheckRecordDO::getCabinetId, cabinetByCode.getId())
+                .eq(MaterialsCheckRecordDO::getPlanId, dto.getPlanId()));
+        Assert.isFalse(list.isEmpty(), "暂无检查数据需要提交!");
+        List<MaterialsCheckRecordDO> collect = list.stream().filter(o -> o.getStatus() == null || StringUtils.isBlank(o.getStatus())).collect(Collectors.toList());
+        Assert.isTrue(collect.isEmpty(), "存在未检查的物资,请重新盘查!");
+        // 2.检查签名是否上传
+        MaterialsPlanCabinetDO one = materialsPlanCabinetService.getOne(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinetByCode.getId())
+                .eq(MaterialsPlanCabinetDO::getPlanId, dto.getPlanId()));
+        Assert.notBlank(one.getSignatureImg(), "您的签名暂未上传,不可提交!");
+        // 3.都完事了,开始更新物资的状态,该物资柜的提交状态,物资计划的状态
+        for (MaterialsCheckRecordDO checkRecord : list) {
+            // 3.1.开始更新物资本身状态
+            if ("1".equals(checkRecord.getStatus()) && StringUtils.isNotBlank(checkRecord.getReason())) {
+                //  reason字典值exceptions_status 对应调整material_info_status  损坏和过期时对应的,所以直接set
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, checkRecord.getMaterialsId())
+                        .set(MaterialsDO::getStatus, checkRecord.getReason()));
+            } else {
+                materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                        .eq(MaterialsDO::getId, checkRecord.getMaterialsId())
+                        .set(MaterialsDO::getStatus, "0"));
+            }
+        }
+        // 4.提交该物资柜的提交状态
+        materialsPlanCabinetService.update(Wrappers.<MaterialsPlanCabinetDO>lambdaUpdate()
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinetByCode.getId())
+                .eq(MaterialsPlanCabinetDO::getPlanId, dto.getPlanId())
+                .set(MaterialsPlanCabinetDO::getSubmit, "1")
+                .set(MaterialsPlanCabinetDO::getStatus, "1")
+        );
+        // 5.检查此次计划所有的物资柜是不是都提交了,如果都提交了,则可以直接更新计划完成
+        List<MaterialsPlanCabinetDO> list1 = materialsPlanCabinetService.list(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getPlanId, dto.getPlanId())
+                .ne(MaterialsPlanCabinetDO::getStatus, "1"));
+        if (list1.isEmpty()) {
+            materialsCheckPlanService.update(Wrappers.<MaterialsCheckPlanDO>lambdaUpdate()
+                    .eq(MaterialsCheckPlanDO::getId, dto.getPlanId())
+                    .set(MaterialsCheckPlanDO::getStatus, "1"));
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean insertSign(SignDTO dto) {
+        Assert.notBlank(dto.getCabinetCode(), "物资柜code不能为空!");
+        Assert.notNull(dto.getPlanId(), "计划id不能为空!");
+        Assert.notBlank(dto.getSignatureImg(), "签名不能为空!");
+        MaterialsCabinetDO cabinet = materialsCabinetService.getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                .eq(MaterialsCabinetDO::getCabinetCode, dto.getCabinetCode()));
+        Assert.isFalse(cabinet == null, "物资柜信息不存在!");
+        /*MaterialsPlanCabinetDO one = materialsPlanCabinetService.getOne(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getPlanId, dto.getPlanId())
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinet.getCabinetId()));
+        Assert.isFalse(StringUtils.isNoneBlank(one.getSignatureImg()), "您已签名,请勿重复!");*/
+        materialsPlanCabinetService.update(Wrappers.<MaterialsPlanCabinetDO>lambdaUpdate()
+                .eq(MaterialsPlanCabinetDO::getPlanId, dto.getPlanId())
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinet.getId())
+                .set(MaterialsPlanCabinetDO::getSignatureImg, dto.getSignatureImg())
+                .set(MaterialsPlanCabinetDO::getSignatureTime, new Date()));
+        return true;
+    }
+
+    @Override
+    public AutoReplaceReportVO insertAutoChange(AutoChangeDTO dto) {
+        Assert.notBlank(dto.getCabinetCode(), "物资柜CODE不能为空!");
+        MaterialsCabinetDO cabinetByCode = materialsCabinetService.getCabinetByCode(dto.getCabinetCode());
+        // 0.构造记录的集合
+        List<MaterialsChangeRecordDO> isMaterialsChangeRecords = new ArrayList<>();
+        Long userId = getLoginUserId();
+        Date date = new Date();
+        List<MaterialsDO> unbingdingList = new ArrayList<>();
+        List<MaterialsDO> bingdingList = new ArrayList<>();
+        // 1.开始解绑
+        if (!dto.getUnbindMaterialRfidList().isEmpty()) {
+            materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                    .in(MaterialsDO::getMaterialsRfid, dto.getUnbindMaterialRfidList())
+                    .set(MaterialsDO::getMaterialsCabinetId, null)
+                    .set(MaterialsDO::getLoanState, "0"));
+            unbingdingList = materialsService.getMaterialListByRfid(dto.getUnbindMaterialRfidList());
+            for (MaterialsDO materials : unbingdingList) {
+                MaterialsChangeRecordDO isMaterialsChangeRecord = new MaterialsChangeRecordDO();
+                isMaterialsChangeRecord.setOldMaterialsId(materials.getId());
+                isMaterialsChangeRecord.setOldMaterialsRfid(materials.getMaterialsRfid());
+                isMaterialsChangeRecord.setChangeUserId(userId);
+                isMaterialsChangeRecord.setChangeDate(date);
+                isMaterialsChangeRecord.setChangeType("1");
+                isMaterialsChangeRecord.setOperateType("0");
+                isMaterialsChangeRecords.add(isMaterialsChangeRecord);
+            }
+        }
+        // 2.开始绑定
+        if (!dto.getBindingMaterialRfidList().isEmpty()) {
+            // 判定绑定的物资数据是否存在,存在的话是不是异常的数据
+            materialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                    .in(MaterialsDO::getMaterialsRfid, dto.getBindingMaterialRfidList())
+                    .set(MaterialsDO::getMaterialsCabinetId, cabinetByCode.getId())
+                    .set(MaterialsDO::getLoanState, "1"));
+                    // .set(IsMaterials::getStatus, "0"));
+            bingdingList = materialsService.getMaterialListByRfid(dto.getBindingMaterialRfidList());
+            // Assert.isFalse(bingdingList.size() != dto.getBindingMaterialRfidList().size(), "缺邵需要绑定的物资");
+            for (MaterialsDO materials : bingdingList) {
+                Assert.isTrue(materials.getStatus().equals("0"), "存在异常的替换物资!");
+                MaterialsChangeRecordDO isMaterialsChangeRecord = new MaterialsChangeRecordDO();
+                isMaterialsChangeRecord.setNewMaterialsId(materials.getId());
+                isMaterialsChangeRecord.setNewMaterialsRfid(materials.getMaterialsRfid());
+                isMaterialsChangeRecord.setChangeUserId(userId);
+                isMaterialsChangeRecord.setChangeDate(date);
+                isMaterialsChangeRecord.setChangeType("1");
+                isMaterialsChangeRecord.setOperateType("1");
+                isMaterialsChangeRecords.add(isMaterialsChangeRecord);
+                // 处理绑定入柜的物资的借取记录
+                materialsLoanService.update(Wrappers.<MaterialsLoanDO>lambdaUpdate()
+                        .eq(MaterialsLoanDO::getMaterialsId, materials.getId())
+                        .set(MaterialsLoanDO::getRestitutionUserId, getLoginUserId())
+                        .set(MaterialsLoanDO::getActualRestitutionTime, new Date())
+                        .set(MaterialsLoanDO::getStatus, "1"));
+                // 处理归还异常
+                exceptionMisplaceService.update(Wrappers.<ExceptionMisplaceDO>lambdaUpdate()
+                        .eq(ExceptionMisplaceDO::getMaterialsId, materials.getId())
+                        .set(ExceptionMisplaceDO::getRestitutionUserId, getLoginUserId())
+                        .set(ExceptionMisplaceDO::getHandleTime, new Date())
+                        .set(ExceptionMisplaceDO::getStatus, "1"));
+            }
+        }
+        // 3.如果有数据则插入
+        if (!isMaterialsChangeRecords.isEmpty()) {
+            materialsChangeRecordService.saveBatch(isMaterialsChangeRecords);
+        }
+        // 4.开始整理此次的总结
+        AutoReplaceReportVO autoReplaceReportVO = new AutoReplaceReportVO();
+        autoReplaceReportVO.setCreateTime(date);
+        autoReplaceReportVO.setNikeName(getLoginUserNickname());
+        // 4.1放入物资
+        List<AutoReplaceMaterialVO> bindingMaterialVOS = new ArrayList<>();
+        if (!bingdingList.isEmpty()) {
+            for (MaterialsDO materials : bingdingList) {
+                AutoReplaceMaterialVO autoReplaceMaterialVO = new AutoReplaceMaterialVO();
+                autoReplaceMaterialVO.setMaterialsName(materials.getMaterialsName());
+                autoReplaceMaterialVO.setMaterialsTypeIcon(materials.getMaterialsTypeIcon());
+                autoReplaceMaterialVO.setMaterialsTypePicture(materials.getMaterialsTypePicture());
+                autoReplaceMaterialVO.setMaterialsRfid(materials.getMaterialsRfid());
+                autoReplaceMaterialVO.setStatus(materials.getStatus());
+                bindingMaterialVOS.add(autoReplaceMaterialVO);
+            }
+        }
+        autoReplaceReportVO.setBindingList(bindingMaterialVOS);
+        // 4.2取出物资
+        List<AutoReplaceMaterialVO> unbindingMaterialVOS = new ArrayList<>();
+        if (!unbingdingList.isEmpty()) {
+            for (MaterialsDO materials : unbingdingList) {
+                AutoReplaceMaterialVO autoReplaceMaterialVO = new AutoReplaceMaterialVO();
+                autoReplaceMaterialVO.setMaterialsName(materials.getMaterialsName());
+                autoReplaceMaterialVO.setMaterialsTypeIcon(materials.getMaterialsTypeIcon());
+                autoReplaceMaterialVO.setMaterialsTypePicture(materials.getMaterialsTypePicture());
+                autoReplaceMaterialVO.setMaterialsRfid(materials.getMaterialsRfid());
+                autoReplaceMaterialVO.setStatus(materials.getStatus());
+                unbindingMaterialVOS.add(autoReplaceMaterialVO);
+            }
+        }
+        autoReplaceReportVO.setUnbindingList(unbindingMaterialVOS);
+        // 更新检查记录
+        materialsPlanCabinetService.autoChangeCheckRecord(dto.getCabinetCode());
+        return autoReplaceReportVO;
+    }
+
+    @Override
+    public Boolean startCheckPlan(StartCheckPlanDTO dto) {
+        Assert.notNull(dto.getPlanId(), "planId不可为空!");
+        Assert.notBlank(dto.getCabinetCode(), "物资柜code不可为空!");
+        MaterialsCabinetDO cabinetByCode = materialsCabinetService.getCabinetByCode(dto.getCabinetCode());
+        Assert.isTrue(cabinetByCode != null, dto.getCabinetCode() + "物资柜不存在!");
+        MaterialsCheckPlanDO checkPlan = materialsCheckPlanService.getOne(Wrappers.<MaterialsCheckPlanDO>lambdaQuery()
+                .eq(MaterialsCheckPlanDO::getId, dto.getPlanId()));
+        MaterialsPlanCabinetDO planCabinet = materialsPlanCabinetService.getOne(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getPlanId, dto.getPlanId())
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinetByCode.getId()));
+
+        // 1.如果柜子的检查状态是未开始,则更新成进行中
+        if (checkPlan.getStatus().equals(0)) {
+            materialsCheckPlanService.update(Wrappers.<MaterialsCheckPlanDO>lambdaUpdate()
+                    .eq(MaterialsCheckPlanDO::getId, checkPlan.getId())
+                    .set(MaterialsCheckPlanDO::getStatus, "2"));
+            if (planCabinet.getStatus().equals("0")) {
+                materialsPlanCabinetService.update(Wrappers.<MaterialsPlanCabinetDO>lambdaUpdate()
+                        .eq(MaterialsPlanCabinetDO::getPlanId, planCabinet.getPlanId())
+                        .eq(MaterialsPlanCabinetDO::getCabinetId, planCabinet.getCabinetId())
+                        .set(MaterialsPlanCabinetDO::getStatus, "2"));
+            }
+        }
+        return true;
+    }
+}

+ 6 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materials/MaterialsService.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.iscs.service.materials;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.CheckMaterialsDateVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.*;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -67,4 +68,9 @@ public interface MaterialsService extends IService<MaterialsDO> {
 
     String importMaterials(List<ImportMaterialsVO> itemList) throws JsonProcessingException;
 
+    List<CheckMaterialsDateVO> getCheckMaterialsByCabinetId(Long cabinetId);
+
+    List<MaterialsDO> getMaterialListByRfid(List<String> rfidList);
+
+
 }

+ 11 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materials/MaterialsServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.CheckMaterialsDateVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materials.vo.*;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.exceptionmisplace.ExceptionMisplaceDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
@@ -302,4 +303,14 @@ public class MaterialsServiceImpl extends ServiceImpl<MaterialsMapper, Materials
         return successMsg.toString();
     }
 
+    @Override
+    public List<CheckMaterialsDateVO> getCheckMaterialsByCabinetId(Long cabinetId) {
+        return materialsMapper.getCheckMaterialsByCabinetId(cabinetId);
+    }
+
+    @Override
+    public List<MaterialsDO> getMaterialListByRfid(List<String> rfidList) {
+        return materialsMapper.getMaterialListByRfid(rfidList);
+    }
+
 }

+ 2 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscabinet/MaterialsCabinetService.java

@@ -62,4 +62,6 @@ public interface MaterialsCabinetService extends IService<MaterialsCabinetDO> {
      */
     PageResult<MaterialsCabinetRespVO> getMaterialsCabinetPage(MaterialsCabinetPageReqVO pageReqVO);
 
+    MaterialsCabinetDO getCabinetByCode(String cabinetCode);
+
 }

+ 10 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscabinet/MaterialsCabinetServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.iscs.service.materialscabinet;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialscabinet.vo.MaterialsCabinetPageReqVO;
@@ -156,4 +157,13 @@ public class MaterialsCabinetServiceImpl extends ServiceImpl<MaterialsCabinetMap
         return respVOPageResult;
     }
 
+    @Override
+    public MaterialsCabinetDO getCabinetByCode(String cabinetCode) {
+        Assert.notBlank(cabinetCode, "物资柜CODE不能为空!");
+        MaterialsCabinetDO one = getOne(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                .eq(MaterialsCabinetDO::getCabinetCode, cabinetCode));
+        Assert.isFalse(one == null, "该物资柜不存在!");
+        return one;
+    }
+
 }

+ 2 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialschangerecord/MaterialsChangeRecordServiceImpl.java

@@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -34,6 +35,7 @@ public class MaterialsChangeRecordServiceImpl extends ServiceImpl<MaterialsChang
 
     @Resource
     private MaterialsChangeRecordMapper materialsChangeRecordMapper;
+    @Lazy
     @Resource
     private MaterialsCheckRecordService materialsCheckRecordService;
     @Resource

+ 3 - 1
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckplan/MaterialsCheckPlanServiceImpl.java

@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -48,6 +49,7 @@ public class MaterialsCheckPlanServiceImpl extends ServiceImpl<MaterialsCheckPla
 
     @Resource
     private MaterialsCheckPlanMapper materialsCheckPlanMapper;
+    @Lazy
     @Resource
     private MaterialsPlanCabinetService materialsPlanCabinetService;
     @Resource
@@ -144,7 +146,7 @@ public class MaterialsCheckPlanServiceImpl extends ServiceImpl<MaterialsCheckPla
             MailSendTaskItemDO taskItem = new MailSendTaskItemDO();
             taskItem.setSendToUserId(dto.getCheckUserId());
             taskItem.setEmailTemplateId(template.getId());
-            taskItem.setScheduledSendTime(DateUtils.dateToLocalDateTime(newDateTime));
+            taskItem.setScheduledSendTime(newDateTime);
             taskItem.setBelongId(materialsCheckPlan.getId());
             taskItem.setSendStatus(0);
             taskItem.setIsCancelled(0);

+ 3 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckrecord/MaterialsCheckRecordService.java

@@ -63,4 +63,7 @@ public interface MaterialsCheckRecordService extends IService<MaterialsCheckReco
      */
     PageResult<MaterialsCheckRecordRespVO> getMaterialsCheckRecordPage(MaterialsCheckRecordPageReqVO pageReqVO);
 
+    List<MaterialsCheckRecordDO> getCheckMaterialsByCabinetCode(Long planId, Long cabinetId);
+
+
 }

+ 9 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckrecord/MaterialsCheckRecordServiceImpl.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -42,10 +43,13 @@ public class MaterialsCheckRecordServiceImpl extends ServiceImpl<MaterialsCheckR
 
     @Resource
     private MaterialsCheckRecordMapper materialsCheckRecordMapper;
+    @Lazy
     @Resource
     private MaterialsService materialsService;
+    @Lazy
     @Resource
     private MaterialsCheckPlanService materialsCheckPlanService;
+    @Lazy
     @Resource
     private MaterialsPlanCabinetService materialsPlanCabinetService;
 
@@ -146,4 +150,9 @@ public class MaterialsCheckRecordServiceImpl extends ServiceImpl<MaterialsCheckR
         return respVOPageResult;
     }
 
+    @Override
+    public List<MaterialsCheckRecordDO> getCheckMaterialsByCabinetCode(Long planId, Long cabinetId) {
+        return materialsCheckRecordMapper.getCheckMaterialsByCabinetCode(planId, cabinetId);
+    }
+
 }

+ 17 - 1
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsloan/MaterialsLoanService.java

@@ -5,6 +5,8 @@ import cn.iocoder.yudao.module.iscs.controller.admin.materialsloan.vo.MaterialsL
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsloan.vo.MaterialsLoanRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsloan.vo.MaterialsLoanSaveReqVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsloan.MaterialsLoanDO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.AddLoanDTO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.ReturnLoanDTO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.validation.Valid;
 
@@ -23,7 +25,7 @@ public interface MaterialsLoanService extends IService<MaterialsLoanDO> {
      * @param createReqVO 创建信息
      * @return 编号
      */
-    Long createMaterialsLoan(@Valid MaterialsLoanSaveReqVO createReqVO);
+    Integer createMaterialsLoan(AddLoanDTO dto) throws Exception;
 
     /**
      * 更新物资借出
@@ -62,4 +64,18 @@ public interface MaterialsLoanService extends IService<MaterialsLoanDO> {
      */
     PageResult<MaterialsLoanRespVO> getMaterialsLoanPage(MaterialsLoanPageReqVO pageReqVO);
 
+    /**
+     * 根据物资id获取物资的最近一条未归还的借取记录
+     * @param materialsIdList 物资id
+     * @return
+     */
+    List<Long> getLastLoanRecord(List<Long> materialsIdList);
+
+    /**
+     * 物资归还
+     * @param dto
+     * @return
+     */
+    Boolean returnIsMaterialsLoan(ReturnLoanDTO dto);
+
 }

+ 278 - 6
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsloan/MaterialsLoanServiceImpl.java

@@ -1,19 +1,46 @@
 package cn.iocoder.yudao.module.iscs.service.materialsloan;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsloan.vo.MaterialsLoanPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsloan.vo.MaterialsLoanRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsloan.vo.MaterialsLoanSaveReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeRespVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.exceptionmisplace.ExceptionMisplaceDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.mailnotifyconfig.MailNotifyConfigDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem.MailSendTaskItemDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscabinet.MaterialsCabinetDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsloan.MaterialsLoanDO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.AddLoanDTO;
+import cn.iocoder.yudao.module.iscs.dal.dto.hardwareMaterialApi.ReturnLoanDTO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.materialsloan.MaterialsLoanMapper;
+import cn.iocoder.yudao.module.iscs.service.exceptionmisplace.ExceptionMisplaceService;
+import cn.iocoder.yudao.module.iscs.service.mailnotifyconfig.MailNotifyConfigService;
+import cn.iocoder.yudao.module.iscs.service.mailsendtaskitem.MailSendTaskItemService;
+import cn.iocoder.yudao.module.iscs.service.materials.MaterialsService;
+import cn.iocoder.yudao.module.iscs.service.materialscabinet.MaterialsCabinetService;
+import cn.iocoder.yudao.module.iscs.service.materialstype.MaterialsTypeService;
+import cn.iocoder.yudao.module.iscs.utils.DateUtils;
+import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.service.attribute.AttributeService;
+import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
+import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -27,15 +54,161 @@ public class MaterialsLoanServiceImpl extends ServiceImpl<MaterialsLoanMapper, M
 
     @Resource
     private MaterialsLoanMapper materialsLoanMapper;
+    @Autowired
+    private MaterialsService isMaterialsService;
+    @Autowired
+    private MaterialsTypeService isMaterialsTypeService;
+    @Resource
+    private NotifySendService notifySendService;
+    // @Autowired
+    // private MaterialsReminderService iIsMaterialsReminderService;
+    @Autowired
+    private MailTemplateService iIsMailTemplateService;
+    @Autowired
+    private MailNotifyConfigService isMailNotifyConfigService;
+    @Autowired
+    private MailSendTaskItemService iIsMailSendTaskItemService;
+    @Autowired
+    private MaterialsCabinetService iIsMaterialsCabinetService;
+    @Autowired
+    private ExceptionMisplaceService exceptionMisplaceService;
+    @Resource
+    private AdminUserService adminUserService;
+    @Resource
+    private AttributeService attributeService;
 
     @Override
-    public Long createMaterialsLoan(MaterialsLoanSaveReqVO createReqVO) {
-        // 插入
-        MaterialsLoanDO materialsLoan = BeanUtils.toBean(createReqVO, MaterialsLoanDO.class);
-        materialsLoanMapper.insert(materialsLoan);
+    public Integer createMaterialsLoan(AddLoanDTO dto) throws Exception {
+        try {
+            // 检测如果已经有一条借出,则提示异常
+            /*List<IsMaterialsLoan> loanList = list(Wrappers.<IsMaterialsLoan>lambdaQuery()
+                    .eq(IsMaterialsLoan::getMaterialsId, dto.getMaterialsId())
+                    .ne(IsMaterialsLoan::getStatus, "1"));*/
+            // Assert.isTrue(loanList.isEmpty(), "该物资存在多条借出记录!");
+            Date nowDate = DateUtils.getNowDate();
+            MaterialsLoanDO isMaterialsLoan = BeanUtils.toBean(dto, MaterialsLoanDO.class);
+            isMaterialsLoan.setLoanTime(nowDate);
+            // 存储提醒倒计时和告警倒计时
+            Date re = null;
+            Date al = null;
+            // 1.物资信息
+            MaterialsDO materials = isMaterialsService.getById(isMaterialsLoan.getMaterialsId());
+            MaterialsTypeRespVO materialsTypePageVO = new MaterialsTypeRespVO();
+            // 1.1处理更新错放异常
+            exceptionMisplaceService.update(Wrappers.<ExceptionMisplaceDO>lambdaUpdate()
+                    .eq(ExceptionMisplaceDO::getMaterialsRfid, dto.getMaterialsRfid())
+                    .set(ExceptionMisplaceDO::getStatus, "1")
+                    .set(ExceptionMisplaceDO::getHandleTime, nowDate));
+            // 1.1.1同时处理物资的借出状态
+            isMaterialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                    .eq(MaterialsDO::getId, dto.getMaterialsId())
+                    .eq(MaterialsDO::getStatus, "3")
+                    .set(MaterialsDO::getStatus, "0"));
+            // 如果没有绑定柜子,直接结束,因为不用生成借出记录
+            if (materials.getMaterialsCabinetId() == null || materials.getMaterialsCabinetId() == 0) {
+                return 1;
+            }
 
-        // 返回
-        return materialsLoan.getId();
+            // 1.2借用到期规则
+            MailNotifyConfigDO reminderConf = isMailNotifyConfigService.getOne(Wrappers.<MailNotifyConfigDO>lambdaQuery()
+                    .eq(MailNotifyConfigDO::getTemplateCode, attributeService.getAttributeByKey("sys.template.material_expiration_reminder").getSysAttrValue()));
+            MailTemplateDO reminderTemp = iIsMailTemplateService.getOne(Wrappers.<MailTemplateDO>lambdaQuery()
+                    .eq(MailTemplateDO::getCode, attributeService.getAttributeByKey("sys.template.material_expiration_reminder").getSysAttrValue()));
+            // 1.3逾期时间规则
+            MailNotifyConfigDO alarmConf = isMailNotifyConfigService.getOne(Wrappers.<MailNotifyConfigDO>lambdaQuery()
+                    .eq(MailNotifyConfigDO::getTemplateCode, attributeService.getAttributeByKey("sys.template.material_overdue_alarm").getSysAttrValue()));
+            MailTemplateDO alarmTemp = iIsMailTemplateService.getOne(Wrappers.<MailTemplateDO>lambdaQuery()
+                    .eq(MailTemplateDO::getCode, attributeService.getAttributeByKey("sys.template.material_overdue_alarm").getSysAttrValue()));
+            // 1.4开始读取类型和规则,然后计算归还时间,提醒时间
+            // 1.4.1填充字段
+            // materialsTypePageVO = isMaterialsTypeService.selectIsMaterialsTypeByMaterialsTypeId(materials.getMaterialsTypeId());
+            isMaterialsLoan.setLoanFromId(materials.getMaterialsCabinetId());
+            // if (materialsTypePageVO != null) {
+            if (true) {
+                // 1.5填充字段
+                isMaterialsLoan.setRestitutionRequired(materialsTypePageVO.getRestitutionRequired());
+                // 1.6如果需要归还,则开始计算时间
+                if (materialsTypePageVO.getRestitutionRequired() != null && materialsTypePageVO.getRestitutionRequired().equals(1)) {
+                    // 1.6.1如果借用到期有数据,则开始计算
+                    if (reminderTemp != null
+                            && reminderConf != null
+                            && "1".equals(reminderConf.getStatus())
+                            && reminderConf.getReminderTime() != null
+                            && reminderConf.getReminderTime() > 0) {
+                        // 计算提醒时间
+                        re = DateUtils.getNewDateTime(nowDate, reminderConf.getReminderTime());
+                        isMaterialsLoan.setReminderTime(re);
+                        isMaterialsLoan.setRestitutionTime(re);
+                    }
+                    // 1.6.2逾期时间规则
+                    if (alarmTemp != null
+                            && alarmConf != null
+                            && "1".equals(alarmConf.getStatus())
+                            && alarmConf.getReminderTime() != null
+                            && alarmConf.getReminderTime() > 0) {
+                        // 计算告警时间
+                        al = DateUtils.getNewDateTime(nowDate, alarmConf.getReminderTime());
+                        isMaterialsLoan.setTimeoutAlarm(al);
+                    }
+                }
+            }
+            int i = materialsLoanMapper.insert(isMaterialsLoan);
+            // 2.邮件的发送
+            if (materialsTypePageVO != null && materialsTypePageVO.getRestitutionRequired().equals(1) && materials != null) {
+                // 2.1获取收件人
+                AdminUserDO user = adminUserService.getById(isMaterialsLoan.getLoanUserId());
+                Assert.isFalse(user == null, "当前用户信息不存在!");
+                MaterialsCabinetDO cabinet = iIsMaterialsCabinetService.getById(materials.getMaterialsCabinetId());
+                // 2.2整理可配置的字段
+                // [收件人],[物资名称],[借用时间],[到期时间],[告警时间],[归还地址],[邮件发送日期]
+                HashMap<String, String> map = new HashMap<>();
+                map.put("[收件人]", user.getNickname());
+                map.put("[物资名称]", materials.getMaterialsName());
+                map.put("[借用时间]", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, nowDate));
+                map.put("[到期时间]", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, re));
+                map.put("[告警时间]", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, al));
+                map.put("[归还地址]", cabinet != null ? cabinet.getCabinetName() : "");
+                map.put("[发件人]", attributeService.getAttributeByKey("info.mail.name").getSysAttrValue());
+                map.put("[公司名称]", attributeService.getAttributeByKey("info.mail.company").getSysAttrValue());
+                // 2.3处理归还提醒
+                if (isMaterialsLoan.getReminderTime() != null && reminderConf != null && "1".equals(reminderConf.getStatus())) {
+                    System.out.println("设置借用提醒邮件");
+                    // 邮件实体
+                    MailSendTaskItemDO taskItem = new MailSendTaskItemDO();
+                    taskItem.setSendToUserId(dto.getLoanUserId());
+                    taskItem.setEmailTemplateId(reminderTemp.getId());
+                    taskItem.setScheduledSendTime(re);
+                    taskItem.setBelongId(isMaterialsLoan.getId());
+                    taskItem.setSendStatus(0);
+                    taskItem.setIsCancelled(0);
+                    iIsMailSendTaskItemService.insertIsMailSendTaskItem(taskItem, map);
+                }
+                // 2.4处理归还告警
+                if (isMaterialsLoan.getTimeoutAlarm() != null && alarmConf != null && "1".equals(alarmConf.getStatus())) {
+                    System.out.println("设置借用告警邮件");
+                    // 邮件实体
+                    MailSendTaskItemDO taskItem = new MailSendTaskItemDO();
+                    taskItem.setSendToUserId(dto.getLoanUserId());
+                    taskItem.setEmailTemplateId(alarmTemp.getId());
+                    taskItem.setScheduledSendTime(al);
+                    taskItem.setBelongId(isMaterialsLoan.getId());
+                    taskItem.setSendStatus(0);
+                    taskItem.setIsCancelled(0);
+                    iIsMailSendTaskItemService.insertIsMailSendTaskItem(taskItem, map);
+                }
+            }
+
+            // 2.开始更新物资信息为借出状态
+            LambdaUpdateWrapper<MaterialsDO> set = Wrappers.<MaterialsDO>lambdaUpdate()
+                    .eq(MaterialsDO::getId, isMaterialsLoan.getMaterialsId())
+                    .set(MaterialsDO::getLoanState, 0);
+            if (materials != null && materials.getAvailableTimes() != null) {
+                set.set(MaterialsDO::getLoanState, materials.getAvailableTimes() - 1);
+            }
+        } catch (Exception e) {
+            throw new Exception(e);
+        }
+        return 1;
     }
 
     @Override
@@ -91,4 +264,103 @@ public class MaterialsLoanServiceImpl extends ServiceImpl<MaterialsLoanMapper, M
         return respVOPageResult;
     }
 
+    @Override
+    public List<Long> getLastLoanRecord(List<Long> materialsIdList) {
+        return materialsLoanMapper.getLastLoanRecord(materialsIdList);
+    }
+
+    @Override
+    public Boolean returnIsMaterialsLoan(ReturnLoanDTO dto) {
+        Assert.notNull(dto.getMaterialsId(), "物资id不能为空!");
+        Assert.notNull(dto.getRestitutionUserId(), "归还人id不能为空!");
+        Assert.notNull(dto.getRestitutionToId(), "归还柜id不能为空!");
+        // 1.查询物资信息
+        MaterialsDO materials = isMaterialsService.getById(dto.getMaterialsId());
+        // 0.检查借出数据
+        List<MaterialsLoanDO> loanList = list(Wrappers.<MaterialsLoanDO>lambdaQuery()
+                .eq(MaterialsLoanDO::getMaterialsId, dto.getMaterialsId())
+                .isNull(MaterialsLoanDO::getRestitutionUserId)
+                .isNull(MaterialsLoanDO::getRestitutionToId)
+        );
+        // Assert.isFalse(loanList.isEmpty(), "尚未找到该物资的借出信息!");
+        // 如果没有借取信息 直接存储归还异常
+        if (loanList.isEmpty() || materials.getMaterialsCabinetId() == null || materials.getMaterialsCabinetId() == 0) {
+            ExceptionMisplaceDO loanException = new ExceptionMisplaceDO();
+            loanException.setMaterialsId(dto.getMaterialsId());
+            loanException.setMaterialsRfid(materials.getMaterialsRfid());
+            loanException.setRestitutionUserId(dto.getRestitutionUserId());
+            loanException.setRestitutionToId(dto.getRestitutionToId());
+            loanException.setOccurTime(new Date());
+            exceptionMisplaceService.save(loanException);
+            return true;
+        }
+        // Assert.isFalse(loanList.size() > 1, "该物资的借出信息出现多条!");
+
+        // 1.1 如果不是归还到原先的柜子,则不能更新归还记录,存储归还异常等待处理,并且更新物资状态异常
+        if (!materials.getMaterialsCabinetId().equals(dto.getRestitutionToId())) {
+            ExceptionMisplaceDO loanException = new ExceptionMisplaceDO();
+            loanException.setMaterialsId(dto.getMaterialsId());
+            loanException.setMaterialsLoanId(loanList.get(0).getId());
+            loanException.setLoanFromId(materials.getMaterialsCabinetId());
+            // loanException.setLoanTime(loanList.get(0).getLoanTime());
+            loanException.setRestitutionUserId(dto.getRestitutionUserId());
+            loanException.setRestitutionToId(dto.getRestitutionToId());
+            // loanException.setActualRestitutionTime(new Date());
+            loanException.setOccurTime(new Date());
+            exceptionMisplaceService.save(loanException);
+            isMaterialsService.update(Wrappers.<MaterialsDO>lambdaUpdate()
+                    .eq(MaterialsDO::getId, materials.getId())
+                    .set(MaterialsDO::getLoanState, "0")
+                    .set(MaterialsDO::getStatus, "3"));
+            return true;
+        }
+        // 2.开始更新loan表数据
+        boolean update = update(Wrappers.<MaterialsLoanDO>lambdaUpdate()
+                // .eq(IsMaterialsLoan::getMaterialsLoanId, loanList.get(0).getMaterialsLoanId())
+                .eq(MaterialsLoanDO::getMaterialsId, dto.getMaterialsId())
+                .set(MaterialsLoanDO::getRestitutionUserId, dto.getRestitutionUserId())
+                .set(MaterialsLoanDO::getRestitutionToId, dto.getRestitutionToId())
+                .set(MaterialsLoanDO::getStatus, 1)
+                .set(MaterialsLoanDO::getActualRestitutionTime, new Date()));
+        // 3.开始更新物资信息
+        /*isMaterialsService.update(Wrappers.<IsMaterials>lambdaUpdate()
+                .eq(IsMaterials::getMaterialsId, dto.getMaterialsId())
+                .set(IsMaterials::getLoanState, 1));*/
+        // 3.1 检查当前物资是否有未处理的错换柜子异常,如果有,现在已经还对了,默认处理掉异常信息
+        List<ExceptionMisplaceDO> exList = exceptionMisplaceService.list(Wrappers.<ExceptionMisplaceDO>lambdaQuery()
+                .eq(ExceptionMisplaceDO::getMaterialsId, dto.getMaterialsId())
+                .eq(ExceptionMisplaceDO::getStatus, "0"));
+        if (!exList.isEmpty()) {
+            exceptionMisplaceService.update(Wrappers.<ExceptionMisplaceDO>lambdaUpdate()
+                    .eq(ExceptionMisplaceDO::getMaterialsId, dto.getMaterialsId())
+                    .eq(ExceptionMisplaceDO::getStatus, "0")
+                    .set(ExceptionMisplaceDO::getStatus, "1")
+            );
+        }
+        // 5.检查邮件里面的数据发送了没有,没有发送就取消掉
+        // 6.借用到期模板
+        MailTemplateDO reminderTemp = iIsMailTemplateService.getOne(Wrappers.<MailTemplateDO>lambdaQuery()
+                .eq(MailTemplateDO::getCode, attributeService.getAttributeByKey("sys.template.material_expiration_reminder").getSysAttrValue()));
+        // 6.1取消未发送的邮件的发送
+        MailTemplateDO alarmTemp = iIsMailTemplateService.getOne(Wrappers.<MailTemplateDO>lambdaQuery()
+                .eq(MailTemplateDO::getCode, attributeService.getAttributeByKey("sys.template.material_overdue_alarm").getSysAttrValue()));
+        if (reminderTemp != null) {
+            iIsMailSendTaskItemService.update(Wrappers.<MailSendTaskItemDO>lambdaUpdate()
+                    .eq(MailSendTaskItemDO::getBelongId, loanList.get(0).getId())
+                    .eq(MailSendTaskItemDO::getEmailTemplateId, reminderTemp.getId())
+                    .eq(MailSendTaskItemDO::getSendStatus, "0")
+                    .set(MailSendTaskItemDO::getIsCancelled, "1")
+                    .set(MailSendTaskItemDO::getCancelTime, new Date()));
+        }
+        if (alarmTemp != null) {
+            iIsMailSendTaskItemService.update(Wrappers.<MailSendTaskItemDO>lambdaUpdate()
+                    .eq(MailSendTaskItemDO::getBelongId, loanList.get(0).getId())
+                    .eq(MailSendTaskItemDO::getEmailTemplateId, alarmTemp.getId())
+                    .eq(MailSendTaskItemDO::getSendStatus, "0")
+                    .set(MailSendTaskItemDO::getIsCancelled, "1")
+                    .set(MailSendTaskItemDO::getCancelTime, new Date()));
+        }
+        return true;
+    }
+
 }

+ 67 - 63
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsplancabinet/MaterialsPlanCabinetService.java

@@ -1,63 +1,67 @@
-package cn.iocoder.yudao.module.iscs.service.materialsplancabinet;
-
-import java.util.*;
-import jakarta.validation.*;
-import cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo.*;
-import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsplancabinet.MaterialsPlanCabinetDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * 物资检查计划关联物资柜 Service 接口
- *
- * @author 芋道源码
- */
-public interface MaterialsPlanCabinetService extends IService<MaterialsPlanCabinetDO> {
-
-    /**
-     * 创建物资检查计划关联物资柜
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createMaterialsPlanCabinet(@Valid MaterialsPlanCabinetSaveReqVO createReqVO);
-
-    /**
-     * 更新物资检查计划关联物资柜
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateMaterialsPlanCabinet(@Valid MaterialsPlanCabinetSaveReqVO updateReqVO);
-
-    /**
-     * 删除物资检查计划关联物资柜
-     *
-     * @param id 编号
-     */
-    void deleteMaterialsPlanCabinet(Long id);
-
-    /**
-    * 批量删除物资检查计划关联物资柜
-    *
-    * @param ids 编号
-    */
-    void deleteMaterialsPlanCabinetListByIds(List<Long> ids);
-
-    /**
-     * 获得物资检查计划关联物资柜
-     *
-     * @param id 编号
-     * @return 物资检查计划关联物资柜
-     */
-    MaterialsPlanCabinetDO getMaterialsPlanCabinet(Long id);
-
-    /**
-     * 获得物资检查计划关联物资柜分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 物资检查计划关联物资柜分页
-     */
-    PageResult<MaterialsPlanCabinetDO> getMaterialsPlanCabinetPage(MaterialsPlanCabinetPageReqVO pageReqVO);
-
-}
+package cn.iocoder.yudao.module.iscs.service.materialsplancabinet;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo.MaterialsPlanCabinetPageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo.MaterialsPlanCabinetSaveReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsplancabinet.MaterialsPlanCabinetDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 物资检查计划关联物资柜 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface MaterialsPlanCabinetService extends IService<MaterialsPlanCabinetDO> {
+
+    /**
+     * 创建物资检查计划关联物资柜
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createMaterialsPlanCabinet(@Valid MaterialsPlanCabinetSaveReqVO createReqVO);
+
+    /**
+     * 更新物资检查计划关联物资柜
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateMaterialsPlanCabinet(@Valid MaterialsPlanCabinetSaveReqVO updateReqVO);
+
+    /**
+     * 删除物资检查计划关联物资柜
+     *
+     * @param id 编号
+     */
+    void deleteMaterialsPlanCabinet(Long id);
+
+    /**
+    * 批量删除物资检查计划关联物资柜
+    *
+    * @param ids 编号
+    */
+    void deleteMaterialsPlanCabinetListByIds(List<Long> ids);
+
+    /**
+     * 获得物资检查计划关联物资柜
+     *
+     * @param id 编号
+     * @return 物资检查计划关联物资柜
+     */
+    MaterialsPlanCabinetDO getMaterialsPlanCabinet(Long id);
+
+    /**
+     * 获得物资检查计划关联物资柜分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 物资检查计划关联物资柜分页
+     */
+    PageResult<MaterialsPlanCabinetDO> getMaterialsPlanCabinetPage(MaterialsPlanCabinetPageReqVO pageReqVO);
+
+
+    Boolean autoChangeCheckRecord(String cabinetCode);
+
+}

+ 74 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialsplancabinet/MaterialsPlanCabinetServiceImpl.java

@@ -1,18 +1,31 @@
 package cn.iocoder.yudao.module.iscs.service.materialsplancabinet;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo.MaterialsPlanCabinetPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialsplancabinet.vo.MaterialsPlanCabinetSaveReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscabinet.MaterialsCabinetDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckrecord.MaterialsCheckRecordDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsplancabinet.MaterialsPlanCabinetDO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.materialsplancabinet.MaterialsPlanCabinetMapper;
+import cn.iocoder.yudao.module.iscs.service.materials.MaterialsService;
+import cn.iocoder.yudao.module.iscs.service.materialscabinet.MaterialsCabinetService;
+import cn.iocoder.yudao.module.iscs.service.materialscheckrecord.MaterialsCheckRecordService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 /**
  * 物资检查计划关联物资柜 Service 实现类
@@ -25,6 +38,12 @@ public class MaterialsPlanCabinetServiceImpl extends ServiceImpl<MaterialsPlanCa
 
     @Resource
     private MaterialsPlanCabinetMapper materialsPlanCabinetMapper;
+    @Resource
+    private MaterialsCabinetService materialsCabinetService;
+    @Resource
+    private MaterialsService materialsService;
+    @Resource
+    private MaterialsCheckRecordService materialsCheckRecordService;
 
     @Override
     public Long createMaterialsPlanCabinet(MaterialsPlanCabinetSaveReqVO createReqVO) {
@@ -84,4 +103,59 @@ public class MaterialsPlanCabinetServiceImpl extends ServiceImpl<MaterialsPlanCa
         return materialsPlanCabinetMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public Boolean autoChangeCheckRecord(String cabinetCode) {
+        MaterialsCabinetDO cabinet = materialsCabinetService.getCabinetByCode(cabinetCode);
+        Assert.isFalse(cabinet == null, "柜子不存在!");
+        // 1.获取这个物资柜当前最近一次未完成的检查计划
+        MaterialsPlanCabinetDO planCabinet = getOne(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getCabinetId, cabinet.getId())
+                .ne(MaterialsPlanCabinetDO::getStatus, "1")
+                .orderByDesc(MaterialsPlanCabinetDO::getPlanId)
+                .last("limit 1"));
+        if (planCabinet != null) {
+            // 2.检查有没有生成检查记录
+            List<MaterialsCheckRecordDO> checkRecords = materialsCheckRecordService.list(Wrappers.<MaterialsCheckRecordDO>lambdaQuery()
+                    .eq(MaterialsCheckRecordDO::getPlanId, planCabinet.getPlanId())
+                    .eq(MaterialsCheckRecordDO::getCabinetId, cabinet.getId()));
+            if (checkRecords.isEmpty()) {
+                return true;
+            } else {
+                // 柜子中的物资信息
+                List<MaterialsDO> cabinetMaterials = materialsService.list(Wrappers.<MaterialsDO>lambdaQuery()
+                        .eq(MaterialsDO::getMaterialsCabinetId, cabinet.getId())
+                        .eq(MaterialsDO::getLoanState, "1"));
+                // 3.0如果有借出则需要删除
+                needDel(Lists.newArrayList(checkRecords), Lists.newArrayList(cabinetMaterials));
+                // 3.1如果有还入需要新增
+                needAdd(planCabinet.getPlanId(), cabinet.getId(), Lists.newArrayList(checkRecords), Lists.newArrayList(cabinetMaterials));
+            }
+        }
+        return true;
+    }
+
+    private void needDel(List<MaterialsCheckRecordDO> checkRecords, List<MaterialsDO> cabinetMaterials) {
+        // 需要删除的物资
+        checkRecords.removeIf(item -> cabinetMaterials.stream().map(MaterialsDO::getId).toList().contains(item.getMaterialsId()));
+        List<Long> collect = checkRecords.stream().map(MaterialsCheckRecordDO::getId).collect(Collectors.toList());
+        if (!collect.isEmpty()) {
+            materialsCheckRecordService.removeByIds(collect);
+        }
+    }
+
+    private void needAdd(Long planId, Long cabinetId, List<MaterialsCheckRecordDO> checkRecords, List<MaterialsDO> cabinetMaterials) {
+        // 需要删除的物资
+        cabinetMaterials.removeIf(item -> checkRecords.stream().map(MaterialsCheckRecordDO::getMaterialsId).toList().contains(item.getId()));
+        for (MaterialsDO vo : cabinetMaterials) {
+            MaterialsCheckRecordDO checkRecord = new MaterialsCheckRecordDO();
+            checkRecord.setPlanId(planId);
+            checkRecord.setCabinetId(cabinetId);
+            checkRecord.setMaterialsId(vo.getId());
+            checkRecord.setCheckUserId(getLoginUserId());
+            checkRecord.setCheckDate(new Date());
+            // checkRecord.setMaterialsRfid(vo.getMaterialsRfid());
+            materialsCheckRecordService.save(checkRecord);
+        }
+    }
+
 }

+ 8 - 6
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialstype/MaterialsTypeService.java

@@ -1,12 +1,14 @@
 package cn.iocoder.yudao.module.iscs.service.materialstype;
 
-import java.util.*;
-import jakarta.validation.*;
-import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.*;
-import cn.iocoder.yudao.module.iscs.dal.dataobject.materialstype.MaterialsTypeDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeSaveReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialstype.MaterialsTypeDO;
 import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.validation.Valid;
+
+import java.util.List;
 
 /**
  * 物资类型 Service 接口
@@ -50,7 +52,7 @@ public interface MaterialsTypeService extends IService<MaterialsTypeDO> {
      * @param id 编号
      * @return 物资类型
      */
-    MaterialsTypeDO getMaterialsType(Long id);
+    MaterialsTypeRespVO getMaterialsType(Long id);
 
     /**
      * 获得物资类型分页

+ 3 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialstype/MaterialsTypeServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeSaveReqVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materials.MaterialsDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialstype.MaterialsTypeDO;
@@ -101,8 +102,8 @@ public class MaterialsTypeServiceImpl extends ServiceImpl<MaterialsTypeMapper, M
     }
 
     @Override
-    public MaterialsTypeDO getMaterialsType(Long id) {
-        return materialsTypeMapper.selectById(id);
+    public MaterialsTypeRespVO getMaterialsType(Long id) {
+        return materialsTypeMapper.getMaterialsType(id);
     }
 
     @Override

+ 17 - 0
yudao-module-iscs/src/main/resources/mapper/MaterialsCheckRecordMapper.xml

@@ -65,5 +65,22 @@
 
 
 
+    </select>
+    <select id="getCheckMaterialsByCabinetCode"
+            resultType="cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckrecord.MaterialsCheckRecordDO">
+        SELECT
+        c.*,
+        m.materials_rfid,
+        t.materials_type_icon,
+        t.materials_type_picture,
+        t.materials_type_name,
+        m.materials_name
+        FROM
+        isc_materials_check_record c
+        LEFT JOIN isc_materials m ON c.materials_id = m.id
+        LEFT JOIN isc_materials_type t ON t.id = m.materials_type_id
+        <where>
+            c.plan_id = #{planId} and c.cabinet_id = #{cabinetId}
+        </where>
     </select>
 </mapper>

+ 13 - 0
yudao-module-iscs/src/main/resources/mapper/MaterialsLoanMapper.xml

@@ -84,4 +84,17 @@
         </where>
         ORDER BY l.id DESC
     </select>
+    <select id="getLastLoanRecord" resultType="java.lang.Long">
+        SELECT
+        max(id)
+        FROM
+        isc_materials_loan ml
+        WHERE
+        ml.materials_id IN
+        <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        AND ml.status != 1
+        GROUP BY ml.materials_id
+    </select>
 </mapper>

+ 19 - 0
yudao-module-iscs/src/main/resources/mapper/MaterialsMapper.xml

@@ -91,4 +91,23 @@
             </foreach>
         </where>
     </select>
+    <select id="getCheckMaterialsByCabinetId"
+            resultType="cn.iocoder.yudao.module.iscs.controller.admin.hardwareapi.hardwareMaterialApi.CheckMaterialsDateVO">
+        SELECT
+            m.id as materials_id,
+            m.materials_name,
+            m.status,
+            m.materials_cabinet_id,
+            m.materials_type_id,
+            m.materials_rfid,
+            t.materials_type_name,
+            t.materials_type_icon,
+            t.materials_type_picture,
+            t.check_standard
+        FROM
+            isc_materials m
+                LEFT JOIN isc_materials_type t ON t.id = m.materials_type_id
+        where m.materials_cabinet_id = #{cabinetId} and m.loan_state = "1"
+
+    </select>
 </mapper>

+ 15 - 0
yudao-module-iscs/src/main/resources/mapper/MaterialsTypeMapper.xml

@@ -9,4 +9,19 @@
         文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
      -->
 
+    <select id="getMaterialsType"
+            resultType="cn.iocoder.yudao.module.iscs.controller.admin.materialstype.vo.MaterialsTypeRespVO">
+        SELECT
+            t.*,
+            r.rule_id,
+            r.restitution_required,
+            r.restoration_required,
+            r.loan_duration,
+            r.reminder_time,
+            r.timeout_alarm
+        FROM
+            isc_materials_type t
+                LEFT JOIN isc_materials_restitution_rules r ON r.materials_type_id = t.id
+        WHERE t.id = #{materialsTypeId}
+    </select>
 </mapper>