From ff4d45d57c3d1a1c8d4218dd83023cb7e4c34d7e Mon Sep 17 00:00:00 2001 From: zss <zss@example.com> Date: 星期五, 26 七月 2024 12:45:27 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java | 225 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 179 insertions(+), 46 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 d4e249a..2d8c1fb 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.regex.Matcher; import java.util.regex.Pattern; @@ -27,16 +30,30 @@ private static final String splitIdentifier = "@-@"; // 鑷畾涔夊敮涓�鏍囪瘑鍒嗗壊绗� public static final String frequency = "frequency"; + /** * 鏁伴噰鍏ュ彛 * - * @param request * @param dataConfig * @param device * @return */ - public static Map<String, String> dataAcquisitionEntrance(HttpServletRequest request, List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip) { - String http = HTTP + ip + GETFILE + "?filePath=" + device.getCollectUrl() + "&fileExtension=" + device.getFileType(); + 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 + + "&mdbEntrustCode=" + device.getMdbEntrustCode() + + "&mdbSampleCode=" + device.getMdbSampleCode(); String result = null; try { result = HttpUtil.get(http); @@ -54,7 +71,11 @@ } else { String data = jsonObject.get("data").toString(); // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁� - Map<String, List<DataConfig>> userMap = dataConfig.stream().collect(Collectors.groupingBy(DataConfig::getInsProductItem)); + Map<String, List<DataConfig>> userMap = dataConfig.stream() + .peek(i -> i.setInsProductItem( + i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? i.getInspectionItem() + "," : i.getInspectionItem() + "," + i.getInspectionItemSubclass() + )) + .collect(Collectors.groupingBy(DataConfig::getInsProductItem)); Map<String, String> map; switch (device.getFileType()) { case ".docx": @@ -70,7 +91,7 @@ map = analysisList(data, userMap); break; case ".mdb": - map = analysisMdb(data, userMap, entrustCode, sampleCode); + map = analysisMdb(data, userMap); break; case ".db": map = analysisDb(data, userMap); @@ -115,34 +136,21 @@ */ 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()); - JSONArray columnList = JSONArray.parseArray(jsonObject.get("column").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()); - int x = getXOrY(v.get(config).getX(), k, "X"); - int y = getXOrY(v.get(config).getY(), k, "Y"); - String key = ""; - for (int i = 0; i < columnList.size(); i++) { - if (columnList.get(i).equals(referx)) { - key = columnList.get(i + x).toString(); - } - } - JSONObject jsonObject1 = JSON.parseObject(dataList.get(y).toString()); - Object o = jsonObject1.get(key); - if (ObjectUtils.isNotEmpty(o)) { - // 灏忔暟鐐硅繘涓変綅 - double v1 = 0; - try { - v1 = Double.parseDouble(o.toString()); - double v2 = v1 / 1000; - list.add(v2); - } catch (NumberFormatException e) { + for (int i = 0; i < dataList.size(); i++) { + JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString()); + Object o = jsonObject1.get(referx); + if (ObjectUtils.isNotEmpty(o)) { list.add(o); } - } } // 杩涜鍏紡璁$畻 @@ -153,35 +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()); - JSONArray columnList = JSONArray.parseArray(jsonObject.get("column").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()); - int x = getXOrY(v.get(config).getX(), k, "X"); - String key = ""; - for (int i = 0; i < columnList.size(); i++) { - if (columnList.get(i).equals(referx)) { - key = columnList.get(i + x).toString(); - } - } 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(key); - if (ObjectUtils.isNotEmpty(o)) { - list.add(o); - } + Object o = jsonObject1.get(referx); + if (ObjectUtils.isNotEmpty(o)) { + list.add(o); } } } @@ -250,8 +249,136 @@ } // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻 if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) { + String formula = dataConfig.getFormula(); + //棣栧厛灏唋ist杞崲涓篵igdecmic + 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 { // 杩欓噷鍙細鍙栧垪琛ㄧ涓�涓暟鎹� @@ -396,14 +523,20 @@ 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 { return value; } } + + public static String getIp(HttpServletRequest request) { + String ipAddress = request.getRemoteAddr(); + // 闃叉鍥炵幆鍦板潃鍙樹负IPv6 + return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress; + } } -- Gitblit v1.9.3