From 803b93038ca16e21ea60a260ca4ac882b84a87ef Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 18 七月 2025 17:31:53 +0800
Subject: [PATCH] 2025.7.18 监管任务模块 1. 监管场景样式优化; 2. 新增监管场景GIS地图展示(待完成);

---
 src/views/fysp/task/TaskManage.vue |  284 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 248 insertions(+), 36 deletions(-)

diff --git a/src/views/fysp/task/TaskManage.vue b/src/views/fysp/task/TaskManage.vue
index 839a8b9..07d98d9 100644
--- a/src/views/fysp/task/TaskManage.vue
+++ b/src/views/fysp/task/TaskManage.vue
@@ -1,9 +1,8 @@
 <template>
   <BaseContentLayout>
     <template #header>
-      <FYSearchBar @search="search">
+      <!-- <FYSearchBar @search="search">
         <template #options>
-          <!-- 鍖哄幙 -->
           <FYOptionLocation
             :allOption="true"
             :level="3"
@@ -11,13 +10,14 @@
             v-model:value="formSearch.locations"
           ></FYOptionLocation>
         </template>
-        <!-- <template #buttons>
-          <slot name="buttons"></slot>
-        </template> -->
-      </FYSearchBar>
+      </FYSearchBar> -->
     </template>
     <template #aside>
-      <SideList :items="tasks" :loading="sideLoading" @item-click="chooseTask"></SideList>
+      <SideList
+        :items="tasks"
+        :loading="sideLoading"
+        @item-click="chooseTask"
+      ></SideList>
     </template>
     <template #main>
       <ToolBar
@@ -31,32 +31,123 @@
         class="el-scrollbar"
         v-loading="mainLoading"
       >
-        <div><el-text>鐩戠璁″垝</el-text></div>
+        <el-row justify="space-between">
+          <!-- <div><el-text>鐩戠璁″垝</el-text></div>
+          <el-button type="warning" size="small" @click="editPlan"
+            >璁″垝璋冩暣</el-button
+          > -->
+          <el-tabs model-value="first">
+            <el-tab-pane label="鐩戠璁″垝" name="first">
+              <el-row>
+                <el-col :span="curSubTaskList ? 16 : 24">
+                  <CompMonitorPlan
+                    ref="planRef"
+                    :task="curTask.data"
+                    :day-task-list="dayTaskList"
+                    @date-change="onDateChange"
+                  ></CompMonitorPlan>
+                </el-col>
+                <el-col v-if="curSubTaskList" :span="8">
+                  <CompSubTaskList
+                    create
+                    v-model="curSubTaskList"
+                    :loading="subTaskLoading"
+                    :create-loading="daytaskCreateLoading"
+                    height="56vh"
+                    @add="handleAddSubtask"
+                    @submit="handleSubtaskSubmit"
+                  ></CompSubTaskList>
+                </el-col>
+              </el-row>
+            </el-tab-pane>
+            <el-tab-pane label="鐩戠鍦板浘" name="second">
+              <CompTaskMap :plans="curMonitorObjList"></CompTaskMap>
+            </el-tab-pane>
+          </el-tabs>
+        </el-row>
         <el-divider></el-divider>
-        <el-button type="primary" size="small" @click="editTask">鍦烘櫙璋冩暣</el-button>
-        <div><el-text>鐩戠鍦烘櫙</el-text></div>
+        <el-row justify="space-between">
+          <div><el-text>鐩戠鍦烘櫙</el-text></div>
+          <el-button type="warning" size="small" @click="editTask"
+            >鍦烘櫙璋冩暣</el-button
+          >
+        </el-row>
         <CompMonitorObj :data="curMonitorObjList"></CompMonitorObj>
-        <!-- <div><el-text>鐩戠鍦烘櫙</el-text></div>
-        <div>
-          <el-space wrap>
-            <ItemMonitorObj
-              v-for="item in curMonitorObjList"
-              :key="item.movid"
-              :item="item"
-            ></ItemMonitorObj>
-          </el-space>
-        </div> -->
       </el-scrollbar>
-      <el-empty v-else description="鏆傛棤璁板綍" v-loading="mainLoading" />
+      <div v-else>
+        <el-empty description="鏆傛棤璁板綍" v-loading="mainLoading" />
+        <el-row v-if="!mainLoading" justify="center">
+          <el-button
+            type="primary"
+            size="default"
+            @click="navToTaskCreate(curTask.data)"
+            >娣诲姞鐩戠鍦烘櫙</el-button
+          >
+        </el-row>
+      </div>
     </template>
   </BaseContentLayout>
