zss
2024-07-22 c0fd46ed9c7ddf7a3ea4e6a972474e9a62c68a1a
Merge remote-tracking branch 'origin/master'
已修改15个文件
已添加1个文件
586 ■■■■■ 文件已修改
cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/dto/DataConfigDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceConfigDtoPage.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/mapper/DataConfigMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/pojo/Device.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/DataConfigService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DataConfigServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java 322 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/resources/mapper/DataConfigMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/resources/mapper/DeviceMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java
@@ -8,12 +8,10 @@
import com.yuanchu.mom.annotation.ValueClassify;
import com.yuanchu.mom.dto.DataConfigDto;
import com.yuanchu.mom.dto.DeviceDto;
import com.yuanchu.mom.exception.ErrorException;
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.pojo.Device;
import com.yuanchu.mom.service.DataConfigService;
import com.yuanchu.mom.service.DeviceService;
import com.yuanchu.mom.utils.DataAcquisition;
import com.yuanchu.mom.utils.JackSonUtil;
import com.yuanchu.mom.vo.Result;
import io.swagger.annotations.Api;
@@ -28,9 +26,11 @@
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)表控制层
@@ -167,18 +167,10 @@
    @ValueClassify("设备")
    @ApiOperation("/数采-数据采集")
    @GetMapping("/dataCollection")
    public Result<?> text(HttpServletRequest request, @RequestParam("managementNumber") String managementNumber,
    public Result<?> dataAcquisition(HttpServletRequest request, @RequestParam("id") Integer id,
                          @RequestParam("entrustCode") String entrustCode,
                          @RequestParam("sampleCode") String sampleCode) {
        Device device = deviceService.getOne(Wrappers.<Device>lambdaQuery()
                .eq(Device::getManagementNumber, managementNumber));
        if (ObjectUtils.isEmpty(device.getFileType()) || ObjectUtils.isEmpty(device.getCollectUrl())) {
            throw new ErrorException("未给该:" + device.getDeviceName() + "设备配置采集路径或文件后缀!");
        }
        List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
                .eq(DataConfig::getDeviceId, device.getId())
                .orderBy(false, false, DataConfig::getId));
        return DataAcquisition.dataAcquisitionEntrance(request,list, device, entrustCode, sampleCode);
        return deviceService.dataAcquisition(request, id, entrustCode, sampleCode);
    }
    @ValueAuth
