diff --git a/ry-vue3/src/views/manager/MeetingNew.vue b/ry-vue3/src/views/manager/MeetingNew.vue index 1321d47..81b9bca 100644 --- a/ry-vue3/src/views/manager/MeetingNew.vue +++ b/ry-vue3/src/views/manager/MeetingNew.vue @@ -5,9 +5,9 @@ - +
- + {{ snap.projectNo }} @@ -27,23 +27,12 @@ {{ snap.createUserName }} - - - - - - - - - - - + + + {{ form.meetingName }} - - - - + @@ -51,8 +40,8 @@ - - + +
@@ -81,7 +70,7 @@ const router = useRouter() // copy: ?meetingId=xxx&mode=copy → POST /business/meeting (复制) // 修改/复制 URL 同时带 projectId 让左列快照能立即加载 (不必先等 bizGet meeting) const meetingId = route.query.meetingId || '' -const urlProjectId = route.query.projectId || '' // URL 直接带的 projectId +const urlProjectId = route.query.projectId || '' const mode = computed(() => { if (meetingId && route.query.mode === 'copy') return 'copy' if (meetingId) return 'edit' @@ -102,27 +91,22 @@ const snap = reactive({ createUserName: '' }) -// ========== 表单 (右列 6 项可编辑 + 备注 1 项, 顺序跟 template 对齐) ========== +// ========== 表单 (右列 5 项: meetingName 只读 + 4 输入) ========== const form = reactive({ - projectId: null, + projectId: urlProjectId ? Number(urlProjectId) : null, projectNo: '', projectName: '', - meetingName: '', // 1. 会议名称 - projectForm: '', // 2. 项目形式 - periodNo: 1, // 3. 期数 - totalPeriods: 1, // 4. 总期数 - startTime: '', // 5. 会议开始时间 - endTime: '', // 6. 会议结束时间 - remark: '' // 7. 备注 (跨双列) + meetingName: '', + periodNo: '', + startTime: '', + endTime: '', + remark: '' }) const rules = { - meetingName: [{ required: true, message: '请输入会议名称', trigger: 'blur' }], periodNo: [{ required: true, message: '请填写第几期', trigger: 'blur' }], - projectForm: [{ required: true, message: '请选择项目形式', trigger: 'change' }], startTime: [{ required: true, message: '请选择会议开始时间', trigger: 'change' }], - endTime: [{ required: true, message: '请选择会议结束时间', trigger: 'change' }], - totalPeriods: [{ required: true, message: '请填写总期数', trigger: 'blur' }] + endTime: [{ required: true, message: '请选择会议结束时间', trigger: 'change' }] } // ========== 加载项目快照 ========== @@ -150,17 +134,14 @@ async function loadMeeting(mid) { form.projectNo = d.projectNo || '' form.projectName = d.projectName || '' form.meetingName = d.meetingName || '' - form.periodNo = d.periodNo || 1 - form.projectForm = d.projectForm || '' + form.periodNo = d.periodNo || '' form.startTime = d.startTime || '' form.endTime = d.endTime || '' - form.totalPeriods = d.totalPeriods || 1 form.remark = d.remark || '' // 左列快照 projectNo/projectName 用 meeting 冗余字段 (即使 project_id 为 NULL 也能显示) snap.projectNo = d.projectNo || '' snap.projectName = d.projectName || '' // 总场次/支持单位/创建时间/创建人员 优先用 URL projectId, 其次 meeting.projectId - // (URL 带的 projectId 优先, 避免 copy 模式下 user 没传导致再读 meeting) const pid = urlProjectId || d.projectId if (pid) { await loadProjectSnapshot(pid) @@ -172,17 +153,26 @@ async function onSave() { try { await formRef.value.validate() } catch (e) { return } submitting.value = true try { - const payload = { ...form } + const payload = { + projectId: form.projectId, + projectNo: form.projectNo, + projectName: form.projectName, + meetingName: form.meetingName, + periodNo: form.periodNo, + startTime: form.startTime, + endTime: form.endTime, + remark: form.remark + } if (mode.value === 'edit') { // 修改: 走 bizUpdate, 带 meetingId (后端 WHERE 用, 不能 delete) + payload.meetingId = form.meetingId // __silentError: 拦截器不自动 toast, 错误统一由下方 catch 处理 (避免双 toast) await bizUpdate('meeting', payload, { __silentError: true }) ElMessage.success('修改成功') } else { - // 新建 / 复制: 走 bizAdd, 不传 meetingId (AUTO_INCREMENT) - delete payload.meetingId + // 新建 / 复制: 走 bizAdd await bizAdd('meeting', payload, { __silentError: true }) - ElMessage.success(mode.value === 'copy' ? '复制成功' : '创建成功') + ElMessage.success(mode.value === 'copy' ? '复制成功' : '会议创建成功') } goBack() } catch (e) { @@ -193,27 +183,24 @@ async function onSave() { } function goBack() { - // 跳回列表 (用 name 而非 path, hash 模式 + 路由可复用) + // 跳回列表 router.push({ name: 'manager-meetings' }) } onMounted(async () => { if (mode.value === 'edit') { - // 修改: 加载会议详情 (左列项目快照由 meeting.projectId 派生) await loadMeeting(meetingId) } else if (mode.value === 'copy') { - // 复制: 加载会议详情, name 加 " 副本", periodNo reset 为 1 (用户填) + // 复制: 加载会议详情, name 加 " 副本" await loadMeeting(meetingId) form.meetingName = (form.meetingName || '') + ' 副本' - form.periodNo = 1 // 复制后让用户重新填期数 } else { // 新建: 加载项目快照, meetingName 默认 = 项目名 if (urlProjectId) { - form.projectId = Number(urlProjectId) || null await loadProjectSnapshot(urlProjectId) form.projectNo = snap.projectNo form.projectName = snap.projectName - form.meetingName = snap.projectName // 默认会议名 = 项目名 + form.meetingName = snap.projectName } } }) @@ -233,12 +220,12 @@ onMounted(async () => { margin-bottom: 24px; } -/* === 2 列布局 (跟原型 .form-grid 一致, grid-auto-flow: column 让左 6 右 6 + 备注 1 项, 共 7 行) === */ +/* === 2 列布局 (跟原型 .form-grid 一致, grid-auto-flow: column 让左 6 右 5 对齐) === */ .form-grid { display: grid; grid-template-columns: 1fr 1fr; grid-auto-flow: column; - grid-template-rows: repeat(7, auto); + grid-template-rows: repeat(6, auto); gap: 20px 32px; max-width: 900px; } @@ -246,10 +233,6 @@ onMounted(async () => { .form-grid :deep(.el-form-item) { margin-bottom: 0; } -/* 备注占满整行 (跨双列), 放在 form 末尾, 视觉上独占一行 */ -.form-grid :deep(.full-row) { - grid-column: 1 / -1; -} /* 只读值样式 */ .form-value {