+  <el-drawer
+    v-model="subTaskDrawer"
+    title="鏃ヨ鍒掔鐞�"
+    direction="btt"
+    size="96%"
+    destroy-on-close
+  >
+    <CompDayTask
+      :day-task="curDayTask"
+      :mObjList="curMonitorObjList"
+      @submit="handleSubtaskSubmit"
+    ></CompDayTask>
+  </el-drawer>
+  <el-dialog
+    v-model="topTaskAddVisible"
+    width="600"
+    title="涓�閿垱寤烘�讳换鍔�"
+    destroy-on-close
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :show-close="false"
+  >
+    <CompTaskEdit
+      @submit="navToTaskCreate"
+      @cancel="topTaskAddVisible = false"
+    ></CompTaskEdit>
+  </el-dialog>
 </template>
 
 <script>
+import { unref } from 'vue';
+import { useCloned } from '@vueuse/core';
+import dayjs from 'dayjs';
 import taskApi from '@/api/fysp/taskApi';
 import CompMonitorObj from './components/CompMonitorObj.vue';
+import CompMonitorPlan from './components/CompMonitorPlan.vue';
+import CompDayTask from './components/CompDayTask.vue';
+import CompTaskMap from './components/CompTaskMap.vue';
+import CompTaskEdit from './components/CompTaskEdit.vue';
+import CompSubTaskList from './components/CompSubTaskList.vue';
 export default {
-  components: { CompMonitorObj },
+  beforeRouteEnter(to, from, next) {
+    // 鍦ㄦ覆鏌撹缁勪欢鐨勫搴旇矾鐢辫楠岃瘉鍓嶈皟鐢�
+    // 涓嶈兘鑾峰彇缁勪欢瀹炰緥 `this` 锛�
+    // 鍥犱负褰撳畧鍗墽琛屾椂锛岀粍浠跺疄渚嬭繕娌¤鍒涘缓锛�
+    next((vm) => {
+      if (from.name == 'monitorObjEdit' && vm.task) {
+        vm.chooseTask(vm.task);
+      } else if (from.name == 'monitorTaskCreate') {
+        vm.search();
+      }
+    });
+  },
+  components: {
+    CompMonitorObj,
+    CompMonitorPlan,
+    CompDayTask,
+    CompTaskMap,
+    CompTaskEdit,
+    CompSubTaskList
+  },
   data() {
     return {
       formSearch: {
@@ -73,28 +164,58 @@
       tasks: [],
       // 褰撳墠浠诲姟鐨勭洃绠″璞�
       curMonitorObjList: [],
+      // 褰撳墠浠诲姟鐨勫睍绀轰腑鐨勭洃绠″璞�
+      showMonitorObjList: [],
       //褰撳墠閫変腑鐨勪换鍔�
       curTask: {},
+      //褰撳墠閫変腑鐨勬棩浠诲姟
+      curDayTaskList: [],
+      daytaskLoading: false,
       //鎿嶄綔鎸夐挳
       buttons: [
         {
-          name: '璁″垝璋冩暣',
-          color: 'success'
-        },
-        {
-          name: '鍦烘櫙璋冩暣',
-          color: 'warning'
+          name: '涓�閿垱寤烘�讳换鍔�',
+          color: 'success',
+          click: () => {
+            this.topTaskAddVisible = true;
+          }
         }
-      ]
+        // {
+        //   name: '鍦烘櫙璋冩暣',
+        //   color: 'warning'
+        // }
+      ],
+      // 瀛愪换鍔$紪杈戝脊鍑烘
+      subTaskDrawer: false,
+      // 褰撳墠閫夋嫨鐨勬棩浠诲姟
+      curDayTask: {},
+      curDay: undefined,
+      daytaskCreateLoading: false,
+      // 褰撳墠閫夋嫨鐨勬棩浠诲姟涓嬬殑瀛愪换鍔�
+      curSubTaskList: undefined,
+      subTaskLoading: false,
+      // 鎬讳换鍔℃柊澧炲脊鍑烘
+      topTaskAddVisible: false
+    };
+  },
+  provide() {
+    return {
+      topTask: this.curTask
     };
   },
   computed: {
     // 鎬讳换鍔$姸鎬佺粺璁�
     taskStatus() {
+      let total = 0,
+        inspected = 0;
+      this.curMonitorObjList.forEach((obj) => {
+        total += parseInt(obj.monitornum);
+        inspected += obj.extension1 ? parseInt(obj.extension1) : 0;
+      });
       return [
-        { name: '鍦烘櫙鏁�', value: 100 },
-        { name: '鏈贰鏌�', value: 0 },
-        { name: '宸插贰鏌�', value: 0 }
+        { name: '鍦烘櫙鏁�', value: total },
+        { name: '鏈贰鏌�', value: total - inspected },
+        { name: '宸插贰鏌�', value: inspected }
       ];
     }
   },
@@ -129,10 +250,10 @@
           type = 0;
           break;
         case '姝e湪鎵ц':
-          type = 1;
+          type = 5;
           break;
         case '宸茬粨鏉�':
-          type = 2;
+          type = 6;
           break;
         default:
           type = 0;
@@ -141,17 +262,30 @@
       return type;
     },
     chooseTask(task) {
+      this.task = task;
       this.sideLoading = false;
       this.mainLoading = true;
+      this.curSubTaskList = undefined;
+      this.curTask = task;
       taskApi
         .fetchMonitorObjectVersion(task.data.tguid)
         .then((res) => {
           this.curMonitorObjList = res;
-          this.curTask = task;
         })
         .finally(() => {
           this.mainLoading = false;
+          this.fetchDayTasks();
         });
+    },
+    fetchDayTasks() {
+      // 鑾峰彇鏃ヤ换鍔$粺璁′俊鎭�
+      this.dayTaskLoading = true;
+      return taskApi
+        .fetchDayTasks(this.curTask.data.tguid)
+        .then((res) => {
+          this.dayTaskList = res;
+        })
+        .finally(() => (this.dayTaskLoading = false));
     },
     editTask() {
       this.$router.push({
@@ -161,6 +295,84 @@
           task: encodeURIComponent(JSON.stringify(this.curTask.data))
         }
       });
