From da5e23f61994f5e0a0da75e992cc796a841e953b Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 11 十月 2024 17:46:51 +0800
Subject: [PATCH] 1. 任务调整模块,任务编辑功能(待完成)

---
 src/views/fysp/task/MonitorObjEdit.vue |  254 +++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 206 insertions(+), 48 deletions(-)

diff --git a/src/views/fysp/task/MonitorObjEdit.vue b/src/views/fysp/task/MonitorObjEdit.vue
index 1cd37c6..e2c021a 100644
--- a/src/views/fysp/task/MonitorObjEdit.vue
+++ b/src/views/fysp/task/MonitorObjEdit.vue
@@ -1,45 +1,66 @@
 <template>
-  <el-page-header @back="$router.back()" class="page-header">
-    <template #content>
-      <span> 鎬讳换鍔$紪杈� </span>
-    </template>
-  </el-page-header>
-  <el-divider />
+  <el-affix :offset="60">
+    <div class="page-header">
+      <el-page-header @back="$router.back()">
+        <template #content>
+          <span> 鎬讳换鍔$紪杈� </span>
+        </template>
+        <template #extra>
+          <div>
+            <el-button type="primary" :disabled="!isEdit" :loading="saveLoading" @click="saveEdit"
+              >淇濆瓨淇敼</el-button
+            >
+          </div>
+        </template>
+      </el-page-header>
+      <el-divider />
+    </div>
+  </el-affix>
   <el-row gutter="20">
     <el-col :span="16">
       <div>
         <el-text>宸查�夊満鏅�</el-text>
       </div>
       <el-divider />
-      <CompMonitorObj :data="curMonitorObjList" @tab-change="changeSceneType" :showDelete="true">
-        <!-- <template #default="{ item }">
-          <el-button size="small" type="danger" @click="deleteMov(item)">绉婚櫎</el-button>
-        </template> -->
+      <CompMonitorObj
+        :data="curMonitorObjList"
+        show-delete
+        v-model:tabName="curSceneType"
+        v-model:showData="showMonitorObjList"
+        @delete-item="deleteMov"
+      >
       </CompMonitorObj>
     </el-col>
     <el-col :span="8">
-      <div>
-        <el-text>鍙�夊満鏅�</el-text>
-      </div>
-      <el-divider />
-      <FYInfoSearch
-        label=""
-        placeholder="璇疯緭鍏ュ満鏅悕绉板叧閿瓧"
-        :data="showSceneList"
-        :on-search="searchScene"
-        :total="total"
-        scroll-height="70vh"
-        :page-show="false"
-      >
-        <template #default="{ row, click }">
-          <ItemScene :item="row">
-            <el-button-group>
-              <el-button size="small" type="primary" @click="insertDialog = true">鎻掑叆</el-button>
-              <el-button size="small" type="primary" @click="addDialog = true">鏂板</el-button>
-            </el-button-group>
-          </ItemScene>
-        </template>
-      </FYInfoSearch>
+      <el-affix :offset="140">
+        <div>
+          <el-text>鍙�夊満鏅�</el-text>
+        </div>
+        <el-divider />
+        <div>
+          <el-segmented v-model="curSceneType" :options="sceneTypeOptions" />
+        </div>
+        <FYInfoSearch
+          label=""
+          placeholder="璇疯緭鍏ュ満鏅悕绉板叧閿瓧"
+          :data="showSceneList"
+          :on-search="searchScene"
+          :total="total"
+          scroll-height="70vh"
+          :page-show="false"
+        >
+          <template #default="{ row }">
+            <ItemScene :item="row">
+              <el-button-group>
+                <el-button size="small" type="primary" @click="openInsertDialog(row)"
+                  >鎻掑叆</el-button
+                >
+                <el-button size="small" type="primary" @click="openAddDialog(row)">鏂板</el-button>
+              </el-button-group>
+            </ItemScene>
+          </template>
+        </FYInfoSearch>
+      </el-affix>
     </el-col>
   </el-row>
 
@@ -51,7 +72,7 @@
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="insertDialog = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="insertDialog = false"> 纭 </el-button>
+        <el-button :disabled="!selectedIndex" type="primary" @click="insertMov"> 纭 </el-button>
       </div>
     </template>
   </el-dialog>
