liu
12 小时以前 5d34bdd3c426bb2ca5f6627424ae67984f745603
docs/project-business/data/flows.json
@@ -54,13 +54,14 @@
       {"stage": "维修", "action": "现场/返厂/远程维修,费用与结果记录,完成联动工单完结", "roles": ["维修工程师"]},
       {"stage": "退货", "action": "退货申请审核→自动建 MES 销售退货单(RQC)→质检/入库回调→退款回调→关闭", "roles": ["售后", "质检", "财务"]}]},
    {"id": "finance", "name": "财务报销流程", "mermaid": "mermaid/12-finance-flow.mmd", "color": "#3ec9a7",
     "summary": "独立财务模块(yudao-module-finance):报销单(主表 + 1..n 明细行 + 发票附件) 一次性保存 → 提交 BPM 审批 → 通过后归档终态;驳回可改发票重新提交。附件走 system 附件中心按 recordType=finance_reimbursement 绑定,模块不与其他业务模块产生任何单据关联或字段带入。",
     "summary": "独立财务模块(yudao-module-finance):报销单(主表 + 1..n 明细行 + 发票附件) 一次性保存 → 提交 BPM 审批 → 通过后归档终态;驳回可改发票重新提交。支持发票 OCR 自动回填、发票类型枚举、本人/代他人发起(实际申请人 + 代录人)。附件走 system 附件中心按 recordType=finance_reimbursement 绑定,模块不与其他业务模块产生任何单据关联或字段带入。",
     "steps": [
       {"stage": "填报", "action": "主表(报销标题/报销总金额/申请日期/备注) + 至少 1 行明细(费用类型/发票号码/发票金额/发票日期/开票方/费用说明);总金额由明细求和回填,用户可手改,后端不校验一致性", "roles": ["报销人"]},
       {"stage": "附件", "action": "发票先调 /system/storage-blob/upload 取 blobId;保存时把该单当前全部 blobId 放进 blobIds 一起提交(全量替换语义,传空数组=清空,不传=不动)", "roles": ["报销人"]},
       {"stage": "保存", "action": "create 由 Redis 生成单号 BX+yyyyMMdd+6位流水(每日重置);明细先删后增全量覆盖且提交剥掉行 id;status=0 草稿", "roles": ["报销人"]},
       {"stage": "修改", "action": "update 仅放行 status=0 草稿 与 status=35 已驳回;delete 仅放行草稿(连带清理明细与发票附件)", "roles": ["报销人"]},
       {"stage": "审批", "action": "submit 传 id 与 processDefinitionKey(query 参数,请求体为空)→ status=15 审批中 并回写 processInstanceId;BPM 监听器按结果回写:通过→20 已通过、驳回→35 已驳回、取消→退回 0 草稿;流程 key 取 approve-process-list 实时列表不写死", "roles": ["报销人", "审批人"]},
       {"stage": "填报", "action": "主表(申请人/报销标题/报销总金额/申请日期/备注) + 至少 1 行明细(费用类型/发票类型/发票号码/发票金额/发票日期/开票方/费用说明);申请人本人发起时只读取登录用户,代他人发起时选择实际申请人;发票类型下拉:增值税专用发票/增值税普通发票/电子发票/收据/其他;总金额由明细求和回填,用户可手改,后端不校验一致性", "roles": ["报销人", "代录人"]},
       {"stage": "OCR 识别", "action": "上传发票图片/PDF 后调用 /finance/reimbursement/ai/ocr 批量识别(单次≤20 个),AI 多模态提取发票号码/类型/金额/日期/销售方并追加为明细行;识别结果仅预填,需人工核对,费用类型仍需手选", "roles": ["报销人", "代录人"]},
       {"stage": "附件", "action": "发票先调 /system/storage-blob/upload 取 blobId;保存时把该单当前全部 blobId 放进 blobIds 一起提交(全量替换语义,传空数组=清空,不传=不动);OCR 上传的文件自动并入发票附件", "roles": ["报销人", "代录人"]},
       {"stage": "保存", "action": "create 由 Redis 生成单号 BX+yyyyMMdd+6位流水(每日重置);申请人 applicantId 不传默认登录用户,代发起时校验用户存在且启用;实际申请人存 applicant_id,代录人取 creator 审计字段;明细先删后增全量覆盖且提交剥掉行 id;status=0 草稿", "roles": ["报销人", "代录人"]},
       {"stage": "修改", "action": "update 仅放行 status=0 草稿 与 status=35 已驳回;delete 仅放行草稿(连带清理明细与发票附件)", "roles": ["报销人", "代录人"]},
       {"stage": "审批", "action": "submit 传 id 与 processDefinitionKey(query 参数,请求体为空)→ status=15 审批中 并回写 processInstanceId;创建流程实例时写入变量 applicantId/applicantName/initiatorId/initiatorName/isProxy,审批流可展示实际申请人与代录人;BPM 监听器按结果回写:通过→20 已通过、驳回→35 已驳回、取消→退回 0 草稿;流程 key 取 approve-process-list 实时列表不写死", "roles": ["报销人", "代录人", "审批人"]},
       {"stage": "归档", "action": "archive 仅放行 status=20 已通过 → status=40 已归档(终态)并写入 archiveTime", "roles": ["财务"]}]},
    {"id": "ums", "name": "会员入会流程", "mermaid": "mermaid/13-ums-membership-flow.mmd", "color": "#d6955c",
     "summary": "独立会员模块(yudao-module-ums):入会申请单(个人/单位二型 + 申请等级 + 证明材料附件) 草稿 → 提交 BPM 两级审批(秘书处初审 → 理事会审议)→ 通过后自动创建系统登录账号与会员记录 → 会员进入列表与通讯录(按地区/行业检索)。驳回可改后重提,取消退回草稿。模块不与其他业务模块产生单据关联,仅复用 BPM 与 system 附件中心。",
@@ -72,17 +73,41 @@
       {"stage": "修改", "action": "update 仅放行 status=0 草稿 与 status=35 已驳回(驳回时提示带申请编号);delete 仅放行草稿,且连带清理该单附件", "roles": ["入会申请人", "会员管理员"]},
       {"stage": "审批", "action": "submit 传 id 与 processDefinitionKey(query 参数)→ status=15 审批中并回写 processInstanceId;BPM 监听器 UmsApplicationStatusListener 按结果回写:通过→20、驳回→35、取消→退回 0;流程列表由 approve-process-list 实时取(先校验 BPM 分类 ums_membership_approve 存在,再按 key 取未挂起的最高版本),不写死 key", "roles": ["入会申请人", "秘书处(初审)", "理事会(审议)"]},
       {"stage": "建档", "action": "审批通过钩子自动建会员:①生成会员编号 HY+yyyyMMdd+6位流水 ②AdminUserApi.createUser 建系统账号(用户名与初始密码=联系电话、昵称=申请人姓名、部门=学会会员)③会员落库(入会日期=当天、状态 1 正常、applicationId 回填来源申请单);手机号重复会明确报错", "roles": ["系统自动"]},
       {"stage": "管理与检索", "action": "会员列表支持手工新增/编辑/删除(等级与类型校验:单位会员不可选『理事长』);会员通讯录为只读页,按地区编码与行业检索", "roles": ["会员管理员", "全体可查通讯录"]}]},
       {"stage": "资料自主维护", "action": "会员在「我的资料」页维护联系方式、单位/职称、研究方向、地区、行业等资料,提交后生成 ums_member_profile_change 待审核申请,不直接修改会员资料;同一会员同时只允许一条待审核申请,资料无变化时拒绝提交。管理员在「资料变更审核」查看字段级变更摘要,审核通过后全量写回 ums_member(允许清空字段),驳回必须填写原因并回显给会员", "roles": ["会员", "会员管理员"]},
       {"stage": "管理与检索", "action": "会员列表支持手工新增/编辑/删除(等级与类型校验:单位会员不可选『理事长』);会费缴纳标识记录 fee_paid(是否缴纳)与 fee_year(缴费年度),标记已缴时必须填写年度,取消缴纳时清空年度,列表展示「已缴(年度)/未缴」;会员通讯录为只读页,按地区编码与行业检索", "roles": ["会员管理员", "全体可查通讯录"]}]},
    {"id": "research", "name": "课题管理流程", "mermaid": "mermaid/14-research-flow.mmd", "color": "#e070a8",
     "summary": "独立科研模块(yudao-module-research):学会发布课题指南(重点/一般分类)→ 会员在线提交课题申报书 → 提交 BPM 三级审批(秘书处形式审查 → 专家评审 → 学会立项审批),专家评分以结构化明细子表记录并由后端自动汇总加权均分、排名与推荐结论 → 审批通过生成立项编号并发布系统公告 → 按批次登记经费拨付(凭证必填),每条拨款记录自动生成并提交一张 1:1 的财务报销单(finance_reimbursement),走 BPM 两级审批后由监听器把结果回写台账。院级二期再补结项验收与成果归档。",
     "steps": [
       {"stage": "发布指南", "action": "新建指南选类别 1重点课题 / 2一般课题,填申报起止时间与指南正文;编号 GL+yyyyMMdd+6位流水(Redis 每日重置);status: 0草稿/20已发布/30已截止。仅草稿可改可删,发布后即冻结;已产生申报单的指南禁止删除(提示该指南下已有 N 张申报单)", "roles": ["学会秘书处", "课题管理员"]},
       {"stage": "在线申报", "action": "从已发布且在申报期内的指南新建申报书;选会员(ums_member)自动带出姓名/工作单位/职称/联系电话/邮箱,可改;填课题名称、课题组成员、申请经费、申报书正文;编号 SB+yyyyMMdd+6位流水;类别冗余自指南,不信任前端传值;status: 0草稿", "roles": ["课题申报人(会员)", "课题管理员"]},
       {"stage": "在线申报", "action": "从已发布且在申报期内的指南新建申报书;选会员(ums_member)自动带出姓名/工作单位/职称/联系电话/邮箱,可改;填课题名称、课题组成员(子表逐行录入姓名/电话/单位/职称/角色/排序,随主表先删后增)、申请经费、申报书正文,联系电话为必填项且必须为 11 位手机号(后端同步校验,防止绕过前端);编号 SB+yyyyMMdd+6位流水;类别冗余自指南,不信任前端传值;status: 0草稿", "roles": ["课题申报人(会员)", "课题管理员"]},
       {"stage": "提交审批", "action": "submit 传 id 与 processDefinitionKey(query 参数)→ status=15 审批中并回写 processInstanceId。提交前逐条校验:① 指南必须已发布 ② 当前时间必须在申报起止期内——任一不满足即拒绝,提示带指南名与实际状态或起止时间;仅草稿与已驳回可改可重提,仅草稿可删(连带清附件)", "roles": ["课题申报人"]},
       {"stage": "专家评审", "action": "申报单处于审批中(15)时录入专家评分明细(一位专家一行:姓名/单位/职称 + 选题价值0.3/研究方案0.3/团队基础0.2/预期成果0.2 四项分值 + 结论 + 意见);后端每次增删改后重算 compositeScore 加权合计、按加权分降序重排 ranking,并回写主单 reviewAvgScore(全部专家均分)与 reviewPass(均分达标且多数结论为推荐立项);明细全部删除时汇总值清空为未汇总;四项分值均在 0~100 之外时提示指出具体维度与实际值", "roles": ["评审专家", "学会秘书处", "课题管理员"]},
       {"stage": "立项审批", "action": "BPM 流程 research_topic_approve 顺序走三节点:秘书处形式审查 → 专家评审 → 学会立项审批。审批方法与审批人在流程定义内配置,部署后由管理员在 BPM 流程设计器按学会实际组织调整;审批中心内的自定义表单只读回显申报单 + 评审明细 + 拨付记录。通过→20 已立项、驳回→35 已驳回、取消→退回 0 草稿", "roles": ["学会秘书处(形式审查)", "评审专家(评审节点)", "学会理事会(立项审批)"]},
       {"stage": "立项与通知", "action": "监听器 ResearchApplicationStatusListener 先回写审批状态,审批通过后再调 approveApplication:生成立项编号 LX+yyyyMMdd+6位流水 与 approveTime(已有编号则幂等跳过)。点「发布立项通知」生成 system_notice 公告(标题『关于公布立项课题的通知』,正文含课题名/立项编号/类别/申报人/单位/资助金额),写回 noticeId 防重复——重复点击按已发布拦截并告知上次发布时间", "roles": ["课题管理员", "学会秘书处"]},
     {"stage": "成员统计", "action": "基于 research_application_member 子表按「姓名 + 电话 + 单位」聚合成员维度数据:参与课题数、课题名单、成员角色;支持按关键字与申报状态筛选,导出 Excel,并生成可直接复制到群内发布的名单文本。历史文本字段 team_members 仅用于兼容展示,不再参与统计", "roles": ["课题管理员", "学会秘书处"]},
     {"stage": "经费拨付", "action": "仅「已立项(20)」的申报单可登记拨款记录(批次名称/拨付金额/拨付日期/收款单位/备注/凭证附件),凭证必填。登记时一条龙完成:① 课题侧落 research_fund_record 台账(先置待拨付)② 同一批 blob 双绑到课题台账与财务报销单 ③ 经 yudao-module-finance-api 自动生成 1:1 的 finance_reimbursement 报销单(1 行明细:费用类型=其他、发票金额=拨付金额、发票日期=拨付日期、费用说明=「课题〔课题名〕第N期/第N次经费拨款」)④ 立即提交 BPM 报销审批 ⑤ 台账回写报销单号并置「报销审批中(15)」。金额校验:已登记金额 + 本次金额 不得超出该单申请经费,超出时提示报出本次、已登记、合计、预算四项数值。状态由系统驱动:0待拨付/15报销审批中/20已拨付/30已驳回;只有「待拨付」可删(删除联动清理财务侧草稿报销单),「待拨付」「已驳回」可改并重新发起报销(已驳回改后清空驳回原因与时间);取消流程则退回「待拨付(0)」(发起人撤回只把实例退回发起节点、流程未结束,台账保持「报销审批中(15)」,需重新提交后才继续走审批)。财务审批分类下没有已发布流程时直接报错且不建单,不留孤儿草稿报销单", "roles": ["学会财务", "课题管理员", "财务审核人", "财务主管"]}]},
    {"id": "asset", "name": "资产管理流程", "mermaid": "mermaid/16-asset-flow.mmd", "color": "#8e7cc3",
     "summary": "独立资产模块(yudao-module-asset):资产台账按「易耗品 / 办公资产 / 固定资产」三类建档,记录库存、单价、保管人(管理人)与存放地点;领用登记从台账选资产、记录领用人/时间/数量/用途,自动扣减库存并生成领用单;归还按数量回补库存并更新未归还/部分归还/已归还状态。",
     "steps": [
       {"stage": "建档", "action": "资产台账新增:资产名称、分类(1易耗品/2办公资产/3固定资产)、规格型号、计量单位、库存数量、单价、购入日期、保管人、存放地点;资产编号 ZC+yyyyMMdd+6位流水(可手工指定),总价值=单价×数量", "roles": ["资产管理员"]},
       {"stage": "领用", "action": "选择资产与领用人,记录领用时间、数量、用途、预计归还日期;库存不足时拒绝并提示「当前可领用/本次申请」;成功后扣减库存、生成 LY 领用单,并快照资产编号/名称/分类与保管人", "roles": ["资产管理员", "领用人"]},
       {"stage": "归还", "action": "按数量归还:回补库存,更新已归还数量;未归还完→部分归还,全部归还→已归还并记录归还时间;归还数量超过未归还数量时拒绝并报出领用/已归还/本次/可归还四项数值", "roles": ["资产管理员"]},
       {"stage": "冲销", "action": "删除领用记录仅在未发生归还时允许,删除时把未归还数量退回库存;存在未归还领用的资产禁止删除", "roles": ["资产管理员"]}]},
    {"id": "vehicle", "name": "用车管理流程", "mermaid": "mermaid/17-vehicle-flow.mmd", "color": "#5a9bd5",
     "summary": "独立用车模块(yudao-module-vehicle):申请人填写用车时间、出发地、目的地、随行人数、事由 → 提交 BPM 用车审批(审核 + 逐级审批)→ 审批结果回写申请单并反馈申请人,可查看逐级审批记录。",
     "steps": [
       {"stage": "申请", "action": "填写用车开始/结束时间、出发地、目的地、随行人数、用车事由、车牌号(选填);申请单号 YC+yyyyMMdd+6位流水;申请人=当前登录用户,状态=草稿", "roles": ["用车申请人"]},
       {"stage": "修改/删除", "action": "草稿与已驳回可修改;仅草稿可删除", "roles": ["用车申请人"]},
       {"stage": "提交审批", "action": "选择 BPM 用车审批流程后提交,状态置 15 审批中并回写 processInstanceId;流程 key 取 approve-process-list 实时列表", "roles": ["用车申请人"]},
       {"stage": "审核与逐级审批", "action": "BPM 流程按配置的审核/逐级审批节点流转(节点与审批人在流程设计器中配置,支持逐级审批);任一节点驳回即结束", "roles": ["审核人", "部门负责人", "分管领导"]},
       {"stage": "结果反馈", "action": "审批通过→20 已通过并回写 approveTime;驳回→35 已驳回;取消→退回 0 草稿;申请人在列表直接看到结果,并可进入「查看审批」查看逐级审批记录与意见", "roles": ["用车申请人", "审批人"]}]},
    {"id": "purchase", "name": "采购管理流程", "mermaid": "mermaid/18-purchase-flow.mmd", "color": "#e0a458",
     "summary": "独立采购模块(yudao-module-purchase):采购单主表记录采购时间、采购人(经办人)与采购金额,1..n 行采购商品明细记录商品名称、规格型号、数量、单价与金额;行金额=数量×单价,采购金额=明细合计。采购审批与转报销为后续需求。",
     "steps": [
       {"stage": "录单", "action": "填写采购时间、采购人(经办人),逐行录入采购商品明细(商品名称、规格型号、数量、单价),系统自动计算行金额与采购金额合计", "roles": ["采购经办人"]},
       {"stage": "保存", "action": "采购单号 CG+yyyyMMdd+6位流水;明细随主表一次性提交,修改时先删后增;状态=草稿", "roles": ["采购经办人"]},
       {"stage": "修改/删除", "action": "草稿可修改与删除,删除连带清理明细", "roles": ["采购经办人"]},
       {"stage": "审批与报销(后续)", "action": "后续需求:采购单提交审批(采购→领导通过)→ 审批通过后转入财务报销申请", "roles": ["采购经办人", "审批人", "财务"]}]},
    {"id": "archive", "name": "档案管理流程", "mermaid": "mermaid/15-archive-flow.mmd", "color": "#7fb3d5",
     "summary": "独立档案模块(yudao-module-archive):书架分类(分层分列)规整 → 档案登记(电子附件 + 实体位置四字段,密级三档)→ 借阅登记走 BPM 两级审批(档案管理员审核 → 分管领导审批)→ 审批通过档案转「借出中」→ 归还登记回「在库」形成流转闭环 → 逾期未还查询时实时计算并在列表标红 → 存量与流转统计(总数/在库/借出中/逾期 + 分类·密级·载体三组分布)。同时接收课题(已立项)、会员(正常)、财务(已通过)三方的「归档」联动,经新建的 yudao-module-archive-api 生成档案并回写来源表 archive_document_id。会议/党建档案系统内无来源模块,仅手工录入。",
     "steps": [