From 8756117a473facf0bf64c9e28f821b52e46cce85 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期一, 08 七月 2024 17:38:18 +0800
Subject: [PATCH] 完善问题整改跟踪模块

---
 src/views/inspection/problem/component/ProblemSummary.vue |   31 ++
 src/views/management/ManagementView.vue                   |   50 +++
 src/views/management/TaskSummary.vue                      |  165 ++++++++++-
 src/views/management/EvaluateSummary.vue                  |   39 ++
 src/assets/styles/element/index.scss                      |    8 
 src/utils/resize-observer.js                              |   32 ++
 src/views/visualization/SupervisionVisual.vue             |   38 +-
 src/views/management/TaskStats.vue                        |    3 
 src/components.d.ts                                       |    4 
 src/views/inspection/ReInspectionView.vue                 |   71 +++++
 /dev/null                                                 |   39 --
 src/views/inspection/SelfInspection.vue                   |   44 ++
 src/main.js                                               |    1 
 src/stores/area.js                                        |   43 +++
 src/views/inspection/problem/component/ProblemTable.vue   |   87 ++++++
 index.html                                                |    2 
 src/api/fysp/taskApi.js                                   |   11 
 src/views/inspection/problem/ProblemTrack.vue             |   59 ++++
 src/views/management/StatisticView.vue                    |   52 +++
 src/views/main/MonitorView.vue                            |   28 +
 src/views/inspection/JointEnforcement.vue                 |    7 
 src/utils/css-util.js                                     |   21 +
 src/views/visualization/VisualizationView.vue             |    2 
 23 files changed, 736 insertions(+), 101 deletions(-)

diff --git a/index.html b/index.html
index 5861907..81fd4dd 100644
--- a/index.html
+++ b/index.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<html lang="en">
+<html lang="en" class="dark">
   <head>
     <meta charset="UTF-8" />
     <link rel="icon" href="/favicon.ico" />
diff --git a/src/api/fysp/taskApi.js b/src/api/fysp/taskApi.js
index 54ab091..b0072b5 100644
--- a/src/api/fysp/taskApi.js
+++ b/src/api/fysp/taskApi.js
@@ -34,7 +34,7 @@
   /**
    * 鑾峰彇瀛愪换鍔$粺璁′俊鎭�
    */
-  fetchSubtaskSummaryArea(area) {
+  fetchTaskProgress(area) {
     return $fysp.post('subtask/summary/area', area).then((res) => res.data)
   },
 
@@ -49,5 +49,14 @@
         }
       })
       .then((res) => res.data)
+  },
+
+  /**
+   * 鑾峰彇宸℃煡浠诲姟闂缁熻淇℃伅
+   * @param {Object} area
+   * @returns
+   */
+  fetchSubtaskSummaryByArea(area) {
+    return $fysp.post('subtask/summary/area/problem', area).then((res) => res.data)
   }
 }
diff --git a/src/assets/styles/element/index.scss b/src/assets/styles/element/index.scss
index 063bc6d..f490cf0 100644
--- a/src/assets/styles/element/index.scss
+++ b/src/assets/styles/element/index.scss
@@ -5,3 +5,11 @@
 //     )
 //   )
 // );