@@ -60,7 +81,7 @@
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="addDialog = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="addDialog = false"> 纭 </el-button>
+        <el-button type="primary" @click="addMov"> 纭 </el-button>
       </div>
     </template>
   </el-dialog>
@@ -69,7 +90,9 @@
 <script>
 import CompMonitorObj from './components/CompMonitorObj.vue';
 import svUserApi from '@/api/fysp/userApi';
+import taskApi from '@/api/fysp/taskApi';
 import sceneApi from '@/api/fysp/sceneApi';
+import { ElMessage, ElNotification } from 'element-plus';
 
 export default {
   components: { CompMonitorObj },
@@ -78,18 +101,33 @@
     return {
       // 鐩戠鍦烘櫙
       curMonitorObjList: [],
+      // 褰撳墠绛涢�夌殑鍦烘櫙绫诲瀷
+      curSceneType: undefined,
+      showMonitorObjList: [],
+
+
       // 琛屾斂鍖哄垝
       area: {},
       // 鎵�鏈夊満鏅�
       sceneList: [],
       total: 0,
 
-      // 褰撳墠绛涢�夌殑鍦烘櫙绫诲瀷
-      curSceneType: undefined,
-
+      // 鎻掑叆寮瑰嚭妗�
       insertDialog: false,
+      // 鎻掑叆鎴栨柊澧炵殑缂栧彿
       selectedIndex: undefined,
-      addDialog: false
+      // 鎻掑叆鎴栨柊澧炵殑鍦烘櫙
+      selectedScene: undefined,
+      // 鐩戠娆℃暟
+      monitorTimes: 1,
+      // 鏂板寮瑰嚭妗�
+      addDialog: false,
+      // 鏂板鐨勭洃绠″満鏅�
+      insertObj: [],
+      // 鏇存柊鐨勭洃绠″満鏅�
+      updateObj: [],
+      // 鍒犻櫎鐨勭洃绠″満鏅�
+      deleteObj: []
     };
   },
   computed: {
@@ -102,10 +140,12 @@
         return index == -1 && v.type == this.curSceneType;
       });
     },
-    showMonitorObjList() {
-      return this.curMonitorObjList.filter((v) => {
-        return v.sceneType == this.curSceneType;
+    sceneTypeOptions(){
+      const list = [];
+      this.sceneList.forEach((d) => {
+        if (list.indexOf(d.type) == -1) list.push(d.type);
       });
+      return list;
     },
     // 褰撳墠鍦烘櫙绫诲瀷涓嬬殑鍙彃鍏ョ紪鍙�
     valibleIndex() {
@@ -119,6 +159,9 @@
         }
         index++;
       });
+      if (indexList.length == 0) {
+        indexList.push(1);
+      }
       return indexList;
     },
     lastIndex() {
@@ -126,8 +169,11 @@
       if (len > 0) {
         return this.showMonitorObjList[len - 1].displayid + 1;
       } else {
-        return undefined;
+        return 1;
       }
+    },
+    isEdit() {
+      return this.insertObj.length > 0 || this.deleteObj.length > 0 || this.updateObj.length > 0;
     }
   },
   methods: {
@@ -143,19 +189,127 @@
         }
       });
     },
-    changeSceneType(tabName) {
-      this.curSceneType = tabName;
-    },
     deleteMov(item) {
+      if (item.extension1) {
+        ElMessage({
+          message: '宸茬洃绠″満鏅棤娉曠Щ闄�',
+          type: 'error'
+        });
+        return;
+      }
+      const i = this.curMonitorObjList.indexOf(item);
+      this.curMonitorObjList.splice(i, 1);
+      const i1 = this.insertObj.indexOf(item);
+      this.insertObj.splice(i1, 1);
+      const i2 = this.updateObj.indexOf(item);
+      this.updateObj.splice(i2, 1);
+
+      this.deleteObj.push(item);
     },
