| | |
| | | |
| | | <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"> |
| | | <view class="task-title">{{ getTaskTypeText(task.taskType) }} - {{ task.vehicle }}</view> |
| | | <view class="task-title"> |
| | | {{ getTaskTypeText(task.taskType) }} - {{ task.vehicle }} |
| | | <text v-if="task.isHeadPush === '1'" class="head-push-tag">总</text> |
| | | </view> |
| | | <view class="task-status" :class="task.taskStatus === 'PENDING' ? 'status-pending' : task.taskStatus === 'DEPARTING' ? 'status-departing' : task.taskStatus === 'ARRIVED' ? 'status-arrived' : task.taskStatus === 'RETURNING' ? 'status-returning' : task.taskStatus === 'COMPLETED' ? 'status-completed' : task.taskStatus === 'CANCELLED' ? 'status-cancelled' : task.taskStatus === 'IN_PROGRESS' ? 'status-in-progress' : 'status-default'"> |
| | | {{ getStatusText(task.taskStatus) }} |
| | | </view> |
| | |
| | | |
| | | <!-- 任务编号单独一行 --> |
| | | <view class="task-code-row"> |
| | | <text class="task-code">{{ task.taskCode }}</text> |
| | | <text class="task-code">{{ task.showTaskCode }}</text> |
| | | </view> |
| | | |
| | | <!-- 任务详细信息 --> |
| | |
| | | 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: { |
| | |
| | | // 应用任务编号筛选 - 使用taskCode而不是taskNo |
| | | if (this.searchForm.taskNo) { |
| | | filtered = filtered.filter(task => |
| | | task.taskCode && task.taskCode.includes(this.searchForm.taskNo) |
| | | task.showTaskCode && task.showTaskCode.includes(this.searchForm.taskNo) |
| | | ); |
| | | } |
| | | |
| | |
| | | }, |
| | | 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] || '未知类型' |
| | |
| | | } |
| | | } |
| | | |
| | | // 总部推送标记样式 |
| | | .head-push-tag { |
| | | color: #ff0000; |
| | | font-size: 24rpx; |
| | | font-weight: bold; |
| | | margin-left: 10rpx; |
| | | padding: 2rpx 8rpx; |
| | | border: 1rpx solid #ff0000; |
| | | border-radius: 4rpx; |
| | | } |
| | | |
| | | // 任务列表区域 |
| | | .task-list-section { |
| | | flex: 1; |