+    },
+    editPlan() {
+      this.$router.push({
+        name: 'monitorPlanEdit',
+        query: {
+          data: encodeURIComponent(JSON.stringify(this.curMonitorObjList)),
+          task: encodeURIComponent(JSON.stringify(this.curTask.data))
+        }
+      });
+    },
+    onDateChange(dayTask, day) {
+      this.curDay = day;
+      if (dayTask) {
+        this.subTaskLoading = true;
+        // this.subTaskDrawer = true;
+        this.curDayTask = dayTask;
+        taskApi
+          .fetchSubtaskByDayTask(dayTask.guid)
+          .then((res) => {
+            this.curSubTaskList = res;
+          })
+          .finally(() => (this.subTaskLoading = false));
+      } else {
+        this.curSubTaskList = [];
+        this.curDayTask = {};
+      }
+    },
+    navToTaskCreate(value) {
+      this.topTaskAddVisible = false;
+      this.$router.push({
+        name: 'monitorTaskCreate',
+        query: {
+          task: encodeURIComponent(JSON.stringify(value))
+        }
+      });
+    },
+    handleSubtaskSubmit() {
+      this.subTaskLoading = true;
+      this.$refs.planRef
+        .fetchDayTasks()
+        .finally(() => (this.subTaskLoading = false));
+    },
+    handleAddSubtask() {
+      // 鍒ゆ柇褰撴棩鏄惁鏈夋棩浠诲姟锛岃嫢娌℃湁锛屽厛鍒涘缓鍦ㄨ烦杞瓙浠诲姟鍒涘缓鐣岄潰
+      if (this.curDayTask.guid) {
+        this.subTaskDrawer = true;
+      } else {
+        const _dayTask = useCloned(this.curTask.data).cloned.value;
+        const taskDate = dayjs(this.curDay);
+        _dayTask.tsguid = _dayTask.tguid;
+        _dayTask.tguid = null;
+        _dayTask.levelnum = null;
+        _dayTask.name = `${taskDate.format('YYYY骞碝M鏈圖D鏃�')}${
+          _dayTask.cityname
+        }${_dayTask.districtname}${_dayTask.typename}浠诲姟`;
+        _dayTask.starttime = taskDate.startOf('day').toDate();
+        _dayTask.endtime = taskDate.endOf('day').millisecond(0).toDate();
+        _dayTask.settime = dayjs().toDate();
+        _dayTask.t1stverifytime = dayjs().toDate();
+        _dayTask.runingstatus = '鏈墽琛�';
+        this.daytaskCreateLoading = true;
+        taskApi
+          .putTask(_dayTask)
+          .then((res) => {
+            this.curDayTask = {
+              guid: res.data.tguid,
+              tsGuid: res.data.tsguid,
+              changedTaskNum: 0,
+              check: true,
+              completeTaskNum: 0,
+              date: res.data.starttime,
+              totalTaskNum: 0
+            };
+            this.subTaskDrawer = true;
+            this.handleSubtaskSubmit();
+          })
+          .finally(() => (this.daytaskCreateLoading = false));
+      }
     }
   },
   mounted() {
@@ -177,6 +389,6 @@
 }
 
 .el-scrollbar {
-  height: calc((100vh - 60px * 2 - 20px * 2 - var(--height-toolbar)));
+  height: calc((100vh - 60px - 20px * 2 - var(--height-toolbar)));
 }
 </style>

--
Gitblit v1.9.3