@@ -200,26 +192,54 @@
    @ValueClassify("设备")
    @ApiOperation(value = "维护数采配置")
    @PostMapping("/saveDataAcquisitionConfiguration")
    public Result<?> saveDataAcquisitionConfiguration(@RequestBody DataConfigDto dataConfigList) {
        dataConfigService.saveOrUpdateBatch(dataConfigList.getDataConfigList());
    public Result<?> saveDataAcquisitionConfiguration(@RequestParam(value = "deviceId") Integer deviceId, @RequestBody DataConfigDto dataConfigList) {
        if (dataConfigList.getIsDevice()) {
            Device device = new Device();
            device.setId(deviceId);
            device.setCollectUrl(dataConfigList.getCollectUrl());
            device.setStorageUrl(dataConfigList.getStorageUrl());
            device.setIp(dataConfigList.getIp());
            device.setFileType(device.getFileType());
            deviceService.updateById(device);
        } else {
            dataConfigService.saveOrUpdateBatch(dataConfigList.getDataConfigList());
        }
        return Result.success();
    }
//    @ValueClassify("设备")
//    @ApiOperation(value = "查询数采配置")
//    @GetMapping("/queryDataAcquisitionConfiguration")
//    public Result<?> queryDataAcquisitionConfiguration(@RequestParam("deviceId") Integer deviceId, @RequestParam("insProductItem") String insProductItem) {
//        List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
//                .eq(DataConfig::getDeviceId, deviceId)
//                .eq(DataConfig::getInsProductItem, insProductItem));
//        return Result.success(list);
//    }
    @ValueClassify("设备")
    @ApiOperation(value = "查询数采配置")
    @GetMapping("/queryDataAcquisitionConfiguration")
    public Result<?> queryDataAcquisitionConfiguration(@RequestParam("deviceId") Integer deviceId, @RequestParam("insProductItem") String insProductItem) {
        List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
    public Result<?> queryDataAcquisitionConfiguration(@RequestParam("deviceId") Integer deviceId,
                                                       @RequestParam("isDevice") Boolean isDevice,
                                                       @RequestParam(value = "insProductItem", required = false) String insProductItem) {
        if (isDevice) {
            List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
                .eq(DataConfig::getDeviceId, deviceId)
                .eq(DataConfig::getInsProductItem, insProductItem));
        return Result.success(list);
            return Result.success(list);
        } else {
            return Result.success(dataConfigService.selectDataConfigList(deviceId));
        }
    }
    @ValueClassify("设备")
    @ApiOperation(value = "删除数采配置")
    @DeleteMapping("/deleteDataAcquisitionConfiguration")
    public Result<?> deleteDataAcquisitionConfiguration(@RequestParam("id") Integer id) {
        dataConfigService.removeById(id);
    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();
    }
}
cnas-server/src/main/java/com/yuanchu/mom/dto/DataConfigDto.java
@@ -1,6 +1,7 @@
package com.yuanchu.mom.dto;
import com.yuanchu.mom.pojo.DataConfig;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@@ -9,4 +10,18 @@
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;
}
cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceConfigDtoPage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.yuanchu.mom.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.yuanchu.mom.annotation.ValueTableShow;
import com.yuanchu.mom.common.OrderBy;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceConfigDtoPage extends OrderBy {
    @ValueTableShow(2)
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ValueTableShow(3)
    @ApiModelProperty(value = "文件后缀")
    private String fileType;
    @ValueTableShow(4)
    @ApiModelProperty(value = "采集地址")
    private String collectUrl;
    @ValueTableShow(5)
    @ApiModelProperty(value = "存储地址")
    private String storageUrl;
    @ValueTableShow(6)
    @ApiModelProperty(value = "IP地址")
    private String ip;
    @ValueTableShow(7)
    @ApiModelProperty(value = "检验项")
    private String inspectionItem;
    @ValueTableShow(8)
    @ApiModelProperty(value = "检验项子项")
    private String inspectionItemSubClass;
    @ValueTableShow(9)
    @ApiModelProperty(value = "公式")
    private String formula;
    @ValueTableShow(10)
    @ApiModelProperty(value = "参照X")
    private String referx;
    @ValueTableShow(11)
    @ApiModelProperty(value = "X")
    private String x;
    @ValueTableShow(12)
    @ApiModelProperty(value = "参照Y")
    private String refery;
    @ValueTableShow(13)
    @ApiModelProperty(value = "Y")
    private String y;
    private Integer id;
}
cnas-server/src/main/java/com/yuanchu/mom/mapper/DataConfigMapper.java
@@ -1,7 +1,10 @@
package com.yuanchu.mom.mapper;
import com.yuanchu.mom.pojo.DataConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuanchu.mom.dto.DeviceConfigDtoPage;
import com.yuanchu.mom.pojo.DataConfig;
import java.util.List;
/**
 * <p>
@@ -13,4 +16,5 @@
 */
public interface DataConfigMapper extends BaseMapper<DataConfig> {
    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
}
cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java
@@ -32,5 +32,7 @@
    List<Device> selectDevicePrincipal();
    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers);
    List<String> getInspectionItemSubclass(@Param("id") Integer id);
}
cnas-server/src/main/java/com/yuanchu/mom/pojo/Device.java
@@ -131,4 +131,7 @@
    @ApiModelProperty("是否为数采设备")
    @TableField(exist = false)
    private Boolean isItADataAcquisitionDevice;
    @ApiModelProperty("设备IP")
    private String ip;
}
cnas-server/src/main/java/com/yuanchu/mom/service/DataConfigService.java
@@ -1,7 +1,10 @@
package com.yuanchu.mom.service;
import com.yuanchu.mom.pojo.DataConfig;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.mom.dto.DeviceConfigDtoPage;
import com.yuanchu.mom.pojo.DataConfig;
import java.util.List;
/**
 * <p>
@@ -13,4 +16,5 @@
 */
public interface DataConfigService extends IService<DataConfig> {
    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
}
cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java
@@ -3,9 +3,10 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.mom.dto.DeviceDto;
import com.yuanchu.mom.dto.DeviceDto1;
import com.yuanchu.mom.pojo.Device;
import com.yuanchu.mom.vo.Result;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@@ -33,4 +34,6 @@
    List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass);
    Device selectDeviceByCode(String code);
    Result<?> dataAcquisition(HttpServletRequest request, Integer id, String entrustCode, String sampleCode);
}
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DataConfigServiceImpl.java
@@ -1,10 +1,15 @@
package com.yuanchu.mom.service.impl;
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.mapper.DataConfigMapper;
import com.yuanchu.mom.service.DataConfigService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.mom.common.GetLook;
import com.yuanchu.mom.dto.DeviceConfigDtoPage;
import com.yuanchu.mom.mapper.DataConfigMapper;
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.service.DataConfigService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -15,6 +20,14 @@
 * @since 2024-07-13 12:23:00
 */
