From 2cffd9c7db5c3191cf172641c800e5a328d6f3af Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 10 七月 2025 17:30:57 +0800
Subject: [PATCH] 2025.7.10 修改动态溯源模块

---
 src/views/sourcetrace/SourceTrace.vue |  786 +++++++++++++++++++++++++++++++++----------------------
 1 files changed, 468 insertions(+), 318 deletions(-)

diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue
index 8afb284..87768df 100644
--- a/src/views/sourcetrace/SourceTrace.vue
+++ b/src/views/sourcetrace/SourceTrace.vue
@@ -1,161 +1,95 @@
 <template>
-  <el-row>
+  <el-row
+    :style="
+      direction == 'left'
+        ? 'flex-direction: row;'
+        : 'flex-direction: row-reverse'
+    "
+  >
+    <el-col span="2" class="flex-col">
+      <el-row justify="end">
+        <CardButton
+          :direction="direction"
+          name="鍔ㄦ�佹函婧�"
+          @click="handleDisplayChange"
+        ></CardButton>
+      </el-row>
+      <el-row class="flex-col">
+        <PollutedWarnItem
+          :item="selectedWarning"
+          @showMarksAndPolygon="showMarksAndPolygon"
+        ></PollutedWarnItem>
+        <PollutedExceptionItem
+          :item="selectedException"
+          @showMarksAndPolygon="showMarksAndPolygon"
+        ></PollutedExceptionItem>
+        <PollutedClueItem
+          v-model="clueDialog"
+          :item="selectedClue"
+        ></PollutedClueItem>
+      </el-row>
+    </el-col>
     <el-col v-show="show" span="10">
       <BaseCard>
         <template #content>
