zss
2024-07-26 ff4d45d57c3d1a1c8d4218dd83023cb7e4c34d7e
Merge remote-tracking branch 'origin/master'
已修改12个文件
240 ■■■■ 文件已修改
cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/mapper/DataConfigMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/pojo/Device.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/DataConfigService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DataConfigServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/resources/mapper/DataConfigMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/mapper/InsOrderMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java
@@ -8,7 +8,6 @@
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;
@@ -198,11 +197,6 @@
    @PostMapping("/saveDataAcquisitionConfiguration")
    public Result<?> saveDataAcquisitionConfiguration(@RequestParam(value = "deviceId") Integer deviceId, @RequestBody DataConfigDto dataConfigList) {
        if (dataConfigList.getIsDevice()) {
            Device one = deviceService.getOne(Wrappers.<Device>lambdaQuery()
                    .eq(Device::getIp, dataConfigList.getIp()));
            if (ObjectUtils.isNotEmpty(one)) {
                throw new ErrorException("该IP:" + dataConfigList.getIp() + "已经绑定了设备:" + one.getDeviceName());
            }
            Device device = new Device();
            device.setId(deviceId);
            device.setCollectUrl(dataConfigList.getCollectUrl());
cnas-server/src/main/java/com/yuanchu/mom/mapper/DataConfigMapper.java
@@ -18,5 +18,5 @@
    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
    List<DataConfig> deleteDataConfig();
    List<Integer> deleteDataConfig();
}
cnas-server/src/main/java/com/yuanchu/mom/pojo/Device.java
@@ -119,19 +119,25 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("文件后缀")
    @ApiModelProperty("数采-文件后缀")
    private String fileType;
    @ApiModelProperty("采集地址")
    @ApiModelProperty("数采-采集地址")
    private String collectUrl;
    @ApiModelProperty("存储地址")
    @ApiModelProperty("数采-存储地址")
    private String storageUrl;
    @ApiModelProperty("设备IP")
    @ApiModelProperty("数采-设备IP")
    private String ip;
    @ApiModelProperty("是否为数采设备")
    @ApiModelProperty("数采-是否为数采设备")
    @TableField(exist = false)
    private Boolean isItADataAcquisitionDevice;
    @ApiModelProperty("数采-委托字段")
    private String mdbEntrustCode;
    @ApiModelProperty("数采-样品字段")
    private String mdbSampleCode;
}
cnas-server/src/main/java/com/yuanchu/mom/service/DataConfigService.java
@@ -18,5 +18,5 @@
    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
    List<DataConfig> deleteDataConfig();
    void deleteDataConfig();
}
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DataConfigServiceImpl.java
@@ -32,7 +32,10 @@
    }
    @Override
    public List<DataConfig> deleteDataConfig() {
        return dataConfigMapper.deleteDataConfig();
    public void deleteDataConfig() {
        List<Integer> integers = dataConfigMapper.deleteDataConfig();
        if (!integers.isEmpty()) {
            dataConfigMapper.deleteBatchIds(integers);
        }
    }
}
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
@@ -150,7 +150,11 @@
        List<Device> device = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
                .eq(Device::getIp, ip));
        if(device.size() > 1) {
            throw new ErrorException("IP:" + ip + "配置了设备多个设备,无法进行数采!");
            String str = "";
            for (Device device1 : device) {
                str += device1.getDeviceName() + ",";
            }
            throw new ErrorException("IP:" + ip + "配置了设备多个设备:" + str + ",无法进行数采!");
        }
        if (ObjectUtils.isEmpty(device)) {
            throw new ErrorException("未给该IP:" + ip + "配置设备,无法进行数采!");
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java
@@ -10,7 +10,10 @@
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.pojo.Device;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -27,6 +30,7 @@
    private static final String splitIdentifier = "@-@"; // 自定义唯一标识分割符
    public static final String frequency = "frequency";
    /**
     * 数采入口
     *
@@ -35,11 +39,21 @@
     * @return
     */
    public static Map<String, String> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip) {
        /**
         * filePath 文件采集路径
         * fileExtension 文件后缀
         * entrustCode 委托编号
         * sampleCode 样品编号
         * mdbEntrustCode mdb文件需要:委托编号字段
         * mdbSampleCode mdb文件需要:样品编号字段
         */
        String http = HTTP + ip + GETFILE +
                "?filePath=" + device.getCollectUrl() +
                "&fileExtension=" + device.getFileType() +
                "&entrustCode=" + entrustCode +
                "&sampleCode=" + sampleCode;
                "&sampleCode=" + sampleCode +
                "&mdbEntrustCode=" + device.getMdbEntrustCode() +
                "&mdbSampleCode=" + device.getMdbSampleCode();
        String result = null;
        try {
            result = HttpUtil.get(http);
@@ -77,10 +91,10 @@
                    map = analysisList(data, userMap);
                    break;
                case ".mdb":
                    map = analysisMdb(data, userMap, entrustCode, sampleCode);
                    map = analysisMdb(data, userMap);
                    break;
                case ".db":
                    map = analysisDb(data, userMap, entrustCode, sampleCode);
                    map = analysisDb(data, userMap);
                    break;
                case ".png":
                    map = readPngString(data, userMap);
@@ -120,21 +134,22 @@
     * @param dataConfig
     * @return
     */
    private static Map<String, String> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, String entrustCode, String sampleCode) {
    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());
        Map<String, String> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = getRefer(v.get(config).getReferx());
                for (int i = 0; i < dataList.size(); i++) {
                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                    if (entrustCode.equals(jsonObject1.get("ExtInfo_Value1"))) {
                        Object o = jsonObject1.get(referx);
                        if (ObjectUtils.isNotEmpty(o)) {
                            list.add(o);
                        }
                    Object o = jsonObject1.get(referx);
                    if (ObjectUtils.isNotEmpty(o)) {
                        list.add(o);
                    }
                }
            }
@@ -146,27 +161,26 @@
    }
    /**
     * 需要通过X,Y轴定位
     *
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, String> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, String entrustCode, String sampleCode) {
    private static Map<String, String> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig) {
        JSONObject jsonObject = JSON.parseObject(data);
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        Map<String, String> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = getRefer(v.get(config).getReferx());
                for (int i = 0; i < dataList.size(); i++) {
                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                    if (entrustCode.equals(jsonObject1.get("OrderNumber")) && sampleCode.equals(jsonObject1.get("SampleNumber"))) {
                        Object o = jsonObject1.get(referx);
                        if (ObjectUtils.isNotEmpty(o)) {
                            list.add(o);
                        }
                    Object o = jsonObject1.get(referx);
                    if (ObjectUtils.isNotEmpty(o)) {
                        list.add(o);
                    }
                }
            }
@@ -235,8 +249,136 @@
        }
        // 如果不为空,进行公式计算
        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
            String formula = dataConfig.getFormula();
            //首先将list转换为bigdecmic
            List<BigDecimal> bigDecimalList = list.stream()
                    .map(obj -> {
                        return new BigDecimal((obj).toString());
                    }).collect(Collectors.toList());
            System.out.println(bigDecimalList);
            return null;
            //将中文的(转换英文的())
            formula = formula.replace("(", "(")
                    .replace(")", ")")
                    .replace(",", ",");
            //然后提取英文字母,全部转换为大写
            String[] strs = formula.split("[^A-Za-z]+");
            String upperStr = "";
            for (String str : strs) {
                upperStr += str.toUpperCase();
            }
            if (upperStr.equals("")) {
                throw new ErrorException(formula + "里面的公式没有函数");
            }
            //然后获取最外面括号里面的值,再根据","分割
            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 inner = formula.substring(start + 1, end);
            List<String> arguments = new ArrayList<>();
            int depth = 0;
            StringBuilder currentArgument = new StringBuilder();
            for (
                    char c : inner.toCharArray()) {
                if (c == ',' && depth == 0) {
                    arguments.add(currentArgument.toString());
                    currentArgument.setLength(0);
                } else {
                    if (c == '(') {
                        depth++;
                    } else if (c == ')') {
                        depth--;
                    }
                    currentArgument.append(c);
                }
            }
            arguments.add(currentArgument.toString());
            String[] bracketStrs = arguments.toArray(new String[0]);
            List<BigDecimal> results = new ArrayList<>();
            for (
                    String expr : bracketStrs) {
                System.out.println("替换前" + expr);
                Pattern pattern = Pattern.compile("\\b\\d+\\b");
                Matcher matcher = pattern.matcher(expr);
                StringBuffer sb = new StringBuffer();
                while (matcher.find()) {
                    int index = Integer.parseInt(matcher.group()) - 1;
                    if (index < bigDecimalList.size()) {
                        matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
                    } else {
                        throw new ErrorException("表达式中的下标 " + index + " 超出范围");
                    }
                }
                matcher.appendTail(sb);
                System.out.println("替换后" + sb.toString());
                //计算
                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;
            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;
                case "RANGE":
                    finalResult = results.stream().max(BigDecimal::compareTo)
                            .orElseThrow(() -> new IllegalArgumentException("无法计算RANGE值"))
                            .subtract(results.stream().min(BigDecimal::compareTo)
                                    .orElseThrow(() -> new IllegalArgumentException("无法计算RANGE值")));
                    break;
                default:
                    throw new UnsupportedOperationException("暂不支持函数: " + upperStr);
            }
            System.out.println(results);
            System.out.println("计算结果: " + finalResult);
            return finalResult.toString();
            // 否则:没有公式代表不需要计算,直接提取List里面的数据
        } else {
            // 这里只会取列表第一个数据
@@ -381,10 +523,10 @@
    public static String getFormatProcessing(String value) {
        value = value.replaceAll("%", "");
        if(value.contains("=")){
        if (value.contains("=")) {
            String[] split = value.split("=");
            return split[split.length - 1];
        } else if(value.contains(":")) {
        } else if (value.contains(":")) {
            String[] split = value.split(":");
            return split[split.length - 1];
        } else {
cnas-server/src/main/resources/mapper/DataConfigMapper.xml
@@ -35,8 +35,8 @@
        where d.id = #{deviceId}
    </select>
    <select id="deleteDataConfig" resultType="com.yuanchu.mom.pojo.DataConfig">
        SELECT ddc.*
    <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
inspect-server/src/main/java/com/yuanchu/mom/controller/InsOrderPlanController.java
@@ -121,7 +121,7 @@
        return num == 1 ? Result.success() : Result.fail("提交失败,部分项目还未进行检验");
    }
    @ValueClassify("检验任务")
    @ValueClassify("设备")
    @ApiOperation(value = "是否允许修改采集值")
    @DeleteMapping("/isItAllowedToModifyTheCollectedValues")
    public Result<?> isItAllowedToModifyTheCollectedValues() {
inspect-server/src/main/java/com/yuanchu/mom/mapper/InsOrderMapper.java
@@ -56,5 +56,6 @@
    Map<String, Object> getDeviceMessage(@Param("ip")String ip,
                                         @Param("inspectionItem") String inspectionItem,
                                         @Param("inspectionItemSubclass") String inspectionItemSubclass);
                                         @Param("inspectionItemSubclass") String inspectionItemSubclass,
                                         @Param("sample") String sample);
}
inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java
@@ -227,7 +227,7 @@
        // 防止回环地址变为IPv6
        String ip =  ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
        insProducts.forEach(i -> {
            Map<String, Object> devices = baseMapper.getDeviceMessage(ip, i.getInspectionItem(), i.getInspectionItemSubclass());
            Map<String, Object> devices = baseMapper.getDeviceMessage(ip, i.getInspectionItem(), i.getInspectionItemSubclass(), i.getSampleType());
            if (ObjectUtils.isNotEmpty(devices) && ObjectUtils.isNotEmpty(devices.get("file_type")) && ObjectUtils.isNotEmpty(devices.get("collect_url"))) {
                InsProductResult insProductResult = i.getInsProductResult();
                if (ObjectUtils.isEmpty(insProductResult)) {
inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -462,6 +462,9 @@
        FROM
            device d,
            device_data_config ddc
        <if test="sample != '' and sample != null">
            inner join structure_item_parameter sip on sip.sample like concat('%', #{sample}, '%') and sip.id = ddc.structure_item_parameter_id
        </if>
        where d.ip = #{ip}
          and ddc.inspection_item = #{inspectionItem}
            <if test="inspectionItemSubclass != '' and inspectionItemSubclass != null">
@@ -469,5 +472,6 @@
            </if>
          and d.device_status = 0
          and d.ins_product_ids is not null
        limit 1
    </select>
</mapper>