From 43981545c5aefdb4248d89e3121a200d53332c7a Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期二, 22 十月 2024 17:44:21 +0800
Subject: [PATCH] 1. 添加子任务编辑功能(暂存)

---
 src/views/fysp/task/components/CompSubTaskSelect.vue |    6 +
 src/views/fysp/task/TaskProxy.js                     |   23 +++++
 src/api/fysp/subtaskApi.js                           |   10 +
 src/views/fysp/task/components/CompDayTask.vue       |  108 ++++++++++++++++----------
 src/components.d.ts                                  |    1 
 src/views/fysp/task/components/CompSubTaskEdit.vue   |   15 +++
 src/components/form/FYForm.vue                       |    4 
 src/views/fysp/task/components/CompSubTaskList.vue   |   44 +++++++---
 src/views/fysp/task/TaskManage.vue                   |   10 ++
 src/views/fysp/task/components/CompMonitorPlan.vue   |   18 +++-
 10 files changed, 165 insertions(+), 74 deletions(-)

diff --git a/src/api/fysp/subtaskApi.js b/src/api/fysp/subtaskApi.js
index 972f307..0e91dc7 100644
--- a/src/api/fysp/subtaskApi.js
+++ b/src/api/fysp/subtaskApi.js
@@ -3,10 +3,14 @@
 export default {
   /**
    * 璋冩暣瀛愪换鍔′俊鎭�
-   * @param {Object} subtask 
-   * @returns 
+   * @param {Object} subtask
+   * @returns
    */
-  adjustSubtask(subtask){
+  adjustSubtask(subtask) {
     return $fysp.post(`subtask/adjust`, subtask).then((res) => res.data);
   },
+
+  putSubtasks(subtaskList) {
+    return $fysp.put(`subtask/addlist`, subtaskList).then((res) => res.data);
+  }
 };
diff --git a/src/components.d.ts b/src/components.d.ts
index 37e7435..eb01fe9 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -62,7 +62,6 @@
     ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
-    ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     Footer: typeof import('./components/core/Footer.vue')['default']
diff --git a/src/components/form/FYForm.vue b/src/components/form/FYForm.vue
index f8654cc..ef4cbb8 100644
--- a/src/components/form/FYForm.vue
+++ b/src/components/form/FYForm.vue
@@ -120,15 +120,13 @@
       'submit',
       formObj,
       () => {
-        loading.value = false;
         resolve();
       },
       (err) => {
-        loading.value = false;
         reject(err ? err : '');
       }
     );
-  });
+  }).finally(() => (loading.value = false));
 }
 
 //鍙栨秷鎸夐挳瑙﹀彂
diff --git a/src/views/fysp/task/TaskManage.vue b/src/views/fysp/task/TaskManage.vue
index 8940905..c46b0af 100644
--- a/src/views/fysp/task/TaskManage.vue
+++ b/src/views/fysp/task/TaskManage.vue
@@ -41,6 +41,7 @@
               <el-row>
                 <el-col :span="curSubTaskList ? 16 : 24">
                   <CompMonitorPlan
+                    ref="planRef"
                     :task="curTask.data"
                     @date-change="onDateChange"
                   ></CompMonitorPlan>
@@ -52,6 +53,7 @@
                     :loading="subTaskLoading"
                     height="56vh"
                     @add="subTaskDrawer = true"
+                    @submit="handleSubtaskSubmit"
                   ></CompSubTaskList>
                 </el-col>
               </el-row>
@@ -242,11 +244,11 @@
       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;
@@ -293,6 +295,12 @@
           task: encodeURIComponent(JSON.stringify(value))
         }
       });
+    },
+    handleSubtaskSubmit() {
+      this.subTaskLoading = true;
+      this.$refs.planRef
+        .fetchDayTasks()
+        .finally(() => (this.subTaskLoading = false));
     }
   },
   mounted() {
diff --git a/src/views/fysp/task/TaskProxy.js b/src/views/fysp/task/TaskProxy.js
index 076fcbb..7433661 100644
--- a/src/views/fysp/task/TaskProxy.js
+++ b/src/views/fysp/task/TaskProxy.js
@@ -4,5 +4,28 @@
    */
   ceateSubTask(){
 
+  },
+
+  /**
+   * 鏍规嵁澶氶�変笅鎷夋鐨勯�夐」鍊硷紝杩斿洖浠诲姟鎵ц浜哄璞�
+   * @returns 
+   */
+  getExecutors(data, executorOptions) {
+    const ids = [];
+    const uNames = [];
+    const rNames = [];
+    executorOptions.forEach((e) => {
+      const index = data.indexOf(e.value);
+      if (index != -1) {
+        ids.push(e.data.guid);
+        uNames.push(e.data.acountname);
+        rNames.push(e.data.realname);
+      }
+    });
+    return {
+      id: ids.join('#'),
+      uName: uNames.join('#'),
+      rName: rNames.join('#')
+    };
   }
 }
