feat: 添加一级需求审核指定成员完善明细功能

- 新增一级需求审核弹窗,支持指定部门成员完善任务明细
- 修改handleApproveTask函数,识别pending_primary_approval状态
- 添加handleApprovePrimaryTask和handlePrimaryApproveConfirm函数
- 新增primaryApproveModalVisible等状态变量
This commit is contained in:
Your Name 2026-01-19 23:37:14 +08:00
parent e50a659dd2
commit 17e87bb612

View File

@ -1869,6 +1869,79 @@
</div>
</a-modal>
<!-- 一级需求审核弹窗 -->
<a-modal
v-model:visible="primaryApproveModalVisible"
title="审核一级需求任务"
:width="500"
:confirm-loading="primaryApprovalLoading"
@ok="handlePrimaryApproveConfirm"
class="primary-approve-modal"
:body-style="{ padding: '24px', background: '#1f1f1f' }"
>
<div v-if="primaryApproveTaskData" class="primary-approve-content">
<!-- 任务信息 -->
<div class="task-info" style="margin-bottom: 20px; padding: 16px; background: #141414; border-radius: 8px;">
<div style="font-size: 16px; font-weight: 600; color: #fff; margin-bottom: 8px;">
{{ primaryApproveTaskData.title }}
</div>
<div style="display: flex; gap: 16px; flex-wrap: wrap; font-size: 13px; color: #888;">
<span>品牌: {{ primaryApproveTaskData.brandName }}</span>
<span>平台: {{ primaryApproveTaskData.platformName }}</span>
<span>积分: {{ primaryApproveTaskData.score }} 分</span>
</div>
<div style="margin-top: 8px; font-size: 13px; color: #888;">
一级部门发起人: {{ primaryApproveTaskData.primaryPublisherName || primaryApproveTaskData.publisherName }}
</div>
</div>
<!-- 指定完善人 -->
<div class="assign-completer" style="margin-bottom: 20px;">
<div style="font-weight: 600; color: #fff; margin-bottom: 12px;">
<span style="color: #ff4d4f;">*</span> 指定成员完善任务明细
</div>
<a-select
v-model:value="primaryApproveCompleterId"
placeholder="请选择部门成员"
style="width: 100%"
show-search
:filter-option="(input, option) => option.label.toLowerCase().includes(input.toLowerCase())"
>
<a-select-option
v-for="member in deptMembersList"
:key="member.id"
:value="member.id"
:label="member.realName"
>
<div style="display: flex; justify-content: space-between; align-items: center;">
<span>{{ member.realName }}</span>
<span style="color: #888; font-size: 12px;">{{ member.username }}</span>
</div>
</a-select-option>
</a-select>
</div>
<!-- 审核备注 -->
<div class="approve-comment">
<div style="font-weight: 600; color: #fff; margin-bottom: 12px;">审核备注(可选)</div>
<a-textarea
v-model:value="primaryApproveComment"
placeholder="请输入审核备注"
:rows="3"
style="width: 100%"
/>
</div>
<!-- 提示信息 -->
<div style="margin-top: 16px; padding: 12px; background: #262626; border-radius: 8px; border-left: 3px solid #1890ff;">
<div style="color: #1890ff; font-size: 13px;">
<Icon name="info" size="sm" style="margin-right: 6px;" />
审核通过后,指定的成员将收到通知,需要完善任务明细后才能正式发布任务。
</div>
</div>
</div>
</a-modal>
<!-- 任务详情抽屉 -->
<a-drawer
v-model:visible="detailDrawerVisible"
@ -3573,6 +3646,14 @@ const newTaskTypePath = ref<(string | number)[] | undefined>(undefined)
const preAssignedDesignerName = ref<string>('') // 预先指定的设计师姓名
const preAssignedDesignersList = ref<Array<{typeName: string, designerName: string, quantity: number}>>([]) // 多个预先指定的设计师列表
// 一级需求审核弹窗状态
const primaryApproveModalVisible = ref(false)
const primaryApproveTaskData = ref<Task | null>(null)
const primaryApproveCompleterId = ref<number | undefined>(undefined)
const primaryApproveComment = ref('')
const deptMembersList = ref<Array<{id: number, realName: string, username: string}>>([])
const primaryApprovalLoading = ref(false)
// 判断任务是否已预先指定设计师
const isTaskPreAssigned = computed(() => {
if (!approveTaskData.value) return false
@ -5221,6 +5302,12 @@ const handleApproveTask = (task: Task) => {
return
}
// 如果是一级需求部门任务审核,需要指定成员完善明细
if (task.approvalStatus === 'pending_primary_approval') {
handleApprovePrimaryTask(task)
return
}
// 需求部门负责人审核,直接通过即可
Modal.confirm({
title: '审核通过',
@ -5244,6 +5331,64 @@ const handleApproveTask = (task: Task) => {
})
}
// 处理一级需求部门任务审核(指定成员完善明细)
const handleApprovePrimaryTask = async (task: Task) => {
try {
// 获取当前用户所在部门的成员列表
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const deptId = userInfo.deptId
if (!deptId) {
message.error('无法获取部门信息')
return
}
// 获取部门成员
const response = await userApi.getUserList(1, 100, undefined, deptId, 1)
deptMembersList.value = (response.records || []).map(u => ({
id: u.id!,
realName: u.realName || u.username,
username: u.username
}))
primaryApproveTaskData.value = task
primaryApproveCompleterId.value = undefined
primaryApproveComment.value = ''
primaryApproveModalVisible.value = true
} catch (error: any) {
message.error('获取部门成员失败:' + (error.msg || error.message))
}
}
// 确认一级需求审核
const handlePrimaryApproveConfirm = async () => {
if (!primaryApproveTaskData.value) return
if (!primaryApproveCompleterId.value) {
message.error('请选择完善明细的成员')
return
}
try {
primaryApprovalLoading.value = true
await taskApi.approvePrimaryTask(
primaryApproveTaskData.value.id!,
primaryApproveCompleterId.value,
primaryApproveComment.value || '审核通过,请完善任务明细'
)
message.success('审核通过,已指派成员完善明细')
primaryApproveModalVisible.value = false
loadReviewTasks()
loadAllTabCounts()
loadDashboardStats()
} catch (error: any) {
message.error(error.msg || error.message || '审核失败')
} finally {
primaryApprovalLoading.value = false
}
}
// 驳回任务(使用两级审核流程)
const handleRejectTask = (task: Task) => {
let reason = ''