-    insertMov() {},
-    addMov() {}
+    openInsertDialog(item) {
+      this.insertDialog = true;
+      this.selectedScene = item;
+      this.monitorTimes = 1;
+    },
+    openAddDialog(item) {
+      this.addDialog = true;
+      this.selectedScene = item;
+      this.monitorTimes = 1;
+    },
+    insertMov() {
+      // 1. 鍒涘缓鏂板満鏅�
+      let mov = this.createMov(this.selectedIndex, this.selectedScene);
+      // 2. 鏌ユ壘绗竴涓紪鍙峰ぇ浜庢彃鍏ョ紪鍙风殑鍊硷紝灏嗘柊鐩戠瀵硅薄鎻掑叆鍏朵箣鍓�
+      const insertAtIndex = this.curMonitorObjList.findIndex((v) => {
+        return v.displayid > this.selectedIndex;
+      });
+      this.curMonitorObjList.splice(insertAtIndex, 0, mov);
+      this.selectedIndex = undefined;
+      this.insertDialog = false;
+    },
+    addMov() {
+      // 1. 鍒涘缓鏂板満鏅�
+      let mov = this.createMov(this.lastIndex, this.selectedScene);
+      // 2. 娣诲姞鑷虫湯灏�
+      this.curMonitorObjList.push(mov);
+      this.addDialog = false;
+    },
+    // 鍒涘缓涓�涓柊鐨勭洃绠″璞�
+    createMov(displayid, scene) {
+      // 1. 鏌ユ壘璇ュ満鏅槸鍚︿箣鍓嶅凡琚垹闄�
+      const index = this.deleteObj.findIndex((v) => {
+        return v.sguid == scene.guid;
+      });
+      let mov;
+      // 2. 鑻ユ槸鍏ㄦ柊鐨勫満鏅紝鍒欐柊鐢熸垚涓�涓洃绠″璞★紝鍚﹀垯鍙洿鏂扮紪鍙�
+      if (index == -1) {
+        mov = {
+          tid: this.task.tguid,
+          sguid: scene.guid,
+          sensename: scene.name,
+          tasktypeid: 1,
+          tasktype: '宸℃煡',
+          monitornum: this.monitorTimes,
+          displayid: displayid,
+          sceneTypeId: scene.typeid,
+          sceneType: scene.type
+        };
+        this.insertObj.push(mov);
+      } else {
+        mov = this.deleteObj[index];
+        mov.displayid = displayid;
+        this.updateObj.push(mov);
+        this.deleteObj.splice(index, 1);
+      }
+      return mov;
+    },
+    // 淇濆瓨淇敼
+    saveEdit() {
+      // this.saveLoading = true;
+      if (this.insertObj.length > 0) {
+        const p1 = taskApi.addMonitorObject(this.insertObj).then((res) => {
+          ElNotification({
+            title: `宸℃煡浠诲姟淇敼鎴愬姛`,
+            message: `鏂板鍦烘櫙${res}涓猔,
+            type: 'success',
+            position: 'bottom-left'
+          });
+          this.insertObj = [];
+        });
+      }
+      if (this.updateObj.length > 0) {
+        const p2 = taskApi.updateMonitorObject(this.updateObj).then((res) => {
+          ElNotification({
+            title: `宸℃煡浠诲姟淇敼鎴愬姛`,
+            message: `鏇存柊鍦烘櫙${res}涓猔,
+            type: 'success',
+            position: 'bottom-left'
+          });
+          this.updateObj = [];
+        });
+      }
+      if (this.deleteObj.length > 0) {
+        const p3 = taskApi.deleteMonitorObject(this.deleteObj).then((res) => {
+          ElNotification({
+            title: `宸℃煡浠诲姟淇敼鎴愬姛`,
+            message: `鍒犻櫎鍦烘櫙${res}涓猔,
+            type: 'success',
+            position: 'bottom-left'
+          });
+          this.deleteObj = [];
+        });
+      }
+      // return Promise.all([p1, p2, p3]).finally(() => {
+      //   this.saveLoading = false;
+      // });
+    }
   },
   mounted() {
     // 鐩戠鍦烘櫙淇℃伅
     this.curMonitorObjList = JSON.parse(decodeURIComponent(this.$route.query.data));
     // 鏍规嵁鎬讳换鍔¤幏鍙栬鏀垮尯鍒掍俊鎭�
     const task = JSON.parse(decodeURIComponent(this.$route.query.task));
+    this.task = task;
     this.area = {
       provincecode: task.provincecode,
       provincename: task.provincename,
@@ -172,4 +326,8 @@
 };
 </script>
 
-<style scoped></style>
+<style scoped>
+.page-header {
+  background-color: #fff;
+}
+</style>

--
Gitblit v1.9.3