-          <!-- <div>
-        <el-input type="text" v-model="inputVal" />
-        <button @click="handleSend">send</button>
-        <button @click="handleLink">link</button>
-      </div> -->
-          <!-- <div>
-            <el-text type="primary" size="large" tag="b">鍔ㄦ�佹函婧�</el-text>
-          </div> -->
-          <el-scrollbar ref="scrollbarRef" :height="height" class="scrollbar">
-            <div ref="scrollContentRef">
-              <div v-for="(item, index) in streams" :key="index">
-                <el-row gap="4">
-                  <!-- <el-tag v-if="index == 0" type="danger">鏈�鏂�</el-tag> -->
-                  <el-text type="primary">{{
-                    '绾跨储鏃堕棿锛�' +
-                    item.pollutedData.startTime +
-                    ' - ' +
-                    item.pollutedData.endTime
-                  }}</el-text>
-                </el-row>
-                <div>
-                  <el-text type="primary">
-                    姹℃煋鍖哄煙锛歿{ item.pollutedArea.address }}
-                  </el-text>
-                </div>
-                <div>
-                  <el-text type="primary">
-                    婧簮璺濈锛歿{
-                      formatDistanceType(item.pollutedArea.distanceType)
-                    }}
-                  </el-text>
-                </div>
-                <el-row>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="绐佸彉鍥犲瓙"
-                      :value="item.pollutedData.factorName"
-                    />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="鍙樺寲骞呭害"
-                      :value="formatPercentage(item.pollutedData.avgPer)"
-                    />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="鍙戠敓娆℃暟"
-                      :value="item.pollutedData.times"
-                    />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="骞冲潎椋庨��"
-                      :value="item.pollutedData.windSpeed"
-                      suffix="m/s"
-                    />
-                  </el-col>
-                </el-row>
-                <el-row justify="space-between">
-                  <el-link
-                    type="primary"
-                    underline
-                    @click="item.showMore = !item.showMore"
-                  >
-                    {{
-                      (item.showMore ? '鏀惰捣婧簮鍦烘櫙' : '鏌ョ湅婧簮鍦烘櫙') +
-                      '锛�' +
-                      item.pollutedSource.sceneList.length +
-                      '锛�'
-                    }}
-                  </el-link>
-                  <el-link
-                    type="primary"
-                    underline
-                    @click="drawPolygon(item.pollutedArea)"
-                  >
-                    瀹氫綅寮傚父
-                  </el-link>
-                </el-row>
-                <div v-show="item.showMore" style="width: 320px; height: 140px">
-                  <RealTimeLineChart
-                    v-for="(item1, index1) in item._chartOptions"
-                    :key="index1"
-                    :model-value="item1"
-                  ></RealTimeLineChart>
-                </div>
-                <SceneTable
-                  v-show="item.showMore"
-                  :show-marks="item.showMore"
-                  :scene-list="item.pollutedSource.sceneList"
-                ></SceneTable>
-                <el-divider />
-
-                <!-- <el-space gap="4">
-                  <el-tag :type="item.status == 1 ? 'danger' : 'info'">{{
-                    item._statusStr
-                  }}</el-tag>
-                  <el-text type="default">{{ item.exception }}</el-text>
-                </el-space>
-                <el-row gap="4">
-                  <el-text type="primary">鍙戠敓鏃堕棿锛�</el-text>
-                  <el-text type="primary">{{
-                    item.startTime + ' 鑷� '
-                  }}</el-text>
-                  <el-text type="primary">{{
-                    item.status == 1 ? '褰撳墠' : item.endTime
-                  }}</el-text>
-                </el-row>
-                <el-row>
-                  <el-col :span="6">
-                    <el-statistic title="鍥犲瓙" :value="item.factorName" />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic title="鍧囧��" :value="item.avg" />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic title="宄板��" :value="item.max" />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic title="璋峰��" :value="item.min" />
-                  </el-col>
-                </el-row>
-                <el-row justify="space-between">
-                  <el-link
-                    type="primary"
-                    @click="item.showMore = !item.showMore"
-                  >
-                    {{
-                      (item.showMore ? '鏀惰捣婧簮鍦烘櫙' : '鏌ョ湅婧簮鍦烘櫙') +
-                      '锛�' +
-                      item.relatedSceneList.length +
-                      '锛�'
-                    }}
-                  </el-link>
-                  <el-link type="primary" @click="drawSector(item)">
-                    鏌ョ湅寮傚父
-                  </el-link>
-                </el-row>
-                <SceneTable
-                  v-show="item.showMore"
-                  :scene-list="item.relatedSceneList"
-                ></SceneTable>
-                <el-divider /> -->
-              </div>
+          <el-row
+            justify="space-between"
+            align="middle"
+            style="border-bottom: 1px solid white"
+          >
+            <!-- 鏁版嵁鍒囩墖绛涢�夋潯浠� -->
+            <SourceTraceFilter
+              v-model:data-slice="selectedMsgTypes"
+              v-model:factor-type="selectedFactorTypes"
+              :factor-options="factorOptions"
+              v-model:scene-type="selectedSceneTypes"
+              :scene-options="sceneOptions"
+            ></SourceTraceFilter>
+            <!-- <el-divider direction="vertical"></el-divider> -->
+            <!-- 鏁版嵁鍒囩墖缁熻 -->
+            <div style="border-left: 1px solid white" class="p-l-8">
+              <el-space direction="vertical">
+                <el-text type="info">婧簮锛歿{ countMsg1.type1 }}鏉�</el-text>
+                <el-text type="info">绾跨储锛歿{ countMsg1.type2 }}鏉�</el-text>
+                <el-text type="info">鎻愰啋锛歿{ countMsg1.type3 }}鏉�</el-text>
+              </el-space>
             </div>
+          </el-row>
+          <el-scrollbar ref="scrollbarRef" class="scrollbar">
+            <TransitionGroup name="list">
+              <div
+                v-for="item in filterStreams"
+                :key="item.guid ? item.guid : item.time"
+              >
+                <ClueRecordItem
+                  :item="item"
+                  @open="handleOpen(item)"
+                ></ClueRecordItem>
+              </div>
+            </TransitionGroup>
           </el-scrollbar>
         </template>
       </BaseCard>
     </el-col>
