feat: 项目导出 + 会议跳转 + 机构软删除 + 供应商账号同步

- 项目/项目评价/报名专家 3 类导出, 勾选透传 projectIds
- 项目列表 总场次/已执行/未执行 三列点击跳对应会议列表 (executor 复用后端 role 隔离)
- 机构软删除 + 级联软删机构下账号
- 供应商开放接口账号同步

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-30 10:42:35 +08:00
co-authored by Claude
parent 1876601ba7
commit f4d8bc1463
25 changed files with 880 additions and 171 deletions
+16 -1
View File
@@ -110,7 +110,9 @@ const snap = reactive({
totalSessions: '',
sponsorOrgName: '',
createUserName: '',
createTime: ''
createTime: '',
projectStartTime: '',
projectEndTime: ''
})
// 期数上限 = 总场次/总期数 (executor 快照 totalSessions 已换成分配给本机构的场次口径)
@@ -151,6 +153,8 @@ async function loadProjectSnapshot(pid) {
snap.sponsorOrgName = d.sponsorOrgName || ''
snap.createUserName = d.createUserName || ''
snap.createTime = d.createTime || ''
snap.projectStartTime = d.startTime || ''
snap.projectEndTime = d.endTime || ''
// executor: "总场次" = 分配给本执行方(公司)的场次, 不是项目总场次
if (roleSegment.value === 'executor') {
try {
@@ -196,6 +200,17 @@ async function onSave() {
ElMessage.error('会议开始时间不能晚于会议结束时间')
return
}
// 会议时间必须在项目起止时间区间内 (闭区间; 项目未设起止则跳过对应边界)
if (snap.projectStartTime && form.startTime
&& new Date(form.startTime.replace(' ', 'T')) < new Date(snap.projectStartTime.replace(' ', 'T'))) {
ElMessage.error('会议开始时间不能早于项目开始时间')
return
}
if (snap.projectEndTime && form.endTime
&& new Date(form.endTime.replace(' ', 'T')) > new Date(snap.projectEndTime.replace(' ', 'T'))) {
ElMessage.error('会议结束时间不能晚于项目结束时间')
return
}
// 期数不得高于总场次/总期数 (executor 快照 totalSessions 已换成分配给本机构的场次口径)
const pn = Number(form.periodNo)
const total = Number(snap.totalSessions)