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>