gaoluyang
昨天 90b3ad820eea45d021835197eac5bc3ad55b12ed
docs/project-business/index.html
@@ -111,6 +111,7 @@
  <a data-t="flow-quality"><span class="dot" style="background:var(--c-qc)"></span>质量流程</a>
  <a data-t="flow-warehouse"><span class="dot" style="background:var(--c-wm)"></span>仓储流程</a>
  <a data-t="flow-aftersales"><span class="dot" style="background:var(--c-as)"></span>售后流程</a>
  <a data-t="flow-finance"><span class="dot" style="background:var(--c-fin)"></span>会计核算</a>
  <div class="group">结构与数据</div>
  <a data-t="relation"><span class="dot" style="background:var(--c-bpm)"></span>系统关系</a>
  <a data-t="dataflow"><span class="dot" style="background:var(--c-fin)"></span>数据流</a>
@@ -137,6 +138,7 @@
<section class="page" id="flow-quality"></section>
<section class="page" id="flow-warehouse"></section>
<section class="page" id="flow-aftersales"></section>
<section class="page" id="flow-finance"></section>
<section class="page" id="relation">
  <h2 class="pt">系统关系</h2>
  <p class="desc">模块之间的调用与数据依赖:实线=单据/数据流向,虚线=审批回调与辅助能力。</p>
@@ -201,9 +203,9 @@
    "frontend": "mom-pro2-before(Vue3 管理后台,同仓库存放,只读参考)"
  },
  "stats": {
    "businessModules": 13,
    "coreObjects": 48,
    "documentFlows": 6,
    "businessModules": 14,
    "coreObjects": 53,
    "documentFlows": 7,
    "approvalListeners": 13,
    "aiCapabilities": 8,
    "wmBillTypes": 15
@@ -323,7 +325,8 @@
    "MesWmSnDO 新增的 uuid 字段生成/消费逻辑未在核心 Service 中确认",
    "转正申请(hrm_regularize_application)、培训证书等仅有 SQL 与菜单初始化,Java 侧 Service/Controller 未实现",
    "NCR 处置结果(返工/退货)未回写触发源单据,仅台账记录",
    "MPS 状态枚举独立编号(0/1/2/3),与通用单据常量(0/1/4/5)不一致"
    "MPS 状态枚举独立编号(0/1/2/3),与通用单据常量(0/1/4/5)不一致",
    "财务管理(会计核算)模块 yudao-module-finance 代码已落地,但①菜单/权限未配置(需自行在菜单管理建 finance:* 权限)②建表与字典脚本未同步进 docs/sql/config_export_all_<日期>.sql 阶段一,按现有合并脚本初始化新库会缺 fin_* 表与 6 组 finance_* 字典【待确认】"
  ],
  "generatedAt": "2026-09-10",
  "analysisBasis": "基于 dev_business 分支 87bf4a99 源码,6 组并行源码走读(MES 生产质量 / MES 仓储 / ERP / CRM+SRM / 售后+HRM / AI+BI+MDM+BPM+底座)"
