WXL (wul)
6 天以前 51461f369f0b0ad1da96346afee5637302f1525b
src/views/Satisfaction/diseaseStatistics/components/FirstFollowUp.vue
@@ -432,163 +432,19 @@
    },
    customSort(data) {
      const order = [
        "一",
        "二",
        "三",
        "四",
        "五",
        "六",
        "七",
        "八",
        "九",
        "十",
        "十一",
        "十二",
        "十三",
        "十四",
        "十五",
        "十六",
        "十七",
        "十八",
        "十九",
        "二十",
        "二十一",
        "二十二",
        "二十三",
        "二十四",
        "二十五",
        "二十六",
        "二十七",
        "二十八",
        "二十九",
        "三十",
        "三十一",
        "三十二",
        "三十三",
        "三十四",
        "三十五",
        "三十六",
        "三十七",
        "三十八",
        "三十九",
        "四十",
        "四十一",
        "四十二",
        "四十三",
        "四十四",
        "四十五",
      ];
      return data.sort((a, b) => {
        const getIndex = (name) => {
          if (!name || typeof name !== "string") return -1;
          const chineseMatch = name.match(/^([一二三四五六七八九十]+)/);
          if (chineseMatch && chineseMatch[1]) {
            return order.indexOf(chineseMatch[1]);
          }
          const arabicMatch = name.match(/^(\d+)/);
          if (arabicMatch && arabicMatch[1]) {
            const num = parseInt(arabicMatch[1], 10);
            if (num >= 1 && num <= 45) {
              return num - 1;
            }
          }
          return -1;
        };
        const indexA = getIndex(a.leavehospitaldistrictname);
        const indexB = getIndex(b.leavehospitaldistrictname);
        if (indexA === -1 && indexB === -1) {
          return (a.leavehospitaldistrictname || "").localeCompare(
            b.leavehospitaldistrictname || ""
          );
        }
        if (indexA === -1) return 1;
        if (indexB === -1) return -1;
        return indexA - indexB;
      });
      return data.sort((a, b) =>
        this.compareWardName(
          a.leavehospitaldistrictname,
          b.leavehospitaldistrictname
        )
      );
    },
    sortChineseNumber(aRow, bRow) {
      const a = aRow.leavehospitaldistrictname;
      const b = bRow.leavehospitaldistrictname;
      const chineseNumMap = {
        一: 1,
        二: 2,
        三: 3,
        四: 4,
        五: 5,
        六: 6,
        七: 7,
        八: 8,
        九: 9,
        十: 10,
        十一: 11,
        十二: 12,
        十三: 13,
        十四: 14,
        十五: 15,
        十六: 16,
        十七: 17,
        十八: 18,
        十九: 19,
        二十: 20,
        二十一: 21,
        二十二: 22,
        二十三: 23,
        二十四: 24,
        二十五: 25,
        二十六: 26,
        二十七: 27,
        二十八: 28,
        二十九: 29,
        三十: 30,
        三十一: 31,
        三十二: 32,
        三十三: 33,
        三十四: 34,
        三十五: 35,
        三十六: 36,
        三十七: 37,
        三十八: 38,
        三十九: 39,
        四十: 40,
        四十一: 41,
        四十二: 42,
        四十三: 43,
        四十四: 44,
        四十五: 45,
      };
      const getNumberFromText = (text) => {
        if (!text || typeof text !== "string") return -1;
        const match = text.match(/^([一二三四五六七八九十]+)/);
        if (match && match[1]) {
          const chineseNum = match[1];
          return chineseNumMap[chineseNum] !== undefined
            ? chineseNumMap[chineseNum]
            : -1;
        }
        const arabicMatch = text.match(/^(\d+)/);
        if (arabicMatch && arabicMatch[1]) {
          const num = parseInt(arabicMatch[1], 10);
          return num >= 1 && num <= 45 ? num : -1;
        }
        return -1;
      };
      const numA = getNumberFromText(a);
      const numB = getNumberFromText(b);
      if (numA === -1 && numB === -1) {
        return (a || "").localeCompare(b || "");
      }
      if (numA === -1) return 1;
      if (numB === -1) return -1;
      return numA - numB;
      return this.compareWardName(
        aRow.leavehospitaldistrictname,
        bRow.leavehospitaldistrictname
      );
    },
    getRowKey(row) {
@@ -812,6 +668,67 @@
      return Number.isInteger(num) ? num.toString() : num.toFixed(0);
    },
    // ===== 病区名排序(支持 1-B10 / 2-A2 等 数字-字母数字 格式) =====
    // 解析病区名,返回排序键 { group, letter, number }
    parseWardKey(name) {
      if (!name || typeof name !== "string") return null;
      const trimmed = name.trim();
      // 格式1:数字-字母数字,如 1-B10、2-A2、1-A11
      const dashMatch = trimmed.match(/^(\d+)-([A-Za-z]+)(\d+)/);
      if (dashMatch) {
        return {
          group: parseInt(dashMatch[1], 10),
          letter: dashMatch[2].toUpperCase(),
          number: parseInt(dashMatch[3], 10),
        };
      }
      // 格式2:中文数字开头,如 一病区、十一病区、二十一病区
      const cnMatch = trimmed.match(/^([一二三四五六七八九十]+)/);
      if (cnMatch && cnMatch[1]) {
        const num = this.chineseToNumber(cnMatch[1]);
        if (num > 0) return { group: num, letter: "", number: 0 };
      }
      // 格式3:阿拉伯数字开头,如 1病区、12病区
      const numMatch = trimmed.match(/^(\d+)/);
      if (numMatch && numMatch[1]) {
        return { group: parseInt(numMatch[1], 10), letter: "", number: 0 };
      }
      return null;
    },
    // 中文数字转阿拉伯数字(支持 一 ~ 九十九)
    chineseToNumber(str) {
      const digits = { 一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6, 七: 7, 八: 8, 九: 9 };
      if (!str) return -1;
      if (str === "十") return 10;
      if (str.startsWith("十")) return 10 + (digits[str[1]] || 0);
      if (str.includes("十")) {
        const parts = str.split("十");
        const tens = digits[parts[0]] || 0;
        const ones = digits[parts[1]] || 0;
        return tens * 10 + ones;
      }
      return digits[str] !== undefined ? digits[str] : -1;
    },
    // 病区名比较器:数字段 → 字母段 → 数字段
    compareWardName(nameA, nameB) {
      const ka = this.parseWardKey(nameA);
      const kb = this.parseWardKey(nameB);
      if (!ka && !kb) return (nameA || "").localeCompare(nameB || "", "zh-CN");
      if (!ka) return 1;
      if (!kb) return -1;
      if (ka.group !== kb.group) return ka.group - kb.group;
      if (ka.letter !== kb.letter) return ka.letter.localeCompare(kb.letter);
      return ka.number - kb.number;
    },
    handleSelectionChange(selection) {
      this.ids = selection.map((item) => item.tagid);
    },