From a0765e814de4526fdd4d949d7e34fcd7e8529ced Mon Sep 17 00:00:00 2001 From: Crunchy <3114200645@qq.com> Date: 星期五, 02 八月 2024 23:11:07 +0800 Subject: [PATCH] 数采调整·完成 --- cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java | 204 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 195 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..c78ea55 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,14 @@ .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); + return Result.success(DataAcquisition.createFrequency(entrustCode, sampleCode, map)); + } else { + return Result.success(null); } - return Result.success(map); } @Override @@ -966,4 +972,184 @@ ));*/ 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) { + 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(); + Boolean isCalculation = Boolean.valueOf(formulaData.get("isCalculation").toString()); + if (isCalculation) { + 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<>(); + 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