feat: enhance home aggregate, review atomicity, local eligibility and match engine (phase 04-07)
This commit is contained in:
@@ -32,7 +32,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-if="canProcess" type="primary" link @click="handleClaim(row)">领取审核</el-button>
|
||||
<el-button v-if="canClaim(row)" type="primary" link @click="handleClaim(row)">领取审核</el-button>
|
||||
<span v-else class="muted">只读</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -85,7 +85,24 @@
|
||||
</el-descriptions>
|
||||
<el-empty v-else description="暂无资料快照" />
|
||||
|
||||
<template v-if="canProcess">
|
||||
<template v-if="currentTask.reviewType === 'local_eligibility'">
|
||||
<h3 class="drawer-heading">本地资格佐证</h3>
|
||||
<el-alert title="佐证属于敏感数据,仅在审核必要时查看;每次访问都会记录目的和结果。" type="warning" :closable="false" show-icon />
|
||||
<el-table :data="currentTask.localEligibilityEvidences || []" class="evidence-table">
|
||||
<el-table-column prop="evidenceType" label="佐证类型" min-width="140" />
|
||||
<el-table-column prop="createdAt" label="上传时间" min-width="170">
|
||||
<template #default="{ row }">{{ formatTime(row.createdAt) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="100">
|
||||
<template #default="{ row }">
|
||||
<el-button v-if="canViewEvidence" link type="primary" @click="viewEvidence(row)">查看</el-button>
|
||||
<span v-else class="muted">无权限</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
<template v-if="canProcessCurrent">
|
||||
<h3 class="drawer-heading">审核操作</h3>
|
||||
<el-form label-position="top">
|
||||
<el-form-item label="审核意见">
|
||||
@@ -98,7 +115,7 @@
|
||||
</el-form-item>
|
||||
<div class="review-actions">
|
||||
<el-button type="success" :loading="submitting" @click="runDecision('approve', '审核通过')">通过</el-button>
|
||||
<el-button type="warning" :loading="submitting" @click="runDecision('need-edit', '退回修改')">需修改</el-button>
|
||||
<el-button type="warning" :loading="submitting" @click="runDecision('need-edit', currentTask.reviewType === 'local_eligibility' ? '要求补充佐证' : '退回修改')">{{ currentTask.reviewType === 'local_eligibility' ? '补充佐证' : '需修改' }}</el-button>
|
||||
<el-button type="danger" :loading="submitting" @click="runDecision('reject', '拒绝资料')">拒绝</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
@@ -127,6 +144,16 @@ const currentTask = ref<any>(null)
|
||||
const reasonOptions = ref<any[]>([])
|
||||
const reviewForm = ref({ comment: '', reasonCodes: [] as string[] })
|
||||
const canProcess = computed(() => authStore.permissions.includes('review.process'))
|
||||
const canViewEvidence = computed(() => authStore.permissions.includes('local_eligibility.evidence.view'))
|
||||
const canProcessCurrent = computed(() => currentTask.value?.reviewType === 'local_eligibility'
|
||||
? authStore.permissions.includes('local_eligibility.review')
|
||||
: canProcess.value)
|
||||
|
||||
function canClaim(task: any) {
|
||||
return task.reviewType === 'local_eligibility'
|
||||
? authStore.permissions.includes('local_eligibility.review')
|
||||
: canProcess.value
|
||||
}
|
||||
const pendingTasks = computed(() => tasks.value.filter((task) => !task.assignedOperatorId))
|
||||
const myTasks = computed(() => tasks.value.filter((task) => task.assignedOperatorId === authStore.operator?.operatorId))
|
||||
|
||||
@@ -196,7 +223,13 @@ async function runDecision(action: 'approve' | 'need-edit' | 'reject', label: st
|
||||
}
|
||||
submitting.value = true
|
||||
try {
|
||||
const response: any = await post(`/operator/reviews/${currentTask.value.taskId}/${action}`, {
|
||||
const localActions = {
|
||||
approve: 'approve-local-eligibility',
|
||||
'need-edit': 'need-evidence',
|
||||
reject: 'reject-local-eligibility',
|
||||
}
|
||||
const endpointAction = currentTask.value.reviewType === 'local_eligibility' ? localActions[action] : action
|
||||
const response: any = await post(`/operator/reviews/${currentTask.value.taskId}/${endpointAction}`, {
|
||||
comment: reviewForm.value.comment,
|
||||
reasonCodes: reviewForm.value.reasonCodes,
|
||||
})
|
||||
@@ -211,6 +244,22 @@ async function runDecision(action: 'approve' | 'need-edit' | 'reject', label: st
|
||||
}
|
||||
}
|
||||
|
||||
async function viewEvidence(row: any) {
|
||||
if (!currentTask.value) return
|
||||
try {
|
||||
const { value: purpose } = await ElMessageBox.prompt('请填写本次查看佐证的业务目的', '敏感数据访问确认', {
|
||||
confirmButtonText: '记录并查看',
|
||||
cancelButtonText: '取消',
|
||||
inputPattern: /\S+/,
|
||||
inputErrorMessage: '访问目的不能为空',
|
||||
})
|
||||
const response: any = await post(`/operator/reviews/${currentTask.value.taskId}/evidences/${row.evidenceId}/access`, { purpose })
|
||||
window.open(response.data.url, '_blank', 'noopener,noreferrer')
|
||||
} catch (error: any) {
|
||||
if (error !== 'cancel' && error !== 'close') ElMessage.error(error.message || '佐证访问失败')
|
||||
}
|
||||
}
|
||||
|
||||
function reviewTypeText(value?: string) {
|
||||
return value ? ({ identity: '实名认证', profile: '婚恋资料', local_eligibility: '本地资格' }[value] || value) : '-'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user