From c1d2051abc8ca88cd07f0d7c56c0dbf8165d5c33 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 18 九月 2025 17:02:22 +0800
Subject: [PATCH] 2025.9.18 数据产品(待完成)

---
 src/views/fysp/check/components/CompSubTaskStatistic.vue |  351 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 308 insertions(+), 43 deletions(-)

diff --git a/src/views/fysp/check/components/CompSubTaskStatistic.vue b/src/views/fysp/check/components/CompSubTaskStatistic.vue
index 7709ba4..7e30a44 100644
--- a/src/views/fysp/check/components/CompSubTaskStatistic.vue
+++ b/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>

--
Gitblit v1.9.3