liding
2025-04-18 4d5a0213352c1e5fd9410241668cbd06ea47e4c6
拉力机数采
已修改8个文件
246 ■■■■■ 文件已修改
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DataConfigMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
@@ -53,13 +53,14 @@
    @ApiOperation(value = "查看设备二维码按钮")
    @GetMapping("/showDeviceQrCodeButton")
    public void showDeviceQrCodeButton() { }
    public void showDeviceQrCodeButton() {
    }
    //设备工具明细
    @ApiOperation(value = "查询设备详情列表")
    @GetMapping("/selectDeviceParameter")
    public Result selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull){
    public Result selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) {
        return Result.success(deviceService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull));
    }
@@ -137,8 +138,8 @@
    @ApiOperation(value = "通过项目获取设备列表")
    @GetMapping("/selectDeviceByCategory")
    public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory) {
        return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,laboratory));
    public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) {
        return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass, laboratory));
    }
    @ApiOperation(value = "通过设备编号获取设备列表")
@@ -150,7 +151,7 @@
    @ApiOperation("/数采-数据采集")
    @PostMapping("/dataCollection")
    public Result<?> dataAcquisition(HttpServletRequest request,@RequestBody DeviceCollectionDto dto) {
    public Result<?> dataAcquisition(HttpServletRequest request, @RequestBody DeviceCollectionDto dto) {
        return deviceService.dataAcquisition(request, dto);
    }
@@ -167,6 +168,12 @@
        return dataConfigService.queryDataAcquisitionConfiguration(dataConfig);
    }
    @ApiOperation(value = "查询数采配置")
    @GetMapping("/queryDataAcquisitionConfigurationTwo")
    public Result<?> queryDataAcquisitionConfigurationTwo(DataConfig dataConfig) {
        return dataConfigService.queryDataAcquisitionConfigurationTwo(dataConfig);
    }
    @ApiOperation(value = "删除数采配置")
    @DeleteMapping("/deleteDataAcquisitionConfiguration")
@@ -176,7 +183,6 @@
        dataConfigService.removeBatchByIds(collect);
        return Result.success();
    }
    @ApiOperation(value = "左侧设备树形栏")
@@ -189,7 +195,7 @@
    @ApiOperation(value = "设备档案导出")
    @GetMapping("/exportDeviceFile")
    public void exportDeviceFile(@RequestParam Integer deviceId, HttpServletResponse response) throws Exception {
        deviceService.exportDeviceFile(deviceId,response);
        deviceService.exportDeviceFile(deviceId, response);
    }
    @ApiOperation(value = "仪器设备一览表导出")
@@ -200,11 +206,12 @@
    /**
     * 导入设备
     *
     * @return
     */
    @ApiOperation(value = "导入设备")
    @PostMapping("/importDevice")
    public Result importDevice(@RequestParam("file") MultipartFile file){
    public Result importDevice(@RequestParam("file") MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), Device.class, new DeviceListener(deviceService))
                    .registerConverter(new LocalDateTimeStringConverters())
@@ -218,7 +225,7 @@
    @ApiOperation(value = "判断该设备是否可以数采")
    @GetMapping("/determineWhetherToCollectData")
    public Result<?> determineWhetherToCollectData(@RequestParam(value = "managementNumber",defaultValue = "") String managementNumber, HttpServletRequest request) {
    public Result<?> determineWhetherToCollectData(@RequestParam(value = "managementNumber", defaultValue = "") String managementNumber, HttpServletRequest request) {
        return deviceService.determineWhetherToCollectData(managementNumber, request);
    }
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.dto.DeviceConfigDtoPage;
import com.ruoyi.device.pojo.DataConfig;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -18,5 +19,7 @@
    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
    List<DeviceConfigDtoPage> selectDataConfigListTwo(@Param("deviceName")String deviceName,@Param("managementNumber")String managementNumber);
    List<Integer> deleteDataConfig();
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java
@@ -77,4 +77,17 @@
    @TableField(select = false, exist = false)
    private Boolean isDevice;
    @TableField(select = false, exist = false)
    private String deviceName;
    @TableField(select = false, exist = false)
    private String managementNumber;
    @ApiModelProperty("进口通道")
    private String importedChannel;
    @ApiModelProperty("进口部位")
    private String importedParts;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java
@@ -180,10 +180,10 @@
    @ApiModelProperty("通道")
    private String channel;
    @ApiModelProperty("进口通道")
    private String importedChannel;
    @ApiModelProperty("进口部位")
    private String importedParts;
//    @ApiModelProperty("进口通道")
//    private String importedChannel;
//
//    @ApiModelProperty("进口部位")
//    private String importedParts;
}
cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java
@@ -20,4 +20,6 @@
    void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList);
    Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig);
    Result<?> queryDataAcquisitionConfigurationTwo(DataConfig dataConfig);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java
