批量推送代码
This commit is contained in:
@@ -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('请先勾选项目')
|
||||
|
||||
Reference in New Issue
Block a user