riku
2025-07-18 306ef09707d6bcf9ffa67de55f86ab6f4362deee
src/views/historymode/HistoryMode.vue
@@ -4,17 +4,17 @@
      <SearchBar
        v-show="status == 0"
        :search-time="searchTime"
        :loading="loading"
        :loading="loading || thirdPartyLoading"
        @search="onSearch"
      ></SearchBar>
      <TrajectoryState v-show="status != 0" :status="status"></TrajectoryState>
      <el-button
      <!-- <el-button
        type="primary"
        class="p-events-auto el-button-custom"
        @click="handleClick"
      >
        分析
      </el-button>
      </el-button> -->
    </el-row>
    <el-row class="m-t-2">
      <FactorRadio
@@ -28,7 +28,6 @@
        :factor="factorDatas.factor[factorType]"
        @change="handleLegendTypeChange"
      ></FactorLegend>
      <SourceTrace></SourceTrace>
    </el-row>
    <el-row class="historical" justify="center">
      <HistoricalTrajectory
@@ -53,6 +52,13 @@
      :device-type="deviceType"
      :device-code="deviceCode"
    ></DataSheet>
    <SourceTrace
      class="source-trace"
      v-model:factorType="factorType"
      direction="left"
      mode="history"
      :mission-code="missionCode"
    ></SourceTrace>
  </div>
</template>
@@ -74,6 +80,7 @@
import { ElMessage } from 'element-plus';
import { fetchHistoryData } from '@/utils/factor/data';
import dataAnalysisApi from '@/api/dataAnalysisApi';
import thirdPartyDataApi from '@/api/thirdPartyDataApi';
import { mapStores } from 'pinia';
import { useSceneStore } from '@/stores/scene';
@@ -86,6 +93,7 @@
  },
  data() {
    return {
      missionCode: undefined,
      // 监测设备类型
      deviceType: TYPE0,
      // 监测设备编号
@@ -108,15 +116,18 @@
      // 轨迹动画状态
      status: 0,
      // 是否页面已跳转
      isUnmounted: false
      isUnmounted: false,
      // 第三方数据获取是否尝试
      isFetchThirdParty: false,
      thirdPartyLoading: false
    };
  },
  watch: {
    factorType(nValue, oValue) {
      if (nValue != oValue && this.status == 0) {
        Layer.clear();
        this.draw();
        this.drawHighlightPollution();
        this.draw(true);
        // this.drawHighlightPollution();
      }
    }
  },
@@ -158,13 +169,17 @@
      done();
      this.draw();
    },
    draw() {
    draw(notSetBound) {
      // 刷新图例
      const factor = this.factorDatas.factor[this.factorType];
      sector.clearSector();
      // this.drawRoadLine(factor);
      this.drawRoadMap(factor);
      this.drawMassMarks(factor);
      // 调整地图视角
      if (!notSetBound) {
        mapUtil.setBound(this.factorDatas.lnglats_GD);
      }
    },
    // 绘制3D走行路线图
    drawRoadMap(e) {
@@ -179,8 +194,6 @@
      marks.drawMassMarks(this.factorDatas, e, (index) => {
        this.handelIndexChange(index);
      });
      // 调整地图视角
      mapUtil.setBound(this.factorDatas.lnglats_GD);
    },
    drawSector(index) {
      // 1. 绘制新扇形区域
@@ -223,6 +236,7 @@
      this.deviceType = deviceType;
      this.deviceCode = deviceCode;
      this.mission = mission;
      this.missionCode = mission.missionCode;
      let startTime, endTime;
      if (timeArray && timeArray.length == 2) {
        startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
@@ -236,8 +250,32 @@
          endTime,
          page,
          perPage: pageSize
        }).then((res) => this.onFetchData(deviceType, res.data));
        }).then((res) => {
          this.onFetchData(deviceType, res.data);
          if (
            res.data.length == 0 &&
            this.isFetchThirdParty != mission.missionCode
          ) {
            this.onThirdPartyFetch(option);
          }
        });
      });
    },
    onThirdPartyFetch(option) {
      const { mission } = option;
      if (import.meta.env.VITE_DATA_MODE == 'jingan') {
        this.thirdPartyLoading = true;
        this.isFetchThirdParty = mission.missionCode;
        // 通知服务端启动任务范围内的第三方数据获取任务
        thirdPartyDataApi
          .fetchMissionData(mission.missionCode)
          .then((res) => {
            if (res.data) {
              this.onSearch(option);
            }
          })
          .finally(() => (this.thirdPartyLoading = false));
      }
    },
    handleClick() {
      const { missionCode } = this.mission;
@@ -279,4 +317,9 @@
  left: 0;
  right: 0;
}
.source-trace {
  position: absolute;
  right: 0;
  bottom: 0px;
}
</style>