From 5d75fcaea0a3774052b7484a4ffe755258502363 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 06 十二月 2025 20:49:11 +0800
Subject: [PATCH] fix:开始执行人员就绪按钮
---
app/pagesTask/detail.vue | 266 +++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 227 insertions(+), 39 deletions(-)
diff --git a/app/pagesTask/detail.vue b/app/pagesTask/detail.vue
index 277d825..c84acb7 100644
--- a/app/pagesTask/detail.vue
+++ b/app/pagesTask/detail.vue
@@ -59,6 +59,15 @@
>
{{ getUserTypeLabel(assignee.userType) }}
</view>
+ <view
+ class="ready-badge"
+ :class="{
+ 'ready': isAssigneeReady(assignee),
+ 'unready': !isAssigneeReady(assignee)
+ }"
+ >
+ {{ isAssigneeReady(assignee) ? '宸插氨缁�' : '鏈氨缁�' }}
+ </view>
</view>
</view>
</view>
@@ -362,18 +371,27 @@
>
淇敼
</button>
- <button
- class="action-btn primary"
- @click="handleTaskAction('depart')"
- >
- 鍑哄彂
- </button>
- <button
- class="action-btn cancel"
- @click="handleTaskAction('cancel')"
- >
- 鍙栨秷
- </button>
+ <template v-if="isCurrentUserAssignee()">
+ <button
+ v-if="showAssigneeReadyFeature() && isMultipleAssignees() && !isCurrentUserReady()"
+ class="action-btn primary"
+ @click="handleReadyAction()"
+ >
+ 灏辩华
+ </button>
+ <button
+ class="action-btn primary"
+ @click="handleDepartAction()"
+ >
+ 鍑哄彂
+ </button>
+ <button
+ class="action-btn cancel"
+ @click="handleTaskAction('cancel')"
+ >
+ 鍙栨秷
+ </button>
+ </template>
</template>
<!-- 鍑哄彂涓姸鎬�: 鏄剧ず缂栬緫銆佸凡鍒拌揪銆佸己鍒剁粨鏉� -->
@@ -384,18 +402,20 @@
>
淇敼
</button>
- <button
- class="action-btn primary"
- @click="handleTaskAction('arrive')"
- >
- 宸插埌杈�
- </button>
- <button
- class="action-btn cancel"
- @click="handleTaskAction('forceCancel')"
- >
- 寮哄埗缁撴潫
- </button>
+ <template v-if="isCurrentUserAssignee()">
+ <button
+ class="action-btn primary"
+ @click="handleTaskAction('arrive')"
+ >
+ 宸插埌杈�
+ </button>
+ <button
+ class="action-btn cancel"
+ @click="handleTaskAction('forceCancel')"
+ >
+ 寮哄埗缁撴潫
+ </button>
+ </template>
</template>
<!-- 宸插埌杈剧姸鎬�: 鏄剧ず缂栬緫銆佸凡杩旂▼ -->
@@ -406,12 +426,14 @@
>
淇敼
</button>
- <button
- class="action-btn primary"
- @click="handleTaskAction('return')"
- >
- 宸茶繑绋�
- </button>
+ <template v-if="isCurrentUserAssignee()">
+ <button
+ class="action-btn primary"
+ @click="handleTaskAction('return')"
+ >
+ 宸茶繑绋�
+ </button>
+ </template>
</template>
<!-- 杩旂▼涓姸鎬�: 鏄剧ず缂栬緫銆佸凡瀹屾垚 -->
@@ -422,12 +444,14 @@
>
淇敼
</button>
- <button
- class="action-btn primary"
- @click="handleTaskAction('complete')"
- >
- 宸插畬鎴�
- </button>
+ <template v-if="isCurrentUserAssignee()">
+ <button
+ class="action-btn primary"
+ @click="handleTaskAction('complete')"
+ >
+ 宸插畬鎴�
+ </button>
+ </template>
</template>
<!-- 宸插畬鎴�/宸插彇娑�: 涓嶆樉绀烘寜閽紝浣嗗鏋滄槸杞繍浠诲姟鍒欐樉绀虹粨绠楁寜閽� -->
@@ -445,12 +469,13 @@
</template>
<script>
- import { getTask, changeTaskStatus } from '@/api/task'
+ import { getTask, changeTaskStatus, setAssigneeReady } from '@/api/task'
import { checkVehicleActiveTasks } from '@/api/task'
import { getPaymentInfo } from '@/api/payment'
import { formatDateTime } from '@/utils/common'
import { validateTaskForDepart, validateTaskForSettlement, getTaskVehicleId, checkTaskCanDepart } from '@/utils/taskValidator'
import AttachmentUpload from './components/AttachmentUpload.vue'
+ import config from '@/config'
export default {
components: {
@@ -771,8 +796,7 @@
handleTaskAction(action) {
switch (action) {
case 'depart':
- // 鍑哄彂 -> 妫�鏌ヨ溅杈嗘槸鍚︽湁鍏朵粬姝e湪杩涜涓殑浠诲姟
- this.checkVehicleAndDepart();
+ this.ensureReadyThenDepart();
break;
case 'cancel':
@@ -1235,6 +1259,145 @@
// 闄勪欢鍒犻櫎鎴愬姛鍥炶皟
onAttachmentDeleted(attachmentId) {
console.log('闄勪欢鍒犻櫎鎴愬姛:', attachmentId)
+ },
+
+ // 鏄惁鏄剧ず鈥滃氨缁�濆姛鑳斤紙閰嶇疆寮�鍏筹級
+ showAssigneeReadyFeature() {
+ return !!(config && config.features && config.features.showAssigneeReadyButton)
+ },
+
+ // 褰撳墠鐢ㄦ埛鏄惁涓鸿鎵ц浜�
+ isAssigneeSelf(assignee) {
+ const userId = this.$store && this.$store.state && this.$store.state.user && this.$store.state.user.userId
+ return assignee && (assignee.userId === userId || assignee.oaUserId === userId)
+ },
+
+ // 鎵ц浜虹偣鍑烩�滃氨缁��
+ markAssigneeReady(assignee) {
+ if (!assignee || !this.taskDetail) {
+ this.$modal.showToast('鎵ц浜烘垨浠诲姟淇℃伅涓嶅瓨鍦�')
+ return
+ }
+ const userId = assignee.userId || assignee.oaUserId
+ if (!userId) {
+ this.$modal.showToast('鏃犳硶璇嗗埆鎵ц浜篒D')
+ return
+ }
+ this.$modal.showLoading && this.$modal.showLoading('鎻愪氦涓�...')
+ setAssigneeReady(this.taskId).then(() => {
+ this.$modal.hideLoading && this.$modal.hideLoading()
+ this.$modal.showToast('宸插氨缁�')
+ // 鍒锋柊浠诲姟璇︽儏
+ this.loadTaskDetail()
+ }).catch(err => {
+ this.$modal.hideLoading && this.$modal.hideLoading()
+ console.error('鏍囪灏辩华澶辫触:', err)
+ this.$modal.showToast('鏍囪灏辩华澶辫触')
+ })
+ },
+
+ // 鏄惁褰撳墠鐢ㄦ埛鏄换鍔℃墽琛屼汉
+ isCurrentUserAssignee() {
+ const userId = this.$store && this.$store.state && this.$store.state.user && this.$store.state.user.userId;
+ console.log("褰撳墠鐢ㄦ埛ID:", userId)
+ const list = (this.taskDetail && Array.isArray(this.taskDetail.assignees)) ? this.taskDetail.assignees : []
+ return list.some(a => a && (a.userId === userId || a.oaUserId === userId))
+ },
+
+ // 鏄惁澶氫汉鎵ц
+ isMultipleAssignees() {
+ const list = (this.taskDetail && Array.isArray(this.taskDetail.assignees)) ? this.taskDetail.assignees : []
+ return list.length > 1
+ },
+
+ // 鎵ц浜烘槸鍚﹀凡灏辩华
+ isAssigneeReady(assignee) {
+ if (!assignee) return false
+ return assignee.isReady === '1' || assignee.ready === true || assignee.readyStatus === 'READY' || assignee.readyFlag === 'Y'
+ },
+
+ // 鎵�鏈夋墽琛屼汉鏄惁宸插氨缁�
+ areAllAssigneesReady() {
+ const list = (this.taskDetail && Array.isArray(this.taskDetail.assignees)) ? this.taskDetail.assignees : []
+ if (list.length === 0) return false
+ return list.every(a => this.isAssigneeReady(a))
+ },
+
+ // 鑾峰彇褰撳墠鐢ㄦ埛瀵瑰簲鐨勬墽琛屼汉璁板綍
+ getCurrentUserAssignee() {
+ const userId = this.$store && this.$store.state && this.$store.state.user && this.$store.state.user.userId
+ console.log('userId', userId)
+ const list = (this.taskDetail && Array.isArray(this.taskDetail.assignees)) ? this.taskDetail.assignees : []
+ return list.find(a => a && (a.userId === userId || a.oaUserId === userId)) || null
+ },
+
+ // 鎿嶄綔鍖哄氨缁寜閽紙澶氫汉浠诲姟锛�
+ markCurrentAssigneeReady() {
+ const me = this.getCurrentUserAssignee()
+ if (!me) {
+ this.$modal.showToast('浠呬换鍔℃墽琛屼汉鍙搷浣�')
+ return
+ }
+ this.markAssigneeReady(me)
+ },
+
+ // 褰撳墠鐢ㄦ埛鏄惁宸插氨缁�
+ isCurrentUserReady() {
+ const me = this.getCurrentUserAssignee()
+ return me ? this.isAssigneeReady(me) : false
+ },
+
+ // 澶勭悊灏辩华鎸夐挳鐐瑰嚮
+ async handleReadyAction() {
+ const me = this.getCurrentUserAssignee()
+ if (!me) {
+ this.$modal.showToast('浠呬换鍔℃墽琛屼汉鍙搷浣�')
+ return
+ }
+ try {
+ await setAssigneeReady(this.taskId)
+ this.$modal.showToast('宸插氨缁�')
+ // 鍒锋柊浠诲姟璇︽儏
+ await this.loadTaskDetail()
+ } catch (err) {
+ console.error('鏍囪灏辩华澶辫触:', err)
+ this.$modal.showToast('鏍囪灏辩华澶辫触')
+ }
+ },
+
+ // 澶勭悊鍑哄彂鎸夐挳鐐瑰嚮
+ async handleDepartAction() {
+ if (!this.taskDetail) return
+
+ const list = (this.taskDetail && Array.isArray(this.taskDetail.assignees)) ? this.taskDetail.assignees : []
+
+ // 濡傛灉寮�鍚簡灏辩华鍔熻兘涓旀槸澶氫汉浠诲姟锛岄渶瑕佹鏌ユ墍鏈変汉鏄惁灏辩华
+ if (this.showAssigneeReadyFeature() && list.length > 1) {
+ if (!this.areAllAssigneesReady()) {
+ this.$modal.showToast('鍏朵粬浜烘湭灏辩华锛屾墍鏈変汉灏辩华鍚庢墠鑳藉嚭鍙�')
+ return
+ }
+ }
+
+ // 鍗曚汉浠诲姟鎴栨湭寮�鍚氨缁姛鑳斤細鑷姩鏍囪灏辩华
+ if (this.showAssigneeReadyFeature() && list.length === 1) {
+ const me = this.getCurrentUserAssignee()
+ if (me && !this.isAssigneeReady(me)) {
+ try {
+ await setAssigneeReady(this.taskId)
+ } catch (e) {
+ console.error('鑷姩灏辩华澶辫触:', e)
+ }
+ }
+ }
+
+ // 鎵ц鍑哄彂娴佺▼
+ this.checkVehicleAndDepart()
+ },
+
+ // 鍑哄彂鍓嶄繚璇佸氨缁紙淇濈暀鍚戝悗鍏煎锛�
+ async ensureReadyThenDepart() {
+ this.handleDepartAction()
}
}
}
@@ -1383,6 +1546,31 @@
background-color: #AF52DE;
}
}
+
+ .assignee-ready-btn {
+ margin-left: 12rpx;
+ padding: 8rpx 16rpx;
+ font-size: 24rpx;
+ border-radius: 6rpx;
+ background-color: #34C759;
+ color: #fff;
+ border: none;
+ }
+ .ready-badge {
+ display: inline-block;
+ margin-left: 12rpx;
+ padding: 4rpx 12rpx;
+ font-size: 22rpx;
+ border-radius: 6rpx;
+ &.ready {
+ background-color: #e6ffed;
+ color: #34C759;
+ }
+ &.unready {
+ background-color: #f0f0f0;
+ color: #999;
+ }
+ }
}
}
}
--
Gitblit v1.9.1