feat(review-meeting): 项目列表操作改为下拉并补充议程分类

pull/874/head
Codewoc 2026-04-11 21:33:04 +08:00
parent 2566d1e311
commit f4c04a6c69
3 changed files with 76 additions and 5 deletions

View File

@ -25,7 +25,13 @@ export interface ReviewMeetingProjectRespVO {
aiSummaryUpdatedTime?: string aiSummaryUpdatedTime?: string
} }
export const REVIEW_AGENDA_CATEGORY_OPTIONS = ['项目申报论证', '预验收', '项目终验'] as const export const REVIEW_AGENDA_CATEGORY_OPTIONS = [
'项目申报论证',
'软件申购论证',
'软件报废论证',
'预验收',
'项目终验'
] as const
export type ReviewAgendaCategory = (typeof REVIEW_AGENDA_CATEGORY_OPTIONS)[number] export type ReviewAgendaCategory = (typeof REVIEW_AGENDA_CATEGORY_OPTIONS)[number]
export interface ReviewMeetingProjectSeqUpdateReqVO { export interface ReviewMeetingProjectSeqUpdateReqVO {

View File

@ -254,6 +254,20 @@ const PHASE_MAPPING: Record<string, Record<string, 'before' | 'after'>> = {
PROJECT_EXPERT_OPINION_SIGNED: 'after', PROJECT_EXPERT_OPINION_SIGNED: 'after',
PROJECT_RECTIFICATION_NOTICE: 'after' PROJECT_RECTIFICATION_NOTICE: 'after'
}, },
软件申购论证: {
PROJECT_ARGUMENT_DOC: 'before',
PROJECT_DEFENSE_PPT: 'before',
PROJECT_DRAFT_EXPERT_OPINION: 'before',
PROJECT_EXPERT_OPINION_SIGNED: 'after',
PROJECT_RECTIFICATION_NOTICE: 'after'
},
软件报废论证: {
PROJECT_ARGUMENT_DOC: 'before',
PROJECT_DEFENSE_PPT: 'before',
PROJECT_DRAFT_EXPERT_OPINION: 'before',
PROJECT_EXPERT_OPINION_SIGNED: 'after',
PROJECT_RECTIFICATION_NOTICE: 'after'
},
项目立项: { 项目立项: {
PROJECT_ARGUMENT_DOC: 'before', PROJECT_ARGUMENT_DOC: 'before',
PROJECT_DEFENSE_PPT: 'before', PROJECT_DEFENSE_PPT: 'before',

View File

@ -181,11 +181,18 @@
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="260" align="center" :fixed="useFixedActionColumn ? 'right' : false"> <el-table-column label="操作" width="150" align="center" :fixed="useFixedActionColumn ? 'right' : false">
<template #default="{ row }"> <template #default="{ row }">
<div class="op-group"> <div class="op-group compact">
<a class="op-link" @click="goToDetail(row)"></a> <el-dropdown trigger="click" @command="(command: string) => handleActionCommand(row, command)">
<a class="op-link op-danger" @click="handleDelete(row.id)"></a> <span class="op-dropdown-trigger">更多</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="upload">上传项目资料</el-dropdown-item>
<el-dropdown-item command="delete" class="danger-dropdown-item">删除</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -457,6 +464,16 @@ const handleDelete = async (id: number) => {
getList() getList()
} }
const handleActionCommand = (row: ReviewMeetingProjectRespVO, command: string) => {
if (command === 'upload') {
goToDetail(row)
return
}
if (command === 'delete') {
handleDelete(row.id)
}
}
const handleSelectionChange = (rows: ReviewMeetingProjectRespVO[]) => { const handleSelectionChange = (rows: ReviewMeetingProjectRespVO[]) => {
selectedRows.value = rows selectedRows.value = rows
} }
@ -799,6 +816,40 @@ onBeforeUnmount(() => {
justify-content: center; justify-content: center;
gap: 6px; gap: 6px;
} }
.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) { :deep(.review-table .el-table__header-wrapper th) {