From 7e7a8e3b15df991b9c3fbd22b94534b1d1984e29 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 14 九月 2026 19:54:28 +0800
Subject: [PATCH] 新疆——新聚lims 1.检验任务详情逻辑重构,不需要判断结论逻辑,添加复杂运算逻辑

---
 src/utils/excelFountion.js |   98 +++++++++++++++++++++++++++++++------------------
 1 files changed, 62 insertions(+), 36 deletions(-)

diff --git a/src/utils/excelFountion.js b/src/utils/excelFountion.js
index 3cd11a9..a61500b 100644
--- a/src/utils/excelFountion.js
+++ b/src/utils/excelFountion.js
@@ -169,6 +169,7 @@
  */
 function getIdFromColumnName(id, arr) {
   try {
+    id = String(id).replace(/\$/g, "");
     // Get the letters
     var t = /^[a-zA-Z]+/.exec(id);
     if (t) {
@@ -245,9 +246,16 @@
  */
 function getABCList(f) {
   try {
+    if (typeof f !== "string") {
+      return [];
+    }
     let regex = /[=\+\-\*\%\(\)\/\^\s]/g;
-    let fouList = ["SUM", "MAX", "MIN", "AVERAGE", "ABS"];
+    let fouList = ["SUM", "MAX", "MIN", "AVERAGE", "ABS", "MEDIAN"];
     f = f
+      .replace(/\$/g, "") // 鍘绘帀 Excel 缁濆寮曠敤绗﹀彿,$D$14 瑙嗕负 D14
+      // 鍖洪棿鍐欐硶閲岀殑绌烘牸(AVERAGE( D14 : D15 ))浼氳涓嬮潰鐨勭┖鐧芥浛鎹㈠悆鎺夊啋鍙�,
+      // 瀵艰嚧鍖洪棿琚媶鎴愪袱涓嫭绔嬪崟鍏冩牸,鍏堟妸鍖洪棿瑙勬暣鎴� D14:D15
+      .replace(/\s*:\s*/g, ":")
       .replace(regex, ",")
       .replace(new RegExp('"&', "g"), "")
       .replace(new RegExp('&"', "g"), "");
@@ -280,6 +288,22 @@
 }
 
 /**
+ * 鎶婂崟鍏冩牸鍊艰浆鎴愬彲鍙備笌 eval 鐨勫瓧闈㈤噺,绌虹櫧鍗曞厓鏍兼寜 0 澶勭悊(涓� Excel 涓�鑷�)
+ *
+ * @param value 鍗曞厓鏍肩殑鍊�
+ * @returns 鏁板��/鍘熷鍊�,绌哄�艰繑鍥� 0
+ */
+function toNumberLiteral(value) {
+  if (value === null || value === undefined) {
+    return 0;
+  }
+  if (typeof value === "string" && value.trim() === "") {
+    return 0;
+  }
+  return value;
+}
+
+/**
  * 璁$畻鍑芥暟
  *
  * @param f 瀛楃涓茬被鍨嬶紝琛ㄧず寰呰绠楃殑鍏紡
@@ -288,9 +312,14 @@
  */
 function compute(f, comValue) {
   try {
-    let str = f;
+    if (typeof f !== "string") {
+      return undefined;
+    }
+    // 鍘绘帀 Excel 缁濆寮曠敤绗﹀彿,$D$14 涓� D14 绛変环;
+    // 鍖洪棿閲岀殑绌烘牸涔熻涓�骞跺幓鎺�,鍚﹀垯鍖洪棿 token 浼氬洜绌烘牸鍖归厤涓嶄笂鑰屽睍寮�澶辫触
+    let str = f.replace(/\$/g, "").replace(/\s*:\s*/g, ":");
     // 鑾峰彇鍗曞厓鏍煎搴斿��
-    let arr = getAllCell(f);
+    let arr = getAllCell(str);
     for (var a in comValue) {
       if (
         comValue[a] !== "undefined" &&
@@ -310,43 +339,40 @@
         }
       }
     }
-    // 瑙f瀽鍏紡鍙傛暟锛岀壒鍒槸甯︼細鐨�
-    let arr0 = getABCList(f);
-    let obj = {};
-    arr0.forEach((item) => {
-      if (item.includes(":")) {
-        let arr1 = [];
-        let r0 = getIdFromColumnName(item.split(":")[0]).r;
-        let c0 = getIdFromColumnName(item.split(":")[0]).c;
-        let r1 = getIdFromColumnName(item.split(":")[1]).r;
-        let c1 = getIdFromColumnName(item.split(":")[1]).c;
-        for (let i = Number(r0); i <= Number(r1); i++) {
-          for (let u = Number(c0); u <= Number(c1); u++) {
-            arr1.push({
-              r: i,
-              c: u,
-            });
-          }
-        }
-        let arr2 = [];
-        arr1.forEach((m) => {
-          arr2.push(getColumnNameFromId(`${m.c}` + "-" + `${m.r}`));
-        });
-        obj[item.split(":").join("-")] = arr2.join(",");
-      } else {
-        obj[item] = item;
+    // 鎶婂尯闂村弬鏁�(濡� SUM(D14:D15) 涓殑 D14:D15)灞曞紑鎴愬崟鍏冩牸鍒楄〃 D14,D15
+    getABCList(str).forEach((token) => {
+      if (!token.includes(":")) {
+        return;
       }
+      const parts = token.split(":");
+      const start = getIdFromColumnName(parts[0]);
+      const end = getIdFromColumnName(parts[1]);
+      const cells = [];
+      for (let i = Number(start.r); i <= Number(end.r); i++) {
+        for (let u = Number(start.c); u <= Number(end.c); u++) {
+          cells.push(getColumnNameFromId(`${u}` + "-" + `${i}`));
+        }
+      }
+      str = str.replace(token, cells.join(","));
     });
-    str = str.replace(new RegExp(":", "g"), "");
-    // 鏇挎崲鍙傛暟
-    for (var a in obj) {
-      str = str.replace(new RegExp(a, "g"), obj[a]);
+    // 璁$畻:涓�娆℃�ф浛鎹㈡墍鏈夊弬鏁�,閬垮厤 D1 涓� D14 杩欑被鍓嶇紑浜掔浉姹℃煋
+    const keys = Object.keys(arr);
+    if (keys.length > 0) {
+      const pattern = new RegExp(
+        keys
+          .sort((x, y) => y.length - x.length)
+          .map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
+          .join("|"),
+        "g"
+      );
+      str = str.replace(pattern, (m) => String(toNumberLiteral(arr[m])));
     }
-    // 璁$畻
-    for (var a in arr) {
-      str = str.replace(new RegExp(a, "g"), arr[a]);
+    const result = eval(str);
+    // 闄ら浂绛夐潪鏈夐檺缁撴灉涓嶅啓鍥炲崟鍏冩牸
+    if (typeof result === "number" && !isFinite(result)) {
+      return undefined;
     }
-    return eval(str);
+    return result;
   } catch (error) {}
 }
 

--
Gitblit v1.9.3