zhuo
2025-02-20 3cfdf020e7f3c5fcef3a4b48e8532704b5b8b83b
设备移植
已修改5个文件
已添加35个文件
3193 ■■■■■ 文件已修改
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/pom.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java 492 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java 861 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DataConfigMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceMapper.xml 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
@@ -139,7 +139,7 @@
                    }
                    return true;
                }).peek(standardProductList -> {
                    // todo: åˆ¤æ–­æ˜¯å¦æ˜¯åŽŸæä¸‹å•, éœ€è¦å•ŠæŠŠé¢œè‰²ç»‘å®šåˆ°è¯•æ ·é¢œè‰²çš„è¦æ±‚å€¼ä¸Š
                    //判断是否是原材下单, éœ€è¦å•ŠæŠŠé¢œè‰²ç»‘å®šåˆ°è¯•æ ·é¢œè‰²çš„è¦æ±‚å€¼ä¸Š
                    if (StringUtils.isNotBlank(insSample.getPartNo())) {
                        // åˆ¤æ–­æ˜¯å¦æœ‰è¿™ä¸ªå­—段且是文本类型
                        if (StringUtils.isNotBlank(standardProductList.getInspectionItem())
cnas-device/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cnas-device</artifactId>
    <dependencies>
        <!--业务模块-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>inspect-server</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DataConfigDto;
import com.ruoyi.device.dto.DeviceCollectionDto;
import com.ruoyi.device.dto.DeviceDto;
import com.ruoyi.device.pojo.DataConfig;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.service.DataConfigService;
import com.ruoyi.device.service.DeviceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * è®¾å¤‡(DeviceController)表控制层
 */
@Api(tags = "设备")
@RestController
@RequestMapping("/deviceScope")
public class DeviceController {
    @Resource
    private DeviceService deviceService;
    @Value("${file.path}")
    private String filePath;
    @Value("${wordUrl}")
    private String wordUrl;
    @Autowired
    private DataConfigService dataConfigService;
    @ApiOperation(value = "查看设备二维码按钮")
    @GetMapping("/showDeviceQrCodeButton")
    public void showDeviceQrCodeButton() { }
    //设备工具明细
    @ApiOperation(value = "查询设备详情列表")
    @GetMapping("/selectDeviceParameter")
    public Result selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull){
        return Result.success(deviceService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull));
    }
    @ApiOperation(value = "添加设备详情参数")
    @PostMapping("/addDeviceParameter")
    public Result addDeviceParameter(@RequestBody Device itemParameter) {
        return Result.success(deviceService.addDeviceParameter(itemParameter));
    }
    @ApiOperation(value = "删除设备详情参数")
    @DeleteMapping("/delDeviceParameter")
    public Result<?> delDeviceParameter(Integer id) {
        return Result.success(deviceService.delDeviceParameter(id));
    }
    @ApiOperation(value = "修改设备详情参数")
    @PostMapping("/upDeviceParameter")
    public Result<?> upDeviceParameter(@RequestBody Device itemParameter) {
        return Result.success(deviceService.upDeviceParameter(itemParameter));
    }
    @ApiOperation(value = "获取设备总览")
    @GetMapping("/selectEquipmentOverview")
    public Result selectEquipmentOverview() {
        return Result.success(deviceService.selectEquipmentOverview());
    }
    @ApiOperation(value = "获取被授权人")
    @GetMapping("/authorizedPerson")
    public Result authorizedPerson() {
        return Result.success(deviceService.authorizedPerson());
    }
    @ApiOperation(value = "搜索")
    @GetMapping("/search")
    public Result search(Integer status, String deviceName, String specificationModel, String largeCategory) {
        return Result.success(deviceService.search(status, deviceName, specificationModel, largeCategory));
    }
    //图片上传
    @ApiOperation(value = "设备文件上传")
    @PostMapping("/uploadFile")
    public Result uploadFile(MultipartFile file) {
        String urlString;
        String pathName;
        String filename = file.getOriginalFilename();
        String path;
        try {
            String contentType = file.getContentType();
            if (contentType != null && contentType.startsWith("image/")) {
                // æ˜¯å›¾ç‰‡
                path = filePath;
            } else {
                // æ˜¯æ–‡ä»¶
                path = wordUrl;
            }
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "-" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            HashMap<String, String> map = new HashMap<>();
            map.put("name", filename);
            map.put("url", pathName);
            return Result.success(map);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("文件上传错误");
            return null;
        }
    }
    @ApiOperation(value = "获取设备负责人")
    @GetMapping("/selectDevicePrincipal")
    public Result selectDevicePrincipal() {
        return Result.success(deviceService.selectDevicePrincipal());
    }
    @ApiOperation(value = "通过项目获取设备列表")
    @GetMapping("/selectDeviceByCategory")
    public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory) {
        return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,laboratory));
    }
    @ApiOperation(value = "通过设备编号获取设备列表")
    @GetMapping("/selectDeviceByCode")
    public Result<DeviceDto> selectDeviceByCode(Integer id) {
        return Result.success(deviceService.selectDeviceByCode(id));
    }
    @ApiOperation("/数采-数据采集")
    @PostMapping("/dataCollection")
    public Result<?> dataAcquisition(HttpServletRequest request,@RequestBody DeviceCollectionDto dto) {
        return deviceService.dataAcquisition(request, dto);
    }
    @ApiOperation(value = "维护数采配置")
    @PostMapping("/saveDataAcquisitionConfiguration")
    public Result<?> saveDataAcquisitionConfiguration(@RequestParam(value = "deviceId") Integer deviceId, @RequestBody DataConfigDto dataConfigList) {
        dataConfigService.saveDataAcquisitionConfiguration(deviceId, dataConfigList);
        return Result.success();
    }
    @ApiOperation(value = "查询数采配置")
    @GetMapping("/queryDataAcquisitionConfiguration")
    public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) {
        return dataConfigService.queryDataAcquisitionConfiguration(dataConfig);
    }
    @ApiOperation(value = "删除数采配置")
    @DeleteMapping("/deleteDataAcquisitionConfiguration")
    public Result<?> deleteDataAcquisitionConfiguration(@RequestParam("ids") String ids) {
        List<String> split = Arrays.asList(ids.split(","));
        List<String> collect = split.stream().distinct().collect(Collectors.toList());
        dataConfigService.removeBatchByIds(collect);
        return Result.success();
    }
    @ApiOperation(value = "左侧设备树形栏")
    @GetMapping("/treeDevice")
    public Result treeDevice(String deviceName) {
        return Result.success(deviceService.treeDevice(deviceName));
    }
    @ApiOperation(value = "设备档案导出")
    @GetMapping("/exportDeviceFile")
    public void exportDeviceFile(@RequestParam Integer deviceId, HttpServletResponse response) throws Exception {
        deviceService.exportDeviceFile(deviceId,response);
    }
    @ApiOperation(value = "仪器设备一览表导出")
    @GetMapping("/exportEquipmentDetails")
    public void exportEquipmentDetails(HttpServletResponse response) throws Exception {
        deviceService.exportEquipmentDetails(response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DataConfig;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class DataConfigDto {
    private List<DataConfig> dataConfigList;
    private Boolean isDevice;
    @ApiModelProperty("文件后缀")
    private String fileType;
    @ApiModelProperty("采集地址")
    private String collectUrl;
    @ApiModelProperty("存储地址")
    private String storageUrl;
    @ApiModelProperty("设备IP")
    private String ip;
    @ApiModelProperty("数采-委托字段")
    private String entrustCode;
    @ApiModelProperty("数采-样品字段")
    private String sampleCode;
    @ApiModelProperty("数采-db,mdb文件名称")
    private String dbFileName;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.device.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * è®¾å¤‡é‡‡é›†å¯¹è±¡
 *
 * @Author zhuo
 * @Date 2024/12/3
 */
@Data
public class DeviceCollectionDto {
    @ApiModelProperty(value = "样品id")
    private Integer id;
    @ApiModelProperty(value = "订单编号")
    private String entrustCode;
    @ApiModelProperty(value = "样品编号")
    private String sampleCode;
    @ApiModelProperty(value = "采集的检验项id")
    private List<Integer> itemIds;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.ruoyi.device.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceConfigDtoPage{
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "文件后缀")
    private String fileType;
    @ApiModelProperty(value = "采集地址")
    private String collectUrl;
    @ApiModelProperty(value = "存储地址")
    private String storageUrl;
    @ApiModelProperty(value = "IP地址")
    private String ip;
    @ApiModelProperty(value = "检验项分类")
    private String inspectionItemClass;
    @ApiModelProperty(value = "检验项")
    private String inspectionItem;
    @ApiModelProperty(value = "检验项子项")
    private String inspectionItemSubclass;
    @ApiModelProperty(value = "公式")
    private String formula;
    @ApiModelProperty(value = "参照X")
    private String referx;
    @ApiModelProperty(value = "X")
    private String x;
    @ApiModelProperty(value = "参照Y")
    private String refery;
    @ApiModelProperty(value = "Y")
    private String y;
    @ApiModelProperty(value = "别名")
    private String anotherName;
    @ApiModelProperty(value = "匹配名称")
    private String matchingName;
    private Integer id;
    @ApiModelProperty(value = "检验对象")
    private String sample;
    @ApiModelProperty(value = "检验项目id")
    private Integer structureItemParameterId;
    @ApiModelProperty("数采-委托字段")
    private String entrustCode;
    @ApiModelProperty("数采-样品字段")
    private String sampleCode;
    @ApiModelProperty("数采-db,mdb文件名称")
    private String dbFileName;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.device.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.device.pojo.Device;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeviceDto extends Device {
    @ApiModelProperty(value = "管理人")
    private String equipmentManagerUser;
    @ApiModelProperty(value = "所属部门")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String laboratoryName;
    @ApiModelProperty(value = "检验项目")
    private String insProductItem;
    @ApiModelProperty(value = "管理人姓名")
    private String equipmentManagerName;
    @ApiModelProperty(value = "被授权人姓名")
    private String authorizedPersonName;
    @ApiModelProperty(value = "核准证书编号")
    private String calibrateNo;
    @ApiModelProperty(value = "最近校准日期")
    private LocalDateTime lastCalibrationDateTwo;
    @ApiModelProperty(value = "下次校准日期")
    private LocalDateTime nextCalibrationDateTwo;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.Device;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-10 æ˜ŸæœŸäºŒ 15:55:29
 * Description:
 */
@Data
public class DeviceExport extends Device {
    @ApiModelProperty("管理人")
    private String equipmentManagerName;
    @ApiModelProperty("序号")
    private Integer index;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.device.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-13 æ˜ŸæœŸäº” 10:43:06
 * Description: ä»ªå™¨è®¾å¤‡æ¡£æ¡ˆå¡ä¸­æ˜¾ç¤ºçš„设备校准记录和维护记录的列表对象
 */
@Data
public class DeviceMetricRecordAndMaintenanceDto {
    @ApiModelProperty("序号")
    private Integer index;
    // æ ¡å‡†è¡¨ä¸­çš„æ•°æ®
    @ApiModelProperty("校准日期")
    private String calibrationDateString;
    @ApiModelProperty("证书标号")
    private String certificateNumber;
    @ApiModelProperty("校准有效日期")
    private String validityDateString;
    @ApiModelProperty("判定")
    private String judgement;
    // ç»´ä¿®è®°å½•表中的数据
    @ApiModelProperty("维修日期")
    private String maintenanceDateString;
    @ApiModelProperty("处理方式")
    private String handlingMethod;
    @ApiModelProperty("备注")
    private String comments;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.device.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-13 æ˜ŸæœŸäº” 8:45:34
 * Description: ç”¨äºŽä»ªå™¨è®¾å¤‡æ¡£æ¡ˆå¡çš„导出
 */
@Data
public class DocumentExportWordDto {
    // è®¾å¤‡æ¡£æ¡ˆå·¦åˆ—表
    @ApiModelProperty("序号")
    private Integer index1;
    @ApiModelProperty("档案名称")
    private String name1;
    @ApiModelProperty("份数")
    private Integer quantity1;
    @ApiModelProperty("页码")
    private Integer pageCount1;
    @ApiModelProperty("归档日期")
    private String archiveDateString1;
    // è®¾å¤‡æ¡£æ¡ˆå³åˆ—表
    @ApiModelProperty("序号")
    private Integer index2;
    @ApiModelProperty("档案名称")
    private String name2;
    @ApiModelProperty("份数")
    private Integer quantity2;
    @ApiModelProperty("页码")
    private Integer pageCount2;
    @ApiModelProperty("归档日期")
    private String archiveDateString2;
}
cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.device.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class DeviceMaintenanceExport {
    @ColumnWidth(20)
    @ExcelProperty("设备名称")
    private String deviceName;
    @ColumnWidth(20)
    @ExcelProperty("流程编号")
    private String deviceNumber;
    @ColumnWidth(20)
    @ExcelProperty("管理编号")
    private String managementNumber;
    @ColumnWidth(50)
    @ExcelProperty("维护内容")
    private String content;
    @ColumnWidth(20)
    @ExcelProperty("维护时间")
    private String date;
    @ColumnWidth(20)
    @ExcelProperty("下次维护时间")
    private String nextDate;
    @ColumnWidth(20)
    @ExcelProperty("维护类型")
    private String maintenanceType;
    @ColumnWidth(20)
    @ExcelProperty("维护人")
    private String name;
    @ColumnWidth(50)
    @ExcelProperty("备注")
    private String comments;
}
cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.CollectBridge;
/**
 * æ•°å­—电桥采集
 *
 * @author zhuo
 * @since 2025-02-19
 */
public interface CollectBridgeMapper extends BaseMapper<CollectBridge> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.dto.DeviceConfigDtoPage;
import com.ruoyi.device.pojo.DataConfig;
import java.util.List;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-13 12:23:00
 */
public interface DataConfigMapper extends BaseMapper<DataConfig> {
    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
    List<Integer> deleteDataConfig();
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.excel.DeviceMaintenanceExport;
import com.ruoyi.device.pojo.DeviceMaintenance;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * è®¾å¤‡ç»´æŠ¤ä¿å…»
 */
@Mapper
public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> {
    List<DeviceMaintenance> getDeviceMaintenanceParam();
    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
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.DeviceDto;
import com.ruoyi.device.pojo.Device;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * è®¾å¤‡(Device)表数据库访问层
 */
public interface DeviceMapper extends BaseMapper<Device> {
    IPage<Device> selectDeviceParameter(Page page, QueryWrapper<Device> ew);
    List<Device> selectEquipmentOverview(Page page, QueryWrapper<Device> ew);
    //获取被授权人
    List<Device> authorizedPerson();
    //查询
    List<Device> search(@Param(value = "status") Integer status, @Param(value = "deviceName") String deviceName,
                        @Param(value = "specificationModel") String specificationModel, @Param(value = "largeCategory") String largeCategory);
    //获取图片数据
    void selectDeviceImage(@Param(value = "name") String name ,@Param(value = "id") Integer id);
    //查询设备负责人
    List<Device> selectDevicePrincipal();
    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers, @Param("laboratoryNameIsNull") Boolean laboratoryNameIsNull);
    List<Map<String, Object>> getInspectionItemSubclass(@Param("id") Integer id);
    List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName);
    DeviceDto selectDeviceByCode(Integer id);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.DeviceMetricRecord;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:01
 */
public interface DeviceMetricRecordMapper extends BaseMapper<DeviceMetricRecord> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.Document;
import org.apache.ibatis.annotations.Mapper;
/**
 * è®¾å¤‡æ¡£æ¡ˆ
 */
@Mapper
public interface DocumentMapper extends BaseMapper<Document> {
}
cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * æ•°å­—电桥采集
 *
 * @author zhuo
 * @since 2025-02-19
 */
@Data
@TableName("collect_bridge")
public class CollectBridge {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("委托编号")
    private String entrustCode;
    @ApiModelProperty("采集值")
    private String collectValue;
    @ApiModelProperty("时间")
    private LocalDateTime collectDate;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-13 12:23:00
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("device_data_config")
@ApiModel(value = "DataConfig对象", description = "")
public class DataConfig implements Serializable {
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("公式")
    private String formula;
    @ApiModelProperty("参照X")
    private String referx;
    @ApiModelProperty("参照Y")
    private String refery;
    @ApiModelProperty("x")
    private String x;
    @ApiModelProperty("y")
    private String y;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("检验项分类")
    private String inspectionItemClass;
    @ApiModelProperty("检验项目")
    private String inspectionItem;
    @ApiModelProperty("检验项子项")
    private String inspectionItemSubclass;
    @TableField(exist = false)
    @ApiModelProperty("检验项子项")
    private String insProductItem;
    @ApiModelProperty("检验项id")
    private Integer structureItemParameterId;
    @ApiModelProperty("序号")
    private String serialNumber;
    @ApiModelProperty("别名")
    private String anotherName;
    @ApiModelProperty("匹配名称")
    private String matchingName;
    @TableField(select = false, exist = false)
    private Boolean isDevice;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * è®¾å¤‡(Device)表对象
 */
@TableName(value = "device")
@Data
public class Device implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty(value = "en设备名称")
    private String enDeviceName;
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    @ApiModelProperty(value = "生产厂家")
    private String manufacturer;
    @ApiModelProperty(value = "出厂编号")
    private String factoryNo;
    @ApiModelProperty(value = "管理编号")
    private String managementNumber;
    @ApiModelProperty(value = "技术指标")
    private String technicalIndicators;
    @ApiModelProperty(value = "购置日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime acquisitionDate;
    @ApiModelProperty(value = "校准有效日期")
    private LocalDateTime activationDate;
    @ApiModelProperty(value = "管理人Id")
    private Integer equipmentManager;
    @ApiModelProperty(value = "存放点")
    private String storagePoint;
    @ApiModelProperty(value = "所属部门Id")
    private Integer subordinateDepartmentsId;
    @ApiModelProperty(value = "检验项目Id")
    private String insProductIds;
    @ApiModelProperty(value = "校准服务机构")
    private String calibrationServices;
    @ApiModelProperty(value = "最近校准日期")
    private LocalDateTime lastCalibrationDate;
    @ApiModelProperty(value = "下次校准日期")
    private LocalDateTime nextCalibrationDate;
    @ApiModelProperty(value = "设备类型")
    private String largeCategory;
    @ApiModelProperty(value = "单价")
    private BigDecimal unitPrice;
    @ApiModelProperty(value = "设备状态")
    private Integer deviceStatus;
    @ApiModelProperty(value = "校准周期(月)")
    private String calibrationDate;
    @ApiModelProperty(value = "图片上传")
    private String imageUpload;
    @ApiModelProperty(value = "图片备注")
    private String imageName;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("数采-文件后缀")
    private String fileType;
    @ApiModelProperty("数采-采集地址")
    private String collectUrl;
    @ApiModelProperty("数采-存储地址")
    private String storageUrl;
    @ApiModelProperty("数采-设备IP")
    private String ip;
    @ApiModelProperty("数采-是否为数采设备")
    @TableField(exist = false)
    private Boolean isItADataAcquisitionDevice;
    @ApiModelProperty("数采-委托字段")
    private String entrustCode;
    @ApiModelProperty("数采-样品字段")
    private String sampleCode;
    @ApiModelProperty("数采-db,mdb文件名称")
    private String dbFileName;
    @ApiModelProperty("被授权人")
    private String authorizedPerson;
    @ApiModelProperty("资产编码")
    private String assetCode;
    @ApiModelProperty("产地")
    private String origin;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
/**
 * è®¾å¤‡ç»´æŠ¤ä¿å…»
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("device_maintenance")
public class DeviceMaintenance {
    //设备id
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer deviceId;
    private String deviceName;
    //编号
    private String deviceNumber;
    //统一编号
    private String managementNumber;
    //维护内容
    private String content;
    //维护日期
    @TableField(fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;
    //下次维护日期
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate nextDate;
    //维护类型
    private Integer maintenanceType;
    //维护人员
    private String name;
    //备注
    private String comments;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
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;
import java.util.Date;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½•
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:01
 */
@Getter
@Setter
@TableName("device_metric_record")
@ApiModel(value = "DeviceMetricRecord对象", description = "设备校准 - æ ¡å‡†è®°å½•")
public class DeviceMetricRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("记录编号")
    private String processNumber;
    @ApiModelProperty("计量单位")
    private String unitOfMeasure;
    @ApiModelProperty("校准日期")
    private Date calibrationDate;
    @ApiModelProperty("下次校准日期")
    private Date nextCalibrationDate;
    @ApiModelProperty("计算器具")
    private String calculatingApparatus;
    @ApiModelProperty("计算标准量程")
    private String standardRange;
    @ApiModelProperty("计量标准不确定度")
    private String calibrationStandardUncertainty;
    @ApiModelProperty("依据文件")
    private String byDocument;
    @ApiModelProperty("证书编号")
    private String certificateSerialNumber;
    @ApiModelProperty("状态")
    private String status;
    @ApiModelProperty("原文件名称")
    private String fileName;
    @ApiModelProperty("系统生成文件名称")
    private String systemFileName;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("创建时间 / ç™»è®°æ—¥æœŸ")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("登记人")
    private String createUser;
    @ApiModelProperty("calibrate:校准;examine:核查")
    private String type;
    @ApiModelProperty("确认时间")
    private Date confirmDate;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * è®¾å¤‡æ¡£æ¡ˆ
 */
@Data
@TableName(value = "device_documents")
public class Document implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * æ–‡æ¡£ç±»åž‹ï¼ˆæžšä¸¾ï¼‰
     */
    private String documentType;
    /**
     * åç§°
     */
    private String name;
    /**
     * ç‰ˆæœ¬å·
     */
    private String version;
    /**
     * æ•°é‡
     */
    private Integer quantity;
    /**
     * é¡µæ•°
     */
    private Integer pageCount;
    /**
     * æä¾›å•†
     */
    private String provider;
    /**
     * æä¾›æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime provideDate;
    /**
     * å¤‡æ³¨
     */
    private String comments;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime createdAt;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    private int deviceId;
    @ApiModelProperty("资产编号")
    private String number;
    @ApiModelProperty("原始文件名称")
    private String systemFileName;
    @ApiModelProperty("系统生成文件名称")
    private String fileName;
}
cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DataConfigDto;
import com.ruoyi.device.pojo.DataConfig;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-13 12:23:00
 */
public interface DataConfigService extends IService<DataConfig> {
    void deleteDataConfig();
    void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList);
    Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
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.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.device.dto.DeviceCollectionDto;
import com.ruoyi.device.dto.DeviceDto;
import com.ruoyi.device.pojo.Device;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * è®¾å¤‡(Device)表服务接口
 */
public interface DeviceService extends IService<Device> {
    IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull);
    int addDeviceParameter(Device itemParameter);
    int delDeviceParameter(Integer id);
    int upDeviceParameter(Device itemParameter);
    List<Device> selectEquipmentOverview();
    List<Device> authorizedPerson();
    List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory);
    List<Device> selectDevicePrincipal();
    List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory);
    DeviceDto selectDeviceByCode(Integer id);
    Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto);
    List<Map<String, Object>> treeDevice(String deviceName);
    /**
     * å¯¼å‡ºè®¾å¤‡åˆ—表
     * @param deviceId
     * @param response
     */
    void exportDeviceFile(Integer deviceId, HttpServletResponse response);
    /**
     * å¯¼å‡ºè®¾å¤‡å·¥å…·æ˜Žç»†
     * @param response
     */
    void exportEquipmentDetails(HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.Document;
/**
 * è®¾å¤‡æ¡£æ¡ˆ
 */
public interface DocumentService extends IService<Document> {
}
cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.device.pojo.DeviceMetricRecord;
import org.springframework.ui.Model;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;
public interface QrShowService {
    /**
     * è®¡ç®—启用时长
     * @param activationDate
     * @return
     */
    double calcUsedYears(LocalDateTime activationDate);
    /**
     * è®¡ç®—距离下次校准日期的天数百分比
     * @param startDate
     * @param endDate
     * @return
     */
    double calcDeviceNextCheckRatio(Date startDate, Date endDate);
    /**
     * æŸ¥è¯¢è®¾å¤‡æ ¡å‡†/核查记录
     * @param deviceId
     * @param type
     * @return
     */
    DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type);
    /**
     * æ ¼å¼åŒ–日期
     * @return
     */
    String formatDate(Date date,String formatter);
    /**
     * æ ¼å¼åŒ–日期
     * @return
     */
    String formatDate(LocalDate date, String formatter);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.common.core.domain.Result;
import com.ruoyi.device.dto.DataConfigDto;
import com.ruoyi.device.mapper.DataConfigMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.DataConfig;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.service.DataConfigService;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-13 12:23:00
 */
@Service
@AllArgsConstructor
public class DataConfigServiceImpl extends ServiceImpl<DataConfigMapper, DataConfig> implements DataConfigService {
    private DeviceMapper deviceMapper;
    private DataConfigMapper dataConfigMapper;
    @Override
    public void deleteDataConfig() {
        List<Integer> integers = dataConfigMapper.deleteDataConfig();
        if (!integers.isEmpty()) {
            dataConfigMapper.deleteBatchIds(integers);
        }
    }
    @Override
    public void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList) {
        if (dataConfigList.getIsDevice()) {
            Device device = new Device();
            BeanUtils.copyProperties(dataConfigList, device);
            device.setId(deviceId);
            deviceMapper.updateById(device);
        } else {
            this.saveOrUpdateBatch(dataConfigList.getDataConfigList());
        }
    }
    @Override
    public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) {
        if (dataConfig.getIsDevice()) {
            LambdaQueryWrapper<DataConfig> wrapper = Wrappers.<DataConfig>lambdaQuery()
                    .eq(DataConfig::getDeviceId, dataConfig.getDeviceId())
                    .eq(DataConfig::getInspectionItem, dataConfig.getInspectionItem())
                    .eq(DataConfig::getInspectionItemSubclass, dataConfig.getInspectionItemSubclass());
            if (StringUtils.isNotBlank(dataConfig.getInspectionItemClass())) {
                wrapper.eq(DataConfig::getInspectionItemClass, dataConfig.getInspectionItemClass());
            }
            if (dataConfig.getStructureItemParameterId() != null) {
                wrapper.eq(DataConfig::getStructureItemParameterId, dataConfig.getStructureItemParameterId());
            }
            List<DataConfig> list = baseMapper.selectList(wrapper);
            return Result.success(list);
        } else {
            return Result.success(dataConfigMapper.selectDataConfigList(dataConfig.getDeviceId()));
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,492 @@
package com.ruoyi.device.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.device.dto.*;
import com.ruoyi.device.mapper.CollectBridgeMapper;
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
import com.ruoyi.device.pojo.*;
import com.ruoyi.device.service.DataConfigService;
import com.ruoyi.device.service.DeviceService;
import com.ruoyi.device.service.DocumentService;
import com.ruoyi.device.utils.DataAcquisition;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
 * è®¾å¤‡(Device)表服务实现类
 */
@Service
@AllArgsConstructor
public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService {
    private DeviceMapper deviceMapper;
    private UserMapper userMapper;
    private StructureItemParameterMapper structureItemParameterMapper;
    private DataConfigService dataConfigService;
    private QrShowServiceImpl qrShowService;
    private InsSampleMapper insSampleMapper;
    private DocumentService documentService;
    private DeviceMetricRecordMapper deviceMetricRecordMapper;
    private DeviceMaintenanceMapper deviceMaintenanceMapper;
    private CollectBridgeMapper collectBridgeMapper;
    @Override
    public IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) {
        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
        return iPage;
    }
    @Override
    public int addDeviceParameter(Device itemParameter) {
        return deviceMapper.insert(itemParameter);
    }
    @Override
    public int delDeviceParameter(Integer id) {
        return deviceMapper.deleteById(id);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int upDeviceParameter(Device itemParameter) {
        // åˆ é™¤æ•°é‡‡é›†é…ç½®æ•°æ®
        dataConfigService.deleteDataConfig();
        // éœ€è¦åŒæ—¶æ›´æ”¹ device表
        return deviceMapper.updateById(itemParameter);
    }
    @Override
    public List<Device> selectEquipmentOverview() {
        return deviceMapper.selectEquipmentOverview(new Page(1, 10), QueryWrappers.queryWrappers(new Device()));
    }
    @Override
    public List<Device> authorizedPerson() {
        return deviceMapper.authorizedPerson();
    }
    @Override
    public List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory) {
        return deviceMapper.search(status, deviceName, specificationModel, largeCategory);
    }
    @Override
    public List<Device> selectDevicePrincipal() {
        return deviceMapper.selectDevicePrincipal();
    }
    @Override
    public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) {
        List<Integer> id;
        try {
            id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
                    .eq(StructureItemParameter::getInspectionItem, inspectionItem)
                    .eq(ObjectUtils.isNotEmpty(inspectionItemSubclass), StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
                    .eq(ObjectUtils.isNotEmpty(laboratory), StructureItemParameter::getLaboratory, laboratory)
                    .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
        } catch (Exception e) {
            return null;
        }
        List<Device> devices = deviceMapper.selectList(Wrappers.<Device>lambdaQuery()
                .eq(Device::getDeviceStatus, 0)
                .isNotNull(Device::getInsProductIds));
        List<Device> devices2 = new ArrayList<>();
        for (Device device : devices) {
            String[] ids = device.getInsProductIds().split(",");
            for (String i : ids) {
                if (ObjectUtils.isNotEmpty(i)) {
                    if (id.contains(Integer.parseInt(i))) {
                        devices2.add(device);
                        break;
                    }
                }
            }
        }
        return devices2;
    }
    @Override
    public DeviceDto selectDeviceByCode(Integer id) {
        DeviceDto deviceDto = deviceMapper.selectDeviceByCode(id);
        List<Integer> ids = new ArrayList<>();
        if (Strings.isNotEmpty(deviceDto.getAuthorizedPerson())) {
            if (deviceDto.getAuthorizedPerson().equals("null")) {
                deviceDto.setAuthorizedPerson("[]");
            }
            ids = JSON.parseArray(deviceDto.getAuthorizedPerson(), Integer.class);
        }
        String name = "";
        if (!ids.isEmpty()) {
            name = userMapper.selectBatchIds(ids).stream().map(User::getName).collect(Collectors.joining(","));
        }
        deviceDto.setAuthorizedPersonName(name);
        //查询设备校准信息
        DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(id, "calibrate");
        deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber());
        // åˆ°äº†åœç”¨æ—¥æœŸï¼Œè‡ªåŠ¨å°†çŠ¶æ€æ”¹ä¸ºåœç”¨
        if (deviceDto.getNextCalibrationDate() != null) {
            if (LocalDateTime.now().isAfter(deviceDto.getNextCalibrationDate())) {
                // todo: è®¾å¤‡è¿è¡ŒçŠ¶æ€å­—å…¸
//                List<Enums> enums = enumService.selectEnumByCategory("设备状态");
//                List<Enums> status = enums.stream().filter(item -> item.getLabel().equals("停用")).collect(Collectors.toList());
//                deviceDto.setDeviceStatus(Integer.parseInt(status.get(0).getValue()));
                deviceMapper.updateById(deviceDto);
            }
        }
        return deviceDto;
    }
    @Override
    public Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto) {
        // æŸ¥è¯¢æ£€éªŒé¡¹
        List<Integer> itemIds = dto.getItemIds();
        if (CollectionUtils.isEmpty(itemIds)) {
            throw new ErrorException("没有需要数采的检验项");
        }
        List<InsProduct> insProducts = insSampleMapper.selectProductResult(itemIds);
        // æŸ¥è¯¢æ£€éªŒé¡¹ç»‘定的id
        List<Integer> itemParameterIds = insProducts.stream().map(InsProduct::getStructureItemParameterId).collect(Collectors.toList());
        Set<String> deviceCodeSet = new LinkedHashSet<>();
        for (InsProduct product : insProducts) {
            // æŸ¥è¯¢è®¾å¤‡
            // æ·»åŠ è®¾å¤‡ç¼–å·
            if (product.getInsProductResult() != null) {
                List<JSONObject> jsonObjects = JSON.parseArray(product.getInsProductResult().getEquipValue(), JSONObject.class);
                for (JSONObject jsonObject : jsonObjects) {
                    if (!"".equals(jsonObject.get("v") + "")) {
                        List<String> v = StrUtil.split(jsonObject.get("v") + "", ",");
                        deviceCodeSet.addAll(v);
                    }
                }
            }
        }
        if (CollectionUtils.isEmpty(deviceCodeSet)) {
            throw new ErrorException("未选择设备信息");
        }
        // èŽ·å–è®¾å¤‡é›†åˆ
        List<Device> deviceList = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
                .in(Device::getManagementNumber, deviceCodeSet)
                .isNotNull(Device::getIp)
                .ne(Device::getIp, ""));
        if (CollectionUtils.isEmpty(deviceList)) {
            throw new ErrorException("无设备配置采集绑定信息");
        }
        // æ•°é‡‡è¿”回信息
        Map<String, Object> map = new HashMap<>();
        for (Device device : deviceList) {
            String ip = device.getIp();
            // æ ¹æ®æ£€éªŒé¡¹èŽ·å–config
            List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
                    .in(DataConfig::getStructureItemParameterId, itemParameterIds)
                    .eq(DataConfig::getDeviceId, device.getId()));
            // èŽ·å–è®¾å¤‡é…ç½®ç±»
            // åˆ¤æ–­è®¾å¤‡æ˜¯å¦æ˜¯æ•°å­—ç›´æ¡¥
            if (device.getManagementNumber().equals("JCZX-ZB-ER02022")) {
                map.putAll(dataCollectBridge(list, device, dto.getEntrustCode()));
            } else {
                map.putAll(DataAcquisition.dataAcquisitionEntrance(list, device, dto.getEntrustCode(), dto.getEntrustCode(), ip, insProducts.get(0).getCableTag()));
            }
        }
        // 4、造循环次数,参与公式计算
        if (ObjectUtils.isNotEmpty(map)) {
            Map<String, Object> frequency = DataAcquisition.createFrequency(dto.getEntrustCode(), dto.getEntrustCode(), map);
            return Result.success(frequency);
        } else {
            return Result.success(null);
        }
    }
    /**
     * èŽ·å–æ•°å­—ç›´æ¡¥æ£€æµ‹ä¿¡æ¯
     * @return
     */
    public Map<String, ?> dataCollectBridge(List<DataConfig> dataConfig, Device device, String entrustCode) {
        // æ‹¼æŽ¥åå­—
        Map<String, List<DataConfig>> userMap = dataConfig.stream()
                .peek(i -> {
                    String itemName = i.getInspectionItem();
                    if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
                        itemName += "@" + i.getInspectionItemClass();
                    }
                    String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
                    // æ·»åŠ æ£€éªŒé¡¹åç§°
                    i.setInsProductItem(name);
                })
                .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
        Map<String, Object> map = new HashMap<>();
        userMap.forEach((k, v) -> {
            List<String> resultValue = new ArrayList<>();
            // æŸ¥è¯¢ç›´æ¡¥ç”µæµç”µé˜»æ•°é‡‡å€¼
            List<CollectBridge> collectBridges = collectBridgeMapper.selectList(Wrappers.<CollectBridge>lambdaQuery()
                    .like(CollectBridge::getEntrustCode, entrustCode)
                    .orderByAsc(CollectBridge::getCollectDate));
            resultValue = collectBridges.stream().map(CollectBridge::getCollectValue).collect(Collectors.toList());
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("equipName", device.getDeviceName());
            hashMap.put("equipValue", device.getManagementNumber());
            hashMap.put("result", resultValue);
            map.put(k, hashMap);
        });
        return map;
    }
    @Override
    public List<Map<String, Object>> treeDevice(String deviceName) {
        List<Map<String, Object>> listMap = deviceMapper.treeDevice(deviceName);
        return listMap;
    }
    @Override
    public void exportDeviceFile(Integer deviceId, HttpServletResponse response) {
        // è®¾å¤‡ä¿¡æ¯
        Device device = baseMapper.selectById(deviceId);
        // è®¾å¤‡æ¡£æ¡ˆ
        List<Document> documentList = documentService.list(Wrappers.<Document>lambdaQuery().eq(Document::getDeviceId, deviceId));
        // è®¾å¤‡æ ¡å‡†è¡¨
        List<DeviceMetricRecord> deviceMetricRecordList = deviceMetricRecordMapper.selectList(Wrappers.<DeviceMetricRecord>lambdaQuery().eq(DeviceMetricRecord::getDeviceId, deviceId));
        // è®¾å¤‡ç»´ä¿®è¡¨
        List<DeviceMaintenance> deviceMaintenanceList = deviceMaintenanceMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery().eq(DeviceMaintenance::getDeviceId, deviceId));
        // è¿”回给word的数据列表 åˆ†ä¸ºå·¦å³ä¸¤åˆ—数据
        List<DocumentExportWordDto> documentExportWordDtoList = new ArrayList<>();
        // ç»™æ¡£æ¡ˆåŠ åºå· å¹¶å·¦å³åˆ†ä¸ºå·¦å³ä¸¤åˆ—在word中显示
        extracted(documentList, documentExportWordDtoList);
        // å°†æ ¡å‡†è¡¨å’Œç»´ä¿®è¡¨æ”¾å…¥ä¸€ä¸ªå¯¹è±¡ä¸­æ–¹ä¾¿word表格中显示
        List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = getDeviceMetricRecordAndMaintenanceDtoList(deviceMetricRecordList, deviceMaintenanceList);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-document.docx");
        Configure configure = Configure.builder()
                .bind("document", new HackLoopTableRenderPolicy())
                .bind("deviceMetricRecordAndMaintenanceDtoList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("device", device);
                    put("document", documentExportWordDtoList); // æ¡£æ¡ˆ
                    put("deviceMetricRecordAndMaintenanceDtoList", deviceMetricRecordAndMaintenanceDtoList); // æ ¡å‡†è¡¨ å’Œ ç»´ä¿®è¡¨
                }});
        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("导出失败");
        }
    }
    private List<DeviceMetricRecordAndMaintenanceDto> getDeviceMetricRecordAndMaintenanceDtoList(List<DeviceMetricRecord> deviceMetricRecordList, List<DeviceMaintenance> deviceMaintenanceList) {
        // è®¾å¤‡æ ¡å‡†è¡¨å’Œè®¾å¤‡ç»´ä¿®è¡¨çš„集合
        List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = new ArrayList<>();
        // è®¾å¤‡æ ¡å‡†è¡¨å’Œè®¾å¤‡ç»´ä¿®è¡¨çš„长度可能不一样 å–最大值 ä¸å¤Ÿçš„用空数据填充
        int metricRecordSize = deviceMetricRecordList.size();
        int maintenanceSize = deviceMaintenanceList.size();
        int size = Math.max(metricRecordSize, maintenanceSize);
        // ç»™ æ ¡éªŒå’Œç»´ä¿®å¯¹è±¡ èµ‹å€¼
        for (int i = 0; i < size; i++) {
            // æ ¡éªŒå’Œç»´ä¿®å¯¹è±¡
            DeviceMetricRecordAndMaintenanceDto deviceMetricRecordAndMaintenanceDto = new DeviceMetricRecordAndMaintenanceDto();
            // è®¾ç½®åºå·
            deviceMetricRecordAndMaintenanceDto.setIndex(i + 1);
            // æ ¡å‡†è¡¨æ•°æ®
            if (metricRecordSize > i) {
                // è®¾ç½®æ—¥æœŸæ ¼å¼
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                // èŽ·å–è®¾å¤‡æ ¡å‡†è¡¨æ•°æ®
                DeviceMetricRecord deviceMetricRecord = deviceMetricRecordList.get(i);
                // è®¾ç½®æ ¡å‡†æ—¥æœŸ
                deviceMetricRecordAndMaintenanceDto.setCalibrationDateString(sdf.format(deviceMetricRecord.getCalibrationDate()));
                // è®¾ç½®è¯ä¹¦ç¼–号
                deviceMetricRecordAndMaintenanceDto.setCertificateNumber(deviceMetricRecord.getCertificateSerialNumber());
                // è®¾ç½®æœ‰æ•ˆæœŸ
                deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getNextCalibrationDate()));
                // è®¾ç½®æ ¡å‡†æœ‰æ•ˆæ—¥æœŸ
                deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getConfirmDate()));
                // è®¾ç½®æ£€éªŒç»“æžœ
                deviceMetricRecordAndMaintenanceDto.setJudgement(deviceMetricRecord.getStatus());
            }
            // ç»´ä¿®è¡¨æ•°æ®
            if (maintenanceSize > i) {
                // èŽ·å–è®¾å¤‡ç»´ä¿®è¡¨æ•°æ®
                DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(i);
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                // ç»´ä¿®æ—¥æœŸ
                deviceMetricRecordAndMaintenanceDto.setMaintenanceDateString(deviceMaintenance.getDate().format(dateTimeFormatter));
                // å¤„理方法
                deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getContent());
                // å¤‡æ³¨
                deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getComments());
            }
            deviceMetricRecordAndMaintenanceDtoList.add(deviceMetricRecordAndMaintenanceDto);
        }
        return deviceMetricRecordAndMaintenanceDtoList;
    }
    /**
     * ç»™æ¡£æ¡ˆåŠ åºå· å¹¶å·¦å³åˆ†ä¸ºå·¦å³ä¸¤åˆ—在word中显示
     *
     * @param documentList              æ¡£æ¡ˆåˆ—表
     * @param documentExportWordDtoList è¿”回给word的数据列表
     */
    private static void extracted(List<Document> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
        // ç»™æ¡£æ¡ˆåŠ åºå·   å¹¶ä¸”分为左右两个列表在word中显示
        for (int i = 0; i < documentList.size(); i++) {
            // åˆ›å»ºword表格中一行的数据对象
            DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto();
            // èŽ·å–æ¡£æ¡ˆä¿¡æ¯
            Document document = documentList.get(i);
            // æ ¼å¼åŒ–日期
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            // æ ¹æ®åºå· åˆ†åˆ«åŠ å…¥ä¸¤ä¸ªåˆ—è¡¨
            if (i % 2 == 0) {
                // å¥‡æ•°åœ¨å·¦åˆ—
                documentExportWordDto.setIndex1(i + 1);
                documentExportWordDto.setName1(document.getName());
                documentExportWordDto.setQuantity1(document.getQuantity());
                documentExportWordDto.setPageCount1(document.getPageCount());
                documentExportWordDto.setArchiveDateString1(document.getProvideDate().format(dateTimeFormatter));
            } else {
                // å¶æ•°åœ¨å³åˆ—
                documentExportWordDto.setIndex2(i + 1);
                documentExportWordDto.setName2(document.getName());
                documentExportWordDto.setQuantity2(document.getQuantity());
                documentExportWordDto.setPageCount2(document.getPageCount());
                documentExportWordDto.setArchiveDateString2(document.getProvideDate().format(dateTimeFormatter));
            }
            // æŠŠä¸€è¡Œæ•°æ®å¯¹è±¡åŠ å…¥åˆ—è¡¨
            documentExportWordDtoList.add(documentExportWordDto);
        }
    }
    @Override
    public void exportEquipmentDetails(HttpServletResponse response) {
        List<Device> deviceList = baseMapper.selectList(null);
        List<DeviceExport> deviceExportList = new ArrayList<>();
        int index = 1;
        for (Device device : deviceList) {
            Integer equipmentManager = device.getEquipmentManager();
            String equipmentManagerName = null;
            if (equipmentManager != null) {
                User user = userMapper.selectById(equipmentManager);
                if (user != null) {
                    equipmentManagerName = user.getName();
                }
            }
            DeviceExport deviceExport = new DeviceExport();
            BeanUtils.copyProperties(device, deviceExport);
            deviceExport.setIndex(index);
            deviceExport.setEquipmentManagerName(equipmentManagerName);
            deviceExportList.add(deviceExport);
            index++;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/quipment-details.docx");
        Configure configure = Configure.builder()
                .bind("deviceList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceList", deviceExportList);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "仪器设备一览表", "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/DocumentServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DocumentMapper;
import com.ruoyi.device.pojo.Document;
import com.ruoyi.device.service.DocumentService;
import org.springframework.stereotype.Service;
/**
 * è®¾å¤‡æ¡£æ¡ˆ
 */
@Service
public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> implements DocumentService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.service.ProductService;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
import com.ruoyi.device.pojo.DeviceMetricRecord;
import com.ruoyi.device.service.QrShowService;
import com.ruoyi.inspect.mapper.InsOrderMapper;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.system.service.CustomService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;
@Service
public class QrShowServiceImpl implements QrShowService {
    @Autowired
    private DeviceMetricRecordMapper deviceMetricRecordMapper;
    /**
     * è®¡ç®—启用时长
     * @param activationDate
     * @return
     */
    public double calcUsedYears(LocalDateTime activationDate) {
        if(Objects.isNull(activationDate)){
            return 0;
        }
        BigDecimal defDays = BigDecimal.valueOf(365);
        BigDecimal usedDays = BigDecimal.valueOf(Duration.between(activationDate,LocalDateTime.now()).toDays());
        return usedDays.divide(defDays,2,RoundingMode.HALF_UP).setScale(2,RoundingMode.HALF_UP).doubleValue();
    }
    /**
     * è®¡ç®—距离下次校准日期的天数百分比
     * @param startDate
     * @param endDate
     * @return
     */
    public double calcDeviceNextCheckRatio(Date startDate, Date endDate){
        if(Objects.isNull(startDate) || Objects.isNull(endDate)){
            return 0;
        }
        LocalDateTime startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        long totalDays = Duration.between(startLocalDate, endLocalDate).toDays();
        long usedDays = Duration.between(startLocalDate, LocalDateTime.now()).toDays();
        BigDecimal calcVal = BigDecimal.valueOf(usedDays).divide(BigDecimal.valueOf(totalDays),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
        if(calcVal.compareTo(BigDecimal.ZERO)<0){
            calcVal = BigDecimal.ZERO;
        }else if(calcVal.compareTo(BigDecimal.valueOf(100))>0){
            calcVal = BigDecimal.valueOf(100);
        }
        return calcVal.doubleValue();
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡æ ¡å‡†/核查记录
     * @param deviceId
     * @param type
     * @return
     */
    public DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type){
        return Optional.ofNullable(
                deviceMetricRecordMapper.selectOne(Wrappers.<DeviceMetricRecord>lambdaQuery()
                .eq(DeviceMetricRecord::getDeviceId, deviceId)
                .eq(DeviceMetricRecord::getType, type)
                .orderByDesc(DeviceMetricRecord::getCreateTime)
                .last("limit 1"))).orElse(new DeviceMetricRecord());
    }
    /**
     * æ ¼å¼åŒ–日期
     * @return
     */
    public String formatDate(Date date,String formatter){
        if(Objects.isNull(date)){
            return "";
        }
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        return localDateTime.format(DateTimeFormatter.ofPattern(formatter));
    }
    /**
     * æ ¼å¼åŒ–日期
     * @return
     */
    public String formatDate(LocalDate date,String formatter){
        if(Objects.isNull(date)){
            return "";
        }
        return date.format(DateTimeFormatter.ofPattern(formatter));
    }
}
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,861 @@
package com.ruoyi.device.utils;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.ruoyi.device.pojo.DataConfig;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.framework.exception.ErrorException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class DataAcquisition {
    private static final String HTTP = "http://";
    private static final String GETFILE = ":9527/lims/getFile"; // èŽ·å–æ–‡ä»¶æŽ¥å£
    private static final String MOVEFILE = ":9527/lims/moveFile"; // æ–‡ä»¶ç§»åŠ¨åœ°å€
    private static final String splitIdentifier = "@-@"; // è‡ªå®šä¹‰å”¯ä¸€æ ‡è¯†åˆ†å‰²ç¬¦
    public static final String frequency = "frequency";
    /**
     * æ•°é‡‡å…¥å£
     *
     * @param dataConfig
     * @param device
     * @return
     */
    public static Map<String, Object> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip, String cableTag) {
        // åˆ¤æ–­æ˜¯å¦æ˜¯å½±åƒæµ‹é‡ä»ª
        if (device.getManagementNumber().equals("JCZX-ZB-OP07001")) {
            if (device.getFileType().equals(".xlsx")) {
                String url = device.getCollectUrl() + "\\" + sampleCode.replace("/", "");
                if (StringUtils.isNotBlank(dataConfig.get(0).getAnotherName())) {
                    url += dataConfig.get(0).getAnotherName() ;
                }
                url += ".xlsx";
                device.setCollectUrl(url);
            }
        }
        // åˆ¤æ–­æ˜¯å¦æ˜¯ç”µç¼†ç‡ƒçƒ§çƒŸå¯†åº¦æµ‹é‡ç³»ç»Ÿ
        if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) {
            if (device.getFileType().equals(".txt")) {
                device.setCollectUrl(device.getCollectUrl() + "\\-" + sampleCode.replace("/", ""));
            }
        }
        /**
         * filePath æ–‡ä»¶é‡‡é›†è·¯å¾„
         * fileExtension æ–‡ä»¶åŽç¼€
         * entrustCode å§”托编号
         * sampleCode æ ·å“ç¼–号
         * mdbEntrustCode mdb文件需要:委托编号字段 ä¸ºä»€ä¹ˆæ²¡æœ‰åŽ»è¿™ä¸ªmdb前缀呢?因为已经给客户的部分电脑上安装了采集器,而用户不接受重新安装采集器,所以就没有去除
         * mdbSampleCode mdb文件需要:样品编号字段
         */
        String http = HTTP + ip + GETFILE +
                "?filePath=" + device.getCollectUrl() +
                "&fileExtension=" + device.getFileType() +
                "&entrustCode=" + entrustCode +
                "&sampleCode=" + sampleCode +
                "&mdbEntrustCode=" + device.getEntrustCode() +
                "&mdbSampleCode=" + device.getSampleCode() +
                "&dbFileName=" + device.getDbFileName();
        String result = null;
        try {
            result = HttpUtil.get(http);
        } catch (IORuntimeException e) {
            e.printStackTrace();
            throw new ErrorException("所在电脑未安装或未启动:LIMS文件采集器!");
        }
        JSONObject jsonObject = JSON.parseObject(result);
        if (Objects.equals(jsonObject.get("code"), 1)) {
            if (ObjectUtils.isEmpty(jsonObject.get("msg"))) {
                throw new ErrorException("未查询到文件!可能该路径(" + device.getCollectUrl() + ")下并没有所需(" + device.getFileType() +")文件!");
            } else {
                throw new ErrorException(jsonObject.get("msg") + "");
            }
        } else {
            String data = jsonObject.get("data") + "";
            // è€ƒè™‘到一个检测项可能会存在多个数采配置,所以需要进行分组
            Map<String, List<DataConfig>> userMap = dataConfig.stream()
                    .peek(i -> {
                        String itemName = i.getInspectionItem();
                        if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
                            itemName += "@" + i.getInspectionItemClass();
                        }
                        String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
                        // æ·»åŠ æ£€éªŒé¡¹åç§°
                        i.setInsProductItem(name);
                    })
                    .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
            Map<String, Object> map;
            switch (device.getFileType()) {
                case ".docx":
                    map = analysisString(data, userMap, device, entrustCode, sampleCode);
                    break;
                case ".xlsx":
                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
                    break;
                case ".txt":
                    map = analysisTxt(data, userMap, device, entrustCode, sampleCode);
                    break;
                case ".csv":
                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
                    break;
                case ".mdb":
                    // åˆ¤æ–­æ˜¯å¦æ˜¯æ‹‰åŠ›æœº
                    if (device.getManagementNumber().equals("JCZX-ZB-FF01014")) {
                        map = analysisMdbByPull(data, userMap, device, cableTag);
                    } else {
                        map = analysisMdb(data, userMap, device);
                    }
                    break;
                case ".db":
                    map = analysisDb(data, userMap, device);
                    break;
                case ".png":
                    map = readPngString(data, userMap, device);
                    break;
                default:
                    map = null;
                    break;
            }
            // å¦‚果存在存储地址,则移动地址
            if (ObjectUtils.isNotEmpty(device.getStorageUrl())) {
                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl() + "&fileType=" + device.getFileType();
                HttpUtil.get(s);
            }
            return map;
        }
    }
    public static Map<String, Object> createFrequency(String entrustCode, String sampleCode, Map<String, Object> map) {
        Set<String> set = new LinkedHashSet<>();
        map.forEach((key, value) -> {
            String[] split = key.split(",");
            String inspectionItem = split[0];
            // åªè¦æœ‰ä¸€ä¸ªä¸ä¸ºç©ºå°±set进去
            if (ObjectUtils.isNotEmpty(value)) {
                set.add(inspectionItem);
            }
        });
        Map<String, Object> result = new HashMap<>();
        for (String inspectionItemKey : set) {
            Map<String, Object> hashMap = new HashMap<>();
            map.forEach((key, value) -> {
                String[] split = key.split(",");
                String inspectionItem = split[0];
                if (inspectionItemKey.equals(inspectionItem)) {
                    if (split.length > 1) {
                        hashMap.put(split[1], value);
                    } else {
                        hashMap.put("", value);
                    }
                }
            });
            String frequency = createKey(entrustCode, sampleCode, inspectionItemKey);
            hashMap.put("frequency", frequency);
            result.put(inspectionItemKey, hashMap);
        }
        return result;
    }
    public static String createKey(String entrustCode, String sampleCode, String inspectionItemKey) {
        return "1";
    }
    /**
     * éœ€è¦é€šè¿‡X,Y轴定位
     *
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
        JSONObject jsonObject = JSON.parseObject(data);
        Map<String, Object> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            AtomicInteger numberOfDataEntries = new AtomicInteger();
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String refery = getRefer(v.get(config).getRefery());
                for (int i = 0; i < dataList.size(); i++) {
                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                    Object o = jsonObject1.get(refery);
                    if (ObjectUtils.isNotEmpty(o)) {
                        numberOfDataEntries.addAndGet(1);
                        list.add(o);
                    }
                }
            }
            // æ‹¼æŽ¥æ•°é‡‡é…ç½®
            List<Object> result = new ArrayList<>();
            for (int i = 0; i < numberOfDataEntries.get(); i++) {
                String aggregate = "";
                for (int j = 0; j < v.size(); j++) {
                    int index;
                    if (j == 0) {
                        index = i;
                    } else {
                        index = numberOfDataEntries.get() + i;
                    }
                    aggregate += list.get(index).toString() + ",";
                }
                int lastIndex = aggregate.lastIndexOf(",");
                String substring = aggregate.substring(0, lastIndex);
                result.add(substring);
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(result, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
        JSONObject jsonObject = JSON.parseObject(data);
        Map<String, Object> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            DataConfig configVo = v.get(0);
            AtomicInteger numberOfDataEntries = new AtomicInteger();
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String refery = getRefer(v.get(config).getRefery());
                for (int i = 0; i < dataList.size(); i++) {
                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                    Object o = jsonObject1.get(refery);
                    if (ObjectUtils.isNotEmpty(o)) {
                        numberOfDataEntries.addAndGet(1);
                        list.add(o);
                    }
                }
            }
            // æ‹¼æŽ¥æ•°é‡‡é…ç½®
            List<Object> result = new ArrayList<>();
            for (int i = 0; i < numberOfDataEntries.get(); i++) {
                String aggregate = "";
                for (int j = 0; j < v.size(); j++) {
                    int index;
                    if (j == 0) {
                        index = i;
                    } else {
                        index = numberOfDataEntries.get() + i;
                    }
                    aggregate += list.get(index).toString() + ",";
                }
                int lastIndex = aggregate.lastIndexOf(",");
                String substring = aggregate.substring(0, lastIndex);
                result.add(substring);
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(result, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * æ‹‰åŠ›æœºæ•°é‡‡
     *
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, Object> analysisMdbByPull(String data, Map<String, List<DataConfig>> dataConfig, Device device, String cableTag) {
        JSONObject jsonObject = JSON.parseObject(data);
        Map<String, Object> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            List<Map<String, String>> resultValue = new ArrayList<>();
            DataConfig configVo = v.get(0);
            for (int i = 0; i < dataList.size(); i++) {
                JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                // èŽ·å–æ—¶é—´
                String dDate = jsonObject1.getString("dDate");
                String dTime = jsonObject1.getString("dTime");
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
                // è§£æžç¬¬ä¸€ä¸ªæ—¥æœŸæ—¶é—´å­—符串
                LocalDateTime dateTime1 = LocalDateTime.parse(dDate, formatter);
                // èŽ·å–å¹´æœˆæ—¥
                String yearMonthDay = dateTime1.toLocalDate().toString();
                // è§£æžç¬¬äºŒä¸ªæ—¥æœŸæ—¶é—´å­—符串
                LocalDateTime dateTime2 = LocalDateTime.parse(dTime, formatter);
                // èŽ·å–æ—¶åˆ†
                String hourMinute = dateTime2.toLocalTime().toString();
                // æ‹¼æŽ¥å¹´æœˆæ—¥å’Œæ—¶åˆ†
                String mergedDateTime = yearMonthDay + " " + hourMinute;
                // èŽ·å–åŽšåº¦
                String report = jsonObject1.getString("Report");
                String thickness = extractValue(report, "厚度:\\s*(\\S*?)~");
                // èŽ·å–æ‹‰ä¼¸å¼ºåº¦ä¼¸é•¿çŽ‡
                String result = "";
                if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("拉伸强度")) {
                    result = extractValue(report, "拉伸强度:\\s*(\\S*?)~");
                }
                //判断检验子项是否是拉伸强度
                if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("伸长率")) {
                    result = extractValue(report, "伸长率:\\s*(\\S*?)~");
                }
                Map<String, String> reportMap = new HashMap<>();
                reportMap.put("mergedDateTime", mergedDateTime);
                reportMap.put("thickness", thickness);
                reportMap.put("result", result);
                resultValue.add(reportMap);
            }
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("equipName", device.getDeviceName());
            hashMap.put("equipValue", device.getManagementNumber());
            hashMap.put("result", resultValue);
            map.put(k, hashMap);
        });
        return map;
    }
    private static String extractValue(String input, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        return matcher.find() ? matcher.group(1) : null;
    }
    private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?");
    /**
     * åªéœ€Xè½´
     *
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, Object> readPngString(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
        Map<String, Object> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = getRefer(v.get(config).getReferx());
                String result = null;
                // é€šè¿‡\n将字符串分割为行
                String[] aColumnY = data.split("\n");
                List<String> list1 = new ArrayList<>();
                // è¯¥å¾ªçŽ¯å¾—å‡ºç”¨æˆ·é…ç½®çš„yè½´
                for (int i = 0; i < aColumnY.length; i++) {
                    String addDataWithSpaces = referx.replaceAll("", " ");
                    int x = getXOrY(v.get(config).getX(), k, "X");
                    if (aColumnY[i].contains(addDataWithSpaces)) {
                        Matcher matcher = SPATTERN.matcher(aColumnY[i]);
                        while (matcher.find()) {
                            String group = matcher.group();
                            list1.add(group);
                        }
                    }
                    if (ObjectUtils.isNotEmpty(list1)) {
                        result = list1.get(x);
                    }
                }
                if (ObjectUtils.isNotEmpty(result)) {
                    list.add(result);
                }
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(list, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * ä»Žæ–‡ä»¶ä¸­æå–出来的文字,如果有公式,进行公式计算,否则取列表第一个值
     *
     * @param list       æå–出的数字
     * @param dataConfig å­˜å‚¨å…¬å¼çš„对象
     * @return
     */
    private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) {
        if (list.size() == 0) {
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("equipName", device.getDeviceName());
            hashMap.put("equipValue", device.getManagementNumber());
            hashMap.put("result", null);
            return hashMap;
        }
        ArrayList<Object> listResult = new ArrayList<>();
        Map<String, Object> hashMap = new HashMap<>();
        // å¦‚果不为空,进行公式计算
        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
            // å¦åˆ™ï¼šæ²¡æœ‰å…¬å¼ä»£è¡¨ä¸éœ€è¦è®¡ç®—,直接提取List里面的数据
            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
                String s = calculationFormulaList(list, dataConfig.getFormula());
                listResult.add(s);
            } else {
                list.forEach(i -> {
                    List<Object> strings = Arrays.asList(i.toString().split(","));
                    String s = calculationFormulaList(strings, dataConfig.getFormula());
                    listResult.add(s);
                });
            }
        } else {
            listResult.addAll(list);
        }
        // ä¸ºäº†ç»™å‰ç«¯åšæ•°æ®åŒºåˆ†
        if (listResult.size() > 1) {
            hashMap.put("result", listResult);
        } else {
            hashMap.put("result", listResult.get(0).toString());
        }
        hashMap.put("equipName", device.getDeviceName());
        hashMap.put("equipValue", device.getManagementNumber());
        return hashMap;
    }
    /**
     * è§£æžString数据
     *
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, Object> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig,
                                                   Device device, String entrustCode, String sampleCode) {
        Map<String, Object> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            // å§”托编号与样品编号不存在,定:1、Y定范围,X定横坐标;2、只存在Y;3、只存在X
            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
                // åˆ¤æ–­æ˜¯å¦æ˜¯çƒŸå¯†åº¦
                if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) {
                    // æŒ‰è¡Œåˆ†å‰²æ•°æ®
                    String[] lines = data.split("\n");
                    // æå–最后一行的第一个数字
                    String lastLine = lines[lines.length - 1];
                    String firstNumber = lastLine.split("\t")[0];
                    list.add(firstNumber);
                } else {
                    list = analyzeData(data, v, k, ",");
                }
                // å§”托编号与样品编号存在
            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
                list = analyzeDataEntrustCodAndSampleCode(data, v, k, ",", device, entrustCode, sampleCode);
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(list, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, Object> analysisString(String data, Map<String, List<DataConfig>> dataConfig, Device device,
                                                      String entrustCode, String sampleCode) {
        String processingDataAfterSpaces = data
                .replaceAll("  +", splitIdentifier)
                .replaceAll("\r", "")
                .replaceAll(" ", "");
        Map<String, Object> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            // å§”托编号与样品编号不存在,定:1、Y定范围,X定横坐标;2、只存在Y;3、只存在X
            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
                list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier);
                // å§”托编号与样品编号存在
            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
                list = analyzeDataEntrustCodAndSampleCode(processingDataAfterSpaces, v, k, splitIdentifier, device, entrustCode, sampleCode);
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(list, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * å–X,Y两个定位
     *
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    public static Map<String, Object> analysisList(String data, Map<String, List<DataConfig>> dataConfig,
                                                   Device device, String entrustCode, String sampleCode) {
        Map<String, Object> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            // å§”托编号与样品编号不存在,定:1、Y定范围,X定横坐标;2、只存在Y;3、只存在X
            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
                list = analyzeData(data, v, k, splitIdentifier);
                // å§”托编号与样品编号存在
            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
                list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode);
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(list, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    private static List<Object> analyzeDataEntrustCodAndSampleCode(String data, List<DataConfig> v, String k, String splitIdentifier,
                                                                   Device device, String entrustCodeValue, String sampleCodeValue) {
        entrustCodeValue = entrustCodeValue.replaceAll(" ", "");
        sampleCodeValue = sampleCodeValue.replaceAll(" ", "");
        // æœ€ç»ˆç»“æžœ
        List<Object> list = new ArrayList<>();
        int numberOfDataEntries = 0;
        // å–entrustCode与sampleCode所在位
        for (int config = 0; config < v.size(); config++) {
            numberOfDataEntries = 0;
            Integer entrustCodeY = null;
            Integer sampleCodeY = null;
            Integer referYCoordinate = null;
            String refery = getRefer(v.get(config).getRefery());
            String entrustCode = getRefer(device.getEntrustCode()); // å§”托编号字段
            String sampleCode = getRefer(device.getSampleCode()); // æ ·å“ç¼–号字段
            if (ObjectUtils.isEmpty(refery)) {
                continue;
            }
            // åŽ»é™¤æ‰€æœ‰çš„ç©ºæ ¼ï¼Œé€šè¿‡\n将字符串分割为行
            String[] aColumnY = data.replaceAll(" ", "").split("\n");
            for (int i = 0; i < aColumnY.length; i++) {
                // å¦‚果通过判断,定位到Yè½´
                if (aColumnY[i].contains(entrustCode) && aColumnY[i].contains(sampleCode)) {
                    String[] aLine = aColumnY[i].split(splitIdentifier);
                    for (int j = 0; j < aLine.length; j++) {
                        if (aLine[j].contains(entrustCode)) {
                            entrustCodeY = j;
                        }
                        if (aLine[j].contains(sampleCode) ) {
                            sampleCodeY = j;
                        }
                        if (aLine[j].contains(refery)) {
                            referYCoordinate = j;
                        }
                    }
                }
                if (ObjectUtils.isNotEmpty(entrustCodeY) && ObjectUtils.isNotEmpty(sampleCodeY) && ObjectUtils.isNotEmpty(referYCoordinate)) {
                    String[] aLine = aColumnY[i].split(splitIdentifier);
                    try {
                        if (aLine[entrustCodeY].contains(entrustCodeValue) && aLine[sampleCodeY].contains(sampleCodeValue)) {
                            String result = aLine[referYCoordinate];
                            // é˜²æ­¢è®¡ç®—公式的时候出现:[null] è¿™ç§æ•°æ®
                            if (ObjectUtils.isNotEmpty(result)) {
                                numberOfDataEntries += 1;
                                list.add(result);
                            }
                        }
                    } catch (Exception e) {}
                }
            }
        }
        // æ‹¼æŽ¥æ•°é‡‡é…ç½®
        List<Object> result = new ArrayList<>();
        for (int i = 0; i < numberOfDataEntries; i++) {
            String aggregate = "";
            for (int j = 0; j < v.size(); j++) {
                int index;
                if (j == 0) {
                    index = i;
                } else {
                    index = numberOfDataEntries + i;
                }
                aggregate += list.get(index).toString() + ",";
            }
            int lastIndex = aggregate.lastIndexOf(",");
            String substring = aggregate.substring(0, lastIndex);
            result.add(substring);
        }
        return result;
    }
    // ç”±äºŽåœ¨æ–¹æ³•中会大量的判断,所以做一个方法
    private static int getXOrY(String value, String k, String tips) {
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException e) {
            throw new ErrorException(k + ":未配置" + tips + "坐标轴的值!");
        }
    }
    // é˜²æ­¢å‚照物为空报错,进行判断如果为空赋值空字符
    private static String getRefer(String refer) {
        return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : "";
    }
    /**
     * å§”托编号与样品编号都为空执行
     *
     * @param data
     * @param v
     * @param k
     * @param split
     * @return
     */
    public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) {
        List<Object> list = new ArrayList<>();
        for (int config = 0; config < v.size(); config++) {
            // å–两个用户配置的参照物
            String referx = getRefer(v.get(config).getReferx());
            String refery = getRefer(v.get(config).getRefery());
            if (ObjectUtils.isEmpty(refery) && ObjectUtils.isEmpty(referx)) {
                continue;
            }
            // æœ€ç»ˆç»“æžœ
            List<Object> result = new ArrayList<>();
            // é€šè¿‡\n将字符串分割为行
            String[] aColumnY = data.replaceAll(" ", "").split("\n");
            Integer end = null;
            // é‡‡é›†æ•°æ®ï¼šYè½´
            for (int i = 0; i < aColumnY.length; i++) {
                // å¦‚æžœY参照不为空与X参照为空则执行,同时该行包含Y参照
                if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isEmpty(referx) && aColumnY[i].contains(refery)) {
                    // å–Y坐标值
                    int y = getXOrY(v.get(config).getY(), k, "Y");
                    String[] aLineX = aColumnY[i].split(split);
                    for (int j = 0; j < aLineX.length; j++) {
                        if (aLineX[j].contains(refery)) {
                            String[] split1 = new String[0];
                            try {
                                split1 = aColumnY[i + y].split(split);
                            } catch (Exception e) {
                                throw new ErrorException(k + ":Y轴定位超出!");
                            }
                            try {
                                result.add(split1[j]);
                            } catch (Exception e) {
                                throw new ErrorException(k + ":X轴定位超出!");
                            }
                        }
                    }
                    // å¦‚æžœY参照不为空与X参照不为空则执行,此处Y定区域
                } else if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isNotEmpty(referx)) {
                    // å–x的值,防止报错
                    int x = getXOrY(v.get(config).getX(), k, "X");
                    // å–Y坐标值
                    int y = getXOrY(v.get(config).getY(), k, "Y");
                    // ç¼“å­˜Y的结束值
                    if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) {
                        end = i + y;
                    }
                    // åˆ¤æ–­æ˜¯å¦åœ¨å‚照物为起到,Y坐标值为最终范围
                    if (ObjectUtils.isNotEmpty(end) && i <= end) {
                        String[] aLineX = aColumnY[i].split(split);
                        for (int j = 0; j < aLineX.length; j++) {
                            if (aLineX[j].contains(referx)) {
                                try {
                                    result.add(aLineX[j + x]);
                                } catch (Exception e) {
                                    throw new ErrorException(k + ":X轴定位超出!");
                                }
                                break;
                            }
                        }
                    }
                    // å¦‚æžœX参照不为空同时该行包含X参照,则执行下面的代码
                } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) {
                    String[] aLineX = aColumnY[i].split(split);
                    // å–x的值,防止报错
                    int x = getXOrY(v.get(config).getX(), k, "X");
                    for (int j = 0; j < aLineX.length; j++) {
                        if (aLineX[j].contains(referx)) {
                            try {
                                result.add(aLineX[j + x]);
                            } catch (Exception e) {
                                throw new ErrorException(k + ":X轴定位超出!");
                            }
                        }
                    }
                }
            }
            // é˜²æ­¢è®¡ç®—公式的时候出现:[null] è¿™ç§æ•°æ®
            if (ObjectUtils.isNotEmpty(result)) {
//                String formatProcessing = getFormatProcessing(result);
                list.addAll(result);
            }
        }
        return list;
    }
    public static String getFormatProcessing(String value) {
        value = value.replaceAll("%", "");
        if (value.contains("=")) {
            String[] split = value.split("=");
            return split[split.length - 1];
        } else if (value.contains(":")) {
            String[] split = value.split(":");
            return split[split.length - 1];
        } else {
            return value;
        }
    }
    public static String getIp(HttpServletRequest request) {
        String ipAddress = request.getRemoteAddr();
        // é˜²æ­¢å›žçŽ¯åœ°å€å˜ä¸ºIPv6
        return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
    }
    public static String calculationFormulaList(List<Object> list, String formula) {
        //首先将list转换为bigdecmic
        List<BigDecimal> bigDecimalList = list.stream()
                .map(obj -> {
                    return new BigDecimal((obj).toString());
                }).collect(Collectors.toList());
        //将中文的(转换英文的())
        formula = formula.replace("(", "(")
                .replace(")", ")")
                .replace(",", ",");
        //然后提取公式
        String strs = formula.substring(0, formula.indexOf("("));
        String upperStr = strs.toUpperCase();
        if (upperStr.matches(".*\\d.*")) {
            upperStr = "";
        }
        //然后获取最外面括号里面的值,再根据","分割
        int start = formula.indexOf("(");
        int end = -1;
        int a = 0;
        for (int i = start; i < formula.length(); i++) {
            char c = formula.charAt(i);
            if (c == '(') {
                a++;
            } else if (c == ')') {
                a--;
                if (a == 0) {
                    end = i;
                }
            }
        }
        if (start == -1 || end == -1) {
            throw new ErrorException("公式括号不匹配: " + formula);
        }
        String argumentsStr = formula.substring(start + 1, end);
        List<String> arguments = new ArrayList<>();
        int bracketCount = 0;
        StringBuilder currentArgument = new StringBuilder();
        for (char c : argumentsStr.toCharArray()) {
            if (c == ',' && bracketCount == 0) {
                arguments.add(currentArgument.toString());
                currentArgument.setLength(0);
            } else {
                if (c == '(') bracketCount++;
                if (c == ')') bracketCount--;
                currentArgument.append(c);
            }
        }
        arguments.add(currentArgument.toString());
        String[] bracketStrs = arguments.toArray(new String[0]);
        List<BigDecimal> results = new ArrayList<>();
        for (String expr : bracketStrs) {
            Pattern pattern = Pattern.compile("([A-Z])(\\d+)");
            Matcher matcher = pattern.matcher(expr);
            StringBuffer sb = new StringBuffer();
            while (matcher.find()) {
                String letter = matcher.group(1);
                int index = Integer.parseInt(matcher.group(2)) - 1; // å°†1-based转为0-based
                if (index < bigDecimalList.size()) {
                    matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
                } else {
                    throw new RuntimeException("公式中的下标 " + index + " è¶…出范围");
                }
            }
            matcher.appendTail(sb);
            // è®¡ç®—表达式
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
            try {
                Object result = engine.eval(sb.toString());
                results.add(new BigDecimal(result.toString()));
            } catch (Exception e) {
                throw new IllegalArgumentException("无法计算公式: " + sb, e);
            }
        }
        // æ ¹æ®å‡½æ•°åç§°è¿›è¡Œç›¸åº”计算
        BigDecimal finalResult;
        if (upperStr.equals("") || upperStr == null) {
            finalResult = results.get(0);
        } else {
            switch (upperStr) {
                case "MAX":
                    finalResult = results.stream().max(BigDecimal::compareTo)
                            .orElseThrow(() -> new IllegalArgumentException("无法计算MAX值"));
                    break;
                case "MIN":
                    finalResult = results.stream().min(BigDecimal::compareTo)
                            .orElseThrow(() -> new IllegalArgumentException("无法计算MIN值"));
                    break;
                case "SUM":
                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
                    break;
                case "ABS":
                    finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add);
                    break;
                case "AVERAGE":
                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide)
                            .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP);
                    break;
                case "MEDIAN":
                    int size = results.size();
                    if (size % 2 == 1) {
                        finalResult = results.get(size / 2);
                    } else {
                        BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2));
                        finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
                    }
                    break;
                default:
                    throw new UnsupportedOperationException("暂不支持函数: " + upperStr);
            }
        }
        return finalResult.toString();
        // å¦åˆ™ï¼šæ²¡æœ‰å…¬å¼ä»£è¡¨ä¸éœ€è¦è®¡ç®—,直接提取List里面的数据
    }
}
cnas-device/src/main/resources/mapper/DataConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.device.mapper.DataConfigMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.device.pojo.DataConfig">
        <id column="id" property="id" />
        <result column="formula" property="formula" />
        <result column="referx" property="referx" />
        <result column="refery" property="refery" />
        <result column="x" property="x" />
        <result column="y" property="y" />
    </resultMap>
    <select id="selectDataConfigList" resultType="com.ruoyi.device.dto.DeviceConfigDtoPage">
        SELECT d.device_name,
               d.file_type,
               d.collect_url,
               d.storage_url,
               d.ip,
               d.entrust_code,
               d.sample_code,
               d.db_file_name,
               ip.inspection_item,
               ip.inspection_item_class,
               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
                  ip.inspection_item_subclass, ip.inspection_item)                            inspection_item_subclass,
               ip.sample,
               ddc.formula,
               ddc.referx,
               ddc.refery,
               ddc.x,
               ddc.y,
               ddc.another_name,
               ddc.matching_name,
               ddc.id,
               ip.id                                                                          structureItemParameterId
        FROM device d
                 left join structure_item_parameter ip on FIND_IN_SET(ip.id, d.ins_product_ids)
                 left join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
        where d.id = #{deviceId}
    </select>
    <select id="deleteDataConfig" resultType="integer">
        SELECT ddc.id
        FROM device d
                 left join structure_item_parameter ip on not FIND_IN_SET(ip.id, d.ins_product_ids)
                 inner join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.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.DeviceMaintenanceMapper">
    <select id="getDeviceMaintenanceParam" resultType="com.ruoyi.device.pojo.DeviceMaintenance">
        select id,device_id,device_name, device_number,management_number,content,name
        ,date from device_maintenance
    </select>
    <select id="deviceMaintenanceExport" resultType="com.ruoyi.device.excel.DeviceMaintenanceExport">
        select id, device_id, device_name, device_number, management_number, content, date, if(maintenance_type = 1, '计划中维护', '使用前后维护'), next_date, name, comments
        from device_maintenance dm
        where dm.device_id = #{deviceId}
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
<?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.DeviceMapper">
    <select id="selectDeviceParameter" resultType="com.ruoyi.device.pojo.Device">
        select * from(
        select id,
        large_category,
        date_production,
        equipment_manager,
        authorized_person,
        device_name,
        internal_code,
        asset_code,
        calibration_date,
        scrap_time,
        acceptance_records,
        subclass,
        factory_no,
        acquisition_date,
        accurate_measurement,
        specification_model,
        device_status,
        storage_point,
        activation_date,
        latest_traceability,
        down_time,
        maintenance_records,
        manufacturer,
        detection_type,
        _costs,
        calibration_certicate,
        create_user,
        create_time,
        update_user,
        update_time,
        status
        from device
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectEquipmentOverview" resultType="com.ruoyi.device.pojo.Device">
        select * from(
        select id,
        device_name,
        specification_model,
        device_status,
        create_user,
        status,
        update_time
        from device
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="authorizedPerson" resultType="com.ruoyi.device.pojo.Device">
        select id,
               authorized_person
        from device
    </select>
    <select id="search" resultType="com.ruoyi.device.pojo.Device">
        select *
        from device
        <where>
            <if test="deviceName!=null and deviceName!=''">
                and device_name like concat('%',#{deviceName},'%')
            </if>
            <if test="status!=null and status!=''">
                and device_status = status
            </if>
            <if test="specificationModel!=null and specificationModel!= ''">
                and specification_model = #{specificationModel}
            </if>
            <if test="largeCategory!=null">
                and large_category = #{largeCategory}
            </if>
            <if test="largeCategory == 'null'">
                and (large_category = '' or large_category is null)
            </if>
        </where>
    </select>
    <select id="selectDeviceImage" resultType="com.ruoyi.device.pojo.Device">
        select (image_upload, create_user, create_time) values (#{image_upload}
             , #{createUser}
             , #{createTime})
    </select>
    <select id="selectDevicePrincipal" resultType="com.ruoyi.device.pojo.Device">
        select id,
               equipment_manager
        from device
    </select>
    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.Device">
        select * from(
        SELECT
        d.*,
        cmr.calibration_date as last_calibration_date_two,
        cmr.next_calibration_date as next_calibration_date_two,
        GROUP_CONCAT(distinct inspection_item SEPARATOR ';') AS insProductItem,
        u.name ,
        l.laboratory_name
        FROM
        device d
        LEFT JOIN `user` u ON u.id = d.equipment_manager
        LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
        LEFT JOIN device_metric_record cmr ON d.id = cmr.device_id
        LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
        <where>
            <if test="laboratoryNameIsNull != null and laboratoryNameIsNull == true">
                l.laboratory_name is null
            </if>
            AND cmr.type = 'calibrate' or cmr.type is null or cmr.type = ''
        </where>
        GROUP BY
        d.id,
        u.name, l.laboratory_name
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getInspectionItemSubclass" resultType="map">
        SELECT ip.inspection_item,
               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
                  ip.inspection_item_subclass, ip.inspection_item) inspection_item_subclass
        FROM ins_product ip
        where ip.ins_sample_id = #{id}
    </select>
    <resultMap id="treeDeviceDto" type="map">
        <result property="label" column="laboratory_name"/>
        <result property="value" column="value" />
        <collection property="children" resultMap="storagePointMap" javaType="List"/>
    </resultMap>
    <resultMap id="storagePointMap" type="map">
        <result property="value" column="value"/>
        <result property="label" column="storage_point"/>
        <collection property="children" resultMap="deviceNameMap" javaType="List"/>
    </resultMap>
    <resultMap id="deviceNameMap" type="map">
        <result property="value" column="id"/>
        <result property="label" column="device_name"/>
        <result property="managementNumber" column="management_number"/>
    </resultMap>
    <select id="treeDevice" resultMap="treeDeviceDto">
        select
        d.id,
        case when l.laboratory_name is null || l.laboratory_name ='' then '其他' else l.laboratory_name end as laboratory_name,
        case when d.storage_point is null || d.storage_point ='' then '其他' else d.storage_point end as storage_point,
        d.device_name,
        d.management_number,
        null as value
        from device d
        LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
        <where>
            <if test="deviceName!=null and deviceName!=''">
                and device_name like concat('%',#{deviceName},'%')
            </if>
        </where>
        order by l.laboratory_name desc, d.storage_point desc
    </select>
    <select id="selectDeviceByCode" resultType="com.ruoyi.device.dto.DeviceDto">
        SELECT d.*,
               GROUP_CONCAT(DISTINCT inspection_item SEPARATOR ';') AS ins_product_item,
               l.laboratory_name,
               u1.name                                                 equipmentManager_name,
               u2.name                                                 authorized_person_name
        FROM device d
                 LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
                 LEFT JOIN laboratory l ON d.subordinate_departments_id = l.id
                 LEFT JOIN user u1 ON u1.id = d.equipment_manager
                 LEFT JOIN user u2 ON u2.id = d.authorized_person
        WHERE d.id = #{id}
        GROUP BY d.id,
                 l.laboratory_name,
                 u1.name,
                 u2.name
    </select>
</mapper>
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -211,11 +211,6 @@
        return Result.success();
    }
    @Scheduled(fixedDelay = 1200000)
    public void getIfsOrderTiming() {
        insOrderService.getIfsOrder();
    }
    @ApiOperation(value = "修改订单单号")
    @PostMapping("/updateEntrustCode")
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -35,10 +35,7 @@
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.common.utils.*;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.*;
import com.ruoyi.inspect.mapper.*;
@@ -634,10 +631,7 @@
            }
            String thing = null;
            if (product.getTemplateId() != null && set.add(product.getTemplateId())) {
                long begin = System.currentTimeMillis();
                thing = standardTemplateService.getStandTempThingById(product.getTemplateId());
                long end = System.currentTimeMillis();
                System.out.println("=========时间====" + (end - begin));
            }
            if (StrUtil.isNotEmpty(thing)) {
                JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0)));
@@ -648,10 +642,7 @@
                style.put("columnlen", config.get("columnlen"));
                product.setTemplate(cellData);
                product.setStyle(style);
                long begin = System.currentTimeMillis();
                product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId()));
                long end = System.currentTimeMillis();
                System.out.println("=========时间22222====" + (end - begin));
            }
        }
    }