+
+@forward 'element-plus/theme-chalk/src/dark/var.scss' with (
+  $bg-color: (
+    'page': #ffffffa9,
+    '': #122b54a9,
+    'overlay': #122b54a9
+  )
+);
diff --git a/src/components.d.ts b/src/components.d.ts
index 6f28edd..c1a6a40 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -11,17 +11,21 @@
     copy: typeof import('./components/search/OptionLocation copy.vue')['default']
     CoreHeader: typeof import('./components/core/CoreHeader.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCalendar: typeof import('element-plus/es')['ElCalendar']
     ElCard: typeof import('element-plus/es')['ElCard']
     ElCascader: typeof import('element-plus/es')['ElCascader']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElLink: typeof import('element-plus/es')['ElLink']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElProgress: typeof import('element-plus/es')['ElProgress']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScorllbar: typeof import('element-plus/es')['ElScorllbar']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+    ElSegmented: typeof import('element-plus/es')['ElSegmented']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElStatistic: typeof import('element-plus/es')['ElStatistic']
     ElTable: typeof import('element-plus/es')['ElTable']
diff --git a/src/main.js b/src/main.js
index af0994d..78f6786 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,6 +1,7 @@
 import { createApp } from 'vue'
 import { createPinia } from 'pinia'
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+import 'element-plus/theme-chalk/src/dark/css-vars.scss'
 
 import App from './App.vue'
 import router from './router'
diff --git a/src/stores/area.js b/src/stores/area.js
new file mode 100644
index 0000000..638389f
--- /dev/null
+++ b/src/stores/area.js
@@ -0,0 +1,43 @@
+// 鍖哄煙绛涢�夌殑閫昏緫绠$悊
+
+import { defineStore } from 'pinia'
+import dayjs from 'dayjs'
+
+export const useAreaStore = defineStore('area', {
+  state: () => {
+    return {
+      area: {
+        provincecode: undefined,
+        provincename: undefined,
+        citycode: undefined,
+        cityname: undefined,
+        districtcode: undefined,
+        districtname: undefined,
+        starttime: undefined,
+        endtime: undefined,
+        scensetypeid: undefined
+      }
+    }
+  },
+  actions: {
+    // 璁剧疆琛屾斂鍖哄垝淇℃伅
+    setLocation(location) {
+      this.area.provincecode = location.pCode
+      this.area.provincename = location.pName
+      this.area.citycode = location.cCode
+      this.area.cityname = location.cName
+      this.area.districtcode = location.dCode
+      this.area.districtname = location.dName
+    },
+    // 璁剧疆鏃堕棿涓虹粰瀹氭椂闂村搴斿綋鏃ョ殑澶村熬
+    setTimeOneDay(time) {
+      const d = time ? dayjs(time) : dayjs()
+      this.area.starttime = d.startOf('day').format('YYYY-MM-DD HH:mm:ss')
+      this.area.endtime = d.endOf('day').format('YYYY-MM-DD HH:mm:ss')
+    },
+    // 璁剧疆鍦烘櫙绫诲瀷
+    setSceneType(t) {
+      this.area.scensetypeid = t
+    }
+  }
+})
diff --git a/src/utils/css-util.js b/src/utils/css-util.js
new file mode 100644
index 0000000..bf826b1
--- /dev/null
+++ b/src/utils/css-util.js
@@ -0,0 +1,21 @@
+/**
+ * 鎻愬彇css涓甫鏈塩alc鍑芥暟鐨勮〃杈惧紡鐨勫弬鏁伴儴鍒�
+ * @param {String} str css涓甫鏈塩alc鍑芥暟鐨勮〃杈惧紡
+ */
+function unCalc(str) {
+  if (str.startsWith('calc(')) {
+    let _str = str.replace('calc(', '')
+    _str = _str.replace(/\)/g, (match, offset, string) => {
+      if (offset === string.lastIndexOf(match)) {
+        return ''
+      } else {
+        return match
+      }
+    })
+    return _str
+  } else {
+    return str
+  }
+}
+
+export { unCalc }
diff --git a/src/utils/resize-observer.js b/src/utils/resize-observer.js
new file mode 100644
index 0000000..617c6d3
--- /dev/null
+++ b/src/utils/resize-observer.js
@@ -0,0 +1,32 @@
+//瀵逛簬瀵硅薄鐨勫紩鐢ㄦ槸寮卞紩鐢紝杩欐剰鍛崇潃鍦ㄦ病鏈夊叾浠栧紩鐢ㄥ瓨鍦ㄦ椂鍨冨溇鍥炴敹鑳芥纭繘琛屻�傚湪鍙栨秷寮曠敤鏃讹紝涓嶉渶瑕佹墜鍔ㄥ垹闄ゅ厓绱狅紝鍥犱负瀹冧滑浼氳嚜鍔ㄨ鍨冨溇鍥炴敹銆�
+const map = new WeakMap()
+
+// ResizeObserver鏄竴涓瀯閫犲嚱鏁帮紝鐢ㄤ簬鐩戝惉鍏冪礌鐨勫彉鍖栵紝褰撳厓绱犵殑灏哄鍙戠敓鍙樺寲鏃讹紝浼氳Е鍙戝洖璋冨嚱鏁般��
+const divs = new ResizeObserver((entries) => {
+  // entries鏄竴涓暟缁勶紝鍖呭惈鎵�鏈夎瑙傚療鐨勫厓绱犵殑淇℃伅
+  for (const entry of entries) {
+    // 灏嗗厓绱犲拰鍥炶皟鍑芥暟鍙栧嚭
+    const handler = map.get(entry.target)
+    // 濡傛灉鍥炶皟鍑芥暟瀛樺湪锛屽垯璋冪敤鍥炶皟鍑芥暟
+    if (handler) {
+      handler({
+        width: Math.ceil(entry.borderBoxSize[0].inlineSize), //鍏冪礌鐨勫搴�
+        height: Math.ceil(entry.borderBoxSize[0].blockSize) //鍏冪礌鐨勯珮搴�
+      })
+    }
+  }
+})
+
+//鑾峰彇浣跨敤鎸囦护鐨刣iv鐨勫楂�.e.width鍜宔.height
+export const vResize = {
+  mounted(el, binding) {
+    // 灏嗗厓绱犲拰鍥炶皟鍑芥暟瀛樺叆map涓�
+    map.set(el, binding)
+    // 寮�濮嬭瀵熷厓绱�
+    divs.observe(el)
+  },
+  unmounted(el) {
+    // 鍋滄瑙傚療鍏冪礌
+    divs.unobserve(el)
+  }
+}
diff --git a/src/views/inspection/JointEnforcement.vue b/src/views/inspection/JointEnforcement.vue
index 3e39db6..b0456e1 100644
--- a/src/views/inspection/JointEnforcement.vue
+++ b/src/views/inspection/JointEnforcement.vue
@@ -1,6 +1,9 @@
 <template>
-  <div class="border-r-small" style="height: 200px">
+  <div class="border-r-small">
     <div class="font-large">鑱斿悎鎵ф硶</div>
+    <el-scrollbar height="300px">
+      <el-calendar v-model="value" />
+    </el-scrollbar>
   </div>
 </template>
 
