提交所有代码

This commit is contained in:
郭庆泰
2026-08-31 19:01:00 +08:00
parent f4d8bc1463
commit a14d95288c
53 changed files with 1356 additions and 286 deletions
+32 -27
View File
@@ -1,6 +1,6 @@
<template>
<div class="page-card">
<div class="breadcrumb">首页 / 项目管理</div>
<div class="breadcrumb">首页 / {{ isLeader ? '项目列表' : '项目管理' }}</div>
<el-form inline :model="q" class="filter-form">
<el-form-item label="支持单位:">
@@ -63,13 +63,13 @@
<el-form-item>
<el-button type="primary" @click="load">查询</el-button>
<el-button @click="reset">重置</el-button>
<el-button @click="doExport">导出</el-button>
<el-button @click="doExportRating">项目评价导出</el-button>
<el-button v-if="!isLeader" @click="doExport">导出</el-button>
<el-button v-if="!isLeader" @click="doExportRating">项目评价导出</el-button>
<el-button v-if="isManager" @click="doExportSignupExpert">已报名专家导出</el-button>
</el-form-item>
</el-form>
<div class="toolbar">
<div v-if="!isLeader" class="toolbar">
<el-button class="action-btn" @click="openNewProject">新建项目</el-button>
<el-button @click="openAssign">项目分配</el-button>
<el-button @click="openBatch('score')">批量评分</el-button>
@@ -87,7 +87,7 @@
:main-cols="['projectNo', 'projectName']"
@selection-change="onSel"
>
<el-table-column type="selection" width="44" />
<el-table-column v-if="!isLeader" type="selection" width="44" />
<el-table-column prop="projectNo" label="项目编号" width="170" fixed="left" />
<el-table-column prop="projectName" label="项目名称" min-width="200" show-overflow-tooltip>
<template #default="{ row }">
@@ -139,27 +139,30 @@
</el-table-column>
<el-table-column prop="startTime" label="项目开始时间" width="170" align="center" :formatter="fmtDateTime" />
<el-table-column prop="endTime" label="项目结束时间" width="170" align="center" :formatter="fmtDateTime" />
<el-table-column label="操作" width="180" fixed="right">
<el-table-column label="操作" :width="isLeader ? 80 : 180" fixed="right">
<template #default="{ row }"><div class="table-actions">
<div class="op-cell">
<el-link v-if="!isFinishedRow(row)" :underline="false" type="primary" @click="doCreateMeeting(row)">建会</el-link>
<el-link :underline="false" type="primary" :disabled="isFinishedRow(row)" @click="doAssign(row)">分配</el-link>
<el-dropdown trigger="hover" @command="(cmd) => onAction(cmd, row)">
<el-link :underline="false" type="primary" class="op-dropdown">
更多<el-icon class="op-caret"><ArrowDown /></el-icon>
</el-link>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-if="row.isFinished !== '1' && row.isFinished !== 1" command="close">结题</el-dropdown-item>
<el-dropdown-item command="view">查看</el-dropdown-item>
<el-dropdown-item command="edit">编辑</el-dropdown-item>
<el-dropdown-item command="activate">开通</el-dropdown-item>
<el-dropdown-item command="delAnn">删除公告</el-dropdown-item>
<el-dropdown-item command="rate">执行单位评分</el-dropdown-item>
<el-dropdown-item v-if="canDelete" command="delete">删除项目</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<el-link v-if="isLeader" :underline="false" type="primary" @click="viewDetail(row)">查看</el-link>
<template v-else>
<el-link v-if="!isFinishedRow(row)" :underline="false" type="primary" @click="doCreateMeeting(row)">建会</el-link>
<el-link :underline="false" type="primary" :disabled="isFinishedRow(row)" @click="doAssign(row)">分配</el-link>
<el-dropdown trigger="hover" @command="(cmd) => onAction(cmd, row)">
<el-link :underline="false" type="primary" class="op-dropdown">
更多<el-icon class="op-caret"><ArrowDown /></el-icon>
</el-link>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-if="row.isFinished !== '1' && row.isFinished !== 1" command="close">结题</el-dropdown-item>
<el-dropdown-item command="view">查看</el-dropdown-item>
<el-dropdown-item command="edit">编辑</el-dropdown-item>
<el-dropdown-item command="activate">开通</el-dropdown-item>
<el-dropdown-item command="delAnn">删除公告</el-dropdown-item>
<el-dropdown-item command="rate">执行单位评分</el-dropdown-item>
<el-dropdown-item v-if="canDelete" command="delete">删除项目</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</div>
</div></template>
</el-table-column>
@@ -394,6 +397,8 @@ function readQueryFromRoute() {
// 仅 manager 可见「已报名专家导出」 (前端 v-if, 后端 controller 再兜底 role 校验)
const isManager = computed(() => userStore.role === 'manager')
// 项目负责人(leader): 只读, 复用本列表页 (数据由后端 list 按 lead_user_id 隔离), 隐藏所有写操作
const isLeader = computed(() => userStore.role === 'leader')
// ========== 导出 (跟随当前筛选, 与 load() 同一口径) ==========
function buildExportParams() {
@@ -543,15 +548,15 @@ async function confirmSingleScore() {
}
}
function viewDetail(row) {
// admin 复用本列表页, 详情须跳到 /admin/projects/detail (否则被 beforeEach 角色守卫拦截)
const base = userStore.role === 'admin' ? '/admin' : '/manager'
// admin/leader 复用本列表页, 详情须跳到各自前缀 (否则被 beforeEach 角色守卫拦截)
const base = userStore.role === 'admin' ? '/admin' : userStore.role === 'leader' ? '/leader' : '/manager'
router.push(`${base}/projects/detail/${row.projectId}`)
}
// 点击「总场次/已执行/未执行」列 → 跳对应角色的会议列表, 按项目 + 阶段筛选 (会议列表后端按 role 隔离数据权限)
// scope: 'all'(全部) | 'done'(已执行) | 'todo'(未执行)
function goMeetings(row, scope) {
const base = userStore.role === 'admin' ? '/admin' : '/manager'
const base = userStore.role === 'admin' ? '/admin' : userStore.role === 'leader' ? '/leader' : '/manager'
const q = { projectId: row.projectId }
if (scope === 'done') q.currentStageNotIn = 'NOT_STARTED,IN_PROGRESS'
if (scope === 'todo') q.currentStage = 'NOT_STARTED'