@Service
@AllArgsConstructor
public class DataConfigServiceImpl extends ServiceImpl<DataConfigMapper, DataConfig> implements DataConfigService {
    private GetLook getLook;
    private DataConfigMapper dataConfigMapper;
    @Override
    public List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId) {
        return dataConfigMapper.selectDataConfigList(deviceId);
    }
}
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
@@ -8,15 +8,22 @@
import com.yuanchu.mom.common.GetLook;
import com.yuanchu.mom.common.PrintChina;
import com.yuanchu.mom.dto.DeviceDto;
import com.yuanchu.mom.exception.ErrorException;
import com.yuanchu.mom.mapper.DeviceMapper;
import com.yuanchu.mom.mapper.StructureItemParameterMapper;
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.pojo.Device;
import com.yuanchu.mom.pojo.StructureItemParameter;
import com.yuanchu.mom.service.DataConfigService;
import com.yuanchu.mom.service.DeviceService;
import com.yuanchu.mom.utils.DataAcquisition;
import com.yuanchu.mom.utils.QueryWrappers;
import com.yuanchu.mom.vo.Result;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -34,6 +41,9 @@
    private DeviceMapper deviceMapper;
    private StructureItemParameterMapper structureItemParameterMapper;
    @Autowired
    private DataConfigService dataConfigService;
    @Override
    public Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter) {
@@ -123,5 +133,31 @@
    public Device selectDeviceByCode(String code) {
        return deviceMapper.selectOne(Wrappers.<Device>lambdaQuery().eq(Device::getFactoryNo, code).last("limit 1"));
    }
}
    @Override
    public Result<?> dataAcquisition(HttpServletRequest request, Integer id, String entrustCode, String sampleCode) {
        String ipAddress = request.getRemoteAddr();
        // é˜²æ­¢å›žçŽ¯åœ°å€å˜ä¸ºIPv6
        String ip = ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
        List<Device> device = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
                .eq(Device::getIp, ip));
        if (ObjectUtils.isEmpty(device)) {
            throw new ErrorException("未给该IP:" + ip + "配置设备,无法进行数采!");
        }
        List<String> inspectionItemSubclass = baseMapper.getInspectionItemSubclass(id);
        Map<String, String> hashMap = new HashMap<>();
        device.forEach(i -> {
            if (ObjectUtils.isEmpty(i.getFileType()) || ObjectUtils.isEmpty(i.getCollectUrl())) {
                throw new ErrorException("未给该:" + i.getDeviceName() + "设备配置采集路径或文件后缀!");
            }
            List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
                    .eq(DataConfig::getDeviceId, i.getId())
                    .in(DataConfig::getInsProductItem, inspectionItemSubclass)
                    .orderBy(false, false, DataConfig::getId));
            hashMap.putAll(DataAcquisition.dataAcquisitionEntrance(request, list, i, entrustCode, sampleCode, ip));
        });
        String frequency = DataAcquisition.createFrequency(entrustCode, sampleCode);
        hashMap.put("frequency", frequency);
        return Result.success(hashMap);
    }
}
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java
@@ -9,7 +9,6 @@
import com.yuanchu.mom.exception.ErrorException;
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.pojo.Device;
import com.yuanchu.mom.vo.Result;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@@ -27,17 +26,16 @@
    private static final String splitIdentifier = "@-@"; // è‡ªå®šä¹‰å”¯ä¸€æ ‡è¯†åˆ†å‰²ç¬¦
    public static final String frequency = "frequency";
    /**
     * æ•°é‡‡å…¥å£
     *
     * @param request
     * @param dataConfig
     * @param device
     * @return
     */
    public static Result<?> dataAcquisitionEntrance(HttpServletRequest request, List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode) {
        String ipAddress = request.getRemoteAddr();
        // é˜²æ­¢å›žçŽ¯åœ°å€å˜ä¸ºIPv6
        String ip = ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
    public static Map<String, String> dataAcquisitionEntrance(HttpServletRequest request, List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip) {
        String http = HTTP + ip + GETFILE + "?filePath=" + device.getCollectUrl() + "&fileExtension=" + device.getFileType();
        String result = null;
        try {
@@ -45,7 +43,7 @@
        } catch (IORuntimeException e) {
            throw new ErrorException("所在电脑未安装或未启动:LIMS文件采集器!");
        }
        JSONObject jsonObject =  JSON.parseObject(result);
        JSONObject jsonObject = JSON.parseObject(result);
        if (Objects.equals(jsonObject.get("code"), 1)) {
            if (ObjectUtils.isEmpty(jsonObject.get("msg"))) {
                throw new ErrorException("未查询到数据,可能文件路径配置错误!");
@@ -88,7 +86,7 @@
            if (ObjectUtils.isNotEmpty(device.getStorageUrl())) {
                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl();
                String storageUrlResult = HttpUtil.get(s);
                JSONObject storageUrlResultJson =  JSON.parseObject(storageUrlResult);
                JSONObject storageUrlResultJson = JSON.parseObject(storageUrlResult);
                if (Objects.equals(storageUrlResultJson.get("code"), 1)) {
                    if (ObjectUtils.isEmpty(storageUrlResultJson.get("msg"))) {
                        throw new ErrorException("存储地址错误,可能文件路径配置错误!");
@@ -97,10 +95,31 @@
                    }
                }
            }
            return Result.success(map);
            return map;
        }
    }
    public static String createFrequency(String entrustCode, String sampleCode) {
        String key = frequency + ":" + entrustCode + ":" + sampleCode;
        boolean b = RedisUtil.hasKey(key);
        String frequencyValue;
        if (b) {
            long incr = RedisUtil.incr(key, 1);
            frequencyValue = String.valueOf(incr);
        } else {
            RedisUtil.set(key, 1);
            frequencyValue = "1";
        }
        return frequencyValue;
    }
    /**
     * éœ€è¦é€šè¿‡X,Y轴定位
     *
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, String> analysisDb(String data, Map<String, List<DataConfig>> dataConfig) {
        JSONObject jsonObject = JSON.parseObject(data);
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
@@ -109,12 +128,9 @@
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                if(ObjectUtils.isEmpty(v.get(config).getX()) && ObjectUtils.isEmpty(v.get(config).getY())) {
                    throw new ErrorException("未给" + k + "进行数采配置x,y!");
                }
                int x = Integer.parseInt(v.get(config).getX());
                int y = Integer.parseInt(v.get(config).getY());
                String referx = getRefer(v.get(config).getReferx());
                int x = getXOrY(v.get(config).getX(), k, "X");
                int y = getXOrY(v.get(config).getY(), k, "Y");
                String key = "";
                for (int i = 0; i < columnList.size(); i++) {
                    if (columnList.get(i).equals(referx)) {
@@ -124,16 +140,32 @@
                JSONObject jsonObject1 = JSON.parseObject(dataList.get(y).toString());
                Object o = jsonObject1.get(key);
                if (ObjectUtils.isNotEmpty(o)) {
                    list.add(o);
                    // å°æ•°ç‚¹è¿›ä¸‰ä½
                    double v1 = 0;
                    try {
                        v1 = Double.parseDouble(o.toString());
                        double v2 = v1 / 1000;
                        list.add(v2);
                    } catch (NumberFormatException e) {
                        list.add(o);
                    }
                }
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0));
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * éœ€è¦é€šè¿‡X,Y轴定位
     *
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, String> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, String entrustCode, String sampleCode) {
        JSONObject jsonObject = JSON.parseObject(data);
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
@@ -142,8 +174,8 @@
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                int x = Integer.parseInt(v.get(config).getX());
                String referx = getRefer(v.get(config).getReferx());
                int x = getXOrY(v.get(config).getX(), k, "X");
                String key = "";
                for (int i = 0; i < columnList.size(); i++) {
                    if (columnList.get(i).equals(referx)) {
@@ -161,16 +193,18 @@
                }
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0));
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?");
    /**
     * è§£æžString数据
     * @param data é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * åªéœ€Xè½´
     *
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
@@ -179,15 +213,15 @@
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String xResult = null;
                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 = Integer.parseInt(v.get(config).getX());
                    int x = getXOrY(v.get(config).getX(), k, "X");
                    if (aColumnY[i].contains(addDataWithSpaces)) {
                        Matcher matcher = SPATTERN.matcher(aColumnY[i]);
                        while (matcher.find()) {
@@ -196,15 +230,15 @@
                        }
                    }
                    if (ObjectUtils.isNotEmpty(list1)) {
                        xResult = list1.get(x);
                        result = list1.get(x);
                    }
                }
                if (ObjectUtils.isNotEmpty(xResult)) {
                    list.add(xResult);
                if (ObjectUtils.isNotEmpty(result)) {
                    list.add(result);
                }
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0));
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
@@ -212,185 +246,171 @@
    /**
     * ä»Žæ–‡ä»¶ä¸­æå–出来的文字,如果有公式,进行公式计算,否则取列表第一个值
     * @param list æå–出的数字
     *
     * @param list       æå–出的数字
     * @param dataConfig å­˜å‚¨å…¬å¼çš„对象
     * @return
     */
    private static String calculationFormula(List<Object> list, DataConfig dataConfig) {
    private static String calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem) {
        if (list.size() == 0) {
            return null;
        }
        // å¦‚果不为空,进行公式计算
        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
            return null;
        // å¦åˆ™ï¼šæ²¡æœ‰å…¬å¼ä»£è¡¨ä¸éœ€è¦è®¡ç®—,直接提取List里面的数据
            // å¦åˆ™ï¼šæ²¡æœ‰å…¬å¼ä»£è¡¨ä¸éœ€è¦è®¡ç®—,直接提取List里面的数据
        } else {
            // è¿™é‡Œåªä¼šå–列表第一个数据
            if (list.size() > 0) {
            if (list.size() > 1) {
                throw new ErrorException("未给:" + insProductItem + " é…ç½®å…¬å¼ï¼Œå¯æ˜¯å´é‡‡é›†åˆ°äº†" + list.size() + "个值!分别为:" + list);
            } else {
                return list.get(0).toString();
            }
            return null;
        }
    }
    /**
     * è§£æžString数据
     * @param data é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     *
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, String> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig) {
        Map<String, String> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String refery = v.get(config).getRefery();
                String xResult = null;
                String yResult = null;
                // é€šè¿‡\n将字符串分割为行
                String[] aColumnY = data.split("\n");
                // è¯¥å¾ªçŽ¯å¾—å‡ºç”¨æˆ·é…ç½®çš„yè½´
                for (int i = 0; i < aColumnY.length; i++) {
                    // å¾—出用户配置的xè½´
                    String[] aLineX = aColumnY[i].split(",");
                    for (int j = 0; j < aLineX.length; j++) {
                        if (ObjectUtils.isNotEmpty(referx) && aLineX[j].contains(referx)) {
                            int x = Integer.parseInt(v.get(config).getX());
                            try {
                                xResult = aLineX[j + x];
                            } catch (Exception e) {
                                throw new ErrorException("数采配置X轴超出!");
                            }
                        }
                        if (ObjectUtils.isNotEmpty(refery) && aLineX[j].contains(refery)) {
                            int y = Integer.parseInt(v.get(config).getY());
                            try {
                                String[] split = aColumnY[i + y].split(",");
                                yResult = split[split.length - 1];
                            } catch (Exception e) {
                                throw new ErrorException("数采配置Y轴超出!");
                            }
                        }
                    }
                }
                if (ObjectUtils.isEmpty(xResult) && ObjectUtils.isEmpty(yResult)) {
                    throw new ErrorException("参照物为:" + referx + "与" + refery + "未取到值!请检查数采配置!");
                }
                list.add(yResult);
                list.add(xResult);
            }
            List<Object> list = analyzeData(data, v, k, ",");
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0));
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * è§£æžString数据
     * @param data é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, String> analysisString(String data, Map<String, List<DataConfig>> dataConfig) {
        String processingDataAfterSpaces = data.replaceAll("  +", splitIdentifier).replaceAll("\r", "");
        String processingDataAfterSpaces = data
                .replaceAll("  +", splitIdentifier)
                .replaceAll("\r", "")
                .replaceAll(" ", "");
        Map<String, String> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String xResult = null;
                // é€šè¿‡\n将字符串分割为行
                String[] aColumnY = processingDataAfterSpaces.split("\n");
                // è¯¥å¾ªçŽ¯å¾—å‡ºç”¨æˆ·é…ç½®çš„yè½´
                for (int i = 0; i < aColumnY.length; i++) {
                    // å¾—出用户配置的xè½´
                    String[] aLineX = aColumnY[i].split(splitIdentifier);
                    for (int j = 0; j < aLineX.length; j++) {
                        if (ObjectUtils.isNotEmpty(referx) && aLineX[j].replaceAll(" ", "").contains(referx.replaceAll(" ", ""))) {
                            int x = Integer.parseInt(v.get(config).getX());
                            try {
                                xResult = aLineX[j + x];
                            } catch (Exception e) {
                                throw new ErrorException("数采配置X轴超出!");
                            }
                        }
                    }
                }
                if (ObjectUtils.isEmpty(xResult)) {
                    throw new ErrorException("参照物为:" + referx + "未取到值!请检查数采配置!");
                }
                // ç»“果包含特殊字符,需要剔除掉
                if(xResult.contains("=")) {
                    String[] split = xResult.split("=");
                    list.add(split[split.length - 1]);
                } else if (xResult.contains(":")) {
                    String[] split = xResult.split(":");
                    list.add(split[split.length - 1].replaceAll("%", ""));
                } else {
                    list.add(xResult);
                }
            }
            List<Object> list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier);
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0));
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * è§£æžString数据
     * @param data é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * å–X,Y两个定位
     *
     * @param data       é‡‡é›†åˆ°çš„æ–‡ä»¶å­—符串
     * @param dataConfig ç”¨æˆ·é…ç½®å¥½çš„x,y轴定位数据与参照物
     * @return
     */
    public static Map<String, String> analysisList(String data, Map<String, List<DataConfig>> dataConfig) {
        Map<String, String> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String refery = v.get(config).getRefery();
                String xResult = null;
                String yResult = null;
                // é€šè¿‡\n将字符串分割为行
                String[] aColumnY = data.split("\n");
                // è¯¥å¾ªçŽ¯å¾—å‡ºç”¨æˆ·é…ç½®çš„yè½´
                for (int i = 0; i < aColumnY.length; i++) {
                    // å¾—出用户配置的xè½´
                    String[] aLineX = aColumnY[i].split(splitIdentifier);
                    for (int j = 0; j < aLineX.length; j++) {
                        if (ObjectUtils.isNotEmpty(referx) && referx.equals(aLineX[j])) {
                            int x = Integer.parseInt(v.get(config).getX());
                            try {
                                xResult = aLineX[j + x];
                            } catch (Exception e) {
                                throw new ErrorException("数采配置X轴超出!");
            // ç”¨æˆ·å¯èƒ½ç»™ä¸€ä¸ªå­é¡¹ç›®é…ç½®äº†å¤šä¸ªé…ç½®ï¼Œå³ä¸€ä¸ªé¡¹ç›®å–多个值,所以需要循环
            List<Object> list = analyzeData(data, v, k, splitIdentifier);
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    // ç”±äºŽåœ¨æ–¹æ³•中会大量的判断,所以做一个方法
    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(" ", "") : "";
    }
    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());
            // æœ€ç»ˆç»“æžœ
            String result = null;
            // é€šè¿‡\n将字符串分割为行
            String[] aColumnY = data.replaceAll(" ", "").split("\n");
            Integer end = null;
            // é‡‡é›†æ•°æ®ï¼šYè½´
            for (int i = 0; i < aColumnY.length; i++) {
                // å–x的值,防止报错
                int x = getXOrY(v.get(config).getX(), k, "X");
                // å¦‚æžœY与X用户都配置了则执行
                if (ObjectUtils.isNotEmpty(refery)) {
                    // å–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 = aLineX[j + x];
                                } catch (Exception e) {
                                    throw new ErrorException(k + ":X轴定位超出!");
                                }
                                break;
                            }
                        }
                        if (ObjectUtils.isNotEmpty(refery) && refery.equals(aLineX[j])) {
                            int y = Integer.parseInt(v.get(config).getY());
                            String aColumnData = aColumnY[i + y]; // èŽ·å–åˆ°ç¬¬Y行的数据
                    }
                    // å¦‚果只配置了X,则执行下面的代码
                } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) {
                    String[] aLineX = aColumnY[i].split(split);
                    for (int j = 0; j < aLineX.length; j++) {
                        if (aLineX[j].contains(referx)) {
                            try {
                                yResult = aColumnData.split(splitIdentifier)[j];
                                result = aLineX[j + x];
                            } catch (Exception e) {
                                throw new ErrorException("数采配置Y轴超出!");
                                throw new ErrorException(k + ":X轴定位超出!");
                            }
                        }
                    }
                }
                if (ObjectUtils.isEmpty(xResult) || ObjectUtils.isEmpty(yResult)) {
                    throw new ErrorException("X轴或Y轴未取到值!请检查数采配置!");
                }
                if(xResult.equals(yResult)) {
                    list.add(xResult);
                } else {
                    throw new ErrorException("X轴与Y轴取得的数据不相同!请检查数采配置!");
                }
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            String resultValue = calculationFormula(list, v.get(0));
            map.put(k, resultValue);
        });
        return map;
            // é˜²æ­¢è®¡ç®—公式的时候出现:[null] è¿™ç§æ•°æ®
            if (ObjectUtils.isNotEmpty(result)) {
                String formatProcessing = getFormatProcessing(result);
                list.add(formatProcessing);
            }
        }
        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;
        }
    }
}
cnas-server/src/main/resources/mapper/DataConfigMapper.xml
@@ -12,4 +12,27 @@
        <result column="y" property="y" />
    </resultMap>
    <select id="selectDataConfigList" resultType="com.yuanchu.mom.dto.DeviceConfigDtoPage">
        SELECT d.device_name,
               d.file_type,
               d.collect_url,
               d.storage_url,
               d.ip,
               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,
               ddc.formula,
               ddc.referx,
               ddc.refery,
               ddc.x,
               ddc.y,
               ddc.id
        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
                                                     if(ip.inspection_item_subclass is not null and
                                                        ip.inspection_item_subclass != '', ip.inspection_item_subclass,
                                                        ip.inspection_item) = ddc.ins_product_item
        where d.id = #{deviceId}
    </select>