@@ -8,7 +11,7 @@
 export default {
   data() {
     return {
-      tasks: []
+      value: new Date()
     }
   },
   watch: {},
diff --git a/src/views/inspection/ProblemTrack.vue b/src/views/inspection/ProblemTrack.vue
deleted file mode 100644
index d0c1de1..0000000
--- a/src/views/inspection/ProblemTrack.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-<template>
-  <el-card shadow="hover">
-    <div class="font-large">宸℃煡闂璺熻釜</div>
-  </el-card>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      subtaskList: []
-    }
-  },
-  watch: {},
-  methods: {},
-  mounted() {
-    let i = 0
-    while (i < 3) {
-      this.subtaskList.push({
-        guid: 'SMuheEkjswioSn7A',
-        name: '涓鐢熸�佹暟瀛楁腐椤圭洰宸℃煡',
-        district: '閲戝北鍖�',
-        planTime: '2024-06-04',
-        startTime: '2024-06-04 13:31:26',
-        endTime: '2024-06-04 13:33:37',
-        userName: '鏈辨寮�',
-        status: '宸茬粨鏉�'
-      })
-      i++
-    }
-  }
-}
-</script>
-
-<style scoped>
-.text {
-  background-color: aliceblue;
-}
-</style>
diff --git a/src/views/inspection/ReInspectionView.vue b/src/views/inspection/ReInspectionView.vue
new file mode 100644
index 0000000..eb9786e
--- /dev/null
+++ b/src/views/inspection/ReInspectionView.vue
@@ -0,0 +1,71 @@
+<template>
+  <div class="wrapper">
+    <div>澶嶆牳宸℃煡</div>
+    <el-table
+      :data="tableData"
+      v-loading="loading"
+      table-layout="fixed"
+      :row-class-name="tableRowClassName"
+      :height="tableHeight"
+      size="small"
+    >
+      <el-table-column
+        fixed="left"
+        prop="name"
+        :show-overflow-tooltip="true"
+        label="鍚嶇О"
+        width="200"
+      >
+      </el-table-column>
+      <el-table-column prop="planTime" :show-overflow-tooltip="true" label="鏃堕棿">
+      </el-table-column>
+      <!-- <el-table-column prop="score" :show-overflow-tooltip="true" label="璇勫垎" width="60">
+      </el-table-column>
+      <el-table-column prop="risk" :show-overflow-tooltip="true" label="椋庨櫓" width="60">
+      </el-table-column> -->
+      <el-table-column prop="recheck" :show-overflow-tooltip="true" label="澶嶆牳" width="60">
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+/**
+ * 鐜板満宸℃煡瀹炴椂璺熻釜
+ */
+export default {
+  data() {
+    return {
+      tableData: [],
+      tableHeight: 'calc(var(--fy-body-height) / 3 - 27px)'
+    }
+  },
+  mounted() {
+    let i = 0
+    while (i < 20) {
+      this.tableData.push({
+        guid: 'SMuheEkjswioSn7A',
+        name: '涓鐢熸�佹暟瀛楁腐椤圭洰宸℃煡涓鐢熸�佹暟瀛楁腐椤圭洰宸℃煡',
+        district: '閲戝北鍖�',
+        planTime: '2024-06-04',
+        startTime: '2024-06-04 13:31:26',
+        endTime: '2024-06-04 13:33:37',
+        userName: '鏈辨寮�',
+        status: '宸茬粨鏉�',
+        total: 4,
+        checked: 2,
+        score: 90,
+        risk: '楂�',
+        recheck: 1
+      })
+      i++
+    }
+  }
+}
+</script>
+
+<style scoped>
+.wrapper {
+  /* height: calc(var(--fy-body-height) / 3); */
+}
+</style>
diff --git a/src/views/inspection/SelfInspection.vue b/src/views/inspection/SelfInspection.vue
index d03f0a1..866f771 100644
--- a/src/views/inspection/SelfInspection.vue
+++ b/src/views/inspection/SelfInspection.vue
@@ -1,6 +1,30 @@
 <template>
-  <div class="border-r-small" style="height: 200px">
+  <div class="border-r-small">
     <div class="font-large">搴旀�ヨ嚜宸℃煡</div>
+    <el-text>鏈湀鍏卞彂甯�4娆¤嚜宸℃煡锛屽凡瀹屾垚0娆★紝鏈畬鎴�4娆�</el-text>
+    <el-table
+      :data="tableData"
+      v-loading="loading"
+      table-layout="fixed"
+      :row-class-name="tableRowClassName"
+      :height="tableHeight"
+      size="small"
+    >
+      <el-table-column
+        fixed="left"
+        prop="name"
+        :show-overflow-tooltip="true"
+        label="浼佷笟"
+        width="200"
+      >
+      </el-table-column>
+      <el-table-column prop="planTime" :show-overflow-tooltip="true" label="鍙戝竷鏃堕棿">
+      </el-table-column>
+      <el-table-column prop="complete" :show-overflow-tooltip="true" label="瀹屾垚鎯呭喌">
+      </el-table-column>
+      <!-- <el-table-column prop="recheck" :show-overflow-tooltip="true" label="澶嶆牳" width="60">
+      </el-table-column> -->
+    </el-table>
   </div>
 </template>
 
