1. 添加显示问题整改的时间;
2. 新增巡查场景数、巡查点次、复查点次的统计;
3. 添加扬尘监测数据统计结果管理(待完成)
已修改7个文件
已添加2个文件
725 ■■■■ 文件已修改
src/api/fytz/configApi.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/SearchBar.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/enum/scene copy.js 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/enum/scene.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/ProCheck.vue 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProRecent.vue 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemCard.vue 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompSubTaskStatistic.vue 226 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/evaluation/components/CompDataResultEdit.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/fytz/configApi.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
import { $fytz } from '../index';
/**
 * åŠ¨æ€é…ç½®ç›¸å…³API接口
 */
export default {
  /**
   * èŽ·å–ç”¨æˆ·ç±»åž‹å¯ç”¨çš„åœºæ™¯èŒƒå›´
   */
  // Fixme 2025.4.2: æš‚时默认使用管理员用户id,后续加入权限管理后,根据登录用户动态获取
  fetchSceneTypeRange(userId = 'pGrkC8e8eu8jGPgf') {
    return $fytz
      .get(`config/scene/range`, { params: { userId } })
      .then((res) => res.data);
  },
};
src/components/SearchBar.vue
@@ -1,6 +1,6 @@
<template>
  <el-row class="layout">
    <el-col :span="12">
    <el-col :span="10">
      <el-form :inline="true" :model="formSearch">
        <el-form-item label="总任务">
          <!-- <el-input v-model="formSearch.topTaskId" placeholder="总任务" /> -->
@@ -17,26 +17,17 @@
            />
          </el-select>
        </el-form-item>
        <el-form-item label="场景类型">
          <el-select
            v-model="formSearch.sceneTypeId"
            placeholder="场景类型"
            style="width: 150px"
          >
            <el-option
              v-for="s in sceneTypes"
              :key="s.value"
              :label="s.label"
              :value="s.value"
            />
          </el-select>
        </el-form-item>
        <FYOptionScene
          :allOption="true"
          :type="2"
          v-model:value="formSearch.scenetype"
        ></FYOptionScene>
        <el-form-item>
          <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>
      </el-form>
    </el-col>
    <el-col :span="12">
    <el-col :span="14">
      <el-row justify="end">
        <slot name="summary"></slot>
      </el-row>
@@ -46,17 +37,15 @@
<script>
import taskApi from '@/api/fysp/taskApi';
import { enumScene } from '@/enum/scene';
export default {
  emits: ['onSubmit'],
  data() {
    return {
      topTasks: [],
      sceneTypes: enumScene(2, false),
      formSearch: {
        topTaskId: '',
        sceneTypeId: ''
        scenetype: ''
      }
    };
  },
@@ -83,15 +72,14 @@
      );
      const param = {
        topTask: task ? task.data : {},
        sceneTypeId: this.formSearch.sceneTypeId
        sceneTypeId: this.formSearch.scenetype.value
      };
      console.log(param);
      // console.log(param);
      this.$emit('onSubmit', param);
    }
  },
  mounted() {
    this.formSearch.sceneTypeId = this.sceneTypes[0].value;
    this.getOptions();
  }
};
src/enum/scene copy.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
import sceneApi from '@/api/fysp/sceneApi';
import configApi from '@/api/fytz/configApi';
/**
 * åœºæ™¯ç±»åž‹æžšä¸¾
 * @param {Number} type 1:飞羽环境系统;2:飞羽监管系统;
 * @param {Boolean} allOption æ˜¯å¦åœ¨å¤´éƒ¨æ·»åŠ â€œå…¨éƒ¨â€é€‰é¡¹
 */