@@ -20,7 +20,7 @@
/**
 * <p>
 *  服务实现类
 * 服务实现类
 * </p>
 *
 * @author 江苏鵷雏网络科技有限公司
@@ -48,7 +48,7 @@
            Device device = new Device();
            BeanUtils.copyProperties(dataConfigList, device);
            List<String> channelList = dataConfigList.getChannel();
            if (channelList != null &&!channelList.isEmpty()) {
            if (channelList != null && !channelList.isEmpty()) {
                String channelString = String.join(",", channelList);
                device.setChannel(channelString);
            }
@@ -79,4 +79,10 @@
            return Result.success(deviceConfigDtoPages);
        }
    }
    @Override
    public Result<?> queryDataAcquisitionConfigurationTwo(DataConfig dataConfig) {
        List<DeviceConfigDtoPage> deviceConfigDtoPages = dataConfigMapper.selectDataConfigListTwo(dataConfig.getDeviceName(), dataConfig.getManagementNumber());
        return Result.success(deviceConfigDtoPages);
    }
}
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
@@ -48,7 +48,7 @@
            if (device.getFileType().equals(".xlsx")) {
                String url = device.getCollectUrl() + "\\" + sampleCode.replace("/", "");
                if (StringUtils.isNotBlank(dataConfig.get(0).getAnotherName())) {
                    url += dataConfig.get(0).getAnotherName() ;
                    url += dataConfig.get(0).getAnotherName();
                }
                url += ".xlsx";
                device.setCollectUrl(url);
@@ -86,7 +86,7 @@
        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() +")文件!");
                throw new ErrorException("未查询到文件!可能该路径(" + device.getCollectUrl() + ")下并没有所需(" + device.getFileType() + ")文件!");
            } else {
                throw new ErrorException(jsonObject.get("msg") + "");
            }
@@ -113,6 +113,9 @@
                case ".xlsx":
                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
                    break;
                case ".xls":
                    map = analysisXlsList(data, userMap, device, entrustCode, sampleCode);
                    break;
                case ".txt":
                    map = analysisTxt(data, userMap, device, entrustCode, sampleCode);
                    break;
@@ -133,6 +136,9 @@
                case ".png":
                    map = readPngString(data, userMap, device);
                    break;
                case ".pdf":
                    map = readPdfString(data, userMap, device);
                    break;
                default:
                    map = null;
                    break;
@@ -144,6 +150,42 @@
            }
            return map;
        }
    }
    private static Map<String, Object> readPdfString(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;
    }
    public static Map<String, Object> createFrequency(String entrustCode, String sampleCode, Map<String, Object> map) {
@@ -528,7 +570,33 @@
            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);
                list = analyzeXlsData(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;
    }
    /**
     * 取X定位
     *
     * @param data       采集到的文件字符串
     * @param dataConfig 用户配置好的x定位数据与参照物
     * @return
     */
    public static Map<String, Object> analysisXlsList(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 = analyzeXlsData(data, v, k, splitIdentifier);
                // 委托编号与样品编号存在
            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
                list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode);