\ No newline at end of file
diff --git a/src/views/fysp/task/components/CompDayTask.vue b/src/views/fysp/task/components/CompDayTask.vue
index db5bab8..f476c5b 100644
--- a/src/views/fysp/task/components/CompDayTask.vue
+++ b/src/views/fysp/task/components/CompDayTask.vue
@@ -9,56 +9,39 @@
         :data="seletedSceneList"
         :dayTask="dayTask"
         @delete="deleteScene"
+        @submit="createSubtasks"
       ></CompSubTaskSelect>
       <div>
         <!-- <el-scrollbar height="50vh"> -->
-          <CompMonitorObj :data="curMonitorObjList" height="50vh">
-            <template #default="{ item }">
-              <el-button
-                v-if="item.select"
-                size="small"
-                type="info"
-                plain
-                disabled
-                icon="select"
-                >閫夋嫨</el-button
-              >
-              <el-button
-                v-else
-                size="small"
-                type="primary"
-                plain
-                @click="selectScene(item)"
-                >閫夋嫨</el-button
-              >
-            </template>
-          </CompMonitorObj>
+        <CompMonitorObj :data="curMonitorObjList" height="50vh">
+          <template #default="{ item }">
+            <el-button
+              v-if="item.select"
+              size="small"
+              type="info"
+              plain
+              disabled
+              icon="select"
+              >閫夋嫨</el-button
+            >
+            <el-button
+              v-else
+              size="small"
+              type="primary"
+              plain
+              @click="selectScene(item)"
+              >閫夋嫨</el-button
+            >
+          </template>
+        </CompMonitorObj>
         <!-- </el-scrollbar> -->
       </div>
     </el-col>
     <el-col :span="8">
-      <el-row justify="space-between">
-        <el-text>鍗曟棩璁″垝</el-text>
-        <el-button type="success" size="small" @click="editTask"
-          >鏂板</el-button
-        >
-      </el-row>
-      <el-divider />
-      <div>
-        <el-scrollbar :height="height">
-          <ItemSubTask
-            v-for="stask in curSubTaskList"
-            :key="stask.guid"
-            :item="stask"
-          >
-            <template #default="{ item }">
-              <el-button type="danger" size="small" @click="editTask"
-                >绉婚櫎</el-button
-              >
-            </template>
-          </ItemSubTask>
-        </el-scrollbar>
-      </div>
+      <CompSubTaskList
+        v-model="curSubTaskList"
+        :height="height"
+      ></CompSubTaskList>
     </el-col>
   </el-row>
 </template>
@@ -67,10 +50,13 @@
 import { useCloned } from '@vueuse/core';
 import { useRoute, useRouter } from 'vue-router';
 import taskApi from '@/api/fysp/taskApi';
+import subtaskApi from '@/api/fysp/subtaskApi';
 import TaskProxy from '../TaskProxy';
 
 import CompMonitorObj from './CompMonitorObj.vue';
 import CompSubTaskSelect from './CompSubTaskSelect.vue';
+import CompSubTaskList from './CompSubTaskList.vue';
+import dayjs from 'dayjs';
 
 const route = useRoute();
 
@@ -137,5 +123,41 @@
   const index = seletedSceneList.value.indexOf(item);
   seletedSceneList.value.splice(index, 1);
 }
+
+function createSubtasks(executors) {
+  const dt = props.dayTask;
+  const subtasks = seletedSceneList.value.map((_) => {
+    const s = _.scene
+    return {
+      // 涓婚敭鐢辨湇鍔$鍒涘缓
+      stguid: undefined,
+      tguid: dt.tsGuid,
+      tsguid: dt.guid,
+      name: `${s.name}宸℃煡`,
+      typeno: 1,
+      type: '宸℃煡',
+      provincecode: s.provincecode,
+      provincename: s.provincename,
+      citycode: s.citycode,
+      cityname: s.cityname,
+      districtcode: s.districtcode,
+      districtname: s.districtname,
+      scensename: s.name,
+      scenseid: s.guid,
+      scenseaddress: s.location,
+      planstarttime: dt.date,
+      planendtime: dayjs(dt.date).endOf('day').set('millisecond', 0).toDate(),
+      deployerguid: 'rAR0A4gJdlOZEqZs',
+      deployerusername: 'ccheck',
+      deployerrealname: '鏁存敼瀹℃牳',
+      executorguids: executors.ids,
+      executorusernames: executors.uName,
+      executorrealtimes: executors.rName,
+      status: '鏈墽琛�',
+      remark: undefined
+    };
+  });
+  subtaskApi.putSubtasks(subtasks)
+}
 </script>
 <style scoped></style>
