From 4d9364da736f322cfeeec2815e83f2a3f6534223 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期二, 30 七月 2024 20:04:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 158 insertions(+), 22 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 066c05a..ab8db5b 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,6 +30,7 @@
private static final String splitIdentifier = "@-@"; // 鑷畾涔夊敮涓�鏍囪瘑鍒嗗壊绗�
public static final String frequency = "frequency";
+
/**
* 鏁伴噰鍏ュ彛
*
@@ -35,11 +39,21 @@
* @return
*/
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;
+ "&sampleCode=" + sampleCode +
+ "&mdbEntrustCode=" + device.getMdbEntrustCode() +
+ "&mdbSampleCode=" + device.getMdbSampleCode();
String result = null;
try {
result = HttpUtil.get(http);
@@ -77,10 +91,10 @@
map = analysisList(data, userMap);
break;
case ".mdb":
- map = analysisMdb(data, userMap, entrustCode, sampleCode);
+ map = analysisMdb(data, userMap);
break;
case ".db":
- map = analysisDb(data, userMap, entrustCode, sampleCode);
+ map = analysisDb(data, userMap);
break;
case ".png":
map = readPngString(data, userMap);
@@ -120,21 +134,22 @@
* @param dataConfig
* @return
*/
- private static Map<String, String> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, String entrustCode, String sampleCode) {
+ 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());
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());
for (int i = 0; i < dataList.size(); i++) {
JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
- if (entrustCode.equals(jsonObject1.get("ExtInfo_Value1"))) {
- Object o = jsonObject1.get(referx);
- if (ObjectUtils.isNotEmpty(o)) {
- list.add(o);
- }
+ Object o = jsonObject1.get(referx);
+ if (ObjectUtils.isNotEmpty(o)) {
+ list.add(o);
}
}
}
@@ -146,27 +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());
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());
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(referx);
- if (ObjectUtils.isNotEmpty(o)) {
- list.add(o);
- }
+ Object o = jsonObject1.get(referx);
+ if (ObjectUtils.isNotEmpty(o)) {
+ list.add(o);
}
}
}
@@ -235,8 +249,130 @@
}
// 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻
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;
+ default:
+ throw new UnsupportedOperationException("鏆備笉鏀寔鍑芥暟: " + upperStr);
+ }
+ System.out.println(results);
+ System.out.println("璁$畻缁撴灉: " + finalResult);
+
+ return finalResult.toString();
// 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
} else {
// 杩欓噷鍙細鍙栧垪琛ㄧ涓�涓暟鎹�
@@ -381,10 +517,10 @@
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 {
--
Gitblit v1.9.3