From c0fd46ed9c7ddf7a3ea4e6a972474e9a62c68a1a Mon Sep 17 00:00:00 2001 From: zss <zss@example.com> Date: 星期一, 22 七月 2024 19:59:10 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java | 420 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 402 insertions(+), 18 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 7766817..d89a644 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 @@ -1,32 +1,416 @@ package com.yuanchu.mom.utils; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.pojo.DataConfig; -import com.yuanchu.mom.vo.Result; +import com.yuanchu.mom.pojo.Device; import javax.servlet.http.HttpServletRequest; -import java.util.List; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; public class DataAcquisition { private static final String HTTP = "http://"; - private static final String GETFILE = "/lims/getFile"; + private static final String GETFILE = ":9527/lims/getFile"; // 鑾峰彇鏂囦欢鎺ュ彛 - private static final String MOVEFILE = "/lims/moveFile"; + private static final String MOVEFILE = ":9527/lims/moveFile"; // 鏂囦欢绉诲姩鍦板潃 - public static Result<?> dataAcquisitionEntrance(HttpServletRequest request, List<DataConfig> dataConfig) { - String ipAddress = request.getRemoteAddr(); - // 闃叉鍥炵幆鍦板潃鍙樹负IPv6 - String ip = ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress; -// String http = HTTP + ip + GETFILE + "?filePath=" + dataConfig.get(0).getCollectUrl() + "&fileExtension=" + dataConfig.get(0).getFileType(); -// String result = HttpUtil.get(http); -// JSONObject jsonObject = JSON.parseObject(result); -// if (Objects.equals(jsonObject.get("code"), 1)) { -// throw new ErrorException(jsonObject.get("message").toString()); -// } else { -// Object data = jsonObject.get("data"); -// -// } - return null; + 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(); + String result = null; + try { + result = HttpUtil.get(http); + } catch (IORuntimeException e) { + throw new ErrorException("鎵�鍦ㄧ數鑴戞湭瀹夎鎴栨湭鍚姩锛歀IMS鏂囦欢閲囬泦鍣紒"); + } + JSONObject jsonObject = JSON.parseObject(result); + if (Objects.equals(jsonObject.get("code"), 1)) { + if (ObjectUtils.isEmpty(jsonObject.get("msg"))) { + throw new ErrorException("鏈煡璇㈠埌鏁版嵁锛屽彲鑳芥枃浠惰矾寰勯厤缃敊璇紒"); + } else { + System.out.println(jsonObject); + throw new ErrorException("鏈煡閿欒锛岃鑱旂郴绠$悊鍛橈紒"); + } + } else { + String data = jsonObject.get("data").toString(); + // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁� + Map<String, List<DataConfig>> userMap = dataConfig.stream().collect(Collectors.groupingBy(DataConfig::getInsProductItem)); + Map<String, String> map; + switch (device.getFileType()) { + case ".docx": + map = analysisString(data, userMap); + break; + case ".xlsx": + map = analysisList(data, userMap); + break; + case ".txt": + map = analysisTxt(data, userMap); + break; + case ".csv": + map = analysisList(data, userMap); + break; + case ".mdb": + map = analysisMdb(data, userMap, entrustCode, sampleCode); + break; + case ".db": + map = analysisDb(data, userMap); + break; + case ".png": + map = readPngString(data, userMap); + break; + default: + map = null; + break; + } + // 濡傛灉瀛樺湪瀛樺偍鍦板潃锛屽垯绉诲姩鍦板潃 + if (ObjectUtils.isNotEmpty(device.getStorageUrl())) { + String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl(); + String storageUrlResult = HttpUtil.get(s); + JSONObject storageUrlResultJson = JSON.parseObject(storageUrlResult); + if (Objects.equals(storageUrlResultJson.get("code"), 1)) { + if (ObjectUtils.isEmpty(storageUrlResultJson.get("msg"))) { + throw new ErrorException("瀛樺偍鍦板潃閿欒锛屽彲鑳芥枃浠惰矾寰勯厤缃敊璇紒"); + } else { + throw new ErrorException("鏈煡閿欒锛岃鑱旂郴绠$悊鍛橈紒"); + } + } + } + return map; + } + } + + public static String createFrequency(String entrustCode, String sampleCode) { + String key = frequency + ":" + entrustCode + ":" + sampleCode; + boolean b = RedisUtil.hasKey(key); + String frequencyValue; + if (b) { + long incr = RedisUtil.incr(key, 1); + frequencyValue = String.valueOf(incr); + } else { + RedisUtil.set(key, 1); + frequencyValue = "1"; + } + return frequencyValue; + } + + /** + * 闇�瑕侀�氳繃X,Y杞村畾浣� + * + * @param data + * @param dataConfig + * @return + */ + 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<>(); + 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) { + list.add(o); + } + + } + } + // 杩涜鍏紡璁$畻 + String resultValue = calculationFormula(list, v.get(0), k); + map.put(k, resultValue); + }); + return map; + } + + /** + * 闇�瑕侀�氳繃X,Y杞村畾浣� + * + * @param data + * @param dataConfig + * @return + */ + private static Map<String, String> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, String entrustCode, String sampleCode) { + 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<>(); + 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); + } + } + } + } + // 杩涜鍏紡璁$畻 + String resultValue = calculationFormula(list, v.get(0), k); + map.put(k, resultValue); + }); + return map; + } + + private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?"); + + /** + * 鍙渶X杞� + * + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + private static Map<String, String> readPngString(String data, Map<String, List<DataConfig>> dataConfig) { + Map<String, String> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + String referx = getRefer(v.get(config).getReferx()); + String result = null; + // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿 + String[] aColumnY = data.split("\n"); + List<String> list1 = new ArrayList<>(); + // 璇ュ惊鐜緱鍑虹敤鎴烽厤缃殑y杞� + for (int i = 0; i < aColumnY.length; i++) { + String addDataWithSpaces = referx.replaceAll("", " "); + int x = getXOrY(v.get(config).getX(), k, "X"); + if (aColumnY[i].contains(addDataWithSpaces)) { + Matcher matcher = SPATTERN.matcher(aColumnY[i]); + while (matcher.find()) { + String group = matcher.group(); + list1.add(group); + } + } + if (ObjectUtils.isNotEmpty(list1)) { + result = list1.get(x); + } + } + if (ObjectUtils.isNotEmpty(result)) { + list.add(result); + } + } + // 杩涜鍏紡璁$畻 + String resultValue = calculationFormula(list, v.get(0), k); + map.put(k, resultValue); + }); + return map; + } + + /** + * 浠庢枃浠朵腑鎻愬彇鍑烘潵鐨勬枃瀛楋紝濡傛灉鏈夊叕寮忥紝杩涜鍏紡璁$畻锛屽惁鍒欏彇鍒楄〃绗竴涓�� + * + * @param list 鎻愬彇鍑虹殑鏁板瓧 + * @param dataConfig 瀛樺偍鍏紡鐨勫璞� + * @return + */ + private static String calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem) { + if (list.size() == 0) { + return null; + } + // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻 + if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) { + + return null; + // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹� + } else { + // 杩欓噷鍙細鍙栧垪琛ㄧ涓�涓暟鎹� + if (list.size() > 1) { + throw new ErrorException("鏈粰锛�" + insProductItem + " 閰嶇疆鍏紡锛屽彲鏄嵈閲囬泦鍒颁簡" + list.size() + "涓�硷紒鍒嗗埆涓猴細" + list); + } else { + return list.get(0).toString(); + } + } + } + + /** + * 瑙f瀽String鏁版嵁 + * + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + private static Map<String, String> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig) { + Map<String, String> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = analyzeData(data, v, k, ","); + // 杩涜鍏紡璁$畻 + String resultValue = calculationFormula(list, v.get(0), k); + map.put(k, resultValue); + }); + return map; + } + + /** + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + private static Map<String, String> analysisString(String data, Map<String, List<DataConfig>> dataConfig) { + String processingDataAfterSpaces = data + .replaceAll(" +", splitIdentifier) + .replaceAll("\r", "") + .replaceAll(" ", ""); + Map<String, String> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier); + // 杩涜鍏紡璁$畻 + String resultValue = calculationFormula(list, v.get(0), k); + map.put(k, resultValue); + }); + return map; + } + + /** + * 鍙朮锛孻涓や釜瀹氫綅 + * + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + public static Map<String, String> analysisList(String data, Map<String, List<DataConfig>> dataConfig) { + Map<String, String> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + // 鐢ㄦ埛鍙兘缁欎竴涓瓙椤圭洰閰嶇疆浜嗗涓厤缃紝鍗充竴涓」鐩彇澶氫釜鍊硷紝鎵�浠ラ渶瑕佸惊鐜� + List<Object> list = analyzeData(data, v, k, splitIdentifier); + // 杩涜鍏紡璁$畻 + String resultValue = calculationFormula(list, v.get(0), k); + map.put(k, resultValue); + }); + return map; + } + + // 鐢变簬鍦ㄦ柟娉曚腑浼氬ぇ閲忕殑鍒ゆ柇锛屾墍浠ュ仛涓�涓柟娉� + private static int getXOrY(String value, String k, String tips) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new ErrorException(k + "锛氭湭閰嶇疆" + tips + "鍧愭爣杞寸殑鍊硷紒"); + } + } + + // 闃叉鍙傜収鐗╀负绌烘姤閿欙紝杩涜鍒ゆ柇濡傛灉涓虹┖璧嬪�肩┖瀛楃 + private static String getRefer(String refer) { + return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : ""; + } + + public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) { + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + // 鍙栦袱涓敤鎴烽厤缃殑鍙傜収鐗� + String referx = getRefer(v.get(config).getReferx()); + String refery = getRefer(v.get(config).getRefery()); + // 鏈�缁堢粨鏋� + String result = null; + // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿 + String[] aColumnY = data.replaceAll(" ", "").split("\n"); + Integer end = null; + // 閲囬泦鏁版嵁锛歒杞� + for (int i = 0; i < aColumnY.length; i++) { + // 鍙杧鐨勫�硷紝闃叉鎶ラ敊 + int x = getXOrY(v.get(config).getX(), k, "X"); + // 濡傛灉Y涓嶺鐢ㄦ埛閮介厤缃簡鍒欐墽琛� + if (ObjectUtils.isNotEmpty(refery)) { + // 鍙朰鍧愭爣鍊� + int y = getXOrY(v.get(config).getY(), k, "Y"); + // 缂撳瓨Y鐨勭粨鏉熷�� + if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) { + end = i + y; + } + // 鍒ゆ柇鏄惁鍦ㄥ弬鐓х墿涓鸿捣鍒帮紝Y鍧愭爣鍊间负鏈�缁堣寖鍥� + if (ObjectUtils.isNotEmpty(end) && i <= end) { + String[] aLineX = aColumnY[i].split(split); + for (int j = 0; j < aLineX.length; j++) { + if (aLineX[j].contains(referx)) { + try { + result = aLineX[j + x]; + } catch (Exception e) { + throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒"); + } + break; + } + } + } + // 濡傛灉鍙厤缃簡X锛屽垯鎵ц涓嬮潰鐨勪唬鐮� + } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) { + String[] aLineX = aColumnY[i].split(split); + for (int j = 0; j < aLineX.length; j++) { + if (aLineX[j].contains(referx)) { + try { + result = aLineX[j + x]; + } catch (Exception e) { + throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒"); + } + } + } + } + } + // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁 + if (ObjectUtils.isNotEmpty(result)) { + String formatProcessing = getFormatProcessing(result); + list.add(formatProcessing); + } + } + return list; + } + + public static String getFormatProcessing(String value) { + value = value.replaceAll("%", ""); + if(value.contains("=")){ + String[] split = value.split("="); + return split[split.length - 1]; + } else if(value.contains(":")) { + String[] split = value.split(":"); + return split[split.length - 1]; + } else { + return value; + } } } -- Gitblit v1.9.3