riku
2025-06-11 30cf71affd5149a1310d84f658b028d267beee8b
动态溯源(编写中)
已修改7个文件
已添加1个文件
373 ■■■■■ 文件已修改
src/api/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components.d.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chart/RealTimeLineChart.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/MapScene.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/map/marks.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sourcetrace/SourceTrace.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sourcetrace/component/PollutedClueItem.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/underwaymix/UnderwayMixMode.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js
@@ -13,9 +13,9 @@
}
if (debug) {
  ip1 = 'http://192.168.0.110:8084/';
  ip1 = 'http://192.168.0.103:8084/';
  // ip1 = 'http://localhost:8084/';
  ws = `192.168.0.110:9031`;
  ws = `192.168.0.103:9031`;
  // ws = `localhost:9031`;
}
src/components.d.ts
@@ -39,6 +39,7 @@
    ElFormItem: typeof import('element-plus/es')['ElFormItem']
    ElIcon: typeof import('element-plus/es')['ElIcon']
    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']
src/components/chart/RealTimeLineChart.vue
@@ -1,6 +1,10 @@
<template>
  <div class="chart-wrap">
    <div ref="lineChart" class="line-chart"></div>
    <div
      ref="lineChart"
      class="line-chart"
      :style="'height:' + chartHeight + ';'"
    ></div>
  </div>