-    <el-col span="2">
-      <CardButton name="鍔ㄦ�佹函婧�" @click="() => (show = !show)"></CardButton>
-    </el-col>
+    <!-- <el-col v-if="direction == 'left'" span="2" class="flex-col">
+      <el-row justify="start">
+        <CardButton
+          direction="right"
+          name="鍔ㄦ�佹函婧�"
+          @click="handleDisplayChange"
+        ></CardButton>
+      </el-row>
+      <el-row class="flex-col">
+        <PollutedExceptionItem
+          :item="selectedException"
+          @showMarksAndPolygon="showMarksAndPolygon"
+        ></PollutedExceptionItem>
+        <PollutedClueItem
+          v-model="clueDialog"
+          :item="selectedClue"
+        ></PollutedClueItem>
+      </el-row>
+    </el-col> -->
   </el-row>
 </template>
 <script setup>
@@ -163,8 +97,11 @@
  * 鍔ㄦ�佹函婧愪俊鎭鐞�
  * 閫氳繃websocket鏂瑰紡鎺ユ敹鍚庣鎺ㄩ�佺殑寮傚父淇℃伅骞跺睍绀�
  */
-import { reactive, ref, onMounted, onUnmounted, inject } from 'vue';
+import { reactive, ref, onMounted, onUnmounted, computed, watch } from 'vue';
+import moment from 'moment';
+
 import websocket from '@/api/websocket';
+import dataAnalysisApi from '@/api/dataAnalysisApi';
 import sector from '@/utils/map/sector';
 import mapUtil from '@/utils/map/util';
 import { sceneTypes, sceneIcon } from '@/constant/scene-types';
@@ -172,22 +109,61 @@
 import { map, onMapMounted } from '@/utils/map/index_old';
 import { FactorDatas } from '@/model/FactorDatas';
 import factorDataParser from '@/utils/chart/factor-data-parser';
+import websocketMsgParser from '@/views/sourcetrace/websocketMsgParser.js';
 
-const START_STR = '##';
-const SPLIT_STR = '&&';
-const END_STR = '%%';
+import PollutedExceptionItem from './component/PollutedExceptionItem.vue';
+import ClueRecordItem from './component/ClueRecordItem.vue';
+import PollutedClueItem from '@/views/sourcetrace/component/PollutedClueItem.vue';
+import SourceTraceFilter from '@/views/sourcetrace/component/SourceTraceFilter.vue';
+import PollutedWarnItem from './component/PollutedWarnItem.vue';
+
+const NO_SCENE = 'no_scene';
+
+const MODE_REALTIME = 'realtime';
+const MODE_HISTORY = 'history';
 
 const props = defineProps({
-  factorType: String
+  direction: {
+    type: String,
+    default: 'right'
+  },
+  factorType: String,
+  // 妯″紡锛宺ealtime锛氬疄鏃舵ā寮忥紱history锛氬巻鍙叉暟鎹ā寮�
+  mode: {
+    type: String,
+    default: 'realtime'
+  },
+  missionCode: String,
+  deviceCode: String
 });
 
 const emits = defineEmits(['update:factorType']);
 
-const height = `60vh`;
-
 const show = ref(false);
 const scrollContentRef = ref();
 const scrollbarRef = ref();
+
+const selectedWarning = ref();
+const selectedException = ref();
+const selectedClue = ref();
+const clueDialog = ref(false);
+
+const selectedMsgTypes = ref(['1', '2', '3']);
+const selectedFactorTypes = ref([]);
+const factorOptions = ref([]);
+const selectedSceneTypes = ref([]);
+const sceneOptions = ref([]);
+
+function handleDisplayChange() {
+  show.value = !show.value;
+  if (
+    !show.value &&
+    selectedException.value &&
+    selectedException.value.showMore
+  ) {
+    showMarksAndPolygon(selectedException.value);
+  }
+}
 
 function scrollToBottom() {
   const h1 = scrollContentRef.value.clientHeight + 100;
@@ -202,47 +178,192 @@
   }, 100);
 }
 
