From a5b1bad21ba279ade3954852a5e281e9086042f0 Mon Sep 17 00:00:00 2001 From: zss <zss@example.com> Date: 星期二, 26 十一月 2024 15:22:52 +0800 Subject: [PATCH] 前端联调修改2.0 --- cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java | 282 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 207 insertions(+), 75 deletions(-) diff --git a/cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java b/cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java index 4f341f4..dff4725 100644 --- a/cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java +++ b/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.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; @@ -61,7 +64,11 @@ } JSONObject jsonObject = JSON.parseObject(result); if (Objects.equals(jsonObject.get("code"), 1)) { - throw new ErrorException(jsonObject.get("msg") + ""); + if (ObjectUtils.isEmpty(jsonObject.get("msg"))) { + throw new ErrorException("鏈煡璇㈠埌鏂囦欢锛佸彲鑳借璺緞锛�" + device.getCollectUrl() + "锛変笅骞舵病鏈夋墍闇�(" + device.getFileType() +")鏂囦欢锛�"); + } else { + throw new ErrorException(jsonObject.get("msg") + ""); + } } else { String data = jsonObject.get("data") + ""; // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁� @@ -85,10 +92,10 @@ map = analysisList(data, userMap, device, entrustCode, sampleCode); break; case ".mdb": - map = analysisMdb(data, userMap); + map = analysisMdb(data, userMap, device); break; case ".db": - map = analysisDb(data, userMap); + map = analysisDb(data, userMap, device); break; case ".png": map = readPngString(data, userMap, device); @@ -158,65 +165,7 @@ * @param dataConfig * @return */ - private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig) { - JSONObject jsonObject = JSON.parseObject(data); - Map<String, Object> map = new HashMap<>(); - if (jsonObject.isEmpty()) { - return map; - } - JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString()); - dataConfig.forEach((k, v) -> { - AtomicInteger numberOfDataEntries = new AtomicInteger(); - List<Object> list = new ArrayList<>(); - for (int config = 0; config < v.size(); config++) { - String refery = getRefer(v.get(config).getRefery()); - for (int i = 0; i < dataList.size(); i++) { - JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString()); - Object o = jsonObject1.get(refery); - if (ObjectUtils.isNotEmpty(o)) { - numberOfDataEntries.addAndGet(1); - // 灏忔暟鐐硅繘涓変綅 - double v1 = 0; - try { - v1 = Double.parseDouble(o.toString()); - double v2 = v1 / 1000; - list.add(v2); - } catch (NumberFormatException e) { - list.add(o); - } - } - } - } - // 鎷兼帴鏁伴噰閰嶇疆 - List<Object> result = new ArrayList<>(); - for (int i = 0; i < numberOfDataEntries.get(); i++) { - String aggregate = ""; - for (int j = 0; j < v.size(); j++) { - int index; - if (j == 0) { - index = i; - } else { - index = numberOfDataEntries.get() + i; - } - aggregate += list.get(index).toString() + ","; - } - int lastIndex = aggregate.lastIndexOf(","); - String substring = aggregate.substring(0, lastIndex); - result.add(substring); - } - // 杩涜鍏紡璁$畻 - Object resultValue = calculationFormula(result, v.get(0), k); - map.put(k, resultValue); - }); - return map; - } - - /** - * @param data - * @param dataConfig - * @return - */ - private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig) { + private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, Device device) { JSONObject jsonObject = JSON.parseObject(data); Map<String, Object> map = new HashMap<>(); if (jsonObject.isEmpty()) { @@ -255,7 +204,57 @@ result.add(substring); } // 杩涜鍏紡璁$畻 - Object resultValue = calculationFormula(result, v.get(0), k); + Object resultValue = calculationFormula(result, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + /** + * @param data + * @param dataConfig + * @return + */ + private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, Device device) { + JSONObject jsonObject = JSON.parseObject(data); + Map<String, Object> map = new HashMap<>(); + if (jsonObject.isEmpty()) { + return map; + } + JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString()); + dataConfig.forEach((k, v) -> { + AtomicInteger numberOfDataEntries = new AtomicInteger(); + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + String refery = getRefer(v.get(config).getRefery()); + for (int i = 0; i < dataList.size(); i++) { + JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString()); + Object o = jsonObject1.get(refery); + if (ObjectUtils.isNotEmpty(o)) { + numberOfDataEntries.addAndGet(1); + list.add(o); + } + } + } + // 鎷兼帴鏁伴噰閰嶇疆 + List<Object> result = new ArrayList<>(); + for (int i = 0; i < numberOfDataEntries.get(); i++) { + String aggregate = ""; + for (int j = 0; j < v.size(); j++) { + int index; + if (j == 0) { + index = i; + } else { + index = numberOfDataEntries.get() + i; + } + aggregate += list.get(index).toString() + ","; + } + int lastIndex = aggregate.lastIndexOf(","); + String substring = aggregate.substring(0, lastIndex); + result.add(substring); + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(result, v.get(0), k, device); map.put(k, resultValue); }); return map; @@ -300,7 +299,7 @@ } } // 杩涜鍏紡璁$畻 - Object resultValue = calculationFormula(list, v.get(0), k); + Object resultValue = calculationFormula(list, v.get(0), k, device); map.put(k, resultValue); }); return map; @@ -313,25 +312,39 @@ * @param dataConfig 瀛樺偍鍏紡鐨勫璞� * @return */ - private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem) { + private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) { if (list.size() == 0) { - return null; + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("equipName", device.getDeviceName()); + hashMap.put("equipValue", device.getManagementNumber()); + return hashMap; } + ArrayList<Object> listResult = new ArrayList<>(); Map<String, Object> hashMap = new HashMap<>(); // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻 if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) { - hashMap.put("isCalculation", true); - hashMap.put("formula", dataConfig.getFormula()); // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹� + if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) { + String s = calculationFormulaList(list, dataConfig.getFormula()); + listResult.add(s); + } else { + list.forEach(i -> { + List<Object> strings = Arrays.asList(i.toString().split(",")); + String s = calculationFormulaList(strings, dataConfig.getFormula()); + listResult.add(s); + }); + } } else { - hashMap.put("isCalculation", false); + listResult.addAll(list); } // 涓轰簡缁欏墠绔仛鏁版嵁鍖哄垎 - if (list.size() > 1) { - hashMap.put("result", list); + if (listResult.size() > 1) { + hashMap.put("result", listResult); } else { - hashMap.put("result", list.get(0).toString()); + hashMap.put("result", listResult.get(0).toString()); } + hashMap.put("equipName", device.getDeviceName()); + hashMap.put("equipValue", device.getManagementNumber()); return hashMap; } @@ -355,7 +368,7 @@ list = analyzeDataEntrustCodAndSampleCode(data, v, k, ",", device, entrustCode, sampleCode); } // 杩涜鍏紡璁$畻 - Object resultValue = calculationFormula(list, v.get(0), k); + Object resultValue = calculationFormula(list, v.get(0), k, device); map.put(k, resultValue); }); return map; @@ -383,7 +396,7 @@ list = analyzeDataEntrustCodAndSampleCode(processingDataAfterSpaces, v, k, splitIdentifier, device, entrustCode, sampleCode); } // 杩涜鍏紡璁$畻 - Object resultValue = calculationFormula(list, v.get(0), k); + Object resultValue = calculationFormula(list, v.get(0), k, device); map.put(k, resultValue); }); return map; @@ -409,7 +422,7 @@ list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode); } // 杩涜鍏紡璁$畻 - Object resultValue = calculationFormula(list, v.get(0), k); + Object resultValue = calculationFormula(list, v.get(0), k, device); map.put(k, resultValue); }); return map; @@ -613,4 +626,123 @@ // 闃叉鍥炵幆鍦板潃鍙樹负IPv6 return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress; } + + public static String calculationFormulaList(List<Object> list, String formula) { + //棣栧厛灏唋ist杞崲涓篵igdecmic + List<BigDecimal> bigDecimalList = list.stream() + .map(obj -> { + return new BigDecimal((obj).toString()); + }).collect(Collectors.toList()); + + //灏嗕腑鏂囩殑(杞崲鑻辨枃鐨�()) + formula = formula.replace("锛�", "(") + .replace("锛�", ")") + .replace("锛�", ","); + //鐒跺悗鎻愬彇鍏紡 + String strs = formula.substring(0, formula.indexOf("(")); + String upperStr = strs.toUpperCase(); + if (upperStr.matches(".*\\d.*")) { + 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) { + 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); + + // 璁$畻琛ㄨ揪寮� + 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); + } + } + + return finalResult.toString(); + // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹� + } } -- Gitblit v1.9.3