zhuo
2025-02-22 ed8d0914b272da2006b2ec53cc7374d2e0734de8
移植设备事故和作业指导书
已修改7个文件
已添加47个文件
2785 ■■■■■ 文件已修改
cnas-device/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/InstructionMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/pom.xml
@@ -18,6 +18,23 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>inspect-server</artifactId>
        </dependency>
        <!--mqtt jar包-->
        <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt -->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
        </dependency>
        <!--mqtt需要的jar包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
        <!--mqtt需要的jar包-->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-stream</artifactId>
        </dependency>
    </dependencies>
    <properties>
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
@@ -60,7 +60,7 @@
     * @return
     */
    @ApiOperation(value = "删除设备验收")
    @GetMapping("/delDeviceAcceptance")
    @DeleteMapping("/delDeviceAcceptance")
    public Result delDeviceAcceptance(Integer acceptanceId){
        return Result.success(deviceAcceptanceService.removeById(acceptanceId));
    }
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.device.controller;
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.device.pojo.DeviceAccidentReport;
import com.ruoyi.device.service.DeviceAccidentReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
@Api(tags = "设备事故报告单")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceAccidentReport")
public class DeviceAccidentReportController {
    private DeviceAccidentReportService deviceAccidentReportService;
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @return
     */
    @ApiOperation(value = "设备事故报告列表")
    @GetMapping("/pageDeviceAccidentReport")
    public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport){
        return Result.success(deviceAccidentReportService.pageDeviceAccidentReport(page, deviceAccidentReport));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡äº‹æ•…报告
     * @return
     */
    @ApiOperation(value = "查询设备事故报告")
    @GetMapping("/getDeviceAccidentReport")
    public Result getDeviceAccidentReport(Integer accidentReportId){
        return Result.success(deviceAccidentReportService.getById(accidentReportId));
    }
    /**
     * åˆ é™¤è®¾å¤‡äº‹æ•…报告
     * @return
     */
    @ApiOperation(value = "删除设备事故报告")
    @DeleteMapping("/delDeviceAccidentReport")
    public Result delDeviceAccidentReport(Integer accidentReportId){
        return Result.success(deviceAccidentReportService.removeById(accidentReportId));
    }
    /**
     * æ–°å¢žè®¾å¤‡äº‹æ•…报告
     * @return
     */
    @ApiOperation(value = "新增设备事故报告")
    @PostMapping("/addDeviceAccidentReport")
    public Result addDeviceAccidentReport(@RequestBody DeviceAccidentReport deviceAccidentReport){
        return Result.success(deviceAccidentReportService.addDeviceAccidentReport(deviceAccidentReport));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡äº‹æ•…报告
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @param response å“åº”
     */
    @ApiOperation(value = "导出设备事故报告")
    @GetMapping("/exportDeviceAccidentReport")
    public Result exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
        deviceAccidentReportService.exportDeviceAccidentReport(accidentReportId, response);
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
@@ -30,7 +30,7 @@
    //分页
    @PostMapping("/deviceBorrowPage")
    @GetMapping("/deviceBorrowPage")
    public Result deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) throws Exception {
        return Result.success(deviceBorrowService.deviceBorrowPage(page, deviceBorrow));
    }
@@ -48,13 +48,13 @@
    }
    //删除
    @PostMapping("/deleteDeviceBorrow")
    @DeleteMapping("/deleteDeviceBorrow")
    public Result deleteDeviceBorrow(Integer id) {
        return Result.success(deviceBorrowService.removeById(id));
    }
    //导出
    @PostMapping("/deviceBorrowExport")
    @GetMapping("/deviceBorrowExport")
    public Result deviceBorrowExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
        List<DeviceBorrow> deviceBorrows = deviceBorrowService.getDeviceBorrowBydeviceId(deviceId);
        response.setHeader("requestType", "excel");
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.device.controller;
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.device.dto.DeviceBreakdownMaintenance;
import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
@Api(tags = "设备故障维修表")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceBreakdownMaintenance")
public class DeviceBreakdownMaintenanceController {
    private DeviceBreakdownMaintenanceService deviceBreakdownMaintenanceService;
    /**
     * è®¾å¤‡æ•…障维修列表
     * @return
     */
    @ApiOperation(value = "设备故障维修列表")
    @GetMapping("/pageDeviceBreakdownMaintenance")
    public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
        return Result.success(deviceBreakdownMaintenanceService.pageDeviceBreakdownMaintenance(page, deviceBreakdownMaintenance));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡æ•…障维修
     * @return
     */
    @ApiOperation(value = "查询设备故障维修")
    @GetMapping("/getDeviceBreakdownMaintenance")
    public Result getDeviceBreakdownMaintenance(Integer maintenanceId){
        return Result.success(deviceBreakdownMaintenanceService.getById(maintenanceId));
    }
    /**
     * åˆ é™¤è®¾å¤‡æ•…障维修
     * @return
     */
    @ApiOperation(value = "删除设备故障维修")
    @DeleteMapping("/delDeviceBreakdownMaintenance")
    public Result delDeviceBreakdownMaintenance(Integer maintenanceId){
        return Result.success(deviceBreakdownMaintenanceService.removeById(maintenanceId));
    }
    /**
     * æ–°å¢žè®¾å¤‡æ•…障维修
     * @return
     */
    @ApiOperation(value = "新增设备故障维修")
    @PostMapping("/addDeviceBreakdownMaintenance")
    public Result addDeviceBreakdownMaintenance(@RequestBody DeviceBreakdownMaintenance deviceBreakdownMaintenance){
        return Result.success(deviceBreakdownMaintenanceService.addDeviceBreakdownMaintenance(deviceBreakdownMaintenance));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æ•…障维修
     * @param maintenanceId è®¾å¤‡æ•…障维修id
     * @param response å“åº”
     * @return
     */
    @ApiOperation(value = "导出设备故障维修")
    @GetMapping("/exportDeviceBreakdownMaintenance")
    public Result exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response){
        deviceBreakdownMaintenanceService.exportDeviceBreakdownMaintenance(maintenanceId, response);
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ruoyi.device.controller;
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.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import com.ruoyi.device.service.DeviceInspectionRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 *  è®¾å¤‡ç‚¹æ£€è®°å½•表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
@Api(tags = "设备点检记录")
@RestController
@RequestMapping("/deviceInspectionRecord")
public class DeviceInspectionRecordController {
    @Resource
    private DeviceInspectionRecordService deviceInspectionRecordService;
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("分页查询设备点检记录")
    @GetMapping("/getDeviceInspectionRecordByPage")
    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto itemParameter) {
        return deviceInspectionRecordService.getDeviceInspectionRecordByPage(page, itemParameter);
    }
    /**
     * æŸ¥è¯¢ç‚¹æ£€è¯¦æƒ…
     */
    @ApiOperation("查询点检详情")
    @GetMapping("/getDeviceInspectionRecord")
    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
        return deviceInspectionRecordService.getDeviceInspectionRecord(inspectionRecordId);
    }
    /**
     * æ–°å¢žè®¾å¤‡ç‚¹æ£€è®°å½•
     * @param deviceInspectionRecord  è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("新增设备点检记录")
    @PostMapping("/addDeviceInspectionRecord")
    public Result addDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
        return deviceInspectionRecordService.addDeviceInspectionRecord(deviceInspectionRecord);
    }
    /**
     * ä¿®æ”¹è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("修改设备点检记录")
    @PostMapping("/updateDeviceInspectionRecord")
    public Result updateDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
        return deviceInspectionRecordService.updateInspectionRecordAndDetails(deviceInspectionRecord);
    }
    /**
     * åˆ é™¤è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("删除设备点检记录")
    @DeleteMapping("/deleteDeviceInspectionRecord")
    public Result deleteDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
        return deviceInspectionRecordService.deleteDeviceInspectionRecordOrDetails(deviceInspectionRecord);
    }
    /**
     * å¤æ ¸ç‚¹æ£€è®°å½•
     * @return
     */
    @ApiOperation(value = "复核核查记录")
    @PostMapping("/reviewDeviceInspectionRecord")
    public Result reviewDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceExamineRecordDto){
        return deviceInspectionRecordService.reviewDeviceInspectionRecord(deviceExamineRecordDto);
    }
    /**
     * å¯¼å‡ºè®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("导出设备点检记录")
    @GetMapping("/exportDeviceInspectionRecord")
    public Result exportDeviceInspectionRecord(@RequestParam("inspectionRecordId") Integer inspectionRecordId, HttpServletResponse response) {
        return deviceInspectionRecordService.exportDeviceInspectionRecord(inspectionRecordId, response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ruoyi.device.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.device.dto.DeviceInstructionDto;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.DeviceInstruction;
import com.ruoyi.device.pojo.OperationInstruction;
import com.ruoyi.device.service.DeviceInstructionService;
import com.ruoyi.device.service.DeviceOperationInstructionService;
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("/deviceInstruction")
public class DeviceInstructionController {
    @Autowired
    private DeviceInstructionService deviceInstructionService;
    @Autowired
    private DeviceOperationInstructionService deviceOperationInstructionService;
    @ApiOperation(value = "作业指导书 åˆ†é¡µ")
    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
    public Result<IPage<DeviceInstruction>> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto){
        return Result.success(deviceInstructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
    }
    @ApiOperation(value = "作业指导书新增")
    @PostMapping("/newHomeworkGuidebookAdded")
    public Result newHomeworkGuidebookAdded(@RequestBody DeviceInstructionDto instructionDto){
        deviceInstructionService.newHomeworkGuidebookAdded(instructionDto);
        return Result.success();
    }
    @ApiOperation(value = "作业指导书编辑")
    @GetMapping("/homeworkGuidebookEditor")
    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
        DeviceInstruction instruction = deviceInstructionService.getById(instructionId);
        List<DeviceOperationInstructionDto> list = deviceOperationInstructionService.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(",");
            deviceOperationInstructionService.removeBatchByIds(Arrays.asList(idArray));
        }
        return Result.success();
    }
    @ApiOperation(value = "作业指导书删除")
    @GetMapping("/homeworkGuidebook")
    public Result homeworkGuidebook(String id, String instructionId){
        // åˆ é™¤å­è¡¨æ•°æ®
        deviceOperationInstructionService.removeById(id);
        // å¦‚果子表数据为空
        long count = deviceOperationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
                .eq(OperationInstruction::getInstructionId, instructionId));
        // é‚£ä¹ˆå°±åˆ é™¤çˆ¶è¡¨æ•°æ®
        if (count < 1) {
            deviceInstructionService.removeById(id);
        }
        return Result.success();
    }
    @ApiOperation(value = "作业指导书审批")
    @GetMapping("/approvalOfHomeworkInstructionManual")
    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
        deviceOperationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
                .eq(OperationInstruction::getId, id)
                .set(OperationInstruction::getStatus, status)
                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId().intValue())
                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
@@ -65,7 +65,7 @@
     * @param deviceMaintenancePlanDto è®¾å¤‡ä¿å…»è®¡åˆ’
     */
    @ApiOperation("删除设备保养计划")
    @GetMapping("/deleteMaintenancePlan")
    @DeleteMapping("/deleteMaintenancePlan")
    public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
        return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
    }
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
@@ -35,7 +35,7 @@
     * @return
     */
    @ApiOperation(value = "设备报废申请列表")
    @PostMapping("/pageDeviceScrapped")
    @GetMapping("/pageDeviceScrapped")
    public Result<IPage<DeviceScrapped>> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
        return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
    }
