zss
2025-01-13 8d85246f061e3da623c7b9eb4e323ee724b4de0b
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
@@ -1,8 +1,7 @@
package com.yuanchu.mom.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -31,13 +30,11 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -59,12 +56,18 @@
    private DataConfigService dataConfigService;
    @Override
    public Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter) {
    public List<User> selectUserList() {
        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getDepartLimsId, "1"));
        return users;
    }
    @Override
    public Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter,Boolean laboratoryNameIsNull) {
        Map<String, Object> map = new HashMap<>();
        map.put("head", PrintChina.printChina(DeviceDto.class));
        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectDeviceParameter");
        if (map1.get("look") == 1) itemParameter.setCreateUser(map1.get("userId"));
        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter));
        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter),laboratoryNameIsNull);
        map.put("body", iPage);
        return map;
    }
@@ -109,17 +112,25 @@
    @Override
    public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass) {
        Integer id;
        List<Integer> id;
        try {
            if (ObjectUtils.isEmpty(inspectionItemSubclass)) {
                id = structureItemParameterMapper.selectOne(Wrappers.<StructureItemParameter>lambdaQuery()
//                id = structureItemParameterMapper.selectOne(Wrappers.<StructureItemParameter>lambdaQuery()
//                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
//                        .last("limit 1").select(StructureItemParameter::getId)).getId();
                id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
                        .last("limit 1").select(StructureItemParameter::getId)).getId();
                        .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
            }else {
                id = structureItemParameterMapper.selectOne(Wrappers.<StructureItemParameter>lambdaQuery()
//                id = structureItemParameterMapper.selectOne(Wrappers.<StructureItemParameter>lambdaQuery()
//                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
//                        .eq(StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
//                        .last("limit 1").select(StructureItemParameter::getId)).getId();
                id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
                        .eq(StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
                        .last("limit 1").select(StructureItemParameter::getId)).getId();
                        .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
            }
        } catch (Exception e) {
            return null;
@@ -131,9 +142,11 @@
        for (Device device : devices) {
            String[] ids = device.getInsProductIds().split(",");
            for (String i : ids) {
                if (i.equals(id + "")) {
                    devices2.add(device);
                    break;
                if (ObjectUtils.isNotEmpty(i)) {
                    if (id.contains(Integer.parseInt(i))) {
                        devices2.add(device);
                        break;
                    }
                }
            }
        }
@@ -176,11 +189,13 @@
                .orderBy(false, false, DataConfig::getId));
            list1.addAll(list);
        });
        // 3、采集,取数据,参与公式计算
        Map<String, Object> map = DataAcquisition.dataAcquisitionEntrance(list1, device.get(0), entrustCode, sampleCode, ip);
        // 4、造循环次数
        List<DataConfig> collect = list1.stream().distinct().collect(Collectors.toList());
        // 3、采集,取数据
        Map<String, Object> map = DataAcquisition.dataAcquisitionEntrance(collect, device.get(0), entrustCode, sampleCode, ip);
        // 4、造循环次数,参与公式计算
        if (ObjectUtils.isNotEmpty(map)) {
            return Result.success(DataAcquisition.createFrequency(entrustCode, sampleCode, map));
            Map<String, Object> frequency = DataAcquisition.createFrequency(entrustCode, sampleCode, map);
            return Result.success(frequency);
        } else {
            return Result.success(null);
        }
@@ -966,10 +981,6 @@
    @Override
    public List<Map<String, Object>> treeDevice(String deviceName) {
        List<Map<String, Object>>  listMap = deviceMapper.treeDevice(deviceName);
       /* Map<String, List<Device>> listMap = devices.stream()
                .collect(Collectors.groupingBy(device ->
                        device.getLargeCategory() != null ? device.getLargeCategory() : "其他"
                ));*/
        return listMap;
    }
@@ -977,7 +988,6 @@
    public Result<?> determineWhetherToCollectData(String managementNumber, HttpServletRequest request) {
        String ip = DataAcquisition.getIp(request);
        Device device = baseMapper.selectOne(Wrappers.<Device>lambdaQuery()
                .eq(Device::getManagementNumber, managementNumber)
                .eq(Device::getIp, ip));
        if (ObjectUtils.isEmpty(device)) {
            return Result.success(false);
@@ -987,169 +997,5 @@
        } else {
            return Result.success(true);
        }
    }
    @Override
    public Object formulaCalculation(Map<String, Object> map) {
        map.forEach((key, value) -> {
            Map<String, Object> jsonObject = JSONObject.parseObject(JSON.toJSONString(map.get(key)), Map.class);
            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                String sonKey = entry.getKey();
                Object sonValue = entry.getValue();
                if (!sonKey.equals("frequency")) {
                    Map<String, Object> formulaData = JSONObject.parseObject(JSON.toJSONString(sonValue), Map.class);
                    if (formulaData.containsKey("result") && formulaData.containsKey("isCalculation") &&
                    formulaData.containsKey("formula")) {
                        String formula = formulaData.get("formula").toString();
                        Boolean isCalculation = Boolean.valueOf(formulaData.get("isCalculation").toString());
                        if (isCalculation) {
                            List<Object> resultList = new ArrayList<>();
                            try {
                                resultList = JSONObject.parseArray(JSON.toJSONString(formulaData.get("result")), Object.class);
                            } catch (Exception e) {
                                Object result = formulaData.get("result").toString();
                                resultList.add(result);
                            }
                            ArrayList<Object> list = new ArrayList<>();
                            resultList.forEach(i -> {
                                List<Object> strings = Arrays.asList(i.toString().split(","));
                                String result = calculationFormula(strings, formula);
                                list.add(result);
                            });
                            formulaData.put("isCalculation", false);
                            formulaData.put("result", list);
                        }
                    }
                    jsonObject.put(sonKey, formulaData);
                }
            }
            map.put(key, jsonObject);
        });
        return map;
    }
    public String calculationFormula(List<Object> list, String formula) {
            //首先将list转换为bigdecmic
            List<BigDecimal> bigDecimalList = list.stream()
                    .map(obj -> {
                        return new BigDecimal((obj).toString());
                    }).collect(Collectors.toList());
            System.out.println(bigDecimalList);
            //将中文的(转换英文的())
            formula = formula.replace("(", "(")
                    .replace(")", ")")
                    .replace(",", ",");
            //然后提取公式
            String strs = formula.substring(0, formula.indexOf("("));
            String upperStr = strs.toUpperCase();
            if (upperStr.matches(".*\\d.*")) {
                upperStr = "";
            }
            System.out.println(upperStr);
            //然后获取最外面括号里面的值,再根据","分割
            int start = formula.indexOf("(");
            int end = -1;
            int a = 0;
            for (int i = start; i < formula.length(); i++) {
                char c = formula.charAt(i);
                if (c == '(') {
                    a++;
                } else if (c == ')') {
                    a--;
                    if (a == 0) {
                        end = i;
                    }
                }
            }
            if (start == -1 || end == -1) {
                throw new ErrorException("公式括号不匹配: " + formula);
            }
            String argumentsStr = formula.substring(start + 1, end);
            List<String> arguments = new ArrayList<>();
            int bracketCount = 0;
            StringBuilder currentArgument = new StringBuilder();
            for (char c : argumentsStr.toCharArray()) {
                if (c == ',' && bracketCount == 0) {
                    arguments.add(currentArgument.toString());
                    currentArgument.setLength(0);
                } else {
                    if (c == '(') bracketCount++;
                    if (c == ')') bracketCount--;
                    currentArgument.append(c);
                }
            }
            arguments.add(currentArgument.toString());
            String[] bracketStrs = arguments.toArray(new String[0]);
            List<BigDecimal> results = new ArrayList<>();
            for (String expr : bracketStrs) {
                System.out.println("替换前" + expr);
                Pattern pattern = Pattern.compile("([A-Z])(\\d+)");
                Matcher matcher = pattern.matcher(expr);
                StringBuffer sb = new StringBuffer();
                while (matcher.find()) {
                    String letter = matcher.group(1);
                    int index = Integer.parseInt(matcher.group(2)) - 1; // 将1-based转为0-based
                    if (index < bigDecimalList.size()) {
                        matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
                    } else {
                        throw new RuntimeException("公式中的下标 " + index + " 超出范围");
                    }
                }
                matcher.appendTail(sb);
                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;
            if (upperStr.equals("") || upperStr == null) {
                finalResult = results.get(0);
            } else {
                switch (upperStr) {
                    case "MAX":
                        finalResult = results.stream().max(BigDecimal::compareTo)
                                .orElseThrow(() -> new IllegalArgumentException("无法计算MAX值"));
                        break;
                    case "MIN":
                        finalResult = results.stream().min(BigDecimal::compareTo)
                                .orElseThrow(() -> new IllegalArgumentException("无法计算MIN值"));
                        break;
                    case "SUM":
                        finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
                        break;
                    case "ABS":
                        finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add);
                        break;
                    case "AVERAGE":
                        finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide)
                                .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP);
                        break;
                    case "MEDIAN":
                        int size = results.size();
                        if (size % 2 == 1) {
                            finalResult = results.get(size / 2);
                        } else {
                            BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2));
                            finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
                        }
                        break;
                    default:
                        throw new UnsupportedOperationException("暂不支持函数: " + upperStr);
                }
            }
            System.out.println(results);
            System.out.println("计算结果: " + finalResult);
            return finalResult.toString();
            // 否则:没有公式代表不需要计算,直接提取List里面的数据
    }
}