diff --git a/src/views/fysp/task/components/CompMonitorPlan.vue b/src/views/fysp/task/components/CompMonitorPlan.vue
index 037c36c..5b86666 100644
--- a/src/views/fysp/task/components/CompMonitorPlan.vue
+++ b/src/views/fysp/task/components/CompMonitorPlan.vue
@@ -57,7 +57,7 @@
 });
 const emit = defineEmits(['dateChange']);
 // 閫変腑鏃ユ湡
-const dateValue = ref(new Date());
+const dateValue = ref();
 // 鏃ュ巻鏍囬
 const title = computed(() => {
   if (props.task) {
@@ -101,12 +101,16 @@
 // 鑾峰彇鏃ヤ换鍔$粺璁′俊鎭�
 const dayTaskLoading = ref(false);
 const dayTaskList = ref([]);
-function fetchDayTasks(topTaskId) {
+function fetchDayTasks() {
   dayTaskLoading.value = true;
-  taskApi
-    .fetchDayTasks(topTaskId)
+  return taskApi
+    .fetchDayTasks(props.task.tguid)
     .then((res) => {
       dayTaskList.value = res;
+      // 濡傛灉宸查�夋棩鏈熷瓨鍦紝鍦ㄩ噸鏂拌幏鍙栨棩浠诲姟缁熻淇℃伅鍚庯紝鍐嶆瑙﹀彂鐐瑰嚮浜嬩欢
+      if (dateValue.value) {
+        onDateChange(dateValue.value) 
+      }
     })
     .finally(() => (dayTaskLoading.value = false));
 }
@@ -150,12 +154,14 @@
 watch(
   () => props.task,
   (nV) => {
-    if (nV.tguid) {
-      fetchDayTasks(nV.tguid);
+    if (nV && nV.tguid) {
+      fetchDayTasks();
     }
   },
   { immediate: true }
 );
+
+defineExpose({ fetchDayTasks });
 </script>
 <style scoped>
 .li-01 {
diff --git a/src/views/fysp/task/components/CompSubTaskEdit.vue b/src/views/fysp/task/components/CompSubTaskEdit.vue
index a7d6f47..f80a20a 100644
--- a/src/views/fysp/task/components/CompSubTaskEdit.vue
+++ b/src/views/fysp/task/components/CompSubTaskEdit.vue
@@ -1,5 +1,6 @@
 <template>
   <FYForm
+    ref="formRef"
     :form-info="formInfo"
     :rules="rules"
     :useCancel="true"
@@ -23,6 +24,7 @@
         :initValue="false"
         type="date"
         v-model:value="formObj.planstarttime"
+        @change="handleTimeChange"
       ></FYOptionTime>
       <el-form-item label="鎵ц浜�" prop="_executors">
         <el-select
@@ -49,6 +51,7 @@
 import { ref, computed, onMounted, reactive } from 'vue';
 import subtaskApi from '@/api/fysp/subtaskApi';
 import userApi from '@/api/fysp/userApi';
+import dayjs from 'dayjs';
 
 const props = defineProps({
   //鍩烘湰淇℃伅
@@ -57,8 +60,9 @@
   create: Boolean
 });
 
-const emit = defineEmits(['submit', 'cancel']);
+const emit = defineEmits(['submit', 'cancel', 'update:modelValue']);
 
+const formRef = ref(null);
 // 浠诲姟鎵ц浜洪�夐」
 const executorOptions = ref([]);
 const formInfo = computed(() => {
@@ -86,6 +90,10 @@
     }
   ]
 });
+
+function handleTimeChange(time) {
+  formRef.value.formObj.planendtime = dayjs(time).endOf('day').set('millisecond', 0)
+}
 
 function getExecutors(data) {
   const ids = [];
@@ -123,6 +131,7 @@
   return subtaskApi
     .adjustSubtask(v)
     .then(() => {
+      emit('update:modelValue', v)
       emit('submit', v);
       success();
     })
@@ -131,6 +140,10 @@
     });
 }
 function submit(v, success, fail) {
+  const executors = getExecutors(v.value);
+  v.value.executorguids = executors.id
+  v.value.executorusernames = executors.uName
+  v.value.executorrealtimes = executors.rName
   return props.create
     ? createScene(v.value, success, fail)
     : updateScene(v.value, success, fail);
diff --git a/src/views/fysp/task/components/CompSubTaskList.vue b/src/views/fysp/task/components/CompSubTaskList.vue
index b678652..fa2e87d 100644
--- a/src/views/fysp/task/components/CompSubTaskList.vue
+++ b/src/views/fysp/task/components/CompSubTaskList.vue
@@ -2,7 +2,7 @@
   <el-row justify="space-between">
     <el-text>鍗曟棩璁″垝</el-text>
     <el-button
-      v-show="create && modelValue && modelValue.length > 0"
+      v-show="create && data && data.length > 0"
       type="success"
       size="small"
       @click="add"
@@ -13,16 +13,21 @@
   <div>
     <el-scrollbar v-loading="loading" :height="height">
       <el-space
-        v-if="modelValue && modelValue.length > 0"
+        v-if="data && data.length > 0"
         fill
         :fill-ratio="100"
         direction="vertical"
         style="width: 100%"
       >
-        <ItemSubTask v-for="s in modelValue" :key="s.guid" :item="s">
+        <ItemSubTask v-for="s in data" :key="s.guid" :item="s">
           <template #default="{ item }">
             <el-space direction="vertical">
-              <el-button plain type="primary" size="small" @click="edit(item)"
+              <el-button
+                :disabled="item.status != '鏈墽琛�'"
+                plain
+                type="primary"
+                size="small"
+                @click="edit(item)"
                 >缂栬緫</el-button
               >
               <el-button
@@ -38,7 +43,7 @@
       </el-space>
       <div v-else>
         <el-empty description="鏃犱换鍔¤褰�" />
-        <el-row justify="center">
+        <el-row v-if="create" justify="center">
           <el-button type="success" size="small" @click="add"
             >娣诲姞浠诲姟</el-button
           >
@@ -57,7 +62,7 @@
   >
     <CompSubTaskEdit
       v-model="activeItem"
-      @submit="dialogVisible = false"
+      @submit="onEditSubmit"
       @cancel="dialogVisible = false"
     ></CompSubTaskEdit>
   </el-dialog>
@@ -78,11 +83,11 @@
   loading: Boolean
 });
 
-const dialogVisible = ref(false)
-const activeItem = ref(null)
+const dialogVisible = ref(false);
+const activeItem = ref(null);
 const data = computed(() => props.modelValue);
 
-const emit = defineEmits(['edit', 'add', 'remove', 'update:modelValue']);
+const emit = defineEmits(['submit', 'add', 'remove', 'update:modelValue']);
 
 function remove(item) {
   if (item.status == '鏈墽琛�') {
@@ -101,16 +106,25 @@
 }
 
 function edit(item) {
-  activeItem.value = item
-  dialogVisible.value = true
-  emit('edit');
+  activeItem.value = item;
+  dialogVisible.value = true;
+}
+
+function onEditSubmit(item) {
+  dialogVisible.value = false;
+  const index = data.value.findIndex((v) => {
+    return item.stguid == v.stguid;
+  });
+  data.value.splice(index, 1, item);
+  emit('update:modelValue', data.value);
+  emit('submit');
 }
 
 function add() {
   emit('add');
 }
 
-onUnmounted(()=>{
-  dialogVisible.value = false
-})
+onUnmounted(() => {
+  dialogVisible.value = false;
+});
 </script>
diff --git a/src/views/fysp/task/components/CompSubTaskSelect.vue b/src/views/fysp/task/components/CompSubTaskSelect.vue
index cdf66b9..53a4e03 100644
--- a/src/views/fysp/task/components/CompSubTaskSelect.vue
+++ b/src/views/fysp/task/components/CompSubTaskSelect.vue
@@ -73,6 +73,7 @@
 import { ref, reactive, watch, computed, onMounted } from 'vue';
 import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
 import taskApi from '@/api/fysp/taskApi';
+import TaskProxy from '../TaskProxy';
 
 onMounted(() => {
   // if (props.height) {
@@ -91,7 +92,7 @@
   dayTask: Object
 });
 
-const emit = defineEmits(['delete']);
+const emit = defineEmits(['submit', 'delete']);
 
 const scrollHeight = ref('14vh');
 
@@ -120,6 +121,9 @@
     fail('鏈�夋嫨鐩戠鍦烘櫙');
   } else {
     success();
+    // 灏嗕换鍔℃墽琛屼汉鏍煎紡鍖栧苟浼犻��
+    const param = TaskProxy.getExecutors(v.value.executor, executors.value)
+    emit('submit', param)
   }
 }
 

--
Gitblit v1.9.3