@@ -569,7 +637,7 @@
                        if (aLine[j].contains(entrustCode)) {
                            entrustCodeY = j;
                        }
                        if (aLine[j].contains(sampleCode) ) {
                        if (aLine[j].contains(sampleCode)) {
                            sampleCodeY = j;
                        }
                        if (aLine[j].contains(refery)) {
@@ -588,7 +656,8 @@
                                list.add(result);
                            }
                        }
                    } catch (Exception e) {}
                    } catch (Exception e) {
                    }
                }
            }
        }
@@ -720,6 +789,72 @@
        return list;
    }
    public static List<Object> analyzeXlsData(String data, List<DataConfig> v, String k, String split) {
        List<Object> finalResult = new ArrayList<>(); // 最终返回的结果列表
        for (DataConfig config : v) {
            // 取用户配置的参照物
            String referx = getRefer(config.getReferx());
            if (ObjectUtils.isEmpty(referx)) {
                continue;
            }
            // 第一步:解析数据,找到符合条件的行(第二个分隔符前和冒号后为数字)
            List<String> validLines = new ArrayList<>();
            String[] lines = data.replaceAll(" ", "").split("\n");
            for (String line : lines) {
                String[] parts = line.split(split);
                if (parts.length > 1) {
                    // 检查第二个分隔符前面和冒号后面是否为数字
                    String beforeSplit = parts[1];
                    String afterColon = "";
                    if (beforeSplit.contains(":")) {
                        String[] colonParts = beforeSplit.split(":");
                        if (colonParts.length > 1) {
                            afterColon = colonParts[1].trim();
                        }
                    }
                    try {
                        Double.parseDouble(afterColon); // 冒号后是否为数字
                        validLines.add(line); // 如果符合条件,添加到临时列表中
                    } catch (NumberFormatException e) {
                        // 不符合数字条件,忽略
                    }
                }
            }
            // 第二步:从临时列表中提取包含 referx 的行,并获取其后面的数字值
            List<Object> result = new ArrayList<>();
            for (String line : validLines) {
                if (line.contains(referx)) {
                    String[] parts = line.split(referx);
                    if (parts.length > 1) {
                        String xValue = parts[1].trim();
                        // 提取 referx 后面到下一个分隔符之间的数字
                        String[] splitParts = xValue.split(split);
                        if (splitParts.length > 0) {
                            try {
                                String trim = splitParts[0].trim();
                                if (trim.contains(":")) {
                                    trim = trim.replaceAll(":", "");
                                }
                                Double.parseDouble(trim); // 判断是否为数字
                                result.add(trim);
                            } catch (NumberFormatException e) {
                                // 不是数字,忽略
                            }
                        }
                    }
                }
            }
            // 防止计算公式的时候出现:[null] 这种数据
            if (!result.isEmpty()) {
                finalResult.addAll(result);
            }
        }
        return finalResult;
    }
    public static String getFormatProcessing(String value) {
        value = value.replaceAll("%", "");
        if (value.contains("=")) {
cnas-device/src/main/resources/mapper/DataConfigMapper.xml
@@ -19,8 +19,6 @@
               d.storage_url,
               d.ip,
               d.port,
               d.imported_channel,
               d.imported_parts,
               d.channel,
               d.entrust_code,
               d.sample_code,
@@ -38,7 +36,9 @@
               ddc.another_name,
               ddc.matching_name,
               ddc.id,
               ip.id                                                                          structureItemParameterId
               ip.id                                                                          structureItemParameterId ,
               ddc.imported_parts,
               ddc.imported_channel
        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
@@ -51,4 +51,36 @@
                 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>
    <select id="selectDataConfigListTwo" resultType="com.ruoyi.device.dto.DeviceConfigDtoPage">
        SELECT d.device_name,
               d.file_type,
               d.collect_url,
               d.storage_url,
               d.ip,
               d.port,
               d.channel,
               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 ,
               ddc.imported_parts,
               ddc.imported_channel
        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.device_name = #{deviceName} and d.management_number = #{managementNumber}
    </select>
</mapper>