From 9251c6406727a1c0d1e0ce1cdc656b1f78f55dba Mon Sep 17 00:00:00 2001 From: Codewoc <947380458@qq.com> Date: Tue, 31 Mar 2026 10:39:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(review-meeting):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=8E=92=E7=A8=8B=E4=B8=8E=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/review/meeting.ts | 5 +- src/api/review/project.ts | 21 ++ src/views/review/meeting/MeetingEdit.vue | 38 ++- src/views/review/meeting/MeetingForm.vue | 30 ++- src/views/review/meeting/ProjectList.vue | 223 +++++++++++++++--- src/views/review/meeting/projectReviewDate.ts | 29 +++ src/views/review/meeting/projectSchedule.ts | 55 +++++ 7 files changed, 348 insertions(+), 53 deletions(-) create mode 100644 src/views/review/meeting/projectReviewDate.ts create mode 100644 src/views/review/meeting/projectSchedule.ts diff --git a/src/api/review/meeting.ts b/src/api/review/meeting.ts index 271941415..d2325ee0f 100644 --- a/src/api/review/meeting.ts +++ b/src/api/review/meeting.ts @@ -10,12 +10,13 @@ import * as FileApi from '@/api/infra/file' export interface ReviewProjectItemVO { sourceProjectId?: number seqNo: number - startTime: string - endTime: string + startTime?: string + endTime?: string agendaCategory: string projectTitle: string reporter: string reporterUnit: string + reviewDate?: string } // 会议保存 VO(新增/编辑) diff --git a/src/api/review/project.ts b/src/api/review/project.ts index 203b453e8..fb669c037 100644 --- a/src/api/review/project.ts +++ b/src/api/review/project.ts @@ -33,6 +33,19 @@ export interface ReviewMeetingProjectSeqUpdateReqVO { seqNo: number } +export interface ReviewMeetingProjectResultBatchUpdateReqVO { + ids: number[] + reviewResult: 'PASS' | 'REJECT' +} + +export interface ReviewMeetingProjectTimeBatchUpdateReqVO { + items: Array<{ + id: number + startTime: string + endTime: string + }> +} + export interface ReviewMeetingProjectPageReqVO { pageNo?: number pageSize?: number @@ -141,6 +154,14 @@ export const updateReviewProject = (data: Partial) = export const updateReviewProjectSeqBatch = (data: ReviewMeetingProjectSeqUpdateReqVO[]) => request.put({ url: '/project/review-project/update-seq-batch', data }) +/** 批量更新评审结果 */ +export const updateReviewProjectResultBatch = (data: ReviewMeetingProjectResultBatchUpdateReqVO) => + request.put({ url: '/project/review-project/update-result-batch', data }) + +/** 批量更新评审项目起止时间 */ +export const updateReviewProjectTimeBatch = (data: ReviewMeetingProjectTimeBatchUpdateReqVO) => + request.put({ url: '/project/review-project/update-time-batch', data }) + /** 删除评审项目 */ export const deleteReviewProject = (ids: number[]) => request.delete({ url: '/project/review-project/delete', params: { ids: ids.join(',') } }) diff --git a/src/views/review/meeting/MeetingEdit.vue b/src/views/review/meeting/MeetingEdit.vue index d6aaa8270..f633a43c7 100644 --- a/src/views/review/meeting/MeetingEdit.vue +++ b/src/views/review/meeting/MeetingEdit.vue @@ -157,14 +157,17 @@ - 格式:序号、开始时间、结束时间、议程分类、项目标题、汇报人、报告人单位 + 格式:序号、议程分类、项目标题、汇报人、报告人单位
- - + + + @@ -205,6 +208,11 @@ import { getReviewProjectPage } from '@/api/review/project' import { getExpertUserList } from '@/api/system/user/index' import download from '@/utils/download' import ExpertSelectTable from './components/ExpertSelectTable.vue' +import { applyDefaultReviewDate } from './projectReviewDate' +import { + buildScheduledProjectItems, + DEFAULT_REVIEW_MEETING_INTERVAL_MINUTES +} from './projectSchedule' defineOptions({ name: 'ReviewMeetingEdit' }) @@ -288,7 +296,14 @@ const mapProjectItems = (projects: any[]): ReviewProjectItemVO[] => agendaCategory: item.agendaCategory, projectTitle: item.projectTitle, reporter: item.reporter, - reporterUnit: item.reporterUnit + reporterUnit: item.reporterUnit, + reviewDate: item.reviewDate + })) + +const resetProjectReviewDate = (projects: ReviewProjectItemVO[]): ReviewProjectItemVO[] => + (projects || []).map((item) => ({ + ...item, + reviewDate: undefined })) const loadDetail = async (id: number) => { @@ -349,7 +364,7 @@ const loadCopySource = async (id: number) => { formData.minutesAttachmentType = undefined formData.minutesAttachmentSize = undefined formData.expertIds = detail.expertIds || [] - formData.projects = mapProjectItems(projectData?.list ?? []) + formData.projects = resetProjectReviewDate(mapProjectItems(projectData?.list ?? [])) isProjectsModified.value = false if (detail.startTime && detail.endTime) { @@ -394,7 +409,8 @@ const handleExcelChange = async (uploadFile: UploadFile) => { formLoading.value = true try { const result = await importProjectsFromExcel(uploadFile.raw) - formData.projects = result as ReviewProjectItemVO[] + const projects = applyDefaultReviewDate(result as ReviewProjectItemVO[], formData.meetingTimeRange) + formData.projects = buildScheduledProjectItems(projects, formData.meetingTimeRange?.[0]) || projects isProjectsModified.value = true ElMessage.success(`成功解析 ${formData.projects.length} 个评审项目`) } catch { @@ -516,7 +532,15 @@ const submitForm = async () => { } formLoading.value = true try { - const submitData = { ...formData } + const projects = buildScheduledProjectItems( + applyDefaultReviewDate(formData.projects, formData.meetingTimeRange), + formData.meetingTimeRange?.[0], + DEFAULT_REVIEW_MEETING_INTERVAL_MINUTES + ) || applyDefaultReviewDate(formData.projects, formData.meetingTimeRange) + const submitData = { + ...formData, + projects + } if (isEdit.value && !isProjectsModified.value) { delete submitData.projects } diff --git a/src/views/review/meeting/MeetingForm.vue b/src/views/review/meeting/MeetingForm.vue index 3d96084de..37b634ddd 100644 --- a/src/views/review/meeting/MeetingForm.vue +++ b/src/views/review/meeting/MeetingForm.vue @@ -110,15 +110,18 @@ 导入验收申请 Excel 下载导入模板 - 格式:序号、开始时间、结束时间、议程分类、项目标题、汇报人、报告人单位 + 格式:序号、议程分类、项目标题、汇报人、报告人单位
- - + + + @@ -151,6 +154,11 @@ import { } from '@/api/review/meeting' import { getExpertUserList } from '@/api/system/user' import download from '@/utils/download' +import { applyDefaultReviewDate } from './projectReviewDate' +import { + buildScheduledProjectItems, + DEFAULT_REVIEW_MEETING_INTERVAL_MINUTES +} from './projectSchedule' defineOptions({ name: 'ReviewMeetingForm' }) const emit = defineEmits(['success']) @@ -257,7 +265,11 @@ const handleExcelChange = async (uploadFile: UploadFile) => { formLoading.value = true try { const result = await importProjectsFromExcel(uploadFile.raw) - formData.projects = ((result as any).data || result) as ReviewProjectItemVO[] + const projects = applyDefaultReviewDate( + ((result as any).data || result) as ReviewProjectItemVO[], + formData.meetingTimeRange + ) + formData.projects = buildScheduledProjectItems(projects, formData.meetingTimeRange?.[0]) || projects isProjectsModified.value = true ElMessage.success(`成功解析 ${formData.projects.length} 个评审项目`) } catch (e) { @@ -340,7 +352,15 @@ const submitForm = async () => { } formLoading.value = true try { - const submitData = { ...formData } + const projects = buildScheduledProjectItems( + applyDefaultReviewDate(formData.projects, formData.meetingTimeRange), + formData.meetingTimeRange?.[0], + DEFAULT_REVIEW_MEETING_INTERVAL_MINUTES + ) || applyDefaultReviewDate(formData.projects, formData.meetingTimeRange) + const submitData = { + ...formData, + projects + } if (formType.value === 'update' && !isProjectsModified.value) { delete submitData.projects } diff --git a/src/views/review/meeting/ProjectList.vue b/src/views/review/meeting/ProjectList.vue index 8b18bc96e..091ad53b8 100644 --- a/src/views/review/meeting/ProjectList.vue +++ b/src/views/review/meeting/ProjectList.vue @@ -38,6 +38,35 @@
+
+
+
+ 项目汇报时长 + + + +
+ + 批量通过 + +
+ 已选 {{ selectedRows.length }} 项 +
+