@@ -8,12 +32,26 @@
 export default {
   data() {
     return {
-      tasks: []
+      tableData: []
     }
   },
   watch: {},
   methods: {},
-  mounted() {}
+  mounted() {
+    let i = 0
+    while (i < 4) {
+      this.tableData.push({
+        guid: 'SMuheEkjswioSn7A',
+        name: '涓鐢熸�佹暟瀛楁腐椤圭洰',
+        district: '閲戝北鍖�',
+        planTime: '2024-06-04',
+        startTime: '2024-06-04 13:31:26',
+        endTime: '2024-06-04 13:33:37',
+        complete: '0/6'
+      })
+      i++
+    }
+  }
 }
 </script>
 
diff --git a/src/views/inspection/problem/ProblemTrack.vue b/src/views/inspection/problem/ProblemTrack.vue
new file mode 100644
index 0000000..4ccefe6
--- /dev/null
+++ b/src/views/inspection/problem/ProblemTrack.vue
@@ -0,0 +1,59 @@
+<template>
+  <div class="border-r-small">
+    <div class="font-large">闂鏁存敼璺熻釜</div>
+    <div>
+      <ProblemSummary :data="subtaskList"></ProblemSummary>
+      <ProblemTable :data="subtaskList"></ProblemTable>
+    </div>
+  </div>
+</template>
+
+<script>
+import { useAreaStore } from '@/stores/area.js'
+import { mapStores } from 'pinia'
+
+import ProblemTable from './component/ProblemTable.vue'
+import ProblemSummary from './component/ProblemSummary.vue'
+import taskApi from '@/api/fysp/taskApi.js'
+
+export default {
+  components: { ProblemSummary, ProblemTable },
+  data() {
+    return {
+      subtaskList: []
+    }
+  },
+  watch: {},
+  computed: {
+    ...mapStores(useAreaStore)
+    // area() {
+    //   return {
+    //     provincecode: '31',
+    //     provincename: '涓婃捣甯�',
+    //     citycode: '3100',
+    //     cityname: '涓婃捣甯�',
+    //     districtcode: '310116',
+    //     districtname: '閲戝北鍖�',
+    //     starttime: '',
+    //     endtime: ''
+    //   }
+    // }
+  },
+  methods: {
+    fetchSubtask() {
+      taskApi.fetchSubtaskSummaryByArea(this.areaStore.area).then((res) => {
+        this.subtaskList = res.data
+      })
+    }
+  },
+  mounted() {
+    this.fetchSubtask()
+  }
+}
+</script>
+
+<style scoped>
+.text {
+  background-color: aliceblue;
+}
+</style>
diff --git a/src/views/inspection/problem/component/ProblemSummary.vue b/src/views/inspection/problem/component/ProblemSummary.vue
new file mode 100644
index 0000000..71c3684
--- /dev/null
+++ b/src/views/inspection/problem/component/ProblemSummary.vue
@@ -0,0 +1,31 @@
+<template>
+  <div>
+    闂鏁�: {{ summary.proNum }}锛屾暣鏀规暟: {{ summary.changeNum }}锛屾暣鏀圭巼: {{ summary.changePer }}
+  </div>
+</template>
+<script setup>
+import { computed, ref } from 'vue'
+
+const props = defineProps({
+  data: {
+    type: Array
+  },
+  loading: Boolean
+})
+
+const summary = computed(() => {
+  let proNum = 0,
+    changeNum = 0,
+    changePer = '/'
+  props.data.forEach((d) => {
+    proNum += d.proNum
+    changeNum += d.changeNum
+  })
+
+  if (proNum > 0) {
+    changePer = Math.round((changeNum / proNum) * 100) / 100 + '%'
+  }
+
+  return { proNum, changeNum, changePer }
+})
+</script>
diff --git a/src/views/inspection/problem/component/ProblemTable.vue b/src/views/inspection/problem/component/ProblemTable.vue
new file mode 100644
index 0000000..50c65e2
--- /dev/null
+++ b/src/views/inspection/problem/component/ProblemTable.vue
@@ -0,0 +1,87 @@
+<template>
+  <el-table
+    :data="showTableData"
+    v-loading="loading"
+    table-layout="fixed"
+    :row-class-name="tableRowClassName"
+    :height="tableHeight"
+    size="small"
+  >
+    <el-table-column type="index" label="" width="30"> </el-table-column>
+    <el-table-column prop="scene.name" :show-overflow-tooltip="true" label="鍚嶇О" width="150">
+    </el-table-column>
+    <el-table-column prop="scene.location" :show-overflow-tooltip="true" label="鍦板潃">
+    </el-table-column>
+    <el-table-column prop="proNum" :show-overflow-tooltip="true" label="闂" width="41">
+    </el-table-column>
+    <el-table-column prop="changeNum" :show-overflow-tooltip="true" label="鏁存敼" width="41">
+    </el-table-column>
+    <el-table-column :show-overflow-tooltip="true" label="鏁存敼鐜�" width="54">
+      <template #default="{ row }">
+        {{ calPer(row.proNum, row.changeNum) }}
+      </template>
+    </el-table-column>
+    <el-table-column prop="updateTime" :show-overflow-tooltip="true" label="鏃堕棿">
+      <template #default="{ row }">
+        {{ $fm.formatH(row.updateTime) }}
+      </template>
+    </el-table-column>
+  </el-table>
+  <div class="btn-more font-small">
+    <el-link type="primary" @click="showMore = !showMore">鏌ョ湅鏇村</el-link>
+  </div>
+</template>
+<script setup>
+import { computed, ref } from 'vue'
+import dayjs from 'dayjs'
+
+const props = defineProps({
+  data: {
+    type: Array
+  },
+  loading: Boolean
+})
+
+const showMore = ref(false)
+
+const tableData = computed(() => {
+  const l = props.data.map((value) => {
+    const time = value.subtask.executionendtime
+      ? value.subtask.executionendtime
+      : value.subtask.executionstarttime
+    value.updateTime = time
+    return value
+  })
+
+  return l.sort((a, b) => {
+    return dayjs(b.updateTime) - dayjs(a.updateTime)
+  })
+  // return l
+})
+
+const showTableData = computed(() => {
+  if (showMore.value) {
+    return tableData.value
+  } else {
+    return tableData.value.slice(0, 3)
+  }
+})
+
+/**
+ * 璁$畻鏁存敼鐜�
+ * @param {Number} p 闂鏁�
+ * @param {Number} c 鏁存敼鏁�
+ */
+function calPer(p, c) {
+  if (p == 0) {
+    return '/'
+  } else {
+    return Math.round((c / p) * 100) / 100 + '%'
+  }
+}
+</script>
+<style scoped>
+.btn-more {
+  text-align: center;
+}
+</style>
diff --git a/src/views/main/MonitorView.vue b/src/views/main/MonitorView.vue
index 3038b9a..9ee3c3f 100644
--- a/src/views/main/MonitorView.vue
+++ b/src/views/main/MonitorView.vue
@@ -1,11 +1,11 @@
 <template>
   <el-row>