async function enumScene(type, allOption = true) {
  let func;
  switch (parseInt(type)) {
    case 1:
      func = _enumScene_1;
      break;
    case 2:
      func = _enumScene_2;
      break;
    default:
      func = _enumScene_1;
      break;
  }
  return func().then((res) => {
    if (!allOption) {
      return res.shift();
    } else {
      return res;
    }
  });
}
function getSceneName(value, type = 1) {
  return enumScene(type).then((res) => {
    return res.find((v) => {
      if (v.value == value) {
        return v;
      }
    });
  });
}
// é£žç¾½çŽ¯å¢ƒç³»ç»Ÿ
let _scene1;
function _enumScene_1() {
  if (_scene1) {
    return Promise.resolve(_scene1);
  } else {
    return configApi.fetchSceneTypeRange().then((res) => {
      _scene1 = res.data.map((r) => {
        return {
          label: r.second,
          value: r.first
        };
      });
      _scene1.unshift({
        label: '全部',
        value: null
      });
    });
  }
  // return [
  //   {
  //     label: '全部',
  //     value: null
  //   },
  //   {
  //     label: '餐饮',
  //     value: '1'
  //   },
  //   {
  //     label: '工地',
  //     value: '2'
  //   },
  //   {
  //     label: '码头',
  //     value: '3'
  //   },
  //   {
  //     label: '堆场',
  //     value: '4'
  //   },
  //   {
  //     label: '搅拌站',
  //     value: '5'
  //   },
  //   {
  //     label: '工业企业',
  //     value: '6'
  //   },
  //   {
  //     label: '汽修',
  //     value: '7'
  //   },
  //   {
  //     label: '实验室',
  //     value: '8'
  //   },
  //   {
  //     label: '医疗机构',
  //     value: '9'
  //   }
  // ];
}
// é£žç¾½ç›‘管系统
let _scene2;
function _enumScene_2() {
  if (_scene2) {
    return Promise.resolve(_scene2);
  } else {
    return sceneApi.getAllScene().then((res) => {
      _scene2 = res.map((r) => {
        return {
          label: r.sceneType,
          value: r.sceneTypeId + ''
        };
      });
      _scene2.unshift({
        label: '全部',
        value: null
      });
    });
  }
  // return [
  // {
  //   label: '全部',
  //   value: null
  // },
  //   {
  //     label: '工地',
  //     value: '1'
  //   },
  //   {
  //     label: '码头',
  //     value: '2'
  //   },
  //   {
  //     label: '搅拌站',
  //     value: '3'
  //   },
  //   {
  //     label: '工业企业',
  //     value: '4'
  //   },
  //   {
  //     label: '餐饮',
  //     value: '5'
  //   },
  //   {
  //     label: '汽修',
  //     value: '6'
  //   },
  //   {
  //     label: '道路扬尘监测点',
  //     value: '9'
  //   },
  //   {
  //     label: '道路',
  //     value: '10'
  //   },
  //   {
  //     label: '堆场',
  //     value: '14'
  //   }
  // ];
}
/**
 * é£žç¾½ç›‘管系统 åœºæ™¯ç±»åž‹è½¬ é£žç¾½çŽ¯å¢ƒç³»ç»Ÿ
 * @param {*} sceneTypeId
 */
async function svToTz(sceneTypeId) {
  const sv = await _enumScene_2();
  const tz = await _enumScene_1();
  const scType = sv.find((v) => {
    return v.value == sceneTypeId + '';
  });
  const tzType = tz.find((v) => {
    return v.label == scType.label;
  });
  return tzType ? tzType : scType;
}
export { enumScene, getSceneName, svToTz };
src/enum/scene.js
@@ -119,7 +119,11 @@
    {
      label: '堆场',
      value: '14'
    }
    },
    {
      label: '精品小区',
      value: '15'
    },
  ];
}
src/views/fysp/check/ProCheck.vue
@@ -3,7 +3,11 @@
    <template #header>
      <SearchBar @on-submit="search">
        <template #summary>
          <CompSubTaskStatistic :subtasks="subtasks" />
          <CompSubTaskStatistic
            :loading="sideLoading"
            :subtasks="subtasks"
            :monitorObjList="curMonitorObjList"
          />
        </template>
      </SearchBar>
    </template>
