3daf8eebf8c0d5b4561f38e21c50818c8f6768b7..a09f984cbe2369e13d8694e91c4f8165ec6c2ba9
2025-08-20 riku
动态溯源模块优化
a09f98 对比 | 目录
2025-07-29 riku
新增巡查任务编辑功能
fa9d2b 对比 | 目录
已修改6个文件
133 ■■■■ 文件已修改
src/components/mission/MissionEdit.vue 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mission/MissionManage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/scene-types/options.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sourcetrace/SourceTrace.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sourcetrace/component/ClueRecordItem.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sourcetrace/component/SourceTraceFilter.vue 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mission/MissionEdit.vue
@@ -114,6 +114,11 @@
});
const param = computed(() => {
  return {
    provinceCode: formObj.value.location.pCode,
    provinceName: formObj.value.location.pName,
    cityCode: formObj.value.location.cCode,
    cityName: formObj.value.location.cName,
    districtCode: formObj.value.location.dCode,
    districtName: formObj.value.location.dName,
    missionCode: formObj.value.missionCode,
    deviceType: formObj.value.deviceType,
@@ -124,7 +129,12 @@
});
function submitMission() {
  const newMission = { ...param.value };
  // const newMission = { ...param.value };
  if (props.mode == 'create') {
    createMission();
  } else {
    updateMission();
  }
}
// 创建任务
@@ -140,9 +150,23 @@
      .finally(() => emits('update:modelValue', false));
  });
}
function updateMission() {
  fetchData((page, pageSize) => {
    return missionApi
      .updateMission(param.value)
      .then((res) => {
        missionStore.fetchMission();
        // 通知服务端启动任务范围内的第三方数据获取任务
        thirdPartyDataApi.fetchMissionData(param.value.missionCode);
      })
      .finally(() => emits('update:modelValue', false));
  });
}
const { formObj, formRef, edit, onSubmit, onCancel } = useFormConfirm({
  submit: {
    do: createMission
    do: submitMission
  },
  cancel: {
    do: () => {
@@ -161,7 +185,14 @@
        initFormObj();
      }
      if (m && props.mode == 'update') {
        formObj.value.location = { dName: m.districtName };
        formObj.value.location = {
          pCode: m.provinceCode,
          pName: m.provinceName,
          cCode: m.cityCode,
          cName: m.cityName,
          dCode: m.districtCode,
          dName: m.districtName
        };
        formObj.value.missionCode = m.missionCode;
        formObj.value.deviceType = m.deviceType;
        formObj.value.deviceCode = m.deviceCode;
src/components/mission/MissionManage.vue
@@ -46,13 +46,13 @@
          <el-table-column label="管理" width="160" align="center">
            <template #default="{ row }">
              <!-- <MissionEdit mode="update"></MissionEdit> -->
              <!-- <el-button
              <el-button
                type="primary"
                size="small"
                icon="EditPen"
                class="el-button-custom"
                @click="updateMission(row)"
              ></el-button> -->
              ></el-button>
              <el-button
                type="primary"
                size="small"
src/constant/scene-types/options.js
@@ -82,5 +82,9 @@
  {
    label: '市控点',
    value: '20'
  },
  {
    label: '小微站',
    value: '21'
  }
];
src/views/sourcetrace/SourceTrace.vue
@@ -200,7 +200,10 @@
        }
        // 判断场景类型是否选中
        if (v.pollutedSource.sceneList.length == 0) {
        if (
          v.pollutedSource == undefined ||
          v.pollutedSource.sceneList.length == 0
        ) {
          b3 = selectedSceneTypes.value.indexOf(NO_SCENE) != -1;
        } else {
          b3 =
@@ -306,25 +309,29 @@
      }
      // 筛选场景类型
      if (objData.pollutedSource.sceneList.length == 0) {
        // 若没有找到风险源时,将该分类设定为null
        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) {
      if (objData.pollutedSource != undefined) {
        if (objData.pollutedSource.sceneList.length == 0) {
          // 若没有找到风险源时,将该分类设定为null
          if (sceneOptions.value.findIndex((v) => v.value == NO_SCENE) == -1) {
            sceneOptions.value.push({
              label: s.type,
              value: s.typeId
              label: '未知',
              value: NO_SCENE
            });
            selectedSceneTypes.value.push(s.typeId);
            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;
@@ -355,6 +362,10 @@
  dataAnalysisApi
    .fetchPollutionTraceHistory(props.missionCode)
    .then((res) => {
      factorOptions.value = [];
      selectedFactorTypes.value = [];
      sceneOptions.value = [];
      selectedSceneTypes.value = [];
      const objList = JSON.parse(res.data);
      objList.forEach((obj) => {
        obj._type = obj.msgType + '';
src/views/sourcetrace/component/ClueRecordItem.vue
@@ -43,7 +43,7 @@
          <el-text :type="noWarn ? 'info' : 'warning'">
            {{
              item.pollutedSource.sceneList.length == 0
                ? '未找到风险源'
                ? '可能存在现场污染,请注意周边情况。'
                : '找到' + item.pollutedSource.sceneList.length + '个风险源'
            }}
          </el-text>
src/views/sourcetrace/component/SourceTraceFilter.vue
@@ -26,15 +26,15 @@
          size="default"
          :min="1"
        >
          <el-space>
            <el-checkbox
              v-for="item in factorOptions"
              :value="item.value"
              :key="item.label"
            >
              {{ item.label }}
            </el-checkbox>
          </el-space>
          <!-- <el-space> -->
          <el-checkbox
            v-for="item in factorOptions"
            :value="item.value"
            :key="item.label"
          >
            {{ item.label }}
          </el-checkbox>
          <!-- </el-space> -->
        </el-checkbox-group>
      </el-space>
    </div>
@@ -65,13 +65,30 @@
import { ref } from 'vue';
const props = defineProps({
  // 数据切片,线索、提示、溯源
  /**
   * 包含追踪信息的数据切片,包括线索、提示和溯源数据
   * @type {Array}
   */
  dataSlice: Array,
  // 监测因子
  /**
   * 监测因子类型数组
   * @type {Array}
   */
  factorType: Array,
  /**
   * 监测因子的可用选项
   * @type {Array<{value: string, label: string}>}
   */
  factorOptions: Array,
  // 场景类型
  /**
   * 用于过滤的场景类型数组
   * @type {Array}
   */
  sceneType: Array,
  /**
   * 场景选择的可用选项
   * @type {Array<{value: string, label: string}>}
   */
  sceneOptions: Array
});