@@ -55,7 +55,7 @@
     * @return
     */
    @ApiOperation(value = "删除设备报废申请")
    @GetMapping("/delDeviceScrapped")
    @DeleteMapping("/delDeviceScrapped")
    public Result delDeviceScrapped(Integer scrappedId){
        return Result.success(deviceScrappedService.removeById(scrappedId));
    }
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
@@ -62,7 +62,7 @@
     * @param deviceTraceabilityManagementDto é‡å€¼æº¯æºè®¡åˆ’
     */
    @ApiOperation("删除量值溯源计划")
    @GetMapping("/deleteTraceabilityManagement")
    @DeleteMapping("/deleteTraceabilityManagement")
    public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
        return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
    }
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-18 æ˜ŸæœŸä¸‰ 10:00:48
 * Description:
 */
@Data
public class DeviceAccidentReportDto extends DeviceAccidentReport {
    @ApiModelProperty("时间")
    private String accidentDateStr;
    @ApiModelProperty("报告人填写时间")
    private String reportDateStr;
    @ApiModelProperty("评估人填写时间")
    private String assessorDateStr;
    @ApiModelProperty("部门负责人填写时间")
    private String departmentHeadDateStr;
    @ApiModelProperty("技术负责人填写时间")
    private String technicalDirectorDateStr;
    @ApiModelProperty("主任填写时间")
    private String directorHeadDateStr;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.device.dto;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
@Getter
@Setter
@TableName("device_breakdown_maintenance")
@ApiModel(value = "DeviceBreakdownMaintenance对象", description = "设备故障维修表")
public class DeviceBreakdownMaintenance {
    @TableId(value = "maintenance_id", type = IdType.AUTO)
    private Integer maintenanceId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("安装地址")
    private String location;
    @ApiModelProperty("损坏或故障情况")
    private String damageOrMalfunction;
    @ApiModelProperty("申请人id")
    private Integer applicantUserId;
    @ApiModelProperty("申请人")
    private String applicantUser;
    @ApiModelProperty("要求修复时间")
    private LocalDate repairDate;
    @ApiModelProperty("部门负责人意见")
    private String departmentHeadOpinion;
    @ApiModelProperty("部门负责人id")
    private Integer departmentHeadUserId;
    @ApiModelProperty("部门负责人")
    private String departmentHeadUser;
    @ApiModelProperty("部门负责人填写时间")
    private LocalDate departmentHeadDate;
    @ApiModelProperty("维修记事")
    private String maintenanceRecord;
    @ApiModelProperty("维修人")
    private String maintenanceUser;
    @ApiModelProperty("维修时间")
    private LocalDate maintenanceDate;
    @ApiModelProperty("是否结束,0 æœªç»“束, 1结束")
    private Integer isFinish;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false,select = false)
    @ApiModelProperty("流程, 0:申请, 1申请部门负责人意见, 2:维修记事")
    private Integer flowType;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.device.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Author: yuan
 * Date: 2024-12-16 æ˜ŸæœŸä¸€ 17:23:22
 * Description:
 */
@Data
public class DeviceInspectionRecordDto extends DeviceInspectionRecord {
    @TableField(exist = false)
    @ApiModelProperty("测试详情内容")
    private List<DeviceInspectionRecordDetails> details;
    @ApiModelProperty("测试时间")
    private String testDateString;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceInstruction;
import com.ruoyi.device.pojo.OperationInstruction;
import lombok.Data;
import java.util.List;
@Data
public class DeviceInstructionDto extends DeviceInstruction {
    private List<OperationInstruction> feTempHumRecordList;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.OperationInstruction;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceOperationInstructionDto extends OperationInstruction {
    @ApiModelProperty("申请编号")
    private String applicationNumber;
    @ApiModelProperty("申请部门")
    private String applicationDepartment;
    @ApiModelProperty("责任人")
    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;
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceAccidentReportDto;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
public interface DeviceAccidentReportMapper extends BaseMapper<DeviceAccidentReport> {
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, @Param("ew") QueryWrapper<DeviceAccidentReport> ew);
    /**
     * æŸ¥è¯¢è®¾å¤‡äº‹æ•…报告详情
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @return
     */
    DeviceAccidentReportDto selectDeviceAccidentReportById(Integer accidentReportId);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceBreakdownMaintenance;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
public interface DeviceBreakdownMaintenanceMapper extends BaseMapper<DeviceBreakdownMaintenance> {
    /**
     * è®¾å¤‡æ•…障维修列表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, @Param("ew") QueryWrapper<DeviceBreakdownMaintenance> ew);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:27:32
 */
public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
public interface DeviceInspectionRecordMapper extends BaseMapper<DeviceInspectionRecord> {
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param page
     * @param queryWrappers
     * @return
     */
    IPage<DeviceInspectionRecord> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceInspectionRecordDto> queryWrappers);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.DeviceInstruction;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
public interface InstructionMapper extends BaseMapper<DeviceInstruction> {
    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<DeviceOperationInstructionDto> ew);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.OperationInstruction;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.mqtt;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class MQBean {
    @Bean("mqClient") // å¯åЍWEB服务器的时候调用此方法初始化
    public MQClient myMQTTClient(){
        MQClient mqClient = new MQClient();
        return mqClient;
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.device.mqtt;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.device.service.CollectBridgeService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Component
@Slf4j
public class MQCallback<component> implements MqttCallback {
    private MQClient mqClient; // MQTT连接数据
    private MQConfig mqConfig; // yml配置数据
    private static MQCallback mqCallback;
    @Resource
    private CollectBridgeService collectBridgeService;
    @PostConstruct
    public void init() {
        mqCallback = this;
         // åˆä½¿åŒ–时将已静态化的configParam实例化
        mqCallback.collectBridgeService = this.collectBridgeService;
    }
    public MQCallback(MQClient mqClient, MQConfig mqConfig) {
        this.mqClient = mqClient;
        this.mqConfig = mqConfig;
    }
    /** è¿žæŽ¥ä¸¢å¤±åŽï¼Œä¸€èˆ¬åœ¨è¿™é‡Œé¢è¿›è¡Œé‡è¿ž **/
    @SneakyThrows
    @Override
    public void connectionLost(Throwable cause) {
        /** è¿žæŽ¥ä¸¢å¤±åŽï¼Œä¸€èˆ¬åœ¨è¿™é‡Œé¢è¿›è¡Œé‡è¿ž **/
        if (mqClient != null) {
            while (true) {
                try {
                    log.info("==============》》》[MQTT] è¿žæŽ¥ä¸¢å¤±ï¼Œå°è¯•重连...");
                    MQClient mqttPushClient = new MQClient();
                    mqttPushClient.connect(mqConfig);
                    if (mqClient.getClient().isConnected()) {
                        log.info("=============>>重连成功");
                    }
                    break;
                } catch (Exception e) {
                    log.error("=============>>>[MQTT] è¿žæŽ¥æ–­å¼€ï¼Œé‡è¿žå¤±è´¥ï¼<<=============");
                    continue;
                }
            }
        }
        log.info(cause.getMessage());
    }
    /**
     * MQTT服务器向WEB服务器发送的数据会执行到这里面,官方话称为:订阅后的消息
     * @param topic ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param message ä¿¡æ¯
     * @throws Exception æŠ¥é”™
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        try {
            String parse = new String(message.getPayload());
            JSONObject jsonObject = JSONObject.parseObject(parse);
            // å¡«å……采集数据
            mqCallback.collectBridgeService.addBridgeValue(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("============》》接收消息主题异常 : " + e.getMessage());
        }
    }
    /**
     * WEB服务器向MQTT服务器发送的数据会执行到这里面
     * å®˜æ–¹è¯ç§°ä¸ºï¼šå‘布后会执行到这里
     * @param token è¿žæŽ¥token
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
//        log.info("==========发布信息={}==========", token.isComplete());
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.ruoyi.device.mqtt;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MQClient {
    private static MqttClient client;
    public static MqttClient getClient() {
        return client;
    }
    public static void setClient(MqttClient client) {
        MQClient.client = client;
    }
    /**
     * WEB服务器连接MQTT服务器的配置
     * @param userName è´¦å·
     * @param password å¯†ç 
     * @param outTime è¶…æ—¶æ—¶é—´
     * @param KeepAlive å¿ƒè·³æ£€æµ‹æ—¶é—´
     * @return
     */
    private MqttConnectOptions getOption(String userName, String password, int outTime, int KeepAlive) {
        MqttConnectOptions option = new MqttConnectOptions();
        // è®¾ç½®æ˜¯å¦æ¸…空session,false表示服务器会保留客户端的连接记录,true表示每次连接到服务器都以新的身份连接
        option.setCleanSession(true);
        // è®¾ç½®è¿žæŽ¥çš„用户名
        option.setUserName(userName);
        // è®¾ç½®è¿žæŽ¥çš„密码
        option.setPassword(password.toCharArray());
        // è®¾ç½®è¶…æ—¶æ—¶é—´ å•位为秒
        option.setConnectionTimeout(outTime);
        // è®¾ç½®ä¼šè¯å¿ƒè·³æ—¶é—´ å•位为秒 æœåŠ¡å™¨ä¼šæ¯éš”(1.5*keepTime)秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
        option.setKeepAliveInterval(KeepAlive);
        // setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
        // option.setWill(topic, "close".getBytes(), 2, true);
        //设置最大速度
        option.setMaxInflight(1000);
        log.info("================>>>MQTT连接认证成功<<======================");
        return option;
    }
    /**
     * WEB服务器连接MQTT服务器函数
     * @param mqttConfig yml中MQTT的配置
     */
    public void connect(MQConfig mqttConfig) throws MqttException {
        client = new MqttClient(mqttConfig.getUrl(), mqttConfig.getClientId(), new MemoryPersistence());
        MqttConnectOptions options = getOption(mqttConfig.getUsername(), mqttConfig.getPassword(),
                mqttConfig.getTimeout(), mqttConfig.getKeepAlive());
        MQClient.setClient(client);
        //连接失败调用回调函数,重新连接
        client.setCallback(new MQCallback<Object>(this, mqttConfig));
        if (!client.isConnected()) {
            client.connect(options);
            // è®¢é˜…主题
            MQSubscribe.subscribe_0(mqttConfig.getSubscribe());
            log.info("================>>>MQTT连接成功<<======================");
        } else {// è¿™é‡Œçš„逻辑是如果连接不成功就重新连接
            client.disconnect();
            client.connect(options);
        }
    }
    /**
     * WEB服务器与MQTT服务器的断线重连
     * @throws Exception
     */
    public Boolean reConnect() throws Exception {
        Boolean isConnected = false;
        if (null != client) {
            client.connect();
            if (client.isConnected()) {
                isConnected = true;
            }
        }
        return isConnected;
    }
    /**
     * å¼‚常关闭服务,WEB服务器与MQTT服务器的断开连接函数
     */
    @SneakyThrows
    public void close(){
        client.close();
        client.disconnect();
        log.info("================>>异常关闭与mqtt服务器的连接<<======================");
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.device.mqtt;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Data
public class MQConfig {
    /**
     * MQTT-服务端-IP
     */
    @Value("${mqtt.url}")
    private String url;
    /**
     * MQTT-服务端-用户名
     */
    @Value("${mqtt.username}")
    private String username;
    /**
     * MQTT-服务端-密码
     */
    @Value("${mqtt.password}")
    private String password;
    /**
     * è¶…æ—¶æ—¶é—´
     */
    @Value("${mqtt.timeout}")
    private int timeout;
    /**
     * å¿ƒè·³æ£€æµ‹æ—¶é—´
     */
    @Value("${mqtt.keepalive}")
    private int keepAlive;
    /**
     * å¿ƒè·³åŒ…级别
     */
    @Value("${mqtt.qos}")
    private int qos;
    /**
     * æœåŠ¡ç«¯è¿žæŽ¥è¶…æ—¶æ—¶é—´
     */
    @Value("${mqtt.completion-timeout}")
    private int completionTimeout;
    /**
     * clientId
     */
    @Value("${mqtt.clientId}")
    private String clientId;
    /**
     * è®¢é˜…主题
     */
    @Value("${mqtt.subscribe}")
    private String subscribe;
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.device.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MQPublic {
    /**
     * é€šä¿¡è´¨é‡qos为0:表示WEB服务器向MQTT服务器只发送一次,不管MQTT服务器有没有收到
     * WEB服务器向MQTT服务器发布数据,此方法封装了publish函数
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish_0(int qos, String topic, byte[] pushMessage) {
        publish(0, false, topic, pushMessage);
    }
    /**
     * é€šä¿¡è´¨é‡qos为1:表示WEB服务器向MQTT服务器发送数据,MQTT服务器一定会收到一次数据,如果MQTT服务器没有响应“收到数据”,那么WEB服务器就会一直发送数据
     * WEB服务器向MQTT服务器发布数据,调用此函数,此方法封装了publish函数,通信质量qos为1
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish_1(String topic, byte[] pushMessage) {
        publish(1, false, topic, pushMessage);
    }
    /**
     *通信质量qos为2:表示WEB服务器向MQTT服务器发送数据,两者会进行至少两次请求/响应流程,避免数据在传输中的丢失,但是相应的也会消耗计算机中的资源
     * WEB服务器向MQTT服务器发布数据,此方法封装了publish函数,通信质量:2
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish_2(String topic, byte[] pushMessage) {
        publish(2,false, topic, pushMessage);
    }
    /**
     * å‘布函数:WEB服务器向MQTT服务器发送数据
     *
     * @param qos é€šä¿¡è´¨é‡
     * @param retained é»˜è®¤ï¼šfalse-非持久化(是指一条消息消费完,就会被删除;持久化,消费完,还会保存在服务器中,当新的订阅者出现,继续给新订阅者消费)
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish(int qos, boolean retained, String topic, byte[] pushMessage) {
        MqttMessage message = new MqttMessage();
        message.setQos(qos);
        message.setRetained(retained);
        // å°†String[]数组转换为byte数组发送
        message.setPayload(pushMessage);
        MqttTopic mTopic = MQClient.getClient().getTopic(topic);
        if (null == mTopic) {
            log.error("===============>>>MQTT {} ä¸å­˜åœ¨<<=======================",topic);
        }
        MqttDeliveryToken token;
        try {
            token = mTopic.publish(message);
            token.waitForCompletion();
        } catch (MqttPersistenceException e) {
            e.printStackTrace();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.device.mqtt;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.stereotype.Component;
@Component
public class MQSubscribe {
    /**
     * è®¢é˜…某个主题:MQTT服务器向WEB服务器发送数据
     *主题:也称为底层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     * @param qos MQTT服务器向WEB服务器发送数据
     *            qos为0:只向WEB服务器发送一次;
     *            qos为1:至少向WEB服务器发送一次,接收方会响应一个报文;
     *            qos为2:两者会进行至少两次请求/响应流程,避免数据在传输中的丢失
     */
    private static void subscribe(String topic, int qos) {
        try {
            MQClient.getClient().subscribe(topic,qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
    /**
     * è®¢é˜…某个主题,通信质量:qos默认为0
     * ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     */
    public static void subscribe_0(String topic) {
        subscribe(topic, 0);
    }
    /**
     * è®¢é˜…某个主题,通信质量:qos默认为1
     * ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     */
    public void subscribe_1(String topic) {
        subscribe(topic, 1);
    }
    /**
     * è®¢é˜…某个主题,通信质量:qos默认为2
     * ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     */
    public void subscribe_2(String topic) {
        subscribe(topic, 2);
    }
    public void OffSubscribe(String topic) {
        try {
            MQClient.getClient().unsubscribe(topic);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
@Getter
@Setter
@TableName("device_accident_report")
@ApiModel(value = "DeviceAccidentReport对象", description = "设备事故报告单")
public class DeviceAccidentReport {
    @TableId(value = "accident_report_id", type = IdType.AUTO)
    private Integer accidentReportId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("地址")
    private String address;
    @ApiModelProperty("时间")
    private LocalDateTime accidentDate;
    @ApiModelProperty("事故情况描述")
    private String descriptionOfAccident;
    @ApiModelProperty("报告人id")
    private Integer reportUserId;
    @ApiModelProperty("报告人")
    private String reportUser;
    @ApiModelProperty("报告人填写时间")
    private LocalDate reportDate;
    @ApiModelProperty("评估人意见")
    private String assessorOpinion;
    @ApiModelProperty("评估人id")
    private Integer assessorUserId;
    @ApiModelProperty("评估人")
    private String assessorUser;
    @ApiModelProperty("评估人填写时间")
    private LocalDate assessorDate;
    @ApiModelProperty("部门负责人意见")
    private String departmentHeadOpinion;
    @ApiModelProperty("部门负责人id")
    private Integer departmentHeadUserId;
    @ApiModelProperty("部门负责人")
    private String departmentHeadUser;
    @ApiModelProperty("部门负责人填写时间")
    private LocalDate departmentHeadDate;
    @ApiModelProperty("技术负责人意见")
    private String technicalDirectorOpinion;
    @ApiModelProperty("技术负责人id")
    private Integer technicalDirectorUserId;
    @ApiModelProperty("技术负责人")
    private String technicalDirectorUser;
    @ApiModelProperty("技术负责人填写时间")
    private LocalDate technicalDirectorDate;
    @ApiModelProperty("主任意见")
    private String directorHeadOpinion;
    @ApiModelProperty("主任id")
    private Integer directorHeadUserId;
    @ApiModelProperty("主任")
    private String directorHeadUser;
    @ApiModelProperty("主任填写时间")
    private LocalDate directorHeadDate;
    @ApiModelProperty("是否结束,0 æœªç»“束, 1结束")
    private Integer isFinish;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false,select = false)
    @ApiModelProperty("流程, 0:报告, 1评估, 2:部门负责人意见, 3:技术负责人意见, 4:主任意见")
    private Integer flowType;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
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-16 04:25:14
 */
@Getter
@Setter
@TableName("device_inspection_record")
@ApiModel(value = "DeviceInspectionRecord对象", description = "")
public class DeviceInspectionRecord implements Serializable {
    @ApiModelProperty("设备点检记录id")
    @TableId(value = "inspection_record_id", type = IdType.AUTO)
    private Integer inspectionRecordId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("测量范围")
    private String measurementScope;
    @ApiModelProperty("点检使用物质名称")
    private String materialName;
    @ApiModelProperty("点检使用物质规格型号")
    private String materialModel;
    @ApiModelProperty("点检使用物质管理编号")
    private String materialManagementNumber;
    @ApiModelProperty("点检使用物质精度等级")
    private String materialAccuracyGrade;
    @ApiModelProperty("温度")
    private String temperature;
    @ApiModelProperty("湿度")
    private String humidity;
    @ApiModelProperty("测试结论")
    private String testConclusion;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("状态(是否复核)0未复核,1复核")
    private Integer status;
    @ApiModelProperty("测试人")
    private String recorder;
    @ApiModelProperty("测试人id")
    private Integer recorderId;
    @ApiModelProperty("复核人")
    private String reviewer;
    @ApiModelProperty("复核人id")
    private Integer reviewerId;
    @ApiModelProperty("复核信息")
    private String reviewerRemark;
    @ApiModelProperty("测试日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime testDate;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("修改人id")
    private Integer updateUserId;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.device.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-16 04:27:32
 */
@Getter
@Setter
@TableName("device_inspection_record_details")
@ApiModel(value = "DeviceInspectionRecordDetails对象", description = "")
public class DeviceInspectionRecordDetails implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("点检详情id")
    @TableId(value = "inspection_record_detail_id", type = IdType.AUTO)
    private Integer inspectionRecordDetailId;
    @ApiModelProperty("点检id")
    private Integer inspectionRecordId;
    @ApiModelProperty("测试项目")
    private String testItems;
    @ApiModelProperty("标准值")
    private String standardValue;
    @ApiModelProperty("实测值")
    private String measuredValue;
    @ApiModelProperty("示值误差")
    private String indicationError;
    @ApiModelProperty("允许误差")
    private String allowableError;
    @ApiModelProperty("单项结论")
    private String singleItemConclusion;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("修改人id")
    private Integer updateUserId;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.device.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 DeviceInstruction 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("责任人")
    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;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
@Getter
@Setter
@TableName("device_operation_instruction")
public class OperationInstruction {
    @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("作业指导书id")
    private Integer instructionId;
    @ApiModelProperty("上传人id")
    private Integer uploader;
    @ApiModelProperty("审批人id")
    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("更新人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
}
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.device.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.CollectBridge;
/**
 * æ•°å­—电桥采集
 *
 * @author zhuo
 * @since 2025-02-19
 */
public interface CollectBridgeService extends IService<CollectBridge> {
    /**
     * å¡«å……采集数据
     * @param jsonObject
     */
    void addBridgeValue(JSONObject jsonObject);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.device.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.device.pojo.DeviceAccidentReport;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
public interface DeviceAccidentReportService extends IService<DeviceAccidentReport> {
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @param page
     * @param deviceAccidentReport
     * @return
     */
    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport);
    /**
     * æ–°å¢žè®¾å¤‡äº‹æ•…报告
     * @param deviceAccidentReport
     * @return
     */
    boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport);
    /**
     * å¯¼å‡ºè®¾å¤‡äº‹æ•…报告
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @param response å“åº”
     */
    void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.device.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.device.dto.DeviceBreakdownMaintenance;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
public interface DeviceBreakdownMaintenanceService extends IService<DeviceBreakdownMaintenance> {
    /**
     * è®¾å¤‡æ•…障维修列表
     * @param page
     * @param deviceBreakdownMaintenance
     * @return
     */
    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance);
    /**
     * æ–°å¢žè®¾å¤‡æ•…障维修
     * @param deviceBreakdownMaintenance
     * @return
     */
    boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance);
    /**
     * å¯¼å‡ºè®¾å¤‡æ•…障维修
     * @param maintenanceId è®¾å¤‡æ•…障维修id
     * @param response å“åº”
     */
    void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:27:32
 */
public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 *  è®¾å¤‡ç‚¹æ£€è®°å½•表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
public interface DeviceInspectionRecordService extends IService<DeviceInspectionRecord> {
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param page
     */
    Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * æŸ¥è¯¢ç‚¹æ£€è¯¦æƒ…
     * @param inspectionRecordId
     * @return
     */
    Result getDeviceInspectionRecord(Integer inspectionRecordId);
    /**
     * æ–°å¢žè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * ä¿®æ”¹è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * åˆ é™¤è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * å¤æ ¸ç‚¹æ£€è®°å½•
     * @param deviceExamineRecordDto
     * @return
     */
    Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto deviceExamineRecordDto);
    /**
     * å¯¼å‡ºè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecordId è®¾å¤‡ç‚¹æ£€è®°å½•id
     * @param response
     */
    Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.device.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.device.dto.DeviceInstructionDto;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.DeviceInstruction;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
public interface DeviceInstructionService extends IService<DeviceInstruction> {
    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto);
    void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.OperationInstruction;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
public interface DeviceOperationInstructionService extends IService<OperationInstruction> {
    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.ruoyi.device.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.CollectBridgeMapper;
import com.ruoyi.device.pojo.CollectBridge;
import com.ruoyi.device.service.CollectBridgeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
/**
 * æ•°å­—电桥采集
 *
 * @author zhuo
 * @since 2025-02-19
 */
@Service
@Slf4j
public class CollectBridgeServiceImpl extends ServiceImpl<CollectBridgeMapper, CollectBridge> implements CollectBridgeService {
    /**
     * å¡«å……采集数据
     * @param jsonObject
     */
    @Override
    public void addBridgeValue(JSONObject jsonObject) {
        JSONArray dataArray = jsonObject.getJSONArray("data");
        for (int i = 0; i < dataArray.size(); i++) {
            JSONObject listInfo = dataArray.getJSONObject(i);
            // å­˜å‚¨æ•°æ®
            String dataStream = listInfo.getString("dataStream");
            if (dataStream.equals("DQCS.DQCS.SN")) {
                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
                String entrustCode = pointsJSONObject.getString("value");
                // è§£æžæ—¶é—´æˆ³
                Instant instant = Instant.ofEpochMilli(pointsJSONObject.getLong("time"));
                LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
                // å…ˆå­˜å‚¨ç¼–号, åŽç»­å­˜å‚¨å€¼
                CollectBridge collectBridge = new CollectBridge();
                collectBridge.setEntrustCode(entrustCode);
                collectBridge.setCollectDate(collectDate);
                baseMapper.insert(collectBridge);
            }
            // å¯„存器地址等于64获取结果值
            if (dataStream.equals("DQCS.DQCS.64")) {
                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
                String value = pointsJSONObject.getString("value");
                if (value.equals("64")) {
                    for (int j = 0; j < dataArray.size(); j++) {
                        JSONObject listInfo2 = dataArray.getJSONObject(j);
                        String dataStream2 = listInfo2.getString("dataStream");
                        // å¯„存器地址等于64获取结果值
                        if (dataStream2.equals("DQCS.DQCS.DZZ")) {
                            JSONArray dataPoints2 = listInfo2.getJSONArray("dataPoints");
                            JSONObject pointsJSONObject2 = dataPoints2.getJSONObject(0);
                            String collectValue = pointsJSONObject2.getString("value");
                            // è§£æžæ—¶é—´æˆ³
                            Instant instant = Instant.ofEpochMilli(pointsJSONObject2.getLong("time"));
                            LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
                            // æŸ¥è¯¢æœ€æ–°ä¸€æ¡æ•°æ®
                            CollectBridge collectBridge = baseMapper.selectOne(Wrappers.<CollectBridge>lambdaQuery()
                                    .orderByDesc(CollectBridge::getCollectDate)
                                    .last("limit 1"));
                            // åˆ¤æ–­ä¸¤æ¡æ•°æ®æ˜¯å¦ç›¸å·®åœ¨10分钟之内和有没有编号
                            if (isWithinTenMinutes(collectDate, collectBridge.getCollectDate()) &&
                                    StringUtils.isNotBlank(collectBridge.getEntrustCode())) {
                                // ä¿®æ”¹æ£€éªŒå€¼
                                collectBridge.setCollectValue(collectValue);
                                baseMapper.updateById(collectBridge);
                            } else {
                                // åªå­˜å‚¨å€¼
                                CollectBridge bridge = new CollectBridge();
                                bridge.setCollectValue(collectValue);
                                bridge.setCollectDate(collectDate);
                                baseMapper.insert(bridge);
                            }
                        }
                    }
                }
            }
        }
    }
    public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) {
        Duration duration = Duration.between(dateTime1, dateTime2);
        long minutesDifference = Math.abs(duration.toMinutes());
        return minutesDifference <= 10;
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
package com.ruoyi.device.service.impl;
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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceAccidentReportDto;
import com.ruoyi.device.mapper.DeviceAccidentReportMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import com.ruoyi.device.service.DeviceAccidentReportService;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
@Service
public class DeviceAccidentReportServiceImpl extends ServiceImpl<DeviceAccidentReportMapper, DeviceAccidentReport> implements DeviceAccidentReportService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private DeviceMapper deivceMapper;
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @param page
     * @param deviceAccidentReport
     * @return
     */
    @Override
    public IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport) {
        return baseMapper.pageDeviceAccidentReport(page, QueryWrappers.queryWrappers(deviceAccidentReport));
    }
    /**
     * æ–°å¢žè®¾å¤‡äº‹æ•…报告
     * @param deviceAccidentReport
     * @return
     */
    @Override
    public boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport) {
        DeviceAccidentReport accidentReport = new DeviceAccidentReport();
        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
        switch (deviceAccidentReport.getFlowType()) {
            case 0:
                // æŠ¥å‘Š
                BeanUtils.copyProperties(deviceAccidentReport, accidentReport);
                accidentReport.setDescriptionOfAccident(deviceAccidentReport.getDescriptionOfAccident());
                accidentReport.setReportUserId(user.getId());
                accidentReport.setReportUser(user.getName());
                accidentReport.setReportDate(LocalDate.now());
                // è¯„估人信息
                User assessorUser = userMapper.selectById(deviceAccidentReport.getAssessorUserId());
                accidentReport.setAssessorUserId(assessorUser.getId());
                accidentReport.setAssessorUser(assessorUser.getName());
                baseMapper.insert(accidentReport);
                break;
            case 1:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // è¯„ä¼°
                accidentReport.setAssessorOpinion(deviceAccidentReport.getAssessorOpinion());
                accidentReport.setAssessorDate(LocalDate.now());
                // éƒ¨é—¨è´Ÿè´£äºº
                User departmentHeadUser = userMapper.selectById(deviceAccidentReport.getDepartmentHeadUserId());
                accidentReport.setDepartmentHeadUserId(departmentHeadUser.getId());
                accidentReport.setDepartmentHeadUser(departmentHeadUser.getName());
                baseMapper.updateById(accidentReport);
                break;
            case 2:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // éƒ¨é—¨è´Ÿè´£äººæ„è§
                accidentReport.setDepartmentHeadOpinion(deviceAccidentReport.getDepartmentHeadOpinion());
                accidentReport.setDepartmentHeadDate(LocalDate.now());
                // æŠ€æœ¯è´Ÿè´£äººä¿¡æ¯
                User technicalDirectorUser = userMapper.selectById(deviceAccidentReport.getTechnicalDirectorUserId());
                accidentReport.setTechnicalDirectorUserId(technicalDirectorUser.getId());
                accidentReport.setTechnicalDirectorUser(technicalDirectorUser.getName());
                baseMapper.updateById(accidentReport);
                break;
            case 3:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // æŠ€æœ¯è´Ÿè´£äººæ„è§
                accidentReport.setTechnicalDirectorOpinion(deviceAccidentReport.getTechnicalDirectorOpinion());
                accidentReport.setTechnicalDirectorDate(LocalDate.now());
                // ä¸»ä»»ä¿¡æ¯
                User directorHeadUser = userMapper.selectById(deviceAccidentReport.getDirectorHeadUserId());
                accidentReport.setDirectorHeadUserId(directorHeadUser.getId());
                accidentReport.setDirectorHeadUser(directorHeadUser.getName());
                baseMapper.updateById(accidentReport);
                break;
            case 4:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // ä¸»ä»»æ„è§
                accidentReport.setDirectorHeadOpinion(deviceAccidentReport.getDirectorHeadOpinion());
                accidentReport.setDirectorHeadDate(LocalDate.now());
                accidentReport.setIsFinish(1);
                baseMapper.updateById(accidentReport);
                break;
        }
        return true;
    }
    /**
     * å¯¼å‡ºè®¾å¤‡äº‹æ•…报告
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @param response å“åº”
     */
    @Override
    public void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
        // æŸ¥è¯¢äº‹æ•…报告
        DeviceAccidentReportDto deviceAccidentReport = baseMapper.selectDeviceAccidentReportById(accidentReportId);
        Device device = deivceMapper.selectById(deviceAccidentReport.getDeviceId());
        device = device == null ? new Device() : device;
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-accident-report.docx");
        Configure configure = Configure.builder()
                .build();
        Device finalDevice = device;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceAccidentReport", deviceAccidentReport);
                    put("device", finalDevice);
                    // æŠ¥å‘Šäººç­¾å
                    put("reportUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getReportUserId()));
                    // è¯„估人签名
                    put("assessorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getAssessorUserId()));
                    // éƒ¨é—¨è´Ÿè´£äººç­¾å
                    put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
                    // æŠ€æœ¯è´Ÿè´£äººç­¾å
                    put("technicalDirectorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getTechnicalDirectorUserId()));
                    // ä¸»ä»»ç­¾å
                    put("directorHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
                }});
        try {
            response.setContentType("application/msword");
            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
            String fileName = URLEncoder.encode(
                    deviceName + "设备事故报告单", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,152 @@
package com.ruoyi.device.service.impl;
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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
import com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
@Service
public class DeviceBreakdownMaintenanceServiceImpl extends ServiceImpl<DeviceBreakdownMaintenanceMapper, DeviceBreakdownMaintenance> implements DeviceBreakdownMaintenanceService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private DeviceMapper deivceMapper;
    /**
     * è®¾å¤‡æ•…障维修列表
     * @param page
     * @param deviceBreakdownMaintenance
     * @return
     */
    @Override
    public IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
        return baseMapper.pageDeviceBreakdownMaintenance(page, QueryWrappers.queryWrappers(deviceBreakdownMaintenance));
    }
    /**
     * æ–°å¢žè®¾å¤‡æ•…障维修
     * @param deviceBreakdownMaintenance
     * @return
     */
    @Override
    public boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
        DeviceBreakdownMaintenance breakdownMaintenance = new DeviceBreakdownMaintenance();
        //当前登录用户
        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
        switch (deviceBreakdownMaintenance.getFlowType()) {
            case 0:
                BeanUtils.copyProperties(deviceBreakdownMaintenance, breakdownMaintenance);
                // ç”³è¯·
                breakdownMaintenance.setDamageOrMalfunction(deviceBreakdownMaintenance.getDamageOrMalfunction());
                breakdownMaintenance.setApplicantUserId(user.getId());
                breakdownMaintenance.setApplicantUser(user.getName());
                breakdownMaintenance.setRepairDate(deviceBreakdownMaintenance.getRepairDate());
                // å¤„理人信息
                User departmentHeadUser = userMapper.selectById(deviceBreakdownMaintenance.getDepartmentHeadUserId());
                breakdownMaintenance.setApplicantUserId(departmentHeadUser.getId());
                breakdownMaintenance.setApplicantUser(departmentHeadUser.getName());
                baseMapper.insert(breakdownMaintenance);
                break;
            case 1:
                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
                // ç”³è¯·éƒ¨é—¨è´Ÿè´£äººæ„è§
                breakdownMaintenance.setDepartmentHeadOpinion(deviceBreakdownMaintenance.getDepartmentHeadOpinion());
                breakdownMaintenance.setDepartmentHeadDate(LocalDate.now());
                baseMapper.updateById(breakdownMaintenance);
                break;
            case 2:
                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
                // è®¡é‡å®¤æ„è§
                breakdownMaintenance.setMaintenanceRecord(deviceBreakdownMaintenance.getMaintenanceRecord());
                breakdownMaintenance.setMaintenanceUser(deviceBreakdownMaintenance.getMaintenanceUser());
                breakdownMaintenance.setMaintenanceDate(deviceBreakdownMaintenance.getMaintenanceDate());
                breakdownMaintenance.setIsFinish(1);
                baseMapper.updateById(breakdownMaintenance);
                break;
        }
        return true;
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æ•…障维修
     * @param maintenanceId è®¾å¤‡æ•…障维修id
     * @param response å“åº”
     */
    @Override
    public void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response) {
        // æŸ¥è¯¢å¤–部设备申请
        DeviceBreakdownMaintenance deviceBreakdownMaintenance = baseMapper.selectById(maintenanceId);
        Device device = null;
        if (deviceBreakdownMaintenance.getDeviceId() != null) {
            device = deivceMapper.selectById(deviceBreakdownMaintenance.getDeviceId());
            device = device == null ? new Device() : device;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-breakdown-maintenance.docx");
        Configure configure = Configure.builder()
                .build();
        Device finalDevice = device;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceBreakdownMaintenance", deviceBreakdownMaintenance);
                    put("device", finalDevice);
                    // ç”³è¯·äººç­¾å
                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getApplicantUserId()));
                    // éƒ¨é—¨è´Ÿè´£äººç­¾å
                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getDepartmentHeadUserId()));
                }});
        try {
            response.setContentType("application/msword");
            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
            String fileName = URLEncoder.encode(
                    deviceName + "设备故障维修申请表", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DeviceInspectionRecordDetailsMapper;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:27:32
 */
@Service
public class DeviceInspectionRecordDetailsServiceImpl extends ServiceImpl<DeviceInspectionRecordDetailsMapper, DeviceInspectionRecordDetails> implements DeviceInspectionRecordDetailsService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.mapper.DeviceInspectionRecordMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
import com.ruoyi.device.service.DeviceInspectionRecordService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ç‚¹æ£€è®°å½•表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceInspectionRecordServiceImpl extends ServiceImpl<DeviceInspectionRecordMapper, DeviceInspectionRecord> implements DeviceInspectionRecordService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private DeviceMapper deviceMapper;
    @Resource
    private DeviceInspectionRecordDetailsService deviceInspectionRecordDetailsService;
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param page å½“前页码
     */
    @Override
    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecordDto) {
        IPage<DeviceInspectionRecord> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceInspectionRecordDto));
        return Result.success(iPage);
    }
    /**
     * æŸ¥è¯¢ç‚¹æ£€è¯¦æƒ…
     * @param inspectionRecordId
     * @return
     */
    @Override
    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(inspectionRecordId);
        DeviceInspectionRecordDto dto = new DeviceInspectionRecordDto();
        BeanUtils.copyProperties(deviceInspectionRecord, dto);
        List<DeviceInspectionRecordDetails> list = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, inspectionRecordId));
        dto.setDetails(list);
        return Result.success(dto);
    }
    /**
     * æ–°å¢žè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        deviceInspectionRecord.setRecorderId(userId);
        deviceInspectionRecord.setRecorder(user.getName());
        // æŸ¥è¯¢å¤æ ¸äººid
        if (deviceInspectionRecord.getReviewerId() != null) {
            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
            deviceInspectionRecord.setReviewer(reviewUser.getName());
        }
        this.saveOrUpdate(deviceInspectionRecord);
        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
            }
            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
        }
        return Result.success();
    }
    /**
     * ä¿®æ”¹è®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @Override
    public Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
        // æŸ¥è¯¢å¤æ ¸äººid
        if (deviceInspectionRecord.getReviewerId() != null) {
            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
            deviceInspectionRecord.setReviewer(reviewUser.getName());
        }
        this.saveOrUpdate(deviceInspectionRecord);
        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
            }
            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
        }
        return Result.success();
    }
    /**
     * åˆ é™¤è®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @Override
    public Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
        this.removeById(deviceInspectionRecord);
        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
        return Result.success();
    }
    /**
     * å¤æ ¸ç‚¹æ£€è®°å½•
     * @param dto
     * @return
     */
    @Override
    public Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto dto) {
        LambdaUpdateWrapper<DeviceInspectionRecord> wrapper = Wrappers.<DeviceInspectionRecord>lambdaUpdate()
                .eq(DeviceInspectionRecord::getInspectionRecordId, dto.getInspectionRecordId())
                .set(DeviceInspectionRecord::getStatus, dto.getStatus())
                .set(DeviceInspectionRecord::getReviewerRemark, dto.getReviewerRemark());
        // ä¸º0清除审核人
        if (dto.getStatus().equals(0)) {
            wrapper.set(DeviceInspectionRecord::getReviewerId, null)
                    .set(DeviceInspectionRecord::getReviewer, null);
        }
        this.update(wrapper);
        return Result.success();
    }
    /**
     * å¯¼å‡ºè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecordId è®¾å¤‡ç‚¹æ£€è®°å½•id
     * @param response                 å“åº”
     */
    @Override
    public Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response) {
        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(deviceInspectionRecordId);
        DeviceInspectionRecordDto deviceInspectionRecordDto = new DeviceInspectionRecordDto();
        BeanUtils.copyProperties(deviceInspectionRecord, deviceInspectionRecordDto);
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        deviceInspectionRecordDto.setTestDateString(deviceInspectionRecord.getTestDate() == null ? null : deviceInspectionRecord.getTestDate().format(dateFormatter));
        List<DeviceInspectionRecordDetails> deviceInspectionRecordDetailsList = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecordId));
        Integer deviceId = deviceInspectionRecord.getDeviceId();
        Device device = deviceMapper.selectById(deviceId);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-inspection-record.docx");
        Configure configure = Configure.builder()
                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceInspectionRecord", deviceInspectionRecordDto);
                    put("deviceInspectionRecordDetailsList", deviceInspectionRecordDetailsList);
                    put("device", device);
                    put("recorderUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getRecorderId()));
                    put("reviewerUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getReviewerId()));
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    device.getDeviceName() + "点检记录", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.device.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.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceInstructionDto;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.mapper.InstructionMapper;
import com.ruoyi.device.pojo.DeviceInstruction;
import com.ruoyi.device.service.DeviceInstructionService;
import com.ruoyi.device.service.DeviceOperationInstructionService;
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;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceInstructionServiceImpl extends ServiceImpl<InstructionMapper, DeviceInstruction> implements DeviceInstructionService {
    @Autowired
    private DeviceOperationInstructionService operationInstructionService;
    @Autowired
    private NumberGenerator<DeviceInstruction> numberGenerator;
    @Override
    public IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto) {
        return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
    }
    @Override
    public void newHomeworkGuidebookAdded(DeviceInstructionDto 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, DeviceInstruction::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());
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.mapper.OperationInstructionMapper;
import com.ruoyi.device.pojo.OperationInstruction;
import com.ruoyi.device.service.DeviceOperationInstructionService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
@Service
public class DeviceOperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements DeviceOperationInstructionService {
    @Override
    public List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId) {
        return baseMapper.homeworkGuidebookEditor(instructionId);
    }
}
cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.device.task;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.device.dto.DeviceRecordDto;
import com.ruoyi.device.mapper.DeviceRecordMapper;
import com.ruoyi.device.pojo.DeviceRecord;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * è®¾å¤‡ä½¿ç”¨è®°å½•提醒
 */
@Component
public class DeviceRecordSchedule {
    @Resource
    private DeviceRecordMapper deviceRecordMapper;
    @Resource
    private UserMapper userMapper;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    /**
     * æé†’填写设备使用记录
     */
//    @Scheduled(cron = "0/5 * * * * *")
    @Scheduled(cron = "0 0 9 * * 6") // æ¯å‘¨å…­æ‰§è¡Œä¸€æ¬¡
    public void task1() {
        // æŸ¥è¯¢æœªå¡«å†™çš„设备使用记录
        List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
        Map<Integer, List<DeviceRecordDto>> userPersonIdMap = deviceRecords.stream().collect(Collectors.groupingBy(DeviceRecord::getUsePersonId));
        userPersonIdMap.forEach((userId, recordList) -> {
            threadPoolTaskExecutor.execute(() -> {
                // ä¼ä¸šå¾®ä¿¡é€šçŸ¥å¡«å†™è®¾å¤‡ä½¿ç”¨è®°å½•
                User user = userMapper.selectById(userId);
                String message = "";
                message += "设备使用记录未填写提醒通知";
                for (DeviceRecordDto deviceRecord : recordList) {
                    message += "\n设备名称编号: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
                    message += "\n委托编号: " + deviceRecord.getSampleCode();
                    message += "\n";
                }
                message += "\n请去填写设备使用记录";
                //发送企业微信消息通知
                try {
                    WxCpUtils.inform(user.getAccount(), message, null);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        });
    }
}
cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
<?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.device.mapper.DeviceAccidentReportMapper">
    <!-- è®¾å¤‡äº‹æ•…报告列表 -->
    <select id="pageDeviceAccidentReport" resultType="com.ruoyi.device.pojo.DeviceAccidentReport">
        select * from (
        select *
        from device_accident_report
        order by create_time desc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectDeviceAccidentReportById" resultType="com.ruoyi.device.dto.DeviceAccidentReportDto">
        select
            d.*,
            date_format(d.accident_date,'%Y-%m-%d') accidentDateStr, -- æ—¶é—´
            date_format(d.report_date,'%Y-%m-%d') reportDateStr, -- æŠ¥å‘Šäººå¡«å†™æ—¶é—´
            date_format(d.assessor_date,'%Y-%m-%d') assessorDateStr, -- è¯„估人填写时间
            date_format(d.department_head_date,'%Y-%m-%d') departmentHeadDateStr, -- éƒ¨é—¨è´Ÿè´£äººå¡«å†™æ—¶é—´
            date_format(d.technical_director_date,'%Y-%m-%d') technicalDirectorDateStr, -- æŠ€æœ¯è´Ÿè´£äººå¡«å†™æ—¶é—´
            date_format(d.director_head_date,'%Y-%m-%d') directorHeadDateStr -- ä¸»ä»»å¡«å†™æ—¶é—´
        from device_accident_report d
        where d.accident_report_id = #{accidentReportId}
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
<?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.device.mapper.DeviceBreakdownMaintenanceMapper">
    <!--设备故障维修列表-->
    <select id="pageDeviceBreakdownMaintenance" resultType="com.ruoyi.device.dto.DeviceBreakdownMaintenance">
        select * from (
        select *
        from device_breakdown_maintenance
        order by create_time desc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<?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.device.mapper.DeviceInspectionRecordMapper">
    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceInspectionRecord">
        SELECT
            *
        from device_inspection_record
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/InstructionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?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.device.mapper.InstructionMapper">
    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.device.pojo.DeviceInstruction">
        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
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<?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.device.mapper.OperationInstructionMapper">
    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
        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>
ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.web;
import com.ruoyi.device.mqtt.MQClient;
import com.ruoyi.device.mqtt.MQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MqttApplicationRunner implements ApplicationRunner {
    @Autowired
    private MQConfig mqConfig;
    @Value("${mqtt.client}")
    private Boolean client;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        if (client) {
            MQClient mqttPushClient = new MQClient();
            mqttPushClient.connect(mqConfig);
        }
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -98,3 +98,16 @@
  custorder: http://192.168.20.47/PurchService.ashx?
  custorder-port: http://192.168.20.47:8008/PurchService.ashx?
  erp-services: http://192.168.20.47:8081
# å¤‡æ³¨ 18083密码:zttZTT123!@
mqtt:
  url: tcp://mqtt-ztt.zttiot.com:1883 # æœåС噍ip
  username: forwarder # MQTT-服务端-用户名,后期会修改为用户登录名
  password: ZTlink12345 # MQTT-服务端-密码,,后期会修改为用户登录密码
  timeout: 100 # è¶…æ—¶æ—¶é—´ ï¼ˆå•位:秒)
  keepalive: 60 # å¿ƒè·³ ï¼ˆå•位:秒)
  qos: 1 # å¿ƒè·³åŒ…级别
  completion-timeout: 3000 # è¿žæŽ¥è¶…时时间(单位:秒)
  clientId: javaPublish # clientId
  subscribe: /ztt/v3/2443521/publish # è®¢é˜…主题
  client: false # å¦‚果开发需要启动测试,需要改为false不然会一直报错