</template>
<script>
@@ -17,6 +21,10 @@
      //     series: []
      //   };
      // }
    },
    chartHeight: {
      type: String,
      default: '140px'
    }
  },
  data() {
@@ -72,7 +80,7 @@
}
.line-chart {
  width: 318px;
  height: 140px;
  /* height: 140px; */
  /* border-bottom: 1px solid rgba(255, 255, 255, 0.329); */
}
</style>
src/components/map/MapScene.vue
@@ -101,7 +101,12 @@
        const key = this.districtCode + t;
        if (!lableMarkMap.has(key)) {
          this.fetchScene(t).then((res) => {
            const layer = marks.createLabelMarks(sceneIcon(t), res, false);
            const layer = marks.createLabelMarks(
              sceneIcon(t),
              res,
              false,
              false
            );
            lableMarkMap.set(key, { show: true, layer });
          });
        } else {
src/utils/map/marks.js
@@ -86,7 +86,7 @@
   * @param {boolean} collision æ ‡æ³¨é¿è®©
   * @returns
   */
  createLabelMarks(img, dataList, collision = true) {
  createLabelMarks(img, dataList, collision = true, showTxt = true) {
    // eslint-disable-next-line no-undef
    const layer = new AMap.LabelsLayer({
      zooms: [3, 20],
@@ -119,7 +119,7 @@
          retina: true
        },
        text: {
          content: data.name,
          content: showTxt ? data.name : '',
          direction: 'top',
          offset: [0, -5],
          style: {
src/views/sourcetrace/SourceTrace.vue
@@ -10,161 +10,14 @@
    <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" class="scrollbar">
            <div
              ref="scrollContentRef"
              style="display: flex; width: fit-content"
            >
              <el-scrollbar
                v-for="(item, index) in streams"
                :key="index"
                class="clue-card"
              >
                <el-row justify="space-between">
                  <!-- <el-tag v-if="index == 0" type="danger">最新</el-tag> -->
                  <el-text type="primary">{{
                    '线索时间:' +
                    item.pollutedData.startTime +
                    ' - ' +
                    item.pollutedData.endTime
                  }}</el-text>
                  <el-link
                    type="primary"
                    :underline="true"
                    @click="showMarksAndPolygon(item)"
                  >
                    {{ item.showMore ? '收起异常' : '定位异常' }}
                  </el-link>
                </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 style="border-top: 1px solid white">
                  <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="showMarksAndPolygon(item)"
                  >
                    {{
                      (item.showMore ? '收起溯源场景' : '查看溯源场景') +
                      '(' +
                      item.pollutedSource.sceneList.length +
                      ')'
                    }}
                  </el-link> -->
                </el-row>
                <div style="width: 320px; height: 140px">
                  <RealTimeLineChart
                    v-for="(item1, index1) in item._chartOptions"
                    :key="index1"
                    :model-value="item1"
                  ></RealTimeLineChart>
                </div>
                <div class="border-dashed">
                  <el-text type="" tag="mark">
                    {{ item.pollutedSource.conclusion }}
                  </el-text>
                </div>
                <SceneTable
                  :show-marks="item.showMore"
                  :scene-list="item.pollutedSource.sceneList"
                ></SceneTable>
                <!-- <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 /> -->
              </el-scrollbar>
              <template v-for="(item, index) in streams" :key="index">
                <PollutedClueItem :item="item"></PollutedClueItem>
              </template>
            </div>
          </el-scrollbar>
        </template>
@@ -187,6 +40,8 @@
import { FactorDatas } from '@/model/FactorDatas';
import factorDataParser from '@/utils/chart/factor-data-parser';
import websocketMsgParser from '@/views/sourcetrace/websocketMsgParser.js';
import PollutedClueItem from './component/PollutedClueItem.vue';
const props = defineProps({
  factorType: String
@@ -320,7 +175,7 @@
function parseChartData(obj) {
  // console.log('折线图:start');
  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,
src/views/sourcetrace/component/PollutedClueItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
<template>
  <!-- <BaseCard>
    <template #content> -->
  <el-scrollbar class="clue-card">
    <el-row justify="space-between">
      <!-- <el-tag v-if="index == 0" type="danger">最新</el-tag> -->
      <el-text type="primary">{{
        '线索时间:' +
        item.pollutedData.startTime +
        ' - ' +
        item.pollutedData.endTime
      }}</el-text>
      <el-link
        type="primary"
        :underline="true"
        @click="showMarksAndPolygon(item)"
      >
        {{ item.showMore ? '收起异常' : '定位异常' }}
      </el-link>
    </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>
    <div>
      <el-text type="primary">
        å¼‚常类型:{{ item.pollutedData.exception }}
      </el-text>
    </div>
    <el-row style="border-top: 1px solid white">
      <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="showMarksAndPolygon(item)"
                  >
                    {{
                      (item.showMore ? '收起溯源场景' : '查看溯源场景') +
                      '(' +
                      item.pollutedSource.sceneList.length +
                      ')'
                    }}
                  </el-link> -->
    </el-row>
    <!-- <div style="width: 320px; height: 80px"> -->
    <RealTimeLineChart
      v-for="(item1, index1) in item._chartOptions"
      :key="index1"
      :model-value="item1"
      chart-height="80px"
    ></RealTimeLineChart>
    <!-- </div> -->
    <div class="border-dashed">
      <el-text type="" tag="mark">
        {{ item.pollutedSource.conclusion }}
      </el-text>
    </div>
    <SceneTable
      :show-marks="item.showMore"
      :scene-list="item.pollutedSource.sceneList"
    ></SceneTable>
    <!-- <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 /> -->
  </el-scrollbar>
  <!-- </template>
  </BaseCard> -->
</template>
<script setup>
import { ref } from 'vue';
const props = defineProps({
  item: Object
});
</script>
<style scoped>
:deep(.el-statistic) {
  --el-statistic-title-color: rgb(215, 215, 215);
  --el-statistic-content-color: white;
}
:deep(.el-text.el-text--primary) {
  --el-text-color: white;
}
:deep(.el-link) {
  --el-link-text-color: #23dad1;
}
.scrollbar {
  min-width: 300px;
  max-width: 60vw;
  /* height: 35vh; */
  /* color: #02ffea; */
}
.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;
}
</style>
src/views/underwaymix/UnderwayMixMode.vue
@@ -229,7 +229,7 @@
const props = defineProps({
  groupId: {
    type: Number,
    default: 2
    default: 3
  }
});
const show = ref(true);