From 08ffcf9d7ffafaa82d8de7f9b5fcfdb49e9c3688 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期三, 05 十一月 2025 17:33:54 +0800
Subject: [PATCH] 动态溯源 1. 修复CO因子文本没有正常显示的问题;

---
 public/underway_mission_report - 副本.docx           |    0 
 src/views/sourcetrace/SourceTrace.vue              |   35 ++++++
 src/components/mission/missionReportDownload.js    |    2 
 public/underway_season_report - 副本.docx            |    0 
 public/underway_season_report.docx                 |    0 
 src/api/index.js                                   |    2 
 src/components.d.ts                                |    2 
 src/views/sourcetrace/component/ClueRecordItem.vue |    2 
 src/views/historymode/component/MissionReport.vue  |  240 ++++++++++++++++++++++++++++++++++-------------
 src/views/realtimemode/RealtimeMode.vue            |    5 
 10 files changed, 214 insertions(+), 74 deletions(-)

diff --git "a/public/underway_mission_report - \345\211\257\346\234\254.docx" "b/public/underway_mission_report - \345\211\257\346\234\254.docx"
new file mode 100644
index 0000000..4325a5a
--- /dev/null
+++ "b/public/underway_mission_report - \345\211\257\346\234\254.docx"
Binary files differ
diff --git "a/public/underway_season_report - \345\211\257\346\234\254.docx" "b/public/underway_season_report - \345\211\257\346\234\254.docx"
new file mode 100644
index 0000000..786aef8
--- /dev/null
+++ "b/public/underway_season_report - \345\211\257\346\234\254.docx"
Binary files differ
diff --git a/public/underway_season_report.docx b/public/underway_season_report.docx
index 786aef8..eff4fc1 100644
--- a/public/underway_season_report.docx
+++ b/public/underway_season_report.docx
Binary files differ
diff --git a/src/api/index.js b/src/api/index.js
index 19b0941..80bd79b 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -2,7 +2,7 @@
 import { ElMessage } from 'element-plus';
 
 const openLog = true;
-const debug = true;
+const debug = false;
 
 let ip1 = 'http://47.100.191.150:9029/';
 let ws = `47.100.191.150:9031`;
diff --git a/src/components.d.ts b/src/components.d.ts
index 0fc11c1..c67b3a0 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -31,6 +31,7 @@
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
+    ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDropdown: typeof import('element-plus/es')['ElDropdown']
     ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
     ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
@@ -39,6 +40,7 @@
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
     ElLink: typeof import('element-plus/es')['ElLink']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
diff --git a/src/components/mission/missionReportDownload.js b/src/components/mission/missionReportDownload.js
index 24be359..0eaad53 100644
--- a/src/components/mission/missionReportDownload.js
+++ b/src/components/mission/missionReportDownload.js
@@ -107,7 +107,7 @@
   } else {
     param.missionPeriod = '娣卞';
   }
-  param.region = mission.region;
+  param.region = mission.region ?? '';
   param.radius = mission.radius ? `${mission.radius}鍏噷` : '';
 
   // 璧拌埅褰撴棩澶╂皵鐘跺喌
diff --git a/src/views/historymode/component/MissionReport.vue b/src/views/historymode/component/MissionReport.vue
index 12d1ae1..8e772be 100644
--- a/src/views/historymode/component/MissionReport.vue
+++ b/src/views/historymode/component/MissionReport.vue
@@ -198,6 +198,19 @@
             }
           ]
         }
+      ],
+      clueList: [
+        {
+          _factorNames: 'PM2.5',
+          _time: '10:22:28 - 10:22:34',
+          _riskRegion: '闀垮畞鍖烘竻婧矾鍙箰涓滆矾',
+          _exceptionType: '蹇�熶笂鍗�',
+          _chart: '',
+          _conclusion:
+            '鍦�10:22:28鑷�10:22:34涔嬮棿锛屽嚭鐜板揩閫熶笂鍗囷紝VOC鏈�浣庡�间负135.95渭g/m鲁锛屾渶楂樺�间负135.95渭g/m鲁锛屽潎鍊间负135.95渭g/m鲁锛屽彂鐜�3涓闄╂簮锛屽寘鍚�2涓姞娌圭珯锛�1涓苯淇��',
+          _scenes:
+            '1.涓婃捣渚濆痉姹借溅缁翠慨鏈夐檺鍏徃锛屾苯淇紒涓氾紝浣嶄簬涓婃捣甯傞暱瀹佸尯鍖楄櫣璺�1079鍙凤紝璺濅粰闇炵珯1887绫炽�俓r\n鈥︹��'
+        }
       ]
     }
   ],
