From 0b140a145ec0b9903a46468c088d833a1bb00507 Mon Sep 17 00:00:00 2001 From: Codewoc <947380458@qq.com> Date: Sat, 11 Apr 2026 17:08:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(review-meeting):=20=E4=BC=9A=E8=AE=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=93=8D=E4=BD=9C=E4=B8=8B=E6=8B=89=E5=8C=96?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E5=BC=B9=E7=AA=97=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E7=BA=AA=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/review/meeting/index.vue | 272 ++++++++++++++++++++++------- 1 file changed, 206 insertions(+), 66 deletions(-) diff --git a/src/views/review/meeting/index.vue b/src/views/review/meeting/index.vue index b84758edd..18117febb 100644 --- a/src/views/review/meeting/index.vue +++ b/src/views/review/meeting/index.vue @@ -91,84 +91,105 @@ @@ -189,6 +210,13 @@ + + () const pendingMinutesMeeting = ref() +const minutesPreviewVisible = ref(false) +const minutesPreviewMeetingId = ref(0) +const minutesPreviewFileName = ref('') const exportTaskMap = reactive>( {} ) @@ -356,11 +388,80 @@ const handleCopy = async (row: ReviewMeetingRespVO) => { }) } +type MeetingActionCommand = + | 'edit' + | 'view' + | 'sendSms' + | 'smsStatus' + | 'mailStatus' + | 'sendMail' + | 'previewMinutes' + | 'uploadMinutes' + | 'export' + | 'finish' + | 'cancel' + | 'copy' + +const handleActionCommand = async (row: ReviewMeetingRespVO, command: string) => { + const action = command as MeetingActionCommand + switch (action) { + case 'edit': + goToEdit(row.id) + break + case 'view': + goToEdit(row.id, 'view') + break + case 'sendSms': + await handleSendSms(row) + break + case 'smsStatus': + openSmsStatus(row) + break + case 'mailStatus': + openMailStatus(row) + break + case 'sendMail': + await handleSendMail(row) + break + case 'previewMinutes': + handlePreviewMinutes(row) + break + case 'uploadMinutes': + triggerUploadMinutes(row) + break + case 'export': + await handleExportMaterials(row) + break + case 'finish': + await handleFinish(row) + break + case 'cancel': + await handleCancel(row) + break + case 'copy': + await handleCopy(row) + break + default: + break + } +} + const triggerUploadMinutes = (row: ReviewMeetingRespVO) => { pendingMinutesMeeting.value = row minutesUploadInputRef.value?.click() } +const hasMinutesAttachment = (row: ReviewMeetingRespVO) => !!row.minutesAttachmentUrl + +const handlePreviewMinutes = (row: ReviewMeetingRespVO) => { + if (!hasMinutesAttachment(row)) { + return + } + minutesPreviewMeetingId.value = row.id + minutesPreviewFileName.value = row.minutesAttachmentName || '' + minutesPreviewVisible.value = true +} + const handleMinutesFileChange = async (event: Event) => { const input = event.target as HTMLInputElement const file = input.files?.[0] @@ -377,9 +478,14 @@ const handleMinutesFileChange = async (event: Event) => { return } try { - await uploadMinutesAttachment(pendingMinutesMeeting.value.id, file) + const meeting = pendingMinutesMeeting.value + const attachment = await uploadMinutesAttachment(meeting.id, file) + meeting.minutesAttachmentName = attachment.name + meeting.minutesAttachmentUrl = attachment.url + meeting.minutesAttachmentType = attachment.type + meeting.minutesAttachmentSize = attachment.size ElMessage.success('会议纪要上传成功,整改通知后台生成中') - getList() + await getList() } finally { input.value = '' pendingMinutesMeeting.value = undefined @@ -729,6 +835,40 @@ onBeforeUnmount(() => { .op-link.disabled:hover { color: #8a94a6; } +.op-group.compact { + gap: 0; +} +.op-dropdown-trigger { + display: inline-flex; + align-items: center; + gap: 5px; + color: #295abc; + font-size: 14px; + font-weight: 500; + line-height: 1; + cursor: pointer; + user-select: none; +} +.op-dropdown-trigger::after { + content: ''; + width: 6px; + height: 6px; + margin-top: -3px; + border-right: 1.5px solid currentColor; + border-bottom: 1.5px solid currentColor; + transform: rotate(45deg); +} +.op-dropdown-trigger:hover { + color: #1f4ca5; + text-decoration: underline; +} +:deep(.el-dropdown-menu__item.danger-dropdown-item) { + color: #d63b42; +} +:deep(.el-dropdown-menu__item.danger-dropdown-item:not(.is-disabled):focus) { + color: #c22e35; + background-color: rgba(252, 79, 84, 0.12); +} /* ── 表格样式 ── */ :deep(.review-table .el-table__header-wrapper th) {