| | |
| | | |
| | | <scroll-view class="task-list-scroll" scroll-y="true"> |
| | | <view class="task-list"> |
| | | <view class="task-item" v-for="task in filteredTaskList" :key="task.id"> |
| | | <view class="task-item" v-for="task in filteredTaskList" :key="task.taskId"> |
| | | <view class="task-main" @click="viewTaskDetail(task)"> |
| | | <!-- 任务头部:标题和状态标签 --> |
| | | <view class="task-header"> |
| | |
| | | import uniDatetimePicker from '@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue' |
| | | import { listTask, changeTaskStatus } from '@/api/task' |
| | | import { mapState } from 'vuex' |
| | | import { formatDateTime } from '@/utils/common' |
| | | import { checkTaskCanDepart } from '@/utils/taskValidator' |
| | | |
| | | export default { |
| | | components: { |
| | |
| | | }, |
| | | onLoad() { |
| | | this.loadTaskList() |
| | | |
| | | // 监听任务列表刷新事件 |
| | | uni.$on('refreshTaskList', this.handleRefreshEvent) |
| | | }, |
| | | onShow() { |
| | | // 页面显示时刷新列表(从其他页面返回时) |
| | | this.loadTaskList() |
| | | }, |
| | | onUnload() { |
| | | // 页面销毁时移除事件监听 |
| | | uni.$off('refreshTaskList', this.handleRefreshEvent) |
| | | }, |
| | | onPullDownRefresh() { |
| | | this.refreshList() |
| | | }, |
| | | methods: { |
| | | // 处理刷新事件 |
| | | handleRefreshEvent() { |
| | | console.log('收到刷新任务列表事件') |
| | | this.refreshList() |
| | | }, |
| | | |
| | | // 加载任务列表 |
| | | loadTaskList() { |
| | | this.loading = true |
| | |
| | | vehicleList: task.assignedVehicles || [], |
| | | startLocation: this.formatAddress(task.departureAddress || task.startLocation || '未设置'), |
| | | endLocation: this.formatAddress(task.destinationAddress || task.endLocation || '未设置'), |
| | | startTime: task.plannedStartTime ? this.formatDateTime(task.plannedStartTime) : '未设置', |
| | | startTime: task.plannedStartTime ? formatDateTime(task.plannedStartTime, 'YYYY-MM-DD HH:mm') : '未设置', |
| | | assignee: task.assigneeName || '未分配' |
| | | } |
| | | }) |
| | |
| | | this.loading = false |
| | | console.error('加载任务列表失败:', error) |
| | | this.$modal.showToast('加载任务列表失败') |
| | | }) |
| | | }, |
| | | |
| | | // 格式化日期时间 |
| | | formatDateTime(dateTime) { |
| | | if (!dateTime) return '' |
| | | const date = new Date(dateTime) |
| | | return date.toLocaleString('zh-CN', { |
| | | year: 'numeric', |
| | | month: '2-digit', |
| | | day: '2-digit', |
| | | hour: '2-digit', |
| | | minute: '2-digit' |
| | | }) |
| | | }, |
| | | |
| | |
| | | this.loadTaskList() |
| | | setTimeout(() => { |
| | | this.refreshing = false |
| | | this.$modal.showToast('列表已刷新'); |
| | | // this.$modal.showToast('列表已刷新'); |
| | | // 停止下拉刷新 |
| | | uni.stopPullDownRefresh() |
| | | }, 1000) |
| | |
| | | |
| | | // 查看任务详情 |
| | | viewTaskDetail(task) { |
| | | // 跳转到任务详情页面 - 修复:使用taskId而不是id |
| | | this.$tab.navigateTo(`/pages/task/detail?id=${task.taskId}`); |
| | | // 防御性检查 |
| | | if (!task || !task.taskId) { |
| | | console.error('任务数据无效:', task) |
| | | this.$modal.showToast('任务数据异常') |
| | | return |
| | | } |
| | | |
| | | // 跳转到任务详情页面 - 使用uni.navigateTo |
| | | uni.navigateTo({ |
| | | url: `/pagesTask/detail?id=${task.taskId}` |
| | | }); |
| | | }, |
| | | |
| | | // 处理任务操作 |
| | | handleTaskAction(task, action) { |
| | | async handleTaskAction(task, action) { |
| | | switch (action) { |
| | | case 'depart': |
| | | // 出发 -> 状态变为出发中 |
| | | this.$modal.confirm('确定要出发吗?').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'DEPARTING', '任务已出发') |
| | | }).catch(() => {}); |
| | | // 显示加载提示 |
| | | uni.showLoading({ |
| | | title: '检查任务状态...' |
| | | }); |
| | | |
| | | try { |
| | | // 调用工具类检查任务是否可以出发(包含基本校验和冲突检查) |
| | | const checkResult = await checkTaskCanDepart(task) |
| | | |
| | | uni.hideLoading(); |
| | | |
| | | console.log('出发检查结果:', checkResult); |
| | | console.log('valid:', checkResult.valid); |
| | | console.log('conflicts:', checkResult.conflicts); |
| | | |
| | | if (!checkResult.valid) { |
| | | // 校验失败,显示提示信息并提供跳转选项 |
| | | const conflicts = checkResult.conflicts || []; |
| | | const conflictInfo = conflicts.length > 0 ? conflicts[0] : null; |
| | | |
| | | console.log('冲突信息:', conflictInfo); |
| | | |
| | | // 如果有冲突任务信息,提供跳转按钮 |
| | | if (conflictInfo && conflictInfo.taskId) { |
| | | console.log('显示带跳转按钮的弹窗,任务ID:', conflictInfo.taskId); |
| | | |
| | | const conflictTaskId = conflictInfo.taskId; |
| | | const message = checkResult.message || conflictInfo.message || '存在冲突任务'; |
| | | |
| | | uni.showModal({ |
| | | title: '提示', |
| | | content: message, |
| | | confirmText: '去处理', |
| | | cancelText: '知道了', |
| | | success: function(res) { |
| | | console.log('弹窗点击结果:', res); |
| | | if (res.confirm) { |
| | | // 用户点击"现在去处理",跳转到冲突任务详情页 |
| | | console.log('准备跳转到任务详情页:', conflictTaskId); |
| | | uni.navigateTo({ |
| | | url: `/pagesTask/detail?id=${conflictTaskId}` |
| | | }); |
| | | } |
| | | }, |
| | | fail: function(err) { |
| | | console.error('显示弹窗失败:', err); |
| | | } |
| | | }); |
| | | } else { |
| | | // 没有冲突任务ID,只显示提示 |
| | | console.log('显示普通提示弹窗'); |
| | | uni.showModal({ |
| | | title: '提示', |
| | | content: checkResult.message || '任务校验失败', |
| | | showCancel: false, |
| | | confirmText: '知道了', |
| | | fail: function(err) { |
| | | console.error('显示弹窗失败:', err); |
| | | } |
| | | }); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // 所有检查通过,可以出发 |
| | | this.$modal.confirm('确定要出发吗?').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'DEPARTING', '任务已出发') |
| | | }).catch(() => {}); |
| | | |
| | | } catch (error) { |
| | | uni.hideLoading(); |
| | | console.error('检查任务状态失败:', error); |
| | | // 检查失败时,仍然允许出发 |
| | | this.$modal.confirm('检查任务状态失败,是否继续出发?').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'DEPARTING', '任务已出发') |
| | | }).catch(() => {}); |
| | | } |
| | | break; |
| | | |
| | | case 'cancel': |
| | |
| | | |
| | | changeTaskStatus(taskId, statusData).then(response => { |
| | | that.$modal.showToast('状态更新成功') |
| | | // 刷新任务列表 |
| | | that.loadTaskList() |
| | | }).catch(error => { |
| | | console.error('更新任务状态失败:', error) |
| | |
| | | |
| | | changeTaskStatus(taskId, statusData).then(response => { |
| | | that.$modal.showToast('状态更新成功') |
| | | // 刷新任务列表 |
| | | that.loadTaskList() |
| | | }).catch(error => { |
| | | console.error('更新任务状态失败:', error) |
| | |
| | | 'MAINTENANCE': '维修保养', |
| | | 'FUEL': '加油', |
| | | 'OTHER': '其他', |
| | | 'EMERGENCY_TRANSFER': '急救转运', |
| | | 'EMERGENCY_TRANSFER': '转运任务', |
| | | 'WELFARE': '福祉车' |
| | | } |
| | | return typeMap[type] || '未知类型' |