From e181f04c642204e79749af93fa921875ff6c21ba Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期二, 20 五月 2025 10:46:35 +0800
Subject: [PATCH] refactor(qms): 重构趋势图展示逻辑

---
 src/views/qms/trend/quality.vue |  241 +++++++++++++++++++++++++++++-------------------
 1 files changed, 145 insertions(+), 96 deletions(-)

diff --git a/src/views/qms/trend/quality.vue b/src/views/qms/trend/quality.vue
index e4560ec..28fca04 100644
--- a/src/views/qms/trend/quality.vue
+++ b/src/views/qms/trend/quality.vue
@@ -299,6 +299,12 @@
     return;
   }
 
+  // 妫�鏌ユ祴璇曢」鐩槸鍚﹂�夋嫨
+  if (!selectedTestItems.value.length) {
+    proxy?.$modal.msgWarning("璇烽�夋嫨娴嬭瘯椤圭洰锛�");
+    return;
+  }
+
   getList();
 }
 
@@ -387,15 +393,43 @@
     '#ff6f61', '#ffd700', '#00ced1', '#da70d6', '#adff2f'
   ];
 
-  // 浣跨敤Map鏇夸唬Object鏇撮珮鏁�
-  const seriesMap = new Map<string, [string, number][]>();
-  testResultList.value.forEach(item => {
-    const key = item.testItem;
-    if (!seriesMap.has(key)) {
-      seriesMap.set(key, []);
+ // 浣跨敤Map鏇夸唬Object鏇撮珮鏁�
+const seriesMap = new Map<string, [string, number][]>();
+testResultList.value.forEach((item) => {
+  const key = item.testItem;
+  const xValue = `${item.batchCode}-${item.testNum}`;
+  if (!seriesMap.has(key)) {
+    seriesMap.set(key, []);
+  }
+
+  const seriesArray = seriesMap.get(key)!;
+
+  // 绉婚櫎宸叉湁鐩稿悓 xValue 鐨勬潯鐩�
+  const filtered = seriesArray.filter(entry => entry[0] !== xValue);
+  filtered.push([xValue, item.testValue]);
+
+  seriesMap.set(key, filtered);
+});
+
+
+// 瀵规瘡涓� testItem 涓嬬殑鏁版嵁杩涜缁熶竴鎺掑簭锛氬厛鎸� batchCode 鍐嶆寜 testNum
+seriesMap.forEach((value, key) => {
+  value.sort((a, b) => {
+    const [batchA, testNumA] = a[0].split('-');
+    const [batchB, testNumB] = b[0].split('-');
+
+    // 鍏堟瘮杈� batchCode锛堝瓧绗︿覆姣旇緝锛�
+    if (batchA !== batchB) {
+      return batchA.localeCompare(batchB);
     }
-    seriesMap.get(key)?.push([item.createTime, item.testValue]);
+
+    // 鍐嶆瘮杈� testNum锛堣浆鎹负鏁板瓧姣旇緝锛�
+    return Number(testNumA) - Number(testNumB);
   });
+
+  seriesMap.set(key, value);
+});
+
 
   // 瑙f瀽鏈�鍚庝竴鏉℃暟鎹殑鍒ゆ柇鏉′欢瀛楁
   let upperLimit: number | null = null;
@@ -426,101 +460,116 @@
 
 
   const option = {
-    grid: {
-      top: '15%',
-      left: '5%',
-      right: '5%',
-      containLabel: true
+  tooltip: {
+    trigger: 'axis', // 鎸夊潗鏍囪酱瑙﹀彂锛岄�傜敤浜庢姌绾垮浘/鏌辩姸鍥剧瓑
+    formatter: (items: any[]) => {
+      const result: string[] = [];
+      items.forEach(item => {
+        result.push(`${item.marker} ${item.seriesName}<br/>`);
+        result.push(`搴忓彿锛�${item.name}<br/>`);
+        result.push(`娴嬭瘯鏁版嵁锛�${item.value[1]}<br/>`);
+      });
+      return result.join('');
     },
-    xAxis: {
-      type: 'time',
-      name: '鏃堕棿'
+    backgroundColor: 'rgba(255, 255, 255, 0.9)',
+    borderColor: '#ccc',
+    textStyle: {
+      color: '#333'
+    }
+  },
+  grid: {
+    top: '15%',
+    left: '5%',
+    right: '5%',
+    containLabel: true
+  },
+  xAxis: {
+    type: 'category',
+    name: '搴忓彿',
+    data: Array.from(seriesMap.values())[0]?.map(item => item[0]) || [] // 浣跨敤鎺掑簭鍚庣殑 x 鍊�
+  },
+  yAxis: {
+    type: 'value',
+    name: '娴嬭瘯鏁版嵁',
+    min: newLowerLimit,
+    max: newUpperLimit,
+    axisLabel: {
+      formatter: function (value: number) {
+        return value;
+      }
+    }
+  },
+  legend: {
+    data: Array.from(seriesMap.keys())
+  },
+  series: Array.from(seriesMap).map(([name, data], index) => ({
+    name: name,
+    data: data,
+    type: 'line',
+    animationDuration: 1000,
+    lineStyle: {
+      color: colorPool[index % colorPool.length],
+      width: 2
     },
-    yAxis: {
-      type: 'value',
-      name: '娴嬭瘯鏁版嵁',
-      min: newLowerLimit, // 浣跨敤鏂扮殑涓嬮檺鍊�
-      max: newUpperLimit, // 浣跨敤鏂扮殑涓婇檺鍊�
-      axisLabel: {
-        formatter: function (value: number) {
-          return value;
+    itemStyle: {
+      color: colorPool[index % colorPool.length],
+      opacity: 0.8
+    },
+    markLine: {
+      symbol: ['none', 'none'],
+      label: {
+        position: 'end',
+        align: 'center',
+        formatter: function (params: any) {
+          const name = params.name || '';
+          const value = params.value || '';
+          return `${name}\n${value}`;
         }
-      }
-    },
-    legend: {
-      data: Array.from(seriesMap.keys())
-    },
-    series: Array.from(seriesMap).map(([name, data], index) => ({
-      name: name,
-      data: data,
-      type: 'line',
-      animationDuration: 1000,
+      },
       lineStyle: {
-        color: colorPool[index % colorPool.length],
-        width: 2 // 澧炲姞绾挎潯瀹藉害
+        color: 'red',
+        type: 'dashed'
       },
-      itemStyle: {
-        color: colorPool[index % colorPool.length],
-        opacity: 0.8 // 娣诲姞閫忔槑搴�
-      },
-      markLine: {
-        symbol: ['none', 'none'],
-        label: {
-          position: 'end',
-          align: 'center', // 娣诲姞 align 灞炴�т互瀹炵幇灞呬腑瀵归綈
-          formatter: function (params: any) {
-            const name = params.name || ''; // 涓婇檺鎴栦笅闄愭爣璇�
-            const value = params.value || ''; // 瀵瑰簲鐨勬暟鍊�
-            return `${name}\n${value}`; // 鎹㈣鏄剧ず锛岀‘淇濅笂涓嬭鍐呭娓呮櫚
-          }
+      data: [
+        {
+          name: '涓嬮檺',
+          yAxis: lowerLimit !== null ? lowerLimit : undefined
         },
-        lineStyle: {
-          color: 'red',
-          type: 'dashed'
-        },
-        data: [
-          {
-            name: '涓嬮檺',
-            yAxis: lowerLimit !== null ? lowerLimit : undefined
-          },
-          {
-            name: '涓婇檺',
-            yAxis: upperLimit !== null ? upperLimit : undefined
-          }
-        ]
-      },
-      // markLine: {
-      //   data: [{ type: 'average', name: 'Avg' }]
-      // }
-    })),
-    // 鏂板 dataZoom 閰嶇疆
-    dataZoom: [
-      {
-        type: 'slider', // X杞存粦鍔ㄦ潯
-        xAxisIndex: 0,
-        start: 0, // 鍒濆鑼冨洿璧风偣鐧惧垎姣�
-        end: 100 // 鍒濆鑼冨洿缁堢偣鐧惧垎姣�
-      },
-      {
-        type: 'slider', // Y杞存粦鍔ㄦ潯
-        yAxisIndex: 0,
-        start: 0, // 鍒濆鑼冨洿璧风偣鐧惧垎姣�
-        end: 100 // 鍒濆鑼冨洿缁堢偣鐧惧垎姣�
-      },
-      {
-        type: 'inside', // X杞村唴缃嫋鍔ㄥ拰妗嗛��
-        xAxisIndex: 0,
-        start: 0,
-        end: 100
-      },
-      {
-        type: 'inside', // Y杞村唴缃嫋鍔ㄥ拰妗嗛��
-        yAxisIndex: 0,
-        start: 0,
-        end: 100
-      }
-    ]
-  };
+        {
+          name: '涓婇檺',
+          yAxis: upperLimit !== null ? upperLimit : undefined
+        }
+      ]
+    }
+  })),
+  dataZoom: [
+    {
+      type: 'slider',
+      xAxisIndex: 0,
+      start: 0,
+      end: 100
+    },
+    {
+      type: 'slider',
+      yAxisIndex: 0,
+      start: 0,
+      end: 100
+    },
+    {
+      type: 'inside',
+      xAxisIndex: 0,
+      start: 0,
+      end: 100
+    },
+    {
+      type: 'inside',
+      yAxisIndex: 0,
+      start: 0,
+      end: 100
+    }
+  ]
+};
+
 
   chart.setOption(option, true);
   window.addEventListener('resize', () => {

--
Gitblit v1.9.3