refactor(doctor/submissions): 合并到 biz_project_plan + 删除 biz_submission 死代码

- /doctor/submissions 改走 biz_project_plan,与 /manager/plans 字段/组件/状态字典完全对齐
- BizProjectPlan 加 submitter_id (BIGINT) + submitter_name (LEFT JOIN 查询字段)
- mapper 改 LEFT JOIN biz_person + sys_user,COALESCE(bp.name, u.user_name) 兜底
- biz_person.user_id 加 UNIQUE 索引 (1:1 LEFT JOIN 无笛卡尔积)
- controller 加 doctor 角色自动过滤: list 按 submitter_id, add/edit 强制 submitter_id
- 删除 7 个 BizSubmission 死代码 (Controller/Service/Mapper/Domain/XML/Enum) + 1 utils
- 路由参数 :subId → :planId (路径名 submission 保留产品文案)
- 新增 migration_submission_to_projectPlan_2026_08_18.sql
This commit is contained in:
郭庆泰
2026-08-18 00:28:40 +08:00
parent b41cf77cac
commit c9fc6ebdb8
17 changed files with 245 additions and 562 deletions
+20 -33
View File
@@ -11,12 +11,12 @@
<el-row :gutter="12">
<el-col :span="12">
<el-form-item label="策划方案名称">
<el-input :model-value="display.title" readonly />
<el-input :model-value="display.planName" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目方向">
<el-input :model-value="display.direction" readonly />
<el-input :model-value="display.planDirectionTitle" readonly />
</el-form-item>
</el-col>
</el-row>
@@ -29,7 +29,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="项目类别">
<el-input :model-value="display.projectCategory" readonly />
<el-input :model-value="display.planCategory" readonly />
</el-form-item>
</el-col>
</el-row>
@@ -57,15 +57,18 @@
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<el-col :span="8">
<el-form-item label="状态">
<el-tag v-if="detail.status !== null && detail.status !== undefined && detail.status !== ''" :type="statusType(detail.status)" disable-transitions>
{{ statusLabel(detail.status) }}
</el-tag>
<audit-status-tag v-if="detail.status" :status="detail.status" />
<span v-else>-</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="投稿人">
<el-input :model-value="display.submitterName" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投稿时间">
<el-input :model-value="display.createTime" readonly />
</el-form-item>
@@ -86,6 +89,7 @@ import { ref, computed, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import request from '@/utils/request'
import AuditStatusTag from '@/components/AuditStatusTag.vue'
const route = useRoute()
const router = useRouter()
@@ -103,24 +107,13 @@ function fmtTime(t) {
try { return new Date(t).toLocaleString('zh-CN', { hour12: false }) } catch { return t }
}
// 状态 → el-tag 类型映射
const STATUS_TYPE_MAP = {
'待审核': 'warning',
'审核通过': 'success',
'已退回': 'danger',
'未结题': 'info',
'已结题': 'success'
}
function statusType(s) {
return STATUS_TYPE_MAP[s] || 'info'
}
const display = computed(() => ({
title: fmt(detail.value.title),
direction: fmt(detail.value.direction),
planName: fmt(detail.value.planName),
planDirectionTitle: fmt(detail.value.planDirectionTitle || detail.value.planDirection),
projectForm: fmt(detail.value.projectForm),
projectCategory: fmt(detail.value.projectCategory),
planCategory: fmt(detail.value.planCategory),
remark: fmt(detail.value.remark),
status: fmt(detail.value.status),
submitterName: fmt(detail.value.submitterName),
createTime: fmtTime(detail.value.createTime)
}))
@@ -131,15 +124,15 @@ function goBack() {
function downloadName() {
const url = detail.value.designFileUrl || ''
const last = url.split('/').pop()
return last || `submission-${detail.value.subId}`
return last || `submission-${detail.value.planId}`
}
async function load() {
const subId = route.params.subId
if (!subId) { ElMessage.warning('参数缺失'); goBack(); return }
const planId = route.params.planId
if (!planId) { ElMessage.warning('参数缺失'); goBack(); return }
loading.value = true
try {
const res = await request.get(`/business/submission/${subId}`)
const res = await request.get(`/business/projectPlan/${planId}`)
if (res?.code === 200) {
detail.value = res.data || {}
} else {
@@ -180,12 +173,6 @@ onMounted(load)
font-size: 14px;
word-break: break-all;
}
.remark-cell {
min-height: 110px;
line-height: 1.6;
padding: 12px 14px;
white-space: pre-wrap;
}
.readonly-form :deep(.el-link) { font-weight: 500; }
.detail-actions { margin-top: 16px; }