cyy
2025-09-28 fb026e6052b4d843d327312db398cf791ac57ab9
pages/task/list.vue
@@ -3,11 +3,12 @@
      <view class="list-content" v-if="list.length > 0">
         <view class="list-header" v-if="fixedList.length > 0">固定任务</view>
         <uni-swipe-action class="list">
            <uni-swipe-action-item :class="index== 0 ?'':'list-item'" v-for="(item,index) in fixedList" :key="index"
            <uni-swipe-action-item class="list-item" v-for="(item,index) in fixedList" :key="index"
               :auto-close="true" :disabled="taskStatus.taskGroupID == item.taskGroupID">
               <TaskItemView :taskData="item" :taskStatus="taskStatus" @click-item="clickEditTask"
                  @click-play="clickPlayTask" @click-pause="clickPauseTask" @click-stop="clickStopTask"
                  @click-skip="clickSkipTask" @click-repeat="clickRepeatTask">
               <TaskItemView :taskData="item" :taskStatus="taskStatus" :showTaskRunning="showTaskRunning"
                  @click-btn="clickTaskBtn" @click-item="clickEditTask" @click-play="clickPlayTask"
                  @click-pause="clickPauseTask" @click-stop="clickStopTask" @click-skip="clickSkipTask"
                  @click-repeat="clickRepeatTask">
               </TaskItemView>
               <template v-slot:right>
                  <view class="btn-del" @click="clickDelSetTask(item)">删除</view>
@@ -16,12 +17,12 @@
         </uni-swipe-action>
         <view class="list-header" v-if="tempList.length > 0">临时任务</view>
         <uni-swipe-action class="list">
            <uni-swipe-action-item :class="index== 0 ?'':'list-item'" v-for="(item,index) in tempList" :key="index"
            <uni-swipe-action-item class="list-item" v-for="(item,index) in tempList" :key="index"
               :auto-close="true" :disabled="taskStatus.taskGroupID == item.taskGroupID">
               <TaskItemView :taskData="item" :taskStatus="taskStatus" @click-item="clickEditTask"
                  @click-play="clickPlayTask" @click-pause="clickPauseTask" @click-stop="clickStopTask"
                  @click-skip="clickSkipTask" @click-repeat="clickRepeatTask">
               </TaskItemView>
               <TaskItemView :taskData="item" :taskStatus="taskStatus" :showTaskRunning="showTaskRunning"
                  @click-btn="clickTaskBtn" @click-item="clickEditTask" @click-play="clickPlayTask"
                  @click-pause="clickPauseTask" @click-stop="clickStopTask" @click-skip="clickSkipTask"
                  @click-repeat="clickRepeatTask"></TaskItemView>
               <template v-slot:right>
                  <view class="btn-del" @click="clickDelSetTask(item)">删除</view>
               </template>
@@ -32,7 +33,7 @@
         <uni-icons color="#ccc" type="info" size="128"></uni-icons>
         <view class="space">没有找到符合条件的任务</view>
      </view>
      <view class="position-add" @click="clickAddTask()" @touchstart='btnAddTouchStart' @touchmove='btnAddTouchMove'
      <view class="position-add" @click="clickAddTask"  @touchstart='btnAddTouchStart' @touchmove='btnAddTouchMove'
         :style="{transform:`translate(${btnAddInfo.x}px,${btnAddInfo.y}px) scale(1)`}">
         <uni-icons class="img" type="plus-filled" size="80" color="#1890FF"></uni-icons>
      </view>
