From b9f91c347781ba8fffd778165415c517332b4313 Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期二, 11 三月 2025 13:54:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_cr' into dev

---
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java                          |  125 +++++
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java          |  100 ++++
 cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java             |  102 ++++
 cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java                    |   92 ++++
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java                  |   20 
 cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java                    |   17 
 cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java                   |   22 
 cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java          |   20 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java                             |   64 ++
 cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java                   |   29 +
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java          |  110 ++++
 cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java                           |   10 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java                     |   19 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java                     |    9 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java                             |   39 +
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java     |    2 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java                             |   84 +++
 cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml                          |   26 +
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java          |   66 ++
 cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java             |   74 +++
 cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java                        |   17 
 cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java                   |   10 
 cnas-require/src/main/resources/mapper/ReservationMapper.xml                                   |   40 +
 cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java             |   50 ++
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java |   27 +
 cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java                  |   35 +
 cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java            |   20 
 cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java                           |   13 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java                     |   23 +
 cnas-require/src/main/resources/mapper/InstructionMapper.xml                                   |   27 +
 cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml                                |   50 ++
 31 files changed, 1,341 insertions(+), 1 deletions(-)

diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
index 015621a..34eee58 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -63,7 +63,7 @@
 
     @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
     @GetMapping("basicInformationOfPersonnelSelectPage")
