소스 검색

fix(web): disable unbound s8 operators in task actions

The assignee/verifier picker in S8TaskDetailPage now reads bindStatus
returned by master-data/employees, disables UNBOUND options, and tags
each option with a BOUND/UNBOUND chip so users see why an option is
unavailable before committing the task action.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
YY968XX 4 달 전
부모
커밋
95b140795b
1개의 변경된 파일27개의 추가작업 그리고 3개의 파일을 삭제
  1. 27 3
      Web/src/views/aidop/s8/exceptions/S8TaskDetailPage.vue

+ 27 - 3
Web/src/views/aidop/s8/exceptions/S8TaskDetailPage.vue

@@ -13,7 +13,7 @@ const detail = ref<Record<string, any> | null>(null);
 const timeline = ref<{ id: number; actionCode: string; actionLabel: string; operatorName?: string | null; actionRemark?: string | null; createdAt: string }[]>([]);
 const decisions = ref<S8DecisionRow[]>([]);
 const evidences = ref<S8EvidenceRow[]>([]);
-const employees = ref<{ id: number; name: string; empCode?: string }[]>([]);
+const employees = ref<{ id: number; name: string; empCode?: string; bindStatus?: 'BOUND' | 'UNBOUND'; sysUserName?: string | null }[]>([]);
 const dialogMode = ref('');
 const dialogVisible = ref(false);
 const submitting = ref(false);
@@ -276,12 +276,36 @@ onMounted(async () => {
 			<el-form label-width="100px">
 				<el-form-item v-if="dialogMode === 'claim' || dialogMode === 'transfer'" label="处理人" required>
 					<el-select v-model="actionForm.assigneeId" style="width: 100%" filterable clearable>
-						<el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id" />
+						<el-option
+							v-for="item in employees"
+							:key="item.id"
+							:label="item.name + (item.bindStatus === 'UNBOUND' ? '(未绑定账号)' : '')"
+							:value="item.id"
+							:disabled="item.bindStatus === 'UNBOUND'"
+						>
+							<div style="display:flex;justify-content:space-between;align-items:center;gap:8px">
+								<span>{{ item.name }} <span style="color:#999;font-size:12px">{{ item.empCode ? '(' + item.empCode + ')' : '' }}</span></span>
+								<el-tag v-if="item.bindStatus === 'UNBOUND'" size="small" type="warning">未绑定</el-tag>
+								<el-tag v-else-if="item.bindStatus === 'BOUND'" size="small" type="success">已绑定</el-tag>
+							</div>
+						</el-option>
 					</el-select>
 				</el-form-item>
 				<el-form-item v-if="dialogMode === 'submitVerification'" label="检验人" required>
 					<el-select v-model="actionForm.assigneeId" style="width: 100%" filterable clearable>
-						<el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id" />
+						<el-option
+							v-for="item in employees"
+							:key="item.id"
+							:label="item.name + (item.bindStatus === 'UNBOUND' ? '(未绑定账号)' : '')"
+							:value="item.id"
+							:disabled="item.bindStatus === 'UNBOUND'"
+						>
+							<div style="display:flex;justify-content:space-between;align-items:center;gap:8px">
+								<span>{{ item.name }} <span style="color:#999;font-size:12px">{{ item.empCode ? '(' + item.empCode + ')' : '' }}</span></span>
+								<el-tag v-if="item.bindStatus === 'UNBOUND'" size="small" type="warning">未绑定</el-tag>
+								<el-tag v-else-if="item.bindStatus === 'BOUND'" size="small" type="success">已绑定</el-tag>
+							</div>
+						</el-option>
 					</el-select>
 				</el-form-item>
 				<el-form-item