| | |
| | | App.mpType = 'app' |
| | | |
| | | const app = new Vue({ |
| | | store, |
| | | ...App |
| | | }) |
| | | |
| | |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | |
| | | <!-- åæ¶åå éæ©å¯¹è¯æ¡ --> |
| | | <uni-popup ref="cancelPopup" type="center" :is-mask-click="false"> |
| | | <view class="cancel-dialog"> |
| | | <view class="dialog-title">è¯·éæ©åæ¶åå </view> |
| | | <picker mode="selector" :range="cancelReasonList" range-key="label" @change="selectCancelReason"> |
| | | <view class="reason-picker"> |
| | | <view class="picker-label">åæ¶åå </view> |
| | | <view class="picker-value"> |
| | | {{ selectedCancelReasonLabel }} |
| | | </view> |
| | | <uni-icons type="arrowright" size="16"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | <view class="dialog-buttons"> |
| | | <button class="cancel-btn" @click="closeCancelDialog">åæ¶</button> |
| | | <button class="confirm-btn" @click="confirmCancelTask">ç¡®å®</button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { getUserBoundVehicle } from "@/api/vehicle"; |
| | | import { getUnreadCount } from "@/api/message"; |
| | | import { getDicts } from "@/api/dict"; |
| | | import { formatDateTime } from "@/utils/common"; |
| | | import subscribeManager from "@/utils/subscribe"; |
| | | import { checkTaskCanDepart } from "@/utils/taskValidator"; |
| | |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | hasMore: true, |
| | | |
| | | // åæ¶åå ç¸å
³ |
| | | cancelReasonList: [], // åæ¶åå å表 |
| | | showCancelDialog: false, // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | selectedCancelReason: '', // éä¸çåæ¶åå |
| | | currentCancelTask: null // å½åè¦åæ¶çä»»å¡ |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | "IN_PROGRESS", |
| | | ].includes(task.taskStatus); |
| | | }); |
| | | }, |
| | | |
| | | // è·åéä¸çåæ¶åå æ ç¾ï¼ç¨äºå¼¹çªæ¾ç¤ºï¼ |
| | | selectedCancelReasonLabel() { |
| | | if (!this.selectedCancelReason || !this.cancelReasonList.length) { |
| | | return 'è¯·éæ©' |
| | | } |
| | | const reason = this.cancelReasonList.find(r => r.value === this.selectedCancelReason) |
| | | return reason ? reason.label : 'è¯·éæ©' |
| | | }, |
| | | }, |
| | | onLoad() { |
| | |
| | | this.loadRunningTasks(); |
| | | // å è½½æªè¯»æ¶æ¯æ°é |
| | | this.loadUnreadMessageCount(); |
| | | // å è½½åæ¶åå åå
¸ |
| | | this.loadCancelReasonDict(); |
| | | }, |
| | | onShow() { |
| | | // æ£æ¥ç¨æ·æ¯å¦å·²ç»å½ |
| | |
| | | break; |
| | | |
| | | case "cancel": |
| | | // åæ¶ -> äºæ¬¡ç¡®è®¤åç¶æåä¸ºå·²åæ¶ |
| | | this.$modal |
| | | .confirm("ç¡®å®è¦åæ¶æ¤ä»»å¡åï¼") |
| | | .then(() => { |
| | | this.updateTaskStatus(task.taskId, "CANCELLED", "ä»»å¡å·²åæ¶"); |
| | | }) |
| | | .catch(() => {}); |
| | | // åæ¶ -> æ¾ç¤ºåæ¶åå éæ©å¯¹è¯æ¡ |
| | | this.currentCancelTask = task; |
| | | this.showCancelReasonDialog(); |
| | | break; |
| | | |
| | | case "arrive": |
| | |
| | | this.getLocationAndUpdateStatus(taskId, status, remark); |
| | | }, |
| | | |
| | | // å è½½åæ¶åå åå
¸ |
| | | loadCancelReasonDict() { |
| | | getDicts('task_cancel_reason').then(response => { |
| | | if (response.code === 200 && response.data) { |
| | | this.cancelReasonList = response.data.map(item => ({ |
| | | value: item.dictValue, |
| | | label: item.dictLabel |
| | | })) |
| | | } |
| | | }).catch(error => { |
| | | console.error('å è½½åæ¶åå åå
¸å¤±è´¥:', error) |
| | | }) |
| | | }, |
| | | |
| | | // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | showCancelReasonDialog() { |
| | | this.selectedCancelReason = '' |
| | | this.$refs.cancelPopup.open() |
| | | }, |
| | | |
| | | // ç¡®è®¤åæ¶ä»»å¡ |
| | | confirmCancelTask() { |
| | | if (!this.selectedCancelReason) { |
| | | this.$modal.showToast('è¯·éæ©åæ¶åå ') |
| | | return |
| | | } |
| | | |
| | | this.$refs.cancelPopup.close() |
| | | |
| | | // è°ç¨æ´æ°ç¶ææ¹æ³ï¼ä¼ éåæ¶åå |
| | | this.updateTaskStatusWithCancelReason(this.currentCancelTask.taskId, 'CANCELLED', 'ä»»å¡å·²åæ¶', this.selectedCancelReason) |
| | | }, |
| | | |
| | | // åæ¶å¯¹è¯æ¡å
³é |
| | | closeCancelDialog() { |
| | | this.$refs.cancelPopup.close() |
| | | this.selectedCancelReason = '' |
| | | this.currentCancelTask = null |
| | | }, |
| | | |
| | | // 鿩忶åå |
| | | selectCancelReason(e) { |
| | | this.selectedCancelReason = this.cancelReasonList[e.detail.value].value |
| | | }, |
| | | |
| | | // 另忶åå çç¶ææ´æ° |
| | | updateTaskStatusWithCancelReason(taskId, status, remark, cancelReason) { |
| | | this.getLocationAndUpdateStatus(taskId, status, remark, cancelReason) |
| | | }, |
| | | |
| | | // æ£æ¥ç¥æ
åæä¹¦éä»¶å¹¶æ´æ°ç¶æ |
| | | async checkConsentAttachmentAndThen(taskId, status, remark) { |
| | | try { |
| | |
| | | }, |
| | | |
| | | // è·åä½ç½®ä¿¡æ¯å¹¶æ´æ°ç¶æ |
| | | getLocationAndUpdateStatus(taskId, status, remark) { |
| | | getLocationAndUpdateStatus(taskId, status, remark, cancelReason) { |
| | | const that = this; |
| | | |
| | | // 使ç¨uni.getLocationè·åGPSä½ç½® |
| | |
| | | heading: res.direction || res.heading, |
| | | }; |
| | | |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | |
| | | changeTaskStatus(taskId, statusData) |
| | | .then((response) => { |
| | | that.$modal.showToast("ç¶ææ´æ°æå"); |
| | |
| | | taskStatus: status, |
| | | remark: remark, |
| | | }; |
| | | |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | |
| | | changeTaskStatus(taskId, statusData) |
| | | .then((response) => { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // åæ¶åå å¯¹è¯æ¡æ ·å¼ |
| | | .cancel-dialog { |
| | | width: 600rpx; |
| | | background-color: white; |
| | | border-radius: 20rpx; |
| | | padding: 40rpx; |
| | | |
| | | .dialog-title { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | text-align: center; |
| | | margin-bottom: 30rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .reason-picker { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 20rpx 30rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | margin-bottom: 30rpx; |
| | | |
| | | .picker-label { |
| | | font-size: 28rpx; |
| | | color: #666; |
| | | } |
| | | |
| | | .picker-value { |
| | | flex: 1; |
| | | text-align: right; |
| | | margin: 0 20rpx; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .dialog-buttons { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | |
| | | button { |
| | | flex: 1; |
| | | height: 80rpx; |
| | | line-height: 80rpx; |
| | | border-radius: 10rpx; |
| | | font-size: 28rpx; |
| | | border: none; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | background-color: #f5f5f5; |
| | | color: #666; |
| | | } |
| | | |
| | | .confirm-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | page: '/pagesTask/create-normal' |
| | | }, |
| | | |
| | | { |
| | | type: 'welfare', |
| | | name: 'ç¦ç¥è½¦', |
| | | icon: 'car', |
| | | color: '#F37B1D', |
| | | description: 'èå¹´äººãæ®ç¾äººçç¹æ®ç¾¤ä½ç¨è½¦æå¡', |
| | | taskType: 'WELFARE', |
| | | page: '/pagesTask/create-welfare' |
| | | } |
| | | // { |
| | | // type: 'welfare', |
| | | // name: 'ç¦ç¥è½¦', |
| | | // icon: 'car', |
| | | // color: '#F37B1D', |
| | | // description: 'èå¹´äººãæ®ç¾äººçç¹æ®ç¾¤ä½ç¨è½¦æå¡', |
| | | // taskType: 'WELFARE', |
| | | // page: '/pagesTask/create-welfare' |
| | | // } |
| | | ] |
| | | } |
| | | }, |
| | |
| | | <view class="task-header"> |
| | | <view class="header-title">ä»»å¡å表</view> |
| | | <view class="header-actions"> |
| | | <button class="search-toggle-btn" @click="toggleSearch"> |
| | | <!-- <button class="search-toggle-btn" @click="toggleSearch"> |
| | | <uni-icons |
| | | :type="showSearch ? 'close' : 'search'" |
| | | size="20" |
| | | ></uni-icons> |
| | | </button> |
| | | </button> --> |
| | | <button class="refresh-btn" @click="refreshList"> |
| | | <uni-icons type="refresh" size="20"></uni-icons> |
| | | </button> |
| | |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | |
| | | <!-- åæ¶åå éæ©å¯¹è¯æ¡ --> |
| | | <uni-popup ref="cancelPopup" type="center" :is-mask-click="false"> |
| | | <view class="cancel-dialog"> |
| | | <view class="dialog-title">è¯·éæ©åæ¶åå </view> |
| | | <picker mode="selector" :range="cancelReasonList" range-key="label" @change="selectCancelReason"> |
| | | <view class="reason-picker"> |
| | | <view class="picker-label">åæ¶åå </view> |
| | | <view class="picker-value"> |
| | | {{ selectedCancelReasonLabel }} |
| | | </view> |
| | | <uni-icons type="arrowright" size="16"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | <view class="dialog-buttons"> |
| | | <button class="cancel-btn" @click="closeCancelDialog">åæ¶</button> |
| | | <button class="confirm-btn" @click="confirmCancelTask">ç¡®å®</button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import uniDatetimePicker from "@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue"; |
| | | import { listTask, changeTaskStatus, checkTaskConsentAttachment } from "@/api/task"; |
| | | import { getDicts } from "@/api/dict"; |
| | | import { mapState } from "vuex"; |
| | | import { formatDateTime } from "@/utils/common"; |
| | | import { checkTaskCanDepart } from "@/utils/taskValidator"; |
| | |
| | | vehicle: "", |
| | | taskNo: "", |
| | | }, |
| | | statusOptions: ["å
¨é¨ç¶æ", "å¾
å¤ç", "å¤çä¸", "已宿"], |
| | | statusValues: ["", "pending", "processing", "completed"], |
| | | statusOptions: ["å
¨é¨ç¶æ", "å¾
å¤ç", "å¤çä¸", "已宿", "已忶"], |
| | | statusValues: ["", "pending", "processing", "completed", "cancelled"], |
| | | selectedStatus: "", |
| | | selectedStatusText: "", |
| | | startDate: "", |
| | |
| | | pageSize: 10, |
| | | total: 0, |
| | | hasMore: true, |
| | | |
| | | // åæ¶åå ç¸å
³ |
| | | cancelReasonList: [], // åæ¶åå å表 |
| | | showCancelDialog: false, // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | selectedCancelReason: '', // éä¸çåæ¶åå |
| | | currentCancelTask: null // å½åè¦åæ¶çä»»å¡ |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | // å®é
ççéå°å¨è¯·æ±æå¡å¨æ¶å®æ |
| | | return this.taskList; |
| | | }, |
| | | |
| | | // è·åéä¸çåæ¶åå æ ç¾ï¼ç¨äºå¼¹çªæ¾ç¤ºï¼ |
| | | selectedCancelReasonLabel() { |
| | | if (!this.selectedCancelReason || !this.cancelReasonList.length) { |
| | | return 'è¯·éæ©' |
| | | } |
| | | const reason = this.cancelReasonList.find(r => r.value === this.selectedCancelReason) |
| | | return reason ? reason.label : 'è¯·éæ©' |
| | | }, |
| | | }, |
| | | onLoad() { |
| | | this.loadTaskList(); |
| | | |
| | | // çå¬ä»»å¡åè¡¨å·æ°äºä»¶ |
| | | uni.$on("refreshTaskList", this.handleRefreshEvent); |
| | | |
| | | // å è½½åæ¶åå åå
¸ |
| | | this.loadCancelReasonDict(); |
| | | }, |
| | | onShow() { |
| | | // 页颿¾ç¤ºæ¶å·æ°å表ï¼ä»å
¶ä»é¡µé¢è¿åæ¶ï¼ |
| | |
| | | "IN_PROGRESS", |
| | | ].join(","); |
| | | } else if (this.currentFilter === "completed") { |
| | | queryParams.taskStatus = "COMPLETED"; |
| | | // 已宿å
å«ï¼å·²å®æå已忶 |
| | | queryParams.taskStatusList = "COMPLETED,CANCELLED"; |
| | | } else { |
| | | // å¦ææ²¡æä½¿ç¨é¡¶é¨tabçéï¼åä½¿ç¨æ¥è¯¢æ¡ä»¶ä¸çç¶æçé |
| | | if (this.selectedStatus) { |
| | |
| | | "IN_PROGRESS", |
| | | ].join(","), |
| | | completed: "COMPLETED", |
| | | cancelled: "CANCELLED", |
| | | }; |
| | | if (statusMap[this.selectedStatus]) { |
| | | if ( |
| | | this.selectedStatus === "pending" || |
| | | this.selectedStatus === "completed" |
| | | this.selectedStatus === "completed" || |
| | | this.selectedStatus === "cancelled" |
| | | ) { |
| | | queryParams.taskStatus = statusMap[this.selectedStatus]; |
| | | } else { |
| | |
| | | "IN_PROGRESS", |
| | | ].join(","); |
| | | } else if (this.currentFilter === "completed") { |
| | | queryParams.taskStatus = "COMPLETED"; |
| | | // 已宿å
å«ï¼å·²å®æå已忶 |
| | | queryParams.taskStatusList = "COMPLETED,CANCELLED"; |
| | | } else { |
| | | // å¦ææ²¡æä½¿ç¨é¡¶é¨tabçéï¼åä½¿ç¨æ¥è¯¢æ¡ä»¶ä¸çç¶æçé |
| | | if (this.selectedStatus) { |
| | |
| | | "IN_PROGRESS", |
| | | ].join(","), |
| | | completed: "COMPLETED", |
| | | cancelled: "CANCELLED", |
| | | }; |
| | | if (statusMap[this.selectedStatus]) { |
| | | if ( |
| | | this.selectedStatus === "pending" || |
| | | this.selectedStatus === "completed" |
| | | this.selectedStatus === "completed" || |
| | | this.selectedStatus === "cancelled" |
| | | ) { |
| | | queryParams.taskStatus = statusMap[this.selectedStatus]; |
| | | } else { |
| | |
| | | this.endDate = ""; |
| | | this.searchForm.vehicle = ""; |
| | | this.searchForm.taskNo = ""; |
| | | // éç½®åéæ°å è½½æ°æ® |
| | | this.loadTaskList(); |
| | | }, |
| | | |
| | | // å·æ°å表 |
| | |
| | | // çé |
| | | changeFilter(filter) { |
| | | this.currentFilter = filter; |
| | | // éç½®å页 |
| | | this.currentPage = 1; |
| | | this.hasMore = true; |
| | | // éæ°å è½½æ°æ® |
| | | this.loadTaskList(); |
| | | }, |
| | |
| | | break; |
| | | |
| | | case "cancel": |
| | | // åæ¶ -> äºæ¬¡ç¡®è®¤åç¶æåä¸ºå·²åæ¶ |
| | | this.$modal |
| | | .confirm("ç¡®å®è¦åæ¶æ¤ä»»å¡åï¼") |
| | | .then(() => { |
| | | this.updateTaskStatus(task.taskId, "CANCELLED", "ä»»å¡å·²åæ¶"); |
| | | }) |
| | | .catch(() => {}); |
| | | // åæ¶ -> æ¾ç¤ºåæ¶åå éæ©å¯¹è¯æ¡ |
| | | this.currentCancelTask = task; |
| | | this.showCancelReasonDialog(); |
| | | break; |
| | | |
| | | case "arrive": |
| | |
| | | this.getLocationAndUpdateStatus(taskId, status, remark); |
| | | }, |
| | | |
| | | // å è½½åæ¶åå åå
¸ |
| | | loadCancelReasonDict() { |
| | | getDicts('task_cancel_reason').then(response => { |
| | | if (response.code === 200 && response.data) { |
| | | this.cancelReasonList = response.data.map(item => ({ |
| | | value: item.dictValue, |
| | | label: item.dictLabel |
| | | })) |
| | | } |
| | | }).catch(error => { |
| | | console.error('å è½½åæ¶åå åå
¸å¤±è´¥:', error) |
| | | }) |
| | | }, |
| | | |
| | | // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | showCancelReasonDialog() { |
| | | this.selectedCancelReason = '' |
| | | this.$refs.cancelPopup.open() |
| | | }, |
| | | |
| | | // ç¡®è®¤åæ¶ä»»å¡ |
| | | confirmCancelTask() { |
| | | if (!this.selectedCancelReason) { |
| | | this.$modal.showToast('è¯·éæ©åæ¶åå ') |
| | | return |
| | | } |
| | | |
| | | this.$refs.cancelPopup.close() |
| | | |
| | | // è°ç¨æ´æ°ç¶ææ¹æ³ï¼ä¼ éåæ¶åå |
| | | this.updateTaskStatusWithCancelReason(this.currentCancelTask.taskId, 'CANCELLED', 'ä»»å¡å·²åæ¶', this.selectedCancelReason) |
| | | }, |
| | | |
| | | // åæ¶å¯¹è¯æ¡å
³é |
| | | closeCancelDialog() { |
| | | this.$refs.cancelPopup.close() |
| | | this.selectedCancelReason = '' |
| | | this.currentCancelTask = null |
| | | }, |
| | | |
| | | // 鿩忶åå |
| | | selectCancelReason(e) { |
| | | this.selectedCancelReason = this.cancelReasonList[e.detail.value].value |
| | | }, |
| | | |
| | | // 另忶åå çç¶ææ´æ° |
| | | updateTaskStatusWithCancelReason(taskId, status, remark, cancelReason) { |
| | | this.getLocationAndUpdateStatus(taskId, status, remark, cancelReason) |
| | | }, |
| | | |
| | | // æ£æ¥ç¥æ
åæä¹¦éä»¶å¹¶æ´æ°ç¶æ |
| | | async checkConsentAttachmentAndThen(taskId, status, remark) { |
| | | try { |
| | |
| | | }, |
| | | |
| | | // è·åä½ç½®ä¿¡æ¯å¹¶æ´æ°ç¶æ |
| | | getLocationAndUpdateStatus(taskId, status, remark) { |
| | | getLocationAndUpdateStatus(taskId, status, remark, cancelReason) { |
| | | const that = this; |
| | | |
| | | // 使ç¨uni.getLocationè·åGPSä½ç½® |
| | |
| | | heading: res.direction || res.heading, |
| | | }; |
| | | |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | |
| | | changeTaskStatus(taskId, statusData) |
| | | .then((response) => { |
| | | that.$modal.showToast("ç¶ææ´æ°æå"); |
| | |
| | | taskStatus: status, |
| | | remark: remark, |
| | | }; |
| | | |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | |
| | | changeTaskStatus(taskId, statusData) |
| | | .then((response) => { |
| | |
| | | vertical-align: middle; |
| | | } |
| | | } |
| | | |
| | | // åæ¶åå å¯¹è¯æ¡æ ·å¼ |
| | | .cancel-dialog { |
| | | width: 600rpx; |
| | | background-color: white; |
| | | border-radius: 20rpx; |
| | | padding: 40rpx; |
| | | |
| | | .dialog-title { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | text-align: center; |
| | | margin-bottom: 30rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .reason-picker { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 20rpx 30rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | margin-bottom: 30rpx; |
| | | |
| | | .picker-label { |
| | | font-size: 28rpx; |
| | | color: #666; |
| | | } |
| | | |
| | | .picker-value { |
| | | flex: 1; |
| | | text-align: right; |
| | | margin: 0 20rpx; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .dialog-buttons { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | |
| | | button { |
| | | flex: 1; |
| | | height: 80rpx; |
| | | line-height: 80rpx; |
| | | border-radius: 10rpx; |
| | | font-size: 28rpx; |
| | | border: none; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | background-color: #f5f5f5; |
| | | color: #666; |
| | | } |
| | | |
| | | .confirm-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- åæ¶ä¿¡æ¯ï¼ä»
å¨ä»»å¡å·²åæ¶ä¸æåæ¶åå æ¶æ¾ç¤ºï¼ --> |
| | | <view class="detail-section" v-if="taskDetail.taskStatus === 'CANCELLED' && taskDetail.emergencyInfo && taskDetail.emergencyInfo.cancelReason"> |
| | | <view class="section-title">åæ¶ä¿¡æ¯</view> |
| | | <view class="info-item"> |
| | | <view class="label">åæ¶åå </view> |
| | | <view class="value">{{ getCancelReasonLabel(taskDetail.emergencyInfo.cancelReason) }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="taskDetail.emergencyInfo.cancelBy"> |
| | | <view class="label">åæ¶äºº</view> |
| | | <view class="value">{{ taskDetail.emergencyInfo.cancelBy }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="taskDetail.emergencyInfo.cancelTime"> |
| | | <view class="label">åæ¶æ¶é´</view> |
| | | <view class="value">{{ formatTime(taskDetail.emergencyInfo.cancelTime) }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- æ¯ä»è®°å½æç» --> |
| | | <view class="detail-section" v-if="paymentInfo && paymentInfo.paidPayments && paymentInfo.paidPayments.length > 0"> |
| | | <view class="section-title">æ¯ä»è®°å½</view> |
| | |
| | | <uni-icons type="spinner-cycle" size="40" color="#007AFF"></uni-icons> |
| | | <text>å è½½ä¸...</text> |
| | | </view> |
| | | |
| | | <!-- åæ¶åå éæ©å¯¹è¯æ¡ --> |
| | | <uni-popup ref="cancelPopup" type="center" :is-mask-click="false"> |
| | | <view class="cancel-dialog"> |
| | | <view class="dialog-title">è¯·éæ©åæ¶åå </view> |
| | | <picker mode="selector" :range="cancelReasonList" range-key="label" @change="selectCancelReason"> |
| | | <view class="reason-picker"> |
| | | <view class="picker-label">åæ¶åå </view> |
| | | <view class="picker-value"> |
| | | {{ selectedCancelReasonLabel }} |
| | | </view> |
| | | <uni-icons type="arrowright" size="16"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | <view class="dialog-buttons"> |
| | | <button class="cancel-btn" @click="closeCancelDialog">åæ¶</button> |
| | | <button class="confirm-btn" @click="confirmCancelTask">ç¡®å®</button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | |
| | | <!-- æä½æé®åºå --> |
| | | <view class="action-buttons" v-if="taskDetail"> |
| | |
| | | import { getTask, changeTaskStatus, setAssigneeReady, checkTaskConsentAttachment } from '@/api/task' |
| | | import { checkVehicleActiveTasks } from '@/api/task' |
| | | import { getPaymentInfo } from '@/api/payment' |
| | | import { getDicts } from '@/api/dict' |
| | | import { formatDateTime } from '@/utils/common' |
| | | import { validateTaskForDepart, validateTaskForSettlement, getTaskVehicleId, checkTaskCanDepart } from '@/utils/taskValidator' |
| | | import AttachmentUpload from './components/AttachmentUpload.vue' |
| | |
| | | return { |
| | | taskDetail: null, |
| | | taskId: null, |
| | | paymentInfo: null // æ¯ä»ä¿¡æ¯ |
| | | paymentInfo: null, // æ¯ä»ä¿¡æ¯ |
| | | cancelReasonList: [], // åæ¶åå å表 |
| | | showCancelDialog: false, // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | selectedCancelReason: '' // éä¸çåæ¶åå |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | } |
| | | return [baseClass, roleClasses[userType] || ''] |
| | | } |
| | | }, // æ¾ç¤ºä»»å¡ç±»å |
| | | }, |
| | | |
| | | // è·åéä¸çåæ¶åå æ ç¾ï¼ç¨äºå¼¹çªæ¾ç¤ºï¼ |
| | | selectedCancelReasonLabel() { |
| | | if (!this.selectedCancelReason || !this.cancelReasonList.length) { |
| | | return 'è¯·éæ©' |
| | | } |
| | | const reason = this.cancelReasonList.find(r => r.value === this.selectedCancelReason) |
| | | return reason ? reason.label : 'è¯·éæ©' |
| | | }, |
| | | // æ¾ç¤ºä»»å¡ç±»å |
| | | displayTaskType() { |
| | | if (!this.taskDetail || !this.taskDetail.taskType) { |
| | | return 'æªè®¾ç½®' |
| | |
| | | onLoad(options) { |
| | | this.taskId = options.id |
| | | this.loadTaskDetail() |
| | | this.loadCancelReasonDict() // å è½½åæ¶åå åå
¸ |
| | | }, |
| | | onShow() { |
| | | // æ¯æ¬¡é¡µé¢æ¾ç¤ºæ¶éæ°å è½½æ°æ®ï¼ç¡®ä¿ä»ç¼è¾é¡µé¢è¿ååè½çå°ææ°æ°æ® |
| | |
| | | break; |
| | | |
| | | case 'cancel': |
| | | // åæ¶ -> äºæ¬¡ç¡®è®¤åç¶æåä¸ºå·²åæ¶ |
| | | this.$modal.confirm('ç¡®å®è¦åæ¶æ¤ä»»å¡åï¼').then(() => { |
| | | this.updateTaskStatus('CANCELLED', 'ä»»å¡å·²åæ¶') |
| | | }).catch(() => {}); |
| | | // åæ¶ -> æ¾ç¤ºåæ¶åå éæ©å¯¹è¯æ¡ |
| | | this.showCancelReasonDialog(); |
| | | break; |
| | | |
| | | case 'arrive': |
| | |
| | | }, |
| | | |
| | | // è·åä½ç½®ä¿¡æ¯å¹¶æ´æ°ç¶æ |
| | | getLocationAndUpdateStatus(status, remark) { |
| | | getLocationAndUpdateStatus(status, remark, cancelReason) { |
| | | const that = this |
| | | |
| | | // 使ç¨uni.getLocationè·åGPSä½ç½® |
| | |
| | | heading: res.direction || res.heading |
| | | } |
| | | |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | |
| | | changeTaskStatus(that.taskId, statusData).then(response => { |
| | | that.$modal.showToast('ç¶ææ´æ°æå') |
| | | // éæ°å 载任å¡è¯¦æ
|
| | |
| | | const statusData = { |
| | | taskStatus: status, |
| | | remark: remark |
| | | } |
| | | |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | |
| | | changeTaskStatus(that.taskId, statusData).then(response => { |
| | |
| | | return 'payment-' + (key !== null && key !== undefined ? key : index); |
| | | }, |
| | | |
| | | // å è½½åæ¶åå åå
¸ |
| | | loadCancelReasonDict() { |
| | | // ä»å端è·ååæ¶åå åå
¸ |
| | | getDicts('task_cancel_reason').then(response => { |
| | | if (response.code === 200 && response.data) { |
| | | this.cancelReasonList = response.data.map(item => ({ |
| | | value: item.dictValue, |
| | | label: item.dictLabel |
| | | })) |
| | | } |
| | | }).catch(error => { |
| | | console.error('å è½½åæ¶åå åå
¸å¤±è´¥:', error) |
| | | }) |
| | | }, |
| | | |
| | | // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | showCancelReasonDialog() { |
| | | this.selectedCancelReason = '' |
| | | this.$refs.cancelPopup.open() |
| | | }, |
| | | |
| | | // ç¡®è®¤åæ¶ä»»å¡ |
| | | confirmCancelTask() { |
| | | if (!this.selectedCancelReason) { |
| | | this.$modal.showToast('è¯·éæ©åæ¶åå ') |
| | | return |
| | | } |
| | | |
| | | this.$refs.cancelPopup.close() |
| | | |
| | | // è°ç¨æ´æ°ç¶ææ¹æ³ï¼ä¼ éåæ¶åå |
| | | this.updateTaskStatusWithCancelReason('CANCELLED', 'ä»»å¡å·²åæ¶', this.selectedCancelReason) |
| | | }, |
| | | |
| | | // åæ¶å¯¹è¯æ¡å
³é |
| | | closeCancelDialog() { |
| | | this.$refs.cancelPopup.close() |
| | | this.selectedCancelReason = '' |
| | | }, |
| | | |
| | | // 鿩忶åå |
| | | selectCancelReason(e) { |
| | | this.selectedCancelReason = e.detail.value |
| | | }, |
| | | |
| | | // 另忶åå çç¶ææ´æ° |
| | | updateTaskStatusWithCancelReason(status, remark, cancelReason) { |
| | | this.getLocationAndUpdateStatus(status, remark, cancelReason) |
| | | }, |
| | | |
| | | // æ ¹æ®åæ¶åå valueè·ålabel |
| | | getCancelReasonLabel(value) { |
| | | if (!value || !this.cancelReasonList.length) { |
| | | return value || 'æªç¥' |
| | | } |
| | | const reason = this.cancelReasonList.find(r => r.value === value) |
| | | return reason ? reason.label : value |
| | | }, |
| | | |
| | | } |
| | | } |
| | | </script> |
| | |
| | | margin-left: 10rpx; |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | // åæ¶åå å¯¹è¯æ¡æ ·å¼ |
| | | .cancel-dialog { |
| | | width: 600rpx; |
| | | background-color: white; |
| | | border-radius: 20rpx; |
| | | padding: 40rpx; |
| | | |
| | | .dialog-title { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | text-align: center; |
| | | margin-bottom: 30rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .reason-picker { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 20rpx 30rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | margin-bottom: 30rpx; |
| | | |
| | | .picker-label { |
| | | font-size: 28rpx; |
| | | color: #666; |
| | | } |
| | | |
| | | .picker-value { |
| | | flex: 1; |
| | | text-align: right; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | margin: 0 10rpx; |
| | | } |
| | | } |
| | | |
| | | .dialog-buttons { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | |
| | | button { |
| | | flex: 1; |
| | | height: 80rpx; |
| | | border-radius: 10rpx; |
| | | font-size: 30rpx; |
| | | border: none; |
| | | |
| | | &.cancel-btn { |
| | | background-color: #f0f0f0; |
| | | color: #666; |
| | | } |
| | | |
| | | &.confirm-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | return error("æ æçä»»å¡ç¶æ"); |
| | | } |
| | | |
| | | // 妿æ¯åæ¶ç¶æï¼ä¿ååæ¶åå |
| | | if (newStatus == TaskStatus.CANCELLED && StringUtils.isNotEmpty(request.getCancelReason())) { |
| | | sysTaskService.saveCancelInfo(taskId, request.getCancelReason()); |
| | | } |
| | | |
| | | // 妿å
å«GPSä½ç½®ä¿¡æ¯ï¼ä½¿ç¨å¸¦ä½ç½®çæ¹æ³ |
| | | if (request.getLatitude() != null && request.getLongitude() != null) { |
| | | String address= mapService.reverseGeocoding(request.getLongitude(), request.getLatitude()); |
| | |
| | | private Double speed; |
| | | private Double heading; |
| | | |
| | | // åæ¶ç¸å
³å段 |
| | | private String cancelReason; // åæ¶åå ï¼å
³èæ°æ®åå
¸task_cancel_reasonï¼ |
| | | |
| | | public String getTaskStatus() { |
| | | return taskStatus; |
| | | } |
| | |
| | | public void setHeading(Double heading) { |
| | | this.heading = heading; |
| | | } |
| | | |
| | | public String getCancelReason() { |
| | | return cancelReason; |
| | | } |
| | | |
| | | public void setCancelReason(String cancelReason) { |
| | | this.cancelReason = cancelReason; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * è·åç¨æ·æµç§° |
| | | **/ |
| | | public static String getNickName() |
| | | { |
| | | try |
| | | { |
| | | return getLoginUser().getUser().getNickName(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new ServiceException("è·åç¨æ·æµç§°å¼å¸¸", HttpStatus.UNAUTHORIZED); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åç¨æ· |
| | | **/ |
| | | public static LoginUser getLoginUser() |
| New file |
| | |
| | | package com.ruoyi.system.domain; |
| | | |
| | | import com.ruoyi.common.annotation.DataSource; |
| | | import com.ruoyi.common.enums.DataSourceType; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import org.apache.ibatis.type.Alias; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * ServiceOrder对象 service_order |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-12-24 |
| | | */ |
| | | @Alias("ServiceOrderEntity") |
| | | @DataSource(DataSourceType.SQLSERVER) |
| | | public class ServiceOrderEntity extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** ServiceOrdID */ |
| | | private Long serviceOrdId; |
| | | |
| | | /** ServiceOrdPtServices */ |
| | | private String serviceOrdPtServices; |
| | | |
| | | /** ServiceOrdPtInServices */ |
| | | private String serviceOrdPtInServices; |
| | | |
| | | /** ServiceOrdClass */ |
| | | private String serviceOrdClass; |
| | | |
| | | /** ServiceOrdAreaType */ |
| | | private Long serviceOrdAreaType; |
| | | |
| | | /** ServiceOrdType */ |
| | | private Long serviceOrdType; |
| | | |
| | | /** ServiceOrdApptDate */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date serviceOrdApptDate; |
| | | |
| | | /** ServiceOrdCoTies */ |
| | | private String serviceOrdCoTies; |
| | | |
| | | /** ServiceOrdPtSex */ |
| | | private String serviceOrdPtSex; |
| | | |
| | | /** ServiceOrdPtNat */ |
| | | private String serviceOrdPtNat; |
| | | |
| | | /** ServiceOrdPtIDCard */ |
| | | private String serviceOrdPtIdcard; |
| | | /** |
| | | * æ¥ä»·éé¢ |
| | | */ |
| | | private Long serviceOrdTraTxnPrice; |
| | | |
| | | /** ServiceOrdPtOutHospID_New (对åºServiceOrdPtOutHospIDåæ®µ) */ |
| | | private Long serviceOrdPtOutHospIdNew; |
| | | |
| | | /** ServiceOrdPtOutHospID */ |
| | | private String serviceOrdPtOutHospId; |
| | | |
| | | /** ServiceOrdPtInHospID_New (对åºServiceOrdPtInHospIDåæ®µ) */ |
| | | private Long serviceOrdPtInHospIdNew; |
| | | |
| | | /** ServiceOrdPtInHospID */ |
| | | private String serviceOrdPtInHospId; |
| | | |
| | | /** ServiceOrdPtCondition */ |
| | | private String serviceOrdPtCondition; |
| | | |
| | | /** ServiceOrdTaskRemarks */ |
| | | private String serviceOrdTaskRemarks; |
| | | |
| | | /** ServiceOrdTraStreet */ |
| | | private String serviceOrdTraStreet; |
| | | |
| | | /** ServiceOrdTraStreetCoo */ |
| | | private String serviceOrdTraStreetCoo; |
| | | |
| | | /** ServiceOrdTraEnd */ |
| | | private String serviceOrdTraEnd; |
| | | |
| | | /** ServiceOrdTraEndCoo */ |
| | | private String serviceOrdTraEndCoo; |
| | | |
| | | /** ServiceOrd_CC_ID */ |
| | | private Long serviceOrdCcId; |
| | | |
| | | public Long getServiceOrdId() |
| | | { |
| | | return serviceOrdId; |
| | | } |
| | | |
| | | public void setServiceOrdId(Long serviceOrdId) |
| | | { |
| | | this.serviceOrdId = serviceOrdId; |
| | | } |
| | | |
| | | public String getServiceOrdPtServices() |
| | | { |
| | | return serviceOrdPtServices; |
| | | } |
| | | |
| | | public void setServiceOrdPtServices(String serviceOrdPtServices) |
| | | { |
| | | this.serviceOrdPtServices = serviceOrdPtServices; |
| | | } |
| | | |
| | | public String getServiceOrdPtInServices() |
| | | { |
| | | return serviceOrdPtInServices; |
| | | } |
| | | |
| | | public void setServiceOrdPtInServices(String serviceOrdPtInServices) |
| | | { |
| | | this.serviceOrdPtInServices = serviceOrdPtInServices; |
| | | } |
| | | |
| | | public Long getServiceOrdTraTxnPrice() { |
| | | return serviceOrdTraTxnPrice; |
| | | } |
| | | public void setServiceOrdTraTxnPrice(Long serviceOrdTraTxnPrice) { |
| | | this.serviceOrdTraTxnPrice = serviceOrdTraTxnPrice; |
| | | } |
| | | |
| | | public String getServiceOrdClass() |
| | | { |
| | | return serviceOrdClass; |
| | | } |
| | | |
| | | public void setServiceOrdClass(String serviceOrdClass) |
| | | { |
| | | this.serviceOrdClass = serviceOrdClass; |
| | | } |
| | | |
| | | public Long getServiceOrdAreaType() |
| | | { |
| | | return serviceOrdAreaType; |
| | | } |
| | | |
| | | public void setServiceOrdAreaType(Long serviceOrdAreaType) |
| | | { |
| | | this.serviceOrdAreaType = serviceOrdAreaType; |
| | | } |
| | | |
| | | public Long getServiceOrdType() |
| | | { |
| | | return serviceOrdType; |
| | | } |
| | | |
| | | public void setServiceOrdType(Long serviceOrdType) |
| | | { |
| | | this.serviceOrdType = serviceOrdType; |
| | | } |
| | | |
| | | public Date getServiceOrdApptDate() |
| | | { |
| | | return serviceOrdApptDate; |
| | | } |
| | | |
| | | public void setServiceOrdApptDate(Date serviceOrdApptDate) |
| | | { |
| | | this.serviceOrdApptDate = serviceOrdApptDate; |
| | | } |
| | | |
| | | public String getServiceOrdCoTies() |
| | | { |
| | | return serviceOrdCoTies; |
| | | } |
| | | |
| | | public void setServiceOrdCoTies(String serviceOrdCoTies) |
| | | { |
| | | this.serviceOrdCoTies = serviceOrdCoTies; |
| | | } |
| | | |
| | | public String getServiceOrdPtSex() |
| | | { |
| | | return serviceOrdPtSex; |
| | | } |
| | | |
| | | public void setServiceOrdPtSex(String serviceOrdPtSex) |
| | | { |
| | | this.serviceOrdPtSex = serviceOrdPtSex; |
| | | } |
| | | |
| | | public String getServiceOrdPtNat() |
| | | { |
| | | return serviceOrdPtNat; |
| | | } |
| | | |
| | | public void setServiceOrdPtNat(String serviceOrdPtNat) |
| | | { |
| | | this.serviceOrdPtNat = serviceOrdPtNat; |
| | | } |
| | | |
| | | public String getServiceOrdPtIdcard() |
| | | { |
| | | return serviceOrdPtIdcard; |
| | | } |
| | | |
| | | public void setServiceOrdPtIdcard(String serviceOrdPtIdcard) |
| | | { |
| | | this.serviceOrdPtIdcard = serviceOrdPtIdcard; |
| | | } |
| | | |
| | | public Long getServiceOrdPtOutHospIdNew() |
| | | { |
| | | return serviceOrdPtOutHospIdNew; |
| | | } |
| | | |
| | | public void setServiceOrdPtOutHospIdNew(Long serviceOrdPtOutHospIdNew) |
| | | { |
| | | this.serviceOrdPtOutHospIdNew = serviceOrdPtOutHospIdNew; |
| | | } |
| | | |
| | | public String getServiceOrdPtOutHospId() |
| | | { |
| | | return serviceOrdPtOutHospId; |
| | | } |
| | | |
| | | public void setServiceOrdPtOutHospId(String serviceOrdPtOutHospId) |
| | | { |
| | | this.serviceOrdPtOutHospId = serviceOrdPtOutHospId; |
| | | } |
| | | |
| | | public Long getServiceOrdPtInHospIdNew() |
| | | { |
| | | return serviceOrdPtInHospIdNew; |
| | | } |
| | | |
| | | public void setServiceOrdPtInHospIdNew(Long serviceOrdPtInHospIdNew) |
| | | { |
| | | this.serviceOrdPtInHospIdNew = serviceOrdPtInHospIdNew; |
| | | } |
| | | |
| | | public String getServiceOrdPtInHospId() |
| | | { |
| | | return serviceOrdPtInHospId; |
| | | } |
| | | |
| | | public void setServiceOrdPtInHospId(String serviceOrdPtInHospId) |
| | | { |
| | | this.serviceOrdPtInHospId = serviceOrdPtInHospId; |
| | | } |
| | | |
| | | public String getServiceOrdPtCondition() |
| | | { |
| | | return serviceOrdPtCondition; |
| | | } |
| | | |
| | | public void setServiceOrdPtCondition(String serviceOrdPtCondition) |
| | | { |
| | | this.serviceOrdPtCondition = serviceOrdPtCondition; |
| | | } |
| | | |
| | | public String getServiceOrdTaskRemarks() |
| | | { |
| | | return serviceOrdTaskRemarks; |
| | | } |
| | | |
| | | public void setServiceOrdTaskRemarks(String serviceOrdTaskRemarks) |
| | | { |
| | | this.serviceOrdTaskRemarks = serviceOrdTaskRemarks; |
| | | } |
| | | |
| | | public String getServiceOrdTraStreet() |
| | | { |
| | | return serviceOrdTraStreet; |
| | | } |
| | | |
| | | public void setServiceOrdTraStreet(String serviceOrdTraStreet) |
| | | { |
| | | this.serviceOrdTraStreet = serviceOrdTraStreet; |
| | | } |
| | | |
| | | public String getServiceOrdTraStreetCoo() |
| | | { |
| | | return serviceOrdTraStreetCoo; |
| | | } |
| | | |
| | | public void setServiceOrdTraStreetCoo(String serviceOrdTraStreetCoo) |
| | | { |
| | | this.serviceOrdTraStreetCoo = serviceOrdTraStreetCoo; |
| | | } |
| | | |
| | | public String getServiceOrdTraEnd() |
| | | { |
| | | return serviceOrdTraEnd; |
| | | } |
| | | |
| | | public void setServiceOrdTraEnd(String serviceOrdTraEnd) |
| | | { |
| | | this.serviceOrdTraEnd = serviceOrdTraEnd; |
| | | } |
| | | |
| | | public String getServiceOrdTraEndCoo() |
| | | { |
| | | return serviceOrdTraEndCoo; |
| | | } |
| | | |
| | | public void setServiceOrdTraEndCoo(String serviceOrdTraEndCoo) |
| | | { |
| | | this.serviceOrdTraEndCoo = serviceOrdTraEndCoo; |
| | | } |
| | | |
| | | public Long getServiceOrdCcId() |
| | | { |
| | | return serviceOrdCcId; |
| | | } |
| | | |
| | | public void setServiceOrdCcId(Long serviceOrdCcId) |
| | | { |
| | | this.serviceOrdCcId = serviceOrdCcId; |
| | | } |
| | | } |
| | |
| | | /** æ¯å¦å¹¿å·æ»é¨æ¨éï¼0å¦ 1æ¯ï¼ */ |
| | | private String fromHq2Is; |
| | | |
| | | /** åæ¶åå ï¼å
³èæ°æ®åå
¸task_cancel_reasonï¼ */ |
| | | private String cancelReason; |
| | | |
| | | /** åæ¶äºº */ |
| | | private String cancelBy; |
| | | |
| | | /** åæ¶æ¶é´ */ |
| | | private java.util.Date cancelTime; |
| | | |
| | | public String getServiceCode(){ |
| | | if(this.legacyServiceOrdClass!=null && this.legacyServiceNsTime!=null && this.legacyServiceOrdNo!=null) { |
| | | String nstime = DateUtils.parseDateToStr(DateUtils.YYYYMMDD, this.legacyServiceNsTime); |
| | |
| | | this.fromHq2Is = fromHq2Is; |
| | | } |
| | | |
| | | public String getCancelReason() { |
| | | return cancelReason; |
| | | } |
| | | |
| | | public void setCancelReason(String cancelReason) { |
| | | this.cancelReason = cancelReason; |
| | | } |
| | | |
| | | public String getCancelBy() { |
| | | return cancelBy; |
| | | } |
| | | |
| | | public void setCancelBy(String cancelBy) { |
| | | this.cancelBy = cancelBy; |
| | | } |
| | | |
| | | public java.util.Date getCancelTime() { |
| | | return cancelTime; |
| | | } |
| | | |
| | | public void setCancelTime(java.util.Date cancelTime) { |
| | | this.cancelTime = cancelTime; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "SysTaskEmergency{" + |
| | |
| | | /** ç®çå°çº¬åº¦ */ |
| | | private BigDecimal destinationLatitude; |
| | | |
| | | /** é¢è®¡å
¬éæ° */ |
| | | private BigDecimal estimatedDistance; |
| | | |
| | | /** è½¬è¿æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date transferTime; |
| | |
| | | /** ç»æå°å */ |
| | | private String endAddress; |
| | | |
| | | /** ç¦ç¥è½¦å
¬éæ° */ |
| | | private BigDecimal distance; |
| | | /** å
¬éæ° */ |
| | | private BigDecimal transferDistance; |
| | | |
| | | /** åæ®ç±»åIDï¼å¯¹åºSQL Serverçdictionary表vIDï¼ */ |
| | | private String documentTypeId; |
| | |
| | | this.destinationLatitude = destinationLatitude; |
| | | } |
| | | |
| | | public BigDecimal getEstimatedDistance() { |
| | | return estimatedDistance; |
| | | } |
| | | |
| | | public void setEstimatedDistance(BigDecimal estimatedDistance) { |
| | | this.estimatedDistance = estimatedDistance; |
| | | } |
| | | |
| | | public Date getTransferTime() { |
| | | return transferTime; |
| | | } |
| | |
| | | this.vehicleIds = vehicleIds; |
| | | } |
| | | |
| | | public BigDecimal getDistance() { |
| | | return distance; |
| | | } |
| | | |
| | | public void setDistance(BigDecimal distance) { |
| | | this.distance = distance; |
| | | } |
| | | |
| | | |
| | | public String getDocumentTypeId() { |
| | | return documentTypeId; |
| | |
| | | package com.ruoyi.system.mapper; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import com.ruoyi.system.domain.ServiceOrder; |
| | | import com.ruoyi.common.annotation.DataSource; |
| | | import com.ruoyi.common.enums.DataSourceType; |
| | |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteServiceOrderByIds(Long[] serviceOrdIds); |
| | | |
| | | /** |
| | | * æ´æ°æå¡è®¢ååæ¶ä¿¡æ¯ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @param cancelReason åæ¶åå ID |
| | | * @param cancelReasonText åæ¶åå ææ¬ |
| | | * @return å½±åè¡æ° |
| | | */ |
| | | public int updateServiceOrderCancelInfo(@Param("serviceOrdId") Long serviceOrdId, |
| | | @Param("cancelReason") Integer cancelReason, |
| | | @Param("cancelReasonText") String cancelReasonText); |
| | | |
| | | /** |
| | | * æ ¹æ®æå¡è®¢åIDæ¥è¯¢è®¢åç¶æ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @return 订åç¶æç |
| | | */ |
| | | public Integer selectServiceOrderStateById(Long serviceOrdId); |
| | | |
| | | /** |
| | | * æ ¹æ®æå¡è®¢åIDæ¥è¯¢åæ¶ä¿¡æ¯ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @return åæ¶ä¿¡æ¯ |
| | | */ |
| | | public Map<String, Object> selectServiceCancelInfoById(Long serviceOrdId); |
| | | } |
| | |
| | | package com.ruoyi.system.service; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | |
| | | import com.ruoyi.system.domain.ServiceOrder; |
| | | |
| | | /** |
| | |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteServiceOrderById(Long serviceOrdId); |
| | | |
| | | /** |
| | | * æ´æ°æå¡è®¢ååæ¶ä¿¡æ¯ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @param cancelReason åæ¶åå ID |
| | | * @param cancelReasonText åæ¶åå ææ¬ |
| | | * @return å½±åè¡æ° |
| | | */ |
| | | public int updateServiceOrderCancelInfo(Long serviceOrdId, Integer cancelReason, String cancelReasonText); |
| | | |
| | | /** |
| | | * æ ¹æ®æå¡è®¢åIDæ¥è¯¢è®¢åç¶æ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @return 订åç¶æç |
| | | */ |
| | | public Integer selectServiceOrderStateById(Long serviceOrdId); |
| | | |
| | | public Map<String, Object> selectCancelInfoById(Long serviceOrdId); |
| | | } |
| | |
| | | public int changeTaskStatusWithLocation(Long taskId, TaskStatus newStatus, String remark, SysTaskLog locationLog); |
| | | |
| | | /** |
| | | * ä¿åä»»å¡åæ¶ä¿¡æ¯ï¼ä»
é转è¿ä»»å¡ï¼ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param cancelReason åæ¶åå ï¼æ°æ®åå
¸task_cancel_reasonçvalueï¼ |
| | | * @return ç»æ |
| | | */ |
| | | public int saveCancelInfo(Long taskId, String cancelReason); |
| | | |
| | | /** |
| | | * ä¿åä»»å¡åæ¶ä¿¡æ¯ï¼å«åæ¶äººï¼ |
| | | * @param taskId |
| | | * @param cancelReason |
| | | * @param cancelBy |
| | | * @return |
| | | */ |
| | | public int saveCancel(Long taskId, String cancelReason,String cancelBy,Date cancelTime); |
| | | /** |
| | | * ä¸ä¼ ä»»å¡éä»¶ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | |
| | | String ServiceOrdTraDistance=MapValueUtils.getStringValue(order, "ServiceOrdTraDistance"); |
| | | if(ServiceOrdTraDistance!=null){ |
| | | ServiceOrdTraDistance=ServiceOrdTraDistance.replaceAll("[^0-9]", ""); |
| | | createTaskVo.setDistance(new BigDecimal(ServiceOrdTraDistance)); |
| | | createTaskVo.setTransferDistance(new BigDecimal(ServiceOrdTraDistance)); |
| | | } |
| | | |
| | | |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import com.ruoyi.common.annotation.DataSource; |
| | | import com.ruoyi.common.enums.DataSourceType; |
| | |
| | | public int deleteServiceOrderById(Long serviceOrdId) { |
| | | return serviceOrderMapper.deleteServiceOrderById(serviceOrdId); |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°æå¡è®¢ååæ¶ä¿¡æ¯ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @param cancelReason åæ¶åå ID |
| | | * @param cancelReasonText åæ¶åå ææ¬ |
| | | * @return å½±åè¡æ° |
| | | */ |
| | | @Override |
| | | public int updateServiceOrderCancelInfo(Long serviceOrdId, Integer cancelReason, String cancelReasonText) { |
| | | return serviceOrderMapper.updateServiceOrderCancelInfo(serviceOrdId, cancelReason, cancelReasonText); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æå¡è®¢åIDæ¥è¯¢è®¢åç¶æ |
| | | * |
| | | * @param serviceOrdId æå¡è®¢åID |
| | | * @return 订åç¶æç |
| | | */ |
| | | @Override |
| | | public Integer selectServiceOrderStateById(Long serviceOrdId) { |
| | | return serviceOrderMapper.selectServiceOrderStateById(serviceOrdId); |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, Object> selectCancelInfoById(Long serviceOrdId) { |
| | | return serviceOrderMapper.selectServiceCancelInfoById(serviceOrdId); |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | emergencyInfo.setTransferDistance(createVO.getDistance()); |
| | | emergencyInfo.setTransferDistance(createVO.getTransferDistance()); |
| | | emergencyInfo.setTransferPrice(createVO.getPrice()); |
| | | emergencyInfo.setDocumentTypeId(createVO.getDocumentTypeId()); |
| | | emergencyInfo.setTaskTypeId(createVO.getTaskTypeId()); |
| | |
| | | } |
| | | } |
| | | |
| | | if (updateVO.getDistance() != null) { |
| | | oldEmergency.setTransferDistance(updateVO.getDistance()); |
| | | if (updateVO.getTransferDistance() != null) { |
| | | oldEmergency.setTransferDistance(updateVO.getTransferDistance()); |
| | | } |
| | | if (updateVO.getPrice() != null) { |
| | | oldEmergency.setTransferPrice(updateVO.getPrice()); |
| | |
| | | } |
| | | |
| | | // æ´æ°è´¹ç¨ä¿¡æ¯ |
| | | if (createVO.getDistance() != null && BigDecimalUtil.izBigZero(createVO.getDistance())) { |
| | | existingInfo.setTransferDistance(createVO.getDistance()); |
| | | if (createVO.getTransferDistance() != null && BigDecimalUtil.izBigZero(createVO.getTransferDistance())) { |
| | | existingInfo.setTransferDistance(createVO.getTransferDistance()); |
| | | } |
| | | if (createVO.getPrice() != null) { |
| | | existingInfo.setTransferPrice(createVO.getPrice()); |
| | |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int insertSysTask(TaskCreateVO createVO) { |
| | | // è·åå½åç¨æ·ååç¨æ·ID |
| | | String username = SecurityUtils.getUsername(); |
| | | Long userId = SecurityUtils.getUserId(); |
| | | // æ ¡éªç¨æ·IDæ¯å¦ä¸ºç©ºæä¸º0 |
| | | if(userId==null || userId==0){ |
| | | log.error("insertSysTask ç¨æ·ID为空 userName:{}",username); |
| | | return 0; |
| | | } |
| | | SysTask task = new SysTask(); |
| | | // å建æ°çä»»å¡å¯¹è±¡ |
| | | task.setTaskCode(generateTaskCode()); |
| | | task.setTaskType(createVO.getTaskType()); |
| | | task.setTaskStatus(TaskStatus.PENDING.getCode()); |
| | | task.setTaskDescription(createVO.getTaskDescription()); |
| | | task.setPlannedStartTime(createVO.getPlannedStartTime()); |
| | | task.setPlannedEndTime(createVO.getPlannedEndTime()); |
| | | task.setAssigneeId(createVO.getAssigneeId()); |
| | | |
| | | // 设置任å¡åºæ¬ä¿¡æ¯ |
| | | task.setTaskType(createVO.getTaskType()); // çæä»»å¡ç¼ç |
| | | task.setTaskStatus(TaskStatus.PENDING.getCode()); // 设置任å¡ç±»å |
| | | task.setTaskDescription(createVO.getTaskDescription()); // 设置任å¡ç¶æä¸ºå¾
å¤ç |
| | | task.setPlannedStartTime(createVO.getPlannedStartTime()); // è®¾ç½®ä»»å¡æè¿° |
| | | task.setPlannedEndTime(createVO.getPlannedEndTime()); // 设置计åå¼å§æ¶é´ |
| | | task.setAssigneeId(createVO.getAssigneeId()); // 设置计åç»ææ¶é´ |
| | | // è®¾ç½®ææ´¾äººID |
| | | task.setCreatorId(userId); |
| | | // 设置åå»ºäººä¿¡æ¯ |
| | | // ä¼å
使ç¨åç«¯ä¼ å
¥çé¨é¨IDï¼å¦ææ²¡æå使ç¨å½åç¨æ·çé¨é¨ID |
| | | task.setDeptId(createVO.getDeptId() != null ? createVO.getDeptId() : SecurityUtils.getDeptId()); |
| | | task.setCreateBy(username); |
| | |
| | | if (createVO.getTransferTime() != null) { |
| | | task.setPlannedStartTime(createVO.getTransferTime()); |
| | | } |
| | | if (createVO.getDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getDistance()); |
| | | if (createVO.getTransferDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getTransferDistance()); |
| | | } |
| | | if (createVO.getPlannedStartTime() != null) { |
| | | task.setPlannedStartTime(createVO.getPlannedStartTime()); |
| | |
| | | if (createVO.getEndAddress() != null) { |
| | | task.setDestinationAddress(createVO.getEndAddress()); |
| | | } |
| | | if (createVO.getDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getDistance()); |
| | | } |
| | | |
| | | // èªå¨å¡«å
缺失çGPSåæ |
| | | autoFillMissingGpsCoordinates(task); |
| | | |
| | |
| | | |
| | | |
| | | // 设置é¢è®¡è·ç¦» |
| | | if (updateVO.getEstimatedDistance() != null) { |
| | | task.setEstimatedDistance(updateVO.getEstimatedDistance()); |
| | | } else if (updateVO.getDistance() != null) { |
| | | // å
¼å®¹æ¥æè½¬è¿å段 |
| | | task.setEstimatedDistance(updateVO.getDistance()); |
| | | if (updateVO.getTransferDistance() != null) { |
| | | task.setEstimatedDistance(updateVO.getTransferDistance()); |
| | | } |
| | | |
| | | // å¦ææ´æ°äºé¨é¨ID |
| | |
| | | taskEmergency.setUpdateTime(DateUtils.getNowDate()); |
| | | |
| | | Boolean hasEmergencyInfo = updateVO.getHospitalOut() != null || updateVO.getHospitalIn() != null || updateVO.getPatient() != null |
| | | || updateVO.getPrice() != null || updateVO.getDistance() != null; |
| | | || updateVO.getPrice() != null || updateVO.getTransferDistance() != null; |
| | | // Boolean isHeadPush=isTaskHeaderPush(task.getCreatorId(),task.getDeptId()); |
| | | // updateVO.setFromHQ2_is(isHeadPush?"1":"0"); |
| | | |
| | |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * ä¿åä»»å¡åæ¶ä¿¡æ¯ï¼ä»
é转è¿ä»»å¡ï¼ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param cancelReason åæ¶åå ï¼æ°æ®åå
¸task_cancel_reasonçvalueï¼ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int saveCancelInfo(Long taskId, String cancelReason) { |
| | | // è·åä»»å¡ä¿¡æ¯ |
| | | SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (task == null) { |
| | | throw new RuntimeException("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | // åªæè½¬è¿ä»»å¡æä¿ååæ¶ä¿¡æ¯ |
| | | if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) { |
| | | return 0; |
| | | } |
| | | |
| | | // è·å转è¿ä»»å¡æ©å±ä¿¡æ¯ |
| | | SysTaskEmergency emergency = sysEmergencyTaskService.selectSysTaskEmergencyByTaskId(taskId); |
| | | if (emergency == null) { |
| | | return 0; |
| | | } |
| | | |
| | | // è®¾ç½®åæ¶ä¿¡æ¯ |
| | | emergency.setCancelReason(cancelReason); |
| | | emergency.setCancelBy(SecurityUtils.getNickName()); |
| | | emergency.setCancelTime(DateUtils.getNowDate()); |
| | | emergency.setUpdateBy(SecurityUtils.getUsername()); |
| | | emergency.setUpdateTime(DateUtils.getNowDate()); |
| | | |
| | | // æ´æ°æ°æ®åº |
| | | return sysTaskEmergencyMapper.updateSysTaskEmergency(emergency); |
| | | } |
| | | |
| | | @Override |
| | | public int saveCancel(Long taskId, String cancelReason, String cancelBy,Date cancelTime) { |
| | | SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (task == null) { |
| | | throw new RuntimeException("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | // åªæè½¬è¿ä»»å¡æä¿ååæ¶ä¿¡æ¯ |
| | | if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) { |
| | | return 0; |
| | | } |
| | | |
| | | // è·å转è¿ä»»å¡æ©å±ä¿¡æ¯ |
| | | SysTaskEmergency emergency = sysEmergencyTaskService.selectSysTaskEmergencyByTaskId(taskId); |
| | | if (emergency == null) { |
| | | return 0; |
| | | } |
| | | |
| | | // è®¾ç½®åæ¶ä¿¡æ¯ |
| | | emergency.setCancelReason(cancelReason); |
| | | emergency.setCancelBy(cancelBy); |
| | | emergency.setCancelTime(cancelTime); |
| | | emergency.setUpdateTime(DateUtils.getNowDate()); |
| | | |
| | | // æ´æ°æ°æ®åº |
| | | return sysTaskEmergencyMapper.updateSysTaskEmergency(emergency); |
| | | } |
| | | |
| | | /** |
| | |
| | | if (createVO.getDestinationLatitude() != null) { |
| | | task.setDestinationLatitude(createVO.getDestinationLatitude()); |
| | | } |
| | | if (createVO.getEstimatedDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getEstimatedDistance()); |
| | | if (createVO.getTransferDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getTransferDistance()); |
| | | } |
| | | } |
| | | |
| | |
| | | if (createVO.getTransferTime() != null) { |
| | | task.setPlannedStartTime(createVO.getTransferTime()); |
| | | } |
| | | if (createVO.getDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getDistance()); |
| | | if (createVO.getTransferDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getTransferDistance()); |
| | | } |
| | | |
| | | // 设置ç¦ç¥è½¦ç¹å®ä¿¡æ¯ |
| | |
| | | if (createVO.getEndAddress() != null) { |
| | | task.setDestinationAddress(createVO.getEndAddress()); |
| | | } |
| | | if (createVO.getDistance() != null) { |
| | | task.setEstimatedDistance(createVO.getDistance()); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | return sysTaskAssigneeService.cancelAssigneeReady(taskId, userId); |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | |
| | | // 设置è·ç¦»åè´¹ç¨ |
| | | // ä¼å
使ç¨ç¦ç¥è½¦ä¸ç¨çdistanceåæ®µï¼å¦ææ²¡æå使ç¨éç¨çestimatedDistance |
| | | BigDecimal serviceDistance = createVO.getDistance() != null ? createVO.getDistance() : createVO.getEstimatedDistance(); |
| | | BigDecimal serviceDistance = createVO.getTransferDistance() != null ? createVO.getTransferDistance() : BigDecimal.ZERO; |
| | | welfareInfo.setServiceDistance(serviceDistance); |
| | | welfareInfo.setServicePrice(createVO.getPrice()); |
| | | |
| | |
| | | } |
| | | |
| | | // æ´æ°è·ç¦»åè´¹ç¨ |
| | | if (createVO.getDistance() != null) { |
| | | existingInfo.setServiceDistance(createVO.getDistance()); |
| | | } else if (createVO.getEstimatedDistance() != null) { |
| | | existingInfo.setServiceDistance(createVO.getEstimatedDistance()); |
| | | if (createVO.getTransferDistance() != null) { |
| | | existingInfo.setServiceDistance(createVO.getTransferDistance()); |
| | | } |
| | | if (createVO.getPrice() != null) { |
| | | existingInfo.setServicePrice(createVO.getPrice()); |
| | |
| | | |
| | | // è·å管çåIDï¼å建人ID对åºçOA_UserIDï¼ |
| | | String adminID = taskSyncUtilService.getAdminID(task); |
| | | |
| | | String serviceOrdClass = "BF"; |
| | | // è·åè°åº¦åç±»åï¼ä»ä»»å¡æå±é¨é¨çè°åº¦åç¼ç è·åï¼ |
| | | String dispatchOrdClass = "SA"; // é»è®¤å¼ |
| | | if (task.getDeptId() != null) { |
| | |
| | | SysDept dept = sysDeptMapper.selectDeptById(task.getDeptId()); |
| | | if (dept != null && StringUtils.isNotEmpty(dept.getDispatchOrderClass())) { |
| | | dispatchOrdClass = dept.getDispatchOrderClass(); |
| | | serviceOrdClass = dept.getServiceOrderClass(); |
| | | // log.info("è·å任塿å±é¨é¨çè°åº¦åç¼ç æåï¼é¨é¨ID: {}, è°åº¦åç¼ç : {}", task.getDeptId(), dispatchOrdClass); |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | } |
| | | } |
| | | params.put("AdminID", adminID); |
| | | |
| | | params.put("ServiceOrdClass", serviceOrdClass); |
| | | String serviceOrdAreaType = "1"; // é»è®¤å¼ |
| | | if (StringUtils.isNotEmpty(emergency.getDocumentTypeId())) { |
| | | serviceOrdAreaType = emergency.getDocumentTypeId(); |
| | | // log.info("è·ååæ®ç±»åIDæåï¼ä»»å¡ID: {}, åæ®ç±»åID: {}", task.getTaskId(), serviceOrdAreaType); |
| | | } else { |
| | | log.warn("任塿ªé
ç½®åæ®ç±»åIDï¼ä»»å¡ID: {}ï¼ä½¿ç¨é»è®¤å¼", task.getTaskId()); |
| | | } |
| | | params.put("ServiceOrdAreaType", serviceOrdAreaType); // ä»ä»»å¡çdocument_type_idè·å |
| | | String serviceOrdType = "1"; // é»è®¤å¼ |
| | | if (StringUtils.isNotEmpty(emergency.getTaskTypeId())) { |
| | | serviceOrdType = emergency.getTaskTypeId(); |
| | | // log.info("è·åä»»å¡ç±»åIDæåï¼ä»»å¡ID: {}, ä»»å¡ç±»åID: {}", taskId, serviceOrdType); |
| | | } else { |
| | | log.warn("任塿ªé
置任å¡ç±»åIDï¼ä»»å¡ID: {}ï¼ä½¿ç¨é»è®¤å¼", task.getTaskId()); |
| | | } |
| | | params.put("ServiceOrdType", serviceOrdType); // æå¡åæ§è¡ç±»åï¼ä»ä»»å¡çtask_type_idè·åï¼ |
| | | // åºæ¬ä¿¡æ¯ |
| | | params.put("DispatchOrdClass", dispatchOrdClass); |
| | | params.put("ServiceOrdID", emergency.getLegacyServiceOrdId().toString()); |
| | |
| | | transferPrice = "0"; |
| | | } |
| | | } |
| | | params.put("DispatchOrdPerfomance", transferPrice); |
| | | //æäº¤ä»· |
| | | params.put("ServiceOrdTraTxnPrice", transferPrice); |
| | | params.put("StretcherMoney", "0"); // æ¬æ
æ¶è´¹ |
| | | params.put("AddMoneyType", ""); // éå é¡¹ç® |
| | | params.put("AddMoney", "0"); // éå 项ç®è´¹ç¨ |
| | |
| | | // è§£æååº |
| | | Long serviceOrdId = taskSyncUtilService.parseResponse(response); |
| | | |
| | | if (LongUtil.isNotEmpty(serviceOrderId)) { |
| | | if (LongUtil.isNotEmpty(serviceOrdId)) { |
| | | // 忥æåï¼æ´æ°è®°å½ |
| | | emergency.setLegacyServiceOrdId(serviceOrdId); |
| | | emergency.setSyncStatus(2); // 忥æå |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import com.ruoyi.common.config.LegacySystemConfig; |
| | | import com.ruoyi.common.utils.LongUtil; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskEmergency; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | import com.ruoyi.system.mapper.SysTaskMapper; |
| | | import com.ruoyi.system.service.IDispatchOrdService; |
| | | import com.ruoyi.system.service.IServiceOrderService; |
| | | import com.ruoyi.system.service.ISysDictDataService; |
| | | import com.ruoyi.system.service.ISysTaskEmergencyService; |
| | | import com.ruoyi.system.service.ITaskStatusPushService; |
| | | import com.ruoyi.system.utils.TaskStatusPushConverter; |
| | |
| | | |
| | | @Autowired |
| | | private IDispatchOrdService dispatchOrdService; |
| | | |
| | | @Autowired |
| | | private IServiceOrderService serviceOrderService; |
| | | |
| | | @Autowired |
| | | private ISysDictDataService sysDictDataService; |
| | | |
| | | /** |
| | | * å°å个任å¡ç¶ææ¨éå°æ§ç³»ç» |
| | |
| | | // currentLegacyStatus, TaskStatusPushConverter.getLegacyStatusDescription(currentLegacyStatus)); |
| | | return true; // è¿åtrueï¼å 为è¿ä¸ç®å¤±è´¥ï¼åªæ¯ä¸éè¦æ¨é |
| | | } |
| | | |
| | | if(newTaskStatus.equals(TaskStatus.CANCELLED)){ |
| | | if(LongUtil.isNotEmpty(emergency.getLegacyServiceOrdId()) ) { |
| | | log.info("åæ¶è½¬è¿ä»»å¡: {}", emergency.getLegacyServiceOrdId()); |
| | | cancelTask(emergency.getLegacyServiceOrdId(), emergency.getCancelReason(), emergency.getCancelBy()); |
| | | } |
| | | } |
| | | // æ¨éç¶æå°æ§ç³»ç» |
| | | boolean result = updateLegacyTaskStatus(emergency.getLegacyDispatchOrdId(), targetStatusCode); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | private void cancelTask(Long serviceOrderId, String cancelReason, String cancelBy){ |
| | | // åæ¶ä»»å¡ï¼æ´æ°SQL Serverä¸çServiceOrder表 |
| | | try { |
| | | if (serviceOrderId == null || serviceOrderId <= 0) { |
| | | log.warn("ServiceOrderIDä¸ºç©ºï¼æ æ³åæ¶ä»»å¡"); |
| | | return; |
| | | } |
| | | |
| | | // è§£æåæ¶åå ID |
| | | Integer cancelReasonId = null; |
| | | String cancelReasonText = ""; |
| | | |
| | | if (cancelReason != null && !cancelReason.isEmpty()) { |
| | | try { |
| | | cancelReasonId = Integer.parseInt(cancelReason); |
| | | // 仿°æ®åå
¸æ¥è¯¢åæ¶åå ææ¬ |
| | | String dictLabel = sysDictDataService.selectDictLabel("task_cancel_reason", cancelReason); |
| | | if (dictLabel != null && !dictLabel.isEmpty()) { |
| | | cancelReasonText = "[åæ¶æä½:" + (cancelBy != null ? cancelBy : "ç³»ç»") + "] " + dictLabel; |
| | | } else { |
| | | cancelReasonText = "[åæ¶æä½:" + (cancelBy != null ? cancelBy : "ç³»ç»") + "]"; |
| | | } |
| | | } catch (NumberFormatException e) { |
| | | log.warn("åæ¶åå IDæ ¼å¼é误: {}", cancelReason); |
| | | cancelReasonText = "[åæ¶æä½:" + (cancelBy != null ? cancelBy : "ç³»ç»") + "] " + cancelReason; |
| | | } |
| | | } else { |
| | | cancelReasonText = "[åæ¶æä½:" + (cancelBy != null ? cancelBy : "ç³»ç»") + "]"; |
| | | } |
| | | |
| | | // è°ç¨Serviceæ´æ°ServiceOrder表 |
| | | int rows = serviceOrderService.updateServiceOrderCancelInfo(serviceOrderId, cancelReasonId, cancelReasonText); |
| | | |
| | | if (rows > 0) { |
| | | log.info("æåæ´æ°æ§ç³»ç»ServiceOrderåæ¶ä¿¡æ¯ï¼ServiceOrdID: {}, åæ¶åå ID: {}, åæ¶åå ææ¬: {}", |
| | | serviceOrderId, cancelReasonId, cancelReasonText); |
| | | } else { |
| | | log.warn("æ´æ°æ§ç³»ç»ServiceOrderåæ¶ä¿¡æ¯å¤±è´¥ï¼æªæ¾å°å¯¹åºè®¢åï¼ServiceOrdID: {}", serviceOrderId); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("æ´æ°æ§ç³»ç»ServiceOrderåæ¶ä¿¡æ¯å¼å¸¸ï¼ServiceOrdID: {}", serviceOrderId, e); |
| | | } |
| | | } |
| | | /** |
| | | * æ´æ°æ§ç³»ç»è°åº¦åç¶æï¼ç´æ¥æä½SQL Serveræ°æ®åºï¼ |
| | | * |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import com.ruoyi.common.config.LegacySystemConfig; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.LongUtil; |
| | | import com.ruoyi.system.domain.DispatchOrd; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskEmergency; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | import com.ruoyi.system.mapper.SysTaskMapper; |
| | | import com.ruoyi.system.service.IDispatchOrdService; |
| | | import com.ruoyi.system.service.ISysTaskEmergencyService; |
| | | import com.ruoyi.system.service.ITaskStatusSyncService; |
| | | import com.ruoyi.system.service.*; |
| | | import com.ruoyi.system.utils.TaskStatusConverter; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | |
| | | @Autowired |
| | | private SysTaskMapper sysTaskMapper; |
| | | |
| | | @Autowired |
| | | private ISysTaskService taskService; |
| | | |
| | | @Autowired |
| | | private ISysTaskEmergencyService sysTaskEmergencyService; |
| | |
| | | } |
| | | } |
| | | |
| | | @Autowired |
| | | private IServiceOrderService serviceOrderService; |
| | | /** |
| | | * æ¹é忥已忥è°åº¦åçä»»å¡ç¶æï¼ä»æ§ç³»ç»å°æ°ç³»ç»ï¼ |
| | | * 使ç¨å页æ¥è¯¢ï¼æ¹éæ¥è¯¢SQL Serveræ°æ®åºï¼åå°ç½ç»è¯·æ±æ¬¡æ° |
| | |
| | | // log.info("å¼å§åæ¥ç¶æç¬¬ {} 页ï¼ä»»å¡æ°é: {}", (offset / pageSize) + 1, syncedTasks.size()); |
| | | |
| | | // 2. æåè°åº¦åIDå表 |
| | | List<Long> dispatchOrdIDs = new ArrayList<>(); |
| | | |
| | | Map<Long, SysTaskEmergency> dispatchIdToTaskMap = new HashMap<>(); |
| | | |
| | | |
| | | for (SysTaskEmergency emergency : syncedTasks) { |
| | | Long dispatchOrdId = emergency.getLegacyDispatchOrdId(); |
| | | if (dispatchOrdId != null && dispatchOrdId > 0) { |
| | | dispatchOrdIDs.add(dispatchOrdId); |
| | | dispatchIdToTaskMap.put(dispatchOrdId, emergency); |
| | | if (LongUtil.isNotEmpty(emergency.getTaskId())) { |
| | | |
| | | if(!dispatchIdToTaskMap.containsKey(dispatchOrdId)) { |
| | | dispatchIdToTaskMap.put(emergency.getTaskId(), emergency); |
| | | } |
| | | } |
| | | Long serviceOrdId = emergency.getLegacyServiceOrdId(); |
| | | if(LongUtil.isNotEmpty(serviceOrdId)){ |
| | | if(!dispatchIdToTaskMap.containsKey(emergency.getTaskId())) { |
| | | dispatchIdToTaskMap.put(emergency.getTaskId(), emergency); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (dispatchOrdIDs.isEmpty()) { |
| | | if (dispatchIdToTaskMap.size()<=0) { |
| | | // log.warn("æ¬é¡µæ²¡æææçè°åº¦åID"); |
| | | offset += pageSize; |
| | | continue; |
| | | } |
| | | |
| | | // 3. æ¹éæ¥è¯¢æ§ç³»ç»è°åº¦åç¶æï¼ç´æ¥æ¥è¯¢SQL Serveræ°æ®åºï¼ |
| | | List<DispatchOrd> dispatchOrds = dispatchOrdService.selectDispatchOrdStatesByIDs(dispatchOrdIDs); |
| | | |
| | | if (dispatchOrds == null || dispatchOrds.isEmpty()) { |
| | | log.warn("æªæ¥è¯¢å°æ§ç³»ç»è°åº¦åç¶æ"); |
| | | offset += pageSize; |
| | | continue; |
| | | dispatchIdToTaskMap.forEach((taskId, emergency) -> { |
| | | Long dispatchOrdId = emergency.getLegacyDispatchOrdId(); |
| | | Long serviceOrdId = emergency.getLegacyServiceOrdId(); |
| | | if(LongUtil.isNotEmpty(dispatchOrdId)){ |
| | | Integer state =dispatchOrdService.selectDispatchOrdStateByID(dispatchOrdId); |
| | | syncTaskStatusWithLegacyState(taskId, state); |
| | | } |
| | | |
| | | // 4. æå»ºè°åº¦åIDå°ç¶æçæ å° |
| | | Map<Long, Integer> dispatchIdToStateMap = new HashMap<>(); |
| | | for (DispatchOrd dispatchOrd : dispatchOrds) { |
| | | else if(LongUtil.isNotEmpty(serviceOrdId)){ |
| | | try { |
| | | Long dispatchOrdId = Long.parseLong(dispatchOrd.getDispatchOrdID()); |
| | | Integer dispatchOrdState = Integer.parseInt(dispatchOrd.getDispatchOrdState()); |
| | | if (dispatchOrdState != null) { |
| | | dispatchIdToStateMap.put(dispatchOrdId, dispatchOrdState); |
| | | Integer serviceOrdState = serviceOrderService.selectServiceOrderStateById(serviceOrdId); |
| | | if (serviceOrdState == 4) { |
| | | //åæ¶ |
| | | Map<String, Object> cancelInfo = serviceOrderService.selectCancelInfoById(serviceOrdId); |
| | | String cancelReasonText = (String) cancelInfo.get("ServiceOrdCancelReasonTXT"); |
| | | String cancelReason = (String) cancelInfo.get("ServiceOrdCancelReason"); |
| | | taskService.saveCancel(taskId, cancelReason, cancelReasonText, DateUtils.getNowDate()); |
| | | } |
| | | } catch (NumberFormatException e) { |
| | | log.error("è§£æè°åº¦åID失败: {}", dispatchOrd.getDispatchOrdID(), e); |
| | | } |
| | | }catch (Exception ex){ |
| | | log.error("æ¥è¯¢æ§ç³»ç»ç¶æå¤±è´¥ï¼ä»»å¡ID: {}, ServiceOrdID: {}", taskId, serviceOrdId); |
| | | } |
| | | |
| | | // 5. éåä»»å¡ï¼åæ¥ç¶æ |
| | | int pageSuccessCount = 0; |
| | | for (Map.Entry<Long, SysTaskEmergency> entry : dispatchIdToTaskMap.entrySet()) { |
| | | Long dispatchOrdId = entry.getKey(); |
| | | SysTaskEmergency emergency = entry.getValue(); |
| | | |
| | | // è·åæ§ç³»ç»ç¶æ |
| | | Integer legacyStatus = dispatchIdToStateMap.get(dispatchOrdId); |
| | | if (legacyStatus == null) { |
| | | // log.warn("æªæ¾å°è°åº¦åç¶æï¼DispatchOrdID: {}", dispatchOrdId); |
| | | continue; |
| | | // syncTaskStatusWithLegacyState(taskId, state); |
| | | } |
| | | }); |
| | | |
| | | // 忥å个任å¡ç¶æ |
| | | boolean result = syncTaskStatusWithLegacyState(emergency.getTaskId(), legacyStatus); |
| | | if (result) { |
| | | pageSuccessCount++; |
| | | } |
| | | } |
| | | |
| | | totalSuccessCount += pageSuccessCount; |
| | | // log.info("ç¶æç¬¬ {} é¡µåæ¥å®æï¼æ»æ°: {}, æå: {}", |
| | | // (offset / pageSize) + 1, syncedTasks.size(), pageSuccessCount); |
| | | // |
| | | // 妿æ¬é¡µæ°æ®å°äºæ¯é¡µå¤§å°ï¼è¯´æå·²ç»æ¯æåä¸é¡µ |
| | | if (syncedTasks.size() < pageSize) { |
| | |
| | | break; |
| | | } |
| | | |
| | | |
| | | sysTaskMapper.updateSysTask(task); |
| | | |
| | | log.info("ä»»å¡ç¶æåæ¥æåï¼ä»»å¡ID: {}, æ§ç¶æ: {}, æ°ç¶æ: {}, æ§ç³»ç»ç¶æç : {} ({})", |
| | |
| | | <result property="serviceOrdCCTime" column="ServiceOrd_CC_Time" /> |
| | | <result property="serviceOrdVisit" column="ServiceOrdVisit" /> |
| | | </resultMap> |
| | | |
| | | <resultMap type="java.util.HashMap" id="ServiceCancelResult"> |
| | | <result property="ServiceOrdState" column="ServiceOrdState" /> |
| | | <result property="ServiceOrdCancelReason" column="ServiceOrdCancelReason" /> |
| | | <result property="ServiceOrdCancelReasonTXT" column="ServiceOrdCancelReasonTXT" /> |
| | | </resultMap> |
| | | <sql id="selectServiceOrderVo"> |
| | | select ServiceOrdID, ServiceOrdUserID, ServiceOrdClass, ServiceOrdType, ServiceOrdState, ServiceOrdStartDate, ServiceOrdApptDate, ServiceOrdCoName, ServiceOrdCoPhone, ServiceOrdPtName, ServiceOrdPtAge, ServiceOrdPtSex, ServiceOrdPtKG, ServiceOrdPtNat, ServiceOrdPtIDCard, ServiceOrdTraProvince, ServiceOrdTraCity, ServiceOrdTraStreet, ServiceOrdTraEnd, ServiceOrdTraDistance, ServiceOrdTraUnitPrice, ServiceOrdTraTxnPrice, ServiceOrdTraPaidType, ServiceOrdTraPaidPrice, ServiceOrdUnitRemarks, ServiceOrd_CC_Time, ServiceOrdVisit from ServiceOrder |
| | | </sql> |
| | |
| | | #{serviceOrdId} |
| | | </foreach> |
| | | </delete> |
| | | |
| | | <!-- æ´æ°æå¡è®¢ååæ¶ä¿¡æ¯ --> |
| | | <update id="updateServiceOrderCancelInfo"> |
| | | update ServiceOrder |
| | | set ServiceOrdState = 4, |
| | | ServiceOrdCancelReason = #{cancelReason}, |
| | | ServiceOrdCancelReasonTXT = #{cancelReasonText} |
| | | where ServiceOrdID = #{serviceOrdId} |
| | | </update> |
| | | |
| | | <!-- æ ¹æ®æå¡è®¢åIDæ¥è¯¢è®¢åç¶æ --> |
| | | <select id="selectServiceOrderStateById" parameterType="Long" resultType="Integer"> |
| | | select ServiceOrdState |
| | | from ServiceOrder |
| | | where ServiceOrdID = #{serviceOrdId} |
| | | </select> |
| | | <select id="selectServiceCancelInfoById" parameterType="Long" resultMap="ServiceCancelResult"> |
| | | select ServiceOrdState, ServiceOrdCancelReason, ServiceOrdCancelReasonTXT |
| | | from ServiceOrder |
| | | where ServiceOrdID = #{serviceOrdId} |
| | | </select> |
| | | </mapper> |
| | |
| | | <result property="legacyServiceOrdClass" column="legacy_service_ord_class" /> |
| | | <result property="serviceOrdVip" column="service_ord_vip" /> |
| | | <result property="fromHq2Is" column="from_hq2_is" /> |
| | | <result property="cancelReason" column="cancel_reason" /> |
| | | <result property="cancelBy" column="cancel_by" /> |
| | | <result property="cancelTime" column="cancel_time" /> |
| | | <result property="createTime" column="create_time" /> |
| | | <result property="updateTime" column="update_time" /> |
| | | <result property="createBy" column="create_by" /> |
| | |
| | | hospital_in_latitude, transfer_distance, transfer_price, passenger_contact, |
| | | passenger_phone, disease_ids, document_type_id, task_type_id, legacy_service_ord_id, legacy_dispatch_ord_id, |
| | | sync_status, sync_time, sync_error_msg, dispatch_sync_status, dispatch_sync_time, dispatch_sync_error_msg, need_resync, legacy_service_ord_no, legacy_dispatch_ord_no, legacy_service_ns_time, legacy_dispatch_ns_time, legacy_dispatch_ord_class, legacy_service_ord_class, service_ord_vip, from_hq2_is, |
| | | cancel_reason, cancel_by, cancel_time, |
| | | create_time, update_time, create_by, update_by |
| | | from sys_task_emergency |
| | | </sql> |
| | |
| | | <if test="legacyServiceOrdClass != null">legacy_service_ord_class,</if> |
| | | <if test="serviceOrdVip != null">service_ord_vip,</if> |
| | | <if test="fromHq2Is != null">from_hq2_is,</if> |
| | | <if test="cancelReason != null">cancel_reason,</if> |
| | | <if test="cancelBy != null">cancel_by,</if> |
| | | <if test="cancelTime != null">cancel_time,</if> |
| | | <if test="createTime != null">create_time,</if> |
| | | <if test="updateTime != null">update_time,</if> |
| | | <if test="createBy != null">create_by,</if> |
| | |
| | | <if test="legacyServiceOrdClass != null">#{legacyServiceOrdClass},</if> |
| | | <if test="serviceOrdVip != null">#{serviceOrdVip},</if> |
| | | <if test="fromHq2Is != null">#{fromHq2Is},</if> |
| | | <if test="cancelReason != null">#{cancelReason},</if> |
| | | <if test="cancelBy != null">#{cancelBy},</if> |
| | | <if test="cancelTime != null">#{cancelTime},</if> |
| | | <if test="createTime != null">#{createTime},</if> |
| | | <if test="updateTime != null">#{updateTime},</if> |
| | | <if test="createBy != null">#{createBy},</if> |
| | |
| | | <if test="legacyServiceOrdClass != null">legacy_service_ord_class = #{legacyServiceOrdClass},</if> |
| | | <if test="serviceOrdVip != null">service_ord_vip = #{serviceOrdVip},</if> |
| | | <if test="fromHq2Is != null">from_hq2_is = #{fromHq2Is},</if> |
| | | <if test="cancelReason != null">cancel_reason = #{cancelReason},</if> |
| | | <if test="cancelBy != null">cancel_by = #{cancelBy},</if> |
| | | <if test="cancelTime != null">cancel_time = #{cancelTime},</if> |
| | | <if test="updateTime != null">update_time = #{updateTime},</if> |
| | | <if test="updateBy != null">update_by = #{updateBy},</if> |
| | | </trim> |
| New file |
| | |
| | | -- ---------------------------- |
| | | -- 为sys_task_emergency表添å åæ¶ç¸å
³å段 |
| | | -- ç¨äºè®°å½ä»»å¡åæ¶çåå ãåæ¶äººååæ¶æ¶é´ |
| | | -- æ§è¡æ¶é´ï¼2024-12-24 |
| | | -- ---------------------------- |
| | | |
| | | -- æ·»å åæ¶åå åæ®µï¼å
³èæ°æ®åå
¸task_cancel_reasonï¼ |
| | | ALTER TABLE sys_task_emergency |
| | | ADD COLUMN cancel_reason VARCHAR(50) COMMENT 'åæ¶åå ï¼å
³èæ°æ®åå
¸task_cancel_reasonï¼' AFTER from_hq2_is; |
| | | |
| | | -- æ·»å åæ¶äººåæ®µ |
| | | ALTER TABLE sys_task_emergency |
| | | ADD COLUMN cancel_by VARCHAR(64) COMMENT 'åæ¶äºº' AFTER cancel_reason; |
| | | |
| | | -- æ·»å åæ¶æ¶é´å段 |
| | | ALTER TABLE sys_task_emergency |
| | | ADD COLUMN cancel_time DATETIME COMMENT 'åæ¶æ¶é´' AFTER cancel_by; |
| | | |
| | | -- å建索å¼ä»¥æåæ¥è¯¢æ§è½ |
| | | CREATE INDEX idx_cancel_reason ON sys_task_emergency(cancel_reason); |
| | | CREATE INDEX idx_cancel_time ON sys_task_emergency(cancel_time); |
| | | |
| | | -- æ¥çè¡¨ç»æ |
| | | DESC sys_task_emergency; |
| New file |
| | |
| | | -- ---------------------------- |
| | | -- æå
¥ä»»å¡åæ¶åå æ°æ®åå
¸ |
| | | -- åå
¸ç±»åï¼task_cancel_reason |
| | | -- æ§è¡æ¶é´ï¼2024-12-24 |
| | | -- ---------------------------- |
| | | |
| | | -- 1. æå
¥åå
¸ç±»å |
| | | INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) |
| | | VALUES ('ä»»å¡åæ¶åå ', 'task_cancel_reason', '0', 'admin', NOW(), '转è¿ä»»å¡åæ¶åå åå
¸'); |
| | | |
| | | -- 2. æå
¥åå
¸æ°æ® |
| | | INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) VALUES |
| | | (1, 'ä»·æ ¼ä¸æ¥å', '1', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), '客æ·å¯¹ä»·æ ¼ä¸æ»¡æ'), |
| | | (2, 'æ¶é´ç´§æ¥', '2', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'æ¶é´è¦æ±ç´§æ¥'), |
| | | (3, 'åºè½¦é度æ
¢', '3', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'åºè½¦é度ä¸å¤å¿«'), |
| | | (4, 'éæ©å
¶ä»è½¦', '4', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), '客æ·éæ©å
¶ä»è½¦è¾'), |
| | | (5, 'ç
人没æçå½ä½å¾', '5', 'task_cancel_reason', '', 'danger', 'N', '0', 'admin', NOW(), 'ç
人已æ çå½ä½å¾'), |
| | | (6, 'å»çæ¤å£«åä¸è¶³', '6', 'task_cancel_reason', '', 'warning', 'N', '0', 'admin', NOW(), '廿¤äººåä¸è¶³'), |
| | | (7, 'ç
人æ
嵿å', '7', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'ç
人æ
åµåçåå'), |
| | | (8, 'å
¶ä»', '8', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å
¶ä»åå '), |
| | | (9, 'ç¬¬ä¸æ¹åæ¶', '9', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'ç¬¬ä¸æ¹åæ¶ä»»å¡'), |
| | | (10, 'æµè¯è®¢å', '10', 'task_cancel_reason', '', 'info', 'N', '0', 'admin', NOW(), 'æµè¯è®¢å'), |
| | | (11, 'ä¼ ææ§ç¾ç
', '11', 'task_cancel_reason', '', 'danger', 'N', '0', 'admin', NOW(), 'ç
äººæ£æä¼ ææ§ç¾ç
'), |
| | | (12, '家屿æº/ææ¥/䏿¥çµè¯', '12', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), '家屿 æ³èç³»'), |
| | | (13, 'æ¤å£«ä¸è¶³', '13', 'task_cancel_reason', '', 'warning', 'N', '0', 'admin', NOW(), 'æ¤å£«äººåä¸è¶³'), |
| | | (14, 'å»çä¸è¶³', '14', 'task_cancel_reason', '', 'warning', 'N', '0', 'admin', NOW(), 'å»ç人åä¸è¶³'), |
| | | (15, '设å¤ä¸è¶³(å¼å¸æº)', '15', 'task_cancel_reason', '', 'warning', 'N', '0', 'admin', NOW(), '缺å°å¿
è¦è®¾å¤'), |
| | | (16, '家屿²¡è系好åºä½', '16', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'ç®æ å»é¢åºä½æªç¡®è®¤'), |
| | | (17, 'ç§»äº¤åæ¯æºææ§è¡', '17', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'ä»»å¡ç§»äº¤ç»åæ¯æºæ'), |
| | | (18, '移交åäºå¤(æ¹æ±)', '18', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'ä»»å¡ç§»äº¤æ¹æ±åäºå¤'), |
| | | (19, '移交åäºå¤(èå)', '19', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'ä»»å¡ç§»äº¤èååäºå¤'), |
| | | (20, 'å®¶å±ä¸è¯éé²ä¿¡æ¯', '20', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å®¶å±æç»æä¾å¿
è¦ä¿¡æ¯'), |
| | | (21, 'æå¨å»é¢/ç®çå°å»é¢æ´¾è½¦', '21', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å»é¢èªå·±å®æè½¦è¾'), |
| | | (22, 'èªé©¾è½¦æ¥éæ£è
', '22', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å®¶å±èªå·±å¼è½¦æ¥é'), |
| | | (23, 'éæ©å
¶ä»æºæè½¦è¾', '23', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'éæ©å
¶ä»ææ¤æºæ'), |
| | | (24, 'å¤èéç¥åæ¶', '24', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å¤èå使¹éç¥åæ¶'), |
| | | (25, 'å¤èæ åé¦', '25', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å¤èæ ååº'), |
| | | (26, '家屿 åå ç´æ¥åç¥åæ¶', '26', 'task_cancel_reason', '', 'default', 'N', '0', 'admin', NOW(), 'å®¶å±ç´æ¥è¦æ±åæ¶'); |
| | | |
| | | -- æ¥è¯¢éªè¯ |
| | | SELECT * FROM sys_dict_type WHERE dict_type = 'task_cancel_reason'; |
| | | SELECT * FROM sys_dict_data WHERE dict_type = 'task_cancel_reason' ORDER BY dict_sort; |
| New file |
| | |
| | | # 转è¿ä»»å¡åæ¶åå åè½å®ç°è¯´æ |
| | | |
| | | ## ä¸ãåè½æ¦è¿° |
| | | |
| | | 为转è¿ä»»å¡å¢å åæ¶åå è®°å½åè½,å½ç¨æ·åæ¶ä»»å¡æ¶,éè¦éæ©åæ¶åå å¹¶è®°å½åæ¶äººååæ¶æ¶é´ã |
| | | |
| | | ## äºãæ°æ®åºåæ´ |
| | | |
| | | ### 2.1 sys_task_emergency表å¢å ä¸ä¸ªå段 |
| | | |
| | | æ§è¡SQLèæ¬ï¼`sql/add_cancel_reason_fields.sql` |
| | | |
| | | ```sql |
| | | ALTER TABLE sys_task_emergency |
| | | ADD COLUMN cancel_reason VARCHAR(50) COMMENT 'åæ¶åå ï¼å
³èæ°æ®åå
¸task_cancel_reasonï¼'; |
| | | |
| | | ALTER TABLE sys_task_emergency |
| | | ADD COLUMN cancel_by VARCHAR(64) COMMENT 'åæ¶äºº'; |
| | | |
| | | ALTER TABLE sys_task_emergency |
| | | ADD COLUMN cancel_time DATETIME COMMENT 'åæ¶æ¶é´'; |
| | | ``` |
| | | |
| | | ### 2.2 æ°æ®åå
¸é
ç½® |
| | | |
| | | æ§è¡SQLèæ¬ï¼`sql/insert_dict_task_cancel_reason.sql` |
| | | |
| | | æ·»å æ°æ®åå
¸ç±»å `task_cancel_reason`ï¼å
å«26ä¸ªåæ¶åå éé¡¹ï¼ |
| | | |
| | | 1. ä»·æ ¼ä¸æ¥å |
| | | 2. æ¶é´ç´§æ¥ |
| | | 3. åºè½¦é度æ
¢ |
| | | 4. éæ©å
¶ä»è½¦ |
| | | 5. ç
人没æçå½ä½å¾ |
| | | 6. å»çæ¤å£«åä¸è¶³ |
| | | 7. ç
人æ
嵿å |
| | | 8. å
¶ä» |
| | | 9. ç¬¬ä¸æ¹åæ¶ |
| | | 10. æµè¯è®¢å |
| | | 11. ä¼ ææ§ç¾ç
|
| | | 12. 家屿æº/ææ¥/䏿¥çµè¯ |
| | | 13. æ¤å£«ä¸è¶³ |
| | | 14. å»çä¸è¶³ |
| | | 15. 设å¤ä¸è¶³ï¼å¼å¸æºï¼ |
| | | 16. 家屿²¡è系好åºä½ |
| | | 17. ç§»äº¤åæ¯æºææ§è¡ |
| | | 18. 移交åäºå¤ï¼æ¹æ±ï¼ |
| | | 19. 移交åäºå¤ï¼èåï¼ |
| | | 20. å®¶å±ä¸è¯éé²ä¿¡æ¯ |
| | | 21. æå¨å»é¢/ç®çå°å»é¢æ´¾è½¦ |
| | | 22. èªé©¾è½¦æ¥éæ£è
|
| | | 23. éæ©å
¶ä»æºæè½¦è¾ |
| | | 24. å¤èéç¥åæ¶ |
| | | 25. å¤èæ åé¦ |
| | | 26. 家屿 åå ç´æ¥åç¥åæ¶ |
| | | |
| | | ## ä¸ãåç«¯ä¿®æ¹ |
| | | |
| | | ### 3.1 å®ä½ç±»ä¿®æ¹ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java` |
| | | |
| | | æ·»å ä¸ä¸ªåæ®µå±æ§ï¼ |
| | | - `private String cancelReason;` - åæ¶åå |
| | | - `private String cancelBy;` - åæ¶äºº |
| | | - `private java.util.Date cancelTime;` - åæ¶æ¶é´ |
| | | |
| | | ### 3.2 Mapper XMLä¿®æ¹ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml` |
| | | |
| | | å¨`resultMap`ã`selectSysTaskEmergencyVo`ã`insertSysTaskEmergency`ã`updateSysTaskEmergency`䏿·»å ä¸ä¸ªåæ®µçæ å°åå¤çã |
| | | |
| | | ### 3.3 æ§å¶å¨ä¿®æ¹ |
| | | |
| | | **æä»¶**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java` |
| | | |
| | | #### 3.3.1 ChangeStatusRequestå¢å åæ®µ |
| | | |
| | | ```java |
| | | private String cancelReason; // åæ¶åå ï¼å
³èæ°æ®åå
¸task_cancel_reasonï¼ |
| | | ``` |
| | | |
| | | #### 3.3.2 ä¿®æ¹appChangeTaskStatusæ¹æ³ |
| | | |
| | | å¨ç¶æåæ´æ¹æ³ä¸æ·»å åæ¶åå å¤çé»è¾ï¼ |
| | | |
| | | ```java |
| | | // 妿æ¯åæ¶ç¶æï¼ä¿ååæ¶åå |
| | | if (newStatus == TaskStatus.CANCELLED && StringUtils.isNotEmpty(request.getCancelReason())) { |
| | | sysTaskService.saveCancelInfo(taskId, request.getCancelReason()); |
| | | } |
| | | ``` |
| | | |
| | | ### 3.4 æå¡å±ä¿®æ¹ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java` |
| | | |
| | | æ·»å æ¥å£æ¹æ³ï¼ |
| | | |
| | | ```java |
| | | /** |
| | | * ä¿åä»»å¡åæ¶ä¿¡æ¯ï¼ä»
é转è¿ä»»å¡ï¼ |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @param cancelReason åæ¶åå ï¼æ°æ®åå
¸task_cancel_reasonçvalueï¼ |
| | | * @return ç»æ |
| | | */ |
| | | public int saveCancelInfo(Long taskId, String cancelReason); |
| | | ``` |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` |
| | | |
| | | å®ç°saveCancelInfoæ¹æ³ï¼ä¿ååæ¶åå ãåæ¶äººååæ¶æ¶é´ï¼ |
| | | |
| | | ```java |
| | | @Override |
| | | @Transactional |
| | | public int saveCancelInfo(Long taskId, String cancelReason) { |
| | | // è·åä»»å¡ä¿¡æ¯ |
| | | SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (task == null) { |
| | | throw new RuntimeException("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | // åªæè½¬è¿ä»»å¡æä¿ååæ¶ä¿¡æ¯ |
| | | if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) { |
| | | return 0; |
| | | } |
| | | |
| | | // è·å转è¿ä»»å¡æ©å±ä¿¡æ¯ |
| | | SysTaskEmergency emergency = sysEmergencyTaskService.selectSysTaskEmergencyByTaskId(taskId); |
| | | if (emergency == null) { |
| | | return 0; |
| | | } |
| | | |
| | | // è®¾ç½®åæ¶ä¿¡æ¯ |
| | | emergency.setCancelReason(cancelReason); |
| | | emergency.setCancelBy(SecurityUtils.getUsername()); |
| | | emergency.setCancelTime(DateUtils.getNowDate()); |
| | | emergency.setUpdateBy(SecurityUtils.getUsername()); |
| | | emergency.setUpdateTime(DateUtils.getNowDate()); |
| | | |
| | | // æ´æ°æ°æ®åº |
| | | return sysTaskEmergencyMapper.updateSysTaskEmergency(emergency); |
| | | } |
| | | ``` |
| | | |
| | | ## åãåç«¯ä¿®æ¹ |
| | | |
| | | ### 4.1 ä»»å¡è¯¦æ
é¡µä¿®æ¹ |
| | | |
| | | **æä»¶**: `app/pagesTask/detail.vue` |
| | | |
| | | #### 4.1.1 data䏿·»å åæ®µ |
| | | |
| | | ```javascript |
| | | data() { |
| | | return { |
| | | taskDetail: null, |
| | | taskId: null, |
| | | paymentInfo: null, |
| | | cancelReasonList: [], // åæ¶åå å表 |
| | | showCancelDialog: false, // æ¾ç¤ºåæ¶åå å¯¹è¯æ¡ |
| | | selectedCancelReason: '' // éä¸çåæ¶åå |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 4.1.2 onLoadä¸å è½½åå
¸ |
| | | |
| | | ```javascript |
| | | onLoad(options) { |
| | | this.taskId = options.id |
| | | this.loadTaskDetail() |
| | | this.loadCancelReasonDict() // å è½½åæ¶åå åå
¸ |
| | | } |
| | | ``` |
| | | |
| | | #### 4.1.3 ä¿®æ¹åæ¶æé®å¤çé»è¾ |
| | | |
| | | ```javascript |
| | | case 'cancel': |
| | | // åæ¶ -> æ¾ç¤ºåæ¶åå éæ©å¯¹è¯æ¡ |
| | | this.showCancelReasonDialog(); |
| | | break; |
| | | ``` |
| | | |
| | | #### 4.1.4 æ·»å æ¹æ³ |
| | | |
| | | - `loadCancelReasonDict()` - ä»å端å è½½åæ¶åå åå
¸ |
| | | - `showCancelReasonDialog()` - æ¾ç¤ºåæ¶åå éæ©å¼¹çª |
| | | - `confirmCancelTask()` - ç¡®è®¤åæ¶ä»»å¡ |
| | | - `closeCancelDialog()` - å
³éåæ¶å¼¹çª |
| | | - `selectCancelReason(e)` - 鿩忶åå |
| | | - `updateTaskStatusWithCancelReason()` - 另忶åå çç¶ææ´æ° |
| | | - `getCancelReasonLabel()` - æ ¹æ®valueè·ålabelæ¾ç¤º |
| | | |
| | | #### 4.1.5 ä¿®æ¹getLocationAndUpdateStatusæ¹æ³ |
| | | |
| | | æ·»å cancelReasonåæ°ï¼å¨ç¶ææ´æ°è¯·æ±ä¸ä¼ éåæ¶åå ï¼ |
| | | |
| | | ```javascript |
| | | // 妿æåæ¶åå ï¼æ·»å å°è¯·æ±æ°æ®ä¸ |
| | | if (cancelReason) { |
| | | statusData.cancelReason = cancelReason |
| | | } |
| | | ``` |
| | | |
| | | #### 4.1.6 æ·»å UIç»ä»¶ |
| | | |
| | | **åæ¶åå 鿩弹çª**ï¼ |
| | | |
| | | ```vue |
| | | <uni-popup ref="cancelPopup" type="center" :is-mask-click="false"> |
| | | <view class="cancel-dialog"> |
| | | <view class="dialog-title">è¯·éæ©åæ¶åå </view> |
| | | <picker mode="selector" :range="cancelReasonList" range-key="label" @change="selectCancelReason"> |
| | | <view class="reason-picker"> |
| | | <view class="picker-label">åæ¶åå </view> |
| | | <view class="picker-value"> |
| | | {{ selectedCancelReason ? cancelReasonList.find(r => r.value === selectedCancelReason)?.label : 'è¯·éæ©' }} |
| | | </view> |
| | | <uni-icons type="arrowright" size="16"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | <view class="dialog-buttons"> |
| | | <button class="cancel-btn" @click="closeCancelDialog">åæ¶</button> |
| | | <button class="confirm-btn" @click="confirmCancelTask">ç¡®å®</button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | ``` |
| | | |
| | | **åæ¶ä¿¡æ¯æ¾ç¤ºåºå**ï¼ä»
å¨ä»»å¡å·²åæ¶ä¸æåæ¶åå æ¶æ¾ç¤ºï¼ï¼ |
| | | |
| | | ```vue |
| | | <view class="detail-section" v-if="taskDetail.taskStatus === 'CANCELLED' && taskDetail.emergencyInfo && taskDetail.emergencyInfo.cancelReason"> |
| | | <view class="section-title">åæ¶ä¿¡æ¯</view> |
| | | <view class="info-item"> |
| | | <view class="label">åæ¶åå </view> |
| | | <view class="value">{{ getCancelReasonLabel(taskDetail.emergencyInfo.cancelReason) }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="taskDetail.emergencyInfo.cancelBy"> |
| | | <view class="label">åæ¶äºº</view> |
| | | <view class="value">{{ taskDetail.emergencyInfo.cancelBy }}</view> |
| | | </view> |
| | | <view class="info-item" v-if="taskDetail.emergencyInfo.cancelTime"> |
| | | <view class="label">åæ¶æ¶é´</view> |
| | | <view class="value">{{ formatTime(taskDetail.emergencyInfo.cancelTime) }}</view> |
| | | </view> |
| | | </view> |
| | | ``` |
| | | |
| | | #### 4.1.7 æ·»å æ ·å¼ |
| | | |
| | | ä¸ºåæ¶åå å¼¹çªæ·»å æ ·å¼ï¼å
æ¬å¯¹è¯æ¡ãéæ©å¨åæé®æ ·å¼ã |
| | | |
| | | ## äºãä½¿ç¨æµç¨ |
| | | |
| | | ### 5.1 忶任塿µç¨ |
| | | |
| | | 1. ç¨æ·å¨ä»»å¡è¯¦æ
页ç¹å»"åæ¶"æé® |
| | | 2. ç³»ç»å¼¹åºåæ¶åå éæ©å¯¹è¯æ¡ |
| | | 3. ç¨æ·ä»26个é¢è®¾é项ä¸éæ©åæ¶åå |
| | | 4. ç¨æ·ç¹å»"ç¡®å®"æé® |
| | | 5. ç³»ç»è°ç¨ç¶ææ´æ°æ¥å£ï¼ä¼ éåæ¶åå |
| | | 6. å端ä¿ååæ¶åå ãåæ¶äººï¼å½åç¨æ·ï¼ååæ¶æ¶é´ï¼å½åæ¶é´ï¼ |
| | | 7. ä»»å¡ç¶æåæ´ä¸º"已忶" |
| | | |
| | | ### 5.2 æ¥çåæ¶ä¿¡æ¯ |
| | | |
| | | å¨ä»»å¡è¯¦æ
页ï¼å¦æä»»å¡ç¶æä¸º"已忶"ä¸è®°å½äºåæ¶åå ï¼ä¼å¨è´¹ç¨ä¿¡æ¯ä¸æ¹æ¾ç¤º"åæ¶ä¿¡æ¯"åºåï¼å
æ¬ï¼ |
| | | - åæ¶åå ï¼æ¾ç¤ºä¸ææ ç¾ï¼ |
| | | - åæ¶äºº |
| | | - åæ¶æ¶é´ |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | 1. **ä»
é转è¿ä»»å¡**ï¼åæ¶åå åè½ä»
对转è¿ä»»å¡ï¼EMERGENCY_TRANSFERï¼çæ |
| | | 2. **强å¶éæ©**ï¼åæ¶ä»»å¡æ¶å¿
须鿩忶åå ï¼å¦åæ æ³æäº¤ |
| | | 3. **èªå¨è®°å½**ï¼åæ¶äººååæ¶æ¶é´ç±ç³»ç»èªå¨è®°å½ï¼æ éç¨æ·è¾å
¥ |
| | | 4. **ä¸å¯ä¿®æ¹**ï¼åæ¶ä¿¡æ¯ä¸æ¦ä¿åä¸å¯ä¿®æ¹ |
| | | 5. **æ°æ®åå
¸ä¾èµ**ï¼éè¦å
æ§è¡æ°æ®åå
¸SQLèæ¬ï¼å¦ååç«¯æ æ³å è½½åæ¶åå å表 |
| | | |
| | | ## ä¸ãæä»¶æ¸
å |
| | | |
| | | ### SQLæä»¶ |
| | | - `sql/add_cancel_reason_fields.sql` - æ·»å æ°æ®åºå段 |
| | | - `sql/insert_dict_task_cancel_reason.sql` - æå
¥æ°æ®åå
¸ |
| | | |
| | | ### å端æä»¶ |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java` |
| | | - `ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml` |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java` |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` |
| | | - `ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java` |
| | | |
| | | ### å端æä»¶ |
| | | - `app/pagesTask/detail.vue` |
| | | |
| | | ## å
«ãæµè¯å»ºè®® |
| | | |
| | | 1. æµè¯åæ¶åå å¼¹çªæ¯å¦æ£å¸¸æ¾ç¤º |
| | | 2. æµè¯éæ©ä¸ååæ¶åå 忝妿£ç¡®ä¿å |
| | | 3. æµè¯æªéæ©åæ¶åå æ¶æ¯å¦é»æ¢æäº¤ |
| | | 4. æµè¯åæ¶ä¿¡æ¯æ¯å¦æ£ç¡®æ¾ç¤º |
| | | 5. æµè¯é转è¿ä»»å¡ç¹å»åæ¶æ¯å¦æ£å¸¸ï¼ä¸åºæ¾ç¤ºåæ¶åå å¼¹çªï¼ |
| | | 6. æµè¯å·²åæ¶ç任塿¯å¦æ£ç¡®æ¾ç¤ºåæ¶ä¿¡æ¯ |