@@ -362,6 +365,14 @@
     "roles": ["采购员", "销售员", "出纳", "会计"],
     "upstream": ["CRM(合同)", "SRM(定标)", "主数据"], "downstream": ["生产(MPS)", "仓储(收发)"],
     "coreTables": ["erp_purchase_request", "erp_purchase_order", "erp_purchase_invoice", "erp_finance_payment", "erp_sale_order", "erp_finance_receipt", "erp_account"]},
    {"key": "finance", "name": "财务管理(会计核算)", "color": "#3ec9a7", "tag": "FIN", "flow": "finance",
     "positioning": "独立核算模块:会计核算 + 资产核算 + 财务报表看板(与 ERP 进销存财务单据分离,yudao-module-finance)",
     "problem": "进销存只管单据不管账,缺少会计科目/凭证/账簿与资产折旧摊销沉淀,无法出账表与资产净值",
     "features": ["会计科目树(约68条一级科目种子·可建下级)", "记账凭证(字号自动生成·分录借贷平衡前后端双重校验)", "凭证状态机 未过账0→过账10/作废20,已过账不可改", "总账按期间逐月汇总", "明细账逐条分录并结转余额", "固定资产+计提折旧", "无形资产+计提摊销", "会计核算看板(收支/资产/凭证/月度趋势)", "附件走系统附件中心 recordType=fin_voucher"],
     "objects": ["会计科目", "记账凭证", "凭证分录", "固定资产", "无形资产"],
     "roles": ["会计", "财务主管", "资产会计", "管理层"],
     "upstream": ["进销存(ERP 已审核收货/付款/购销单据)"], "downstream": ["财务报表看板", "BI 管理驾驶舱"],
     "coreTables": ["fin_account_subject", "fin_voucher", "fin_voucher_entry", "fin_fixed_asset", "fin_intangible_asset"]},
    {"key": "pro", "name": "生产管理", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production",
     "positioning": "生产执行核心:计划-工单-任务-报工",
     "problem": "订单到车间执行的逐层拆解与过程可控",
@@ -462,6 +473,11 @@
    {"name": "采购来票", "module": "进销存", "table": "erp_purchase_invoice", "doc": "FPD编号,AI OCR 预填,累计≤订单总价,付款单的前置", "upstream": ["采购订单"], "downstream": ["付款单"], "keywords": "来票 发票 采购发票"},
    {"name": "付款单", "module": "财务", "table": "erp_finance_payment", "doc": "FKD编号,必须关联来票+附件,累计≤来票金额,BPM 审批", "upstream": ["采购来票"], "downstream": ["结算账户"], "keywords": "付款 应付 payment"},
    {"name": "收款单", "module": "财务", "table": "erp_finance_receipt", "doc": "SKD编号,关联 CRM 客户校验,无 BPM(手动审核)", "upstream": ["销售(弱关联)"], "downstream": ["结算账户"], "keywords": "收款 应收 receipt"},
    {"name": "会计科目", "module": "会计核算", "table": "fin_account_subject", "doc": "科目树,parent_id 自关联;科目类型1资产2负债3权益4成本5损益,余额方向1借2贷,状态0启用1禁用;账表与分录统一按 subject_code 取数", "upstream": ["会计科目种子约68条一级科目"], "downstream": ["记账凭证分录", "总账", "明细账"], "keywords": "会计科目 科目 subject account 资产类 负债类 损益类"},
    {"name": "记账凭证", "module": "会计核算", "table": "fin_voucher", "doc": "凭证字号可留空由后端自动生成;状态 未过账0/已过账10/已作废20;已过账不可改,未过账与已过账均可作废,未过账与已作废可删除;附件按 recordType=fin_voucher 挂系统附件中心", "upstream": ["会计科目"], "downstream": ["总账", "明细账", "财务报表看板"], "keywords": "记账凭证 凭证 voucher 过账 作废 借贷平衡"},
    {"name": "凭证分录", "module": "会计核算", "table": "fin_voucher_entry", "doc": "凭证下逐行分录:科目编码+借/贷金额+辅助核算(1客户2供应商3部门4员工5项目);一行不可借贷同时大于0,全表借贷合计必须相等且大于0", "upstream": ["记账凭证", "会计科目"], "downstream": ["总账", "明细账"], "keywords": "凭证分录 分录 entry 借方 贷方 辅助核算"},
    {"name": "固定资产", "module": "会计核算", "table": "fin_fixed_asset", "doc": "资产卡片,状态 1在用/2闲置/3维修中/4已报废;月折旧额=(原值×(1-残值率))÷(年限×12),累计折旧与净值由计提累加,不接收前端传值", "upstream": [], "downstream": ["财务报表看板", "总账"], "keywords": "固定资产 折旧 资产卡片 fixed asset 残值率"},
    {"name": "无形资产", "module": "会计核算", "table": "fin_intangible_asset", "doc": "无形资产卡片(证书编号/有效期),状态 1在用/2已失效/3已摊销完;月摊销额=(原值×(1-残值率))÷(摊销年限×12),累计摊销与净值由计提累加", "upstream": [], "downstream": ["财务报表看板", "总账"], "keywords": "无形资产 摊销 软件著作权 专利 intangible 有效期"},
    {"name": "销售订单", "module": "进销存", "table": "erp_sale_order", "doc": "XSDD编号,BPM 审批,需生产行自动建 MPS,出库状态:未0已预留1部分2全部3,生产完成事件回写", "upstream": ["合同"], "downstream": ["MPS", "发货通知", "销售出库", "售后工单"], "keywords": "销售订单 sale"},
    {"name": "主生产计划", "module": "生产", "table": "mes_pro_mps", "doc": "MPS计划,草稿0→已下发1→完成2/取消3,可合并下发", "upstream": ["销售订单"], "downstream": ["生产工单"], "keywords": "MPS 主计划 生产计划"},
    {"name": "生产工单", "module": "生产", "table": "mes_pro_work_order", "doc": "草稿0→已确认1→完成2/取消3,确认时按工艺路线生成任务,最后一道工序报工回写已生产数量", "upstream": ["MPS"], "downstream": ["生产任务", "领料", "完工入库"], "keywords": "工单 生产工单 work order"},
@@ -549,6 +565,15 @@
       {"stage": "判定", "action": "问题判定: 一般/维修/退货,严重度 0-3", "roles": ["售后工程师"]},
       {"stage": "维修", "action": "现场/返厂/远程维修,费用与结果记录,完成联动工单完结", "roles": ["维修工程师"]},
       {"stage": "退货", "action": "退货申请审核→自动建 MES 销售退货单(RQC)→质检/入库回调→退款回调→关闭", "roles": ["售后", "质检", "财务"]}]},
    {"id": "finance", "name": "会计核算流程", "mermaid": "mermaid/12-finance-flow.mmd", "color": "#3ec9a7",
     "summary": "独立核算模块 yudao-module-finance:会计科目建账 → 记账凭证录入(借贷平衡校验) → 过账 → 总账/明细账 → 资产计提折旧与摊销 → 财务报表看板取数 ERP 已审核单据。",
     "steps": [
       {"stage": "建账", "action": "维护会计科目 tree(subjectCode 唯一,可建下级),首次可导入约 68 条一级科目种子", "roles": ["会计"]},
       {"stage": "记账", "action": "录入凭证(字号留空自动生成)+分录,分录逐行选科目并填借/贷;校验至少一行、借贷都不得同时大于0、合计相等且大于0", "roles": ["会计"]},
       {"stage": "过账", "action": "未过账0 → post 过账 → 已过账10(不可再修改);未过账0 或 已过账10 均可 cancel 作废 → 已作废20", "roles": ["会计", "财务主管"]},
       {"stage": "查账", "action": "总账按期间逐月汇总、明细账逐条分录并结转余额,两者只统计已过账10的凭证,并支持导出", "roles": ["会计", "财务主管"]},
       {"stage": "资产", "action": "固定资产(1在用/2闲置/3维修中/4已报废)与无形资产(1在用/2已失效/3已摊销完)计提:传 ids 按选中计提,ids 为空对全部未报废/未失效资产计提一个月", "roles": ["资产会计"]},
       {"stage": "报表", "action": "看板汇总资产与凭证时点数 + 经 ErpFinanceStatisticsApi 取 ERP 已审核收货付款与购销金额,输出月度收支趋势", "roles": ["财务主管", "管理层"]}]},
    {"id": "ai", "name": "AI 业务流程", "mermaid": "mermaid/11-ai-business-flow.mmd", "color": "#56c8d8",
     "summary": "统一模式:业务侧收集上下文(必要时调 MDM/SRM/CRM API 取名称)→组装 Prompt→chat/chatWithImage→解析 JSON→前端预填或建议;无 Function Calling;RAG 知识库已建成但暂无业务消费。",
     "steps": [
@@ -578,7 +603,7 @@
    {"role": "质检员", "modules": ["MES-QC"], "operations": ["IQC/IPQC/OQC/RQC 检验", "NCR 评审处置"], "data": ["mes_qc_*"], "scope": "inspectorUserId 归属"},
    {"role": "设备员/维修工", "modules": ["MES-DV"], "operations": ["点检保养", "维修工单", "工装领用"], "data": ["mes_dv_*", "mes_tm_*"], "scope": "chargeUserId 归属"},
    {"role": "客服/售后工程师", "modules": ["售后"], "operations": ["工单受理派工", "维修", "退货申请"], "data": ["after_sale_*"], "scope": "行级数据权限四视图:我负责/我参与/下属负责/全部(aftersales:view-all)"},
    {"role": "财务", "modules": ["ERP", "CRM"], "operations": ["收款单", "付款单", "开票审核", "结算账户"], "data": ["erp_finance_*", "crm_invoice", "crm_receivable"], "scope": "financeUserId 归属"},
    {"role": "财务", "modules": ["ERP", "CRM", "FIN"], "operations": ["收款单", "付款单", "开票审核", "结算账户", "会计科目维护", "记账凭证录入与过账/作废", "总账与明细账查询", "固定资产折旧计提", "无形资产摊销计提", "会计核算看板"], "data": ["erp_finance_*", "crm_invoice", "crm_receivable", "fin_account_subject", "fin_voucher", "fin_voucher_entry", "fin_fixed_asset", "fin_intangible_asset"], "scope": "financeUserId 归属;财务核算模块按 finance:* 接口权限 + system_menu 授权,暂无数据权限字段"},
    {"role": "HR", "modules": ["HRM"], "operations": ["员工档案入转调离", "考勤规则排班", "薪酬核算发放", "离职交接"], "data": ["hrm_*"], "scope": "部门范围 dataScope"},
    {"role": "管理层", "modules": ["BI"], "operations": ["查看采购销售/仓库/生产设备/质量/人力五大主题大屏"], "data": ["bi_dashboard"], "scope": "只读"}
  ]
@@ -614,6 +639,14 @@
      付款单
      收款单
      结算账户
    财务管理 会计核算 FIN
      会计科目树
      记账凭证与分录
      凭证过账与作废
      总账与明细账
      固定资产与折旧
      无形资产与摊销
      财务报表看板
    生产管理 MES
      主生产计划 MPS
      生产工单
@@ -910,6 +943,7 @@
  ERP -->|销售订单审批生成MPS| MES
  MES -->|入库出库回写单据进度| ERP
  MES -->|ProductionFinishedEvent| ERP
  ERP -->|ErpFinanceStatisticsApi.getMonthlyStatistics·只取已审核 status=20 的收款付款与购销金额| FIN[财务核算 FIN 科目·凭证·总账明细账·资产折旧摊销·报表看板]
  MES -->|退货质检入库回调| AS[售后工单维修退货]
  CRM -->|客户主数据| AS
  HRM[HRM 员工入转调离交接考勤薪酬] -.->|expandUserIds 数据可见性扩展·接口已就绪待各模块接入| CRM
@@ -927,9 +961,11 @@
  ERP --> BI
  CRM --> BI
  HRM --> BI
  FIN --> BI
  SYS[系统底座 认证·RBAC·字典·附件中心·定时任务] --- MDM
  SYS --- MES
  STG[附件中心 storage-blob+attachment 全模块统一挂附件] --- ERP
  FIN -.->|凭证附件 recordType=fin_voucher| STG
</pre>
<pre style="display:none" class="mmd-src" data-mmd="09-data-flow">
flowchart LR
@@ -958,6 +994,19 @@
    RC[收款单]
    PI[采购来票] --> PA[付款单]
  end
  subgraph S5 [财务核算 FIN 独立模块]
    FA[会计科目 fin_account_subject] --> FV[记账凭证 fin_voucher]
    FV --> FE[凭证分录 fin_voucher_entry]
    FE -->|借贷平衡校验·不平衡或合计为0则拦下| FVPOST{凭证过账}
    FVPOST -->|已过账10| GL[总账·按期间逐月汇总]
    FVPOST -->|已过账10| DL[明细账·逐条分录并结转余额]
    GL --> FDASH[会计核算看板]
    DL --> FDASH
    FIX[固定资产·1在用2闲置3维修中4已报废] -->|计提折旧·传ids按选中 空ids全量| FDEP[累计折旧与净值]
    FINT[无形资产·1在用2已失效3已摊销完] -->|计提摊销·传ids按选中 空ids全量| FAMR[累计摊销与净值]
    FDEP --> FDASH
    FAMR --> FDASH
  end
  CT -->|generateSaleOrder 带入客户产品折扣定金·回写orderId| SO
  SO -->|审批通过带入 saleOrderId 行ID 数量 客户 交期| MP
  PO -->|确认收货带入订单行物料供应商数量| AN
@@ -971,6 +1020,11 @@
  IV -->|回款强制先开票| RK
  RC -->|关联CRM客户校验| CU
  PA -->|关联来票与供应商| PI
  RC -->|已审核收款单金额 ErpFinanceStatisticsApi| FDASH
  PA -->|已审核付款单金额 ErpFinanceStatisticsApi| FDASH
  SO -->|已审核销售订单金额 ErpFinanceStatisticsApi| FDASH
  PO -->|已审核采购订单金额 ErpFinanceStatisticsApi| FDASH
  FV -.->|凭证附件 recordType=fin_voucher| PDFARCH
  subgraph S4 [智能质检报告 qcreport]
    RPT[报告模板] --> RPTV[模板版本]
    RPTVSAVE[设计器保存 create 或 update] -->|写入侧闸门 规则101_006 画布安全101_009 不合格不落库| RPTV
@@ -1044,6 +1098,9 @@
  hrm_employee ||--o| hrm_user_handover : "离职交接映射"
  qc_report_template ||--o{ qc_report_template_version : "多版本"
  qc_report_template_version ||--o{ qc_report_instance : "冻结出件版本"
  fin_account_subject |o--o{ fin_voucher_entry : "分录按 subject_code 对应科目"
  fin_voucher ||--o{ fin_voucher_entry : "凭证含分录"
  %% fin_fixed_asset 固定资产与 fin_intangible_asset 无形资产为独立资产卡片,靠资产编号自管理,无外键关联,故不上 ER
</pre>
<pre style="display:none" class="mmd-src" data-mmd="11-ai-business-flow">
flowchart TD
@@ -1088,6 +1145,32 @@
  MODE[模型层:通义千问为主·预留DeepSeek/OpenAI/Ollama未实现] --- O2
  NOTE[全项目无Function Calling·AI只输出结构化JSON由业务侧解析] --- J2
</pre>
<pre style="display:none" class="mmd-src" data-mmd="12-finance-flow">
flowchart TD
  A[会计科目 fin_account_subject·一级科目种子约68条] -->|建下级科目 parent_id| B[科目树·list 组装 children]
  B -->|科目取值用 subjectCode 而非 id| C[记账凭证 fin_voucher·留空则自动生成字号]
  C --> D[凭证分录 fin_voucher_entry·逐行科目+借/贷+辅助核算]
  D -->|前端校验·后端复核| E{借贷平衡校验}
  E -->|不平衡或合计为0| E1[拦下·提示出错行与借贷差额]
  E -->|平衡| F[保存·未过账0]
  F -->|可编辑 可过账 可作废 可删除| F
  F -->|过账 post| G[已过账10·不可再修改]
  F -->|作废 cancel| H[已作废20]
  G -->|作废 cancel| H
  H -->|删除 delete| X[删除]
  G -->|只统计已过账凭证明细| I[总账 finance/ledger/general·按期间逐月汇总]
  G -->|只统计已过账凭证明细| J[明细账 finance/ledger/detail·逐条分录并结转余额]
  I --> K[财务报表 / 会计核算看板]
  J --> K
  L[固定资产 fin_fixed_asset·状态 1在用 2闲置 3维修中 4已报废] -->|计提折旧 depreciate·空ids=全量| M[累计折旧递增·净值=原值-累计折旧]
  N[无形资产 fin_intangible_asset·状态 1在用 2已失效 3已摊销完] -->|计提摊销 amortize·空ids=全量| O[累计摊销递增·净值=原值-累计摊销]
  M --> K
  O --> K
  P[ERP 已审核单据 status=20 收款单 付款单 销售订单 采购订单] -->|ErpFinanceStatisticsApi.getMonthlyStatistics 按月| K
  K -.->|科目数 凭证数 未过账 已过账 已作废 资产净值 月度趋势| Q[看板卡片+月度趋势图]
  V[附件中心 recordType=fin_voucher] --- C
  V -.->|不落 file_url 列| C
</pre>
<script type="module">
const DATA = {};
@@ -1107,7 +1190,7 @@
const mmdSrc = {};
document.querySelectorAll('pre.mmd-src').forEach(p=>{ mmdSrc[p.dataset.mmd]=p.textContent.trim(); });
const flowColor = {sales:'var(--c-sale)',purchase:'var(--c-erp)',production:'var(--c-prod)',quality:'var(--c-qc)',warehouse:'var(--c-wm)',aftersales:'var(--c-as)',ai:'var(--c-ai)'};
const flowColor = {sales:'var(--c-sale)',purchase:'var(--c-erp)',production:'var(--c-prod)',quality:'var(--c-qc)',warehouse:'var(--c-wm)',aftersales:'var(--c-as)',finance:'var(--c-fin)',ai:'var(--c-ai)'};
async function boot(){
  DATA.business = await loadJson('business');
@@ -1144,8 +1227,8 @@
  </div>
  <h3 class="sec">业务模块</h3>
  <div class="grid cards">`;
  const targets = {crm:'flow-sales',erp:'flow-purchase',pro:'flow-production',wm:'flow-warehouse',qc:'flow-quality',aftersales:'flow-aftersales',ai:'ai',srm:'flow-purchase',mdm:'objects',dv:'objects',hrm:'objects',bpm:'relation'};
  const accs = {mdm:'var(--c-base)',crm:'var(--c-sale)',srm:'var(--c-sup)',erp:'var(--c-erp)',pro:'var(--c-prod)',wm:'var(--c-wm)',qc:'var(--c-qc)',dv:'var(--c-dv)',aftersales:'var(--c-as)',hrm:'var(--c-hrm)',bpm:'var(--c-bpm)',ai:'var(--c-ai)'};
  const targets = {crm:'flow-sales',erp:'flow-purchase',pro:'flow-production',wm:'flow-warehouse',qc:'flow-quality',aftersales:'flow-aftersales',ai:'ai',srm:'flow-purchase',mdm:'objects',dv:'objects',hrm:'objects',bpm:'relation',finance:'flow-finance'};
  const accs = {mdm:'var(--c-base)',crm:'var(--c-sale)',srm:'var(--c-sup)',erp:'var(--c-erp)',pro:'var(--c-prod)',wm:'var(--c-wm)',qc:'var(--c-qc)',dv:'var(--c-dv)',aftersales:'var(--c-as)',hrm:'var(--c-hrm)',bpm:'var(--c-bpm)',ai:'var(--c-ai)',finance:'var(--c-fin)'};
  DATA.modules.modules.forEach(m=>{
    html += `<div class="card" style="--acc:${accs[m.key]||'#2c5cff'}" data-goto="${targets[m.key]||'panorama'}">
      <h3>${esc(m.name)}<span class="tag">${esc(m.tag)}</span></h3>