From 67be5345ade7c10271e8bd202cae293f475e9995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=BA=86=E6=B3=B0?= <12369755+htcloud1@user.noreply.gitee.com> Date: Tue, 18 Aug 2026 00:51:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(submissions):=20=E6=96=B9=E6=A1=88A=20?= =?UTF-8?q?=E2=80=94=20mapper=20submitter=5Fname=20+=20=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=AF=B9=E9=BD=90=20+=20=E7=B4=A7=E6=80=A5?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mapper: selectFields 加 COALESCE(bp.name, u.user_name), LEFT JOIN biz_person (uk_person_user_id 防笛卡尔积) - mapper: insert 补 7 字段 (plan_name/plan_direction/plan_category/project_form/design_file_url/is_settled/project_no), plan_name NOT NULL 缺默认 - SQL: 紧急迁移脚本 add submitter_id + idx + biz_person UNIQUE (ALTER, 不 DROP) - SubmissionNew: page-card + breadcrumb + max-width 1200px, accept=.pdf/.png/.jpg/.jpeg, __silentError 防双 toast - SubmissionNew: el-upload drag 模式 A (对齐 Meetings.vue, 删 design-uploader 自定义 CSS) - SubmissionDetail: 删状态/投稿人/投稿时间/审计, 改 Preview 组件展示设计文件 --- .../mapper/business/BizProjectPlanMapper.xml | 14 ++ .../migration_add_submitter_id_2026_08_18.sql | 31 ++++ ry-vue3/src/views/doctor/SubmissionDetail.vue | 56 ++---- ry-vue3/src/views/doctor/SubmissionNew.vue | 168 ++++++++---------- 4 files changed, 137 insertions(+), 132 deletions(-) create mode 100644 ry-api/sql/migration_add_submitter_id_2026_08_18.sql diff --git a/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectPlanMapper.xml b/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectPlanMapper.xml index d736067..32fbabb 100644 --- a/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectPlanMapper.xml +++ b/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectPlanMapper.xml @@ -56,15 +56,29 @@ insert into biz_project_plan plan_id, + plan_name, + plan_direction, plan_direction_id, + plan_category, + project_form, + design_file_url, status, + is_settled, + project_no, remark, submitter_id, #{planId}, + #{planName}, + #{planDirection}, #{planDirectionId}, + #{planCategory}, + #{projectForm}, + #{designFileUrl}, #{status}, + #{isSettled}, + #{projectNo}, #{remark}, #{submitterId}, diff --git a/ry-api/sql/migration_add_submitter_id_2026_08_18.sql b/ry-api/sql/migration_add_submitter_id_2026_08_18.sql new file mode 100644 index 0000000..dcdbeb4 --- /dev/null +++ b/ry-api/sql/migration_add_submitter_id_2026_08_18.sql @@ -0,0 +1,31 @@ +-- ============================================================ +-- 紧急修复: 医生首页报 Unknown column 'p.submitter_id' +-- 时间: 2026-08-18 +-- 说明: +-- biz_project_plan 加 submitter_id 列 + 索引 (代码已先行, DB 跟上) +-- biz_person.user_id 加 UNIQUE (LEFT JOIN 1:1 保证, 避免笛卡尔积) +-- ⚠️ 不 DROP 任何表 (DROP 走单独决策) +-- ============================================================ + +USE guoju0808; + +-- ALTER 1: 给 biz_project_plan 加投稿人字段 +ALTER TABLE biz_project_plan + ADD COLUMN submitter_id BIGINT NULL COMMENT '投稿人用户ID (医生侧投稿归属, 经理/admin 录入为 NULL)'; + +-- ALTER 2: 给 submitter_id 加索引 (加速 WHERE 过滤) +CREATE INDEX idx_plan_submitter ON biz_project_plan(submitter_id); + +-- ALTER 3: biz_person.user_id 加 UNIQUE (1:1 LEFT JOIN 无笛卡尔积) +-- 当前 dump 已确认 biz_person.user_id 无重复 (12 条数据, user_id 非空 2 条且 user_id=106/107 各一条) +ALTER TABLE biz_person + ADD UNIQUE KEY uk_person_user_id (user_id); + +-- 验证 +SELECT 'biz_project_plan.submitter_id' AS check_item, COUNT(*) AS col_exists +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA='guoju0808' AND TABLE_NAME='biz_project_plan' AND COLUMN_NAME='submitter_id'; + +SELECT 'biz_person.uk_person_user_id' AS check_item, COUNT(*) AS idx_exists +FROM information_schema.STATISTICS +WHERE TABLE_SCHEMA='guoju0808' AND TABLE_NAME='biz_person' AND INDEX_NAME='uk_person_user_id'; \ No newline at end of file diff --git a/ry-vue3/src/views/doctor/SubmissionDetail.vue b/ry-vue3/src/views/doctor/SubmissionDetail.vue index 4fa602e..c04568b 100644 --- a/ry-vue3/src/views/doctor/SubmissionDetail.vue +++ b/ry-vue3/src/views/doctor/SubmissionDetail.vue @@ -39,8 +39,7 @@
-
@@ -55,25 +54,6 @@
- - - - - - - - - - - - - - - - - - - - @@ -81,6 +61,9 @@
返回
+ + + @@ -89,7 +72,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' +import Preview from '@/components/Preview.vue' const route = useRoute() const router = useRouter() @@ -97,42 +80,41 @@ const router = useRouter() const loading = ref(false) const detail = ref({}) -// 显示用: 空值显示 "-", 时间格式化 +const previewOpen = ref(false) +const previewUrl = ref('') +const previewTitle = ref('设计文件') + +function openPreview(url, title) { + if (!url) { ElMessage.warning('暂无附件'); return } + previewUrl.value = url + previewTitle.value = title || '设计文件' + previewOpen.value = true +} + +// 显示用: 空值显示 "-" function fmt(v) { if (v === null || v === undefined || v === '') return '-' return v } -function fmtTime(t) { - if (!t) return '-' - try { return new Date(t).toLocaleString('zh-CN', { hour12: false }) } catch { return t } -} const display = computed(() => ({ planName: fmt(detail.value.planName), planDirectionTitle: fmt(detail.value.planDirectionTitle || detail.value.planDirection), projectForm: fmt(detail.value.projectForm), planCategory: fmt(detail.value.planCategory), - remark: fmt(detail.value.remark), - submitterName: fmt(detail.value.submitterName), - createTime: fmtTime(detail.value.createTime) + remark: fmt(detail.value.remark) })) function goBack() { router.push({ path: '/doctor/submissions', query: { _t: Date.now() } }) } -function downloadName() { - const url = detail.value.designFileUrl || '' - const last = url.split('/').pop() - return last || `submission-${detail.value.planId}` -} - async function load() { const planId = route.params.planId if (!planId) { ElMessage.warning('参数缺失'); goBack(); return } loading.value = true try { - const res = await request.get(`/business/projectPlan/${planId}`) + const res = await request.get(`/business/projectPlan/${planId}`, { __silentError: true }) if (res?.code === 200) { detail.value = res.data || {} } else { diff --git a/ry-vue3/src/views/doctor/SubmissionNew.vue b/ry-vue3/src/views/doctor/SubmissionNew.vue index 7c59b06..e7aad03 100644 --- a/ry-vue3/src/views/doctor/SubmissionNew.vue +++ b/ry-vue3/src/views/doctor/SubmissionNew.vue @@ -1,83 +1,77 @@ @@ -133,9 +127,9 @@ const rules = { function beforeDesignUpload(file) { const max = 20 * 1024 * 1024 if (file.size > max) { ElMessage.error('设计文件不能超过 20MB'); return false } - const accept = ['.pdf', '.doc', '.docx', '.png', '.jpg', '.jpeg'] + const accept = ['.pdf', '.png', '.jpg', '.jpeg'] const ext = '.' + (file.name.split('.').pop() || '').toLowerCase() - if (!accept.includes(ext)) { ElMessage.error('仅支持 PDF / Word / 图片格式'); return false } + if (!accept.includes(ext)) { ElMessage.error('仅支持 PDF / 图片格式'); return false } return true } @@ -223,9 +217,9 @@ async function onSave() { payload.status = '0' } if (isEdit) { - await bizUpdate('projectPlan', payload) + await bizUpdate('projectPlan', payload, { __silentError: true }) } else { - await bizAdd('projectPlan', payload) + await bizAdd('projectPlan', payload, { __silentError: true }) } ElMessage.success(isEdit ? '修改成功' : '新建成功') goBack() @@ -244,23 +238,7 @@ onMounted(() => { \ No newline at end of file