feat: 会议提交剩余时间+解冻 + 会务/劳务材料批量下载 + 多角色人员/账号模块完善

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-25 06:53:18 +08:00
co-authored by Claude
parent 0c882ae846
commit 591a43fe61
126 changed files with 3789 additions and 1334 deletions
@@ -200,9 +200,8 @@ async function loadAnnouncements() {
// ===================== 已分配执行方 (服务公司) =====================
/**
* 数据源同 manager/projects/edit/{id} 的 loadAssigns:
* 1) GET /business/project/{id}/assigns 拿原始分配行 (assignId, execUserId, sessions, amount)
* 2) 对每个 execUserId 调 listExecutorOrgs({ userId }) 补 org_name
* (后端 SQL 已限定 parent_user_id IS NULL, 自动取 MAIN 账号对应的执行公司)
* 1) GET /business/project/{id}/assigns 拿原始分配行 (assignId, executionUnitId, sessions, amount)
* 2) 对每个 executionUnitId 调 listExecutorOrgs({ orgId }) 补 org_name
* N+1 但项目分配数一般 < 10, 简单可控; 真要优化再加聚合 JOIN 接口
*/
async function loadAssigns() {
@@ -214,13 +213,13 @@ async function loadAssigns() {
const enriched = await Promise.all(list.map(async (a) => {
let orgName = '-'
try {
const opts = await listExecutorOrgs({ userId: a.execUserId })
const opts = await listExecutorOrgs({ orgId: a.executionUnitId })
const org = (opts && opts.data && opts.data[0]) || null
if (org && org.orgName) orgName = org.orgName
} catch (e) { /* 单条失败不影响其它, 默认显示 '-' */ }
return {
assignId: a.assignId,
execUserId: a.execUserId,
executionUnitId: a.executionUnitId,
orgName,
sessions: a.sessions || 0,
amount: a.amount || 0