diff --git a/src/api/project/acceptance/index.ts b/src/api/project/acceptance/index.ts index 2f912d261..2186d9edb 100644 --- a/src/api/project/acceptance/index.ts +++ b/src/api/project/acceptance/index.ts @@ -145,6 +145,21 @@ export const expertCheck = (data: AcceptanceAuditReqVO) => { return request.post({ url: '/project/acceptance/expert-check', data }) } +// 提交整改说明书(联络人) +export const submitRectifyManual = (acceptanceId: number) => { + return request.post({ url: '/project/acceptance/submit-rectify-manual?acceptanceId=' + acceptanceId }) +} + +// 重新提交终验材料(联络人) +export const submitExpertReupload = (acceptanceId: number) => { + return request.post({ url: '/project/acceptance/submit-expert-reupload?acceptanceId=' + acceptanceId }) +} + +// 提交会议评审结果 +export const submitMeetingResult = (data: any) => { + return request.post({ url: '/project/acceptance/submit-meeting-result', data }) +} + // 强制归档 export const forceArchive = (acceptanceId: number, reason: string) => { return request.post({ url: '/project/acceptance/force-archive', params: { acceptanceId, reason } }) diff --git a/src/api/project/acceptanceMeeting/index.ts b/src/api/project/acceptanceMeeting/index.ts index 75797623c..4bb3e64b7 100644 --- a/src/api/project/acceptanceMeeting/index.ts +++ b/src/api/project/acceptanceMeeting/index.ts @@ -28,14 +28,16 @@ export interface AcceptanceMeetingBatchCreateReqVO { // 批量录入会议结果请求 VO export interface AcceptanceMeetingBatchResultReqVO { meetingId: number - results: AcceptanceMeetingResultVO[] + signFileUrl: string + meetingOpinion?: string + projectResults: AcceptanceMeetingResultVO[] } -// 单个会议结果 VO +// 单个项目结论 VO export interface AcceptanceMeetingResultVO { acceptanceId: number result: string - opinion: string + opinion?: string } // ==================== 基础 CRUD ==================== diff --git a/src/views/project/acceptance/detail/index.vue b/src/views/project/acceptance/detail/index.vue index 4d6eb0e13..e89f04973 100644 --- a/src/views/project/acceptance/detail/index.vue +++ b/src/views/project/acceptance/detail/index.vue @@ -427,6 +427,7 @@ + - 初审通过,进入终验 + + + + + 上传整改说明书 + 提交整改说明供管理员审核 + + + + + + + 重新提交材料 + 专家驳回,需完善材料 + + @@ -636,10 +667,13 @@ const statusMap: Record = { '20': { label: '组长审核中', type: 'primary' }, '30': { label: '待终验申请', type: 'info' }, '40': { label: '管理员初审中', type: 'primary' }, // 对应 FINAL_ADMIN_REVIEW + '45': { label: '待组织会议', type: 'warning' }, // WAIT_ORGANIZE_MEETING '50': { label: '待会议评审', type: 'info' }, // WAIT_MEETING '60': { label: '待整改', type: 'danger' }, // FINAL_RECTIFY '61': { label: '整改审核中', type: 'warning' }, // FINAL_RECTIFY_REVIEW '62': { label: '待专家复核', type: 'warning' }, // WAIT_EXPERT_CHECK + '65': { label: '待上传整改说明书', type: 'warning' }, // WAIT_UPLOAD_RECTIFY + '66': { label: '待重新提交终验材料', type: 'danger' }, // WAIT_REUPLOAD_FINAL '98': { label: '已取消', type: 'info' }, '99': { label: '已归档', type: 'success' } } @@ -669,8 +703,8 @@ const getOpinionColor = (result: string) => { // 权限判断 const canUploadMaterial = computed(() => { const currentUserId = useUserStore().getUser.id - // 必须是联络人,且状态符合:待提交材料(05)、预验收整改(11)、待终验申请(30)、终验整改(60) - return projectInfo.value.liaisonUserId === currentUserId && ['05', '11', '30', '60'].includes(acceptance.value.status) + // 必须是联络人,且状态符合:待提交材料(05)、预验收待整改(11)、待终验申请(30)、终验待整改(60)、待上传整改说明书(65)、待重新提交终验材料(66) + return projectInfo.value.liaisonUserId === currentUserId && ['05', '11', '30', '60', '65', '66'].includes(acceptance.value.status) }) const canSubmitMaterial = computed(() => { @@ -688,8 +722,18 @@ const canSubmitFinal = computed(() => { return projectInfo.value.liaisonUserId === currentUserId && acceptance.value.status === '30' // WAIT_FINAL_APPLY }) +const canSubmitExpertReupload = computed(() => { + const currentUserId = useUserStore().getUser.id + return projectInfo.value.liaisonUserId === currentUserId && acceptance.value.status === '66' +}) + +const canSubmitRectifyManual = computed(() => { + const currentUserId = useUserStore().getUser.id + return projectInfo.value.liaisonUserId === currentUserId && acceptance.value.status === '65' +}) + const showActions = computed(() => { - return canSubmitMaterial.value || canSubmitRectify.value || canSubmitFinal.value || canAudit.value + return canSubmitMaterial.value || canSubmitRectify.value || canSubmitFinal.value || canAudit.value || canSubmitExpertReupload.value || canSubmitRectifyManual.value }) // 是否可以审核 (对口人初审: 10, 专家组长审核: 20, 管理员终验初审: 40) @@ -768,6 +812,23 @@ const handleAudit = async () => { if (status === '40') { // 管理员终验初审 await AcceptanceApi.auditFinalAdmin(auditData) + } else if (status === '61') { + // 整改审核 + await AcceptanceApi.auditRectify({ + ...auditData, + needExpert: false, // 简化版,实际可能需要弹窗选择 + targetExpertIds: [] + } as any) + } else if (status === '62') { + // 专家复核 + await AcceptanceApi.expertCheck(auditData) + } else if (status === '50') { + // 会议评审结果 + await AcceptanceApi.submitMeetingResult({ + acceptanceId: acceptance.value.id, + meetingResult: auditForm.value.result, + opinion: auditForm.value.opinion + }) } else { // 预验收审核(对口人初审10、组长审核20) await AcceptanceApi.auditPreAcceptance(auditData) @@ -781,6 +842,36 @@ const handleAudit = async () => { } } +/** 提交终验申请 */ +const handleSubmitFinal = async () => { + try { + await message.confirm('确定提交终验申请吗?') + await AcceptanceApi.submitFinalAcceptance({ acceptanceId: acceptance.value.id }) + message.success('终验申请提交成功') + await getDetail() + } catch {} +} + +/** 提交整改说明书 */ +const handleSubmitRectifyManual = async () => { + try { + await message.confirm('确定提交整改说明书吗?') + await AcceptanceApi.submitRectifyManual(acceptance.value.id) + message.success('整改说明书提交成功') + await getDetail() + } catch {} +} + +/** 重新提交终验材料 */ +const handleSubmitExpertReupload = async () => { + try { + await message.confirm('确定重新提交终验材料吗?') + await AcceptanceApi.submitExpertReupload(acceptance.value.id) + message.success('材料提交成功') + await getDetail() + } catch {} +} + /** 获取验收详情 */ const getDetail = async () => { loading.value = true diff --git a/src/views/project/acceptance/todo/index.vue b/src/views/project/acceptance/todo/index.vue index d6e4c87d9..a22a67e11 100644 --- a/src/views/project/acceptance/todo/index.vue +++ b/src/views/project/acceptance/todo/index.vue @@ -97,7 +97,7 @@ const handleProcess = (row: AcceptanceApi.AcceptanceTodoVO) => { router.push({ path: '/project/acceptance/detail/' + row.acceptanceId, query: { tab: 'info' } }) } // 材料提交类任务:跳转到详情页的材料tab - else if (['task_liaison_submit', 'task_pre_rectify', 'task_final_rectify', 'task_final_apply'].includes(taskType)) { + else if (['task_liaison_submit', 'task_pre_rectify', 'task_final_rectify', 'task_final_apply', 'task_lianluoren_upload_rectify', 'task_lianluoren_reupload_final_materies'].includes(taskType)) { router.push({ path: '/project/acceptance/detail/' + row.acceptanceId, query: { tab: 'materials' } }) } // 默认查看详情 diff --git a/src/views/project/acceptanceMeeting/BatchCreateForm.vue b/src/views/project/acceptanceMeeting/BatchCreateForm.vue index 256596136..eaa360b66 100644 --- a/src/views/project/acceptanceMeeting/BatchCreateForm.vue +++ b/src/views/project/acceptanceMeeting/BatchCreateForm.vue @@ -122,8 +122,8 @@ const uploadHeaders = { Authorization: 'Bearer ' + getAccessToken() } const open = async () => { dialogVisible.value = true resetForm() - // 加载验收列表(待会议状态的) - const result = await AcceptanceApi.getAcceptancePage({ pageNo: 1, pageSize: 100, status: '30' }) + // 加载验收列表(待组织会议状态的) + const result = await AcceptanceApi.getAcceptancePage({ pageNo: 1, pageSize: 100, status: '45' }) acceptanceList.value = result.list // 加载用户列表 userList.value = await UserApi.getSimpleUserList() diff --git a/src/views/project/acceptanceMeeting/BatchResultForm.vue b/src/views/project/acceptanceMeeting/BatchResultForm.vue index ae63d487d..1d61159db 100644 --- a/src/views/project/acceptanceMeeting/BatchResultForm.vue +++ b/src/views/project/acceptanceMeeting/BatchResultForm.vue @@ -14,24 +14,30 @@ /> 会议整体结论 - - - - - - - + + + 上传签字扫描件 + + + 查看文件 + + 各项目结果 - + @@ -59,6 +65,7 @@ +