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 @@
-
-
+
-
我的项目设计投稿 > {{ isEdit ? '修改项目设计投稿' : '新建项目设计投稿' }}
+
首页 / 我的项目设计投稿 / {{ isEdit ? '修改项目设计投稿' : '新建项目设计投稿' }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
- 将设计文件拖到此处,或点击上传
- 支持 PDF / Word / 图片, 单文件 ≤ 20MB
-
-
-
-
+
+
+
+
+
+ 将设计文件拖到此处,或点击上传
+ 支持 PDF / 图片, 单文件 ≤ 20MB
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
- 保存
- 取消
-
+
+ 保存
+ 取消
+
+
@@ -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