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