批量推送代码

This commit is contained in:
郭庆泰
2026-08-26 23:14:46 +08:00
parent 18f7e93d5b
commit 36528b6e0c
36 changed files with 933 additions and 779 deletions
+12 -34
View File
@@ -90,7 +90,7 @@
@selection-change="onSel"
>
<el-table-column type="selection" width="44" />
<el-table-column prop="projectNo" label="项目编号" width="140" fixed="left" />
<el-table-column prop="projectNo" label="项目编号" width="170" fixed="left" />
<el-table-column prop="projectName" label="项目名称" min-width="200" show-overflow-tooltip />
<el-table-column prop="totalSessions" label="总场次/总期数" width="100" align="center" />
<el-table-column prop="doneSessions" label="已执行" width="80" align="center" />
@@ -126,7 +126,7 @@
<template #default="{ row }"><div class="table-actions">
<div class="op-cell">
<el-link :underline="false" type="primary" @click="doCreateMeeting(row)">建会</el-link>
<el-link :underline="false" type="primary" @click="doAssign(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>
@@ -139,7 +139,6 @@
<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 command="exportExperts">导出报名专家</el-dropdown-item>
<el-dropdown-item v-if="canDelete" command="delete">删除项目</el-dropdown-item>
</el-dropdown-menu>
</template>
@@ -282,7 +281,6 @@ function onAction(cmd, row) {
else if (cmd === 'activate') openActivate(row)
else if (cmd === 'delAnn') openDeleteAnnouncement(row)
else if (cmd === 'rate') openSingleScore(row)
else if (cmd === 'exportExperts') exportExperts(row)
else if (cmd === 'delete') doDelete(row)
}
// 仅 admin 可见删除按钮 (前端 v-if, 后端 controller 再兜底 role 校验)
@@ -291,7 +289,9 @@ const canDelete = computed(() => {
return r === 'admin'
})
function doCreateMeeting(row) { router.push(`/manager/meetings/new?projectId=${row.projectId}`) }
function isFinishedRow(row) { return row.isFinished === '1' || row.isFinished === 1 }
function doAssign(row) {
if (isFinishedRow(row)) return ElMessage.warning('已结题项目不能分配')
// 跳转独立子页面 /manager/projects/assign?projectId=X
router.push({ path: '/manager/projects/assign', query: { projectId: row.projectId } })
}
@@ -358,33 +358,6 @@ function readQueryFromRoute() {
// 导出
function exportProjects() { ElMessage.info('导出项目功能开发中') }
function exportEval() { ElMessage.info('项目评价导出功能开发中') }
// 导出某项目的报名专家 (biz_execution_intent)
// 字段: 专家姓名 科室 医院 职称 报名时间 手机号
async function exportExperts(row) {
if (!row || !row.projectNo) { ElMessage.warning('缺少项目编号'); return }
try {
// 后端 BizExecutionIntent 参数没 @RequestBody, 必须走 URL query string
const res = await request({
url: '/business/executionIntent/export',
method: 'post',
params: { projectNo: row.projectNo },
responseType: 'blob'
})
const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
const url = window.URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = `报名专家_${row.projectNo}.xlsx`
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
ElMessage.success('导出成功')
} catch (e) {
const msg = e?.msg || e?.message || '导出失败'
ElMessage.error(msg)
}
}
// ========== 单行操作按钮 handlers(弹 5 个独立 dialog ==========
function openClose(row) {
@@ -527,15 +500,20 @@ function openAssign() {
ElMessage.warning('请先勾选项目')
return
}
// 已结题项目不能分配: 过滤掉已结题项, 并提示跳过数
const targets = selection.value.filter(r => !isFinishedRow(r))
if (!targets.length) return ElMessage.warning('所选项目均已结题, 不能分配')
const skipCount = selection.value.length - targets.length
// 跳转独立子页面 /manager/projects/assign, 单条 vs 批量通过 query 区分:
// 单条: ?projectId=X → 子页面 v-if 单条分支
// 批量: ?projectIds=1,2,3 → 子页面 v-else 批量分支
if (selection.value.length === 1) {
router.push({ path: '/manager/projects/assign', query: { projectId: selection.value[0].projectId } })
if (targets.length === 1) {
router.push({ path: '/manager/projects/assign', query: { projectId: targets[0].projectId } })
} else {
const ids = selection.value.map(r => r.projectId).join(',')
const ids = targets.map(r => r.projectId).join(',')
router.push({ path: '/manager/projects/assign', query: { projectIds: ids } })
}
if (skipCount > 0) ElMessage.warning(`已跳过 ${skipCount} 个已结题项目`)
}
function openBatch(kind) {
if (!selection.value.length) return ElMessage.warning('请先勾选项目')