From ad208889ad6ca2283a06d7bc440ecd289c535d83 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 03 四月 2025 17:26:29 +0800
Subject: [PATCH] 1. 添加显示问题整改的时间; 2. 新增巡查场景数、巡查点次、复查点次的统计; 3. 添加扬尘监测数据统计结果管理(待完成)

---
 src/enum/scene copy.js                                      |  185 ++++++++++++++
 src/enum/scene.js                                           |    6 
 src/views/fysp/check/ProCheck.vue                           |  139 +++-------
 src/views/fysp/check/components/CompSubTaskStatistic.vue    |  226 +++++++++++++---
 src/api/fytz/configApi.js                                   |   16 +
 src/components/SearchBar.vue                                |   32 -
 src/views/fysp/evaluation/components/CompDataResultEdit.vue |   18 +
 src/views/fysp/check/components/CompProRecent.vue           |   52 ++-
 src/views/fysp/check/components/CompProblemCard.vue         |   51 +++
 9 files changed, 515 insertions(+), 210 deletions(-)

diff --git a/src/api/fytz/configApi.js b/src/api/fytz/configApi.js
new file mode 100644
index 0000000..7a6ddec
--- /dev/null
+++ b/src/api/fytz/configApi.js
@@ -0,0 +1,16 @@
+import { $fytz } from '../index';
+
+/**
+ * 鍔ㄦ�侀厤缃浉鍏矨PI鎺ュ彛
+ */
+export default {
+  /**
+   * 鑾峰彇鐢ㄦ埛绫诲瀷鍙敤鐨勫満鏅寖鍥�
+   */
+  // Fixme 2025.4.2: 鏆傛椂榛樿浣跨敤绠$悊鍛樼敤鎴穒d锛屽悗缁姞鍏ユ潈闄愮鐞嗗悗锛屾牴鎹櫥褰曠敤鎴峰姩鎬佽幏鍙�
+  fetchSceneTypeRange(userId = 'pGrkC8e8eu8jGPgf') {
+    return $fytz
+      .get(`config/scene/range`, { params: { userId } })
+      .then((res) => res.data);
+  },
+};
diff --git a/src/components/SearchBar.vue b/src/components/SearchBar.vue
index b137a36..49c3e62 100644
--- a/src/components/SearchBar.vue
+++ b/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();
   }
 };
diff --git a/src/enum/scene copy.js b/src/enum/scene copy.js
new file mode 100644
index 0000000..328c38d
--- /dev/null
+++ b/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 };
diff --git a/src/enum/scene.js b/src/enum/scene.js
index 5aeb977..4e07130 100644
--- a/src/enum/scene.js
+++ b/src/enum/scene.js
@@ -119,7 +119,11 @@
     {
       label: '鍫嗗満',
       value: '14'
-    }
+    },
+    {
+      label: '绮惧搧灏忓尯',
+      value: '15'
+    },
   ];
 }
 
diff --git a/src/views/fysp/check/ProCheck.vue b/src/views/fysp/check/ProCheck.vue
index 411065c..5f02bd7 100644
--- a/src/views/fysp/check/ProCheck.vue
+++ b/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>
diff --git a/src/views/fysp/check/components/CompProRecent.vue b/src/views/fysp/check/components/CompProRecent.vue
index 930bbbb..66fc00c 100644
--- a/src/views/fysp/check/components/CompProRecent.vue
+++ b/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) {
diff --git a/src/views/fysp/check/components/CompProblemCard.vue b/src/views/fysp/check/components/CompProblemCard.vue
index afbeb8c..77f907d 100644
--- a/src/views/fysp/check/components/CompProblemCard.vue
+++ b/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) {
diff --git a/src/views/fysp/check/components/CompSubTaskStatistic.vue b/src/views/fysp/check/components/CompSubTaskStatistic.vue
index 375ae5c..58e88cf 100644
--- a/src/views/fysp/check/components/CompSubTaskStatistic.vue
+++ b/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) {
diff --git a/src/views/fysp/evaluation/components/CompDataResultEdit.vue b/src/views/fysp/evaluation/components/CompDataResultEdit.vue
index fbfaf1c..6463e7d 100644
--- a/src/views/fysp/evaluation/components/CompDataResultEdit.vue
+++ b/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();

--
Gitblit v1.9.3