@@ -341,6 +354,34 @@
 }
 
 function generateClueByRiskArea(param) {
+  const indexArr = [
+    'A',
+    'B',
+    'C',
+    'D',
+    'E',
+    'F',
+    'G',
+    'H',
+    'I',
+    'J',
+    'K',
+    'L',
+    'M',
+    'N',
+    'O',
+    'P',
+    'Q',
+    'R',
+    'S',
+    'T',
+    'U',
+    'V',
+    'W',
+    'X',
+    'Y',
+    'Z'
+  ];
   const _param = {
     area: param.area,
     startTime: param.startTime,
@@ -354,77 +395,144 @@
       .groupBy((e) => e.township)
       .map((item, index) => {
         const { key: township, values: clues } = item;
+        let typeCount = {};
+        let lastSceneType;
+        let sceneIndex = 0;
+
+        const _scenes = clues.flatMap((e) =>
+          e.clue.pollutedSource.sceneList.map((s, index) => {
+            const i = lastSceneType == s.type ? ++sceneIndex : 0;
+            typeCount[s.type] = typeCount[s.type] ? typeCount[s.type] + 1 : 1;
+            lastSceneType = s.type;
+            return {
+              des: `${s.type}${i + 1}锛�${s.name}锛屼綅浜�${s.location}锛岃窛${s.closestStation.name}${parseInt(s.length)}绫筹紱`
+            };
+          })
+        );
+        let _sceneDes = `璧拌埅杩囩▼涓函婧愬埌${_scenes.length}涓闄╂簮`;
+        if (_scenes.length > 0) {
+          _sceneDes += '锛屽叾绫诲瀷鏄�';
+          _sceneDes += Object.keys(typeCount)
+            .map((e) => `${e}锛�${typeCount[e]}涓級`)
+            .join('銆�');
+          _sceneDes += '锛�';
+        } else {
+          _sceneDes = '璧拌埅杩囩▼涓湭婧簮鍒伴闄╂簮銆�';
+        }
         return {
           _index: index + 1,
           // _area: `${item.sceneInfo.type}${item.sceneInfo.name}鍛ㄨ竟`,
           _area: `${township}`,
-          clueByFactorList: clues
-            .groupBy((e) => e.factorTag)
-            .map((item2, index2) => {
-              const { key: factorTag, values: clues2 } = item2;
-              const factorNames = [...new Set(clues2.flatMap((e) => e.factors))]
+          _sceneDes,
+          _scenes,
+          clueList: clues.map((item3, index3) => {
+            const clue = item3.clue;
+            let _riskRegion = '';
+            if (
+              clue.pollutedArea.address.indexOf(
+                clue.pollutedArea.streetNumber
+              ) == -1
+            ) {
+              // _riskRegion +=
+              //   (clue.pollutedArea.address ?? '') +
+              //   '锛�' +
+              //   (clue.pollutedArea.street ?? '') +
+              //   (clue.pollutedArea.streetNumber ?? '') +
+              //   (clue.pollutedArea.direction ?? '') +
+              //   '锛�';
+              _riskRegion = clue.pollutedArea.address;
+            } else {
+              _riskRegion = clue.pollutedArea.address;
+            }
+            return {
+              index: indexArr[index3],
+              showPollutedArea: formObj.value.showPollutedArea,
+              _title: _riskRegion,
+              _factorNames: Object.keys(clue.pollutedData.statisticMap)
                 .map((e) => factorName[e])
-                .join('銆�');
-              return {
-                index: index2 + 1,
-                factor: factorNames,
-                clues: clues2.map((item3, index3) => {
-                  const clue = item3.clue;
-                  let _riskRegion = '';
-                  if (
-                    clue.pollutedArea.address.indexOf(
-                      clue.pollutedArea.streetNumber
-                    ) == -1
-                  ) {
-                    _riskRegion +=
-                      (clue.pollutedArea.address ?? '') +
-                      '锛�' +
-                      (clue.pollutedArea.street ?? '') +
-                      (clue.pollutedArea.streetNumber ?? '') +
-                      (clue.pollutedArea.direction ?? '') +
-                      '锛�';
-                  } else {
-                    _riskRegion = clue.pollutedArea.address;
-                  }
-                  return {
-                    index: index3 + 1 + '',
-                    showPollutedArea: formObj.value.showPollutedArea,
-                    _title:
-                      (clue.pollutedArea.street ?? '') +
-                      (clue.pollutedArea.streetNumber ?? '') +
-                      (clue.pollutedArea.direction ?? ''),
-                    _factorNames: Object.keys(clue.pollutedData.statisticMap)
-                      .map((e) => factorName[e])
-                      .join('銆�'),
-                    _time:
-                      moment(clue.pollutedData.startTime).format(
-                        'YYYY-MM-DD HH:mm:ss'
-                      ) +
-                      ' - ' +
-                      moment(clue.pollutedData.endTime).format('HH:mm:ss'),
-                    _riskRegion: _riskRegion,
-                    _exceptionType: clue.pollutedData.exception,
-                    _images: generateChartImg(clue.pollutedData),
-                    _conclusion: clue.pollutedSource.conclusion,
-                    _hasScene: clue.pollutedSource.sceneList.length > 0,
-                    // _scenes:
-                    //   clue.pollutedSource.sceneList.length > 0
-                    //     ? clue.pollutedSource.sceneList
-                    //         .map(
-                    //           (s, index) =>
-                    //             `${index + 1}. ${s.name}锛�${s.type}锛屼綅浜�${s.location}锛岃窛${s.closestStation.name}${parseInt(s.length)}绫筹紱`
-                    //         )
-                    //         .join('\r\n')
-                    //     : '鏃�',
-                    _scenes: clue.pollutedSource.sceneList.map((s, index) => {
-                      return {
-                        des: `${index + 1}. ${s.name}锛�${s.type}锛屼綅浜�${s.location}锛岃窛${s.closestStation.name}${parseInt(s.length)}绫筹紱`
-                      };
-                    })
-                  };
-                })
-              };
-            })
+                .join('銆�'),
+              _date: moment(clue.pollutedData.startTime).format('YYYY-MM-DD'),
+              _time:
+                moment(clue.pollutedData.startTime).format('HH:mm:ss') +
+                ' - ' +
+                moment(clue.pollutedData.endTime).format('HH:mm:ss'),
+              _riskRegion: _riskRegion,
+              _exceptionType: clue.pollutedData.exception,
+              _images: generateChartImg(clue.pollutedData),
+              _conclusion: clue.pollutedSource.conclusion.replace(
+                /锛屽彂鐜癧0-9]*涓闄╂簮锛屽寘鍚玔0-9]*涓�.*銆�/,
+                '銆�'
+              ),
+              _hasScene: clue.pollutedSource.sceneList.length > 0
+            };
+          })
+          // clueByFactorList: clues
+          //   .groupBy((e) => e.factorTag)
+          //   .map((item2, index2) => {
+          //     const { key: factorTag, values: clues2 } = item2;
+          //     const factorNames = [...new Set(clues2.flatMap((e) => e.factors))]
+          //       .map((e) => factorName[e])
+          //       .join('銆�');
+          //     return {
+          //       index: index2 + 1,
+          //       factor: factorNames,
+          //       clues: clues2.map((item3, index3) => {
+          //         const clue = item3.clue;
+          //         let _riskRegion = '';
+          //         if (
+          //           clue.pollutedArea.address.indexOf(
+          //             clue.pollutedArea.streetNumber
+          //           ) == -1
+          //         ) {
+          //           _riskRegion +=
+          //             (clue.pollutedArea.address ?? '') +
+          //             '锛�' +
+          //             (clue.pollutedArea.street ?? '') +
+          //             (clue.pollutedArea.streetNumber ?? '') +
+          //             (clue.pollutedArea.direction ?? '') +
+          //             '锛�';
+          //         } else {
+          //           _riskRegion = clue.pollutedArea.address;
+          //         }
+          //         return {
+          //           index: index3 + 1 + '',
+          //           showPollutedArea: formObj.value.showPollutedArea,
+          //           _title:
+          //             (clue.pollutedArea.street ?? '') +
+          //             (clue.pollutedArea.streetNumber ?? '') +
+          //             (clue.pollutedArea.direction ?? ''),
+          //           _factorNames: Object.keys(clue.pollutedData.statisticMap)
+          //             .map((e) => factorName[e])
+          //             .join('銆�'),
+          //           _time:
+          //             moment(clue.pollutedData.startTime).format(
+          //               'YYYY-MM-DD HH:mm:ss'
+          //             ) +
+          //             ' - ' +
+          //             moment(clue.pollutedData.endTime).format('HH:mm:ss'),
+          //           _riskRegion: _riskRegion,
+          //           _exceptionType: clue.pollutedData.exception,
+          //           _images: generateChartImg(clue.pollutedData),
+          //           _conclusion: clue.pollutedSource.conclusion,
+          //           _hasScene: clue.pollutedSource.sceneList.length > 0,
+          //           // _scenes:
+          //           //   clue.pollutedSource.sceneList.length > 0
+          //           //     ? clue.pollutedSource.sceneList
+          //           //         .map(
+          //           //           (s, index) =>
+          //           //             `${index + 1}. ${s.name}锛�${s.type}锛屼綅浜�${s.location}锛岃窛${s.closestStation.name}${parseInt(s.length)}绫筹紱`
+          //           //         )
+          //           //         .join('\r\n')
+          //           //     : '鏃�',
+          //           _scenes: clue.pollutedSource.sceneList.map((s, index) => {
+          //             return {
+          //               des: `${index + 1}. ${s.name}锛�${s.type}锛屼綅浜�${s.location}锛岃窛${s.closestStation.name}${parseInt(s.length)}绫筹紱`
+          //             };
+          //           })
+          //         };
+          //       })
+          //     };
+          //   })
         };
       });
   });
diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue
index e5276b4..7b00711 100644
--- a/src/views/realtimemode/RealtimeMode.vue
+++ b/src/views/realtimemode/RealtimeMode.vue
@@ -145,9 +145,10 @@
                 // startTime: '2024-12-13 16:35:00',
                 // startTime: '2024-11-27 11:50:41', // Pm, 涓窛绂诲伐鍦�
                 // startTime: '2024-08-30 15:27:00', // voc 杩戣窛绂绘苯淇�
-                startTime: '2024-07-23 15:21:30',
+                // startTime: '2024-07-23 15:21:30',
                 // startTime: '2024-07-23 14:39:00',
-                endTime: '2025-01-16 11:51:41',
+                startTime: '2025-11-04 14:30:00',
+                endTime: '2025-12-31 11:51:41',
                 page,
                 perPage: 10
               }
diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue
index 1d6fb6d..5c738de 100644
--- a/src/views/sourcetrace/SourceTrace.vue
+++ b/src/views/sourcetrace/SourceTrace.vue
@@ -232,15 +232,44 @@
     type3: 0
   };
   streams.value.forEach((v) => {
+    let b2, b3;
+    // 鍒ゆ柇鐩戞祴鍥犲瓙绫诲瀷鏄惁閫変腑
+    for (const key in v.pollutedData.statisticMap) {
+      const value = v.pollutedData.statisticMap[key];
+      b2 = b2 || selectedFactorTypes.value.indexOf(value.factorId) != -1;
+    }
+
+    // 鍒ゆ柇鍦烘櫙绫诲瀷鏄惁閫変腑
+    if (
+      v.pollutedSource == undefined ||
+      v.pollutedSource.sceneList.length == 0
+    ) {
+      b3 = selectedSceneTypes.value.indexOf(NO_SCENE) != -1;
+    } else {
+      b3 =
+        v.pollutedSource.sceneList.findIndex(
+          (v) => selectedSceneTypes.value.indexOf(v.typeId) != -1
+        ) != -1;
+    }
     switch (v._type) {
       case '1':
-        count.type1++;
+        if (b2 && b3) {
+          count.type1++;
+        }
         break;
       case '2':
-        count.type2++;
+        b3 =
+          v.sortedSceneList.findIndex(
+            (v) => selectedSceneTypes.value.indexOf(v.first.typeId) != -1
+          ) != -1;
+        if (b3) {
+          count.type2++;
+        }
         break;
       case '3':
-        count.type3++;
+        if (b2 && b3) {
+          count.type3++;
+        }
         break;
     }
   });
diff --git a/src/views/sourcetrace/component/ClueRecordItem.vue b/src/views/sourcetrace/component/ClueRecordItem.vue
index f34ad6c..2353812 100644
--- a/src/views/sourcetrace/component/ClueRecordItem.vue
+++ b/src/views/sourcetrace/component/ClueRecordItem.vue
@@ -186,7 +186,7 @@
       case 'VOC':
         return 'VOC<sub>s</sub>';
       default:
-        return '';
+        return n;
     }
   };
   let name = [];

--
Gitblit v1.9.3