-    <el-col :span="6" class="page-right">
-      <el-scrollbar height="var(--fy-body-height)">
-        <ManagementView></ManagementView>
-      </el-scrollbar>
+    <el-col :span="7" class="page-right">
+      <!-- <el-scrollbar height="var(--fy-body-height)"> -->
+      <ManagementView></ManagementView>
+      <!-- </el-scrollbar> -->
     </el-col>
-    <el-col :span="12">
+    <el-col :span="10">
       <el-scrollbar class="page-left-top">
         <VisualizationView></VisualizationView>
       </el-scrollbar>
@@ -13,20 +13,32 @@
         <InspectionView></InspectionView>
       </el-scrollbar>
     </el-col>
-    <el-col :span="6" class="page-right">
+    <el-col :span="7" class="page-right">
       <el-scrollbar height="var(--fy-body-height)">
-        <ManagementView></ManagementView>
+        <StatisticView></StatisticView>
       </el-scrollbar>
     </el-col>
   </el-row>
 </template>
 
 <script setup>
+import { provide, ref } from 'vue'
 import InspectionView from '@/views/inspection/InspectionView.vue'
 import ManagementView from '@/views/management/ManagementView.vue'
+import StatisticView from '@/views/management/StatisticView.vue'
 import VisualizationView from '@/views/visualization/VisualizationView.vue'
+import { useAreaStore } from '@/stores/area.js'
 
-import { provide } from 'vue'
+const windowHeight = ref(window.innerHeight)
+const areaStore = useAreaStore()
+areaStore.setTimeOneDay()
+
+// const headerHeight = computed(()=>{
+//   return
+// })
+// fetch('../../assets/styles/layout.scss').then((res) => {
+//   console.log(res.text())
+// })
 
 provide('mapHeight', 'calc(var(--fy-body-height) / 3 * 2)')
 </script>
diff --git a/src/views/management/EvaluateSummary.vue b/src/views/management/EvaluateSummary.vue
index 2ad888e..45869f4 100644
--- a/src/views/management/EvaluateSummary.vue
+++ b/src/views/management/EvaluateSummary.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="border-r-small">
-    <div class="font-large">椋庨櫓璇勪及</div>
-    <el-row justify="space-evenly">
+    <div ref="titleRef" class="font-large">缁煎悎椋庨櫓璇勪及</div>
+    <el-row ref="statisticRef" justify="space-evenly">
       <el-statistic title="楂橀闄�" :value="10"> </el-statistic>
       <el-statistic title="涓闄�" :value="10"> </el-statistic>
       <el-statistic title="浣庨闄�" :value="10"> </el-statistic>
@@ -26,23 +26,50 @@
       </el-table-column>
       <el-table-column prop="score" :show-overflow-tooltip="true" label="璇勫垎" width="60">
       </el-table-column>
-      <el-table-column prop="score" :show-overflow-tooltip="true" label="椋庨櫓" width="60">
+      <el-table-column prop="risk" :show-overflow-tooltip="true" label="椋庨櫓" width="60">
       </el-table-column>
+      <!-- <el-table-column prop="recheck" :show-overflow-tooltip="true" label="澶嶆牳" width="60">
+      </el-table-column> -->
     </el-table>
   </div>
 </template>
 
 <script>
