| | |
| | | </view> |
| | | <view class="info-item" v-if="taskDetail.emergencyInfo.patientCondition"> |
| | | <view class="label">病情描述</view> |
| | | <view class="value">{{ taskDetail.emergencyInfo.patientCondition }}</view> |
| | | <view class="value" style="white-space: pre-line;">{{ taskDetail.emergencyInfo.patientCondition }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | <view class="value">{{ taskDetail.emergencyInfo.transferDistance }}公里</view> |
| | | </view> |
| | | <view class="info-item" v-if="taskDetail.emergencyInfo.transferPrice"> |
| | | <view class="label">转运费用</view> |
| | | <view class="label">基础费用</view> |
| | | <view class="value">¥{{ taskDetail.emergencyInfo.transferPrice }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="paymentInfo"> |
| | | <view class="label">附加费用</view> |
| | | <view class="value">¥{{ paymentInfo.additionalAmount || 0 }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="paymentInfo"> |
| | | <view class="label">总费用</view> |
| | | <view class="value" style="color: #e54d42; font-weight: bold;">¥{{ paymentInfo.totalAmount || 0 }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="paymentInfo && paymentInfo.paidAmount > 0"> |
| | | <view class="label">已支付</view> |
| | | <view class="value" style="color: #34C759;">¥{{ paymentInfo.paidAmount }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="paymentInfo && paymentInfo.paidAmount > 0"> |
| | | <view class="label">剩余未付</view> |
| | | <view class="value" style="color: #ff9900; font-weight: bold;">¥{{ getRemainingAmount() }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 支付记录明细 --> |
| | | <view class="detail-section" v-if="paymentInfo && paymentInfo.paidPayments && paymentInfo.paidPayments.length > 0"> |
| | | <view class="section-title">支付记录</view> |
| | | <view |
| | | class="payment-record-item" |
| | | v-for="payment in paymentInfo.paidPayments" |
| | | :key="payment.id" |
| | | > |
| | | <view class="payment-header"> |
| | | <view |
| | | class="payment-method-tag" |
| | | :class="[ |
| | | payment.paymentMethod === '1' ? 'method-cash' : '', |
| | | payment.paymentMethod === '2' ? 'method-bank' : '', |
| | | payment.paymentMethod === '3' ? 'method-wechat' : '', |
| | | payment.paymentMethod === '4' ? 'method-alipay' : '', |
| | | payment.paymentMethod === '5' ? 'method-pos' : '', |
| | | payment.paymentMethod === '6' ? 'method-account' : '', |
| | | payment.paymentMethod === '7' ? 'method-yyt' : '' |
| | | ]" |
| | | > |
| | | {{ getPaymentMethodLabel(payment.paymentMethod) }} |
| | | </view> |
| | | <view class="payment-amount">¥{{ payment.settlementAmount }}</view> |
| | | </view> |
| | | <view class="payment-time" v-if="payment.payTime"> |
| | | {{ formatPaymentTime(payment.payTime) }} |
| | | </view> |
| | | <view class="payment-remark" v-if="payment.remark"> |
| | | 备注:{{ payment.remark }} |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | |
| | | <!-- 操作按钮区域 --> |
| | | <view class="action-buttons" v-if="taskDetail"> |
| | | <!-- 待处理状态: 显示出发、取消 --> |
| | | <!-- 待处理状态: 显示编辑、出发、取消 --> |
| | | <template v-if="taskDetail.taskStatus === 'PENDING'"> |
| | | <button |
| | | class="action-btn edit" |
| | | @click="handleEdit" |
| | | > |
| | | 修改 |
| | | </button> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction('depart')" |
| | |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 出发中状态: 显示已到达、强制结束 --> |
| | | <!-- 出发中状态: 显示编辑、已到达、强制结束 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'DEPARTING'"> |
| | | <button |
| | | class="action-btn edit" |
| | | @click="handleEdit" |
| | | > |
| | | 修改 |
| | | </button> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction('arrive')" |
| | |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 已到达状态: 显示已返程 --> |
| | | <!-- 已到达状态: 显示编辑、已返程 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'ARRIVED'"> |
| | | <button |
| | | class="action-btn edit" |
| | | @click="handleEdit" |
| | | > |
| | | 修改 |
| | | </button> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction('return')" |
| | |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 返程中状态: 显示已完成 --> |
| | | <!-- 返程中状态: 显示编辑、已完成 --> |
| | | <template v-else-if="taskDetail.taskStatus === 'RETURNING'"> |
| | | <button |
| | | class="action-btn edit" |
| | | @click="handleEdit" |
| | | > |
| | | 修改 |
| | | </button> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction('complete')" |
| | |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 已完成/已取消: 不显示按钮 --> |
| | | <!-- 已完成/已取消: 不显示按钮,但如果是转运任务则显示结算按钮 --> |
| | | |
| | | <!-- 转运任务的结算按钮:仅完成/取消状态不显示 --> |
| | | <button |
| | | v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && !isTaskFinished" |
| | | class="action-btn settlement" |
| | | @click="handleSettlement" |
| | | > |
| | | 结算 |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getTask, changeTaskStatus } from '@/api/task' |
| | | import { checkVehicleActiveTasks } from '@/api/task' |
| | | import { getPaymentInfo } from '@/api/payment' |
| | | import { formatDateTime } from '@/utils/common' |
| | | import AttachmentUpload from '@/components/AttachmentUpload.vue' |
| | | |
| | |
| | | data() { |
| | | return { |
| | | taskDetail: null, |
| | | taskId: null |
| | | taskId: null, |
| | | paymentInfo: null // 支付信息 |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | this.taskId = options.id |
| | | this.loadTaskDetail() |
| | | }, |
| | | onShow() { |
| | | // 每次页面显示时重新加载数据,确保从编辑页面返回后能看到最新数据 |
| | | if (this.taskId) { |
| | | this.loadTaskDetail() |
| | | } |
| | | }, |
| | | methods: { |
| | | // 加载任务详情 |
| | | loadTaskDetail() { |
| | |
| | | getTask(this.taskId).then(response => { |
| | | this.taskDetail = response.data || response |
| | | // 调试:打印返回的数据 |
| | | // console.log('任务详情完整数据:', JSON.stringify(this.taskDetail, null, 2)) |
| | | // console.log('任务类型字段值:', this.taskDetail.taskType) |
| | | // console.log('任务状态字段值:', this.taskDetail.taskStatus) |
| | | // console.log('出发地址:', this.taskDetail.departureAddress) |
| | | // console.log('目的地址:', this.taskDetail.destinationAddress) |
| | | console.log('任务详情完整数据:', JSON.stringify(this.taskDetail, null, 2)) |
| | | console.log('任务类型字段值:', this.taskDetail.taskType) |
| | | console.log('任务状态字段值:', this.taskDetail.taskStatus) |
| | | console.log('出发地址:', this.taskDetail.departureAddress) |
| | | console.log('目的地址:', this.taskDetail.destinationAddress) |
| | | console.log('转运任务信息 (emergencyInfo):', this.taskDetail.emergencyInfo) |
| | | |
| | | // 如果是转运任务,加载支付信息 |
| | | if (this.taskDetail.taskType === 'EMERGENCY_TRANSFER') { |
| | | this.loadPaymentInfo() |
| | | } |
| | | }).catch(error => { |
| | | console.error('加载任务详情失败:', error) |
| | | this.$modal.showToast('加载任务详情失败') |
| | | }) |
| | | }, |
| | | |
| | | // 加载支付信息 |
| | | loadPaymentInfo() { |
| | | getPaymentInfo(this.taskId).then(res => { |
| | | this.paymentInfo = res.data |
| | | console.log('支付信息:', this.paymentInfo) |
| | | }).catch(err => { |
| | | console.error('加载支付信息失败', err) |
| | | }) |
| | | }, |
| | | |
| | | // 根据支付方式字典值获取显示标签 |
| | | getPaymentMethodLabel(dictValue) { |
| | | const methodMap = { |
| | | '1': '现金', |
| | | '2': '银行转账', |
| | | '3': '微信支付', |
| | | '4': '支付宝', |
| | | '5': 'POS收款', |
| | | '6': '挂账', |
| | | '7': '易医通挂账', |
| | | '8': '退款', |
| | | '9': '积分' |
| | | } |
| | | return methodMap[dictValue] || dictValue |
| | | }, |
| | | |
| | | // 格式化支付时间 |
| | | formatPaymentTime(time) { |
| | | if (!time) return '未知' |
| | | const date = new Date(time) |
| | | const year = date.getFullYear() |
| | | const month = String(date.getMonth() + 1).padStart(2, '0') |
| | | const day = String(date.getDate()).padStart(2, '0') |
| | | const hour = String(date.getHours()).padStart(2, '0') |
| | | const minute = String(date.getMinutes()).padStart(2, '0') |
| | | return `${year}-${month}-${day} ${hour}:${minute}` |
| | | }, |
| | | |
| | | // 计算剩余未付金额 |
| | | getRemainingAmount() { |
| | | if (!this.paymentInfo) { |
| | | return '0.00' |
| | | } |
| | | const total = parseFloat(this.paymentInfo.totalAmount || 0) |
| | | const paid = parseFloat(this.paymentInfo.paidAmount || 0) |
| | | const remaining = total - paid |
| | | console.log('总金额:', total.toFixed(2)) |
| | | console.log('已付金额:', paid.toFixed(2)) |
| | | console.log('剩余未付金额:', remaining.toFixed(2)) |
| | | return remaining > 0 ? remaining.toFixed(2) : '0.00' |
| | | }, |
| | | |
| | | // 获取车辆信息 |
| | |
| | | uni.navigateBack() |
| | | }, |
| | | |
| | | // 处理编辑按钮 |
| | | handleEdit() { |
| | | if (!this.taskDetail) { |
| | | this.$modal.showToast('任务信息不存在') |
| | | return |
| | | } |
| | | |
| | | // 检查任务状态,已完成或已取消的任务不能编辑 |
| | | if (this.isTaskFinished) { |
| | | this.$modal.showToast('已完成或已取消的任务不能编辑') |
| | | return |
| | | } |
| | | |
| | | const taskType = this.taskDetail.taskType |
| | | const taskId = this.taskDetail.taskId |
| | | |
| | | // 根据任务类型跳转到不同的编辑页面 |
| | | if (taskType === 'EMERGENCY_TRANSFER') { |
| | | // 转运任务:跳转到转运任务编辑页面 |
| | | uni.navigateTo({ |
| | | url: `/pages/task/edit-emergency?id=${taskId}` |
| | | }) |
| | | } else if (taskType === 'WELFARE') { |
| | | // 福祗车任务:跳转到福祗车编辑页面 |
| | | uni.navigateTo({ |
| | | url: `/pages/task/edit-welfare?id=${taskId}` |
| | | }) |
| | | } else { |
| | | // 其他任务:跳转到通用任务编辑页面 |
| | | uni.navigateTo({ |
| | | url: `/pages/task/edit?id=${taskId}` |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | // 获取状态文本 |
| | | getStatusText(status) { |
| | | const statusMap = { |
| | |
| | | return typeMap[type] || '未知类型' |
| | | }, |
| | | |
| | | // 处理结算 |
| | | handleSettlement() { |
| | | uni.navigateTo({ |
| | | url: '/pages/task/settlement?taskId=' + this.taskId |
| | | }) |
| | | }, |
| | | |
| | | // 处理任务操作 |
| | | handleTaskAction(action) { |
| | | switch (action) { |
| | | case 'depart': |
| | | // 出发 -> 状态变为出发中 |
| | | this.$modal.confirm('确定要出发吗?').then(() => { |
| | | this.updateTaskStatus('DEPARTING', '任务已出发') |
| | | }).catch(() => {}); |
| | | // 出发 -> 检查车辆是否有其他正在进行中的任务 |
| | | this.checkVehicleAndDepart(); |
| | | break; |
| | | |
| | | case 'cancel': |
| | |
| | | }).catch(() => {}); |
| | | break; |
| | | } |
| | | }, |
| | | |
| | | // 检查车辆状态并出发 |
| | | checkVehicleAndDepart() { |
| | | // 获取任务车辆ID |
| | | const vehicleId = this.getVehicleId(); |
| | | if (!vehicleId) { |
| | | this.$modal.showToast('未找到任务车辆信息'); |
| | | return; |
| | | } |
| | | |
| | | // 显示加载提示 |
| | | uni.showLoading({ |
| | | title: '检查车辆状态...' |
| | | }); |
| | | |
| | | checkVehicleActiveTasks(vehicleId).then(response => { |
| | | uni.hideLoading(); |
| | | |
| | | const activeTasks = response.data || []; |
| | | |
| | | // 过滤掉当前任务本身 |
| | | const otherActiveTasks = activeTasks.filter(task => task.taskId !== this.taskId); |
| | | |
| | | if (otherActiveTasks.length > 0) { |
| | | // 车辆有其他正在进行中的任务 |
| | | const task = otherActiveTasks[0]; |
| | | const taskStatus = this.getStatusText(task.taskStatus); |
| | | const message = `该车辆已有正在转运中的任务! |
| | | |
| | | 任务单号:${task.taskCode} |
| | | 任务状态:${taskStatus} |
| | | |
| | | 请先完成当前任务后再出发新任务。`; |
| | | |
| | | uni.showModal({ |
| | | title: '提示', |
| | | content: message, |
| | | showCancel: false, |
| | | confirmText: '我知道了' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | // 车辆没有其他正在进行中的任务,可以出发 |
| | | this.$modal.confirm('确定要出发吗?').then(() => { |
| | | this.updateTaskStatus('DEPARTING', '任务已出发') |
| | | }).catch(() => {}); |
| | | |
| | | }).catch(error => { |
| | | uni.hideLoading(); |
| | | console.error('检查车辆状态失败:', error); |
| | | // 检查失败时,仍然允许出发 |
| | | this.$modal.confirm('检查车辆状态失败,是否继续出发?').then(() => { |
| | | this.updateTaskStatus('DEPARTING', '任务已出发') |
| | | }).catch(() => {}); |
| | | }); |
| | | }, |
| | | |
| | | // 获取任务车辆ID |
| | | getVehicleId() { |
| | | if (!this.taskDetail) { |
| | | return null; |
| | | } |
| | | console.log("taskDetail assignedVehicles",this.taskDetail.assignedVehicles); |
| | | // 从车辆列表中获取第一个车辆的ID(后端返回的字段名是assignedVehicles) |
| | | if (this.taskDetail.assignedVehicles && this.taskDetail.assignedVehicles.length > 0) { |
| | | return this.taskDetail.assignedVehicles[0].vehicleId; |
| | | } |
| | | |
| | | // 或者从单个车辆对象获取 |
| | | if (this.taskDetail.vehicleId) { |
| | | return this.taskDetail.vehicleId; |
| | | } |
| | | |
| | | return null; |
| | | }, |
| | | |
| | | // 更新任务状态 |
| | |
| | | } |
| | | } |
| | | |
| | | // 支付记录样式 |
| | | .payment-record-item { |
| | | background-color: #f9f9f9; |
| | | border-radius: 10rpx; |
| | | padding: 20rpx; |
| | | margin-bottom: 20rpx; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .payment-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 15rpx; |
| | | |
| | | .payment-method-tag { |
| | | display: inline-block; |
| | | padding: 6rpx 16rpx; |
| | | border-radius: 6rpx; |
| | | font-size: 24rpx; |
| | | color: white; |
| | | font-weight: 500; |
| | | |
| | | &.method-cash { |
| | | background-color: #34C759; |
| | | } |
| | | |
| | | &.method-bank { |
| | | background-color: #5AC8FA; |
| | | } |
| | | |
| | | &.method-wechat { |
| | | background-color: #09BB07; |
| | | } |
| | | |
| | | &.method-alipay { |
| | | background-color: #1677FF; |
| | | } |
| | | |
| | | &.method-pos { |
| | | background-color: #FF9500; |
| | | } |
| | | |
| | | &.method-account { |
| | | background-color: #FF9500; |
| | | } |
| | | |
| | | &.method-yyt { |
| | | background-color: #AF52DE; |
| | | } |
| | | } |
| | | |
| | | .payment-amount { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | color: #34C759; |
| | | } |
| | | } |
| | | |
| | | .payment-time { |
| | | font-size: 24rpx; |
| | | color: #999; |
| | | margin-bottom: 10rpx; |
| | | } |
| | | |
| | | .payment-remark { |
| | | font-size: 24rpx; |
| | | color: #666; |
| | | line-height: 1.5; |
| | | } |
| | | } |
| | | |
| | | .loading { |
| | | display: flex; |
| | | flex-direction: column; |
| | |
| | | background-color: #f0f0f0; |
| | | color: #333; |
| | | |
| | | &.edit { |
| | | background-color: #ff9500; |
| | | color: white; |
| | | } |
| | | |
| | | &.primary { |
| | | background-color: #007AFF; |
| | | color: white; |
| | |
| | | color: white; |
| | | } |
| | | |
| | | &.settlement { |
| | | background-color: #34C759; |
| | | color: white; |
| | | } |
| | | |
| | | &:first-child { |
| | | margin-left: 0; |
| | | } |