-    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
+    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
         return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
     }
 
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java
new file mode 100644
index 0000000..ff7edea
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java
@@ -0,0 +1,50 @@
+package com.ruoyi.requier.controller;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.pojo.DeviceFault;
+import com.ruoyi.requier.service.DeviceFaultService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/deviceFaults")
+public class DeviceFaultController {
+
+    private final DeviceFaultService deviceFaultService;
+
+    @Autowired
+    public DeviceFaultController(DeviceFaultService deviceFaultService) {
+        this.deviceFaultService = deviceFaultService;
+    }
+
+    @GetMapping
+    public List<DeviceFault> getAllDeviceFaults() {
+        return deviceFaultService.list();
+    }
+
+    @PostMapping
+    public DeviceFault createDeviceFault(@RequestBody DeviceFault deviceFault) {
+        deviceFaultService.save(deviceFault);
+        return deviceFault;
+    }
+
+    @PutMapping("/{id}")
+    public DeviceFault updateDeviceFault(@PathVariable Integer id, @RequestBody DeviceFault deviceFault) {
+        deviceFault.setId(id);
+        deviceFaultService.updateById(deviceFault);
+        return deviceFault;
+    }
+
+    @DeleteMapping("/{id}")
+    public void deleteDeviceFault(@PathVariable Integer id) {
+        deviceFaultService.removeById(id);
+    }
+
+    @GetMapping("/device/{deviceId}")
+    public Result<Map<String,Object>> getDeviceFaultsByDeviceId(@PathVariable Integer deviceId) {
+       return  Result.success(deviceFaultService.findByDeviceId(deviceId));
+    }
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java
new file mode 100644
index 0000000..d67ec17
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java
@@ -0,0 +1,102 @@
+package com.ruoyi.requier.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.requier.dto.InstructionDto;
+import com.ruoyi.requier.pojo.Instruction;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.service.InstructionService;
+import com.ruoyi.requier.service.OperationInstructionService;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@RestController
+@RequestMapping("/instruction")
+public class InstructionController {
+
+    @Autowired
+    private InstructionService instructionService;
+
+    @Autowired
+    private OperationInstructionService operationInstructionService;
+
+    @ApiOperation(value = "浣滀笟鎸囧涔� 鍒嗛〉")
+    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+    public Result<IPage<Instruction>> pageByPageQueryOfHomeworkInstructions(Page page){
+        return Result.success(instructionService.pageByPageQueryOfHomeworkInstructions(page));
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︽柊澧�")
+    @PostMapping("/newHomeworkGuidebookAdded")
+    public Result newHomeworkGuidebookAdded(@RequestBody InstructionDto instructionDto){
+        instructionService.newHomeworkGuidebookAdded(instructionDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︾紪杈�")
+    @GetMapping("/homeworkGuidebookEditor")
+    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+        Instruction instruction = instructionService.getById(instructionId);
+        List<OperationInstructionVo> list = operationInstructionService.homeworkGuidebookEditor(instructionId);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("list", list);
+        map.put("instruction", instruction);
+        return Result.success(map);
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�")
+    @GetMapping("/deleteHomeworkGuidebook")
+    public Result deleteHomeworkGuidebook(String ids){
+        if (ObjectUtils.isNotEmpty(ids)) {
+            String[] idArray = ids.split(",");
+            operationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀垹闄�")
+    @DeleteMapping("/homeworkGuidebook")
+    public Result homeworkGuidebook(String id, String instructionId){
+        // 鍒犻櫎瀛愯〃鏁版嵁
+        operationInstructionService.removeById(id);
+        // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+        long count = operationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+                .eq(OperationInstruction::getInstructionId, instructionId));
+        // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+        if (count < 1) {
+            instructionService.removeById(id);
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀鎵�")
+    @PostMapping("/approvalOfHomeworkInstructionManual")
+    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
+        operationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+                .eq(OperationInstruction::getId, id)
+                .set(OperationInstruction::getStatus, status)
+                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId())
+                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java
new file mode 100644
index 0000000..85e691f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java
@@ -0,0 +1,74 @@
+package com.ruoyi.requier.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.pojo.Reservation;
+import com.ruoyi.requier.service.DeviceService;
+import com.ruoyi.requier.service.ReservationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@RestController
+@RequestMapping("/reservation")
+public class ReservationController {
+    @Autowired
+    private ReservationService reservationService;
+
+    @Resource
+    private DeviceService deviceService;
+
+    @GetMapping("/selectDeviceParameter")
+    public Result selectDeviceParameter(Page page,DeviceDto itemParameter,
+                                        @RequestParam(value = "laboratoryNameIsNull", required = false) Boolean laboratoryNameIsNull,
+                                        @RequestParam(value = "starttime", required = false)String starttime,
+                                        @RequestParam(value = "endtime", required = false) String endtime) {
+        ArrayList<JSONObject> jsonObjects = reservationService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull, starttime, endtime);
+        return Result.success(jsonObjects);
+    }
+
+    @GetMapping("/selectReservationParameterPage")
+    public Result selectReservationParameterPage(@RequestParam String deviceId,@RequestParam String reservationTime,@RequestParam String specificTime){
+        return Result.success(reservationService.selectReservationParameterPage(deviceId,reservationTime,specificTime));
+    }
+
+    @GetMapping("/{id}")
+    public Result getList(@PathVariable Integer id) {
+        LambdaQueryWrapper<Reservation> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Reservation::getDeviceId,id);
+        return Result.success(reservationService.list(lambdaQueryWrapper));
+    }
+
+    @PostMapping("save")
+    public Result save(@RequestBody Reservation reservation){
+        reservation.setCreateDate(LocalDateTime.now());
+        reservationService.save(reservation);
+        return Result.success();
+    }
+
+
+    @DeleteMapping("/delete")
+    public Result deleteReservation(String ids) {
+        String[] idArray = ids.split(",");
+        reservationService.removeBatchByIds(Arrays.asList(idArray));
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java
new file mode 100644
index 0000000..442893f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.DeviceFaultOne;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceFaultOneDto extends DeviceFaultOne {
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java
new file mode 100644
index 0000000..66c9c93
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.Instruction;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InstructionDto extends Instruction {
+
+    private List<OperationInstruction> feTempHumRecordList;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java
new file mode 100644
index 0000000..18c2e72
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OperationInstructionDto extends OperationInstruction {
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("涓婁紶浜�")
+    private String uploaderName;
+
+    @ApiModelProperty("瀹℃壒浜�")
+    private String approverName;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java
new file mode 100644
index 0000000..d9e9712
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java
@@ -0,0 +1,10 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.Reservation;
+import lombok.Data;
+
+@Data
+public class ReservationDto extends Reservation {
+
+    private String name;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java
new file mode 100644
index 0000000..117c5d8
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.DeviceFault;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceFaultMapper extends BaseMapper<DeviceFault> {
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java
new file mode 100644
index 0000000..4da3db7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.dto.DeviceFaultOneDto;
+import com.ruoyi.requier.pojo.DeviceFaultOne;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+public interface DeviceFaultOneMapper extends BaseMapper<DeviceFaultOne> {
+
+    IPage<DeviceFaultOneDto> deviceFaultOnePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java
new file mode 100644
index 0000000..8fe8276
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java
@@ -0,0 +1,19 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.pojo.Instruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<Instruction> {
+
+    IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..a39c08f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+    List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java
new file mode 100644
index 0000000..07bb465
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.dto.ReservationDto;
+import com.ruoyi.requier.pojo.Reservation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+public interface ReservationMapper extends BaseMapper<Reservation> {
+
+
+    List<ReservationDto> selectReservationParameterPage(@Param("deviceId") Integer deviceId, @Param("reservationTime") String reservationTime, @Param("specificTime") String specificTime);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java
new file mode 100644
index 0000000..2b79202
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java
@@ -0,0 +1,39 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+@TableName("device_faults")
+public class DeviceFault {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    //璁惧di
+    private Integer deviceId;
+    //鏁呴殰娆℃暟
+    private Integer faultCount;
+    //鏈�杩戞晠闅滄棩鏈�
+    private LocalDate recentFaultDate;
+    //鏈�杩戞牎鍑嗘棩鏈�
+    private LocalDate recentCalibrationDate;
+   // 鏈�杩戞牎鍑嗙粨璁�
+    private String calibrationConclusion;
+  // 鏈�杩戞鏌ユ棩鏈�
+    private LocalDate recentCheckDate;
+  // 涓嬩竴娆℃鏌ユ棩鏈�
+    private LocalDate nextCheckDate;
+//妫�鏌ョ粨璁�
+    private String checkConclusion;
+//缁存姢绫诲瀷
+    private String maintenanceType;
+//缁存姢浜哄憳
+    private String maintenancePerson;
+//澶囨敞
+    private String comments;
+
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java
new file mode 100644
index 0000000..8da38f5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java
@@ -0,0 +1,125 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+@Getter
+@Setter
+@TableName("device_fault_one")
+@ApiModel(value = "DeviceFaultOne瀵硅薄", description = "璁惧鏁呴殰琛�")
+public class DeviceFaultOne implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("1娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("1鍑嗙‘搴﹂噺鍊�")
+    private String measureOfAccuracy;
+
+    @ApiModelProperty("1鏁呴殰鎯呭喌")
+    private String faultSituation;
+
+    @ApiModelProperty("1鏂囦欢鍘熷悕")
+    private String fileName;
+
+    @ApiModelProperty("1绯荤粺鏂囦欢鍚�")
+    private String systemFileName;
+
+    @ApiModelProperty("1涓嬬幆鑺傝礋璐d汉")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("1鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("1鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("2缁翠慨鏂瑰紡鍙婅垂鐢�")
+    private String methodCost;
+
+    @ApiModelProperty("2瀹℃牳鎰忚")
+    private String adminAuditOption;
+
+    @ApiModelProperty("2璁惧绠$悊鍛�-涓嬬幆鑺傝礋璐d汉")
+    private String adminNextPesponsible;
+
+    @ApiModelProperty("2绠$悊鍛�-鎿嶄綔浜�")
+    private String adminOperatingPersonnel;
+
+    @ApiModelProperty("2绠$悊鍛�-鏃ユ湡")
+    private LocalDateTime adminDate;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 瀹℃牳鎰忚")
+    private String technicalAuditOption;
+
+    @ApiModelProperty("3鎶�鏈礋璐d汉 涓嬬幆鑺傝礋璐d汉")
+    private String technicalNextPesponsible;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 鎿嶄綔浜�")
+    private String technicalOperatingPersonnel;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 鏃ユ湡")
+    private LocalDateTime technicalDate;
+
+    @ApiModelProperty("4缁翠慨鎯呭喌")
+    private String maintainSituation;
+
+    @ApiModelProperty("4 缁翠慨 涓嬬幆鑺傝礋璐d汉")
+    private String maintainNextPesponsible;
+
+    @ApiModelProperty("4 缁翠慨 鎿嶄綔浜�")
+    private String maintainOperatingPersonnel;
+
+    @ApiModelProperty("4 缁翠慨 鏃ユ湡")
+    private LocalDateTime maintainDate;
+
+    @ApiModelProperty("5楠屾敹纭鏍″噯鎯呭喌")
+    private String checkCalSituation;
+
+    @ApiModelProperty("5 缁翠慨鍚� 鎿嶄綔浜�")
+    private String afterMaintenanceOperatingPersonnel;
+
+    @ApiModelProperty("5 缁翠慨鍚� 鏃ユ湡")
+    private LocalDateTime afterMaintenanceDate;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("鎻愪氦浜�")
+    private String submitPerson;
+
+    @ApiModelProperty("褰撳墠璐d换浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏁呴殰鏃ユ湡")
+    private LocalDate faultDate;
+
+    @ApiModelProperty("瑕佹眰淇鏃ユ湡")
+    private LocalDate requestRepairDate;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java
new file mode 100644
index 0000000..ddb199f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java
@@ -0,0 +1,64 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Getter
+@Setter
+@TableName("device_instruction")
+@ApiModel(value = "Instruction瀵硅薄", description = "浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃")
+public class Instruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java
new file mode 100644
index 0000000..2993ccf
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java
@@ -0,0 +1,92 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Getter
+@Setter
+@TableName("device_operation_instruction")
+@ApiModel(value = "OperationInstruction瀵硅薄", description = "璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�")
+public class OperationInstruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧涓婚敭id")
+    private String deviceId;
+
+    @ApiModelProperty("鏂囦欢绫诲瀷")
+    private String documentType;
+
+    @ApiModelProperty("鏂囨。缂栧彿")
+    private String documentNumber;
+
+    @ApiModelProperty("鏂囦欢鐗堟湰")
+    private String documentVersion;
+
+    @ApiModelProperty("浣滆��")
+    private String author;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    private LocalDate submitDate;
+
+    @ApiModelProperty("鏂囨。璇存槑")
+    private String documentNote;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("浣滀笟鎸囧涔d")
+    private Integer instructionId;
+
+    @ApiModelProperty("涓婁紶浜篿d")
+    private Integer uploader;
+
+    @ApiModelProperty("瀹℃壒浜篿d")
+    private Integer approverId;
+
+    @ApiModelProperty("瀹℃壒鐘舵��")
+    private Boolean status;
+
+    @ApiModelProperty("鐢熸晥鏃堕棿")
+    private LocalDateTime entryIntoForceTime;
+
+    @ApiModelProperty("涓婁紶鏃堕棿")
+    private LocalDateTime uploadTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java
new file mode 100644
index 0000000..8eb9865
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java
@@ -0,0 +1,84 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@Getter
+@Setter
+@TableName("device_reservation")
+public class Reservation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     *  璁惧id
+     */
+    private Integer deviceId;
+
+    /**
+     * 棰勫畾璁惧
+     */
+    private String deviceName;
+
+    /**
+     *  瀹㈡埛鍚嶇О
+     */
+    private String customerName;
+
+    /**
+     *  棰勫畾鏃堕棿
+     */
+
+    private String reservationTime;
+
+    /**
+     *  鍏蜂綋鏃堕棿
+     */
+    private String specificTime;
+
+
+
+    /**
+     * 鑱旂郴浜�
+     */
+    private String linkPerson;
+
+    /**
+     *  鑱旂郴鐢佃瘽
+     */
+    private String phone;
+
+    /**
+     *  娴佺▼缂栧彿
+     */
+    private String deviceNumber;
+
+    /**
+     *  棰勫畾璇存槑
+     */
+    private String reservationSpecification;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createDate;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java
new file mode 100644
index 0000000..0071f2f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java
@@ -0,0 +1,10 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.DeviceFault;
+
+import java.util.Map;
+
+public interface DeviceFaultService extends IService<DeviceFault> {
+    Map<String,Object> findByDeviceId(Integer deviceId);
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java
new file mode 100644
index 0000000..10e200f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.dto.InstructionDto;
+import com.ruoyi.requier.pojo.Instruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionService extends IService<Instruction> {
+
+    IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page);
+
+    void newHomeworkGuidebookAdded(InstructionDto instructionDto);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java
new file mode 100644
index 0000000..9d1bf23
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionService extends IService<OperationInstruction> {
+
+    List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java
new file mode 100644
index 0000000..0bd2cb3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.requier.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.dto.ReservationDto;
+import com.ruoyi.requier.pojo.Reservation;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+public interface ReservationService extends IService<Reservation> {
+
+    ArrayList<JSONObject> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull, String starttime, String endtime);
+
+    List<ReservationDto> selectReservationParameterPage(String deviceId, String reservationTime, String specificTime);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java
new file mode 100644
index 0000000..503b005
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java
@@ -0,0 +1,100 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.requier.mapper.DeviceFaultMapper;
+import com.ruoyi.requier.mapper.DeviceFaultOneMapper;
+import com.ruoyi.requier.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.pojo.*;
+import com.ruoyi.requier.service.DeviceFaultService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class DeviceFaultServiceImpl extends ServiceImpl<DeviceFaultMapper, DeviceFault> implements DeviceFaultService {
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private QrShowServiceImpl qrShowService;
+
+    @Autowired
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    @Autowired
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    @Autowired
+    private DeviceFaultOneMapper deviceFaultOneMapper;
+
+    @Override
+    public Map<String,Object> findByDeviceId(Integer deviceId) {
+        Map<String,Object> map = new HashMap<>();
+        if(Objects.isNull(deviceId)){
+            return map;
+        }
+        //鏌ヨ璁惧涓昏〃淇℃伅
+        Device device = deviceMapper.selectById(deviceId);
+        if(!Objects.isNull(device)){
+            //鏌ヨ璁惧鏍″噯淇℃伅
+            DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(device.getId(), "calibrate");
+            //鏌ヨ璁惧鏍告煡淇℃伅
+            DeviceMetricRecord examine = qrShowService.getDeviceMetricRecord(device.getId(), "examine");
+            //鏌ヨ璁惧缁存姢璁板綍
+            DeviceMaintenance deviceMaintenance = Optional.ofNullable(deviceMaintenanceMapper.selectOne(Wrappers.<DeviceMaintenance>lambdaQuery()
+                    .eq(DeviceMaintenance::getDeviceId, device.getId())
+                    .orderByDesc(DeviceMaintenance::getId)
+                    .last("limit 1"))).orElse(new DeviceMaintenance());
+            //鏌ヨ璁惧鏁呴殰淇℃伅
+            List<DeviceFaultOne> deviceFaultOneList = Optional.ofNullable(deviceFaultOneMapper.selectList(Wrappers.<DeviceFaultOne>lambdaQuery()
+                    .eq(DeviceFaultOne::getDeviceId, device.getId())
+                    .orderByDesc(DeviceFaultOne::getId))).orElse(new ArrayList<>());
+            //鏌ヨ璁惧鐘舵�佸瓧鍏�
+            List<SysDictData> sysDictDataList = DictUtils.getDictCache("璁惧鐘舵��");
+            SysDictData findEnum = sysDictDataList.stream().filter(e-> Integer.parseInt(e.getDictValue()) ==device.getDeviceStatus()).findFirst().orElse(new SysDictData());
+            map.put("progress",qrShowService.calcDeviceNextCheckRatio(calibrate.getCalibrationDate(),calibrate.getNextCalibrationDate()));//璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+            map.put("deviceName",device.getDeviceName());//璁惧鍚嶇О
+            map.put("deviceCode",device.getManagementNumber());//璁惧缂栧彿
+            map.put("usedYears",qrShowService.calcUsedYears(device.getActivationDate()));//鍚敤鏃堕暱(骞�)
+            map.put("deviceStatus",findEnum.getDictLabel());//璁惧杩愯鐘舵��
+            map.put("faultCount",deviceFaultOneList.size());//鏁呴殰娆℃暟
+            String faultDate = !deviceFaultOneList.isEmpty() ?qrShowService.formatDate(deviceFaultOneList.get(0).getFaultDate(),"yyyy-MM-dd"):"";
+            map.put("faultDate",faultDate);//鏈�杩戞晠闅滄棩鏈�
+            map.put("lastCalibrationDate",qrShowService.formatDate(calibrate.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牎鍑嗘棩鏈�
+            map.put("nextCalibrationDate",qrShowService.formatDate(calibrate.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍″噯鏃ユ湡
+            String calibrateStatus = "0yes".equals(calibrate.getStatus())?"鍚堟牸":"1no".equals(calibrate.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+            map.put("calibrateStatus",Objects.isNull(calibrate.getCalibrationDate())?"":calibrateStatus);//鏍″噯鎬荤粨璁�
+            map.put("lastExamineDate",examine.getCalibrationDate());//鏈�杩戞牳鏌ユ棩鏈�
+            map.put("nextExamineDate",examine.getNextCalibrationDate());//涓嬫鏍告煡鏃ユ湡
+            String examineStatus = "0yes".equals(examine.getStatus())?"鍚堟牸":"1no".equals(examine.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+            map.put("examineStatus",Objects.isNull(examine.getCalibrationDate())?"":examineStatus);//鏍告煡鎬荤粨璁�
+            map.put("maintenanceDate",deviceMaintenance.getDate());//鏈�杩戠淮鎶ゆ棩鏈�
+            map.put("nextMaintenanceDate",deviceMaintenance.getNextDate());//涓嬫缁存姢鏃ユ湡
+            String maintenanceType = "";
+            if(!Objects.isNull(deviceMaintenance.getMaintenanceType())){
+                maintenanceType = 0==deviceMaintenance.getMaintenanceType()?"浣跨敤鍓嶇淮鎶�":"浣跨敤鍚庣淮鎶�";
+            }
+            map.put("maintenanceType",maintenanceType);//缁存姢鎬荤粨璁�
+            //娴嬮噺椤圭洰
+            String insProduct = "";
+            if(StringUtils.isNotBlank(device.getInsProductIds())){
+                String[] ids = device.getInsProductIds().split(",");
+                List<StructureItemParameter> parameters = structureItemParameterMapper.selectBatchIds(Arrays.asList(ids));
+                List<String> itemList = parameters.stream().map(StructureItemParameter::getInspectionItem).distinct().collect(Collectors.toList());
+                insProduct = String.join(",",itemList);
+            }
+            map.put("insProduct",insProduct);//娴嬮噺椤圭洰
+        }
+        return map;
+    }
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java
new file mode 100644
index 0000000..3a1554f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java
@@ -0,0 +1,66 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.requier.dto.InstructionDto;
+import com.ruoyi.requier.mapper.InstructionMapper;
+import com.ruoyi.requier.pojo.Instruction;
+import com.ruoyi.requier.service.InstructionService;
+import com.ruoyi.requier.service.OperationInstructionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InstructionServiceImpl extends ServiceImpl<InstructionMapper, Instruction> implements InstructionService {
+
+    @Autowired
+    private OperationInstructionService operationInstructionService;
+
+    @Autowired
+    private NumberGenerator<Instruction> numberGenerator;
+
+    @Override
+    public IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page) {
+        return baseMapper.pageByPageQueryOfHomeworkInstructions(page);
+    }
+
+    @Override
+    public void newHomeworkGuidebookAdded(InstructionDto instructionDto) {
+        if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, Instruction::getApplicationNumber);
+            instructionDto.setApplicationNumber(processNumber);
+        }
+        saveOrUpdate(instructionDto);
+        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+            instructionDto.getFeTempHumRecordList().forEach(i -> {
+                i.setInstructionId(instructionDto.getId());
+                i.setUploader(SecurityUtils.getUserId().intValue());
+                i.setUpdateTime(LocalDateTime.now());
+            });
+            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java
new file mode 100644
index 0000000..c26e7c5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.OperationInstructionMapper;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.service.OperationInstructionService;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class OperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements OperationInstructionService {
+
+    @Override
+    public List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId) {
+        return baseMapper.homeworkGuidebookEditor(instructionId);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java
new file mode 100644
index 0000000..be0efb0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java
@@ -0,0 +1,110 @@
+package com.ruoyi.requier.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.dto.ReservationDto;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.mapper.ReservationMapper;
+import com.ruoyi.requier.pojo.Reservation;
+import com.ruoyi.requier.service.DataConfigService;
+import com.ruoyi.requier.service.ReservationService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@Service
+public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reservation> implements ReservationService {
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private ReservationMapper reservationMapper;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+    @Override
+    public ArrayList<JSONObject> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull, String starttime, String endtime) {
+        ArrayList<String> dateTextList = new ArrayList<>();
+        if (StringUtils.isNoneEmpty(starttime)&&StringUtils.isNoneEmpty(endtime)){
+            LocalDate startDate = LocalDate.parse(starttime, DateTimeFormatter.ISO_LOCAL_DATE);
+            LocalDate endDate = LocalDate.parse(endtime, DateTimeFormatter.ISO_LOCAL_DATE);
+            while (!startDate.isAfter(endDate)) {
+                dateTextList.add(startDate.toString());
+                startDate = startDate.plusDays(1);
+            }
+        }
+        LambdaQueryWrapper<Reservation> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.between(Reservation::getReservationTime,starttime,endtime);
+        List<Reservation> reservations = reservationMapper.selectList(lambdaQueryWrapper);
+        HashMap dates = new HashMap<String, Integer>();
+
+        Map<Integer, List<Reservation>> deviceIdcollect = reservations.stream().collect(Collectors.groupingBy(Reservation::getDeviceId));
+        for (Integer deviceId : deviceIdcollect.keySet()) {
+            List<Reservation> deviceIdList = deviceIdcollect.get(deviceId);
+            Map<String, List<Reservation>> collect = deviceIdList.stream().collect(Collectors.groupingBy(Reservation::getReservationTime));
+            for (String date : collect.keySet()) {
+                List<Reservation> reservations1 = collect.get(date);
+                Map<String, List<Reservation>> collect1 = reservations1.stream().collect(Collectors.groupingBy(Reservation::getSpecificTime));
+                for (String s : collect1.keySet()) {
+                    if (!(dates.containsKey(deviceId + date + s))) {
+                        dates.put(deviceId + date + s, collect1.get(s).size());
+                    }
+                }
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
+        List<DeviceDto> records = iPage.getRecords();
+        ArrayList<JSONObject> datas = new ArrayList<>();
+
+        String [] dateArrays={"09:00-12:00","13:00-18:00", "18:00-22:00"};
+        for (DeviceDto record : records) {
+            for (int i = 0; i < dateArrays.length; i++) {
+                String dateArray = dateArrays[i];
+                JSONObject temp = JSON.parseObject(JSON.toJSONString(record));
+                temp.put("time", dateArray);
+                JSONArray dataArray = new JSONArray();
+                for (String date : dateTextList) {
+                    JSONObject dateObject = new JSONObject();
+                    dateObject.put("date", date);
+                    dateObject.put("value", dates.containsKey(record.getId()+date + dateArray) ? dates.get(record.getId()+date + dateArray) : 0);
+                    dataArray.add(dateObject);
+                }
+                temp.put("dateList", dataArray);
+                datas.add(temp);
+            }
+        }
+        return datas;
+    }
+
+
+    @Override
+    public List<ReservationDto> selectReservationParameterPage(String deviceId, String reservationTime, String specificTime) {
+        return reservationMapper.selectReservationParameterPage(Integer.parseInt(deviceId), reservationTime, specificTime);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java b/cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java
new file mode 100644
index 0000000..ab7a6d1
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.vo;
+
+import com.ruoyi.requier.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OperationInstructionVo extends OperationInstruction {
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+}
diff --git a/cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml b/cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml
new file mode 100644
index 0000000..d874e55
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DeviceFaultOneMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.DeviceFaultOne">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="process_number" property="processNumber" />
+        <result column="measure_of_accuracy" property="measureOfAccuracy" />
+        <result column="fault_situation" property="faultSituation" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="submit_next_pesponsible" property="submitNextPesponsible" />
+        <result column="submit_operating_personnel" property="submitOperatingPersonnel" />
+        <result column="submit_date" property="submitDate" />
+        <result column="method_cost" property="methodCost" />
+        <result column="admin_audit_option" property="adminAuditOption" />
+        <result column="admin_next_pesponsible" property="adminNextPesponsible" />
+        <result column="admin_operating_personnel" property="adminOperatingPersonnel" />
+        <result column="technical_audit_option" property="technicalAuditOption" />
+        <result column="technical_next_pesponsible" property="technicalNextPesponsible" />
+        <result column="technical_operating_personnel" property="technicalOperatingPersonnel" />
+        <result column="technical_date" property="technicalDate" />
+        <result column="maintain_situation" property="maintainSituation" />
+        <result column="maintain_next_pesponsible" property="maintainNextPesponsible" />
+        <result column="maintain_operating_personnel" property="maintainOperatingPersonnel" />
+        <result column="maintain_date" property="maintainDate" />
+        <result column="check_cal_situation" property="checkCalSituation" />
+        <result column="after_maintenance_operating_personnel" property="afterMaintenanceOperatingPersonnel" />
+        <result column="after_maintenance_date" property="afterMaintenanceDate" />
+        <result column="current_status" property="currentState" />
+        <result column="submit_person" property="submitPerson" />
+        <result column="current_responsible" property="currentResponsible" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <select id="deviceFaultOnePage" resultType="com.ruoyi.requier.dto.DeviceFaultOneDto">
+        select dfo.*,
+               d.device_name,
+               d.management_number,
+               d.specification_model
+        from device_fault_one dfo
+                 left join device d on d.id = dfo.device_id
+        where dfo.device_id = #{deviceId}
+        <if test="processNumber != '' and processNumber != null">
+            and dfo.process_number like concat('%', #{processNumber}, '%')
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/InstructionMapper.xml b/cnas-require/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..f669677
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/InstructionMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.InstructionMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.Instruction">
+        <id column="id" property="id" />
+        <result column="application_number" property="applicationNumber" />
+        <result column="person_liable" property="personLiable" />
+        <result column="controlled_application_description" property="controlledApplicationDescription" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+    </resultMap>
+
+    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.requier.dto.OperationInstructionDto">
+        SELECT
+            doi.*,di.*,d.device_name, d.management_number device_number, d.specification_model device_model, u.name uploader_name, u1.name approver_name
+        FROM
+            device_operation_instruction doi
+                LEFT JOIN device_instruction di ON di.id = doi.instruction_id
+                left join device d on d.id = doi.device_id
+                left join user u on u.id = doi.uploader
+                left join user u1 on u1.id = doi.approver_id
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..316fe0a
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.OperationInstructionMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.OperationInstruction">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="document_number" property="documentNumber" />
+        <result column="author" property="author" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="create_user" property="createUser" />
+    </resultMap>
+
+    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.requier.vo.OperationInstructionVo">
+        SELECT
+            doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
+        FROM
+            device_operation_instruction doi
+                left join device d on d.id = doi.device_id
+        where doi.instruction_id = #{instructionId}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/ReservationMapper.xml b/cnas-require/src/main/resources/mapper/ReservationMapper.xml
new file mode 100644
index 0000000..1ccb536
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/ReservationMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.ReservationMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.Reservation">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="customer_name" property="customerName" />
+        <result column="reservation_time" property="reservationTime" />
+        <result column="specific_time" property="specificTime" />
+        <result column="link_person" property="linkPerson" />
+        <result column="phone" property="phone" />
+        <result column="device_number" property="deviceNumber" />
+        <result column="reservation_specification" property="reservationSpecification" />
+        <result column="create_user" property="createUser" />
+        <result column="create_date" property="createDate" />
+    </resultMap>
+
+
+    <select id="selectReservationParameterPage" resultType="com.ruoyi.requier.dto.ReservationDto">
+        SELECT
+        a.id,
+        a.create_date,
+        a.create_user,
+        a.customer_name,
+        a.device_id,
+        a.device_name,
+        a.device_number,
+        a.link_person,
+        a.phone ,
+        a.reservation_specification,
+        b.name
+        FROM
+        device_reservation a
+        INNER JOIN USER b ON a.create_user = b.id
+        where a.device_id = #{deviceId} and  a.reservation_time = #{reservationTime} and a.specific_time=#{specificTime}
+    </select>
+</mapper>

--
Gitblit v1.9.3