</mapper>
cnas-server/src/main/resources/mapper/DeviceMapper.xml
@@ -117,4 +117,9 @@
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getInspectionItemSubclass" resultType="java.lang.String">
        SELECT ip.inspection_item_subclass FROM ins_product ip
        where ip.ins_sample_id = #{id}
    </select>
</mapper>
inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java
@@ -15,10 +15,7 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
@@ -111,8 +108,8 @@
    @ValueClassify("检验任务")
    @ApiOperation(value = "检验任务提交")
    @PostMapping("/submitPlan")
    public Result<?> submitPlan(Integer orderId, String laboratory, Integer verifyUser) {
        int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser);
    public Result<?> submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, String sampleCode) {
        int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser, entrustCode, sampleCode);
        return num == 1 ? Result.success() : Result.fail("提交失败,部分项目还未进行检验");
    }
inspect-server/src/main/java/com/yuanchu/mom/service/InsOrderPlanService.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.mom.dto.InsOrderPlanDTO;
import com.yuanchu.mom.dto.InsProductDto;
import com.yuanchu.mom.pojo.InsOrderFile;
import com.yuanchu.mom.pojo.InsProduct;
import org.springframework.web.multipart.MultipartFile;
@@ -28,7 +27,7 @@
    int verifyPlan(Integer orderId, String laboratory, Integer type, String tell);
    int submitPlan(Integer orderId, String laboratory, Integer verifyUser);
    int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, String sampleCode);
    List<InsProduct> getInsProduct(Integer id, Integer type, String laboratory);
inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java
@@ -33,6 +33,7 @@
import com.yuanchu.mom.utils.JackSonUtil;
import com.yuanchu.mom.utils.MatrixToImageWriter;
import com.yuanchu.mom.utils.QueryWrappers;
import com.yuanchu.mom.utils.RedisUtil;
import com.yuanchu.mom.vo.InsOrderPlanTaskSwitchVo;
import com.yuanchu.mom.vo.InsOrderPlanVO;
import com.yuanchu.mom.vo.ProductVo;
@@ -3387,7 +3388,7 @@
    }
    @Override
    public int submitPlan(Integer orderId, String laboratory, Integer verifyUser) {
    public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, String sampleCode) {
        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId).select(InsSample::getId));
        List<Integer> ids = insSamples.stream().map(a -> a.getId()).collect(Collectors.toList());
        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
@@ -3476,6 +3477,9 @@
            }
            return null;
        });
        // åˆ é™¤æ•°é‡‡é‡‡é›†æ¬¡æ•°
        String key = "frequency" + ":" + entrustCode + ":" + sampleCode;
        RedisUtil.del(key);
        return 1;
    }