@@ -44,6 +45,8 @@
      showToast,
      showModal,
      session,
      showError,
      showInfo
   } from "@/comm/utils.js"
   import TaskItemView from "./infos/task-item.vue"
   import {
@@ -57,6 +60,9 @@
   import {
      v4 as uuidv4
   } from 'uuid';
   import {
      filter
   } from "rxjs";
   export default {
      name: "PagesTasklist",
      components: {
@@ -64,6 +70,7 @@
      },
      data() {
         return {
            loading:false,
            ip: "",
            sceneId: "",
            list: [],
@@ -85,6 +92,7 @@
               x: 0,
               y: 0
            },
            showTaskRunning: false,
         }
      },
      computed: {
@@ -98,7 +106,23 @@
      onLoad(option) {
         this.ip = option.ip || ""
         this.sceneId = option.sceneId || ""
         this.loadData()
         this.isPageVisible = true
         this.$nextTick(()=>{
            this.loadData()
         })
      },
      onShow() {
         this.isPageVisible = true
      },
      onHide() {
         this.isPageVisible = false
      },
      onUnload() {
         this.isPageVisible = false
      },
      methods: {
         setData(obj) {
@@ -135,56 +159,69 @@
                  }
                  this.btnAddInfo = btninfo
               }
               this.loadTaskList()
               this.timerCheckTaskGroupStatus()
            } catch (ex) {
               showError(ex)
            }
         },
         async loadTaskList() {
            try {
               const res = await tasks(this.ip)
               const list = res?.data || []
               this.list = list
               if (this.list.length > 0) {
                  this.timerCheckTaskGroupStatus()
               }
               showToast(`装载了${list.length}任务`)
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async timerCheckTaskGroupStatus() {
            if (this.timerCheckStatusId) {
               return
            try {
               if (this.isPageVisible)
                  await this.checkTaskGroupStatus()
                  // setTimeout(this.timerCheckTaskGroupStatus, 1000);
            } catch (ex) {
               showToast(ex)
               // showError(ex).then((res)=>{
               //    setTimeout(this.timerCheckTaskGroupStatus, 1000);
               // })
            } finally {
                  setTimeout(this.timerCheckTaskGroupStatus, 1000);
            }
            if (this.list.length == 0) {
               return
            }
            await this.checkTaskGroupStatus()
            this.timerCheckStatusId = setTimeout(() => {
               this.timerCheckStatusId = 0
               this.timerCheckTaskGroupStatus()
            }, 1000)
         },
         async checkTaskGroupStatus() {
            try {
               const key = `task_cmd_id_${this.ip.replace(".","_")}`
               const cmdID = session.getValue(key)
               if (cmdID) {
                  const info = await taskGroupStatus(this.ip) || {}
                  if (info.taskGroupCmdID == cmdID) {
                     const list = info.taskStatusList || []
               const info = await taskGroupStatus(this.ip) || {}
               if (info.taskGroupID) {
                  if (this.list.length == 0) {
                     await this.loadTaskList()
                  }
                  const curIndex = this.list.findIndex((a) => a.taskGroupID == info.taskGroupID)
                  if (curIndex > -1) {
                     let list = info.taskStatusList || []
                     list = list.filter((a) => a.cycleNumber == info.curCycleNumber)
                     for (let i in list) {
                        if (list[i].status != 1 && list[i].status != 0) {
                           this.taskStatus = {}
                        if (list[i].status == 1 || list[i].status == 0) {
                           this.taskStatus = info
                           return
                        }
                     }
                     this.taskStatus = info
                     this.taskStatus = {}
                     return
                  }
               }
               this.taskStatus = {}
            } catch (ex) {
               this.taskStatus = {}
               this.showError(ex)
               showToast(ex)
            }
         },
         setTaskGroupStatus(cmdID) {
@@ -194,12 +231,13 @@
         },
         clickAddTask() {
            const _this = this
            uni.navigateTo({
               url: `/pages/task/add?ip=${this.ip}&title=新增任务`,
               events: {
                  // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
                  add_task: function(data) {
                     _this.loadData()
                     _this.loadTaskList()
                  },
               }
            })
@@ -244,8 +282,9 @@
            session.setValue('task_btn_add', this.btnAddInfo)
         },
         clickTaskBtn(item) {
            this.showTaskRunning = !this.showTaskRunning
         },
         clickEditTask(item) {
            const _this = this
            if (this.taskStatus.taskGroupID == item.taskGroupID) {
@@ -278,15 +317,16 @@
               this.setTaskGroupStatus(cmdID)
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async clickStopTask(item) {
            try {
               await addTaskGroupCmd(this.ip, item.taskGroupID, this.taskStatus.taskGroupCmdID, 2)
               showToast("终止任务成功")
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
@@ -294,7 +334,8 @@
            try {
               const taskStatusList = this.taskStatus.taskStatusList || []
               let taskStatusList = this.taskStatus.taskStatusList || []
               taskStatusList = taskStatusList.filter((a) => a.cycleNumber == this.taskStatus.curCycleNumber)
               let curIdx = taskStatusList.findIndex((a) => a.status == 1)
               if (curIdx < 0)
                  curIdx = taskStatusList.findIndex((a) => a.status == 0)
@@ -306,7 +347,7 @@
                  })
                  await cancelTask(this.ip,
                     item.taskGroupID,
                      this.taskStatus.taskGroupCmdID,
                     this.taskStatus.taskGroupCmdID,
                     taskList
                  )
@@ -316,7 +357,7 @@
                  showToast("未找到未开始或正在执行的子任务")
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
@@ -327,7 +368,7 @@
         async clickPauseTask(item) {},
         clickDelSetTask(item) {
            showModal("确认删除任务设置", "警告").then((res) => {
            showModal("确认删除任务设置", "警告", true, "确定", "取消").then((res) => {
               if (res) {
                  this.deleteTask(item)
@@ -343,26 +384,19 @@
               const index = list.findIndex((a) =>
                  a.taskGroupID == item.taskGroupID
               )
               console.log(index, item, list)
               showToast("删除任务成功")
               if (index < 0)
                  return
               list.splice(index, 1)
               this.list = [...list]
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         showError(ex) {
            let exStr = JSON.stringify(ex)
            if (exStr == "{}")
               exStr = ex
            let tip = typeof ex.msg == "string" ? ex.msg : exStr
            showModal(tip, "错误", false)
         },
      }
   }
</script>
@@ -378,15 +412,26 @@
      .list-content {
         display: flex;
         width: 100%;
         padding: 0 10px;
         padding: 10rpx 10px;
         flex: 1;
         flex-direction: column;
         overflow-y: auto;
         overflow-x: hidden;
         .list-header {
            margin: 10px;
            margin: 10rpx 10px;
            // border-bottom: 1px solid #ddd;
         }
         .btn-del {
            // margin: 10rpx;
            display: flex;
            padding: 0 10rpx;
            background-color: #FF4D4F;
            font-weight: 700;
            color: #fff;
            justify-content: center;
            align-items: center;
         }
         .list {
@@ -397,20 +442,23 @@
            .list-item {
               border-top: 1px solid #ddd;
               border-bottom: 1px solid #ddd;
            }
            .list-item:first-child {
               border-top-right-radius: 10px;
               /* 右下角 */
            }
            .list-item:last-child {
               border-bottom: 0;
               border-bottom-right-radius: 10px;
               /* 右下角 */
            }
         }
         .btn-del {
            margin: 10rpx;
            display: flex;
            padding: 0 10rpx;
            background-color: #FF4D4F;
            font-weight: 700;
            color: #fff;
            justify-content: center;
            align-items: center;
         }
      }