| | |
| | | </view> |
| | | <!-- 当前登录人是该执行人且未就绪时显示就绪按钮 --> |
| | | <view |
| | | v-if="showAssigneeReadyFeature() && isAssigneeSelf(assignee) && !isAssigneeReady(assignee) && taskDetail.taskStatus === 'PENDING'" |
| | | v-if="showAssigneeReadyFeature() && isAssigneeSelf(assignee) && !isAssigneeReady(assignee) && taskDetail.taskStatus === TaskStatus.PENDING" |
| | | class="assignee-ready-btn" |
| | | :data-user-id="assignee.userId || assignee.oaUserId" |
| | | :data-user-name="assignee.userName" |
| | |
| | | </view> |
| | | |
| | | <!-- 取消信息(仅在任务已取消且有取消原因时显示) --> |
| | | <view class="detail-section" v-if="taskDetail.taskStatus === 'CANCELLED' && taskDetail.emergencyInfo && taskDetail.emergencyInfo.cancelReason"> |
| | | <view class="detail-section" v-if="taskDetail.taskStatus === TaskStatus.CANCELLED && taskDetail.emergencyInfo && taskDetail.emergencyInfo.cancelReason"> |
| | | <view class="section-title">取消信息</view> |
| | | <view class="info-item"> |
| | | <view class="label">取消原因</view> |
| | |
| | | |
| | | <!-- 操作按钮区域 --> |
| | | <view class="action-buttons" v-if="taskDetail"> |
| | | <!-- 待处理状态: 显示出发、取消、强制完成 --> |
| | | <template v-if="taskDetail.taskStatus === 'PENDING' "> |
| | | <!-- 待处理状态:显示出发、取消、强制完成 --> |
| | | <template v-if="taskDetail.taskStatus === TaskStatus.PENDING |
| | | || taskDetail.taskStatus === TaskStatus.NOT_DEPARTED |
| | | || taskDetail.taskStatus === TaskStatus.NOT_CONFIRMED |
| | | || taskDetail.taskStatus === TaskStatus.PARTIALLY_CONFIRMED"> |
| | | <button |
| | | v-if="canOperateTask()" |
| | | class="action-btn primary" |
| | |
| | | 强制完成 |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 出发中状态: 显示已到达、强制结束、强制完成 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'DEPARTING'"> |
| | | |
| | | <!-- 出发中状态:显示已到达、强制结束、强制完成 --> |
| | | <template v-else-if="taskDetail.taskStatus === TaskStatus.DEPARTING"> |
| | | <template v-if="canOperateTask()"> |
| | | <button |
| | | class="action-btn primary" |
| | |
| | | </template> |
| | | </template> |
| | | |
| | | <!-- 已到达状态: 显示已返程 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'ARRIVED'"> |
| | | <!-- 已到达状态:显示已返程 --> |
| | | <template v-else-if="taskDetail.taskStatus === TaskStatus.ARRIVED"> |
| | | <template v-if="canOperateTask()"> |
| | | <button |
| | | class="action-btn primary" |
| | |
| | | </template> |
| | | </template> |
| | | |
| | | <!-- 返程中状态: 显示已完成 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'RETURNING'"> |
| | | <!-- 返程中状态:显示已完成 --> |
| | | <template v-else-if="taskDetail.taskStatus === TaskStatus.RETURNING"> |
| | | <template v-if="canOperateTask()"> |
| | | <button |
| | | class="action-btn primary" |
| | |
| | | </template> |
| | | </template> |
| | | |
| | | <!-- 处理中状态: 显示强制完成、取消 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'IN_PROGRESS'"> |
| | | <!-- 处理中状态:显示强制完成、取消 --> |
| | | <template v-else-if="taskDetail.taskStatus === TaskStatus.IN_PROGRESS"> |
| | | <template v-if="canOperateTask()"> |
| | | <button |
| | | class="action-btn primary" |
| | |
| | | import { checkTaskInvoice } from '@/api/invoice' |
| | | import { formatDateTime } from '@/utils/common' |
| | | import { validateTaskForDepart, validateTaskForSettlement, getTaskVehicleId, checkTaskCanDepart } from '@/utils/taskValidator' |
| | | import { getStatusText as getTaskStatusText, getTaskTypeText as getTaskTypeTextUtil, TaskStatus } from '@/utils/TaskUtil' |
| | | import AttachmentUpload from './components/AttachmentUpload.vue' |
| | | import config from '@/config' |
| | | |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | TaskStatus, // 暴露 TaskStatus 给模板使用 |
| | | taskDetail: null, |
| | | taskId: null, |
| | | paymentInfo: null, // 支付信息 |
| | |
| | | return '' |
| | | } |
| | | const status = this.taskDetail.taskStatus |
| | | if (status === 'PENDING') return 'pending' |
| | | if (['DEPARTING', 'ARRIVED', 'RETURNING', 'IN_PROGRESS'].includes(status)) return 'in_progress' |
| | | if (status === 'COMPLETED') return 'completed' |
| | | if (status === 'CANCELLED') return 'cancelled' |
| | | if (status === TaskStatus.PENDING || status === TaskStatus.NOT_CONFIRMED || status === TaskStatus.NOT_DEPARTED || status === TaskStatus.PARTIALLY_CONFIRMED) return 'pending' |
| | | if ([TaskStatus.DEPARTING, TaskStatus.ARRIVED, TaskStatus.RETURNING, TaskStatus.IN_PROGRESS].includes(status)) return 'in_progress' |
| | | if (status === TaskStatus.COMPLETED) return 'completed' |
| | | if (status === TaskStatus.CANCELLED) return 'cancelled' |
| | | return '' |
| | | }, |
| | | // 显示计划开始时间 |
| | |
| | | |
| | | // 获取状态文本 |
| | | getStatusText(status) { |
| | | const statusMap = { |
| | | 'PENDING': '待处理', |
| | | 'DEPARTING': '出发中', |
| | | 'ARRIVED': '已到达', |
| | | 'RETURNING': '返程中', |
| | | 'COMPLETED': '已完成', |
| | | 'CANCELLED': '已取消', |
| | | 'IN_PROGRESS': '处理中' // 兼容旧数据 |
| | | } |
| | | return statusMap[status] || '未知' |
| | | return getTaskStatusText(status) |
| | | }, |
| | | |
| | | // 获取任务类型文本 |
| | | getTaskTypeText(type) { |
| | | const typeMap = { |
| | | 'MAINTENANCE': '维修保养', |
| | | 'FUEL': '加油', |
| | | 'OTHER': '其他', |
| | | 'EMERGENCY_TRANSFER': '转运任务', |
| | | 'WELFARE': '福祉车' |
| | | } |
| | | return typeMap[type] || '未知类型' |
| | | return getTaskTypeTextUtil(type) |
| | | }, |
| | | |
| | | // 获取用户类型标签 |