feat: 会议劳务/会务材料分轨审核 + 注册页标题 + 下拉空值修复

会议材料分轨 (material_audit_stage 单轨 → labor/service 双轨):
- biz_meeting: labor_audit_stage/labor_compliance_approved + service_audit_stage/service_compliance_approved 四列替换原单轨两列
- StageDeriver: 单轨状态机(R/N/C0/C1/A) + 角色优先级选代表轨 + 会议物理态取两轨最小进度
- MeetingAuditStageEnum / 前端 meetingStage.js 镜像: 分轨推导 + 颜色跟随角色展示阶段(避免文案与颜色错位)
- BizMeetingController/ServiceImpl/AuditLog + mapper + MeetingStageScheduler 同步分轨字段
- MeetingDetail/Meetings/doctor/executor Meetings/ManagerProjectDetail/ManagerProjectsAssign/PublicityDetail 同步双轨

其它:
- 注册页 (执行单位/专家/支持单位) 加居中页标题
- DoctorDeptSelect/DoctorTitleSelect 空字符串统一 null, 避免挂载必填项飘红
- BizOrgMapper sponsor/executor options 加 status 字段
- sponsor/NewPerson 编辑态 orgName 只读
This commit is contained in:
郭庆泰
2026-08-26 18:13:22 +08:00
parent b5b3e3a213
commit b0256ccac3
25 changed files with 752 additions and 449 deletions
+8 -1
View File
@@ -93,7 +93,7 @@
<!-- : 操作按钮 - 悬浮固定到页面最右 (按选中 tab 动态显示) -->
<aside class="detail-actions">
<!-- 邀请函: 立即报名 -->
<button v-if="activeTab === 'invitation'" class="action-btn primary signup-btn" :disabled="signing || signed" @click="onSignup">
<button v-if="activeTab === 'invitation' && canShowSignupBtn" class="action-btn primary signup-btn" :disabled="signing || signed" @click="onSignup">
<svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor" width="14" height="14">
<path d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"/>
</svg>
@@ -217,6 +217,12 @@ const canShowExecutionBtn = computed(() => {
if (!r) return true
return r === 'executor'
})
// 立即报名 (专家参与邀请函): 仅专家 + 匿名可见; sponsor/executor/manager/admin 隐藏
const canShowSignupBtn = computed(() => {
const r = userStore.user?.role || ''
if (!r) return true
return r === 'doctor'
})
const showQr = ref(false)
const qrUrl = ref('')
@@ -380,6 +386,7 @@ async function checkSigned() {
}
const signing = ref(false)
async function onSignup() {
if (!canShowSignupBtn.value) return // 防御: 防止 v-if 被绕过
if (!loggedIn.value) {
ElMessage.warning('请先登录系统')
router.push('/login')