+import { unCalc } from '@/utils/css-util'
 /**
  * 瀵瑰畬鎴愮殑浠诲姟杩涜璇勪及椋庨櫓锛屾樉绀洪珮椋庨櫓鍦烘櫙锛屾樉绀哄鏍哥殑鍦烘櫙鐨勬儏鍐�
  */
 export default {
+  props: {
+    height: {
+      type: String,
+      default: '200'
+    }
+  },
   data() {
     return {
-      tableData: []
+      tableData: [],
+      tableHeight: '200'
+    }
+  },
+  watch: {
+    height(nV, oV) {
+      if (nV != oV) {
+        this.tableHeight = this.calcTableHeight()
+      }
+    }
+  },
+  methods: {
+    calcTableHeight() {
+      const h1 = this.$refs.titleRef.offsetHeight
+      const h2 = this.$refs.statisticRef.$el.offsetHeight
+      const h = h1 + h2
+      const r = `calc(${unCalc(this.height)} - ${h}px)`
+      return r
     }
   },
   mounted() {
+    this.tableHeight = this.calcTableHeight()
     let i = 0
     while (i < 20) {
       this.tableData.push({
@@ -56,7 +83,9 @@
         status: '宸茬粨鏉�',
         total: 4,
         checked: 2,
-        score: 90
+        score: 90,
+        risk: '楂�',
+        recheck: 1
       })
       i++
     }
diff --git a/src/views/management/ManagementView.vue b/src/views/management/ManagementView.vue
index 9b222cc..5a74e98 100644
--- a/src/views/management/ManagementView.vue
+++ b/src/views/management/ManagementView.vue
@@ -1,14 +1,56 @@
 <template>
   <!-- <el-row> 缁熻绠$悊 </el-row> -->
-  <TaskStats></TaskStats>
-  <EvaluateSummary></EvaluateSummary>
-  <TaskSummary></TaskSummary>
+  <ProblemTrack ref="statusRef"></ProblemTrack>
+  <!-- <TaskStats ref="statusRef"></TaskStats> -->
+  <EvaluateSummary :height="height"></EvaluateSummary>
+  <!-- <TaskSummary ref="summaryRef"></TaskSummary> -->
+  <ReInspectionView ref="summaryRef"></ReInspectionView>
 </template>
 
-<script setup>
+<script>
 import TaskStats from '@/views/management/TaskStats.vue'
 import TaskSummary from '@/views/management/TaskSummary.vue'
 import EvaluateSummary from '@/views/management/EvaluateSummary.vue'
+import ReInspectionView from '@/views/inspection/ReInspectionView.vue'
+import ProblemTrack from '@/views/inspection/problem/ProblemTrack.vue'
+import { vResize } from '@/utils/resize-observer'
+
+export default {
+  components: { TaskStats, TaskSummary, EvaluateSummary, ReInspectionView, ProblemTrack },
+  data() {
+    return {
+      // height: '500px',
+      statusHeight: 200,
+      summaryHeight: 200
+    }
+  },
+  computed: {
+    height() {
+      const h = this.statusHeight + this.summaryHeight + 5
+      return `calc(var(--fy-body-height) - ${h}px)`
+    }
+  },
+  methods: {
+    calcHeight() {
+      const h1 = this.$refs.statusRef.$el.offsetHeight
+      const h2 = this.$refs.summaryRef.$el.offsetHeight
+      const h = h1 + h2
+      return `calc(var(--fy-body-height) - ${h}px)`
+    }
+  },
+  mounted() {
+    vResize.mounted(this.$refs.statusRef.$el, ({ height }) => {
+      this.statusHeight = height
+    })
+    vResize.mounted(this.$refs.summaryRef.$el, ({ height }) => {
+      this.summaryHeight = height
+    })
+  },
+  unmounted() {
+    vResize.unmounted(this.$refs.statusRef.$el)
+    vResize.unmounted(this.$refs.summaryRef.$el)
+  }
+}
 </script>
 
 <style scoped></style>
diff --git a/src/views/management/StatisticView.vue b/src/views/management/StatisticView.vue
new file mode 100644
index 0000000..79d9ba8
--- /dev/null
+++ b/src/views/management/StatisticView.vue
@@ -0,0 +1,52 @@
+<template>
+  <!-- <el-row> 缁熻绠$悊 </el-row> -->
+  <SelfInspection></SelfInspection>
+  <JointEnforcement></JointEnforcement>
+  <TaskSummary></TaskSummary>
+</template>
+
+<script>
+import SelfInspection from '@/views/inspection/SelfInspection.vue'
+import JointEnforcement from '@/views/inspection/JointEnforcement.vue'
+import TaskSummary from '@/views/management/TaskSummary.vue'
+import { vResize } from '@/utils/resize-observer'
+
+export default {
+  components: { SelfInspection, JointEnforcement, TaskSummary },
+  data() {
+    return {
+      // height: '500px',
+      statusHeight: 200,
+      summaryHeight: 200
+    }
+  },
+  computed: {
+    height() {
+      const h = this.statusHeight + this.summaryHeight
+      return `calc(var(--fy-body-height) - ${h}px)`
+    }
+  },
+  methods: {
+    calcHeight() {
+      const h1 = this.$refs.statusRef.$el.offsetHeight
+      const h2 = this.$refs.summaryRef.$el.offsetHeight
+      const h = h1 + h2
+      return `calc(var(--fy-body-height) - ${h}px)`
+    }
+  },
+  mounted() {
+    // vResize.mounted(this.$refs.statusRef.$el, ({ height }) => {
+    //   this.statusHeight = height
+    // })
+    // vResize.mounted(this.$refs.summaryRef.$el, ({ height }) => {
+    //   this.summaryHeight = height
+    // })
+  },
+  unmounted() {
+    // vResize.unmounted(this.$refs.statusRef.$el)
+    // vResize.unmounted(this.$refs.summaryRef.$el)
+  }
+}
+</script>
+
+<style scoped></style>
diff --git a/src/views/management/TaskStats.vue b/src/views/management/TaskStats.vue
index 1cadd40..107ab66 100644
--- a/src/views/management/TaskStats.vue
+++ b/src/views/management/TaskStats.vue
@@ -29,6 +29,9 @@
  */
 export default {
   components: { SelfInspection, JointEnforcement },
+  props: {
+    height: String
+  },
   data() {
     return {
       tasks: []
diff --git a/src/views/management/TaskSummary.vue b/src/views/management/TaskSummary.vue
index 4bc0909..de24fc4 100644
--- a/src/views/management/TaskSummary.vue
+++ b/src/views/management/TaskSummary.vue
@@ -1,26 +1,147 @@
 <template>
-  <el-row> 宸℃煡姹囨�� </el-row>
-  <el-row>
-    <el-col :span="8">
-      <TaskSummaryItem title="浠婃棩姹囨��"></TaskSummaryItem>
-    </el-col>
-    <el-col :span="8">
-      <TaskSummaryItem title="鍛ㄥ害姹囨��"></TaskSummaryItem>
-    </el-col>
-    <el-col :span="8">
-      <TaskSummaryItem title="鏈堝害姹囨��"></TaskSummaryItem>
-    </el-col>
-  </el-row>
-  <el-row>
-    <el-col :span="12">
-      <TaskSummaryItem title="瀛e害姹囨��"></TaskSummaryItem>
-    </el-col>
-    <el-col :span="12">
-      <TaskSummaryItem title="骞村害姹囨��"></TaskSummaryItem>
-    </el-col>
-  </el-row>
+  <div class="border-r-small">
+    <el-row> 宸℃煡姹囨�� </el-row>
+    <el-segmented v-model="value" :options="options" />
+    <div><el-text tag="i"> 璇勪及 </el-text></div>
+    <el-row justify="space-evenly">
+      <div>
+        <el-statistic title="鎬昏" :value="10"> </el-statistic>
+        <div class="statistic-footer">
+          <div class="footer-item">
+            <span>瀵规瘮鏄ㄦ棩</span>
+            <span class="green">
+              24%
+              <el-icon>
+                <CaretTop />
+              </el-icon>
+            </span>
+          </div>
+        </div>
+      </div>
+      <el-statistic title="楂橀闄�" :value="2" :value-style="styleRed"> </el-statistic>
+      <el-statistic title="涓闄�" :value="6" :value-style="styleYellow"> </el-statistic>
+      <el-statistic title="浣庨闄�" :value="2" :value-style="styleGreen"> </el-statistic>
+    </el-row>
+    <div><el-text tag="i"> 澶嶆牳 </el-text></div>
+    <el-row justify="space-evenly">
+      <div>
+        <el-statistic title="闇�澶嶆牳" :value="2"> </el-statistic>
+        <div class="statistic-footer">
+          <div class="footer-item">
+            <span>瀵规瘮鏄ㄦ棩</span>
+            <span class="green">
+              24%
+              <el-icon>
+                <CaretTop />
+              </el-icon>
+            </span>
+          </div>
+        </div>
+      </div>
+      <el-statistic title="宸插畬鎴�" :value="2" :value-style="styleGreen"> </el-statistic>
+    </el-row>
+    <div><el-text tag="i"> 闂 </el-text></div>
+    <el-row justify="space-evenly">
+      <div>
+        <el-statistic title="鎬昏" :value="10"> </el-statistic>
+        <div class="statistic-footer">
+          <div class="footer-item">
+            <span>瀵规瘮鏄ㄦ棩</span>
+            <span class="green">
+              24%
+              <el-icon>
+                <CaretTop />
+              </el-icon>
+            </span>
+          </div>
+        </div>
+      </div>
+      <el-statistic title="寰呭鏍�" :value="2" :value-style="styleRed"> </el-statistic>
+      <el-statistic title="宸插鏍�" :value="6" :value-style="styleYellow"> </el-statistic>
+      <el-statistic title="寰呮暣鏀�" :value="2" :value-style="styleGreen"> </el-statistic>
+      <el-statistic title="宸叉暣鏀�" :value="2" :value-style="styleGreen"> </el-statistic>
+      <el-statistic title="寰呯‘璁�" :value="2" :value-style="styleGreen"> </el-statistic>
+    </el-row>
+    <!-- <el-row>
+      <el-col :span="8">
+        <TaskSummaryItem title="浠婃棩姹囨��"></TaskSummaryItem>
+      </el-col>
+      <el-col :span="8">
+        <TaskSummaryItem title="鍛ㄥ害姹囨��"></TaskSummaryItem>
+      </el-col>
+      <el-col :span="8">
+        <TaskSummaryItem title="鏈堝害姹囨��"></TaskSummaryItem>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="12">
+        <TaskSummaryItem title="瀛e害姹囨��"></TaskSummaryItem>
+      </el-col>
+      <el-col :span="12">
+        <TaskSummaryItem title="骞村害姹囨��"></TaskSummaryItem>
+      </el-col>
+    </el-row> -->
+  </div>
 </template>
 
-<script setup></script>
+<script>
+export default {
+  props: {
+    height: String
+  },
+  emits: ['update:height'],
+  data() {
+    return {
+      value: '浠婃棩姹囨��',
+      options: ['浠婃棩姹囨��', '鍛ㄥ害姹囨��', '鏈堝害姹囨��', '瀛e害姹囨��', '骞村害姹囨��'],
+      styleRed: 'color:var(--el-color-danger);',
+      styleYellow: 'color:var(--el-color-warning);',
+      styleGreen: 'color:var(--el-color-success);'
+    }
+  },
+  mounted() {}
+}
+</script>
 
-<style scoped></style>
+<style scoped>
+.el-segmented {
+  --el-segmented-item-selected-color: var(--el-text-color-primary);
+  --el-segmented-item-selected-bg-color: #ffd100;
+  --el-border-radius-base: 16px;
+}
+
+.el-statistic {
+  --el-statistic-content-font-size: var(--el-font-size-base);
+  /* background-color: aliceblue; */
+}
+
+.statistic-footer {
+  background-color: #ffd100;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  flex-wrap: wrap;
+  font-size: 12px;
+  color: var(--el-text-color-regular);
+  /* margin-top: 16px; */
+}
+
+.statistic-footer .footer-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.statistic-footer .footer-item span:last-child {
+  display: inline-flex;
+  align-items: center;
+  margin-left: 4px;
+}
+
+.green {
+  color: var(--el-color-success);
+}
+.red {
+  color: var(--el-color-error);
+}
+</style>
diff --git a/src/views/visualization/SupervisionVisual.vue b/src/views/visualization/SupervisionVisual.vue
index d362111..c14bbdd 100644
--- a/src/views/visualization/SupervisionVisual.vue
+++ b/src/views/visualization/SupervisionVisual.vue
@@ -10,6 +10,9 @@
 
 <script>
 import { inject } from 'vue'
+import { useAreaStore } from '@/stores/area.js'
+import { mapStores } from 'pinia'
+
 import taskApi from '@/api/fysp/taskApi.js'
 import marks from '@/utils/map/marks.js'
 import scene_1 from '@/assets/icon/scene_1.png'
@@ -33,23 +36,28 @@
     }
   },
   computed: {
-    area() {
-      return {
-        provincecode: this.locations.pCode,
-        provincename: this.locations.pName,
-        citycode: this.locations.cCode,
-        cityname: this.locations.cName,
-        districtcode: this.locations.dCode,
-        districtname: this.locations.dName,
-        starttime: this.$fm.formatYMDH(this.time),
-        scensetypeid: this.sceneType.value
-      }
-    }
+    ...mapStores(useAreaStore)
+    // area() {
+    //   return {
+    //     provincecode: this.locations.pCode,
+    //     provincename: this.locations.pName,
+    //     citycode: this.locations.cCode,
+    //     cityname: this.locations.cName,
+    //     districtcode: this.locations.dCode,
+    //     districtname: this.locations.dName,
+    //     starttime: this.$fm.formatYMDH(this.time),
+    //     scensetypeid: this.sceneType.value
+    //   }
+    // }
   },
   methods: {
     // 鏌ヨ
-    fetchSubtaskSummaryArea() {
-      return taskApi.fetchSubtaskSummaryArea(this.area).then((res) => {
+    fetchTaskProgress() {
+      this.areaStore.setLocation(this.locations)
+      this.areaStore.setTimeOneDay(this.time)
+      this.areaStore.setSceneType(this.sceneType.value)
+
+      return taskApi.fetchTaskProgress(this.areaStore.area).then((res) => {
         let list = []
         res.data.forEach((e) => {
           list = list.concat(e.subTaskSummary)
@@ -62,7 +70,7 @@
     }
   },
   mounted() {
-    this.fetchSubtaskSummaryArea()
+    // this.fetchTaskProgress()
   }
 }
 </script>
diff --git a/src/views/visualization/VisualizationView.vue b/src/views/visualization/VisualizationView.vue
index 89942b4..fdf7440 100644
--- a/src/views/visualization/VisualizationView.vue
+++ b/src/views/visualization/VisualizationView.vue
@@ -6,7 +6,7 @@
       <SupervisionVisual></SupervisionVisual>
     </el-col>
     <el-col :span="6">
-      <SubtaskVisual></SubtaskVisual>
+      <!-- <SubtaskVisual></SubtaskVisual> -->
     </el-col>
   </el-row>
 </template>

--
Gitblit v1.9.3