-const streams = reactive([]);
+const streams = ref([]);
+const filterStreams = computed(() => {
+  return streams.value.filter((v) => {
+    // 鍒ゆ柇娑堟伅绫诲瀷鏄惁閫変腑
+    const b1 = selectedMsgTypes.value.indexOf(v._type) != -1;
+    let b2, b3;
+    switch (v._type) {
+      case '1':
+      case '3':
+        // 鍒ゆ柇鐩戞祴鍥犲瓙绫诲瀷鏄惁閫変腑
+        b2 = selectedFactorTypes.value.indexOf(v.pollutedData.factorId) != -1;
+        // 鍒ゆ柇鍦烘櫙绫诲瀷鏄惁閫変腑
+        if (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;
+        }
+        break;
+      case '2':
+        b2 = true;
+        b3 =
+          v.sortedSceneList.findIndex(
+            (v) => selectedSceneTypes.value.indexOf(v.first.typeId) != -1
+          ) != -1;
+        break;
+    }
+
+    return b1 && b2 && b3;
+  });
+});
+// 缁熻鍚勭被鍨嬫秷鎭殑鏁伴噺
+const countMsg1 = computed(() => {
+  const count = {
+    type1: 0,
+    type2: 0,
+    type3: 0
+  };
+  streams.value.forEach((v) => {
+    switch (v._type) {
+      case '1':
+        count.type1++;
+        break;
+      case '2':
+        count.type2++;
+        break;
+      case '3':
+        count.type3++;
+        break;
+    }
+  });
+  return count;
+});
 
 const inputVal = ref('');
 const handleSend = () => {
   websocket.send(inputVal.value);
 };
 
