riku
2025-06-24 4fbdf4c6b13d19b9be54900b5dcff29e2ca7ef01
src/views/fysp/check/components/CompSubTaskStatistic.vue
@@ -1,83 +1,348 @@
<template>
  <el-descriptions :column="8" size="small" border direction="vertical">
    <el-descriptions-item label="任务总计">{{ summary.total }}</el-descriptions-item>
    <el-descriptions-item label="问题未审核">{{ summary.proUnCheck }}</el-descriptions-item>
    <el-descriptions-item label="问题部分审核">{{ summary.proPartCheck }}</el-descriptions-item>
    <el-descriptions-item label="问题全部审核">{{ summary.proAllCheck }}</el-descriptions-item>
    <el-descriptions-item label="未整改">{{ summary.UnChange }}</el-descriptions-item>
    <el-descriptions-item label="整改未审核">{{ summary.changeUnCheck }}</el-descriptions-item>
    <el-descriptions-item label="整改部分审核">{{ summary.changePartCheck }}</el-descriptions-item>
    <el-descriptions-item label="整改全部审核">{{ summary.changeAllCheck }}</el-descriptions-item>
  </el-descriptions>
  <!-- <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 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"
      >
        <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"
      >
        <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'
        "
      >
        <template #label>
          <el-text size="small"> 整改率 </el-text>
        </template>
        {{ formatPercent(summary.changePer) }}
      </el-descriptions-item>
    </el-descriptions>
    <el-descriptions
      class="m-l-4"
      :column="8"
      size="small"
      border
      direction="vertical"
    >
      <el-descriptions-item
        label="无问题"
        label-class-name="pro-check-label"
        class-name="secondary-content"
      >
        <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'
        "
      >
        <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'
        "
      >
        <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"
      >
        <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'
        "
      >
        <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'
        "
      >
        <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'
        "
      >
        <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"
      >
        <template #label>
          <el-text size="small"> 全部审核 </el-text>
        </template>
        {{ summary.changeAllCheck }}
      </el-descriptions-item>
    </el-descriptions>
  </el-row>
</template>
<script>
export default {
  props: {
    subtasks: Array
    loading: Boolean,
    sceneType: Number,
    subtasks: {
      type: Array,
      default: () => []
    },
    monitorObjList: {
      type: Array,
      default: () => []
    }
  },
  computed: {
    //任务问题审核情况统计信息
    summary() {
      const _summary = {
        total: 0,
        noProblem: 0,
        proUnCheck: 0,
        proPartCheck: 0,
        proAllCheck: 0,
        UnChange: 0,
        changeUnCheck: 0,
        changePartCheck: 0,
        changeAllCheck: 0
      }
        changeAllCheck: 0,
        proCount: 0,
        changeCount: 0,
        changePer: 0
      };
      this.subtasks.forEach((s) => {
        _summary.total++
        _summary.total++;
        _summary.proCount += s.data.proNum;
        _summary.changeCount += s.data.changeNum;
        // 问题审核情况
        if (s.data.proNum == 0) {
          _summary.proAllCheck++
          _summary.noProblem++;
        } else if (s.data.proCheckedNum == 0) {
          _summary.proUnCheck++
          _summary.proUnCheck++;
        } else if (s.data.proCheckedNum < s.data.proNum) {
          _summary.proPartCheck++
          _summary.proPartCheck++;
        } else {
          _summary.proAllCheck++
          _summary.proAllCheck++;
        }
        // 是否有未整改
        if (s.data.changeNum < s.data.proNum) {
          _summary.UnChange++
          _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++
            _summary.changeUnCheck++;
          } else if (s.data.changeCheckedNum < s.data.changeNum) {
            _summary.changePartCheck++
            _summary.changePartCheck++;
          } else {
            _summary.changeAllCheck++
            _summary.changeAllCheck++;
          }
        }
      })
      // _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
      if (_summary.proCount != 0) {
        _summary.changePer = _summary.changeCount / _summary.proCount;
      }
      return _summary;
    },
    // 巡查任务执行进度
    progress() {
      const _res = {
        total: 0,
        completedScenes: 0,
        completedTimes: 0,
        reviewTimes: 0
      };
      // Fixme 2025.5.30: 目前此处的监管版本信息钟记录的任务完成次数有偏差,所以暂时先改为通过巡查任务本身进行统计
      /**************************************************************************************/
      // this.monitorObjList.forEach((m) => {
      //   if (this.sceneType == undefined || m.sceneTypeId == this.sceneType) {
      //     _res.total++;
      //     const times = parseInt(m.extension1);
      //     if (times) {
      //       _res.completedScenes++;
      //       _res.completedTimes += times;
      //       _res.reviewTimes += times - 1;
      //     }
      //   }
      // });
      /**************************************************************************************/
      /**************************************************************************************/
      _res.total = this.monitorObjList.filter(
        (m) => this.sceneType == undefined || m.sceneTypeId == this.sceneType
      ).length;
      _res.completedTimes = this.subtasks.length;
      const map = new Map();
      const uniqueArr = [];
      for (let item of this.subtasks) {
        if (!map.has(item.data.sceneId)) {
          map.set(item.data.sceneId, true);
          uniqueArr.push(item);
        }
      }
      _res.completedScenes = uniqueArr.length;
      _res.reviewTimes = _res.completedTimes - _res.completedScenes;
      /**************************************************************************************/
      return _res;
    }
  },
  methods: {
    formatPercent(value) {
      return Math.round(value * 1000) / 10 + '%';
    }
  }
}
};
</script>
<style scoped>
:deep(.el-descriptions__cell) {
  padding: 0px 4px !important;
  /* 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(.pro-check-label) {
  background: var(--el-color-warning-light-7) !important;
}
:deep(.change-check-label) {
  background: var(--el-color-danger-light-7) !important;
}
:deep(.danger-content) {
  color: var(--el-color-danger) !important;
  font-weight: 600 !important;
  font-size: 17px !important;
}
:deep(.secondary-content) {
  color: var(--el-text-color-regular) !important;
  font-size: 12px !important;
}
</style>