@@ -16,29 +20,31 @@
      ></SideList>
    </template>
    <template #main>
      <ToolBar
        :title="curSubtask.title"
        :descriptions="proStatus"
        :buttons="buttons"
        :loading="mainLoading"
      ></ToolBar>
      <el-scrollbar
        v-if="curProList.length > 0"
        class="el-scrollbar"
        v-loading="mainLoading"
      >
        <CompProblemCard
          :key="i"
          v-for="(p, i) in curProList"
          :index="i + 1"
          :problem="p"
          :subtask="curSubtask.data"
          :topTask="topTask"
          @submit="updateSubtask"
          @check="handleProblemCheck"
        ></CompProblemCard>
      <el-scrollbar >
        <ToolBar
          :title="curSubtask.title"
          :descriptions="proStatus"
          :buttons="buttons"
          :loading="mainLoading"
        ></ToolBar>
        <el-scrollbar
          v-if="curProList.length > 0"
          class="scrollbar-inner"
          v-loading="mainLoading"
        >
          <CompProblemCard
            :key="i"
            v-for="(p, i) in curProList"
            :index="i + 1"
            :problem="p"
            :subtask="curSubtask.data"
            :topTask="topTask"
            @submit="updateSubtask"
            @check="handleProblemCheck"
          ></CompProblemCard>
        </el-scrollbar>
        <el-empty v-else description="暂无问题" v-loading="mainLoading" />
      </el-scrollbar>
      <el-empty v-else description="暂无问题" v-loading="mainLoading" />
    </template>
  </BaseContentLayout>
  <CompProblemAddOrUpd
@@ -97,6 +103,8 @@
      mainLoading: false,
      // æ€»ä»»åŠ¡
      topTask: {},
      // æ€»ä»»åŠ¡å·¡æŸ¥è®¡åˆ’æ¸…å•
      curMonitorObjList: [],
      //子任务列表
      subtasks: [],
      //当前选中的任务
@@ -140,81 +148,6 @@
    //问题状态
    proStatus() {
      return ProCheckProxy.proStatusArray(this.curProList);
    },
    //任务问题审核情况统计信息
    summary() {
      const _summary = [
        {
          name: '任务总计',
          value: 0,
          type: 'info'
        },
        {
          name: '问题未审核',
          value: 0,
          type: 'success',
          icon: 'SuccessFilled'
        },
        {
          name: '问题部分审核',
          value: 0,
          type: 'success',
          icon: 'SuccessFilled'
        },
        {
          name: '问题全部审核',
          value: 0,
          type: 'success',
          icon: 'SuccessFilled'
        },
        {
          name: '未整改',
          value: 0,
          type: 'info',
          icon: 'WarningFilled'
        },
        {
          name: '整改未审核',
          value: 0,
          type: 'info',
          icon: 'WarningFilled'
        },
        {
          name: '整改部分审核',
          value: 0,
          type: 'warning',
          icon: 'WarningFilled'
        },
        {
          name: '整改全部审核',
          value: 0,
          type: 'warning',
          icon: 'WarningFilled'
        }
      ];
      this.subtasks.forEach((s) => {
        _summary[0].value++;
        if (s.data.proNum == 0) {
          _summary[1].value++;
        } else if (s.data.proCheckedNum == 0) {
          _summary[3].value++;
        } else if (s.data.proCheckedNum < s.data.proNum) {
          _summary[2].value++;
        } else {
          _summary[1].value++;
        }
      });
      _summary.forEach((s, i) => {
        if (i > 0) {
          let per = Math.round((s.value / _summary[0].value) * 1000) / 10;
          if (isNaN(per)) per = 0;
          s.value = `${s.value}(${per}%)`;
        }
      });
      return _summary;
    }
  },
  methods: {
@@ -253,6 +186,9 @@
          this.sideLoading = false;
          this.mainLoading = false;
        }
      });
      taskApi.fetchMonitorObjectVersion(param.topTaskId).then((res) => {
        this.curMonitorObjList = res;
      });
    },
    //点击左侧菜单任务事件
