From d6520e90ce34127c0a994e22e3fb54767aebecc0 Mon Sep 17 00:00:00 2001
From: Crunchy <3114200645@qq.com>
Date: 星期六, 03 八月 2024 15:06:38 +0800
Subject: [PATCH] 数采bug修复
---
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 205 insertions(+), 9 deletions(-)
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
index 0d8377b..8be96b1 100644
--- a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
@@ -2,7 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -31,11 +31,13 @@
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.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -149,6 +151,7 @@
String ip = DataAcquisition.getIp(request);
List<Device> device = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
.eq(Device::getIp, ip));
+ // 1銆佹楠�
if(device.size() > 1) {
String str = "";
for (Device device1 : device) {
@@ -163,6 +166,7 @@
if (ObjectUtils.isEmpty(device.get(0).getFileType()) || ObjectUtils.isEmpty(device.get(0).getCollectUrl())) {
throw new ErrorException("鏈粰璇ワ細" + device.get(0).getDeviceName() + "璁惧閰嶇疆閲囬泦璺緞鎴栨枃浠跺悗缂�锛�");
}
+ // 2銆佸彇璁惧鍏宠仈鐨勬楠岄」锛屾楠屽瓙椤�
List<DataConfig> list1 = new ArrayList<>();
inspectionItemSubclass.forEach(i -> {
List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
@@ -172,12 +176,21 @@
.orderBy(false, false, DataConfig::getId));
list1.addAll(list);
});
- Map<String, String> map = DataAcquisition.dataAcquisitionEntrance(list1, device.get(0), entrustCode, sampleCode, ip);
+ // 3銆侀噰闆嗭紝鍙栨暟鎹紝鍙備笌鍏紡璁$畻
+ Map<String, Object> map = DataAcquisition.dataAcquisitionEntrance(list1, device.get(0), entrustCode, sampleCode, ip);
+ // 4銆侀�犲惊鐜鏁�
if (ObjectUtils.isNotEmpty(map)) {
- String frequency = DataAcquisition.createFrequency(entrustCode, sampleCode);
- map.put("frequency", frequency);
+ 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);
+ } else {
+ return Result.success(null);
}
- return Result.success(map);
}
@Override
@@ -966,4 +979,187 @@
));*/
return listMap;
}
+
+ @Override
+ 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);
+ }
+ if (ObjectUtils.isEmpty(device.getFileType()) || ObjectUtils.isEmpty(device.getCollectUrl())) {
+ 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) {
+ //棣栧厛灏唋ist杞崲涓篵igdecmic
+ 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閲岄潰鐨勬暟鎹�
+ }
}
--
Gitblit v1.9.3