-const dealMsg = (data) => {
-  const [type, content] = data
-    .substring(START_STR.length, data.length - END_STR.length)
-    .split(SPLIT_STR);
+function dealMsg(data) {
+  const { type, content } = websocketMsgParser.parseMsg(data);
+  const obj = reactive(JSON.parse(content));
+  if (obj.deviceCode == props.deviceCode) {
+    obj._type = type;
+    dealObj(obj);
+  }
+}
 
+function dealObj(obj) {
   // 姹℃煋绾跨储 PollutedClue
-  if (type == '1') {
-    const obj = JSON.parse(content);
-    obj.showMore = true;
-    console.log('姹℃煋绾跨储: ', obj);
-    drawPolygon(obj.pollutedArea);
-    parseChartData(obj);
-    if (streams.length == 0) {
-      streams.push(obj);
-    } else {
-      streams.forEach((s) => {
-        s.showMore = false;
-      });
-      streams.unshift(obj);
-      show.value = true;
-    }
+  if (obj._type == '1') {
+    obj.showMore = false;
+    console.log('姹℃煋寮傚父鍒囩墖: ', obj);
+
+    addNewMsg(obj);
+    show.value = true;
 
     // scrollToBottom();
-    scrollToTop();
+    // scrollToTop();
+    // drawPolygon(obj.pollutedArea);
+    parseChartData(obj);
+  } else if (obj._type == '2') {
+    // const obj = JSON.parse(content);
+    // obj._type = type;
+    console.log('姹℃煋绾跨储缁撴灉: ', obj);
+    obj._timestr = timeFormatter(obj.time);
+    addNewMsg(obj);
+  } else if (obj._type == '3') {
+    console.log('姹℃煋鎻愰啋鍒囩墖: ', obj);
+    addNewMsg(obj);
+    parseChartData(obj);
   }
-  // 姹℃煋鍒嗘瀽缁撴灉 AnalysisResult
-  else if (type == '2') {
-    const obj = JSON.parse(content);
-    console.log('姹℃煋鍒嗘瀽缁撴灉: ', obj);
+
+  optionsFilte(obj);
+}
+
+// 瀵规暟鎹繘琛岀瓫閫夛紝鍖呮嫭鐩戞祴鍥犲瓙鍜屽満鏅被鍨�
+function optionsFilte(objData) {
+  switch (objData._type) {
+    case '1':
+    case '3':
+      // 绛涢�夌洃娴嬪洜瀛愮被鍨�
+      if (
+        factorOptions.value.findIndex(
+          (v) => v.value == objData.pollutedData.factorId
+        ) == -1
+      ) {
+        factorOptions.value.push({
+          label: objData.pollutedData.factorName,
+          value: objData.pollutedData.factorId
+        });
+        selectedFactorTypes.value.push(objData.pollutedData.factorId);
+      }
+      // 绛涢�夊満鏅被鍨�
+      if (objData.pollutedSource.sceneList.length == 0) {
+        // 鑻ユ病鏈夋壘鍒伴闄╂簮鏃讹紝灏嗚鍒嗙被璁惧畾涓簄ull
+        if (sceneOptions.value.findIndex((v) => v.value == NO_SCENE) == -1) {
+          sceneOptions.value.push({
+            label: '鏈煡',
+            value: NO_SCENE
+          });
+          selectedSceneTypes.value.push(NO_SCENE);
+        }
+      } else {
+        objData.pollutedSource.sceneList.forEach((s) => {
+          if (sceneOptions.value.findIndex((v) => v.value == s.typeId) == -1) {
+            sceneOptions.value.push({
+              label: s.type,
+              value: s.typeId
+            });
+            selectedSceneTypes.value.push(s.typeId);
+          }
+        });
+      }
+    // case '2':
+    //   break;
   }
-};
+}
+
+// 鎸夌収涓�瀹氭椂闂撮棿闅旀柊澧炰竴鏉℃秷鎭�
+let addNewMsgTask;
+const leftMsgList = [];
+function addNewMsg(msg, inside) {
+  if (!addNewMsgTask && (leftMsgList.length == 0 || inside)) {
+    streams.value.splice(0, 0, msg);
+    addNewMsgTask = setTimeout(() => {
+      clearTimeout(addNewMsgTask);
+      addNewMsgTask = undefined;
+      if (leftMsgList.length > 0) {
+        const next = leftMsgList.shift();
+        addNewMsg(next, true);
+      }
+    }, 1000);
+  } else {
+    leftMsgList.push(msg);
+  }
+}
+
+function fetchPollutionTraceHistory() {
+  dataAnalysisApi.fetchPollutionTraceHistory(props.missionCode).then((res) => {
+    const objList = JSON.parse(res.data);
+    objList.forEach((obj) => {
+      obj._type = obj.msgType + '';
+      if (obj._type == '1') {
+        obj.showMore = false;
+        show.value = true;
+        parseChartData(obj);
+      } else if (obj._type == '2') {
+        obj._timestr = timeFormatter(obj.time);
+      } else if (obj._type == '3') {
+        parseChartData(obj);
+      }
+      optionsFilte(obj);
+    });
+    streams.value = objList;
+  });
+}
 
 onMounted(() => {
-  websocket.registerReceiveEvent(dealMsg);
+  if (props.mode == MODE_REALTIME) {
+    websocket.registerReceiveEvent(dealMsg);
+  } else if (props.missionCode) {
+    fetchPollutionTraceHistory();
+  }
 });
 onUnmounted(() => {
   websocket.removeReceiveEvent(dealMsg);
@@ -254,31 +375,112 @@
   // }
 });
 
-// 缁樺埗姹℃煋鍖哄煙
-let pollutedAreaPolygon;
-function drawPolygon(pollutedArea) {
-  if (pollutedAreaPolygon) {
-    map.remove(pollutedAreaPolygon);
+watch(clueDialog, (nV, oV) => {
+  if (nV != oV && !nV) {
+    selectedClue.value._selected = false;
   }
-  const bounds = pollutedArea.polygon.map((v) => [v.first, v.second]);
-  // eslint-disable-next-line no-undef
-  pollutedAreaPolygon = new AMap.Polygon({
-    map: map, //鏄剧ず璇ヨ鐩栫墿鐨勫湴鍥惧璞�
-    strokeWeight: 2, //杞粨绾垮搴�
-    path: bounds, //澶氳竟褰㈣疆寤撶嚎鐨勮妭鐐瑰潗鏍囨暟缁�
-    fillOpacity: 0, //澶氳竟褰㈠~鍏呴�忔槑搴�
-    fillColor: '#CCF3FF', //澶氳竟褰㈠~鍏呴鑹�
-    strokeColor: '#02ffea', //绾挎潯棰滆壊
-    // strokeColor: '#0552f7', //绾挎潯棰滆壊
-    strokeStyle: 'dashed',
-    zIndex: 9
+});
+
+watch(
+  () => props.missionCode,
+  (nV, oV) => {
+    if (nV != oV) {
+      fetchPollutionTraceHistory();
+    }
+  }
+);
+
+function handleOpen(item) {
+  // 鍘婚櫎涓婁竴涓�滄函婧愨�濆拰鈥滄彁閱掆�濇秷鎭殑閫変腑鏍囧織
+  if (selectedWarning.value && selectedWarning.value._selected) {
+    selectedWarning.value._selected = false;
+    showMarksAndPolygon(selectedWarning.value);
+  }
+  if (selectedException.value && selectedException.value._selected) {
+    selectedException.value._selected = false;
+    showMarksAndPolygon(selectedException.value);
+  }
+  if (selectedClue.value && selectedClue.value._selected) {
+    selectedClue.value._selected = false;
+    clueDialog.value = false;
+  }
+  switch (item._type) {
+    case '1':
+      // 鏄剧ず褰撳墠閫変腑鐨勭浉鍏冲湴鍥炬爣璁�
+      showMarksAndPolygon(item);
+      // 鏇存柊閫変腑鐨勫璞�
+      selectedException.value = item;
+      break;
+    case '2':
+      selectedClue.value = item;
+      clueDialog.value = true;
+      break;
+    case '3':
+      showMarksAndPolygon(item);
+      selectedWarning.value = item;
+      break;
+  }
+  item._selected = true;
+}
+
+function hideAll() {
+  streams.value.forEach((s) => {
+    if (polygonMap.has(s.guid)) {
+      s.showMore = false;
+      map.remove(polygonMap.get(s.guid));
+    }
   });
-  map.setFitView();
+}
+
+function showMarksAndPolygon(item) {
+  item.showMore = !item.showMore;
+  if (item.showMore) {
+    hideAll();
+    item.showMore = true;
+    drawPolygon(item);
+  } else {
+    if (polygonMap.has(item.guid)) {
+      map.remove(polygonMap.get(item.guid));
+      item._selected = false;
+    }
+  }
+}
+
+// 缁樺埗姹℃煋鍖哄煙锛堥珮寰峰湴鍥剧殑澶氳竟褰㈠璞★紝閫氳繃vue鐨剅eactive鍖呰涓哄搷搴斿紡瀵硅薄鍚庯紝鏃犳硶姝g‘鍦ㄥ湴鍥句腑浣跨敤锛�
+const polygonMap = new Map();
+function drawPolygon(item) {
+  const pollutedArea = item.pollutedArea;
+  if (polygonMap.has(item.guid)) {
+    map.add(polygonMap.get(item.guid));
+  } else {
+    const bounds = pollutedArea.polygon.map((v) => [v.first, v.second]);
+    // eslint-disable-next-line no-undef
+    const pollutedAreaPolygon = new AMap.Polygon({
+      map: map, //鏄剧ず璇ヨ鐩栫墿鐨勫湴鍥惧璞�
+      strokeWeight: 2, //杞粨绾垮搴�
+      path: bounds, //澶氳竟褰㈣疆寤撶嚎鐨勮妭鐐瑰潗鏍囨暟缁�
+      fillOpacity: 0, //澶氳竟褰㈠~鍏呴�忔槑搴�
+      fillColor: '#CCF3FF', //澶氳竟褰㈠~鍏呴鑹�
+      strokeColor: '#02ffea', //绾挎潯棰滆壊
+      // strokeColor: '#0552f7', //绾挎潯棰滆壊
+      strokeStyle: 'dashed',
+      zIndex: 9
+    });
+    polygonMap.set(item.guid, pollutedAreaPolygon);
+  }
+  // map.setFitView(polygonMap.get(item.guid));
 }
 
 function parseChartData(obj) {
+  // console.log('鎶樼嚎鍥撅細start');
+  obj.pollutedData._startTime = moment(obj.pollutedData.startTime).format(
+    'HH:mm:ss'
+  );
+  obj.pollutedData._endTime = moment(obj.pollutedData.endTime).format(
+    'HH:mm:ss'
+  );
   const factorDatas = new FactorDatas();
-  factorDatas.setData(obj.pollutedData.dataVoList, 0, () => {
+  factorDatas.setData(obj.pollutedData.historyDataList, 0, () => {
     obj._chartOptions = factorDataParser.parseData(factorDatas, [
       {
         label: obj.pollutedData.factorName,
@@ -286,123 +488,12 @@
         value: obj.pollutedData.factorId + ''
       }
     ]);
-    console.log('鎶樼嚎鍥撅細', obj._chartOptions);
+    // console.log('鎶樼嚎鍥撅細', obj._chartOptions);
   });
 }
 
-function formatPercentage(value) {
-  return Math.round(value * 100) + '%';
-}
-
-function formatDistanceType(value) {
-  switch (value) {
-    case 'TYPE1':
-      return '50绫�';
-    case 'TYPE2':
-      return '50绫� - 500绫�';
-    case 'TYPE3':
-      return '50绫� - 1鍏噷';
-    case 'TYPE4':
-      return '50绫� - 2鍏噷';
-
-    default:
-      break;
-  }
-}
-
-/******************************************************************************************************************** */
-
-/**
- * 娣诲姞涓�鏉″伐浣滄祦淇℃伅
- * @param {*} data
- */
-const putWorkStream = (data) => {
-  data.substring();
-  const obj = JSON.parse(data);
-  console.log('sourcetrace: ', obj);
-
-  obj._statusStr = exceptionStatus(obj.status);
-
-  if (streams.length == 0) {
-    streams.push(obj);
-  } else {
-    const index = streams.findIndex((v) => {
-      return v.guid == obj.guid;
-    });
-    if (index != -1) {
-      const old = streams[index];
-      obj.showMore = old.showMore;
-      old.relatedSceneList.forEach((s) => {
-        const index = obj.relatedSceneList.findIndex((v) => {
-          return v.guid == s.guid;
-        });
-        if (index == -1) {
-          obj.relatedSceneList.push(s);
-        }
-      });
-      streams.splice(index, 1, obj);
-    } else {
-      streams.unshift(obj);
-    }
-
-    show.value = true;
-  }
-
-  // scrollToBottom();
-  scrollToTop();
-
-  const excObj = streams.find((v) => {
-    return v.factorId + '' == props.factorType;
-  });
-  if (excObj) {
-    drawSector(excObj);
-  }
-};
-
-function exceptionStatus(value) {
-  switch (value) {
-    case 1:
-      return '寮傚父鍙戠敓涓�';
-    case 2:
-      return '寮傚父宸茬粨鏉�';
-    default:
-      return '寮傚父宸茬粨鏉�';
-  }
-}
-
-let lastDrawObjGuid;
-function drawSector(exceptionObj) {
-  emits('update:factorType', exceptionObj.factorId + '');
-  setTimeout(() => {
-    if (exceptionObj.guid != lastDrawObjGuid) {
-      sector.clearSectorPt();
-      lastDrawObjGuid = exceptionObj.guid;
-    }
-    // 1. 缁樺埗鏂版墖褰㈠尯鍩�
-    const datavo = exceptionObj.midData;
-    const factorDatas = new FactorDatas();
-    factorDatas.setData([datavo], 0, () => {
-      const pr = sector.drawSectorPt(factorDatas, 0);
-      // 璋冩暣瑙嗚灞呬腑鏄剧ず
-      // mapUtil.setCenter(pr.p);
-      drawMarks(exceptionObj.relatedSceneList);
-    });
-  }, 1000);
-}
-
-let layer = undefined;
-function drawMarks(sceneList) {
-  if (layer != undefined) {
-    mapUtil.removeViews(layer);
-    // layer = undefined;
-  }
-  if (sceneList.length != 0) {
-    const icons = [];
-    sceneList.forEach((s) => {
-      icons.push(sceneIcon(s.typeId));
-    });
-    layer = marks.createLabelMarks(icons, sceneList, true);
-  }
+function timeFormatter(time) {
+  return moment(time).format('YYYY-MM-DD HH:mm:ss');
 }
 </script>
 <style scoped>
@@ -411,7 +502,7 @@
   --el-statistic-content-color: white;
 }
 
-:deep(.el-text) {
+:deep(.el-text.el-text--info) {
   --el-text-color: white;
 }
 
@@ -419,8 +510,67 @@
   --el-link-text-color: #23dad1;
 }
 
+.el-checkbox {
+  --el-checkbox-text-color: white;
+  --main-color: #23dad1;
+  --el-checkbox-checked-text-color: var(--main-color);
+  --el-checkbox-checked-input-border-color: var(--main-color);
+  --el-checkbox-checked-bg-color: var(--main-color);
+  --el-checkbox-input-border-color-hover: var(--main-color);
+
+  --el-checkbox-disabled-checked-input-fill: var(--main-color);
+  --el-checkbox-disabled-checked-input-border-color: var(--main-color);
+  --el-checkbox-disabled-checked-icon-color: white;
+  margin-right: 6px;
+  /* height: initial; */
+}
+
 .scrollbar {
-  min-width: 300px;
+  width: 400px;
+  /* max-width: 60vw; */
+  height: 65vh;
   /* color: #02ffea; */
+  padding-right: 10px;
+}
+
+.clue-card {
+  padding: 0 4px;
+  /* margin-right: 2px; */
+  width: 340px;
+  height: 35vh;
+  border-right: 1px solid white;
+  border-radius: 2px;
+}
+
+.border-dashed {
+  /* border: 1px dashed white; */
+  border: 1px dashed #ffbc58;
+  padding: 0px 1px;
+  margin-bottom: 4px;
+}
+.flex-col {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+</style>
+<style>
+.list-move, /* 瀵圭Щ鍔ㄤ腑鐨勫厓绱犲簲鐢ㄧ殑杩囨浮 */
+.list-enter-active,
+.list-leave-active {
+  /* transition: all 0.8s cubic-bezier(0.55, 0, 0.1, 1); */
+  transition: all 0.5s ease;
+}
+
+.list-enter-from,
+.list-leave-to {
+  opacity: 0;
+  transform: scaleY(0.01) translate(300px, 0);
+}
+
+/* 纭繚灏嗙寮�鐨勫厓绱犱粠甯冨眬娴佷腑鍒犻櫎
+  浠ヤ究鑳藉姝g‘鍦拌绠楃Щ鍔ㄧ殑鍔ㄧ敾銆� */
+.list-leave-active {
+  position: absolute;
 }
 </style>

--
Gitblit v1.9.3