@@ -325,7 +261,12 @@
</script>
<style scoped>
.el-scrollbar {
.scrollbar-outer {
  height: calc(100vh - 60px * 2 - 24px);
  background-color: aliceblue;
}
.scrollbar-inner {
  height: calc(100vh - 60px * 2 - 20px * 2 - var(--height-toolbar));
}
</style>
src/views/fysp/check/components/CompProRecent.vue
@@ -58,6 +58,7 @@
import CompProblemAddOrUpd from './CompProblemAddOrUpd.vue';
import taskApi from '@/api/fysp/taskApi';
import { useCloned } from '@vueuse/core';
import dayjs from 'dayjs';
export default {
  computed: {
    // repeteRate() {
@@ -97,7 +98,7 @@
    }
  },
  components: {
    CompProblemAddOrUpd,
    CompProblemAddOrUpd
  },
  mounted() {},
  data() {
@@ -132,16 +133,13 @@
    updateSubtask() {},
    generateQueryParam() {
      // ä»Šå¤©çš„æ—¥æœŸ
      const today = new Date();
      const today = dayjs(this.subtask.stPlanTime);
      // ä¸‰ä¸ªæœˆå‰
      const threeMonthsAgo = new Date(today);
      threeMonthsAgo.setMonth(today.getMonth() - 3);
      const threeMonthsAgo = today.subtract(3, 'month');
      // è®¡ç®—半年前的日期
      const sixMonthsAgo = new Date(today);
      sixMonthsAgo.setMonth(today.getMonth() - 6);
      const sixMonthsAgo = today.subtract(6, 'month');
      // è®¡ç®—一年前的日期
      const oneYearAgo = new Date(today);
      oneYearAgo.setFullYear(today.getFullYear() - 1);
      const oneYearAgo = today.subtract(1, 'year');
      return {
        startTime:
@@ -157,28 +155,32 @@
    /**
     * èŽ·å–è¿‘æœŸæƒ…å†µ
     * */
    async getRecentPros() {
    getRecentPros() {
      this.loading = true;
      this.subtaskCount = 0;
      // èŽ·å–å­ä»»åŠ¡åˆ—è¡¨
      await taskApi
        .getSubtaskByScene(this.generateQueryParam())
        .then((subtasks) => {
          this.curProList = [];
          if (subtasks) {
            subtasks.forEach((subtask) => {
              // èŽ·å–é—®é¢˜åˆ—è¡¨
              this.getProBySubtask(subtask);
            });
          }
        });
      // é¢å¤–处理
      this.curProList.sort((o1, o2) => o2.getDate() - o1.getDate());
      this.loading = false;
      taskApi.getSubtaskByScene(this.generateQueryParam()).then((subtasks) => {
        this.curProList = [];
        if (subtasks) {
          const promiseList = [];
          subtasks.forEach((subtask) => {
            // èŽ·å–é—®é¢˜åˆ—è¡¨
            promiseList.push(this.getProBySubtask(subtask));
          });
          Promise.all(promiseList)
            .then(() => {
              // é¢å¤–处理
              this.curProList.sort((o1, o2) => {
                return o2._time > o1._time;
              });
            })
            .finally(() => (this.loading = false));
        }
      });
    },
    // æ ¹æ®å­ä»»åŠ¡èŽ·å–é‡Œé¢çš„é—®é¢˜åˆ—è¡¨
    async getProBySubtask(subtask) {
      taskApi.getProBySubtask(subtask.stGuid).then((pros) => {
    getProBySubtask(subtask) {
      return taskApi.getProBySubtask(subtask.stGuid).then((pros) => {
        if (pros) {
          pros.forEach((pro) => {
            if (pro.ptguid == this.deepCopyPro.ptguid) {
src/views/fysp/check/components/CompProblemCard.vue
@@ -1,7 +1,7 @@
<template>
  <el-card class="layout" shadow="never">
    <!-- <el-row justify="space-between"> -->
    <div >
    <div>
      <el-steps
        :active="proStatus.index"
        finish-status="success"
@@ -13,7 +13,7 @@
    </div>
    <!-- </el-row> -->
    <el-descriptions :column="3" size="small">
    <el-descriptions :column="2" size="small" border>
      <template #title>
        <span class="d-index">{{ index }}</span>
        <span class="d-title">{{ title }}</span>
@@ -34,11 +34,17 @@
        v-for="(d, i) in descriptions"
        :key="i"
        :label="d.name"
        >{{ d.value }}</el-descriptions-item
      >
        <template #label>
          <el-text tag="b" size="small">
            {{ d.name }}
          </el-text>
        </template>
        {{ d.value }}
      </el-descriptions-item>
    </el-descriptions>
    <el-scrollbar style="width: 70%;">
    <el-scrollbar>
      <el-descriptions
        title=" "
        :column="2"
@@ -54,6 +60,11 @@
                t == 0 ? 'descriptions-label-1' : 'descriptions-label-2'
              "
            >
              <template #label>
                <el-text tag="b" size="small">
                  {{ pic.title }}
                </el-text>
              </template>
              <el-space>
                <el-image
                  v-for="(p, i) in pic.path"
@@ -89,7 +100,11 @@
      </el-col>
      <el-col :span="12">
        <el-row justify="end" class="btn-group">
          <el-button type="danger" size="small" @click="deletePro" :disabled="true"
          <el-button
            type="danger"
            size="small"
            @click="deletePro"
            :disabled="true"
            >删除</el-button
          >
          <!-- <el-button
@@ -261,16 +276,28 @@
    },
    // é—®é¢˜æè¿°
    descriptions() {
      return [
      const des = [
        {
          icon: 'Location',
          name: '问题位置',
          value: this.problem.location
        },
        {
          icon: 'Clock',
          name: '提交时间',
          value: this.problem.time.replace('T', ' ').split('.')[0]
        }
      ];
      if (this.problem.ischanged) {
        des.push({
          icon: 'Clock',
          name: '整改时间',
          value: this.problem.changedtime
            ? this.problem.changedtime.replace('T', ' ').split('.')[0]
            : this.problem.time.replace('T', ' ').split('.')[0]
        });
      }
      return des;
    },
    // é—®é¢˜å›¾ç‰‡
    pics() {
@@ -460,11 +487,11 @@
<!-- æ­¥éª¤æ¡è‡ªå®šä¹‰æ ·å¼ -->
<style scoped>
:deep(.el-steps--simple){
:deep(.el-steps--simple) {
  background: #fffbf731;
}
:deep(.is-wait .el-step__icon){
:deep(.is-wait .el-step__icon) {
  height: 17px;
  width: 17px;
  margin-top: 3px;
@@ -474,7 +501,7 @@
  font-size: var(--el-font-size-small);
}
:deep(.is-success .el-step__icon){
:deep(.is-success .el-step__icon) {
  height: 17px;
  width: 17px;
  margin-top: 3px;
@@ -486,17 +513,17 @@
:deep(.el-step__head.is-process) {
  border-color: var(--el-color-danger);
  color: var(--el-color-danger)
  color: var(--el-color-danger);
}
:deep(.el-step__head.is-wait) {
  border-color: var(--el-text-color-placeholder);
  color: var(--el-text-color-placeholder)
  color: var(--el-text-color-placeholder);
}
:deep(.el-step__head.is-success) {
  border-color: var(--el-color-success-light-3);
  color: var(--el-color-success-light-3)
  color: var(--el-color-success-light-3);
}
:deep(.el-step__title.is-process) {
src/views/fysp/check/components/CompSubTaskStatistic.vue
@@ -1,97 +1,215 @@
<template>
  <el-space>
    <el-descriptions :column="3" size="small" border direction="vertical">
  <el-row justify="end" v-loading="loading">
    <el-descriptions :column="4" size="small" border direction="vertical">
      <el-descriptions-item
        label="场景总计"
        label-class-name="inspection-label"
        class-name="secondary-content"
      >
        <template #label>
          <el-text size="small"> åœºæ™¯æ€»è®¡ </el-text>
        </template>
        {{ progress.total }}
      </el-descriptions-item>
      <el-descriptions-item
        label="巡查场景"
        label-class-name="inspection-label"
        class-name="secondary-content"
      >
        <template #label>
          <el-text size="small"> å·¡æŸ¥åœºæ™¯ </el-text>
        </template>
        {{ progress.completedScenes }}
      </el-descriptions-item>
      <el-descriptions-item
        label="巡查点次"
        label-class-name="inspection-label"
        class-name="secondary-content"
      >
        <template #label>
          <el-text size="small"> å·¡æŸ¥ç‚¹æ¬¡ </el-text>
        </template>
        {{ progress.completedTimes }}
      </el-descriptions-item>
      <el-descriptions-item
        label="复查点次"
        label-class-name="inspection-label"
        class-name="secondary-content"
      >
        <template #label>
          <el-text size="small"> å¤æŸ¥ç‚¹æ¬¡ </el-text>
        </template>
        {{ progress.reviewTimes }}
      </el-descriptions-item>
    </el-descriptions>
    <el-descriptions
      class="m-l-4"
      :column="3"
      size="small"
      border
      direction="vertical"
    >
      <el-descriptions-item
        label="问题数"
        label-class-name="problem-label"
        class-name="secondary-content"
        >{{ summary.proCount }}</el-descriptions-item
      >
        <template #label>
          <el-text size="small"> é—®é¢˜æ•° </el-text>
        </template>
        {{ summary.proCount }}
      </el-descriptions-item>
      <el-descriptions-item
        label="整改数"
        label-class-name="problem-label"
        class-name="secondary-content"
        >{{ summary.changeCount }}</el-descriptions-item
      >
        <template #label>
          <el-text size="small"> æ•´æ”¹æ•° </el-text>
        </template>
        {{ summary.changeCount }}
      </el-descriptions-item>
      <el-descriptions-item
        label="整改率"
        label-class-name="problem-label"
        :class-name="summary.changePer < 1 ? 'danger-content' : 'secondary-content'"
        >{{ formatPercent(summary.changePer) }}</el-descriptions-item
        :class-name="
          summary.changePer < 1 ? 'danger-content' : 'secondary-content'
        "
      >
        <template #label>
          <el-text size="small"> æ•´æ”¹çއ </el-text>
        </template>
        {{ formatPercent(summary.changePer) }}
      </el-descriptions-item>
    </el-descriptions>
    <el-descriptions :column="8" size="small" border direction="vertical">
    <el-descriptions
      class="m-l-4"
      :column="8"
      size="small"
      border
      direction="vertical"
    >
      <el-descriptions-item
        label="巡查点次"
        label="无问题"
        label-class-name="pro-check-label"
        class-name="secondary-content"
        >{{ summary.total }}</el-descriptions-item
      >
        <template #label>
          <el-text size="small"> æ— é—®é¢˜ </el-text>
        </template>
        {{ summary.noProblem }}
      </el-descriptions-item>
      <el-descriptions-item
        label="问题未审核"
        label-class-name="pro-check-label"
        :class-name="summary.proUnCheck > 0 ? 'danger-content' : 'secondary-content'"
        >{{ summary.proUnCheck }}</el-descriptions-item
        :class-name="
          summary.proUnCheck > 0 ? 'danger-content' : 'secondary-content'
        "
      >
        <template #label>
          <el-text size="small"> é—®é¢˜æœªå®¡æ ¸ </el-text>
        </template>
        {{ summary.proUnCheck }}
      </el-descriptions-item>
      <el-descriptions-item
        label="部分审核"
        label-class-name="pro-check-label"
        :class-name="summary.proPartCheck > 0 ? 'danger-content' : 'secondary-content'"
        >{{ summary.proPartCheck }}</el-descriptions-item
        :class-name="
          summary.proPartCheck > 0 ? 'danger-content' : 'secondary-content'
        "
      >
        <template #label>
          <el-text size="small"> éƒ¨åˆ†å®¡æ ¸ </el-text>
        </template>
        {{ summary.proPartCheck }}
      </el-descriptions-item>
      <el-descriptions-item
        label="全部审核"
        label-class-name="pro-check-label"
        class-name="secondary-content"
        >{{ summary.proAllCheck }}</el-descriptions-item
      >
    </el-descriptions>
    <el-descriptions :column="8" size="small" border direction="vertical">
        <template #label>
          <el-text size="small"> å…¨éƒ¨å®¡æ ¸ </el-text>
        </template>
        {{ summary.proAllCheck }}
      </el-descriptions-item>
      <!-- </el-descriptions>
    <el-descriptions
      :column="4"
      size="small"
      border
      direction="vertical"
    > -->
      <el-descriptions-item
        label="未整改"
        label-class-name="change-check-label"
        :class-name="summary.UnChange > 0 ? 'danger-content' : 'secondary-content'"
        >{{ summary.UnChange }}</el-descriptions-item
        :class-name="
          summary.UnChange > 0 ? 'danger-content' : 'secondary-content'
        "
      >
        <template #label>
          <el-text size="small"> æœªæ•´æ”¹ </el-text>
        </template>
        {{ summary.UnChange }}
      </el-descriptions-item>
      <el-descriptions-item
        label="整改未审核"
        label-class-name="change-check-label"
        :class-name="summary.changeUnCheck > 0 ? 'danger-content' : 'secondary-content'"
        >{{ summary.changeUnCheck }}</el-descriptions-item
        :class-name="
          summary.changeUnCheck > 0 ? 'danger-content' : 'secondary-content'
        "
      >
        <template #label>
          <el-text size="small"> æ•´æ”¹æœªå®¡æ ¸ </el-text>
        </template>
        {{ summary.changeUnCheck }}
      </el-descriptions-item>
      <el-descriptions-item
        label="部分审核"
        label-class-name="change-check-label"
        :class-name="summary.changePartCheck > 0 ? 'danger-content' : 'secondary-content'"
        >{{ summary.changePartCheck }}</el-descriptions-item
        :class-name="
          summary.changePartCheck > 0 ? 'danger-content' : 'secondary-content'
        "
      >
        <template #label>
          <el-text size="small"> éƒ¨åˆ†å®¡æ ¸ </el-text>
        </template>
        {{ summary.changePartCheck }}
      </el-descriptions-item>
      <el-descriptions-item
        label="全部审核"
        label-class-name="change-check-label"
        class-name="secondary-content"
        >{{ summary.changeAllCheck }}</el-descriptions-item
      >
        <template #label>
          <el-text size="small"> å…¨éƒ¨å®¡æ ¸ </el-text>
        </template>
        {{ summary.changeAllCheck }}
      </el-descriptions-item>
    </el-descriptions>
  </el-space>
  <!-- <el-space>
    <el-tag v-for="(s, i) in summary" :key="i" :type="s.type" size="small">
      <el-icon v-if="s.icon" color="">
        <component :is="s.icon"></component>
      </el-icon>
      {{ s.name + ': ' + s.value }}
    </el-tag>
  </el-space> -->
  </el-row>
</template>
<script>
export default {
  props: {
    subtasks: Array
    loading: Boolean,
    subtasks: {
      type: Array,
      default: () => []
    },
    monitorObjList: {
      type: Array,
      default: () => []
    }
  },
  computed: {
    //任务问题审核情况统计信息
    summary() {
      const _summary = {
        total: 0,
        noProblem: 0,
        proUnCheck: 0,
        proPartCheck: 0,
        proAllCheck: 0,
@@ -110,7 +228,7 @@
        // é—®é¢˜å®¡æ ¸æƒ…况
        if (s.data.proNum == 0) {
          _summary.proAllCheck++;
          _summary.noProblem++;
        } else if (s.data.proCheckedNum == 0) {
          _summary.proUnCheck++;
        } else if (s.data.proCheckedNum < s.data.proNum) {
@@ -123,10 +241,9 @@
        if (s.data.changeNum < s.data.proNum) {
          _summary.UnChange++;
        }
        // æ•´æ”¹å®¡æ ¸æƒ…况
        if (s.data.proNum == 0) {
          _summary.changeAllCheck++;
        else if (s.data.proNum == 0) {
          // _summary.changeAllCheck++;
        } else if (s.data.changeNum > 0) {
          if (s.data.changeCheckedNum == 0) {
            _summary.changeUnCheck++;
@@ -142,6 +259,25 @@
        _summary.changePer = _summary.changeCount / _summary.proCount;
      }
      return _summary;
    },
    // å·¡æŸ¥ä»»åŠ¡æ‰§è¡Œè¿›åº¦
    progress() {
      const _res = {
        total: 0,
        completedScenes: 0,
        completedTimes: 0,
        reviewTimes: 0
      };
      this.monitorObjList.forEach((m) => {
        _res.total++;
        const times = parseInt(m.extension1);
        if (times) {
          _res.completedScenes++;
          _res.completedTimes += times;
          _res.reviewTimes += times - 1;
        }
      });
      return _res;
    }
  },
  methods: {
@@ -157,23 +293,21 @@
  /* font-size: 13px !important; */
}
:deep(.inspection-label) {
  background: var(--el-color-success-light-5) !important;
  /* color: white !important; */
}
:deep(.problem-label) {
  background: var(--el-color-primary-light-7) !important;
}
:deep(.problem-content) {
  /* background: var(--el-color-danger-light-9); */
}
:deep(.pro-check-label) {
  background: var(--el-color-success-light-7) !important;
}
:deep(.pro-check-content) {
  background: var(--el-color-warning-light-7) !important;
}
:deep(.change-check-label) {
  background: var(--el-color-warning-light-7) !important;
}
:deep(.change-check-content) {
  background: var(--el-color-danger-light-7) !important;
}
:deep(.danger-content) {
src/views/fysp/evaluation/components/CompDataResultEdit.vue
@@ -10,9 +10,7 @@
      :auto-upload="false"
    >
      <template #trigger>
        <el-button type="primary" :loading="tableLoading"
          >上传监测数据统计结果</el-button
        >
        <el-button type="primary" :loading="tableLoading">导入文件</el-button>
      </template>
      <template #tip>
        <div>
@@ -86,7 +84,7 @@
    </el-table-column>
    <el-table-column prop="drTime" label="时间" width="100">
      <template #default="{ row }">
        <span>{{ $fm.formatYMD(row.drTime) }}</span>
        <span>{{ $fm.formatYM(row.drTime) }}</span>
      </template>
    </el-table-column>
    <el-table-column prop="drExceedTimes" label="超标次数">
@@ -206,6 +204,13 @@
      </template>
    </el-table-column>
  </el-table>
  <el-button
    type="primary"
    :loading="uploadLoading"
    icon="upload"
    @click="uploadFile"
    >上传统计结果</el-button
  >
</template>
<script setup>
import { ref, reactive, watch, onMounted, getCurrentInstance } from 'vue';
@@ -229,6 +234,7 @@
const tableLoading = ref(false);
const loadTxt = ref('');
const tips = ref('');
const uploadLoading = ref(false);
const tableRowClassName = ({ row, rowIndex }) => {
  if (row.loading) {
@@ -351,7 +357,9 @@
}
// ä¸Šä¼ ç»Ÿè®¡ç»“果文档
function uploadFile() {}
function uploadFile() {
  monitordataApi.uploadDustDataResult(data.value).then((res) => {});
}
onMounted(() => {
  fetchDustDataResult();