@@ -1527,7 +1518,7 @@
            standardMethod2.append("、").append(s);
        }
        standardMethod2.replace(0, 1, "");
        // todo: æ£€æµ‹ç±»åž‹
        // todo: æŸ¥è¯¢å­—典检测类型
//        List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName("");
        String orderType = null;
@@ -2289,6 +2280,7 @@
        String finalModelStr = modelStr;
        // todo: æŸ¥è¯¢å­—å…¸
        //        List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName("");
        String orderType = null;
        String formType = null;
inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.inspect.task;
import com.ruoyi.inspect.service.InsOrderService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * @Author zhuo
 * @Date 2025/2/20
 */
@Component
public class RawMaterIalSchedule {
    @Resource
    private InsOrderService insOrderService;
    /**
     * å®šæ—¶ä»»åŠ¡èŽ·å–é‡‡è´­è®¢å•
     */
    @Scheduled(fixedDelay = 1200000)
    public void getIfsOrderTiming() {
        insOrderService.getIfsOrder();
    }
}
pom.xml
@@ -264,6 +264,13 @@
                <version>${ruoyi.version}</version>
            </dependency>
            <!--cnas设备管理-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>cnas-device</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- minio -->
            <dependency>
                <groupId>io.minio</groupId>
@@ -376,6 +383,7 @@
        <module>performance-server</module>
        <module>cnas-require</module>
        <module>cnas-manage</module>
        <module>cnas-device</module>
    </modules>
    <packaging>pom</packaging>
ruoyi-admin/pom.xml
@@ -91,6 +91,13 @@
            <artifactId>cnas-manage</artifactId>
        </dependency>
        <!--cnas设备管理-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>cnas-device</artifactId>
        </dependency>
    </dependencies>
    <build>