| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | 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; |
| | | } |
| | |
| | | |
| | | @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; |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | .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)) { |
| | | Object result; |
| | | Map<String, Object> frequency = DataAcquisition.createFrequency(entrustCode, sampleCode, map); |
| | | if (ObjectUtils.isEmpty(device.get(0).getEntrustCode()) && ObjectUtils.isEmpty(device.get(0).getSampleCode())) { |
| | | result = formulaCalculation(frequency, true); |
| | | } else { |
| | | result = formulaCalculation(frequency, false); |
| | | } |
| | | return Result.success(result); |
| | | return Result.success(frequency); |
| | | } else { |
| | | return Result.success(null); |
| | | } |
| | |
| | | @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; |
| | | } |
| | | |
| | |
| | | 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); |
| | |
| | | } else { |
| | | return Result.success(true); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Object formulaCalculation(Map<String, Object> map, Boolean isAdopt) { |
| | | 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(); |
| | | 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<>(); |
| | | if (isAdopt) { |
| | | String result = calculationFormula(resultList, formula); |
| | | list.add(result); |
| | | } else { |
| | | 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里面的数据 |
| | | } |
| | | } |