From 668e570bd1db6bd00e4293b6977e6d3d051053ce Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 27 十一月 2025 00:07:46 +0800
Subject: [PATCH] feat: 修改app录入界面及车辆用户同步
---
app/pages/task/detail.vue | 392 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 375 insertions(+), 17 deletions(-)
diff --git a/app/pages/task/detail.vue b/app/pages/task/detail.vue
index 8803e0a..fcbd8d7 100644
--- a/app/pages/task/detail.vue
+++ b/app/pages/task/detail.vue
@@ -135,7 +135,7 @@
</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>
@@ -189,8 +189,58 @@
<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>
@@ -198,6 +248,7 @@
<AttachmentUpload
:taskId="taskId"
title="浠诲姟闄勪欢"
+ :readonly="isTaskFinished"
@uploaded="onAttachmentUploaded"
@deleted="onAttachmentDeleted"
/>
@@ -268,8 +319,14 @@
<!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
<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')"
@@ -284,8 +341,14 @@
</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')"
@@ -300,8 +363,14 @@
</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')"
@@ -310,8 +379,14 @@
</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')"
@@ -320,13 +395,24 @@
</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'
@@ -337,10 +423,18 @@
data() {
return {
taskDetail: null,
- taskId: null
+ taskId: null,
+ paymentInfo: null // 鏀粯淇℃伅
}
},
computed: {
+ // 鍒ゆ柇浠诲姟鏄惁宸茬粨鏉燂紙宸插畬鎴愭垨宸插彇娑堬級
+ isTaskFinished() {
+ if (!this.taskDetail || !this.taskDetail.taskStatus) {
+ return false
+ }
+ return ['COMPLETED', 'CANCELLED'].includes(this.taskDetail.taskStatus)
+ },
// 鏄剧ず浠诲姟绫诲瀷
displayTaskType() {
if (!this.taskDetail || !this.taskDetail.taskType) {
@@ -400,6 +494,12 @@
this.taskId = options.id
this.loadTaskDetail()
},
+ onShow() {
+ // 姣忔椤甸潰鏄剧ず鏃堕噸鏂板姞杞芥暟鎹紝纭繚浠庣紪杈戦〉闈㈣繑鍥炲悗鑳界湅鍒版渶鏂版暟鎹�
+ if (this.taskId) {
+ this.loadTaskDetail()
+ }
+ },
methods: {
// 鍔犺浇浠诲姟璇︽儏
loadTaskDetail() {
@@ -411,15 +511,73 @@
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'
},
// 鑾峰彇杞﹁締淇℃伅
@@ -466,6 +624,41 @@
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 = {
@@ -492,14 +685,19 @@
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(() => {});
+ // 鍑哄彂 -> 妫�鏌ヨ溅杈嗘槸鍚︽湁鍏朵粬姝e湪杩涜涓殑浠诲姟
+ this.checkVehicleAndDepart();
break;
case 'cancel':
@@ -537,6 +735,82 @@
}).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;
+ }
+
+ // 杞﹁締娌℃湁鍏朵粬姝e湪杩涜涓殑浠诲姟锛屽彲浠ュ嚭鍙�
+ 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;
},
// 鏇存柊浠诲姟鐘舵��
@@ -979,6 +1253,80 @@
}
}
+ // 鏀粯璁板綍鏍峰紡
+ .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;
@@ -1012,6 +1360,11 @@
background-color: #f0f0f0;
color: #333;
+ &.edit {
+ background-color: #ff9500;
+ color: white;
+ }
+
&.primary {
background-color: #007AFF;
color: white;
@@ -1022,6 +1375,11 @@
color: white;
}
+ &.settlement {
+ background-color: #34C759;
+ color: white;
+ }
+
&:first-child {
margin-left: 0;
}
--
Gitblit v1.9.1