{ "counts": { "met": 4, "partial": 88, "missing": 93, "logicGap": 100 }, "chains": [ { "chain": "工程业务流程:查网→制作标书→开标→领取中标通知书→签订总包合同→施工前准备→施工图审查→材料等分包合同→办理施工许可证→季度考评→竣工备案→资料存档", "verdict": "PARTIAL" }, { "chain": "合同流程:供应商入库→取模板合同(IT维护)→线上填写→自动化比对→合约部在线审核→进入OA审批→通知合同专员下载上传盖章电子合同→电子签自动进入盖章系统", "verdict": "LOGIC_GAP" }, { "chain": "资金确认 (项目部向甲方请款→财务资金到账确认→开票→应付/入账凭证)", "verdict": "PARTIAL" }, { "chain": "支付流程:供应商准入→人材机应付资金确认审批→生成待付付款单→财务确认放款(打款)→回写合同已付+自动记账写入财务系统", "verdict": "MET" }, { "chain": "资料流程:项目部(发起,项目发起类目)→办事处(凯迪长沙办公室)→资料室(戴艳兰,p1审批+f2知会)→工程中心(主任n5审批)→法务(法人n8审批)→董事长(f1知会)→档案室(f3知会)。承载模板=后端活体 kaidi-proj-seal-use「项目资料印签使用表单」(前端 src-project-doc-seal.ts),经 WorkflowService 多节点审批引擎跑通到办结。", "verdict": "PARTIAL" }, { "chain": "流程驱动/自动触发:办结(状态迁移)→TriggerRuleEngine.fire()→真实下游写入(付款单/合同生效/项目/用印/供应商/发票)+链式联动(合同→用印, 项目验收→档案)+AutomationLog留痕→前端 /datacenter/automation 可视化;财务记账(confirmPay→autoVoucher)独立闭环。", "verdict": "PARTIAL" }, { "chain": "跨模块数据自动采集(研发申报条件自查 + 研发费用归集证据链自动化)", "verdict": "PARTIAL" }, { "chain": "BOM差异自动核算(物料清单差异自动核算以控制成本)", "verdict": "PARTIAL" }, { "chain": "三系统数据打通(OA / 财务T+ / ERP 数据共享 + 支付中心写入财务/做账数据共享)", "verdict": "PARTIAL" } ], "survivedGaps": [ { "area": "创新研发中心/产品开发部", "module": "1. 产品规划与立项管理", "verdict": "PARTIAL", "gap": "①立项→技术委员会在线评审审批链缺(全库无立项 FormTemplate 种子,控制器不接 WorkflowService);②产品路标(1-3年/版本)无承载页;③产品需求池(收集/分类/优先级)无承载;④立项后自动生成 WBS 任务树+里程碑缺,ProjectTask 手工建且不联动 RdProject。", "severity": "high", "evidence": "RdProjectController.java(/api/oa/rd-projects) 仅纯 CRUD(create 手填 name/budget/stage/progress),无任何 WorkflowService/FormInstance 接入;seed-templates/ 5 个文件无『立项/技术委员会/评审』模板(proj-exec.json 仅中标人员/供应商准入/合同会签/履约进度/验收)。oaModules.ts L316-334 研发菜单无产品路标/需求池页。ProjectTask.java 字段 projectId/title/assignee/status(待办/进行中/已完成)/dueDate/priority,无 WBS 自动派生且 projectId 指向 Project 非 RdProject,无里程碑/甘特字段。", "survives": true, "reNote": "缺口属实。我尽力推翻但四条子项全部成立。①立项→技术委员会在线评审审批链:RdProjectController(/api/oa/rd-projects)是纯CRUD,不注入WorkflowService、不建FormInstance;全库无任何\"产品立项/技术委员会评审\"FormTemplate种子(seed-templates/*.json与TemplateSeedData.java里没有)。前端/rd/project页(project.vue)是扁平MasterDataPage列表+表单,无任何评审环节。唯一沾边的反证是TriggerRuleEngine第126/300行的ruleCreateProject——\"立项/项目发起/项目启动\"办结会自动建台账,且确实有13张category=\"项目发起\"的模板会触发它;但这反证不成立:(a)它建的是通用工程Project(phase=立项),与RdProject实体毫无关联、不回写rdProjectId;(b)那13张\"项目发起\"模板全是施工项目执行单(人员调动/农民工实名制/外管证/银行开户/印签/发票/收款/进度款/成本结算/中标人员/供应商准入/成本合同/履约进度/验收),没有一张是创新研发中心/产品开发部的产品立项+技术委员会评审表。②产品路标(1-3年/版本):前后端全局grep\"路标/路线图/roadmap\"零承载页、零实体。③产品需求池(收集/分类/优先级):grep\"需求池/requirementPool/产品需求\"零承载页、零实体。④立项后自动生成WBS任务树+里程碑:ProjectTask实体只有projectId/title/assignee/status/dueDate/priority六字段(无parentId/wbs/milestone/rdProjectId),且TriggerRuleEngine/ProjectTaskController中无任何从RdProject自动生成任务树的逻辑——ProjectTask确实手工建且不联动RdProject。判定PARTIAL准确。", "reEvidence": "RdProjectController.java(/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/RdProjectController.java)纯CRUD无WorkflowService注入;WorkflowService仅被Mobile/Task/Delegation/FormInstance四控制器引用(grep结果)。立项FormTemplate零种子:seed-templates/proj-aux.json|proj-fund.json|proj-exec.json里category=\"项目发起\"的15张模板名全是施工执行单(项目人员调动/农民工实名制/外管证/银行开户/印签/发票开具/项目收款/进度款支付/成本结算/中标人员/供应商准入/成本合同会签/履约进度/项目验收),无产品立项/技术委员会评审表。TriggerRuleEngine.java:300 ruleCreateProject建的是通用Project(p.setPhase(\"立项\")),不碰RdProject。前端oaModules.ts:311-334 rd模块20页中/rd/project(project.vue)是MasterDataPage扁平CRUD;全src无roadmap/需求池/WBS/技术委员会页(grep仅命中meeting/knowledge的无关mock)。ProjectTask.java字段仅id/projectId/title/assignee/status/dueDate/priority——无parentId/wbs/milestone/rdProjectId。" }, { "area": "创新研发中心/产品开发部", "module": "2. 研发过程管理", "verdict": "PARTIAL", "gap": "①任务百分比填报+交付物上传+自动汇总+超期预警缺;②评审节点(方案/详设/样机/试产)的汇报→提问→投票→结论在线留痕无承载;③问题/缺陷管理(登记/指派/关联BOM)无专门实体页;④研发日报/周报自动生成无实现。", "severity": "high", "evidence": "ProjectTask.java 无 progress 百分比字段(status 仅枚举 待办/进行中/已完成);ProjectTaskController PATCH 仅改这几枚举字段,无超期预警计算。TriggerRuleEngine/WorkflowService 无任何研发评审节点规则。grep 全后端 service 无『技术评审节点/缺陷登记/日报周报』。CountersignVote 仅用于 BOM/审批会签未接研发评审。", "survives": true, "reNote": "缺口属实,四条子项全部确认未实现。尽力推翻但代码无法支撑——研发过程管理在后端只有 ProjectTask(仅 title/assignee/status/dueDate/priority)+ RdProject(手填 progress),前端 rd 模块全部子页为 MasterDataPage + settingListStore 的薄壳清单,无任何评审工作流/缺陷实体/报告生成引擎。①ProjectTask 无百分比字段、无交付物附件、无任务→项目自动汇总、无超期检测;项目 progress 为手填整数。②无评审节点(方案/详设/样机/试产)的汇报→提问→投票→结论承载,prototype.vue 仅样机清单,评审/投票 grep 命中均属 QMS管理评审/专家类型/文化问卷等无关上下文。③无缺陷/defect/问题登记 实体/控制器/页面,bom.vue 为独立BOM清单不与缺陷关联。④无日报/周报自动生成逻辑,annualreport.vue 为手填年报清单,\"研发周报汇总\"仅为知识库 mock 文档标题。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa/domain/ProjectTask.java(无 progress/percent/deliverable 字段)、web/ProjectTaskController.java(仅 GET/POST/PATCH,无汇总/超期)、domain/RdProject.java:46(progress 为手填 int)。前端 ofbiz-framework/plugins/modern-ui/app/src/oa/api/projects.ts:23-31(ProjectTask 接口同样无百分比/交付物)、oa/pages/rd/prototype.vue(MasterDataPage+settingListStore 样机清单,无评审流)、oa/pages/rd/bom.vue(独立 BOM 清单)、oa/pages/rd/annualreport.vue(手填年报)、data/oaModules.ts:312-334(rd 模块导航无评审节点/缺陷管理/日报周报页)。grep 全仓零命中:缺陷/defect 实体、研发日报/周报生成、评审投票结论组件(投票命中仅 culture/survey)。" }, { "area": "创新研发中心/产品开发部", "module": "3. BOM与设计文档管理", "verdict": "PARTIAL", "gap": "前端研发BOM未接真树/MRP/会签,版本控制流与工程变更流程全是手填下拉;物料编码自动生成+查重无;设计文档校对→审核→批准签审流+意见批注缺;文档发放后自动通知采购/生产/质量+旧版回收无联动。", "severity": "high", "evidence": "rd/bom.vue 走 settingListStore('rd-bom')→/api/oa/biz/rd-bom 扁平 mock(字段仅 project/bomLevel/matCode/matName/docVer/status,全下拉手填),未接后端 BomItem 树。后端真 BomItem.java(多级 parentId/unitUsage/signStatus 会签)是『工程量清单/MRP 对比』(注释明确 bidQty/actualQty 工程量、status 超量),非研发 EBOM 版本流(草稿→发布→变更→废止)。DesignDocController 无 signoff/校对/审核/批准多步、无批注、无 notify/发放/回收 字段或端点。无物料编码自动生成+查重。", "survives": true, "reNote": "缺口属实。该缺口针对的是「研发创新中心(rd 模块)」下的 /rd/bom「研发BOM与设计文档」页与 /rd/material 页。逐条核验:(1) 前端研发BOM未接真树/MRP/会签——属实:rd/bom.vue 用 settingListStore('rd-bom') 走通用 /biz/{type} 扁平台账,BOM层级是写死下拉['产品','部件','零件','标准件'],从不调用后端真实的 /bom-items/tree(多级树)、/bom-items/mrp(MRP展开)、/bom-items/{id}/sign(研发→工艺→采购→质量→成本 五签会签)。这些真引擎确实存在于 BomItemController.java,但只被 budget/bom.vue(BOM比对中心,另一模块)消费,研发页一个都没接。(2) 版本控制/工程变更全是手填下拉——属实:docVer 是纯文本、status 是 select['草稿','已发布','已变更','废止'],无流程;真正带 reviewStatus(编制中/校审中/已批准/已归档)的 design.ts API 只被「设计研究中心」design/docs.vue、changes.vue 用,研发模块未用。(3) 物料编码自动生成+查重无——属实:matCode(如 M-2026-0188)在 rd/bom.vue、rd/material.vue 都是自由文本,全后端 grep 无 generateCode/existsByCode/查重 等实现。(4) 设计文档 校对→审核→批准 签审流+意见批注缺——属实:DesignDocController.java 只有 CRUD 五方法(无 sign/approve 端点),无 comment/annotation 实体,reviewStatus 仅靠 PUT 直改下拉。(5) 文档发放后自动通知采购/生产/质量+旧版回收无联动——属实:TriggerRuleEngine.ruleKeyFor 只覆盖 payment/invoice/contract/project/seal/supplier,无任何 design-doc 发放→通知或旧版回收规则。对抗推翻失败:虽有同名后端能力(BomItem真树/MRP/会签、DesignDoc/Change),但均未被 rd 研发模块前端接入,缺口判定 PARTIAL 准确。", "reEvidence": "前端 rd 页(空壳/手填): /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/bom.vue (第5行 settingListStore('rd-bom',...), 第17行 bomLevel 写死下拉, 第12/20行 docVer 纯文本, matCode 自由文本); /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/material.vue。通用台账工厂: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts (走 /biz/{key})。模块归属: data/oaModules.ts 第329-330行(rd/bom、rd/material) vs 第427行(design/docs)。后端真能力但研发未接: oa-backend/src/main/java/com/kaidi/oa/web/BomItemController.java (/tree 第102行、/mrp 第199行、/{id}/sign 第346行、SIGN_ROLES 第47行); 真 design API 仅设计中心用: oa/api/design.ts 仅被 oa/pages/design/docs.vue、changes.vue import。设计文档无签审/批注: web/DesignDocController.java(只 5 个 @*Mapping,全 CRUD,无 sign/approve/comment); domain 无 DocComment/Annotation 实体。无联动: service/TriggerRuleEngine.java ruleKeyFor (第676-689行) 仅 payment/invoice/contract/project/seal/supplier,grep design-doc 发放/通知采购生产质量/旧版回收 全空。" }, { "area": "创新研发中心/产品开发部", "module": "4. 设计变更管理", "verdict": "LOGIC_GAP", "gap": "①变更影响(物料/在制工单/采购订单/库存成品)自动计算+影响分析报告无,impact 纯手填;②按等级(重大/一般/微小)配审批链无 WorkflowService 接入;③变更执行后自动更新BOM/图纸版本+通知采购/生产/仓库的 design.change 联动规则完全缺;④变更追溯(原值→新值/任意时点BOM)无历史表。", "severity": "high", "evidence": "DesignChange.java 字段 docName/projectName/reason/changeType/impact(纯 String 手填)/status;DesignChangeController 纯 CRUD 无 WorkflowService、无影响自动计算。TriggerRuleEngine.fire() 关键词矩阵仅 付款/用印/收款/验收/供应商/合同/立项,无 design.change 联动;grep service 层无 designChange/工程变更 规则。无变更历史版本表(仅单条 impact 字段被 update 覆盖)。", "survives": true, "reNote": "尽力推翻未果,缺口四点全部属实。设计变更模块从实体到控制器到前端均为裸 CRUD,无任何变更影响计算、等级审批链、design.change 联动、变更追溯历史。①impact 纯手填:DesignChange.java 中 impact 是普通 String 字段,前端 changes.vue 的 createFields 里 impact 是自由文本输入({ id: 'impact', label: '影响说明' }),无任何向物料/在制工单/采购订单/库存成品的自动计算,无影响分析报告,全代码库 grep 不到 computeImpact/analyzeImpact/designChangeId/DesignChangeImpact。②无等级审批链:实体无 grade/等级字段,DesignChangeController 仅 list/get/create/put/delete,create 时 status 直接默认\"申请\"或取请求体,完全不经 WorkflowService;TriggerRuleEngine 与 WorkflowService 中 grep 不到任何 design 相关。③design.change 联动完全缺:TriggerRuleEngine 只注册了 payment.create/contract.effectivate/contract.toSeal/project.create/project.accept/seal.markUsed/supplier.admit,ruleKeyFor 映射表无任何 design.change,变更执行(status→已实施)不触发 BOM/图纸版本更新,不通知采购/生产/仓库。④无变更追溯历史表:domain 目录下只有一个 DesignChange.java(对照 ContractChange 也无对应 History),无原值→新值/任意时点 BOM 的历史实体,update 直接覆盖字段不留痕。活体验证:design-changes 返回字段仅 id/docName/projectName/reason/changeType/impact/status/applicant/createdAt,/design-changes/1/history 与 /design-changes/1/impact 均 404。", "reEvidence": "后端实体 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/DesignChange.java(impact 为普通 String,无 grade/版本/历史字段);控制器 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/DesignChangeController.java(纯 CRUD,create 第71行 status 默认\"申请\",不接 WorkflowService);仓储 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/repository/DesignChangeRepository.java(仅 findByStatus);联动引擎 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java(ruleKeyFor 第676-686行无 design.change);WorkflowService.java grep 无 design 命中;前端 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/changes.vue(impact 为自由文本输入字段)与 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/design.ts(仅 list/create/update/delete);活体 http://127.0.0.1:8091/api/oa/design-changes 字段集仅基础列,/history 与 /impact 端点均 HTTP 404。" }, { "area": "创新研发中心/产品开发部", "module": "5. 样机试制与测试验证", "verdict": "PARTIAL", "gap": "①样机需求→生成试制工单并关联 WorkOrder/车间(工单进度/物料领用/工时)未接;②样机物料走研发采购通道关联项目预算无;③测试计划与执行(功能/性能/可靠/安规/环境)在线记录数据+缺陷自动进问题管理缺;④样机库存(序列号/借用/归还/报废)无;⑤第三方认证(CCC/CE/UL/检测机构/报告/证书有效期)全库无承载页。", "severity": "high", "evidence": "rd/prototype.vue 走 settingListStore('rd-prototype') 扁平 mock(字段 name/project/qty/purpose/result/owner/testDate),与 WorkOrder 实体零关联,测试结果仅单字段 result。grep 全前端 src 无 CCC/CE/UL/送检/认证管理/样机库存/试制工单/缺陷登记(唯一 竞品 命中在 intel.ts 情报中心,无关)。", "survives": true, "reNote": "尽力推翻未果,缺口属实(PARTIAL)。该模块仅有一个薄壳台账页 prototype.vue,五个深度子点全部缺失,无任何后端专用承载。逐条核验:\n\n① 样机需求→试制工单关联 WorkOrder/车间(工单进度/物料领用/工时): prototype.vue 用 settingListStore('rd-prototype') 走通用 /api/oa/biz/{type} 行级台账,字段仅 name/project/qty/purpose/result/testDate/owner。WorkOrderController/WorkOrder 实体纯属制造管理中心(productName=生物质有机肥/复合微生物肥等),无 projectId、无 prototype 关联、无物料领用/工时字段,prototype 页不生成任何工单。未接,属实。\n\n② 样机物料走研发采购通道关联项目预算: material.vue(rd-material)同为扁平 biz_record 台账,字段 matName/spec/purpose/applicant/project/status,status 只是文本枚举(待审/已转采购…),无任何 Budget/项目预算实体关联、无真实采购单生成。无,属实。\n\n③ 测试计划与执行(功能/性能/可靠/安规/环境)在线记录+缺陷自动进问题管理: prototype 页 result 仅单个下拉(合格/不合格/进行中),无测试计划/测试项/逐项执行记录结构。grep 前端 rd 目录 测试计划/可靠性/安规/缺陷管理 全空。QmsRecord(问题管理)与样机测试无任何联动,TriggerRuleEngine 无 prototype→qms 规则。缺,属实。\n\n④ 样机库存(序列号/借用/归还/报废): InventoryItem 实体字段为 materialName/category/spec/unit/quantity/safetyStock/location/status,无 serialNo/借用人/归还/报废态;前端 grep 序列号/借用/归还/报废 全空。无,属实。\n\n⑤ 第三方认证(CCC/CE/UL/检测机构/报告/证书有效期)承载页: Certification 实体与 Controller 类注释明确限定为三体系认证(ISO9001/14001/45001/安全生产标准化/施工资质),活体 /api/oa/certifications 仅返回 ISO 三体系记录,无 CCC/CE/UL/检测报告/证书附件承载;前端无第三方产品认证页(grep 命中仅 FilePreview.vue 无关)。全库无承载页,属实。", "reEvidence": "前端薄壳页: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/prototype.vue (settingListStore('rd-prototype'),7个扁平字段,result单下拉无测试计划/缺陷结构) ; ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/material.vue (rd-material 扁平台账,无预算/采购单关联)。\n通用台账工厂: ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts (走 /api/oa/biz/{type} 行级 biz_record,无领域逻辑)。\n后端反证: oa-backend/src/main/java/com/kaidi/oa/web/WorkOrderController.java + domain/WorkOrder.java (制造中心工单,无 projectId/prototype 关联/物料领用/工时) ; domain/InventoryItem.java (无 serialNo/借用/归还/报废) ; web/CertificationController.java + domain/Certification.java (类注释限定三体系认证 ISO9001/14001/45001/安全生产标准化/施工资质,无 CCC/CE/UL/检测报告) ; domain/QmsRecord.java (与样机测试无联动)。\ndept-view 自标: src/data/kaidiDeptView.ts 第7行将\"样机试制与测试验证\"标 status:built→/rd/prototype,但实为薄壳,深度不符。\n活体证据: POST /api/oa/auth/login 取 token 后 GET /api/oa/biz/rd-prototype 返回 data:[] (扁平台账) ; GET /api/oa/certifications 仅返回 ISO9001/14001/45001 三体系记录,无任何 CCC/CE/UL 第三方产品认证。\ngrep 全空: 前端 src/oa/pages/rd 下 测试计划|测试执行|可靠性|安规测试|缺陷管理|借用|归还|报废|序列号 零命中;前端 CCC|CE认证|UL认证|检测机构|第三方认证 仅命中无关 FilePreview.vue。" }, { "area": "创新研发中心/产品开发部", "module": "6. 研发物料与采购协同", "verdict": "PARTIAL", "gap": "①研发物料库与量产物料的区分管理无(masterdata 无研发物料维度);②研发采购申请审批后自动转采购无(状态靠手改);③供应商样品管理(送样/规格/测试结果/合格转量产)无承载页。", "severity": "med", "evidence": "rd/material.vue 走 settingListStore('rd-material') 扁平 mock(字段 matName/spec/purpose/applicant/project/status,status 含『已转采购』为手选下拉),无审批流也无向采购模块自动流转。grep masterdata/ 无 研发物料/样品/手板/开发板/rdMaterial 维度。全库无供应商样品管理页。", "survives": true, "reNote": "尽力推翻失败——三条子缺口均属实,找不到任何实现可反驳。①研发物料库与量产物料无区分维度:唯一的物料主数据是后端 domain/InventoryItem.java,category 只有「原料/半成品/成品/辅料」,status 只有「正常/低于安全线/超储」,无任何\"研发料/量产料\"维度;masterdata 中心前端页(masterdata/*.vue)无物料页,供应商页 category 只有「材料/设备/劳务/服务」。研发侧的 rd/material.vue 只是一个 settingListStore('rd-material',...) 的通用 KV/biz_record 台账(走 /biz/{key} 的 schemaless 行存),与主数据中心完全脱节,不构成\"研发物料库 vs 量产物料\"的受控区分。②研发采购申请审批后自动转采购确实靠手改:rd/material.vue 的 status 是一个手动 select(待审/已转采购/已到货/已退回),由 store.update 直接写库;下游联动引擎 service/TriggerRuleEngine.java 的 ruleKeyFor 全量分支只有 payment.create/receipt.invoice/contract.effectivate/contract.toSeal/project.create/project.accept/project.toArchive/seal.markUsed/supplier.admit,无任何 material/采购申请/requisition/研发采购 触发;BizRecordController 的 update 也无任何 trigger/convert/采购 逻辑。即审批办结不会自动把研发物料申请转成采购,状态纯人工切换。③供应商样品管理(送样/规格/测试结果/合格转量产)无承载页:全前端 grep「送样/供应商样品/样品规格/合格转量产/转量产」零命中(仅 rd/prototype.vue 有'测试结果',但那是研发\"样机试制\"页面,非\"供应商送样\",且无送样/合格转量产字段);后端 sample 命中全是 LabSample 水/泥/气检测样品(DataSeeder 实验室中心),与供应商送样无关;web/ 下无 purchase/procure/requisition/material 控制器。三条缺口成立,PARTIAL 判定正确。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/InventoryItem.java(category=原料/半成品/成品/辅料,无研发维度); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/material.vue(status 手动 select,settingListStore('rd-material') 纯KV台账); ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts(走/biz/{type}行存,无任何触发); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:676-689(ruleKeyFor 全量分支无 material/采购申请/转采购); oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java(update 无 trigger/convert); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/supplier.vue(供应商无样品字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/prototype.vue(样机试制非供应商送样); 全前端 grep「送样/供应商样品/合格转量产」=0 命中; web/ 下无 purchase/procure/requisition/material 控制器" }, { "area": "创新研发中心/产品开发部", "module": "7. 研发成本与预算", "verdict": "LOGIC_GAP", "gap": "①成本归集从工时/采购/报销自动采集无,对比预算/超预算预警在 RdExpense 层无;②产品标准成本据 BOM 和工艺路线自动计算未实现(手填),设计阶段目标成本法预估缺。", "severity": "high", "evidence": "RdExpenseController.create 手填 rdProjectId/category/amount,无跨模块采集。EvidenceController.evidenceChain 仅 rdExpenseRepo.findByRdProjectId 累加(注入 RdExpense/Patent/Declaration 三库,无 Worktime/Payment/采购/报销源)。StandardCost.java 注释自承认『当前实现为手填+自动汇总框架』,totalStandard=料+工+费仅服务端相加,未据 BOM/工艺路线自动算。预算超支预警在独立 budget/board.vue 基于 Budget 实体,与 RdProject.budget 不打通。", "survives": true, "reNote": "缺口属实,两部分均确认未实现,且代码自身注释明确承认为\"手填+框架实现\"。①RdExpense 层无自动采集、无预算比对/超预算预警:RdExpenseController.create/update 仅接收请求体手填 amount,无任何从工时/采购/报销自动归集逻辑;RdExpenseController 与 RdExpense 实体对 Budget 零引用(grep 无 budget/超支/预警);TriggerRuleEngine 对\"报销/费用\"办结仅生成一张待付付款单,从不回写 RdExpense 也不比对预算。超预算判定(status=超支)仅存在于独立的 BudgetController.create,比较的是 Budget 自身手填的 actualAmount vs budgetAmount,与 RdExpense 层完全无关。②产品标准成本据 BOM+工艺路线自动计算未实现:StandardCostController.recompute 只做 totalStandard=料+工+费 三项手填值求和,控制器对 BomItemRepository 零引用;StandardCost 实体无任何 BOM/产品结构关联字段;全代码库 grep \"工艺路线/routing/ProcessRoute\" 无任何命中——工艺路线根本不存在;前端 standardcost.vue 注释\"前端只手填料/工/费/实际成本\";无 目标成本/targetCost 设计阶段预估。DataCenter/BusinessBi 对 BomItem/StandardCost 仅做 count() 或量价聚合,非由 BOM 推算产品标准成本。现存\"自动\"仅是对已手填数字的服务端求和与只读上卷聚合,不等于所声称的跨源自动采集或 BOM/工艺路线标准成本核算。已尽力推翻但无法推翻。", "reEvidence": "后端:oa-backend/src/main/java/com/kaidi/oa/web/RdExpenseController.java(L64-98 手填amount,无预算引用); web/StandardCostController.java(L70-75 recompute=料+工+费求和; L34-35 Javadoc自承\"当前为手填+服务端自动汇总的框架实现\",无BomItemRepository); domain/StandardCost.java(L20-21 自承手填框架,无BOM字段); web/BudgetController.java(L84-88 超支判定仅在Budget自身,与RdExpense无关); service/TriggerRuleEngine.java(L144-164 报销/费用仅生成付款单,不写RdExpense不比预算); web/BomAnalysisController.java(仅BOM量价超支聚合,不产出产品标准成本). 全库grep \"工艺路线|routing|ProcessRoute\" 零命中。前端:ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/standardcost.vue(L4 \"前端只手填料/工/费/实际成本\"; L14 \"手填+服务端自动汇总的框架实现\")。" }, { "area": "创新研发中心/产品开发部", "module": "8. 研发知识库", "verdict": "PARTIAL", "gap": "①技术文档库(规范/指南/checklist/经验教训+全文检索)无研发专属承载;②研发创新点→触发专利申请流(交底书对接知产部)无自动触发,技术秘密无单独承载;③竞品分析库(拆解/性能对比)全库无承载页;④标准化模块库(可复用电路/结构/软件组件+引用)无实现。", "severity": "med", "evidence": "无研发专属技术文档库页(仅通用知识社区 knowledge)。PatentController grep 无 trigger/workflow/交底/知识产权部/FormInstance——Patent 仅登记 CRUD,研发创新点→触发专利申请流程缺。grep 全前端无 竞品分析库/标准化模块库 承载(竞品仅命中 intel.ts 情报中心)。", "survives": true, "reNote": "缺口属实,四个子项全部找不到对应实现。研发创新中心(rd)模块的菜单/路由由 oaModules.ts:316-334 唯一驱动(router/index.ts 用 import.meta.glob 严格按 children 自动映射),其 children 仅含 研发立项/知识产权/项目申报/政策库/申报进度/专家库/申报模板库/研发费用归集/创新看板/样机试制/技术标准申请/制度版本/科技成果/研发BOM/研发物料/年费预警/IP合规/科技年报/IP外部监控——没有任何\"研发知识库/技术文档库/竞品分析库/标准化模块库\"承载页。逐项核实:①技术文档库(规范/指南/checklist/经验教训+全文检索)无研发专属承载——只有公司级通用 knowledge(知识社区)模块带一个全文检索开关设置(libmgr.vue:535 的 fullTextSearch switch)和知识地图把'研发规范'当作一个标签(map.vue:91),并非研发中心专属、按规范/指南/checklist/经验教训分类的技术文档库;②研发创新点→专利触发流:PatentController 是纯CRUD,rdProjectId 仅为可空的手填外键字段,无自动触发;TriggerRuleEngine 只有 payment/contract/project/seal/supplier 五类 ruleKey(无 patent/交底);domain/与 web/ 下不存在 交底书(disclosure)或技术秘密(tradesecret)实体;③竞品分析库:'竞品'仅作为统一情报中心(Intel)的外部资讯类别'竞品动态'存在(Intel.java、intel.ts INTEL_CATEGORIES),不是带拆解/性能对比的研发竞品分析库,全库无该承载页;④标准化模块库:rd/standard.vue 是'技术标准申请'(国标/行标/团标对外申报),并非可复用电路/结构/软件组件库,全前后端无'可复用/组件库/复用电路'相关页面。无法推翻该缺口。", "reEvidence": "前端模块定义 oaModules.ts:316-334(rd children 无四项); 路由机制 router/index.ts:18-44(import.meta.glob 严格按 oaModules children 映射); rd 页面目录仅含 standard.vue=技术标准申请(对外标准申报,非组件库)、bom.vue=研发BOM与设计文档、patent.vue=知识产权纯CRUD; PatentController.java:59-81(rdProjectId 手填可空外键,无触发); TriggerRuleEngine.java:148/240/301/324/376/410(ruleKey 仅 payment/contract/project/seal/supplier,无 patent/交底); 后端 domain/与 web/ grep disclosure|交底|技术秘密|竞品|拆解|可复用 仅命中 Intel.java/IntelController.java(竞品动态外部资讯类别); 全前端 pages/components grep 技术文档库|竞品分析|标准化模块|可复用组件|交底书|技术秘密|拆解|性能对比 无命中(仅 meeting/mockData 无关命中); knowledge 模块 libmgr.vue:535 仅一个全文检索开关、map.vue:91 仅'研发规范'标签,属公司级通用知识社区非研发专属技术文档库。" }, { "area": "创新研发中心/产品开发部", "module": "9. 与其他部门协同接口", "verdict": "LOGIC_GAP", "gap": "各接口数据自动流转/反馈回流缺:①量产BOM/图纸/工艺→生产、试制工单回收均未联动;②测试报告/质量问题/认证申请→质量部无自动推送;③研发费用/成本→财务手录非自动;④专利交底书→知产、产品需求←销售、改进需求←售后 均无接口实现。", "severity": "med", "evidence": "TriggerRuleEngine 联动矩阵无任何研发→生产/质量/财务/知产 规则(仅 payment/contract/project/seal/supplier/invoice)。BOM 前端 bom.vue 走 mock 未接后端树;prototype.vue 与 WorkOrder 无关联(试制工单非样机自动生成);RdExpense 手录非自动归集;PatentController 无交底书接口。board.vue 链6 仅 getEvidenceChain 只读聚合(RdProject↔Patent↔Declaration),非双向协同接口。", "survives": true, "reNote": "缺口属实。研发创新中心与其他部门的接口数据自动流转/反馈回流全部缺失,相关控制器均为各自独立的纯 CRUD,唯一的跨模块下游联动引擎 TriggerRuleEngine 仅覆盖付款/发票/合同/用印/项目/供应商六类规则,对研发链上的任何实体(RdProject/RdExpense/Patent/DesignDoc/BomItem/WorkOrder/QmsRecord/Certification)均无任何路由或写回。逐项核实:①量产BOM/图纸/工艺→生产、试制工单回收:WorkOrderController 仅在 status=已入库 时自动生成成品库存(生产→仓库),不接收 BomItem/DesignDoc 的下推,也不回写 RdProject;BomItem 的研发→工艺→采购→质量→成本五签只是 BOM 比对模块内部多角色会签,不向制造推送。②测试报告/质量问题/认证申请→质量部:QmsRecordController、CertificationController 均纯 CRUD、只注入自身 repo,无任何来自研发的自动推送。③研发费用/成本→财务:RdExpenseController 纯 CRUD、只注入 expenseRepo,从不生成 Voucher/Payment/Budget,WorkflowService 也不路由研发费用单。④专利交底书→知产、产品需求←销售、改进需求←售后:Patent 仅有 rdProjectId 外键字段但无从研发自动建专利(无交底流程);售后/改进需求/产品需求/交底/disclosure 在后端逻辑中完全不存在(试制/量产 仅作为 DataSeeder 种子文本出现)。前端 rd 模块同样无任何跨部门自动流转(\"interface\" 命中全是 TS 接口声明)。判定无误,可推翻失败。", "reEvidence": "TriggerRuleEngine.java:94-139 fire() 只匹配 付款/用印/收款/验收/供应商/合同/立项 关键词,无任何研发/专利/图纸/工艺/质量/认证/生产工单分支;service/WorkflowService.java:562 是唯一调用点,且 grep 研发|专利|图纸|工艺|认证|WorkOrder|RdProject|Patent|QmsRecord 在 WorkflowService 中零命中。WorkOrderController.java:92-145 autoInventory 仅生产→仓库,不涉研发;只注入 workOrderRepo+inventoryItemRepo。RdExpenseController.java 全文纯 CRUD 只注入 expenseRepo(line 33)。QmsRecordController.java、CertificationController.java、PatentController.java、DesignDocController.java 均纯 CRUD 只注入各自 repo。BomItemController.java:47 五签 SIGN_ROLES 为模块内会签、无 WorkOrder 推送。grep 试制|量产|交底|售后|改进需求|产品需求|disclosure 全后端仅命中 seed/DataSeeder.java 的文本字符串(1960/2178/2184/2190/2234 行),无任何逻辑实现。" }, { "area": "创新研发中心/产品开发部", "module": "10. 报表与决策支持", "verdict": "PARTIAL", "gap": "①研发项目仪表盘缺进度/预算执行率/问题数/变更次数综合维度;②研发投入按产品线/委外维度统计报表无;③产品上市统计(数量/周期/成功率)无承载;④变更原因统计(设计错误/成本优化/客户要求)无——DesignChange 无原因归类统计报表。", "severity": "med", "evidence": "board.vue 仅统计 rdProjects.length/已授权知产/申报进行中/已立项资助 + 按 RD_STAGES 分阶段 + 按 PATENT_TYPES 知产构成 + 链6 项目↔专利数/申报数。无进度/预算执行率/问题数/变更数维度(因 ProjectTask 无百分比、DesignChange 无原因归类、问题管理本身缺)。RdExpense 有 category 但无产品线/委外维度统计报表。", "survives": true, "reNote": "缺口属实,四个子项全部确认未实现,无法推翻。①研发项目仪表盘:board.vue (src/oa/pages/rd/board.vue) 只算 项目数/已授权知产/申报进行中/已立项资助/按阶段/按知产类型/转化链 七个维度,没有\"进度+预算执行率+问题数+变更次数\"综合维度;且 RdProject 实体(domain/RdProject.java)只有 budget 一个金额字段,无实际支出/已用金额列,预算执行率在数据层就无从计算,更无 issue/change 关联计数。②研发投入按产品线/委外维度统计:RdProject 无产品线、无委外(outsourc)字段,全前后端 grep '产品线/委外' 在 rd/ 与后端 web/ 内零命中,无此报表。③产品上市统计(数量/周期/成功率):grep '上市/successRate/launchCycle' 在 rd/ 与后端零命中,无任何承载页或字段。④变更原因统计:DesignChange.reason 是自由文本 String,无归类枚举;DESIGN_CHANGE_TYPES=['设计变更','技术核定','工程洽商'] 是\"变更类型\"而非\"变更原因(设计错误/成本优化/客户要求)\",DesignChangeController 纯 CRUD、DesignChangeRepository 仅 findByStatus,无任何按原因 group/count 的统计报表。三个后端控制器(RdProject/RdExpense/DesignChange)均为纯 CRUD,无 stat/summary/dashboard/聚合端点;三个 Repository 均无 @Query 聚合。报表中心 report/analysis.vue 与 annualreport.vue 也不覆盖这四项(annualreport 是税务/高企申报表台账,非投入分析)。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/RdProjectController.java(纯CRUD), RdExpenseController.java(纯CRUD), DesignChangeController.java(纯CRUD,无统计); domain/RdProject.java(无产品线/委外/上市/实际支出字段,line 28-50), domain/DesignChange.java(reason为自由文本String,line 28); repository/RdProjectRepository.java/DesignChangeRepository.java/RdExpenseRepository.java(均仅简单findBy,无@Query聚合)。前端: src/oa/pages/rd/board.vue(仪表盘仅7维度,line 50-76,无预算执行率/问题数/变更次数), src/oa/pages/rd/project.vue(纯CRUD列表), src/oa/pages/design/changes.vue(纯CRUD,reason为普通列), src/oa/api/design.ts(line 33 DESIGN_CHANGE_TYPES=类型而非原因)。grep '产品线|委外|上市|successRate|launchCycle|预算执行率|变更原因|变更次数|问题数' 在 src/oa/pages/rd/ 与 oa-backend web/ 内对R&D全部零命中(命中仅出现在budget/report/crm等无关模块)。" }, { "area": "创新研发中心/申报服务部", "module": "1. 政策与申报计划管理", "verdict": "LOGIC_GAP", "gap": "匹配仅标签contains不读企业真实画像;无政策到期自动下架(Alert不扫Policy);无定期自动推送;无申报计划编制+审批+进度跟踪实体;任务分解无甘特图。", "severity": "high", "evidence": "PolicyController.java:145-167 match() 仅做静态标签 haystack.contains(tag) 命中计数+到期日排序;画像 resolveProfile() 读 setting policy-company-profile 的纯字符串标签数组(DEFAULT_PROFILE=高企/专精特新/软件...),不读行业/规模/知识产权数量/研发投入/人员结构等真实企业数据(代码注释55行明承认'生产应按资质年限/规模/行业打分')。AlertController.aggregate():104-204 仅扫 PersonnelCert/Patent/ContractMilestone/InventoryItem/LabInstrument/SafetyCheck/FormInstance/Budget,无 Policy 仓库注入(构造器42-67不含 PolicyRepository),无 Policy.deadline 到期自动下架。AlertScheduler.pushAlerts():74-77 复用同一 aggregate()+overtime+证件,无政策定期推送。WorkPlanController 仅 草拟/已审阅/已退回 通用计划,grep 无'申报|甘特|gantt|预期收益|责任部门',无年度/季度申报计划编制实体、无甘特图。", "survives": true, "reNote": "复合 LOGIC_GAP,5 条子断言中 4 条完全属实、1 条部分成立,整体缺口成立(real=true)。无法推翻。逐条:\n\n(1) 匹配仅标签contains不读真实画像 —— 属实。PolicyController.match() 做的是 haystack.contains(tag),haystack=政策tags+title 小写拼接,profile 只是一串扁平关键词(来自 setting policy-company-profile 或 DEFAULT_PROFILE=高企/专精特新/软件/环保/水务/研发)。全程不读任何企业实体(资质年限/规模/行业/营收/认定状态),无打分模型。代码自己的 Javadoc 都承认\"当前为标签关键词命中数+到期排序的简化框架...生产应按资质年限/规模/行业打分\"。\n\n(2) 无政策到期自动下架(Alert不扫Policy) —— 属实。AlertController.aggregate() 扫了 PersonnelCert/Patent/ContractMilestone/Inventory/LabInstrument/SafetyCheck/FormInstance/Budget 八类,唯独不含 Policy(grep Policy 在该文件为空)。没有任何 scheduler/service 按 deadline 把 Policy 状态自动置为\"已截止\";setStatus 全是 create/update 里人工赋值。match() 虽会跳过\"已截止\",但没有任何代码自动把过期政策置为该态——纯人工维护。\n\n(3) 无定期自动推送 —— 属实。全工程唯一 @Scheduled 是 AlertScheduler.pushAlerts()(只刷证件到期+审批超时实例),task/ 与 service/ 中对 Policy 零引用。匹配只能按需 GET /policies/match 触发,无定时把匹配结果推给企业。\n\n(4) 无申报计划编制+审批+进度跟踪实体 —— 部分不成立但\"计划\"实体确缺。确有进度/工作流实体: PolicyApplication(申报中→已受理→已立项→已拨付→已结题 五态状态机 + timelineJson 时间线 + 已驳回旁路)、Declaration + DeclarationStep(8 步生命周期, status 待办/进行中/已完成, 前端 declsteps.vue\"申报进度\"页)。但没有专门的\"申报计划编制+审批\"计划实体(年度申报计划+审批流);WorkPlan 是通用工作计划(待提交→待审阅→已审阅审阅流)不是申报计划专用。故\"进度跟踪\"已有、\"申报计划编制+审批\"实体确缺,这条多数成立。\n\n(5) 任务分解无甘特图 —— 本模块属实。甘特图仅存在于 goal/project.vue(ganttRows + gp-gantt)。研发申报步骤页 declsteps.vue 是纯 MasterDataPage 表格(列: 申报项目/步序/步骤/状态/负责人/计划完成),无甘特/时间轴可视化。\n\n综合: 5 条中(1)(2)(3)(5)铁证属实,(4)部分成立,无一条能被推翻,缺口属实。", "reEvidence": "PolicyController.match() oa-backend/src/main/java/com/kaidi/oa/web/PolicyController.java:145-167 (haystack.contains(tag) + 扁平 profile, Javadoc 自承\"简化框架...生产应按资质年限/规模/行业打分\" L38-41); DEFAULT_PROFILE L47. AlertController.aggregate() oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:98-210 扫8类不含 Policy(grep Policy 该文件空). 唯一 @Scheduled: AlertScheduler.pushAlerts() oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java:72-80(只刷cert+超时实例); task/ service/ 对 PolicyRepository 零引用. Policy.setStatus 仅 PolicyController create/update 人工(L101,122)无 deadline 自动下架. 进度实体确有: DeclarationStep.java(8步 status 待办/进行中/已完成) + DeclarationStepController.java + 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/declsteps.vue(\"申报进度\"纯表格无甘特); PolicyApplicationController.java:32-47(5态状态机+timeline). 甘特图仅 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/project.vue:117-414(ganttRows/gp-gantt), rd 模块无." }, { "area": "创新研发中心/申报服务部", "module": "2. 申报项目管理(全过程)", "verdict": "LOGIC_GAP", "gap": "自动采集仅研发费用+专利;无财务/HR/IP法律状态/业绩采集;条件自查/差距分析完全缺失,autoCheckRules从不评估;协同编制未打通;内部审核非审批流;外部提交账密加密/电子签章/政务对接缺;补正答辩未建模;失败案例库仅status。", "severity": "high", "evidence": "DeclarationStepController.autoCollect():102-129 自动采集只对单一 declaration.rdProjectId 累加 RdExpense.amount 与 count Patent,注入的仓库仅 rdExpenseRepo/patentRepo——无财务(审计/辅助账/高新收入/纳税/所得税)、HR(社保/个税/学历/占比)、IP法律状态、项目业绩采集。全仓 grep '社保|个税|学历|审计报告|纳税|科技人员占比' 在 web/service 仅 PersonnelCert 一行注释。条件自查/差距分析: grep '达标|不达标|差距|条件自查|改进建议' 命中均为 DataSeeder 假数据与 WaterQuality,无评估逻辑;DeclarationTemplate.autoCheckRules 仅 String 字段(domain:37,90)被存取从不被求值。材料协同/版本/批注/安全链接未与申报打通。内部审核无会签链(DeclarationStep 仅手填 status,无 WorkflowService 触发)。grep '电子签章|政务平台|科技部|账号密码加密' 零命中。grep '失败案例|未通过原因|rejectReason' 零命中——失败仅 Declaration.status='未通过'。补正/答辩仅 DeclarationStep stepName 可叫'补正答辩'但无建模。", "survives": true, "reNote": "缺口属实,逐条均验证成立,无法推翻。本模块只是\"数据登记表+静态步骤行+一个最弱采集端点\",所有\"全过程\"能力都缺真实逻辑。逐条核对:\n\n1) 自动采集仅研发费用+专利:DeclarationStepController.autoCollect 只累加 RdExpense 金额、计数 Patent,无财务/HR/IP法律状态/业绩任何采集来源。\n\n2) autoCheckRules 从不评估:DeclarationTemplate.autoCheckRules 仅在 create 与 DataSeeder 写入,全工程无任何处读取 getAutoCheckRules() 做判定;grep selfCheck/gapAnalysis/差距分析/条件自查 在前后端均零命中——条件自查/差距分析完全缺失,确认。\n\n3) 协同编制未打通:'材料协同'仅是 DeclarationStep.stepName 的静态字符串(种子里写死状态),未与 CollabDoc/CollabSocketHandler 关联。\n\n4) 内部审核非审批流:WorkflowService.java、TriggerRuleEngine.java 对 Declaration 零引用,'内部审核'只是步骤状态串(待办/进行中/已完成),不经审批引擎。\n\n5) 外部提交缺账密加密/电子签章/政务对接:grep esign/电子签章/encrypt/政务对接/govSubmit 后端零命中,'外部提交'同为静态步骤名。\n\n6) 补正答辩未建模:'补正答辩'仅 DeclarationStep 第7个步骤名字符串,无独立实体/字段/逻辑。\n\n7) 失败案例库仅 status:无任何 Failure/Case 域实体;Declaration 实体仅有 name/program/authority/amount/deadline/status/owner,status 取值含'未通过',但无 rejectReason/失败原因/分析字段、无 repository 查询、无前端页面。\n\n前端 declaration.vue 仅为 MasterDataPage 通用 CRUD 表格,连步骤生命周期/auto-collect 都未呈现;rd.ts 只封装 /declarations 增删改查,无 declaration-steps/auto-collect 调用。", "reEvidence": "oa-backend/.../web/DeclarationStepController.java:102-129 (autoCollect 仅 RdExpense+Patent); oa-backend/.../web/DeclarationTemplateController.java:71 与 seed/DataSeeder.java:2136 (autoCheckRules 只写不读); oa-backend/.../domain/DeclarationTemplate.java:90-96 (getAutoCheckRules 全工程无评估调用方); oa-backend/.../domain/Declaration.java:22-44 (仅基础字段,无失败案例/补正字段); oa-backend/.../domain/DeclarationStep.java:11-39 (步骤=静态 stepName+status 串); oa-backend/.../seed/DataSeeder.java:3210-3231 (8步骤仅写死状态串,含'内部审核/外部提交/补正答辩'); service/WorkflowService.java 与 service/TriggerRuleEngine.java 对 Declaration 零引用; 前端 .../oa/pages/rd/declaration.vue:30-47 (纯 CRUD 表格); .../oa/api/rd.ts:105-116 (仅 declarations 增删改查); grep selfCheck/gapAnalysis/差距分析/条件自查/电子签章/esign/encrypt/补正/失败案例 在前后端关键逻辑处均零命中。" }, { "area": "创新研发中心/申报服务部", "module": "3. 申报后维护与跟踪", "verdict": "MISSING", "gap": "无资质/项目维护任务自动生成;资金拨付只改状态+回填金额无下游联动;无验收任务自动生成与材料编审;无绩效统计与后评估。", "severity": "high", "evidence": "TriggerRuleEngine.java rule keys(678-686)仅 payment.create/receipt.invoice/contract.effectivate/contract.toSeal/project.create/project.accept/project.toArchive/seal.markUsed/supplier.admit——无任何 declaration/policy/资质维护/年报/复审触发。PolicyApplicationController.advance():165-195 进入'已拨付'仅 setGrantedAmount(appliedAmount),grep 该控制器 'payment|finance|入账|拨付通知|Voucher|trigger' 零命中——无财务入账通知、无提醒支付合作单位、无提取项目支出预算下游。无验收任务自动生成(项目验收 project.accept 是 Project 链不是 Declaration)。无绩效/后评估(直接/间接收益)聚合。", "survives": true, "reNote": "缺口属实,四条子项全部确认未实现。尝试推翻失败。\n(1) 资质/项目维护任务自动生成:CertificationController 纯 CRUD + 读时按 expireDate 派生状态(有效/即将到期/已过期);AlertScheduler 每小时仅刷新 PersonnelCert 到期状态并聚合预警,不生成任何\"维护任务\"。全后端无 ProjectTask/Task 由资质或项目自动派生维护任务的代码。\n(2) 资金拨付只改状态+回填金额无下游联动:PolicyApplicationController.advance 推进到「已拨付」时仅 setStatus + setGrantedAmount(回填 appliedAmount),控制器只注入 appRepo/policyRepo——不持有 Payment/FundPool/Task 仓库,也不调 TriggerRuleEngine,确无任何下游写入。FundPool 仅是 Contract+Payment 的内存聚合,根本不读 PolicyApplication.grantedAmount。\n(3) 无验收任务自动生成与材料编审:DeclarationStep 生命周期枚举(立项/材料协同/数据采集/内部审核/外部提交/进度跟踪/补正答辩/结果登记)无\"验收\"步,且步骤靠 POST /declaration-steps 手工建(create 必填 stepName)。唯一自动项 autoCollect 是申报前的\"数据采集\"(汇总研发费用/专利数,属链6尾),非申报后验收。TriggerRuleEngine.ruleAcceptProject 只在 FormInstance 办结按关键词触发,与申报域完全脱钩。\n(4) 无绩效统计与后评估:全后端 grep 绩效统计/绩效评估/后评估/postEvaluation 零命中;ops/performance、design/resource 系无关运营/设计模块。\n关键引擎 TriggerRuleEngine 仅由 WorkflowService.finalize 在 FormInstance 办结时按模板关键词触发,整条申报域(Declaration/PolicyApplication/Certification/FundPool)均未接入。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/PolicyApplicationController.java:165-195 (advance 仅 setStatus+setGrantedAmount,构造器仅注入 appRepo/policyRepo,无任何下游联动);web/DeclarationController.java (纯 CRUD);web/CertificationController.java (CRUD+读时派生状态,无任务生成);web/FundPoolController.java:59-104 (仅聚合 Contract+Payment,不读 grantedAmount);web/DeclarationStepController.java:25-149 (生命周期无验收步,步骤手工建,仅 autoCollect 采集前置数据);task/AlertScheduler.java:144-168 (仅刷新 PersonnelCert 到期状态,不生成维护任务);service/TriggerRuleEngine.java:94-139 (仅 FormInstance 办结按关键词触发,申报域未接入)。全后端 grep 验收任务/维护任务/后评估/绩效统计/postEvaluation/maintenanceTask/acceptanceTask 零命中。" }, { "area": "创新研发中心/申报服务部", "module": "4. 申报成果与档案管理", "verdict": "PARTIAL", "gap": "成果库无自动从申报项目归集;申报档案自动归档缺失(归档引擎只认 Project 验收,申报完成无 auto-pack);历史申报数据复用/clone 零实现。", "severity": "med", "evidence": "无独立申报成果库实体(domain 下无 achievement/result/outcome/成果 类,grep 零命中);archive/library.vue:164 仅把'申报成果'列为通用档案分类字符串,RdProject.achievement(RdProjectController:62/81)是项目级手填文本,非从申报项目自动归集。TriggerRuleEngine.chainArchiveProject():346-366 仅在 project.accept 后对 Project 自动打包归档(case '项目归档'->project.toArchive:684),对 Declaration/PolicyApplication 完成无 auto-pack 推送资料室。历史复用: grep 'clone|复用|复制上年|cloneFrom|copyFrom|duplicate' 在申报域零命中(命中均为 SQLite id 回收/投票去重等无关注释)。", "survives": true, "reNote": "尽力推翻后缺口仍成立。逐条核验该 PARTIAL 描述的三个子点,全部属实,仅有边缘功能不构成实现:\n\n1) 成果库无自动从申报项目归集 —— 属实。前端「科技成果登记」成果库 (achievement.vue) 是纯 mock 的 settingListStore('rd-achievement', ...),只有手工 CRUD,无任何后端实体、无自动归集。EvidenceController 的 /rd-projects/{id}/evidence-chain 只是只读聚合(把费用/专利/申报折成临时 payload 返回,不落库到任何成果库)。DeclarationStepController.autoCollect 是把研发费用合计+专利数采集写进申报「数据采集」步骤的 status 文本串,方向相反(采集进申报步骤,而非从申报项目归集进成果库),且落点是一个步骤状态字符串而非成果库。成果库与申报项目之间无任何自动归集链路。\n\n2) 申报档案自动归档缺失(归档引擎只认 Project 验收,申报完成无 auto-pack) —— 属实。TriggerRuleEngine 里唯一的自动归档 chainArchiveProject 只在 Project 验收/结项/竣工/交付时触发(ruleAcceptProject→chainArchiveProject),建的 Archive sourceType=\"项目\"。关键词矩阵(付款/用印/收款/验收/供应商/合同/立项)完全没有「申报」分支。DeclarationController.update 把 status 改成已结题/已立项时只 save,无任何归档/auto-pack;DeclarationStep 的「结果登记」步骤也不触发归档。种子里的「申报成果」档案(DataSeeder 1431-1439)sourceId=null,是手工静态种子,非从申报自动打包。\n\n3) 历史申报数据复用/clone 零实现 —— 属实。DeclarationController / DeclarationStepController / DeclarationTemplateController 全无 clone/copy/duplicate/历史复用/fromHistory 端点;grep 全后端 web 层无任何 clone 路由。DeclarationTemplate 只是个模板库(可建模板),无法把往年申报克隆成新申报。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/DeclarationController.java(纯CRUD,update仅setStatus无归档L84-101)、DeclarationStepController.java(autoCollect L102-129 仅把费用合计/专利数写进数据采集步骤status文本,非归集进成果库)、DeclarationTemplateController.java(仅模板库CRUD,无clone)、EvidenceController.java(evidence-chain L54-88 只读聚合不落库)、service/TriggerRuleEngine.java(关键词矩阵L109-128无「申报」分支;唯一归档chainArchiveProject L346-369 仅Project验收触发,sourceType=项目)、seed/DataSeeder.java(L1431-1439 申报成果档案 sourceId=null 静态种子)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/achievement.vue(成果库=settingListStore纯mock手工CRUD)、oa/pages/rd/declaration.vue(申报=MasterDataPage纯CRUD,无clone/归档按钮)、oa/api/rd.ts与rdextra.ts(无clone/auto-collect/archive端点)。全后端web层grep clone/duplicate/复用 命中0条申报相关路由。" }, { "area": "创新研发中心/申报服务部", "module": "5. 报表与绩效分析", "verdict": "LOGIC_GAP", "gap": "申报看板缺通过率/获批资金/减免税/在审数/即将到期维护的真实聚合;无部门/个人绩效考核得分;无政策兑现分析(成功率/周期/投入产出比);无申报日历及导入个人日程;ReportDefinition无申报源。", "severity": "med", "evidence": "ReportDefinitionController SOURCES 白名单(132-246)只注册 contract/payment/budget/bid/opportunity/invoice/safety/instance/project,grep 该文件 '申报|declaration|policy|通过率|获批|减免' 零命中——无申报数据源,无法定义申报报表。全前端 grep '通过率|获批资金|减免税|绩效考核得分|投入产出比|平均周期' 命中均非申报域真实聚合。grep '申报日历' 与 '导入日程/importToSchedule/申报节点' 前后端均零命中——无申报日历、无导入个人日程。", "survives": true, "reNote": "尝试推翻失败:缺口属实。申报服务部\"5.报表与绩效分析\"块在 kaidiDeptView.ts 中映射到 /rd/board(创新看板=rd/board.vue),但该看板是研发创新通用看板,只对申报做了两个极简口径:declaring(状态∈准备中/已申报的计数) 与 fundTotal(状态∈已立项/已结题的 amount 求和)。缺口逐项核验全部成立:(1)无通过率聚合——无已通过/已立项占比;(2)获批资金仅 fundTotal 部分覆盖,但减免税在 Declaration 实体里根本无对应字段(无法实现);(3)无在审数;(4)无即将到期维护——declsteps.vue 只有 dueDate 列、零到期/预警逻辑;(5)无部门/个人绩效考核得分(grep 绩效考核/考核得分=空);(6)无政策兑现分析——Policy/PolicyApplicationController 仅 list/get/match/profile,无成功率/周期/投入产出聚合;(7)无申报日历及个人日程导入(grep calendar/日历/ScheduleEvent=空);(8)ReportDefinition 无申报源——SOURCES 白名单仅 9 源(contract/payment/budget/bid/opportunity/invoice/safety/instance/project),declaration 缺席。DeclarationController 为纯 CRUD,无任何 stats/summary/board 聚合端点。", "reEvidence": "后端 DeclarationController.java(纯CRUD,无聚合端点);Declaration.java 字段仅 name/program/authority/rdProjectId/amount/deadline/status/owner(无减免税字段);ReportDefinitionController.java L131-243 SOURCES 白名单9源无declaration;前端 rd/board.vue L50-54 仅 granted/declaring/fundTotal 三个 computed,无通过率/在审/减免税/到期;rd/declaration.vue 为纯 MasterDataPage 表格;rd/declsteps.vue 仅 dueDate 列无到期预警;kaidiDeptView.ts 申报服务部\"报表与绩效分析\"path=/rd/board。活体验证(127.0.0.1:8091):/report-definitions/schema 返回 source keys=['contract','payment','budget','bid','opportunity','invoice','safety','instance','project'](declaration 不在内);grep 政策兑现/投入产出/成功率/绩效考核/申报日历/个人日程/calendar 在 pages/rd 及 Policy*Controller 全部为空。" }, { "area": "创新研发中心/申报服务部", "module": "7. 与其他部门接口", "verdict": "LOGIC_GAP", "gap": "8类部门接口仅研发(费用/专利)半通;财务/人力/质安/综合/工程均未向申报自动供数;无统一数据采集接口层。", "severity": "high", "evidence": "唯一向申报供数的接口是 DeclarationStepController.autoCollect():111-119——只读 RdExpense(费用)与 Patent(专利数)即研发中心半通。全仓 grep '社保|个税|学历|审计报告|纳税|高新收入|科技人员占比' 在 web/service 仅 PersonnelCert 注释一行;财务(审计/辅助账/高新收入/纳税/补贴到账)、人力(人员/学历/社保/个税)、质安(体系/标准化/检测)、综合(执照/荣誉/信用)、工程(业绩/验收/用户证明)均无任何向申报自动供数代码。无统一数据采集接口层(autoCollect 硬编码两仓)。", "survives": true, "reNote": "缺口属实,推翻失败。申报服务部唯一的数据采集接口是 DeclarationStepController.autoCollect(POST /api/oa/declaration-steps/auto-collect/{declarationId}),它只从研发自身的两类数据取数:RdExpense(研发费用)按 rdProjectId 累加 + Patent(专利/知识产权)按 rdProjectId 计数,产出仅为\"已自动采集研发费用¥X、知识产权N件\"。该控制器只 import 了 RdExpense/Patent 两个仓库,完全没有财务(Invoice/Payment/Voucher)、人力(PersonnelCert/SysUser/HealthRecord/Certification)、质安(QmsRecord/SafetyCheck)、综合、工程(Project/WorkOrder/Supervision)向申报供数的任何代码。也不存在统一数据采集接口层/服务(无 DataCollectionService、无部门接口抽象、TriggerRuleEngine 联动矩阵里也无任何 declaration 规则)。全后端仅 DataCenter/BusinessBi/Evidence 三处碰 Declaration,且均为反向只读(count/list 汇总进看板),不是部门向申报供数。即\"8类部门接口仅研发(费用/专利)半通,其余5类未自动供数,无统一采集接口层\"的判定成立。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa/web/DeclarationStepController.java:102-129(autoCollect 仅取 RdExpense+Patent,行127输出文案);import 仅 RdExpense/Patent(行8-13)。TriggerRuleEngine.java 全文无 declaration 规则。其余消费者 DataCenterController.java:121、EvidenceController.java:72-86、BusinessBiController.java:230 均为反向只读汇总。前端 ofbiz-framework/plugins/modern-ui/app/src/oa/api/governance.ts:69 注释号称\"从研发/财务/IP 自动采集\",但后端从未触碰任何财务实体,注释与实现不符,进一步印证缺口。前端 src/oa/pages/rd/declaration.vue 仅为基础 CRUD 页,未暴露任何多部门采集入口。" }, { "area": "创新研发中心/申报服务部", "module": "8. 移动端应用", "verdict": "PARTIAL", "gap": "仅通用待办+预警汇总;无申报进度专项查询、无政策匹配推送、无申报审核/维护移动审批专项、无申报截止/到期维护预警(Alert引擎不扫Policy/Declaration)。", "severity": "med", "evidence": "MobileController 仅 /summary(58-99):本人待办 FormInstance + 复用 alertController.aggregate() 的预警预览,无申报专项端点(grep '申报|declaration|policy|进度' 在该文件零命中)。无申报项目进度专项查询、无政策匹配推送、无申报材料审核/维护任务确认的移动审批专项。预警推送因 Alert 引擎本就不扫 Policy/Declaration deadline(AlertController 构造器不含 PolicyRepository/DeclarationRepository)故无申报截止/到期维护推送。", "survives": true, "reNote": "缺口属实。移动端(MobileController /summary + 唯一移动页 oa/pages/mobile/workbench.vue)只做通用待办审批+预警汇总+项目进度填报,没有任何申报专项能力:(1)无申报进度专项查询——移动页只查 listInstances('todo') 通用表单待办,不查 Declaration/DeclarationStep;(2)无政策匹配推送——/policies/match 匹配器虽存在,但仅被桌面 RD 页 policylib.vue 调用,全后端 grep 政策推送/通知=0,移动页不导入 policy api;(3)无申报审核/维护移动审批专项——移动待办是通用 FormInstance,无申报独立审批入口,快捷查询8项(合同/支付/投标/情报/用印/档案/商机/预算)无申报/政策;(4)申报截止/到期预警缺失——Declaration 实体有 deadline 字段,但 AlertController.aggregate() 与 AlertScheduler 均不扫 Policy/Declaration(grep 两文件 Declaration/Policy import=0),移动页 alerts 计算只聚合 budget/safety/milestone/cert/patent。", "reEvidence": "AlertController.aggregate() (oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:98-210) 仅扫 PersonnelCert/Patent/ContractMilestone/InventoryItem/LabInstrument/SafetyCheck/FormInstance/Budget 八源,无 Declaration/Policy;grep 'Declaration|Policy' 于 AlertController.java 与 task/AlertScheduler.java 均=0。Declaration 实体含 deadline 字段(domain/Declaration.java:38)但无扫描者。MobileController.java 仅 /summary 复用通用待办+AlertController。移动唯一页 oa/pages/mobile/workbench.vue:36-44 只 listInstances/budget/safety/milestone/project/cert/patent;alerts computed(79-108)无 Declaration/Policy;quickLinks(110-119)无申报/政策;import 段无 policy/declaration api。/policies/match(PolicyController.java:145) 仅被桌面 rd/policylib.vue 经 oa/api/policy.ts 调用;全后端 grep 政策推送/通知=0。oaModules.ts:489-497 mobile 模块只有单个 workbench portal 子项。" }, { "area": "创新研发中心/知识产权部", "module": "1. 知识产权资产全生命周期管理", "verdict": "PARTIAL", "gap": "缺提案管理(交底书/商标稿在线提交+自动提案编号+提交时间)、附件上传、按知产类型的多节点申请流程(内部审核→代理委托→官方提交→受理→授权)接 WorkflowService、多级审批、官方编号分项(申请号/公开号/授权号/证书编号)、电子证书/通知书上传、法律状态机自动流转。初判 PARTIAL 维持。", "severity": "high", "evidence": "Patent.java (domain) 仅有 name/type/patentNo/applicant/inventors/rdProjectId/applyDate/status/feeDueDate/annualFee/createdAt 字段:无 fileId/attachment 附件字段,无申请号/公开号/授权号/证书编号独立字段(只有单一 patentNo)。PatentController.java 是纯扁平 CRUD(list/get/create/update/delete),status 在 create 时手填、默认'申请中',update 直接覆盖 status,无任何状态机自动推进。WorkflowService.java 中 grep 无 Patent/patent 引用,知产申请未接审批流。前端 patent.vue 为单 patentNo 字段的 MasterDataPage,无提案管理/技术交底书在线提交/自动生成提案编号、无电子证书上传、无多节点申请流程。", "survives": true, "reNote": "缺口属实。我尽力推翻但无法成立。知识产权资产全生命周期管理仅有一个扁平的 Patent 实体 + 纯 CRUD 控制器,缺口描述的每一项高级能力都查无实现:(1) 无提案管理:全后端 grep \"Proposal/提案/交底/商标稿\" 零命中,没有交底书/商标稿在线提交、无自动提案编号、无提交时间戳字段;(2) 无附件上传:Patent 实体 12 个字段里没有任何 attachment/file 字段,控制器也不接文件;(3) 无按知产类型的多节点申请流程:PatentController 是 list/get/create/update/delete 五个纯 CRUD 方法,完全不引用 WorkflowService(service 目录 grep \"patent\" 零命中),status 只靠请求体里直接覆盖字符串,没有\"内部审核→代理委托→官方提交→受理→授权\"任何节点;(4) 无多级审批;(5) 无官方编号分项:申请号/公开号/授权号/证书编号全部压成单个 patentNo 字段;(6) 无电子证书/通知书上传;(7) 无法律状态机自动流转:status 是自由字符串,无状态校验、无自动流转逻辑。前端 5 个 rd IP 页(patent.vue 绑同一扁平模型,ipgov/iprenewal/ipmonitor 全是 settingListStore mock 表格)同样不含上述能力。DeclarationStep 的\"多步骤\"属于政府项目申报(高企/科小)流程,且只在证据归集时只读统计 patent 数量,与 IP 申请流程无关。PARTIAL 判定应维持。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java(字段仅 id/name/type/patentNo/applicant/inventors/rdProjectId/applyDate/status/feeDueDate/annualFee/createdAt,无附件/分项编号/状态机);oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java(纯 CRUD,不 import 也不调用 WorkflowService/TriggerRuleEngine);service 目录 grep \"patent\" 零命中;全后端 grep \"Proposal|提案|交底|商标稿|代理委托|官方提交|法律状态\" 零命中;前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/patent.vue(MasterDataPage 直接 CRUD)、ipgov.vue/iprenewal.vue/ipmonitor.vue(settingListStore mock);oa-backend/.../domain/Declaration.java 与 DeclarationStep.java 为政府申报流程,DeclarationStepController.java:115 仅 patentRepo.findAll() 计数。" }, { "area": "创新研发中心/知识产权部", "module": "2. 期限与年费自动预警", "verdict": "LOGIC_GAP", "gap": "缺 30/15/7 天分级推送至责任人+部门负责人、各国/地区法定期限模板、年费周期自动算下一截止日、批量导入年费清单、逾期自动升级(邮件+弹窗)、代理回传自动匹配。初判 LOGIC_GAP 维持。", "severity": "high", "evidence": "AlertController.aggregate() 对 Patent 仅用单一窗口 inOneYear=today.plusYears(1),feeDueDate 不晚于一年内即出 warning,无 30/15/7 天分级、无 danger 升级、无各国法定期限模板。AlertScheduler 只对 PersonnelCert 做 30 天窗口刷新,对 Patent 无任何缴费周期自动计算/下一截止日推算/批量导入/逾期升级。前端 iprenewal.vue 用 settingListStore('rd-iprenewal') 硬编码 mock 数据,warn 字段纯手填 select(正常/即将到期/已逾期),与 Patent 表与 Alert 引擎完全不联动。无代理机构邮件解析回传自动匹配。", "survives": true, "reNote": "缺口属实。所有6项具体能力均未实现,仅存在一个粗粒度的\"1年内年费临近\"聚合提醒,不满足任何一项。逐项核验:(1)30/15/7天分级推送至责任人+部门负责人——无。AlertController.aggregate() 对专利只用单一窗口 inOneYear=today.plusYears(1),命中即产生一条固定 level=\"warning\" 的提醒,无30/15/7分级、无按临近度升级、无责任人/部门负责人字段或路由。AlertScheduler.pushAlerts() 的 notify 推送只针对 PersonnelCert(仅刷状态不推送)与超时表单实例,对专利零调用 notify。(2)各国/地区法定期限模板——无。Patent 实体无国家/地区字段,全仓无任何法定期限模板,grep 法定期限/国家模板 零命中。(3)年费周期自动算下一截止日——无。feeDueDate 是手填 String 列,PatentController 创建/更新/缴费均不滚动计算下一截止日(AlertController 里唯一的 nextDue 是 LabInstrument 校准,与专利无关)。(4)批量导入年费清单——无。PatentController 无 import/CSV/Excel/upload 端点,iprenewal.vue 仅是 MasterDataPage 单行手工新增。(5)逾期自动升级(邮件+弹窗)——无。专利提醒硬编码 level=\"warning\",无 overdue→danger 升级、无邮件、无弹窗(对比 PersonnelCert/LabInstrument 逾期会算 danger,专利明确没有)。(6)代理回传自动匹配——无,全仓零相关逻辑。已实现的只是基础专利登记台账(Patent 实体+PatentController CRUD)+两个手工 CRUD 页(iprenewal.vue 的 warn 为手填、ipmonitor.vue)+折叠进 /api/oa/alerts 的扁平年费提醒。LOGIC_GAP 维持。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:115-127 (专利只用1年单窗口、固定warning、无责任人/分级); oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java:74-119 (pushAlerts/scanOvertime 的 notify 仅针对超时表单实例,专利零推送); oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java:39-115 (纯CRUD,无导入端点、无下一截止日计算、无升级); oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java:44-46 (feeDueDate 手填String、无国家/地区字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/iprenewal.vue:5-31 (MasterDataPage 单行手工 CRUD,warn 手填、无批量导入); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/ipmonitor.vue (手工 CRUD); 活体 GET /api/oa/alerts 验证 6 条\"专利年费\"均为 level=warning 无分级。grep 全仓 法定期限/国家模板/代理回传/escalate/批量导入 在专利路径零命中。" }, { "area": "创新研发中心/知识产权部", "module": "3. 与研发/项目/申报模块的深度关联", "verdict": "PARTIAL", "gap": "关联未强制(create 时 rdProjectId 可空)、缺产品线/技术分类挂钩、缺知产汇总表自动生成与国知局清单标准模板导出。初判 PARTIAL 维持。", "severity": "med", "evidence": "Patent.rdProjectId 为 nullable,PatentController.create 未校验 rdProjectId 非空(仅 name 必填),故未强制每件知产至少关联一个研发项目。Patent 无产品线/技术分类字段(无侵权分析/技术布局维度)。EvidenceController 的 /rd-projects/{id}/evidence-chain 仅把 project+expenses+patents+declarations 折叠成 Map(JSON),board.vue 做基础计数聚合;无'知识产权汇总表'按年度/类型/法律状态自动生成供申报服务部,无导出国家知识产权局《知识产权清单》标准模板。ipgov.vue 的关联仅为 settingListStore 手填台账(linkTo/linkType 文本)。", "survives": true, "reNote": "缺口属实,三条子项全部坐实,无法推翻。(1) 关联未强制:PatentController.create 仅校验 name(第66-68行),rdProjectId 直接 setRdProjectId(req.rdProjectId()) 无非空校验、无 RdProject 存在性校验;前端 patent.vue 的 rdProjectId 字段 type:'number' 且非 required,纯自由数字输入,未绑定真实研发项目下拉。活体验证:POST /api/oa/patents 仅传 name 即返回 code=0、rdProjectId=null、持久化成功(id=15)。(2) 缺产品线/技术分类挂钩:Patent.java 实体无 productLine/techField/techClass/category 任何字段,全后端 grep 这些概念零命中;实体仅有 type(发明专利/实用新型/外观设计/软著/商标),属IP类型而非产品线或技术领域分类。(3) 缺知产汇总表自动生成与国知局清单标准模板导出:全前后端 grep 国知局/CNIPA/汇总表/知产汇总/专利汇总 零命中;唯一的专利聚合是 BusinessBiController.RdStat(仅 patentCount/grantedPatents 整数计数)与 RdProject evidence-chain(收集原始列表),均非结构化知产汇总表,更无国知局格式清单模板导出。前端 ipgov.vue「知识产权关联与合规」看似有关联,实为独立 settingList mock(自由文本 linkTo/linkType),与后端 Patent 实体脱钩、无强制、无分类、无导出。PARTIAL 判定成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java(无产品线/技术分类字段,rdProjectId 普通可空 Long); oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java 第64-82行 create 仅校验 name、rdProjectId 无非空/无存在性校验; oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java 第112-235行 RdStat 仅整数计数(非汇总表/非模板导出)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/patent.vue 第24行 rdProjectId 字段 type:'number' 非 required; ofbiz-framework/plugins/modern-ui/app/src/oa/api/rd.ts 第32行 rdProjectId:number|null; ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/ipgov.vue 为脱钩 mock。活体: POST http://127.0.0.1:8091/api/oa/patents 仅传{name} 返回 code=0/rdProjectId=null/id=15。全项目 grep 国知局/CNIPA/汇总表/知产汇总/专利汇总 及 productLine/techField/techClass 均零命中。" }, { "area": "创新研发中心/知识产权部", "module": "4. 费用与预算控制", "verdict": "LOGIC_GAP", "gap": "缺按 IP 案件归集多费目、分摊成本中心、知产专项预算分类、费用发生自动扣减+超支预警、投入产出分析报表。初判 LOGIC_GAP 维持。", "severity": "high", "evidence": "Patent 仅单值 annualFee,无申请费/代理费/年费/复审费/翻译费/加急费多费目结构,无成本中心分摊。BudgetController/Budget 为通用预算表(budgetAmount/actualAmount),create 时 actualAmount 手填、仅在 actual>budget 时自动置'超支',无费用发生事件自动扣减闭环,无知产专项预算(申请/维持/诉讼)分类。无'知识产权投入产出分析'报表(投入 vs 授权数 vs 被引次数)。", "survives": true, "reNote": "尽力推翻后仍无法成立,缺口属实。逐项核对该缺口的五个要素,无一在代码中实现,且非\"已实现但换了名字\",而是结构性缺失:\n\n1) 按 IP 案件归集多费目——不存在。Patent 实体(domain/Patent.java)只有单一 annualFee 字段,无申请费/代理费/官费/审查费/维持费/诉讼费等多费目,更无以 patentId 为外键的费用明细表。RdExpense(domain/RdExpense.java + web/RdExpenseController.java)只外键到 rdProjectId(研发项目),其 category 是研发费六类(人工费/直接投入/折旧/无形资产摊销/设计费/其他),与\"按知产案件归集费目\"无关。全后端 grep patentId|ipCaseId|caseId 在费用/预算实体上零命中。\n\n2) 分摊成本中心——CostCenter(web/CostCenterController.java)是通用责任中心(类型仅 项目/部门/公司/工序),做的是 parentId 树形上卷,没有把某 IP 案件费用按比例 allocate 到多个成本中心的分摊逻辑(grep allocat/分摊在费用/预算控制器零命中,仅 DataSeeder 文本和 StandardCost 注释提及\"折旧分摊\")。\n\n3) 知产专项预算分类——Budget(domain/Budget.java)的 element 枚举固定为 人工费/材料费/机械费/差旅费/管理费/外协费/分包费,活体 /api/oa/budgets 实测 element 集合正是这七类,无任何知产专项预算类别。\n\n4) 费用发生自动扣减+超支预警——Budget 仅在 create 时比较 actualAmount>budgetAmount 置状态\"超支\"(BudgetController.java:84),是静态录入比较,不存在\"费用发生→自动从对应预算余额扣减\"的联动;TriggerRuleEngine 无相关规则。前端 budget/board.vue 的\"超支预警\"只是对已录入 budget 列表做 filter 展示,非案件级扣减预警。\n\n5) 投入产出分析报表——全后端 grep 投入产出|roi|产出|投产|收益 零命中;无任何 IP 投入(费用)对产出(授权/许可/转让收益)的分析端点。\n\n前端 rd 目录下与知产相关的页面(iprenewal.vue/ipgov.vue/ipmonitor.vue)全部是 settingListStore 键值 mock 页(各 grep settingListStore = 2),无后端聚合/扣减/预算业务,只是手填台账。", "reEvidence": "后端:\n- oa-backend/.../domain/Patent.java:46 — 仅 `private BigDecimal annualFee`,无多费目集合,无费用明细外键\n- oa-backend/.../web/RdExpenseController.java:40-44 + domain/RdExpense.java:29 — 费用只能按 rdProjectId 过滤/归集,无 patentId/案件维度\n- oa-backend/.../domain/Budget.java:13-19 注释 + web/BudgetController.java:84-88 — element 七类无知产专项;超支仅 create 时静态比较,无扣减联动\n- oa-backend/.../web/CostCenterController.java:26-36 — 仅 parentId 上卷树,无案件费用分摊\n- grep -rniE \"patentId|ipCaseId|投入产出|roi|分摊|扣减|deduct\" 在 oa-backend 费用/预算/报表控制器零命中\n\n前端(均为 mock 键值页):\n- src/oa/pages/rd/iprenewal.vue:6 — settingListStore('rd-iprenewal',...) 手填年费台账\n- src/oa/pages/rd/ipgov.vue:5 / ipmonitor.vue:5 — 同为 settingListStore mock\n- src/oa/pages/rd/expenses.vue:18-19 — 录入字段是\"研发项目ID/研发项目名称\",非 IP 案件\n- src/oa/pages/budget/board.vue:30 — 超支仅对已录入 budget 列表 filter 展示\n\n活体(http://127.0.0.1:8091):\n- GET /api/oa/patents 字段: id,name,type,patentNo,applicant,inventors,rdProjectId,applyDate,status,feeDueDate,annualFee,createdAt(仅单一年费)\n- GET /api/oa/rd-expenses 字段: rdProjectId,rdProjectName,category,...(无 patentId)\n- GET /api/oa/budgets distinct element = [人工费,分包费,外协费,差旅费,机械费,材料费,管理费](无知产专项类别)" }, { "area": "创新研发中心/知识产权部", "module": "5. 合规与审计追溯", "verdict": "MISSING", "gap": "完全缺 CRUD 操作日志、关键数据不可删+历史版本、强制复核留痕、商业秘密电子证据链。初判 MISSING 维持。", "severity": "high", "evidence": "全后端 grep 无操作日志/operationLog/auditLog/访问记录/接触人员 实体,无任何 CRUD 操作日志(操作人/时间/IP)。AutomationLog.java 仅记录工作流办结后下游联动((instanceId,ruleKey) 幂等键,action=合同生效/生成付款单等),非 CRUD 审计且只在 FormInstance 办结时触发,与知产无关。关键数据(法律状态/期限)可被 PatentController.delete 直接物理删除,无不可删/历史版本。无申请文件强制复核节点(IP主管+外部顾问)在线留痕,无商业秘密电子证据链(接触人员/访问时间/下载记录)。", "survives": true, "reNote": "缺口属实。我尽力推翻但反而坐实:创新研发中心/知识产权部的「合规与审计追溯」四项要素全部缺失。(1)CRUD 操作日志=无:全后端无任何 @Aspect/@Around 操作日志切面,AuthInterceptor 仅做 token+角色鉴权不留痕;现有的 automation_log 只记审批办结后的下游联动效果(TriggerRuleEngine),flow_trace 只记审批路由步骤(发起/同意/退回/办结),data_sync_log/supervision_log 各为同步/监理专用,无一是用户增删改的操作审计日志。(2)关键数据不可删+历史版本=无:PatentController 有硬删除 DELETE /{id} 直接 patentRepo.deleteById(id),无软删/属主以外的保护;全 domain 无任何 deleted/isDeleted/deletedAt 软删字段,无 @Version、无 Hibernate Envers/Javers 依赖、无任何 *History/*Version/*Revision 实体或仓库,专利等关键 IP 数据可被物理删除且无历史版本。(3)强制复核留痕=无:Patent 创建/更新无复核字段或复核流转留痕;前端 rd/ipgov.vue 的 auditNote「审计意见」只是 settingListStore 的自由文本 mock 字段,非强制、非留痕、不可追溯。(4)商业秘密电子证据链=无:EvidenceController 的 /evidence-chain 只是把 RdProject+RdExpense+Patent+Declaration 只读聚合展示,无哈希/时间戳/防篡改/不可抵赖等任何电子证据链机制,与商业秘密保全无关。MISSING 维持。", "reEvidence": "PatentController.java:108-115 硬删除 deleteById;EvidenceController.java:54-88 纯只读聚合无证据链机制;AutomationLog.java:12-24 仅记办结下游联动非CRUD日志;FlowTrace.java:13-18 仅审批路由步骤;AuthInterceptor.java:19-30 仅鉴权不留痕;domain/ 无任何软删字段/无@Version/无 *History|*Version 实体;build.gradle/pom.xml 无 envers/javers;ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/ipgov.vue:5 auditNote 为 mock 自由文本" }, { "area": "创新研发中心/知识产权部", "module": "6. 研发费用归集与证据链自动化", "verdict": "LOGIC_GAP", "gap": "归集非'自动'(纯手录)、无工时表在线填写/批量导入/自动分摊、证据链无一键打包导出文件。初判 LOGIC_GAP 维持。", "severity": "high", "evidence": "RdExpenseController.create 为纯手工录入(category/description/amount/occurDate/voucher/recorder),无从 ERP/财务同步领料单/工时/折旧/审批单自动匹配立项。无研发工时表在线填写/批量导入/按项目人员月份自动分摊。EvidenceController /evidence-chain 仅返回 Map(project/expenses/patents/declarations/totalExpense),board.vue 抽屉展示 JSON 聚合,无'按项目一键打包导出'文件包(无 zip/文件下载)。", "survives": true, "reNote": "缺口属实,三条子缺口全部成立,无法推翻。(1) 归集非自动/纯手录:RdExpenseController.java 只有标准 CRUD(GET/POST/PUT/DELETE),create 接受手填的 amount/category/voucher/recorder;前端 rd/expenses.vue 直接套用 MasterDataPage 做手工录入表单,无任何自动归集逻辑。(2) 无工时表在线填写/批量导入/自动分摊:全后端无 timesheet/工时表/分摊/批量导入 端点,RdExpense 实体只有 amount 单值无工时字段(\"工时单\"仅出现在 voucher 字段的注释里,是自由文本凭证名,非功能);RdExpenseController 与 RdProjectController 均无 import/batch/allocate 方法;MasterDataPage 基组件只有 Delete/Edit/Plus/Refresh/Search 五个图标,无导入/上传。(3) 证据链无一键打包导出文件:EvidenceController 的 /{id}/evidence-chain 仅返回一个 JSON Map(project/expenses/patents/declarations/totals),无 byte[]/zip/pdf/attachment 产出;前端 rd/board.vue 的\"一键归集\"只是把该 JSON 渲染进只读抽屉展示,整个 rd 目录 grep download/导出/export/打包/blob/saveAs 零命中,无下载落地文件能力。初判 LOGIC_GAP 维持。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/RdExpenseController.java(仅CRUD,create手填amount/voucher/recorder), RdExpenseController/RdProjectController 无import/batch/工时/分摊端点; oa-backend/src/main/java/com/kaidi/oa/domain/RdExpense.java(无工时字段,\"工时单\"仅L19注释中voucher自由文本); oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java(L54-88 evidenceChain仅返回JSON Map,无byte[]/zip/pdf/attachment). 前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/expenses.vue(套MasterDataPage纯手录), rd/board.vue(L134-161 证据链只读抽屉,无导出按钮), pages/masterdata/MasterDataPage.vue(仅Delete/Edit/Plus/Refresh/Search图标,无导入导出). grep全rd目录 download/导出/export/打包/blob/saveAs 零命中; 全后端 application/zip|ResponseEntitybudget 时静态置超支)。年度立项表/科技人员名单无与费用归集/知产产出的自动关联。", "survives": true, "reNote": "尽力推翻但失败:缺口属实,PARTIAL 维持。针对[创新研发中心/知识产权部 · 链11 预算与计划管理]的4条子主张逐条核验,全部坐实未实现。(1)专属预算编制分项:RdProject 仅有单一扁平 BigDecimal budget 字段,无任何分项/明细行;通用 Budget 表虽带 element(人工费/材料费…)但与项目无关、非按研发项目编制。(2)自动汇总+历史对比:后端无任何把 rd-expense 上卷到所属项目预算的聚合,唯一聚合是只读 BI 看板 BusinessBiController.rdStat()(全局求和所有研发费用)与 costStat()(全局求和所有 Budget 行),既不按项目上卷也无任何同比/历史期对比;前端 board.vue 仅对通用 Budget 列表做客户端 byElement 分组求和,也无历史对比。(3)实际费用自动扣减闭环:RdExpenseController.create/update 只落库费用,从不读写 RdProject.budget 或 Budget.actualAmount;TriggerRuleEngine 无任何 rd-expense/budget 规则(其 ruleKey 只覆盖 payment/contract/project/seal/supplier),故费用永不扣减预算。(4)立项/人员名单跨表自动联动:RdProject 无人员名单字段/表(只有单串 leader),无名单可联动;RdExpense 上的 rdProjectId/rdProjectName 是创建时手填的反范式冗余,无任何自动跨表联动。四点一致指向 PARTIAL 成立。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa/web/RdProjectController.java(create/update 仅 setBudget 单值,无分项);domain/RdProject.java 字段仅 budget 单一 BigDecimal、leader 单串,无 roster/分项/spent/remaining;web/RdExpenseController.java create/update 全程不触碰 RdProject 或 Budget(无 setBudget/setActualAmount 引用);service/TriggerRuleEngine.java ruleKeyFor() 仅 payment/receipt/contract/project/seal/supplier,无 rd/budget 规则;web/BusinessBiController.java costStat()(L184-206)与 rdStat()(L220-237)仅全局求和、无按项目上卷与历史对比;前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/board.vue(L27-42 客户端 byElement 分组求和、无历史对比)、pages/rd/expenses.vue(纯 MasterDataPage CRUD,无扣减);活体 127.0.0.1:8091 GET /api/oa/rd-projects 返回 budget 为单值 2600000.0 无分项,GET /api/oa/rd-expenses 独立记录、与项目预算无扣减关系。" }, { "area": "创新研发中心/知识产权部", "module": "12. 年报与统计填报辅助", "verdict": "LOGIC_GAP", "gap": "缺类型模板、自动填充基础数据、数据校验、历年对比趋势。初判 LOGIC_GAP 维持。", "severity": "med", "evidence": "annualreport.vue 用 settingListStore('rd-annualreport') 硬编码 mock,纯手填报表台账:仅 name/year/target/indicator/status/owner 字段,indicator(关键指标)为手填文本('研发费用1860万')。无按填报类型(工勘设计年报/经开区统计/火炬报表)预设模板、无系统自动填充企业基础数据、无填报数据校验(研发费用与项目匹配/工时一致性)、无历年对比趋势分析。", "survives": true, "reNote": "缺口属实,无法推翻。\"科技年报填报\"页确实存在(oaModules.ts 第333行注册,路由 /rd/annualreport),但它只是一个最薄的通用 CRUD 台账,四项要求一个都没实现:\n\n1) 类型模板:annualreport.vue 把 MasterDataPage 当普通列表用,createFields 只是六个录入字段(报表名称/年度/对象/指标/状态/负责人)。没有\"研发费用加计扣除表/高企认定表/科技统计年报\"等结构化报表模板——报表名称只是一个自由文本输入框,target 是固定下拉选项而非模板套件。注意:申报模板库 DeclarationTemplate(申报模板自动搭建) 属于\"政府项目申报\"链(DeclarationController 注释明确写 program=高新技术企业/科技型中小企业…,status=准备中/已申报/已立项),与\"年报与统计填报\"是两条不同的链,不能顶替。\n\n2) 自动填充基础数据:seed 里的\"研发费用1860万\"\"研发占比4.2%\"等关键指标全是写死的 mock 字符串,由人工填进 indicator 文本框。后端 BizRecordController 只有 GET /{type} 列表与 POST /{type} 建档两个端点(第47/56行),没有任何从 RdExpense(研发费用归集)/RdProject 拉数自动预填的逻辑。全后端 grep 自动填充/preFill/autoFill 零命中。\n\n3) 数据校验:MasterDataPage 的 MdField 只支持 text/textarea/number/select/date 控件 + 可选 required 布尔,没有任何跨字段校验、口径一致性校验、勾稽关系校验引擎;annualreport.vue 连 required 都没传。后端无校验规则。\n\n4) 历年对比趋势:页面无任何图表/趋势组件(MasterDataPage grep trend/chart/同比/历年/compare 全零命中),后端 BizRecordController 无 stats/aggregate/group/sum/trend 端点。全后端\"同比\"唯一命中是 DataSeeder 第824行一条写死的公告文案,与本功能无关。\n\n结论:该模块是占位级 CRUD,LOGIC_GAP 维持。", "reEvidence": "前端页面 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/annualreport.vue(31行,全文为 MasterDataPage 薄壳,seed 数据 mock 写死,createFields 仅6个普通字段,无校验/无图表/无模板/无自动填充);通用页 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/MasterDataPage.vue(MdField 仅 text/textarea/number/select/date+required,grep trend/chart/validate/同比/历年 全零);存储 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts(仅 list/create/update/remove 走 /biz/{type} 通用记录表);后端 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java(仅 GET/POST /{type},无 stats/aggregate/sum/group/trend);模块注册 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:333;DeclarationController.java 头注释证明申报模板库属另一条链(政府项目申报,非年报统计填报)。后端全量 grep 年报/统计填报/自动填充/preFill/autoFill/历年对比/同比/yearOnYear 仅命中 DataSeeder.java:824 一条无关公告文案。" }, { "area": "创新研发中心/知识产权部", "module": "13. 资料归档中心", "verdict": "PARTIAL", "gap": "缺专项分类目录+标签、会议纪要检查表自动抽取待办引擎、科研信誉加分文件专项归档与筛选打包。初判 PARTIAL 维持。", "severity": "med", "evidence": "通用 Archive/Folder/Document 归档可用,但无知产部专项分类目录(技术/申报/合同/纪要/证据链)+标签建档。全后端/前端 grep '会议纪要检查表/自动生成待办/checklist' 仅命中 modern.css/types/display 等样式工具文件,非功能实现——无据纪要内容自动生成待办并跟踪+关联责任人的引擎。grep '信誉加分' 无任何专项归档/按申报要求筛选打包实现。", "survives": true, "reNote": "尽力推翻未果,缺口属实,维持 PARTIAL。资料归档中心的通用底座存在(档案知识中心 archive 模块有 category/tags + 知识社区 libmgr 有\"分类标签\"管理页;会议纪要后端 MeetingMinuteController/MeetingMinute 有 decisions 字段;rd 研发创新中心有 19 个子页),但 R&D/知识产权部专项的三项被点名能力均无实现:(1) 专项分类目录+标签——RdProject、Patent 实体均无 category/tag/分类目录字段,无 R&D 专属\"资料归档中心\"页面,只有通用档案/知识库的标签;(2) 会议纪要检查表自动抽取待办引擎——MeetingMinute.decisions 仅为人工录入的 TEXT/JSON 串,无任何把纪要正文解析成检查表/待办并自动建 Task 的引擎;TriggerRuleEngine 的 ruleKey 只覆盖 payment/receipt/contract/project/seal/supplier,无 minute→task 联动;前端 minutes.vue 的决议项也仅手填(mockData 里 owner/due 是静态写死);(3) 科研信誉加分文件专项归档与筛选打包——全仓零命中,无 zip/打包/筛选导出。整仓精确扫描(科研信誉/信誉/加分/检查表/筛选打包/抽取待办)均无对应业务实现。", "reEvidence": "前端模块定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:311-334(rd 19 子页,无\"资料归档中心\")、252-262(archive 通用模块)。档案标签:oa/pages/archive/library.vue:160-170,372(通用 category/tags),knowledge/libmgr.vue:583-600(通用分类标签 tab)。会议纪要:oa-backend/src/main/java/com/kaidi/oa/web/MeetingMinuteController.java(仅 CRUD,decisions 原样存)、domain/MeetingMinute.java:33-36(decisions 为 @Lob TEXT 串)、前端 oa/pages/meeting/minutes.vue:90-92,433-438(决议项手填)、mockData.ts:265,300-319(MinuteDecision owner/due 静态写死)。联动引擎无 minute→task:service/TriggerRuleEngine.java:676-686(ruleKeyFor 仅 6 类业务)。R&D 实体无分类目录/信誉字段:domain/RdProject.java:26-50、domain/Patent.java:26-48。全仓精确扫描\"科研信誉/信誉加分/加分文件/筛选打包/抽取待办/检查表(会议)\"零命中(checklist 命中仅 types/api.ts:140-143 的还原度审计项与 utils/display.ts 翻译表,与纪要无关)。" }, { "area": "创新研发中心/知识产权部", "module": "16. 知识库与决策支持", "verdict": "LOGIC_GAP", "gap": "竞品监控纯手填无 API 对比侵权提示、缺案例/判决/策略关键词检索知识库、BI 看板缺需求的核心决策指标。初判 LOGIC_GAP 维持。", "severity": "med", "evidence": "ipmonitor.vue 用 settingListStore('rd-ipmonitor') 硬编码 mock 手填台账(target/monType/source/risk/foundDate/status),无 API 导入竞品专利/商标+与本司技术分类对比+侵权/避空提示。无'无效宣告案例/侵权判决/布局策略文档按技术关键词检索'专项知识库。board.vue 仅基础计数(研发项目数/已授权知产数/申报进行中/已立项资助/按阶段/按类型),缺授权率(按类型)/平均审查周期/当年维持有效数/年度费用趋势/各部门专利申请排名等决策指标。", "survives": true, "reNote": "Gap confirmed real, could not refute. 1 Competitor and infringement monitor is manual-only: ipmonitor.vue uses MasterDataPage plus settingListStore key-value store, all hand-typed fields, no patent API compare, no infringement alert; CrawlSource Javadoc says no real network crawling and serves bidding intel not patents. 2 No case, judgment or strategy knowledge search: FullTextSearchService indexes only generic types, PatentController is plain CRUD, no judgment or case library anywhere. 3 BI dashboard lacks IP decision metrics: board.vue shows R&D scale and IP composition only, BusinessBiController aggregates 9 generic business blocks, neither surfaces infringement risk, competitor landscape, or litigation/strategy indicators.", "reEvidence": "ipmonitor.vue line 5 settingListStore rd-ipmonitor and lines 15-22 manual fields; CrawlSourceController.java line 27 Javadoc no real network crawling and lines 100-103 nanoTime fake counts; PatentController.java plain CRUD; FullTextSearchService.java lines 133-194 reindexAll indexes only generic types; BusinessBiController.java lines 134-152 BusinessOverview has only 9 business blocks, RdStat line 113 no infringement metric. Paths under ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd and ERP/oa-backend/src/main/java/com/kaidi/oa/web and service." }, { "area": "创新研发中心/实验室", "module": "1. 样品全流程管理", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP:仅单 status 字符串覆盖,无条码/二维码/RFID、无入库→领用→检测→归还→处置流转记录表、无批量/移动端扫码、无留样周期与到期自动处置。", "severity": "high", "evidence": "LabSampleController.java + domain/LabSample.java: 单表 CRUD,字段仅 sampleNo/sampleName/sampleType/source/receiveDate/testItems/status/assignee。status 枚举(lab.ts SAMPLE_STATUSES)= 待检/检测中/已出报告/复检,无入库/领用/归还/处置节点。无任何流转记录表(grep barcode/qrcode/rfid 在 web|domain 零命中;无生命周期 trace 表)。无留样位置/复检提醒/到期处置字段。", "survives": true, "reNote": "缺口属实,无法推翻。实验室\"样品全流程管理\"在前后端均仅为单 status 字符串的平铺台账,确无条码/二维码/RFID、无入库→领用→检测→归还→处置流转记录表、无批量/移动端扫码、无留样周期与到期自动处置。具体:(1) 后端 LabSample 实体只有 sampleNo/sampleName/sampleType/source/receiveDate/testItems/status/assignee 八个标量字段,status 仅 待检/检测中/已出报告/复检 四态;update 只是覆盖 status,无任何流转节点记录。无 barcode/qrCode/rfid 字段。(2) LabSampleController 只有 list/get/create/update/delete 五个 CRUD,无领用/归还/处置/扫码/批量端点。(3) 前端 lab/samples.vue 仅复用 MasterDataPage,一个状态 select 列,无扫码/批量/移动端/流转记录。(4) 研发创新中心的 rd/prototype.vue、rd/material.vue 也是 settingListStore mock 平铺页,单 status/result 字段,同样无流转台账。(5) 全后端无 sample-flow/movement/disposal/retention 任何控制器或领域实体;FlowTrace/FlowTask 是审批引擎节点(发起/同意/退回),InventoryItem 是通用库存,AlertScheduler 无留样到期自动处置任务。所列五项能力均未实现。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/LabSample.java(单 status String,无条码/RFID/流转字段); oa-backend/src/main/java/com/kaidi/oa/web/LabSampleController.java(仅 CRUD,update 覆盖 status,无领用/归还/处置/扫码端点); oa-backend/src/main/java/com/kaidi/oa/repository/LabSampleRepository.java(仅 findByStatus)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/lab/samples.vue(MasterDataPage 单状态列,无扫码/批量/流转); ofbiz-framework/plugins/modern-ui/app/src/oa/api/lab.ts(LabSample 接口无 barcode 字段,SAMPLE_STATUSES 仅四态)。研发中心同类页: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/prototype.vue、rd/material.vue(settingListStore mock,单 status,无流转台账)。负向证据: grep 全后端 domain/web 目录无 sample-flow/movement/disposal/retention 任何实体或控制器,LabSampleController 是唯一含 sample 的控制器; FlowTrace.java 注释自述为表单审批 trace(发起/同意/退回/转交/加签/办结/知会)非样品流转; AlertScheduler.java 无样品留样到期任务。" }, { "area": "创新研发中心/实验室", "module": "2. 实验任务与检测流程", "verdict": "MISSING", "gap": "维持 MISSING:任务为前端假数据,无关联研发项目/生产批次/委托单、无自动分配/看板、无方法库与国标行标企标/SOP上传强制关联、无仪器自动采集与原始数据不可改、无 OOS/OOT 偏差报告与复检放行流程。", "severity": "high", "evidence": "无 LabTask 控制器/实体;唯一任务页 pages/lab/tasks.vue 用 settingListStore('lab-tasks', [...]) 内联两条假数据,经 MasterDataPage CRUD,字段 taskNo/sampleName/testItem/tester/dueDate/status,无项目/批次/委托单关联、无自动分配/看板。grep SOP|方法库|标准方法|OOS|OOT|偏差报告|deviation 在 web|domain 零命中。无仪器接口/时间戳不可改约束。", "survives": true, "reNote": "缺口属实。实验任务/检测流程完全没有实现,我尝试推翻但所有子项均找不到实现。(1) 任务页是前端假数据:src/oa/pages/lab/tasks.vue 用 settingListStore('lab-tasks', [硬编码seed]) 落到通用 /api/oa/biz/lab-tasks 的 BizRecord 键值台账(BizRecordController.java),无专属实验任务领域实体,只有 taskNo/sampleName/testItem/tester/dueDate/status 扁平字段。(2) 无关联研发项目/生产批次/委托单:LabSample.java 仅含扁平字符串列(sampleNo/sampleName/sampleType/source/receiveDate/testItems/status/assignee),grep rdProject/projectId/batchNo/delegation/委托单/生产批次 在 lab 页与 LabSample 域全部为空;source 只是自由文本枚举(项目自检/客户委托/监督抽查),非外键。(3) 无自动分配/看板:assignee 在 LabSampleController.create/update 直接照抄请求体(行71/93),无任何分派逻辑;lab 下无看板组件。(4) 无方法库与国标/行标/企标/SOP上传强制关联:全库无方法库实体或SOP上传,testItems 是自由文本;rd/standard.vue 也只是另一个 settingListStore('rd-standard') 假台账,与检测方法绑定无关。(5) 无仪器自动采集与原始数据不可改:LabInstrument 只存校准信息,控制器为普通可改 CRUD,grep 采集/原始数据/rawData/不可改/immutable 在 lab 文件为空。(6) 无 OOS/OOT 偏差报告与复检放行流程:grep OOS/OOT/out-of-spec 零真实命中;\"复检\"仅作为 lab.ts SAMPLE_STATUSES 与 tasks.vue 的静态下拉枚举值存在,背后无复检工作流、无偏差报告、无放行闸。后端实验室面只有三个薄 CRUD 控制器(lab-samples / lab-instruments / qms-records),无一实现上述流程能力。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/lab/tasks.vue(L5 settingListStore('lab-tasks',[假数据]); L21 复检仅为下拉选项); ofbiz-framework/plugins/modern-ui/app/src/oa/api/lab.ts(L34 复检仅枚举值); ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts(L19 走 /biz/{type} 通用台账); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/lab/samples.vue, instruments.vue(纯CRUD). 后端: oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java(通用 dataJson 台账); oa-backend/src/main/java/com/kaidi/oa/domain/LabSample.java(扁平列,无FK); oa-backend/src/main/java/com/kaidi/oa/web/LabSampleController.java(L71,L93 assignee 直接照抄,无自动分配); oa-backend/src/main/java/com/kaidi/oa/domain/LabInstrument.java + LabInstrumentController.java(可改CRUD,无采集). grep 验证: OOS/OOT/out-of-spec 零真实命中; rdProject/projectId/batchNo/delegation 在 lab 域为空; 方法库/SOP/采集/原始数据/不可改在 lab 文件为空。后端实验室仅 lab-samples、lab-instruments、qms-records 三薄控制器。" }, { "area": "创新研发中心/实验室", "module": "3. 设备与仪器管理", "verdict": "PARTIAL", "gap": "维持 PARTIAL:台账+校准到期字段为真,但无在线预约实体、无扫码使用登记/利用率统计、校准到期不自动推任务/不锁定预约、无校准证书与维保存档、无报修→派工→维修→验收流程。", "severity": "high", "evidence": "LabInstrumentController.java 单表 CRUD,有 calibrationDate/nextCalibration/manager/status(在用/维修/停用/待校准),校准到期为只读字段,无预警推送逻辑。grep reservation|booking|预约 仅命中 WorkOrder(成品自动入库 booking)与 Invoice(合同记账 booking),非设备预约。WorkOrder 实体为制造工单(productName/planQty/workshop)。无校准证书/维保记录字段、无报修派工验收流程。", "survives": true, "reNote": "缺口属实。实验室[设备与仪器管理]在后端只有 LabInstrument 单实体 + LabInstrumentController 纯 CRUD,字段仅 name/model/assetNo/calibrationDate/nextCalibration/status/location/manager;前端 instruments.vue 复用通用 MasterDataPage 仅列出这些台账字段。逐条核对子缺口:(1)无在线预约实体——domain/ 下无任何 reservation/booking 类,全局也无预约接口;(2)无扫码使用登记/利用率统计——前端唯一关键词命中是 INSTRUMENT_STATUSES 枚举字符串,无 scan 端点/使用日志/利用率计算;(3)校准到期不自动推任务/不锁定预约——AlertController.aggregate() 第150-173行确实按 nextCalibration 扫描并产出\"仪器校准\"被动预警条目,但这只是读时聚合到预警 feed;AlertScheduler 仅对人员证件刷新状态、对超时实例 notifications.notify,唯独不对 LabInstrument 发通知,也不生成 FormInstance/Task,更无锁定逻辑;(4)无校准证书与维保存档——实体无证书字段、无附件关联、无维保记录实体;(5)无报修→派工→维修→验收流程——WorkOrder 是制造中心的\"生产工单\"(生物质有机肥/PAC,状态 待生产/生产中/已完工/质检中/已入库),与仪器无任何关联,\"维修\"只是仪器自身四个状态标签之一,并非工作流。PARTIAL 判定准确。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/LabInstrument.java (仅8个台账字段,无预约/证书/维保/使用记录); web/LabInstrumentController.java (纯list/get/create/update/delete CRUD); repository/LabInstrumentRepository.java (仅 findByStatus). 校准预警: web/AlertController.java 第150-173行(读时被动聚合\"仪器校准\"alert,无notify/无建任务/无锁定); task/AlertScheduler.java(pushAlerts 只对 PersonnelCert 刷状态+对超时FormInstance notify,从不对LabInstrument发通知或建任务). 维修工单证伪: domain/WorkOrder.java + web/WorkOrderController.java 均为制造中心生产工单(生物质有机肥/复合微生物肥/PAC,状态待生产→已入库),与instrument无关联. 前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/lab/instruments.vue(MasterDataPage 仅台账列); src/oa/api/lab.ts(仅 list/create/update/delete + INSTRUMENT_STATUSES=['在用','维修','停用','待校准']枚举). 全局检索 domain/ 下 reserv/booking/usage/maintenance/repair/calibrat 实体均无命中." }, { "area": "创新研发中心/实验室", "module": "4. 试剂耗材与库存管理", "verdict": "MISSING", "gap": "维持 MISSING:无试剂耗材档案(分类/CAS/SDS/存储条件)、无批号有效期入库与领用扣减、无实验室口径低库存/过期预警、无危险品管控、无周期/扫码盘点报表。", "severity": "high", "evidence": "通用 InventoryItemController/InventoryItem 仅 materialName/category/spec/unit/quantity/safetyStock/location/status,无 CAS号/SDS/有效期/批号/供应商/存储条件。grep reagent|casNo|SDS|试剂|危险化学品|双人双锁 在 web|domain 全零命中。无领用关联实验任务扣减、无危险品双人双锁/审批、无扫码盘点/盘盈盘亏报表。", "survives": true, "reNote": "缺口属实。实验室链路\"4.试剂耗材与库存管理\"在需求映射(data/kaidiDeptView.ts)里被标 status:\"built\",但它复用的是制造管理中心的通用库存页 /mfg/inventory(库存管理),没有任何实验室口径的试剂耗材能力。实验室自身只有三页:检测样品(lab/samples)、仪器设备(lab/instruments)、实验检测任务(lab/tasks),全部与试剂耗材无关。逐条核对需求要素均缺失:1) 无试剂耗材档案——后端 InventoryItem 仅有 materialName/category(原料/半成品/成品/辅料)/spec/unit/quantity/safetyStock/location/status,无分类(试剂分类)、无 CAS、无 SDS/MSDS、无存储条件字段;全仓库 grep sds/msds/casNo/storageCondition 零命中。2) 无批号有效期入库与领用扣减——无 batchNo/lotNo、无 expiry/有效期字段(命中的\"有效期\"全是证照/委托/价目失效,与试剂无关),quantity 是一个可手改的平铺数量,无入库批次、无领用(领用/consume/扣减)的扣减逻辑(命中均为文件下载/票据领用文案)。3) 无实验室口径低库存/过期预警——只有\"quantitybudget 置\"超支\"),从不把 RdExpense 汇总额与 RdProject.budget 比较,无阈值预警、无冻结(阻断继续录入),TriggerRuleEngine 也无相关规则,BusinessBiController.rdStat()(231-236行)只对原始金额求和供看板展示;(3) 无加计扣除成本分析——全后端与 RD 前端 grep 加计/deduction/175 零命中。活体 /api/oa/rd-expenses 返回的 amount 为静态种子值、voucher 仅为\"工时单/工资表\"文本标签而非计算来源。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/RdExpenseController.java:74,92 (amount=Money.of(req.amount())); oa-backend/src/main/java/com/kaidi/oa/domain/RdExpense.java (amount 为手填字段, 无消耗量/费率); oa-backend/src/main/java/com/kaidi/oa/web/RdProjectController.java:76 (budget 手填, 无与费用汇总联动); oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java:84 (唯一自动状态仅单行 actual>budget→超支, 无跨费用汇总/预警/冻结); oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java:231-236 (rdStat 仅 sum 原始 amount, 不比预算不报警); 全后端+RD前端 grep 加计扣除/deduction/175/冻结/预警(rd相关) 零命中; 活体 http://127.0.0.1:8091/api/oa/rd-expenses 返回静态种子 amount(如186000.0), voucher 为\"PZ-2026-0101 + 工时单/工资表\"文本标签" }, { "area": "创新研发中心/实验室", "module": "8. 安全与环境(EHS)", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP:安全巡检整改闭环为真,但无化学品 SDS 与领用阅读确认、无废弃物(废液/固废/生物废物)产生分类暂存转移台账、无事故上报专用流程与灭火器/洗眼器/通风橱专项巡检模板。", "severity": "high", "evidence": "SafetyCheckController 单表(含整改闭环字段)为唯一较实部分。grep reagent|SDS|化学品 全零命中(无SDS/化学品实体与领用阅读确认);grep 废液|废弃物|固废|waste 命中 WaterQuality/WastewaterClient(水质运营)与 LabSample(固废仅为 sampleType 枚举值),无废弃物产生量/分类/暂存/转移台账。事故上报只能靠通用 safety_check 承载,无专用流程/专项巡检模板。", "survives": true, "reNote": "缺口属实。EHS模块(/ehs)仅4个子项:安全检查隐患/三体系认证/质量体系/EHS看板。安全检查(SafetyCheck域/控制器/页面)只实现了整改闭环(待整改/整改中/已闭环),即缺口自己承认存在的部分。声称缺失的4项确实在全代码库中找不到任何实现:(1)化学品SDS与领用阅读确认——无Chemical/SdsDocument实体、无SDS页面、无阅读确认流,SDS/MSDS/化学品台账/阅读确认/领用确认零匹配;(2)废弃物(废液/固废/生物废物)分类暂存转移台账——固废仅作为实验室检测样品类型(lab.ts/LabSample的SAMPLE_TYPES),ops/sludge.vue的污泥危废处置属污水处理厂运营而非实验室废物产生台账,无WasteRecord/WasteLedger实体、无暂存/转移联单流;(3)事故上报专用流程——无Accident实体/控制器/页面,工伤仅出现在社保审批模板与EHS无关;(4)灭火器/洗眼器/通风橱专项巡检模板——SafetyCheck是单一通用自由文本检查记录(type仅安全/质量/环境),无InspectionTemplate实体,灭火器/洗眼器/通风橱在前后端零匹配。推翻失败,缺口成立。", "reEvidence": "前端模块定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:299-308 (ehs仅safety/cert/qms/board四子项); EHS页面目录 src/oa/pages/ehs/ 仅 board.vue/cert.vue/qms.vue/safety.vue; EHS API src/oa/api/ehs.ts 仅 SafetyCheck+Certification; 后端 oa-backend/src/main/java/com/kaidi/oa/domain/SafetyCheck.java 字段仅 type/result/level/rectifyStatus(整改闭环), web/SafetyCheckController.java 仅CRUD无模板/无化学品/无废物/无事故; 误报来源 src/oa/api/lab.ts:33(固废为样品类型)、src/oa/pages/ops/sludge.vue(污水厂危废处置)、src/oa/engine/templates/src/src-social-insurance.ts:62(工伤为社保); grep 全库 SDS/MSDS/化学品台账/阅读确认/领用确认/灭火器/洗眼器/通风橱/事故上报/废液/生物废物 在 EHS 语境零命中; grep class Chemical/WasteRecord/WasteLedger/Accident/SdsDocument/InspectionTemplate/HazardousChemical 在 oa-backend 零实体。" }, { "area": "创新研发中心/实验室", "module": "9. 与其他部门的接口要求", "verdict": "MISSING", "gap": "维持 MISSING:除 rd_expense 一处 projectId 外无任何跨模块数据流转,WorkflowService/TriggerRuleEngine 无实验室相关规则,五类对外接口全缺。", "severity": "high", "evidence": "TriggerRuleEngine 下游规则仅 payment.create/contract.effectivate/project.create/project.accept/seal.markUsed/supplier.admit,grep lab|sample|instrument|偏差 在 WorkflowService/TriggerRuleEngine 零业务命中。lab 控制器无任何跨模块写;唯一关联是 RdExpense.rdProjectId 一个外键。无实验数据回研发结题/给知产作专利证据/给申报/给生产质量/请购维修成本分摊的任何数据流或工作流联动。", "survives": true, "reNote": "尽力推翻后仍判定缺口属实。实验室模块三实体(LabSample/LabInstrument/QmsRecord)全是纯CRUD,无任何跨模块外键(source/dept/source均为自由字符串,无projectId/contractId/customerId);WorkflowService与TriggerRuleEngine对实验室零规则(grep全空);需求(Request.MD:55)要求的\"样品全流程/检测报告输出/成本核算/质量合规\"对外接口——即与项目/合同(样品委托入口)、客户(报告输出)、预算成本中心(检测成本)、EHS/审计(QMS不符合项)的对接——五类基本全缺。唯一能为缺口减分的发现是:缺口\"无任何跨模块数据流转\"这句略有夸大——LabInstrument校准数据确实跨模块流入AlertController.aggregate()并被MobileController/BusinessBiController/AlertScheduler消费,活体已验证产出一条\"仪器校准/LabInstrument\" danger预警。但这仅是一条只读的预警聚合(单向、外围),不构成需求所要的五类部门级双向接口,亦无任何工作流/触发引擎集成。故缺口的实质判断(对外接口缺失、无引擎联动)成立,无法推翻;仅措辞需修正为\"除rd_expense.projectId外,仅LabInstrument→Alert一条只读聚合,五类业务对接接口全缺\"。", "reEvidence": "实体无FK: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/LabSample.java(仅source字符串)、LabInstrument.java、QmsRecord.java(仅dept字符串)。控制器纯CRUD无跨模块注入: web/LabSampleController.java、web/LabInstrumentController.java、web/QmsRecordController.java。引擎零规则: grep 'LabSample|LabInstrument|QmsRecord|样品|质量体系' 于 service/TriggerRuleEngine.java、service/WorkflowService.java 全空。LabSample/QmsRecord仅被自身控制器+seed消费(grep确认)。唯一跨模块流: web/AlertController.java:150-173 读LabInstrument生成\"仪器校准\"预警,经 task/AlertScheduler.java 推送,并被 web/MobileController.java、web/BusinessBiController.java 的aggregate()复用;活体 GET http://127.0.0.1:8091/api/oa/alerts 返回1条 source=LabInstrument 的 danger 预警(气相色谱仪 YQ-003)。需求出处: /Users/qiu/Desktop/ERP/requirements/Request.MD:55。" }, { "area": "设计研究中心/咨询可研院", "module": "1. 项目全生命周期管理", "verdict": "PARTIAL", "gap": "WBS层级/依赖/交付成果字段、甘特图、标准计划模板库、逾期邮件多渠道提醒、按项目类型分流的立项审批流、结项验收专家组在线评审(抽专家→邀请→打分→结论)全部缺失。", "severity": "high", "evidence": "维持。ProjectTask.java(domain)字段仅 id/projectId/title/assignee/status/dueDate/priority,确无 parentId/层级/dependency/deliverable;ProjectTaskController 仅 list/create/patch(看板拖拽改状态),无 WBS 拆解。Project.java 仅 phase 单字段(立项/中标/执行/验收/关闭),ProjectController.advance() 为线性 PHASES.indexOf 前进/回退,无按 projectType(可研/项目评估/规划咨询/专题)分流立项审批流。grep 甘特/gantt 全仓零命中;grep 邮件/email/smtp/JavaMail 在 service 零命中(NotificationService 无邮件);grep 逾期/overdue 在 service/task 零命中——无多渠道提醒。grep 计划模板/planTemplate/WBS 在 domain/web 零命中——无标准计划模板库。WorkflowService:580 'containsAny(tag,\"立项\",...)' 仅关键词粗匹配。结项验收仅 phase 推进+chainArchiveProject 归档,无抽专家→邀请→打分→验收结论流程。", "survives": true, "reNote": "缺口属实(PARTIAL 判定准确)。设计研究中心模块(oaModules.ts:422 id='design')只挂了 3 个通用主数据 CRUD 页:设计文档/设计变更/设计资源与绩效(design/docs.vue、changes.vue、resource.vue),本中心内不含任何项目全生命周期能力。逐项核查 8 个被指缺失点:\n\n(1)WBS层级——ProjectTask.java(domain)字段只有 projectId/title/assignee/status/dueDate/priority,无 parentId/parent_id,是扁平任务表,无法表达层级。grep 到的 findByParentId 全是 BomItem/CostCenter/Contract/Dept/Folder,与项目任务无关。缺失。\n(2)依赖/前置任务——全仓 grep 无 dependency/前置任务/任务依赖 字段。缺失。\n(3)交付成果字段——Project.java 与 ProjectTask.java 均无 deliverable/交付物 字段。缺失。\n(4)甘特图——确有甘特视图,但在 goal/project.vue(目标管理 /goal/project),且只是按截止日画单条进度条;设计研究中心模块内无甘特。对本模块/链=缺失。\n(5)标准计划模板库——仅有 申报模板库(DeclarationTemplate)/合同模板库(ContractTemplate),无项目计划/WBS 模板库。缺失。\n(6)逾期邮件多渠道提醒——AlertScheduler.scanOvertimeInstances 有逾期扫描,但只调 NotificationService.notify,该类仅写一条站内 Message(类注释自称\"站内消息\"),无 mail/smtp/sms/微信/钉钉/任何第二渠道;且扫的是审批实例滞留,非项目任务逾期。多渠道+邮件=缺失。\n(7)按项目类型分流的立项审批流——projectType 仅存在于 Bid/Opportunity,且只用作报表维度(ReportDefinitionController);Project 实体无 projectType;WorkflowService 对\"立项\"标签只做下游联动\"新建项目台账\",立项流程走固定线性模板,无按类型分流。缺失。\n(8)结项验收专家组在线评审(抽专家→邀请→打分→结论)——Expert 是静态 CRUD 专家库(name/field/org/title/type/phone/status),无抽取/邀请/逐专家评分/汇总结论的会话实体;唯一\"验收\"产物是静态表单模板 src-project-acceptance.ts,含单个\"验收结论\"下拉列+固定线性审批流(资料室→董助→档案室),非专家组在线评审。缺失。\n\n努力推翻未果:以上 8 项中 7 项在本模块完全无实现,第(4)项甘特仅在另一模块以最简形式存在、不服务本链。PARTIAL 成立。", "reEvidence": "oa-backend domain/ProjectTask.java(无 parentId/dependency/deliverable)、domain/Project.java(无 projectType/deliverable,只有 phase 立项-中标-执行-验收-关闭线性)、web/ProjectController.java(advance 仅线性推进 phase)、web/ProjectTaskController.java(扁平任务 CRUD)、domain/Expert.java + web/ExpertController.java(静态专家库 CRUD,无抽取/邀请/评分/结论)、service/NotificationService.java(只写站内 Message,无邮件/短信/多渠道)、task/AlertScheduler.java:91 scanOvertimeInstances(逾期只发站内通知)、service/WorkflowService.java:580(立项仅下游\"新建项目台账\",无按类型分流)、web/ReportDefinitionController.java:174/189(projectType 仅作报表维度);前端 src/data/oaModules.ts:422-429(design 模块仅 docs/changes/resource 三页)、oa/pages/design/{docs,changes,resource}.vue(通用主数据页)、oa/engine/templates/src/src-project-acceptance.ts(静态验收登记表单+固定线性审批,非专家组评审)、oa/pages/goal/project.vue:160-190/354/403(唯一甘特实现,位于目标管理而非设计中心)。" }, { "area": "设计研究中心/咨询可研院", "module": "2. 咨询报告编制管理", "verdict": "LOGIC_GAP", "gap": "报告结构化章节模板与强制维度校验、多级审核+在线评分质疑+电子签名锁定、投资估算与价格库/人力成本库联动均缺失;现有协同/版本/批注是通用 OA 能力而非报告编制专属逻辑。", "severity": "high", "evidence": "维持。确有通用协同承载:CollabDocUpdate.java 是真 yjs CRDT 版本(按 seq 重建文档状态),支持多人协同+版本。但'咨询报告编制'核心逻辑空:grep 章节/reportSection/reportTemplate/可研报告结构化 在 domain/web 仅命中 DesignDoc.java——DesignDoc 只是把'可研报告'当文档类别(docType 枚举之一),非结构化章节模板,无强制维度(技术可行性/市场分析/投资估算/风险评估)填写校验。collab/create.vue 注释自述'选模板→填表单→走流程'的 OA 审批发起器,mock.ts:formTemplates 全是请假/费用报销/用印/采购/出差/加班/物品领用,非报告章节编辑器。grep 电子签名/签发/signature/锁定 在 CollabDoc/Controller 零命中——无多级审核(编制→复核→审核→批准)在线评分质疑+电子签名锁定。grep PriceItem 在 ProjectController/BudgetController 零命中、grep 投资估算/estimate 全仓零命中——投资估算↔财务/价格库/人力成本库联动完全无。", "survives": true, "reNote": "缺口属实,无法推翻。设计研究中心模块在 oaModules.ts(line 422) 只有3个子项:设计文档/设计变更/设计资源与绩效,根本没有\"咨询报告编制\"专属页面。DesignDoc 只是扁平主数据(name/projectName/docType/version/designer/reviewStatus/issueDate),docType 虽含\"可研报告\"、reviewStatus 是自由枚举(编制中/校审中/已批准/已归档)由普通 PUT 直接覆盖——既无结构化章节模板、无强制维度校验,也无多级审核+在线评分+质疑+电子签名锁定。dept 映射清单 kaidiDeptView.ts 里\"咨询报告编制管理\"这个 block 明确指向 path:\"/knowledge/doccenter\"(通用文档中心),正是缺口描述的\"通用 OA 能力而非报告编制专属逻辑\"。价格库/人力成本库(PriceItem/StandardCost)只作为预算主数据独立存在,无任何控制器把它们与报告投资估算联动(DesignDocController/DesignChangeController 均无 priceItem/standardCost 引用)。全后端无 Consult*/Feasibility*/ReportChapter/ReportSection 实体或控制器;ReportController 只是跨模块统计聚合器,SurveyController 是投票问卷。三项主张全部找不到实现。", "reEvidence": "前端模块定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:422-431 (design 仅 docs/changes/resource);设计页 src/oa/pages/design/{docs,changes,resource}.vue 全是 MasterDataPage CRUD;API src/oa/api/design.ts 仅 DesignDoc+DesignChange 增删改查;后端 oa-backend/src/main/java/com/kaidi/oa/web/DesignDocController.java + domain/DesignDoc.java(字段无章节/评分/签名/估算)、domain/DesignChange.java 同样;dept 映射 src/data/kaidiDeptView.ts 中\"咨询报告编制管理\"→path:\"/knowledge/doccenter\";价格/成本库 domain/PriceItem.java、domain/StandardCost.java 与报告无联动;无 Consult*/Feasibility*/ReportChapter/ReportSection 文件(find 返回空);web/ReportController.java 仅统计聚合;web/SurveyController.java 仅投票。" }, { "area": "设计研究中心/咨询可研院", "module": "3. 专家库与人力资源协同", "verdict": "PARTIAL", "gap": "多维检索(地区/经验等级)、智能组队/能力标签/排班、工时实体与人工成本归集、产值/绩效后端核算、专家随机/条件抽取+在线邀请打分全缺,仅专家档案 CRUD+单维筛选。", "severity": "high", "evidence": "维持。Expert.java 字段 name/field/org/title/expertType/phone/status,无地区/从业年限/经验等级/能力标签;ExpertController.list 仅 findByExpertType 单维筛选,无地区/经验等级多维检索。grep 工时/timesheet/manhour/workHour 在 domain/service/web 无任何实体——StandardCost.java:20-21 与 Controller:34 仅注释'从…工时系统…回填''当前实现为手填+自动汇总框架',RdExpense 仅注释'工时单'凭证字面——无工时实体/无人工成本=工时×费率。design/resource.vue 用 settingListStore('design-resource',…) 纯前端 Setting 持久化,工时负载/本月产值/绩效评分为手填列,无后端算。无基于专家库+人员负载的智能推荐/排班;无项目评审随机/条件抽取专家+在线邀请+打分记录(WorkflowService 的 score 是条件分支 token 匹配,非评审打分)。", "survives": true, "reNote": "缺口属实。设计研究中心「专家库与人力资源协同」链确实只有专家档案的最小 CRUD(实际仅 create+read,连 update/delete 都没有) 加单维筛选,描述中列举的高级能力全部缺失:(1) 多维检索——后端 ExpertRepository 仅 findByExpertType 一个方法,Expert 实体只有 name/field/org/title/expertType/phone/status 字段,根本没有「地区」「经验等级」列;活体用 ?region=&level= 过滤返回全部 8 条不变(参数被忽略)。(2) 智能组队/能力标签/排班——后端无任何 team/roster/capabilityTag 实体或端点,POST /experts/team、/draw 均 405。hr/worktime.vue 只是「标准工时/考勤/节假日」静态配置表单,存进通用 settings 键值,不是排班实体。(3) 工时实体与人工成本归集——后端无 timesheet 实体、无人工成本汇总逻辑(grep 命中的 工时/产值/绩效 全在 StandardCost/RdExpense/ContractMilestone 等无关模块)。(4) 产值/绩效后端核算——design/resource.vue「设计资源与绩效」页是纯前端 settingListStore mock(硬编码三行存进 settings 键),无后端计算。(5) 专家随机/条件抽取+在线邀请打分——POST /experts/draw、/random、/invite 返回 405,/experts/1/score 返回 404,全部端点不存在。前端 experts.vue 仅 MasterDataPage 包装(一个搜索框+新增表单)。所有声称缺失的能力均无实现,仅存基础档案 CRUD+单维筛选,PARTIAL 判定成立。", "reEvidence": "后端实体 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Expert.java (字段仅 name/field/org/title/expertType/phone/status,无地区/经验等级);控制器 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ExpertController.java (仅 GET list[按 expertType 单维]/GET by id/POST create,无 update/delete/search/draw/invite/score/team);仓库 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/repository/ExpertRepository.java (仅 findByExpertType);前端页 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/experts.vue (MasterDataPage 包装,无组队/排班/抽取/打分);前端 API /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/governance.ts (仅 listExperts/createExpert);设计资源 mock 页 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/resource.vue (settingListStore 硬编码行);工时配置页 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/worktime.vue (静态配置表单)。活体验证(127.0.0.1:8091):?region=&level= 过滤返回全 8 条不变;POST /experts/draw|/random|/invite|/team 全 405,POST /experts/1/score 404。grep 全后端 domain/ 无 team/roster/timesheet/score/invite/draw/capability 实体(仅通用 ScheduleEvent,与专家协同无关)。" }, { "area": "设计研究中心/咨询可研院", "module": "4. 知识管理与成果沉淀", "verdict": "LOGIC_GAP", "gap": "咨询成果入知识库未单独打通、员工主动提交入口、国标/白皮书/法规库对接、双维结构化标签、语义模糊匹配、知识图谱与 AI 关联推荐均缺;后端虽有真 FTS5 全文检索但仅 substring 非语义。", "severity": "med", "evidence": "维持(证据细化)。需澄清一处:judgment 称'全文检索为前端关键字过滤'低估了系统——FullTextSearchService.java 是真后端 SQLite FTS5 引擎(trigram 分词+bm25 排序+snippet 高亮,索引 公告/讨论/调查/事项/纪要/合同/供应商/客户/公司/文档/协作文档)。但 judgment 所引 knowledge/portal.vue:63 matchDoc 确实只是 .includes() 前端过滤;且 FTS5 是 substring 匹配,非语义模糊匹配。核心缺口仍成立:①TriggerRuleEngine.chainArchiveProject 仅在档案库(Archive)生成'项目档案'记录,未单独打通'咨询成果入知识库';②无员工主动提交总结/技术难点/客户反馈专门入口;③对接国标/白皮书/政策法规库缺(仅 knowledge/rss.vue mock);智能'主题+属性'双维标签/风险等级/关联法规未结构化落库;knowledge/map.vue:172 tagCloud 为硬编码静态标签云+computed mock docRows,非真知识图谱;无 AI 关联推荐(类似案例/失败教训/国标条款/历史成本)。", "survives": true, "reNote": "缺口属实。设计研究中心模块仅3个子页(设计文档/设计变更/设计资源与绩效),无知识管理与成果沉淀链。逐条核验:(1)咨询/设计成果入知识库未单独打通——TriggerRuleEngine 仅有 project.accept→project.toArchive 生成通用\"项目档案\",DesignDocController/design.ts 与 Archive/知识库零联动,设计文档永不入库;(2)员工主动提交入口缺——只有通用上传文档(doccenter),无\"提交成果入知识库\"入口;(3)国标/白皮书/法规库对接缺——\"白皮书\"仅为 FavoriteController 种子收藏的字符串字面量,PolicyController 的 matcher 推荐的是申报补贴政策(申报政策库),与国标法规库无关;(4)双维结构化标签缺——Archive.tags 是单一扁平 String,全仓搜双维/二维标签/tagDimension/结构化标签零命中;(5)语义模糊匹配缺——FullTextSearchService 用 SQLite FTS5 trigram+bm25+snippet,但 trigram MATCH 与 LIKE 兜底都是 substring 匹配(文件注释自述\"统一做 substring 级中文检索\"),无 embedding/向量/相似度,后端无任何 AI/NLP/Lucene/ES 依赖;(6)知识图谱与 AI 关联推荐缺——无 graph/vector/recommend/similarity 代码,knowledge/map.vue 是写死的静态树+mock 数据,\"推荐\"仅出现在 PolicyController 政策匹配与注释中。已尽力推翻但找不到任何实现可反驳,缺口成立。", "reEvidence": "oaModules.ts:422-429(design 仅3子页); DesignDocController.java(无 archive/知识库联动); api/design.ts(grep archive/knowledge/成果/标签=空); TriggerRuleEngine.java:323-369(仅 project.accept→项目档案,非咨询成果); FullTextSearchService.java:33-44 注释\"统一做 substring 级中文检索\"+:278-294 likeSearch %kw% substring; Archive.java:46 private String tags(单一扁平); knowledge/map.vue:67-104,145-179(写死静态树+mock 文档/标签云); 全仓 grep 知识图谱|graph|语义|semantic|embedding|向量|vector|推荐|recommend|相似度|similarity|双维|二维标签|tagDimension 仅命中注释(WorkflowService \"semantics\"、FeedController \"toggle 语义\")与 PolicyController 申报政策 matcher、FavoriteController 种子\"白皮书\"字符串,均非真实现; oa-backend/pom.xml 无 ai/nlp/lucene/es/openai/embedding 依赖" }, { "area": "设计研究中心/咨询可研院", "module": "5. 市场经营与招投标管理", "verdict": "PARTIAL", "gap": "客户画像/满意度/投诉/复购分析字段、投标知识库、保证金退还没收台账闭环、招标自动采集、收款计划与开票自动联动均缺;现为台账录入+合同金额字段。", "severity": "med", "evidence": "维持。Customer.java 字段仅 name/type/contact/phone/address/status,无满意度评分/投诉建议/客户画像/复购机会字段。Bid.java 为投标全周期台账(projectName/bidNo/tenderee/projectType/controlPrice/bidAmount/deposit/bidMethod/status/…),但 deposit 仅单字段无退还/没收流转台账闭环;无投标知识库(过往标书/报价策略/评审记录归档)实体;招标信息无自动抓取(CrawlJob/CrawlSource 为情报中心通用爬虫,未见绑投标)。Contract 有 paidAmount/invoicedAmount 字段,ContractMilestone 有履约节点(amount/dueDate/status),但 grep 收款计划/开票计划/paymentPlan/billingPlan 全仓零命中——无收款计划/开票自动联动逻辑。", "survives": true, "reNote": "尽力推翻后仍确认缺口属实,PARTIAL 判定准确。逐条核查 5 个子项均未实现:(1) 客户画像/满意度/投诉/复购:Customer 实体与 CRM 客户页仅 name/type/contact/phone/address/status 六字段,无画像分级/满意度评分/投诉记录/复购分析;散见的\"投诉/满意度\"命中均无关(QMS种子记录、食堂满意度、调查标题)。(2) 投标知识库:bidding 模块无标书库/案例库/知识库实体或页面,grep 知识库/标书库/案例库 在投标域零命中。(3) 保证金退还/没收台账闭环:Bid 仅有单一 deposit(BigDecimal)金额字段,无 depositStatus/退还/没收/forfeit/refund 状态与日期字段,ledger 页只把 deposit 当金额列展示,无闭环。(4) 招标自动采集:CrawlSource/CrawlJob 实体类注释明确 \"No real network crawling is performed\",为人工触发的模拟批次且服务于情报(Intel),并不自动采集招标公告生成 Bid。(5) 收款计划与开票自动联动:存在 Invoice→Contract 的 invoicedAmount 销项回写(applyContractDelta)及 ContractMilestone 履约节点金额,但无\"收款计划\"实体,也无收款计划↔开票的自动联动。描述\"现为台账录入+合同金额字段\"与实际(Bid CRUD 台账 + Contract/Bid 金额字段 + 中标自动建项目/合同草稿联动)完全吻合。缺口成立,无法推翻。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/Customer.java(仅6字段无画像/满意度/投诉/复购); domain/Bid.java(deposit单字段,无退还/没收状态); web/BidController.java(CRUD+chainWinBid中标联动,无保证金闭环/知识库); domain/CrawlSource.java与domain/CrawlJob.java(注释\"No real network crawling is performed\",模拟采集喂Intel); web/CrawlJobController.java(只读list/get); web/InvoiceController.java(applyContractDelta只做销项→合同invoicedAmount回写,无收款计划实体); domain/ContractMilestone.java(履约节点有amount但非收款计划). 前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/customer.vue(同6字段); src/oa/pages/bidding/ledger.vue(deposit仅money列); src/oa/pages/bidding/board.vue(仅投标规模/中标率/状态分布). grep 客户画像/满意度/投诉/复购/投标知识库/退还/没收/forfeit/refund/收款计划 在源码目录均无对应实现命中。" }, { "area": "设计研究中心/咨询可研院", "module": "6. 财务管理与成本核算", "verdict": "LOGIC_GAP", "gap": "预算层级(parentId)、实际成本实时采集与报销自动归集、人工成本(工时×费率)、成本法/节点法多种收入确认、产值分配到人/部门+奖金核算、预算↔价格库联动、BI 穿透均缺。", "severity": "high", "evidence": "维持。Budget.java 单层(name/projectId/element/budgetAmount/actualAmount/status),无 parentId/总→子项→单项层级;actualAmount 为手填字段(默认 ZERO),非实时采集自动计算实际成本,无费用报销→项目预算科目自动归集。无工时实体故人工成本=工时×费率无法实现(见模块3);grep 成本法/节点法/收入确认/完工百分比 仅命中 ProjectController:138 单一'收入确认凭证'注释——无多种收入确认方式。ProjectController.generateAcceptanceVoucher 取 contract.getAmount()(:159)整额生成一张收入凭证,非按产值确认规则分配到人/部门+关联绩效。grep PriceItem 在 BudgetController 零命中——预算编制与价格库联动未实现。盈亏/部门损益/客户贡献 BI 在 BusinessBiController 为概览级,穿透有限。", "survives": true, "reNote": "尽力推翻但无法推翻——7 条子缺口在代码中逐条坐实,仅有零散的表层占位,核心财务/成本核算逻辑确缺。逐条核验:(1) 预算层级 parentId:Budget.java 实体无 parentId 字段,BudgetController 仅扁平 create/list;parentId 只存在于 CostCenter(成本中心 rollup 树,是另一个实体,非预算层级)。(2) 实际成本采集/报销自动归集:Budget.actualAmount 仅在 BudgetController.create 从请求体手填,无报销/费用实体回填,TriggerRuleEngine 全部 ruleKey 只有 payment/contract/project/seal/supplier,无任何规则触达预算或成本。(3) 人工成本(工时×费率):全栈无 rate×hours 计算;hr/worktime.vue 只是考勤/工时制度配置,design/resource.vue 的\"本月产值\"是手填数字。(4) 成本法/节点法多种收入确认:ProjectController.generateAcceptanceVoucher 仅在验收时一次性按首个合同全额记一张收入凭证(单一节点法),grep 成本法/完工百分比/percentageOfCompletion/recognitionMethod 全空,无方法选择。(5) 产值分配到人/部门+奖金核算:design/resource.vue 是基于 settingListStore 的静态主数据表格,output/score 全手填;\"奖金\"/\"bonus\" 在前端与后端全代码库零出现,无任何分配算法。(6) 预算↔价格库联动:PriceItem 是独立人材机价格库,无任何 Budget 行引用 priceItemId 或取 unitPrice;costcompare.vue 是投标成本 vs 实际成本(超支)比对,与预算↔价格库联动无关。(7) BI 穿透:BusinessBiController 仅内存聚合,grep drill/穿透/下钻 全空。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java(无 parentId 字段,字段仅 id/name/projectId/companySubject/element/year/period/budgetAmount/actualAmount/owner/status/createdAt);oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java:67-91(create 仅 actualAmount=req.actualAmount() 手填,无归集);oa-backend/src/main/java/com/kaidi/oa/web/ProjectController.java:145-176(单一验收节点法记一张收入凭证,无成本法/方法选择);oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:676-686(ruleKeyFor 全部规则键无 budget/cost);oa-backend/src/main/java/com/kaidi/oa/web/PriceItemController.java(独立价格库,无 budget 引用);oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java:37-44(仅内存聚合,grep drill/穿透为空);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/resource.vue:1-37(settingListStore 静态表,output/score 手填,无奖金/分配);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/worktime.vue(仅考勤工时配置,无费率成本)。全栈 grep 奖金/bonus=0,成本法/完工百分比/recognitionMethod=0,穿透/drill(后端 BI)=0。" }, { "area": "设计研究中心/咨询可研院", "module": "7. 合规风控与审计追溯", "verdict": "LOGIC_GAP", "gap": "风险评估模型/量化预警/风险日志、合规性检查引擎与报告合规预检、统一操作日志与不可删留历史版本机制、咨询报告全过程电子证据链均缺;EvidenceController 仅覆盖研发项目。", "severity": "high", "evidence": "维持。grep 风险评估/riskAssess/风险日志/风险等级 在 domain/web/service 无实体——仅 NodeAssigneeResolver:283 用'风险'作审批节点路由 label、DataSeeder 出现'法务风险部'部门名与隐患描述字面,无任何风险评估模型/量化预警/风险日志,立项阶段无市场/技术/合规风险模拟打分。grep 合规检查/章节完整/完整性校验/预检 仅命中 AutomationLogRepository/Bid/Opportunity/FormInstance 的无关字面,无合规性检查引擎/报告提交自动合规预检规则。grep 统一操作日志/operationLog/auditLog 零命中——审批有 FlowTrace、联动有 AutomationLog,但'报告修改/费用报销/人员调配'统一操作日志(操作人/时间/动作)与'核心数据不可删仅留历史版本'未成体系。EvidenceController 经核实仅 @RequestMapping('/api/oa/rd-projects')的 evidenceChain,折叠 RdProject+RdExpense+Patent+Declaration,仅服务研发链6,未覆盖咨询成果报告全过程留痕证据链。", "survives": true, "reNote": "尽力推翻失败,缺口属实。针对设计研究中心/咨询可研院的\"合规风控与审计追溯\"链,逐项核查全部落空:\n\n1) 风险评估模型/量化预警/风险日志——不存在。无任何 RiskScore/风险评分/风险模型 service,无 risk_assessment 域实体或控制器(活体 /api/oa/risk-assessments 返回 404)。法务合规中心的 legal/compliance.vue 仅是 settingListStore 静态台账,\"风险等级\"是手填的高/中/低下拉,纯静态、无量化模型、无预警、无风险日志,且属法务合规中心而非设计中心。AlertController 是跨中心期限预警聚合(证件/专利/库存/校准/隐患/超支/审批超时),不含任何设计/咨询报告的风险量化或合规判定。\n\n2) 合规性检查引擎与报告合规预检——不存在。无 ComplianceCheck/合规引擎 service,无合规检查控制器(活体 /api/oa/compliance-checks 返回 404)。DesignDocController 对可研报告等只有裸 CRUD(编制中/校审中/已批准/已归档 状态机靠手改 reviewStatus),无任何提交前的合规预检逻辑。\n\n3) 统一操作日志与不可删留历史版本机制——不存在。全工程无 @Aspect/@Around/@AfterReturning 操作日志切面,无 operation_log/OperationLog 域实体(活体 /api/oa/operation-logs 返回 404)。无 version/history/snapshot/revision 历史版本实体;DesignDoc.version 只是一个可被 PUT 任意覆盖的自由文本串,且 DesignDocController/DesignChangeController 都开放 DELETE 物理删除,毫无\"不可删+留历史版本\"约束。最接近的 FlowTrace 仅是审批流转留痕(绑 form instance),AutomationLog 仅是办结后下游联动台账,二者都不覆盖设计文档/咨询报告的全字段变更历史。\n\n4) 咨询报告全过程电子证据链——不存在。EvidenceController 仅 @RequestMapping(\"/api/oa/rd-projects\") 暴露 /{id}/evidence-chain,且只折叠 RdProject+RdExpense+Patent+Declaration(研发立项-费用-知识产权-申报,业务链6)。活体验证:/api/oa/rd-projects/1/evidence-chain 返回 200,而 /api/oa/design-docs/1/evidence-chain 返回 404,设计/咨询域无任何证据链聚合。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java (第32行 @RequestMapping(\"/api/oa/rd-projects\"),仅折叠RdProject/RdExpense/Patent/Declaration,注释明写\"business chain 6\"研发链);web/DesignDocController.java (设计研究中心可研报告等裸CRUD,version为自由文本,开放DELETE,无合规预检/历史版本);web/DesignChangeController.java (第93行开放@DeleteMapping);web/AuditProjectController.java (审计项目裸CRUD,无操作日志/证据链);web/AlertController.java (跨中心期限预警聚合,无设计域风险量化)。\n缺失证据(grep全工程为空): 无 @Aspect/@Around/@AfterReturning/OperationLog/operation_log 操作日志切面;service/ 目录无 Risk/Compliance 引擎(仅 Auth/Authorization/FullTextSearch/Mention/NodeAssigneeResolver/Notification/Payment/TriggerRule/Workflow);domain/ 无 version/history/snapshot/revision/risk 实体。\n前端: ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts (第422-429行 design 中心仅 docs/changes/resource 三子模块);oa/api/design.ts (仅 design-docs/design-changes CRUD);oa/pages/legal/compliance.vue (settingListStore静态台账,风险等级手填下拉,属法务合规中心非设计中心)。\n活体验证(127.0.0.1:8091, admin/123456): GET /api/oa/rd-projects/1/evidence-chain → 200(研发链证据链存在); GET /api/oa/design-docs/1/evidence-chain → 404; GET /api/oa/compliance-checks → 404; GET /api/oa/risk-assessments → 404; GET /api/oa/operation-logs → 404。" }, { "area": "设计研究中心/咨询可研院", "module": "8. 与其他部门的接口要求", "verdict": "MISSING", "gap": "五条跨部门接口(申报服务/知识产权/实验室/财务/人力)均无本单元专属数据流实现:报告结论提取、咨询→专利数据递交、项目↔LabSample 关联、按本单元口径的财务凭证打通、工时绩效对接全缺。", "severity": "med", "evidence": "维持。逐条核实需求接口数据流均无对应实现:①向申报服务部提取咨询报告关键结论(投资规模/经济效益/可行性结论)+成果汇总表——grep 申报服务/关键结论/可行性结论/咨询→专利 全仓零命中,无报告结论结构化提取与导出接口;②向知识产权部输出评估方法/分析模型+原始研究数据作专利证据——Patent.java 仅 rdProjectId(研发链6),无咨询项目 source,无咨询→专利手递手;③咨询涉检测→实验室检测报告回流——LabSample.java 仅有 source 字符串枚举('项目自检/客户委托'),无 projectId FK,无项目↔LabSample 关联;④向财务部输出预算/报销/收款开票/成本分摊凭证——Budget/Voucher/Contract 实体在但非按本单元口径打通(见模块6);⑤向人力资源部取人员档案/工时/绩效/培训——工时与绩效本就无实体(见模块3/6),无法对接。", "survives": true, "reNote": "缺口属实,无法推翻。设计研究中心/咨询可研院单元只有最朴素的独立 CRUD(DesignDoc + DesignChange),五条跨部门接口均无本单元专属数据流:\n\n1) 申报服务(Declaration):Declaration 只有 rdProjectId 关联 RdProject,无任何 designDocId/可研报告结论字段,DeclarationController 无 design/report/结论/提取 相关逻辑——「报告结论提取」缺失。\n2) 知识产权(Patent):Patent 只有 rdProjectId,PatentController.create 仅从 rdProjectId 取值,无 consulting/design/可研 来源——「咨询→专利数据递交」缺失。\n3) 实验室(LabSample):LabSample 无 projectId/designDocId 外键,只有自由文本 source(活体值为\"项目自检\"/\"监督抽查\"),全后端 grep web/ service/ 中 LabSample 与 project/design/关联 零命中——「项目↔LabSample 关联」缺失。\n4) 财务凭证(Voucher):Voucher.sourceType 在全后端只出现 \"payment\"/\"acceptance\"/\"项目\"(PaymentService、ProjectController、TriggerRuleEngine),无 design/consulting/可研 来源——「按本单元口径的财务凭证打通」缺失。\n5) 人力/工时绩效(HR):design 模块第三页\"设计资源与绩效\"(resource.vue) 用通用 settingListStore 键值表存本地手填的 load/score,未连任何 HR/timesheet/绩效模块数据流——「工时绩效对接」缺失。\n\n此外 TriggerRuleEngine(办结后下游联动)的全部规则只覆盖 付款/用印/收款/验收结项/供应商准入/合同/立项,完全不含任何 design/consulting/可研/专利/实验室 联动分支。DesignDoc 与 projectName 仅为自由文本字符串(活体确认),无任何外键。", "reEvidence": "后端 grep \"designDocId|designId|reportConclusion|报告结论|可研结论|consultingId\" 全库零命中(仅 DataSeeder 种子里的\"咨询\"文本字符串)。\n- /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/DesignDoc.java:字段仅 name/projectName/docType/version/designer/reviewStatus/issueDate/createdAt,无任何外键。\n- /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/DesignDocController.java:纯 CRUD,无下游写入/联动。\n- /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Declaration.java:34 只有 rdProjectId;DeclarationController 无 design/结论/提取 逻辑。\n- /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java:38 只有 rdProjectId;PatentController.create 仅 setRdProjectId。\n- /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/LabSample.java:仅自由文本 source(第30行),无 projectId/designDocId;grep web/ service/ 中 LabSample×project/design 零命中。\n- Voucher.sourceType 全库实际取值:PaymentService.java:127 \"payment\"、ProjectController.java:173 \"acceptance\"、TriggerRuleEngine.java:359 \"项目\",无 design/consulting。\n- service/TriggerRuleEngine.java 规则分支(行109-126)仅 付款/用印/收款/验收/供应商/合同/立项,无 design/patent/lab/可研。\n- /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/design.ts:仅 DesignDoc+DesignChange CRUD,无跨部门接口。\n- /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/resource.vue:2-3 用 MasterDataPage+settingListStore(通用键值表)存本地手填 工时负载/绩效评分,未连 HR。\n- 活体(127.0.0.1:8091):/api/oa/design-docs 返回字段无任何 *Id 关联;/api/oa/lab-samples 的 source 为\"项目自检\"/\"监督抽查\"自由文本,无外键。" }, { "area": "设计研究中心/规划设计部", "module": "1. 设计项目与任务管理", "verdict": "LOGIC_GAP", "gap": "维持初判:无设计立项页(无可研/合同/阶段/预算关联);ProjectTask 无 WBS/parent/依赖/进度汇总/超期预警;甘特非按设计 WBS 生成;无设计日历/资源排程/外协预约。", "severity": "high", "evidence": "无任何'设计项目立项'页/控制器。Project(domain/Project.java)只有 name/owner/deptId/start-end/progress/status/phase(立项-中标-执行-验收-关闭),没有关联可研报告/合同/设计阶段(方案-初设-施工图)/设计范围/设计预算的字段;ProjectController.advance 仅推进生命周期阶段并生成验收凭证,与'设计项目立项'无关。ProjectTask(domain/ProjectTask.java)字段仅 projectId/title/assignee/status(待办-进行中-已完成)/dueDate/priority——无 parentId/WBS、无任务依赖(dependsOn)字段、无 0-100% 进度、无超期自动预警上报。parentId 树仅 BomItem/CostCenter 有,ProjectTask 没有。甘特仅存在于 goal/project.vue(通用 goal 版),设计页(oa/pages/design/*)未引用 gantt;无设计日历/资源排程/外部设计院临时预约。", "survives": true, "reNote": "缺口属实。尽力反驳后仍无法证伪四项子缺口中的任何一项。(1) 设计研究中心模块(oaModules.ts id:'design' L421-431)只有3个纯列表页:设计文档/设计变更/设计资源与绩效,无任何\"设计立项\"页,design/目录下grep'立项|可研|预算|合同'零命中;design.ts API 仅 /design-docs 与 /design-changes,无立项实体。kaidiDeptView.ts 把设计中心的\"研发过程管理\"刻意指向通用 /goal/project,把\"立项\"指向 /rd/project(研发立项),确认没有设计专属立项入口、无可研/合同/阶段/预算关联建模。(2) ProjectTask 实体(domain/ProjectTask.java)仅7个扁平字段 id/projectId/title/assignee/status/dueDate/priority,无 WBS 编码、无 parentId/父子层级、无 dependsOn/前置依赖、无 progress 进度、无超期预警字段;控制器(ProjectTaskController.java)只有 list/create/patch,无任何汇总或预警逻辑。(3) 全工程唯一甘特在 goal/project.vue(L160-190),按\"项目起始为基线、每任务一条到截止日的条\"绘制,纯扁平、无 WBS 层级/无依赖/无进度汇总,且位于 goal(目标管理)模块而非 design 模块,正是描述所言\"甘特非按设计 WBS 生成\"。(4) design 目录 grep'日历|排程|预约|资源排'零命中,ScheduleEventController grep'design|外协|资源排程|排班'零命中,无设计日历/资源排程/外协预约。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/ProjectTask.java(仅7扁平字段,无WBS/parent/depends/progress/预警); oa-backend/src/main/java/com/kaidi/oa/web/ProjectTaskController.java(仅list/create/patch,无汇总/预警); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts L421-431(design仅docs/changes/resource三页); ofbiz-framework/plugins/modern-ui/app/src/oa/api/design.ts(无立项,仅文档/变更); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/{docs,changes,resource}.vue(均为MasterDataPage纯CRUD列表,无可研/合同/阶段/预算); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/project.vue L160-190(唯一甘特,扁平按截止日,无WBS/依赖/汇总,且在goal非design模块); oa-backend/src/main/java/com/kaidi/oa/domain/Project.java(仅name/owner/deptId/start/end/progress/status/phase,无feasibility/budgetId/contractId/wbs/baseline字段); design目录与ScheduleEventController对'日历/排程/外协/资源排程'grep零命中" }, { "area": "设计研究中心/规划设计部", "module": "2. 图纸与文档全生命周期管理", "verdict": "LOGIC_GAP", "gap": "维持初判:版本手填非自动递增;状态仅下拉无真状态机/发布锁定;无 CAD/Revit 上传/冲突检测/属性提取;无分发记录/签章/二维码;无多级审签/红线批注;无全文检索/打包下载。", "severity": "high", "evidence": "DesignDocController 为纯 CRUD:version 是手填字符串(create/update 仅 setVersion(req.version()),无 v1.0/v1.1 自动生成,grep nextVersion/incrementVersion 仅命中 ContractTemplate/DeclarationTemplate 的固定 V1.0 默认值)。reviewStatus(编制中/校审中/已批准/已归档)只是下拉枚举,前端 docs.vue 用 select 直改,无状态机、无发布后锁定/强制走变更流程的代码。无文件上传字段(DesignDoc 无 fileUrl/CAD/Revit),无冲突检测/属性自动提取;无对外分发记录实体(接收人/时间/版本)、无电子签章/二维码;无多级审签流(grep workflow/FlowTask in DesignDocController = 空)、无红线批注/修改清单;无全文检索(search-keys 仅前端 name/projectName/docType/designer 内存过滤)、无关联打包下载。", "survives": true, "reNote": "缺口属实,无法推翻。设计研究中心\"图纸与文档全生命周期管理\"在后端(DesignDocController/DesignChangeController + DesignDoc实体)和前端(design/docs.vue、design/changes.vue)均为纯CRUD,逐条核验全部子点均未实现:(1)版本=普通String字段,create时直接 d.setVersion(req.version()) 手填,无自动递增逻辑;(2)状态(reviewStatus/status)=普通String,PUT直接覆盖任意值、前端仅el-select下拉,无状态机/转换校验/发布锁定,任何状态可跳任何状态;(3)无CAD/Revit上传——DesignDoc实体无文件/附件字段(仅name/projectName/docType/version/designer/reviewStatus/issueDate/createdAt),全库grep revit/dwg/rvt/ifc/冲突检测/属性提取在design域零命中;(4)无分发记录/签章/二维码字段或端点;(5)无多级审签/红线批注——控制器无review/approve/sign端点,无markup引用;(6)无全文检索(design未被FullTextSearchService/FtsIndexRunner索引)、无打包下载端点。已尽力查找隐藏实现均无所获。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/DesignDocController.java (L58-74 create直接setVersion/setReviewStatus手填; L77-94 update无状态机仅覆盖字段); oa-backend/src/main/java/com/kaidi/oa/domain/DesignDoc.java (L24-38 字段无file/attachment/qr/seal); oa-backend/src/main/java/com/kaidi/oa/web/DesignChangeController.java (L71/87 status纯字符串覆盖); oa-backend/src/main/java/com/kaidi/oa/repository/DesignDocRepository.java (仅findByReviewStatus)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/docs.vue 与 changes.vue (均为MasterDataPage纯CRUD,状态为select下拉); ofbiz-framework/plugins/modern-ui/app/src/oa/api/design.ts (DesignDoc接口无文件字段)。否定证据: grep 'revit|dwg|rvt|ifc|红线|markup|二维码|qrcode|签章|冲突检测|属性提取|分发记录|多级审签|发布锁定' 在DesignDoc/DesignChange相关代码零命中; FullTextSearchService.java 与 FtsIndexRunner.java grep 'design' 零命中。" }, { "area": "设计研究中心/规划设计部", "module": "3. 设计变更管理", "verdict": "LOGIC_GAP", "gap": "维持初判:impact/成本/工期手填无自动测算;无变更等级分级审批与会签;无审批留痕;无变更指令自动生成/派发/版本强更/跨专业通知;无台账统计;status 仅手改字符串。", "severity": "high", "evidence": "DesignChangeController 纯 CRUD:impact 为手填字符串(setImpact(req.impact())),无关联成本数据库+项目计划的自动测算代码。无变更等级(重大/一般/轻微)字段与分级审批链/多方会签;status(申请/审批中/已实施/已驳回)仅手改字符串,update 直接 setStatus,无审批留痕(无 FlowTask/WorkflowService 调用)。审批通过后无自动生成变更指令/派发设计师/强制图纸版本更新/通知受影响专业的逻辑;DesignChange/DesignDoc 实体在 service/ 下被引用 0 处(grep 空),即从未接入 TriggerRuleEngine——无下游联动。无按项目/时间/原因的变更台账统计接口。", "survives": true, "reNote": "缺口属实,尽力推翻未果。设计变更管理(设计研究中心/规划设计部, 模块33 design)从实体到前端到活体均为最朴素CRUD,初判的每一条子项均成立:(1) impact/成本/工期手填无自动测算——DesignChange实体仅有 docName/projectName/reason/changeType/impact/status/applicant/createdAt 八个字段,impact 是纯文本\"影响说明\",无任何 cost/duration/工期数值字段或测算逻辑(grep cost|duration|工期|测算|grade|level|等级 在 domain+controller 零命中);活体数据印证——id=1 的 impact=\"桩基础形式调整, 增加造价约80万\",造价是写进散文里的文字而非可计算数值。(2) 无变更等级分级审批与会签——实体无 level/grade 字段;DesignChangeController 仅 list/get/create/update/delete 纯 CRUD,不调用 WorkflowService;WorkflowService 虽有通用会签(会签同步节点)机制但完全基于 FormInstance,无任何代码把 DesignChange 接入。(3) 无审批留痕——controller 不写 AutomationLog,TriggerRuleEngine/WorkflowService 全文 grep design 零命中。(4) 无变更指令自动生成/派发/版本强更/跨专业通知——无 change-order/指令/version/notify 任何字段或方法。(5) 无台账统计——DesignChange 在 BusinessBi/DataCenter/Report 控制器零引用,grep 全 web 包仅 DesignChangeController 自身命中。(6) status 仅手改字符串——status 是 String,前端 changes.vue 用 MasterDataPage 通用增删改页,status 为手选下拉('申请/审批中/已实施/已驳回'),update() 直接覆盖字符串,无状态机/流转校验。", "reEvidence": "后端实体 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/DesignChange.java (仅8字段,impact/status 均 String,无 cost/duration/level/version 等);控制器 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/DesignChangeController.java (list/get/create/update/delete 纯CRUD; create 第71行 status 默认\"申请\"否则原样存; update 第87行 status 直接覆盖; 不调 WorkflowService/不写 AutomationLog);仓储 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/repository/DesignChangeRepository.java (仅 findByStatus);前端页 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/changes.vue (MasterDataPage 通用CRUD; impact 普通文本列/字段; status 手选下拉);前端API /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/design.ts (DesignChange 接口同8字段,4个 http CRUD 函数);种子 DataSeeder.java:3004-3032 designChange() 直存字符串。活体验证:POST /api/oa/auth/login 取 token 后 GET http://127.0.0.1:8091/api/oa/design-changes 返回6条,id=1 impact 为纯文本含\"增加造价约80万\"、status=\"已实施\",证实运行时与代码一致。grep 证据:在 DesignChange domain+controller 搜 cost|duration|工期|测算|grade|level|等级 EXIT=1 零命中;在 TriggerRuleEngine.java/WorkflowService.java 搜 design 零命中;在全 web 包搜 DesignChange 仅 DesignChangeController.java 命中(无BI/统计接口引用)。" }, { "area": "设计研究中心/规划设计部", "module": "4. 设计协同与接口管理", "verdict": "MISSING", "gap": "维持初判:提资、BIM碰撞、外协门户、设计完成触发施工招标/指标超限预警/选型推采购预询价三大联动——全部缺失。", "severity": "high", "evidence": "全代码库 grep '提资/碰撞/collision/BIM/外部设计院/含钢量/混凝土量/窗地比/设计指标/限额/超限/预询价/设计选型' 在 web/domain/service 下均无命中(唯一'超限'命中是 AuthService 登录锁定,无关)。无专业间提资实体(请求/资料版本/接收确认/逾期提醒);无 BIM 碰撞检查/报告/分配/闭环;无外部设计院门户/访问日志/外协派发评估。三大联动均无:DesignDoc/DesignChange 从未被任何 service/引擎引用(grep 空),TriggerRuleEngine 无 design/施工招标/指标超限/采购预询价的 ruleKey。", "survives": true, "reNote": "缺口属实,无法推翻。设计研究中心模块只有最基础的两实体 CRUD(DesignDoc 设计文档、DesignChange 设计变更)外加一张纯前端 mock 的「设计资源与绩效」页(settingList 本地存储,无后端)。彻查全部真实源码(排除 node_modules/static/generated 等构建产物)后,6 项声称功能全部不存在:\n\n(1) 提资/专业接口管理:grep「提资/互提/专业接口/接口管理」零命中(仅 kaidiDeptView.ts 部门视图元数据里有泛化的 interfaces 字段列邻接部门,非功能实现)。\n(2) BIM 碰撞检测:grep「BIM/碰撞/clash/collision」在真实源码零命中。\n(3) 外协门户:grep「外协门户/协作门户/外协单位/外部设计」零命中。\n(4) 设计完成触发施工招标:TriggerRuleEngine 只有 7 条规则(payment/seal/invoice/accept/supplier/contract/project),无任何 design→bid 规则;DesignDoc/DesignChange 的 reviewStatus 置为「已批准/已归档」也不触发任何下游。\n(5) 指标超限预警:「超限」仅命中 AuthService 登录失败锁,与设计指标无关。\n(6) 选型触发采购预询价:「预询价」零命中;「选型」仅 DataSeeder 种子文案与 knowledge map 标签。\n\n决定性证据:DesignDoc/DesignChange 在后端只被自己的 domain/repository/controller/seeder 引用,WorkflowService 与 TriggerRuleEngine 对「design/设计/施工图」均零引用——设计实体与审批流转/办结联动引擎完全脱钩,不可能实现任一联动。判定 MISSING 成立。", "reEvidence": "后端控制器仅 DesignDocController.java(/api/oa/design-docs 纯CRUD)与 DesignChangeController.java(/api/oa/design-changes 纯CRUD);实体 domain/DesignDoc.java、domain/DesignChange.java 无任何接口/碰撞/外协字段。前端 data/oaModules.ts:422-431 设计研究中心仅 3 子项(docs/changes/resource),resource.vue 为 settingListStore 本地 mock。service/TriggerRuleEngine.java:109-127 的 containsAny 关键词链不含任何设计/施工图/招标/选型/碰撞分支;grep 确认 WorkflowService.java 与 TriggerRuleEngine.java 对「design/设计/施工图」零命中;grep 全源码(含 *.vue/*.java,排除 node_modules/static/generated/*.json)对「提资/BIM/碰撞/clash/外协门户/预询价」全部零命中。" }, { "area": "设计研究中心/规划设计部", "module": "5. 设计资源与绩效管理", "verdict": "PARTIAL", "gap": "维持初判:能力库无结构化字段与匹配;工时无计时/填报与成本归集预警;产值手填非自动核算/分阶段;考核指标无自动统计;绩效看板缺失;score 手填。", "severity": "med", "evidence": "design/resource.vue 用 settingListStore('design-resource') 的本地 mock 列表,字段仅 name/major(建筑/结构/机电下拉)/projects/load(工时负载手填字符串如'92%')/output(本月产值,number 手填)/score(绩效评分,number 手填)。无结构化能力库字段(无职称/项目经验/出图速度/变更率),无按能力匹配任务;无工时计时器/按项目任务填报(load 是手填文本非计时数据),无人工成本归集(工时×费率)对比预算预警;output 为手填非按合同额/工作量自动算、无按阶段分配;考核指标(一次审签通过率/变更率/按时交付率/满意度)无自动统计逻辑,无绩效看板聚合,score 手填。仅有一张可增删改查的人员表 → PARTIAL 成立。", "survives": true, "reNote": "缺口属实,对抗性彻查后无法推翻。设计研究中心仅有3个子页(设计文档/设计变更/设计资源与绩效),其中\"设计资源与绩效\"页 resource.vue 是纯扁平 CRUD 台账,逐项核对缺口的每个论点均成立:\n\n1. 能力库无结构化字段与匹配:resource.vue 仅有 name/major/projects/load/output/score 六个手填字段,major 只是 ['建筑','结构','机电'] 三选一的 select,没有技能等级/资质/匹配算法,无任何\"能力库→项目\"结构化匹配。\n\n2. 工时无计时/填报与成本归集预警:'load'(工时负载)是一个手填文本字段(如 '92%'),不是计时器或工时填报单。后端无 timesheet/worktime-entry 实体或端点(活体探测均 HTTP 404)。hr/worktime.vue 只是全局考勤\"规则配置页\"(上下班时间/考勤判定/节假日),与设计工时填报和成本归集无关,也无成本预警。\n\n3. 产值手填非自动核算/分阶段:'output'(本月产值)是 createFields 里 type:'number' 的手填字段,非自动核算、无分阶段。(ProjectController 的\"产值\"自动确认只针对项目验收,与设计人员产值无关。)\n\n4. 考核指标无自动统计:无任何 KPI 自动统计端点(kpi -> HTTP 404),'score' 由 createFields 手填(type:'number')。\n\n5. 绩效看板缺失:design 目录下无任何 dashboard/看板组件(grep 结果 NONE),performance-board 端点 HTTP 404。\n\n6. score 手填:确认,createFields 中 { id: 'score', label:'绩效评分', type:'number' }。\n\n底层存储 settingListStore('design-resource') 走 /biz/{type} 的 BizRecordController,是逐行原样存取的通用 CRUD(grep 无 产值/绩效/工时/compute/calc/sum 等任何计算关键字),不做任何领域计算。后端无 Timesheet/Capability/Performance/Score/KPI 任何 domain 实体,设计中心后端仅 design-docs 与 design-changes 两个控制器。", "reEvidence": "前端页面: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/design/resource.vue (第6行 settingListStore('design-resource',种子数据 score/output/load 全为字面值; 第21-28行 createFields 全部手填, output/score type:'number', load 文本, major 三选一 select; 无任何计算/计时/看板).\n通用存储: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts (走 /biz/{key} 逐行原样 CRUD).\n模块定义: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts 第422-429行 (design 仅 docs/changes/resource 三页).\n后端: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ 仅 DesignDocController(/api/oa/design-docs)与 DesignChangeController(/api/oa/design-changes); 无 design-resource 端点; domain/ 下无 timesheet/capability/performance/score/kpi 实体; BizRecordController 无任何计算关键字.\n活体(127.0.0.1:8091): GET /api/oa/biz/design-resource 返回扁平 data 数组无计算字段; timesheet/worktime-entry/capability/design-capability/kpi/performance-board/design-output 端点全部 HTTP 404." }, { "area": "设计研究中心/规划设计部", "module": "6. 设计标准与知识库", "verdict": "MISSING", "gap": "维持初判:标准图集/模板/节点大样一键引用、规范法规库实时更新+设计中检索、典型问题负面清单自动推送、优秀案例库多维检索——全无。", "severity": "med", "evidence": "design 模块(oaModules.ts id='design')仅 docs/changes/resource 三页,无标准库/知识库入口。grep '标准图集/设计说明模板/通用节点大样/典型问题库/优秀案例库/案例库' 在设计侧无命中。设计页未引用任何'知识库/标准图集'。虽全站有 knowledge(知识社区)/archive(档案知识中心)通用模块,但均非设计专用,且无'一键引用自动适配项目参数'、无国标/行标实时更新与设计中检索关联、无典型问题库新项目自动推送、无优秀案例库按类型/规模/风格检索的任何实现。", "survives": true, "reNote": "缺口属实。设计研究中心(design)模块只有3个子页:docs(设计文档)、changes(设计变更)、resource(设计资源与绩效),无任何\"设计标准与知识库\"专属页。kaidiDeptView.ts里规划设计部的\"设计标准与知识库\"块虽标 status:built,但 path 指向 /knowledge/portal——那是通用知识社区文档门户(portal.vue),仅做:文档总数/已发布/本月新增统计瓷砖、按文件夹聚合的分类导航、最新文档列表、上传贡献榜、知识达人。它把 docType 仅作\"类型\"字段(可研报告/初设/施工图/计算书/专项方案),没有标准图集/模板/节点大样的\"一键引用\"机制,没有规范法规库及其实时更新+设计中检索,没有典型问题负面清单的自动推送,没有优秀案例库的多维检索。前后端全量 grep(图集/节点大样/标准图/法规库/规范库/负面清单/典型问题/案例库/优秀案例/多维检索/atlas/negative-list/case-library) 后端零命中、前端仅在无关 mock 文案出现。后端无 DesignStandard/Atlas/CaseLibrary/Regulation 等实体,唯一含\"standard\"的是 StandardCostController(标准成本,预算中心),与设计标准无关。所谓\"built\"是借通用知识门户冒名顶替,4 项设计标准专属能力全无实现。", "reEvidence": "前端模块定义:ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts L421-431(design 仅 docs/changes/resource 三子页)。部门映射顶替证据:src/data/kaidiDeptView.ts(规划设计部\"设计标准与知识库\" status:built 但 path:/knowledge/portal)。顶替页实体:src/oa/pages/knowledge/portal.vue(纯通用文档门户:stats/分类/最新文档/上传贡献榜/知识达人,无标准图集/法规库/负面清单/案例库检索)。设计页:src/oa/pages/design/docs.vue、resource.vue。设计 API:src/oa/api/design.ts(仅 design-docs/design-changes CRUD)。后端实体:oa-backend/src/main/java/com/kaidi/oa/domain/DesignDoc.java(字段 name/projectName/docType/version/designer/reviewStatus/issueDate,无图集/大样/法规/案例)。后端 domain 目录无 Standard/Atlas/CaseLibrary/Regulation 实体;唯一 standard 控制器 web/StandardCostController.java 是标准成本(@RequestMapping /api/oa/standard-costs)。全仓 grep 图集/节点大样/法规库/负面清单/案例库/多维检索 后端零命中。活体探测 design-standards/design-atlas/case-library/negative-list/regulation-library 均无对应控制器。" }, { "area": "设计研究中心/规划设计部", "module": "7. 合规与审计追溯", "verdict": "MISSING", "gap": "维持初判:图纸全操作留痕+不可篡改、数字签名+可信时间戳、设计过程审计报告——全部缺失;尾部混入需求亦未在设计侧实现。", "severity": "high", "evidence": "DesignDocController/DesignChangeController 无任何操作日志:grep 'getRemoteAddr/IP/操作日志/viewLog/downloadLog' 均空——图纸查看/下载/修改/分发/删除无操作人/时间/IP 留痕,关键数据无不可篡改实现(delete 为硬删 deleteById)。无符合《电子签名法》的数字签名/可信时间戳(grep signature/可信时间 在设计侧无命中,DesignDoc 仅有 createdAt 系统时间戳,非可信时间戳)。无按项目/时间段自动生成设计过程审计报告(版本轨迹/审批流程/外发记录)的接口。需求尾部合同模板/物料成本核算/履约提醒在设计侧未实现(ContractTemplate 存在但属合同中心,非设计)。", "survives": true, "reNote": "missing - design center has no op-trace, no tamper-proof, no signature or timestamp, no audit report", "reEvidence": "DesignDoc.java has only createdAt; AuditProjectController.java is CRUD only; no operation_log or aspect in backend; only SHA-256 is PasswordUtil.java; design pages are MasterDataPage CRUD" }, { "area": "设计研究中心/规划设计部", "module": "8. 与其他部门的接口要求", "verdict": "MISSING", "gap": "维持初判:六条跨部门接口自动联动全无;尾部加签/审批追踪/触发财务应收/定时备份在设计侧未接入引擎、未实现。", "severity": "high", "evidence": "DesignDoc/DesignChange 实体在 service/ 与 TriggerRuleEngine 中被引用 0 处(grep 空),即设计侧从不向任何引擎发联动事件。TriggerRuleEngine 无 design 相关 ruleKey。六条接口(咨询院投资估算→设计限额、图纸→申报服务部许可证、创新点→知识产权部专利、材料检测→实验室回检测、工程量→成本采购招标、变更指令/会审/竣工图→工程管理部)均无自动联动代码。尾部'条件分支加签/审批追踪/审批后触发财务应收/定时备份多版本恢复':WorkflowService/TriggerRuleEngine 虽具备条件分支与办结后联动的通用能力,且 ProjectController 有验收→自动生成应收凭证,但设计侧(DesignDoc/DesignChange)从未接入这些引擎,故在'设计侧'未实现。", "survives": true, "reNote": "缺口属实,无法推翻。六条跨部门接口在设计侧无任何自动联动;设计控制器纯CRUD不进引擎;加签、审批追踪、触发财务应收在通用层存在但设计审批从不进入引擎;定时备份全后端零实现。", "reEvidence": "DesignDocController/DesignChangeController 纯CRUD无引擎引用;设计实体无工作流字段;TriggerRuleEngine 无设计规则;应收规则只命中收款类目;TemplateSeedData 无设计审批模板;唯一定时任务 AlertScheduler 只做证件到期与超时,非备份;后端无任何备份代码。" }, { "area": "设计研究中心/工程监理部", "module": "1. 监理规划与准备工作管理", "verdict": "MISSING", "gap": "缺监理机构与岗位职责/签字权限配置、证书有效期预警(公司级 CertificationController 有 expireDate→即将到期/已过期派生,但未接入监理人员执业资格配置);缺监理规划/细则在线编制+总监审核+版本受控;缺检测设备台账与校准证书;缺图纸会审纪要与 DesignDoc 版本关联。", "severity": "high", "evidence": "工程监理整模块前后端仅一张扁平日志表。后端 web/SupervisionLogController.java + domain/SupervisionLog.java 字段只有 projectName/logType/content/problem/handleStatus/supervisor/logDate;前端 src/oa/pages/supervision/logs.vue 是唯一页面,oaModules.ts:433 supervision 模块只挂 1 个子项 logs。无监理机构/岗位职责/签字权限配置实体,无监理规划/细则在线编制+总监审核+版本受控,无检测设备台账/校准证书,无图纸会审纪要与设计部图纸版本关联。", "survives": true, "reNote": "Gap real. Supervision has only SupervisionLog and logs.vue.", "reEvidence": "SupervisionLogController CRUD only; oaModules 433-438 only logs.\n\n" }, { "area": "设计研究中心/工程监理部", "module": "2. 施工准备阶段监理", "verdict": "MISSING", "gap": "缺施工单位资质与许可证审查+有效期预警;缺施工方案报审流程(专监审查→总监签认→反馈);缺测量复核记录+不合格触发整改单;缺开工条件逐项核查表与开工令签发。", "severity": "high", "evidence": "SupervisionLog 无任何施工准备阶段字段或子流程;全后端 grep '开工令/开工条件/测量复核/方案报审/资质审查' 仅命中 SupervisionLog 的 logType 枚举字符串与 DataSeeder 种子文本,无对应实体/控制器/审批流。WorkflowService 未注册任何监理报审流程。", "survives": true, "reNote": "缺口属实,四项施工准备阶段监理功能均未实现。工程监理中心(supervision)前端仅有一个页面 /supervision/logs(监理记录),后端仅有 SupervisionLogController + SupervisionLog 实体。kaidiDeptView.ts 中\"工程监理部 > 施工准备阶段监理\"这一 block 被直接映射到 /supervision/logs(pageLabel\"监理记录\"),而该页面只是通用 CRUD 台账。逐项核查:(1)施工单位资质审查+许可证有效期预警——SupervisionLog 实体无资质/许可证/有效期字段;全库仅 hr/qualification.vue(企业自身资质)、ehs/cert.vue、crm/qualperf.vue、supplier 准入模板里有\"资质/许可证/有效期\",均非监理对施工单位的资质审查,也无任何针对监理的有效期预警引擎。(2)施工方案报审流程(专监审查→总监签认→反馈)——无方案报审实体或工作流;SupervisionLog.logType 枚举为{旁站/巡视/平行检验/监理通知/计量支付},不含方案报审;监理域内无专监/总监签认节点。(3)测量复核记录+不合格触发整改单——无测量复核实体;SurveyController 实为问卷投票(status 进行中/已结束)非工程测量;QmsRecord 为通用 QMS 整改记录,与测量复核无联动;TriggerRuleEngine 无从复核不合格生成整改单的规则。(4)开工条件逐项核查表+开工令签发——无核查表、无开工令实体或签发逻辑。活体后端验证:supervision-logs 仅返回旁站/巡视/平行检验记录,commencement-orders/construction-permits/scheme-reviews/survey-rechecks/rectification-orders 全部 404。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/SupervisionLogController.java (仅 CRUD), oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java (字段仅 projectName/logType/content/problem/handleStatus/supervisor/logDate,logType枚举不含方案报审/资质审查/开工). 前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/supervision/logs.vue (唯一监理页), ofbiz-framework/plugins/modern-ui/app/src/oa/api/engext.ts (SUPERVISION_TYPES=['旁站','巡视','平行检验','监理通知','计量支付']), ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:433-440 (supervision 仅 logs 子项), ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts (\"施工准备阶段监理\"→/supervision/logs). 活体: GET /api/oa/supervision-logs 仅返回旁站/巡视/平行检验; GET commencement-orders|construction-permits|scheme-reviews|survey-rechecks|rectification-orders|supervision-permits 全部 HTTP 404. 全源码 grep \"开工令/开工条件/测量复核/方案报审/有效期预警/专监\" 在监理域内零命中。" }, { "area": "设计研究中心/工程监理部", "module": "3. 施工过程质量控制", "verdict": "MISSING", "gap": "全部 6 项子能力均缺;现有 QmsRecord/SafetyCheck 是公司级 ISO/EHS 记录,未与监理工序验收/隐蔽/旁站打通。", "severity": "high", "evidence": "grep '隐蔽/检验批/旁站/平行检验/计量' 全后端仅命中 SupervisionLog 的 logType 下拉枚举(旁站/巡视/平行检验/监理通知/计量支付)和 DataSeeder 种子内容文本——它们只是给一条扁平日志打的标签,不是工作流。无材料报验+自动送检触发(LabSample 未与监理联动)、无检验批/分项/分部工序验收申请实体、无现场拍照/电子签名验收表、无隐蔽工程强制影像+坐标时间戳+未过停工、无旁站打卡(坍落度/温度)、无平行检验仪器采集+偏差预警、无整改通知单线上派单回传复核闭环。grep watermark/GPS/坐标 仅命中 DataSeeder。", "survives": true, "reNote": "复验失败默认保留", "reEvidence": "" }, { "area": "设计研究中心/工程监理部", "module": "4. 施工进度控制", "verdict": "MISSING", "gap": "缺总/月/周进度计划报审;缺按工序实际进度+自动偏差+S曲线;缺滞后阈值自动预警推送;缺滞后原因+关键线路分析+赶工建议报告。", "severity": "high", "evidence": "grep 'S曲线/进度偏差/赶工' 全后端无任何命中。SupervisionLog 无进度计划/实际填报/偏差/阈值预警字段。ProjectTask 仅为通用任务,无总/月/周进度计划报审、无按工序实际进度自动算偏差、无 S 曲线、无滞后阈值(5%)推送总监/建设单位、无关键线路分析/赶工建议报告。", "survives": true, "reNote": "缺口属实。工程监理部「施工进度控制」的四项能力在前后端均无真实实现,只是被编排器在 kaidiDeptView.ts 里贴了\"已建\"标签并指向通用项目页。\n\n后端:工程监理仅有 SupervisionLog(监理记录:旁站/巡视/平行检验/监理通知/计量支付),无任何进度计划/工序进度/偏差/S曲线/关键线路实体或接口。Project 域只有一个整数 progress 字段 + start/end 日期;ProjectTask 只有 title/assignee/status/dueDate/priority。全后端 grep S曲线/baseline/偏差/critical path/赶工/进度计划报审 = 0 命中(仅 DataSeeder 里两条文本串)。AlertScheduler 只扫证书到期和表单节点空闲,没有任何进度滞后/工期阈值预警逻辑。\n\n前端:supervision 模块只注册一个页面 /supervision/logs(监理记录 CRUD)。dept-view 把\"施工进度控制\"映射到 /goal/project(status:\"built\"),但该页只是项目看板(单一总进度百分比滑块)+ 任务列表/看板/甘特图,其\"甘特图\"只是把每个任务从项目起点画到其 dueDate 的色条,完全没有计划 vs 实际、工序、偏差、S曲线。/goal/plan 是通用日/周/月工作计划填报(WorkPlan),并非施工进度计划报审。\n\n逐项核对:1) 总/月/周进度计划报审 — 无(仅有不相关的个人工作计划);2) 按工序实际进度+自动偏差+S曲线 — 全无,无工序维度、无 plan/actual 双线、无 S 曲线组件;3) 滞后阈值自动预警推送 — 无,AlertScheduler 不覆盖进度;4) 滞后原因+关键线路(CPM)分析+赶工建议报告 — 完全无。已尽力在代码中寻找实现,无法推翻该缺口。", "reEvidence": "后端无实现:oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java(只有监理记录字段 logType/content/problem/handleStatus,无进度概念);oa-backend/src/main/java/com/kaidi/oa/web/SupervisionLogController.java(仅 CRUD /api/oa/supervision-logs);oa-backend/src/main/java/com/kaidi/oa/domain/Project.java(仅 private int progress + startDate/endDate,无计划/工序/偏差/S曲线);oa-backend/src/main/java/com/kaidi/oa/domain/ProjectTask.java(仅 title/assignee/status/dueDate/priority)。全后端 grep \"scurve|s曲线|baseline|criticalpath|关键线路|赶工|偏差|deviation|进度计划|plannedProgress\" 仅在 DataSeeder.java 命中两条无关文本。AlertScheduler.java 只重扫证书与表单节点空闲(无进度滞后预警)。\n\n前端无实现:ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:432-440(supervision 模块仅 logs 子项);唯一页面 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/supervision/logs.vue(监理记录 CRUD);ofbiz-framework/plugins/modern-ui/app/src/oa/api/engext.ts:7-59(仅 SupervisionLog 增删改查)。编排器声称的实现 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/project.vue —— 只有总进度百分比 el-progress + 任务列表/看板,\"甘特图\"(160-190 行)仅按 task.dueDate 画条,无计划/实际/偏差/S曲线/关键线路。映射来源 ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts 中 {\"name\":\"施工进度控制\",\"status\":\"built\",\"path\":\"/goal/project\",\"pageLabel\":\"项目/任务\"}(贴标签式\"已建\",并非真实现)。/goal/plan.vue 是通用\"日/周/月工作计划填报\",非施工进度计划报审。" }, { "area": "设计研究中心/工程监理部", "module": "5. 投资控制(工程计量与支付)", "verdict": "MISSING", "gap": "缺基于验收工程量的计量审核+锁定;缺自动关联工程量×单价生成应付+扣款+支付证书;缺变更签证费用审核+超比例预警;缺索赔评估与审核意见。", "severity": "high", "evidence": "'计量支付' 只是 SupervisionLog 的一个 logType 文本标签;无任何计量实体、无工程量×合同单价自动生成应付金额、无计量锁定、无扣预付款/质保金后出具支付证书、无变更签证费用审核+超比例预警、无索赔事件评估。PaymentController/ContractMilestone 是通用合同付款节点,与监理验收工程量无关联计算。", "survives": true, "reNote": "缺口属实。工程监理\"投资控制(工程计量与支付)\"链所述的四类实现均不存在,没有任何能反驳的实现可拿出来。逐项核实如下:\n\n(1) 基于验收工程量的计量审核——不存在。工程监理模块唯一功能是 SupervisionLog(监理记录),纯自由文本 CRUD,字段仅 projectName/logType/content/problem/handleStatus/supervisor/logDate。logType 可取字符串\"计量支付\",但实体无工程量、单价、金额、审核计量等任何字段或逻辑(SupervisionLog.java / SupervisionLogController.java)。前端 supervision 模块在 oaModules.ts(id 'supervision') 只暴露一个菜单\"监理记录\",无计量审核页。\n\n(2) 工程量×单价自动生成应付+扣款+支付证书——不存在。Payment 实体仅有单一手填 amount 字段,无 quantity/unitPrice/与验收计量的关联/自动生成;PriceItem(单价)存在但无任何处用其×实测工程量推导应付。全仓库 grep 扣款/deduction = 0 命中。无支付证书生成(唯一\"certificate\"命中是 AlertScheduler 里 PersonnelCert 证书到期,与支付无关)。\n\n(3) 变更签证费用审核+超比例预警——不存在。ContractChange 是通用合同金额变更(变更/终止/续签,amountBefore→amountAfter 回写合同),非工程签证按工程量的费用审核。全仓库 grep 超比例/超出/overRatio/exceedRatio = 0 命中,无任何超比例预警逻辑。\n\n(4) 索赔评估与审核意见——不存在。唯一\"claim\"命中是 WorkflowService/NodeAssigneeResolver 里并行分支办理人去重的 claimed 集合,与工程索赔毫无关系。无索赔实体/页面/审核逻辑。\n\n最接近的是审批表单模板 src-progress-payment.ts(项目进度款支付),但它只是静态审批表单字段布局:应付金额/工程量清单/占比等都是手填 money/text/attachment 控件;表单引擎无 computed/formula 字段类型,无量×价计算、无超比例预警评估、无证书生成。属手工填报审批表,非所述投资控制计算逻辑。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java(无量价/计量字段); oa-backend/.../web/SupervisionLogController.java(纯CRUD); oa-backend/.../domain/Payment.java(仅单一手填amount,无quantity/unitPrice/证书/扣款); oa-backend/.../domain/ContractChange.java(通用金额变更,非工程签证审核); oa-backend/.../service/WorkflowService.java + NodeAssigneeResolver.java(claim=办理人去重集合,非索赔); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:433-438(supervision模块仅\"监理记录\"); ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-progress-payment.ts(静态审批表单,手填字段无计算引擎)。grep 全仓库:扣款/deduction=0命中,超比例/overRatio/exceedRatio=0命中,无PaymentCertificate/Measurement/Claim等实体。" }, { "area": "设计研究中心/工程监理部", "module": "6. 安全生产管理", "verdict": "MISSING", "gap": "现有 SafetyCheck 只是 EHS 隐患表,未与监理项目/停工指令打通;缺安全方案监理审查留痕、重大隐患触发停工令+整改复查闭环、安全教育交底+特种作业到期预警、安全事故上报+应急预案+调查归档。初判完全成立。", "severity": "high", "evidence": "SafetyCheck(domain/SafetyCheck.java, web/SafetyCheckController.java)确为通用 EHS 隐患记录:type 安全/质量/环境、level 一般/重大/无、rectifyStatus 待整改/整改中/已闭环、含 projectId——但它无停工令(停工指令)生成、无向施工方派单签收、无复查签认闭环,也未与监理项目/总监权限挂钩。全后端 grep '停工令' 无命中(仅 SupervisionLog logType '监理通知' 文本)。无安全专项方案监理审查留痕、无安全教育交底+特种作业持证到期预警与监理联动、无安全事故快速上报+应急预案+调查归档流程。", "survives": true, "reNote": "缺口属实,无法推翻。后端确实只有两张孤立的扁平台账:(1) SafetyCheck.java——EHS 隐患表(type 安全/质量/环境, result 合格/隐患/不合格, level 一般/重大/无, rectifyStatus 待整改/整改中/已闭环, 带 projectId),SafetyCheckController 仅 CRUD;(2) SupervisionLog.java——监理记录表(logType 旁站/巡视/平行检验/监理通知/计量支付, handleStatus 待处理/处理中/已闭环),SupervisionLogController 仅 CRUD。两者完全未打通:SupervisionLog 连 projectId/safetyCheckId 都没有,只有自由文本 projectName,无法与 SafetyCheck 或监理项目关联。描述列举的四项专项能力在全 87 个 domain 实体中均无对应实体:①安全方案监理审查留痕——无;②重大隐患触发停工令+整改复查闭环——无任何 停工令/复工 实体,TriggerRuleEngine/WorkflowService 零处引用 safety/supervision/停工,level=重大 不触发任何下游联动;③安全教育交底+特种作业到期预警——只有通用 PersonnelCert(人员证件库)把\"特种作业证\"列为众多 certType 之一,纯 HR 证件表,无安全交底/教育记录、无与安全生产或项目的关联、无专门到期预警机制;④安全事故上报+应急预案+调查归档——无 accident/emergency/事故/应急 任何实体(仅 Favorite/DataSeeder 里出现\"应急预案\"作为一条收藏标题文本)。初判完全成立。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/SafetyCheck.java(扁平隐患表,无停工/复查/监理字段);oa-backend/src/main/java/com/kaidi/oa/web/SafetyCheckController.java(仅 list/get/create/update/delete CRUD);oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java(仅 projectName 文本,无 projectId/safetyCheckId 外键);oa-backend/src/main/java/com/kaidi/oa/web/SupervisionLogController.java(仅 CRUD,与隐患无联动);oa-backend/src/main/java/com/kaidi/oa/domain/PersonnelCert.java(通用证件库,特种作业证仅为 certType 之一,无安全/项目关联);domain 目录 87 实体清单中无 StopWork/Accident/Emergency/SafetyEducation 任何实体;service/(WorkflowService/TriggerRuleEngine) 与 DataSeeder 中 grep safety/supervision/停工/隐患触发联动 均无命中。" }, { "area": "设计研究中心/工程监理部", "module": "7. 监理文件与报告自动化", "verdict": "LOGIC_GAP", "gap": "监理日志纯手工填,缺事件自动带入;缺月报自动汇总+导出;缺会议纪要待办自动分发;缺通知单/联系单自动编号+电子签名+签收闭环;缺报告一键取数填充。LOGIC_GAP 判定成立。", "severity": "high", "evidence": "监理记录 logs.vue/SupervisionLogController 是纯手工 CRUD:create/update 仅把请求体字段原样落库,无任何自动带入当日验收/巡视/旁站/整改事件的逻辑,无 TriggerRuleEngine 联动。无监理月报按月自动汇总+标准格式导出,无会议纪要关联待办自动分发(MeetingMinute 与监理无联动),无监理通知单/联系单自动编号+电子签名+施工方签收闭环(SupervisionLog 无编号/签名/签收字段),无质量评估/工作总结一键提取数据填充。", "survives": true, "reNote": "缺口属实。工程监理\"7. 监理文件与报告自动化\"全部五项均未实现,模块仅为纯手工 CRUD 台账。后端 SupervisionLog 实体只有 projectName/logType/content/problem/handleStatus/supervisor/logDate/createdAt 字段;SupervisionLogController 仅 GET/POST/PUT/DELETE 五个标准 CRUD 端点,handleStatus 默认\"待处理\"但无任何自动流转/闭环逻辑。逐项核对:(1) 监理日志事件自动带入——content/problem 全靠人手填,无任何来源事件联动;(2) 月报自动汇总+导出——无 monthlyReport/aggregate/export 端点(活体 /monthly-report、/export 返回 400,实为被 GET /{id} 的 Long 解析拦截,非真路由);(3) 会议纪要待办自动分发——监理域无 MeetingMinute 关联,TriggerRuleEngine 无监理规则;(4) 通知单/联系单自动编号+电子签名+签收闭环——无 SupervisionNotice/ContactSheet 域与控制器(活体 /supervision-notices、/supervision-contact-sheets 返回 404),实体无编号/签名/签收字段,自动编号/电子签名/签收闭环关键字在监理上下文零命中(仅 BOM 域有 signOff/会签);(5) 报告一键取数填充——前端无 autoFill/取数填充,页面仅通用 MasterDataPage 手工表单。前端 supervision 目录只有 logs.vue 一个页面,oaModules.ts 监理模块仅含\"监理记录\"一个子项。LOGIC_GAP 判定成立。", "reEvidence": "后端: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java (扁平实体,无编号/签名/签收/报告字段); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/SupervisionLogController.java (仅 list/get/create/update/delete 五端点,handleStatus 仅默认\"待处理\"无自动流转); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java (ruleKey 仅 payment/contract/project/seal/supplier,无监理). 无 SupervisionNotice/ContactSheet/MonthlyReport 域或控制器(find 仅返回 SupervisionLog 三件套). 前端: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/supervision/logs.vue (薄包 MasterDataPage 手工 CRUD); /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/engext.ts:49-59 (仅 CRUD 四函数); data/oaModules.ts:433-440 (监理仅 logs 一个子模块). 活体 127.0.0.1:8091: /supervision-notices、/supervision-contact-sheets、/supervision-meeting-minutes -> 404; /supervision-logs/monthly-report、/export -> 400(被 /{id} Long 解析拦截,非真端点)." }, { "area": "设计研究中心/工程监理部", "module": "8. 竣工验收与档案管理", "verdict": "MISSING", "gap": "缺竣工预验收申请+各专业预验收+问题整改+预验收报告;缺正式竣工验收会议记录+验收组意见+签署;缺监理文件自动组卷+案卷目录+电子档案移交。", "severity": "high", "evidence": "无竣工预验收/正式验收实体或流程;SupervisionLog 无相关字段。ArchiveController 为通用档案 CRUD(@PostMapping 手动建条目),grep '组卷/案卷/移交' 在 ArchiveController 无命中,无按归档目录自动组卷、无案卷目录生成、无向建设单位移交电子档案的能力。", "survives": true, "reNote": "尽力推翻后仍确认缺口属实。工程监理域(supervision模块)前端仅有单一菜单\"监理记录\"(/supervision/logs),对应后端SupervisionLog是通用现场日志(logType=旁站/巡视/平行检验/监理通知/计量支付 + 发现问题 + 处理状态),完全没有\"竣工预验收申请/各专业预验收/问题整改/预验收报告\"这套环节。三条子缺口逐一查证均无实现:(1)无竣工预验收(各专业预验收、整改、预验收报告)概念;(2)\"竣工验收\"在后端只作为ContractMilestone标签、DataSeeder样例档案标题、TriggerRuleEngine自动归档标题出现,无正式竣工验收会议记录/验收组/验收组意见/签署结构;最接近的src-project-acceptance.ts是\"项目验收信息登记表\"通用表单(走资料室/档案室审批),无验收组与会议记录签署;(3)ArchiveController仅暴露list/get/create,无组卷/案卷目录/档案移交端点,TriggerRuleEngine.chainArchiveProject只是项目办结后生成单条扁平Archive行,无监理文件自动组卷、案卷目录、电子档案移交;HandoverController是HR人员工作交接非文件组卷;src-archive-borrow是档案借阅查询表非组卷移交。", "reEvidence": "grep全库(前后端)对 预验收/验收会议/验收组/组卷/案卷/案卷目录/档案移交/电子档案 零命中真实业务实现。oaModules.ts:433-439 supervision模块只有 logs 一项;supervision/logs.vue 仅 CRUD SupervisionLog;SupervisionLog.java 字段=projectName/logType/content/problem/handleStatus/supervisor/logDate,无预验收/会议/组卷字段。后端\"竣工验收\"命中处:ContractMilestone.java:13(里程碑标签)、DataSeeder.java:1405-1407(样例档案)、TriggerRuleEngine.java:358 a.setTitle(p.getName()+\" 竣工验收档案\")(自动归档单行Archive)、ContractMilestoneController.java:21。ArchiveController.java 仅 @GetMapping/@GetMapping{id}/@PostMapping(行61/88/106),无组卷/案卷目录/移交。src-project-acceptance.ts 是\"项目验收信息登记表\"(工程中心,资料室/档案室审批),approvalOpinions=资料室/工程中心负责人/董事长助理/档案室,无验收组意见/会议记录/签署。src-archive-borrow.ts name=\"归档资料查询申请表\"非组卷移交。HandoverController=HR人员交接。" }, { "area": "设计研究中心/工程监理部", "module": "9. 合规与审计追溯", "verdict": "MISSING", "gap": "缺关键动作操作人+时间+GPS留痕;缺合规电子签名;缺影像自动水印+按部位时间检索;缺审计只读查询+时间段导出端口。", "severity": "high", "evidence": "无关键动作(验收/计量/通知签发/复核)的操作人+时间+GPS留痕(SupervisionLog 仅 createdAt+supervisor 文本,无 GPS);grep GPS/坐标/水印 全后端仅命中 DataSeeder 种子文本。无合规电子签名(手写板/数字证书),无现场影像自动加水印(时间/地点/拍摄人/部位)+按部位时间检索,无为建设单位/审计机构的只读查询+时间段记录导出端口。系统级 AutomationLog 仅记联动,非监理动作 GPS/签名留痕。", "survives": true, "reNote": "缺口属实,四项合规与审计追溯能力在设计研究中心/工程监理部模块均未实现。(1) 关键动作操作人+时间+GPS留痕:SupervisionLog/SafetyCheck/DesignChange 实体仅有 supervisor/responsible(姓名字符串)、logDate/checkDate(日期串)、createdAt,全代码库无任何 latitude/longitude/gps/geolocation/经纬 字段;SafetyCheck.location 是自由文本工地名而非GPS坐标。(2) 合规电子签名:所有监理/设计/审计实体均无 signature/esign/数字签名字段,grep 全库零命中。(3) 影像自动水印+按部位/时间检索:唯一 watermark 命中是 FilePreview.vue 的通用手动 UI 叠加层(watermark?: string prop),且在 supervision/design 任何页面都未被引用(grep 零使用),无自动影像水印、无按部位、无按时间检索。(4) 审计只读查询+时间段导出端口:SupervisionLogController 仅按 handleStatus 过滤、AuditProjectController 仅按 status 过滤,均无 from/to 时间段参数处理(活体测 ?from=&to= 返回200只是 Spring 静默忽略未知参数);/supervision-logs/export 与 /audit-projects/export 活体返回400(无此端点),/audit-logs 返回404,无任何审计专用只读查询或时间段导出端口。", "reEvidence": "后端实体: oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java(字段仅 projectName/logType/content/problem/handleStatus/supervisor/logDate/createdAt), AuditProject.java(name/auditType/auditee/leadAuditor/period/findings/status/createdAt), SafetyCheck.java(location为文本/无GPS/无签名/无水印)。控制器: SupervisionLogController.java(list() 仅 @RequestParam handleStatus,无时间段/导出), AuditProjectController.java(list() 仅 status,无导出)。EvidenceController.java 是研发证据链聚合(/rd-projects/{id}/evidence-chain),与监理审计GPS/签名无关。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/supervision/logs.vue 与 design/{docs,changes,resource}.vue 字段无 gps/签名/水印/审计导出;components/FilePreview.vue 第29-30行 watermark 仅通用手动叠加层且未被监理/设计页引用。全库 grep latitude/longitude/gps/经纬/signature/esign/数字签名/审计日志/auditLog 在这些模块零命中;无 AuditLog/OperationLog 域类。活体 127.0.0.1:8091: /supervision-logs/export=400, /audit-projects/export=400, /audit-logs=404。" }, { "area": "设计研究中心/工程监理部", "module": "10. 与其他部门的接口要求", "verdict": "MISSING", "gap": "缺与规划设计部图纸版本/设计变更联动;缺引用可研投资估算作计量基线;缺与实验室材料复检委托+报告回传;缺向申报服务部输出评估/竣工报告;缺施工方/建设单位外部门户/APP 通道。", "severity": "high", "evidence": "SupervisionLog 无任何外键/联动指向 DesignDoc(图纸版本)、DesignChange(设计变更)、咨询可研投资估算、LabSample(材料复检委托/报告回传)、Declaration(申报服务)。无 TriggerRuleEngine 规则把监理与这些上下游串联。无施工方/建设单位外部门户或 APP 提交接收通道(MobileController 为内部移动工作台,无外部方提交端)。", "survives": true, "reNote": "尽力推翻失败,缺口属实。设计研究中心(DesignDoc/DesignChange)与工程监理(SupervisionLog)三块均为孤立的纯 CRUD,三个领域实体只有扁平字符串字段(version/docName/projectName 等),无任何外键、关联ID或跨部门联动逻辑。逐条核验缺口列出的5个接口要求,全部找不到实现:(1)与规划设计部图纸版本/设计变更联动——DesignChange.docName 只是自由文本\"关联文档\"字符串,不指向任何受版本管理的 DesignDoc 记录,无 FK;(2)引用可研投资估算作计量基线——领域层全库 grep\"估算/estimate/计量基线/baseline\"零命中,\"可研报告\"仅为种子数据里一个文档名和枚举描述字符串;(3)与实验室材料复检委托+报告回传——LabSample/LabSampleController 中无 design/supervision/复检委托引用,反向也无;(4)向申报服务部输出评估/竣工报告——Declaration 侧无 design/supervision/竣工报告/评估报告引用;(5)施工方/建设单位外部门户/APP通道——全部\"门户\"命中均为无关项(CrawlSource 行业门户、个人 myportal 首页、OFBiz portal-page i18n、CSS 类名),无外部建设方门户。TriggerRuleEngine 仅登记 payment.create/contract.effectivate/project.create/project.accept/seal.markUsed/supplier.admit 六条规则,design/supervision 完全不是任何自动联动的源或目标;三个控制器也无 approve/workflow 钩子。活体 :8091 查询返回的字段与领域模型完全一致,证实无隐藏联动端点。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/DesignChange.java(扁平字段无FK), domain/DesignDoc.java, domain/SupervisionLog.java; web/DesignChangeController.java、web/SupervisionLogController.java、web/DesignDocController.java(纯CRUD无联动无approve); service/TriggerRuleEngine.java:148/240/301/324/376/410(六条ruleKey不含design/supervision); 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/api/design.ts(纯CRUD)、src/oa/pages/design/changes.vue(MasterDataPage,docName为自由文本)。全库grep\"复检委托/材料复检/竣工报告/评估报告/投资估算/计量基线/外部门户\"在设计监理相关代码零命中;LabSample/Declaration/Project 侧均无对 design/supervision 的反向引用。活体GET /api/oa/design-changes 与 /supervision-logs 字段与实体一致,无联动字段。" }, { "area": "制造管理中心/环保设备制造中心", "module": "1. 销售与合同管理", "verdict": "LOGIC_GAP", "gap": "商机/合同缺环保设备技术字段;报价不按规格生成、不关联历史成本;合同变更不联动生产采购;销售订单不派生含设备清单/经纬度的项目级进度跟踪。", "severity": "high", "evidence": "domain/Opportunity.java 仅有 name/projectType/amount/stage/probability 等字段,无处理量/排放标准/工艺路线;OpportunityController 的自动联动是「商机→投标台账(Bid)+阶段推进到方案报价」(行162-189),属招投标链,非按设备类型/规格生成报价、不关联历史项目成本。domain/Contract.java grep 技术协议/供货范围/交付节点/质保=0,无这些字段。ContractChangeController grep 生产/采购/production/purchase/workOrder=0,合同变更只回写合同自身状态/金额(见 ContractChange.java javadoc:终止→已终止、变更→改 amount),不联动生产计划与采购。TriggerRuleEngine 无「销售订单→项目编号(含设备清单/技术参数/经纬度)」规则,只有 project.create 建空壳 Project(name/owner/phase=立项)。", "survives": true, "reNote": "尽力推翻失败,缺口属实。逐条核验制造管理中心/环保设备制造中心的\"销售与合同管理\"四个子点,全部找不到实现:(1) 商机/合同无环保设备技术字段——Opportunity 实体只有 name/customerId/projectType/amount/stage/probability 等通用字段,\"环保设备\"仅作为 projectType 的一个字符串枚举值(类别标签)存在,且只出现在 seed 数据;Contract 实体亦无设备规格/技术参数字段。(2) 报价不按规格生成、不关联历史成本——OpportunityController.convertBid 直接把 o.getAmount() 原样拷给 bidAmount/controlPrice;PriceItem 价格库虽有\"历史中标价\"priceType,但从未被 join 进商机/报价生成,无任何按 spec 计价逻辑。(3) 合同变更不联动生产采购——ContractChangeController.create 只回写合同自身 status/amount;grep ContractChange 到 production/procurement/workorder/采购/生产 的联动为空;TriggerRuleEngine 仅做表单办结→用印/付款/合同生效/项目验收→档案,不含变更→生产采购。(4) 销售订单不派生含设备清单/经纬度的项目级进度——根本不存在 SalesOrder 实体;Project 实体无经纬度/坐标字段、无设备清单;全仓 grep 经纬度/latitude/longitude/geo/坐标 只命中 DataSeeder 一条注释字符串,无任何实际字段。四条均成立。", "reEvidence": "Opportunity.java(无技术字段) /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Opportunity.java:28-52; Contract.java(无设备规格) domain/Contract.java:23-50; OpportunityController.convertBid 直接拷 amount 无规格/历史成本 web/OpportunityController.java:175-189; PriceItem 价格库未被报价引用 domain/PriceItem.java + web/PriceItemController.java; ContractChangeController.create 仅回写合同 status/amount web/ContractChangeController.java:74-118(无生产采购联动); WorkOrder 无 contractId/salesOrder/projectId 关联 domain/WorkOrder.java:19-43; Project 无经纬度/设备清单 domain/Project.java:12-33; grep 经纬度/latitude/longitude/geo/坐标 仅命中 seed/DataSeeder.java:1499 注释字符串; grep ContractChange→production/procurement/workorder/生产/采购 联动结果为空; 无 SalesOrder 实体(find 仅得 WorkOrder)。" }, { "area": "制造管理中心/环保设备制造中心", "module": "2. 技术设计与BOM管理", "verdict": "LOGIC_GAP", "gap": "无 EBOM/MBOM、无 BOM 版本控制与变更通知、无参数化选型;合同不派生设计任务;BomItem 实为工程量清单非设备产品结构;无图纸车间电子签名版本确认。", "severity": "high", "evidence": "service/ 全目录 grep design/设计任务/工艺设计/结构设计/电气设计=0,TriggerRuleEngine.fire() 关键词分支只有 付款/用印/收款/验收/供应商/合同/立项,无 contract→design 规则;DesignDocController grep contract/合同/自动/trigger=0,图纸非合同派生。BomItem.java javadoc 自述为「工程量清单/BOM 比对…tendered vs actual on-site quantity」,带 parentId 多级与 unitUsage 单位用量,但活体 MRP 根节点为「PE给水管DN200」(unit=m,category=分部分项)——确属土建工程量清单而非设备产品结构,无 EBOM/MBOM 区分、无版本控制变更通知、无参数化选型。BomSignoff 是五签会签(研发→工艺→采购→质量→成本)非图纸电子签名版本确认。", "survives": true, "reNote": "对抗复验失败,缺口属实。逐条核验:(1) 无 EBOM/MBOM——唯一的 BomItem 实体在 BomItem.java(L14-18) 与 BomItemController.java(L28-33) 明确自述为\"工程量清单/BOM 比对\",对比投标量 bidQty 与现场实际量 actualQty,无 bomType/EBOM/MBOM 字段;\"EBOM|MBOM\"的 grep 命中只是 CreateBomItemRequest 里 Bom 子串的误报。(2) 无 BOM 版本控制与变更通知——BomItem 无 version/revision/有效性字段,全库无 version/revision/history/ECN/ECO 实体,DesignChangeController 零通知逻辑(grep notif/通知/message 全空)。(3) 无参数化选型——\"参数化/选型\"仅出现在 DataSeeder.java 的种子文案串(如\"设备选型与技术参数\"),非配置器/参数化功能。(4) 合同不派生设计任务——TriggerRuleEngine.java 的全部 ruleKey 为 payment.create/receipt.invoice/contract.effectivate/contract.toSeal/project.create/project.accept/project.toArchive/seal.markUsed/supplier.admit,无任何 contract→设计任务派生。(5) BomItem 确为工程量清单非设备产品结构——类注释与字段语义(分部分项/措施/其他、正常/超量)证实。(6) 无图纸车间电子签名版本确认——BomSignoff 是对 BOM 工程量行的研发/工艺/采购/质量/成本五角色会签,非图纸电子签名;\"签章\"grep 命中是 TriggerRuleEngine 用印分类 tag,与图纸无关;DesignDoc.version 仅为自由文本字段,无签字/锁定/版本确认流程。六条子主张全部成立。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/BomItem.java (L14-18 类注释自述工程量清单, 字段 bidQty/actualQty/category/status, 无 version/bomType); oa-backend/src/main/java/com/kaidi/oa/web/BomItemController.java (L28-41 注释; tree/mrp/sign 仅基于工程量, SIGN_ROLES 五会签非图纸签名); oa-backend/src/main/java/com/kaidi/oa/domain/DesignDoc.java (version 仅 String 自由文本, 无签字/版本确认); oa-backend/src/main/java/com/kaidi/oa/web/DesignChangeController.java (无 notify/通知逻辑); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java (ruleKeyFor 全量 ruleKey 无 design/合同派生设计; L111 签章为用印分类 tag); oa-backend/src/main/java/com/kaidi/oa/domain/BomSignoff.java (bomId/role/signer/decision, 对 BOM 工程量行会签); oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java (L1587/2268/3017 选型仅为种子文案); 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/bom.vue 与 api/qhse.ts 仅 createBomItem 等函数名 Bom 子串, 无 EBOM/MBOM/参数化/版本控制/电子签名。" }, { "area": "制造管理中心/环保设备制造中心", "module": "3. 生产计划与排程", "verdict": "LOGIC_GAP", "gap": "MRP 仅算毛需求、手动触发、不读库存/在途/在制做净需求;无 MPS 主生产计划与甘特图;无 APS 有限能力排程;无开工齐套检查预警。", "severity": "high", "evidence": "BomItemController GET /mrp?rootId=&qty= (行199-257):explodeMrp 自顶向下 requiredQty=父需求×子 unitUsage 连乘、amount=requiredQty×unitPrice,纯毛需求展开,代码内无任何 inventory/在途/在制查询做净需求扣减(grep stock/onHand/净需求=0)。手动传 rootId+qty 触发,不由销售订单/预测自动运行。活体探测 production-plans/mps/aps 端点均 404。无 MPS/甘特/APS 有限能力排程/物料齐套检查(controllers grep 齐套/甘特/MPS/APS=0)。", "survives": true, "reNote": "缺口属实,无法推翻。逐项核对生产计划与排程链的五个子断言,全部成立:\n\n1) \"MRP 仅算毛需求、不读库存/在途/在制做净需求\" —— 成立。唯一的 MRP 实现是 BomItemController.java 的 GET /api/oa/bom-items/mrp(第199-257行),方法 explodeMrp() 只做自顶向下的 BOM 树展开:子项需求量 = 父项需求量 × 子项 unitUsage 连乘下钻(第253行 childRequired = parentRequiredQty * k.getUnitUsage())。全程不注入、不引用 InventoryItemRepository,没有 onHand/onOrder/inTransit/净需求字段。控制器构造器只依赖 BomItemRepository、BomSignoffRepository,根本没有库存仓储。活体验证 /mrp?rootId=1&qty=10 返回的 line 字段仅 itemId/parentId/name/unit/category/level/unitUsage/requiredQty/unitPrice/amount,requiredQty 就是纯毛需求(如 10/10.5/20),无任何净需求扣减。\n\n2) \"手动触发\" —— 成立。/mrp 是 GET 端点,靠人传 rootId+qty 触发一次,无定时/事件驱动的 MRP 运算。\n\n3) \"无 MPS 主生产计划与甘特图\" —— 成立。全仓 grep 主生产计划/MPS/甘特/gantt 仅命中无关的 CSS el-collapse。WorkOrderController 只是工单 CRUD(待生产/生产中/已完工/质检中/已入库 状态机 + 已入库自动建成品库存),WorkPlanController 是个人工作计划审阅流,ScheduleEventController 是个人日历——均非主生产计划/甘特。活体探测 /api/oa/mps、/gantt、/production-plan 全部 404。\n\n4) \"无 APS 有限能力排程\" —— 成立。无任何 capacity/有限能力/leadTime 排程逻辑;探测 /api/oa/aps、/capacity 均 404;前端制造中心页面只有 workorders/inventory/process/delivery 四页,无排程/甘特视图。\n\n5) \"无开工齐套检查预警\" —— 成立。grep 齐套/kitting/shortage/短缺 在前后端均无业务命中;探测 /api/oa/kitting、/net-requirement 均 404。WorkOrder 创建/状态流转处无任何对所需物料库存是否齐套的校验或预警。", "reEvidence": "后端 MRP 实现:/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/BomItemController.java,GET /mrp(第199-231行)+ explodeMrp()(第238-257行,第253行 childRequired = parentRequiredQty * k.getUnitUsage(),全程无库存读取);构造器仅注入 BomItemRepository/BomSignoffRepository(第49-55行)。\n工单(非MPS/排程):/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/WorkOrderController.java(纯CRUD+状态机,第87行默认\"待生产\",第134-145行已入库自动建库存,无齐套校验)。\n个人计划/日历(非生产排程):WorkPlanController.java、ScheduleEventController.java。\n前端制造中心:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/mfg.ts(只 work-orders + inventory)及 pages/mfg/ 仅 workorders/inventory/process/delivery 四页,无 MRP/MPS/APS/甘特/齐套页面。\n活体证据(127.0.0.1:8091):GET /api/oa/bom-items/mrp?rootId=1&qty=10 line 字段无任何净需求/库存项,requiredQty 为纯毛需求;GET /api/oa/{mps,aps,gantt,production-plan,kitting,net-requirement,capacity} 全部返回 404。\n全仓 grep 净需求/onHand/onOrder/inTransit/齐套/kitting/甘特/gantt/有限能力/leadTime 在 oa-backend 与 modern-ui/app/src 中均无业务实现(仅命中 CSS collapse 与 safetyStock 字段定义,后者只用于库存低于安全线打标,未参与 MRP 净算)。" }, { "area": "制造管理中心/环保设备制造中心", "module": "4. 采购与供应商管理", "verdict": "PARTIAL", "gap": "采购申请不由 MRP 自动生成、无采购单实体;采购订单不挂项目/任务号归集成本;供应商无资质/评价/名录;无外协管理;到货不触发 IQC 与供应商评价联动。", "severity": "high", "evidence": "无采购单(Purchase)实体,TriggerRuleEngine 无 MRP→采购规则;activate 探测 requisitions/material-requisitions 404。domain/Supplier.java 仅 name/creditCode/category/contact/status,无 ISO/环保认证/业绩/质量交期价格评价记录字段,无合格供应商名录;TriggerRuleEngine.ruleAdmitSupplier 只把供应商置「合格」或新建,无资质评价。controllers grep 外协/IQC=0,无外协管理、到货不触发 IQC、不联动供应商评价。", "survives": true, "reNote": "尽力推翻未果,缺口属实。逐条核对:(1) 无采购单实体——90个domain实体中无 PurchaseOrder/PurchaseRequest/Requisition 任何采购单据实体;采购仅存在于审批表单模板 src-office-purchase.ts(物资采购申请),是人工发起的审批流,非结构化采购单。(2) 采购申请不由 MRP 自动生成——BomItemController 的 /mrp 端点只是 BOM 多级展开(自顶向下连乘)返回只读的 MrpResult 物料需求清单,不创建任何采购申请/订单。(3) 采购订单不挂项目/任务归集成本——根本无PO实体可挂。(4) 供应商无资质/评价/名录——Supplier 实体字段仅 name/creditCode/category/contact/phone/bankName/bankAccount/status,status 只是 合格/准入中/停用 枚举;无资质文件、无评价/评分、无结构化名录;TriggerRuleEngine.ruleAdmitSupplier 仅做\"准入\"(翻转 status 或新建合格供应商),非资质/评价;QmsRecord 虽有\"供方质量评价\"type 但是孤立的自由文本质量记录(finding/owner/status),不挂任何 supplierId。(5) 无外协管理——全栈零\"外协/outsourcing\"实体或页面(\"外协费\"仅是预算成本要素标签)。(6) 到货不触发IQC与供应商评价联动——后端+前端全量 grep 零 IQC/来料检验/进货检验/incoming-inspection;mfg/delivery.vue 仅是 settingList 支撑的简单列表(发货/安装调试/售后维修)无检验触发;TriggerRuleEngine 无到货→IQC→评价联动链。判定 PARTIAL 成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/Supplier.java(仅8个基础字段,无资质/评价/名录); domain 目录 90 实体中无任何 Purchase*/Order*/Requisition*/Iqc*/Inspect*/Outsourc*/Evaluat*/Rating* 实体; web/BomItemController.java:199-257 /mrp 仅只读BOM展开返回MrpResult,不生成采购申请; service/TriggerRuleEngine.java:409-440 ruleAdmitSupplier 仅做准入(翻转status/新建合格供应商),无资质/评价; domain/QmsRecord.java(供方质量评价type是孤立记录,无supplierId外键)。全栈 grep -riE 'IQC|来料|进货检验|incoming.?inspect' 在 oa-backend 与 modern-ui/app/src 均零命中。前端: src/oa/pages/masterdata/supplier.vue(供应商页只有基础字段,无资质/评价/名录列); src/data/oaModules.ts:383-391 mfg制造管理中心仅4子页(生产工单/库存管理/发货与售后/配方与设备维护),无采购/IQC/外协/供应商评价页; src/oa/pages/mfg/delivery.vue(发货与售后是settingList简单列表,无IQC触发); 采购仅 src/oa/engine/templates/src/src-office-purchase.ts 一个审批表单模板。" }, { "area": "制造管理中心/环保设备制造中心", "module": "5. 生产执行与车间管理", "verdict": "LOGIC_GAP", "gap": "工单无工艺路线/物料/图纸/质量标准;无领料投料(限额/条码/扣减/批次);无工序报工工时采集;无在制品工序跟踪;无 IPQC 在线检验;无异常拍照闭环。", "severity": "high", "evidence": "domain/WorkOrder.java 仅 orderNo/productName/planQty/actualQty/unit/plannedDate/status/workshop/owner,无工艺路线/物料/图纸链接/质量标准;status 枚举为待生产/生产中/已完工/质检中/已入库(整单态,非工序态)。controllers grep 领料/报工/工序/外协=0,活体 requisitions/iqc 404。前端 pages/mfg/process.vue 是 settingListStore('mfg-process') 纯前端 MasterDataPage,硬编码「配方/设备维护」mock,无工序报工/限额领料/条码/批次追溯/IPQC/异常拍照闭环。WorkOrderController 唯一自动化是 status=已入库时 autoInventory() 生成成品库存,非工序级执行。", "survives": true, "reNote": "缺口属实。制造管理中心的生产执行/车间管理完全缺失,工单只是一张扁平台账,没有任何 MES 执行能力。证据如下:\n\n1. 工单实体极薄(domain/WorkOrder.java):仅含 orderNo/productName/planQty/actualQty/unit/plannedDate/status/workshop/owner/createdAt 十个字段。没有工艺路线、物料/BOM、图纸、质量标准的任何字段或关联。\n\n2. 工单控制器(web/WorkOrderController.java)只有标准 CRUD + 一个「已入库自动生成成品库存」的联动(autoInventory)。没有领料/投料(限额/条码/扣减/批次)、没有工序报工、没有工时采集、没有在制品工序跟踪、没有 IPQC 在线检验、没有异常拍照闭环的任何接口。\n\n3. 全后端 grep 报工/领料/投料/工序/在制品/工艺路线/IPQC/工时采集/条码/拍照/routing/operation-track/materialIssue/workOrderId/barcode/laborHour 等关键词,在制造执行语境下零命中(只命中无关的 workflow、成本中心\"工序\"类型、研发工时费等)。\n\n4. 容易被误认为已实现的两个域均不成立:domain/BomItem 是「工程量清单」按 projectId 关联做投标量 vs 实际量比对的项目造价 BOM,没有 workOrderId,不是绑定工单的生产物料 BOM;domain/QmsRecord 是 ISO9001 质量体系记录(内审/不符合项/纠正措施),与工单工序无关联,不是绑定工序的 IPQC 在线检验。\n\n5. 前端(oa/pages/mfg/workorders.vue + oa/api/mfg.ts)同样只渲染上述九个工单字段的主数据 CRUD 表格,无任何执行/报工/领料/工序跟踪/检验/拍照界面。\n\n结论:工单确无工艺路线/物料/图纸/质量标准;确无领料投料(限额/条码/扣减/批次);确无工序报工工时采集;确无在制品工序跟踪;确无 IPQC 在线检验;确无异常拍照闭环。LOGIC_GAP 成立。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/WorkOrder.java(字段仅10个,无路线/物料/图纸/质量标准); oa-backend/src/main/java/com/kaidi/oa/web/WorkOrderController.java(仅CRUD+autoInventory联动,无报工/领料/工序/检验/拍照接口); oa-backend/src/main/java/com/kaidi/oa/repository/WorkOrderRepository.java(仅findByStatus); oa-backend/src/main/java/com/kaidi/oa/domain/BomItem.java(项目工程量清单按projectId,非工单生产BOM,无workOrderId); oa-backend/src/main/java/com/kaidi/oa/domain/QmsRecord.java(ISO9001体系记录,与工单无关联); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mfg/workorders.vue 与 .../oa/api/mfg.ts(前端仅工单主数据CRUD); 全后端 grep 报工/领料/投料/工序报工/在制品/工艺路线/IPQC/工时采集/条码/拍照/workOrderId/barcode/laborHour 零命中。" }, { "area": "制造管理中心/环保设备制造中心", "module": "6. 库存管理", "verdict": "LOGIC_GAP", "gap": "location 单字符串无多仓多货位/危险品库区;无序列号/批次追溯字段;安全库存仅置状态无补货建议、无呆滞提醒;无盘点管理。", "severity": "high", "evidence": "domain/InventoryItem.java location 仅单 String,无多仓库/多货位/危险品库区;无 serialNo/batch 字段。InventoryItemController 端点仅 GET/GET{id}/POST/PUT/DELETE(基础 CRUD),安全库存仅在 create/update 时 quantity 块\"配方管理与精准投料\" status=built, path=/mfg/process(与\"设备维护与能源管理\"共用同一页)。\n落地页: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mfg/process.vue — 仅 settingListStore('mfg-process',[3条mock]) + MasterDataPage,createFields 只有 type(配方/设备维护)/name/param/cycle/operator/status,无版本/审批/投料/追溯/秤集成任何字段。\nAPI: ofbiz-framework/plugins/modern-ui/app/src/oa/api/mfg.ts — 仅 WorkOrder/InventoryItem 基础 CRUD。\n后端实体: oa-backend/src/main/java/com/kaidi/oa/domain/WorkOrder.java — 无配方/配料/版本/追溯字段。\n全仓搜索: grep 配料指令|偏差报警|逆向投料|配方版本|生效废止|通知车间|秤 在 src/**/*.vue,*.ts 与 oa-backend/src/**/*.java 中零命中;仅 oa-backend/src/main/resources/static/assets/*.js(编译产物)命中,非源码。" }, { "area": "制造管理中心/生物质肥料制造中心", "module": "4. 车间生产执行", "verdict": "PARTIAL", "gap": "分工序工单与流转、设备参数关联、在制品批次位置库存、包装规格/日期/有效期/喷码贴标、报工工时与人工成本归集、生产批次号缺失;仅整单工单+已入库→成品自动入库一条联动。", "severity": "high", "evidence": "WorkOrder.java 仅 orderNo/productName/planQty/actualQty/unit/plannedDate/status/workshop/owner,整单粒度。WorkOrderController 有一条真联动:status=已入库时 autoInventory() 自动生成成品库存(成品库),是真实生产→库存流。但无分工序(预处理/发酵/粉碎/筛分/造粒…)工单、无领料→报工→质检→转序流、无设备运行参数关联、无在制品按批次位置库存、无 batchNo(全后端零命中)、包装无规格/生产日期/有效期、报工无工序-产量-工时与人工成本采集。", "survives": true, "reNote": "我尽力推翻该缺口但无法推翻,确属缺口。制造管理中心(mfg)是平台唯一的制造模块(无独立\"生物质肥料制造中心\"),车间生产执行能力严重不足。后端 WorkOrder.java 只有 11 个扁平字段(id/orderNo/productName/planQty/actualQty/unit/plannedDate/status/workshop/owner/createdAt)——整单粒度工单。缺失项逐条核实如下:(1)分工序工单与流转:无 operation/工序/route/process-step 实体,无任何工序流转逻辑;(2)设备参数关联:WorkOrder 无设备参数字段,process.vue 只是 settingListStore 的\"配方与设备维护\"静态 mock,无工单-设备参数关联;(3)在制品批次位置库存:InventoryItem 只有 location,无 WIP 批次位置;(4)包装规格/日期/有效期/喷码贴标:全无字段,全后端 grep 喷码/贴标/有效期/包装规格 在工单链路零命中;(5)报工工时与人工成本归集:WorkOrder 无报工/工时/人工成本字段;StandardCost.laborCost 是预算标准成本字段,其自身注释(20-21行)明说实际归集\"当前实现为手填+自动汇总框架\"=未实现;(6)生产批次号缺失:batchNo/批次号/生产批次 在整个后端零命中。WorkOrderController 是纯 CRUD,唯一联动是 create 时 status==已入库→autoInventory() 自动生成一条成品库存——恰好就是描述里\"仅整单工单+已入库→成品自动入库一条联动\"。判定 PARTIAL 准确,缺口属实。", "reEvidence": "后端 domain/WorkOrder.java(11个扁平字段,无工序/批次/设备参数/包装/工时); web/WorkOrderController.java(纯CRUD,唯一联动 line 92-94 status=='已入库' 调 autoInventory() line 134-145 生成单条成品库存); `ls domain/` 无 operation/route/process/batch/labor/wip/package/label 任何实体; 全后端 grep 'batchNo|批次号|生产批次' 零命中; 前端 4 页 oa/pages/mfg/{workorders,inventory,delivery,process}.vue 中 process.vue 与 delivery.vue 均为 settingListStore 静态 mock; data/oaModules.ts line 383-391 mfg 子模块仅 workorders/inventory/delivery/process; domain/StandardCost.java 注释 line 20-21 自陈实际成本归集\"当前实现为手填+自动汇总框架\"。" }, { "area": "制造管理中心/生物质肥料制造中心", "module": "5. 质量检验与追溯", "verdict": "LOGIC_GAP", "gap": "产品级原料/过程/成品检验(实测值+限值自动判定+出厂报告)、不合格品返工/降级/报废流、成品批次号逆向质量追溯链全部缺失;现有 QmsRecord/LabSample 为通用体系台账与样品登记。", "severity": "high", "evidence": "QmsRecord.java 注释为 ISO9001 体系记录(内部审核/管理评审/不符合项/纠正预防/供方质量评价),字段 type/title/dept/finding/dueDate/status/owner,非产品检验。LabSample.java 字段 sampleNo/sampleName/sampleType/source/receiveDate/testItems(自由文本)/status/assignee — grep 实测值/testValue/measuredValue/限值/判定/合格/LIMS 在 LabSample 域与控制器零命中,无各检测项实测值字段、无重金属(砷汞铅铬镉)/蛔虫卵/粪大肠菌群结构化项、无 NY525/NY884/GB20287 对标自动判合格(全后端 grep 零命中)、不生成出厂检验报告。grep 返工/降级/报废/rework/downgrade 命中仅 IT资产报废与 WorkPlan 已退回,无成品不合格返工/降级(有机肥→土壤调理剂)/报废流。无凭成品批次号逆向查工单-工序-原料-报告-人员-设备的追溯链。", "survives": true, "reNote": "缺口属实。制造管理中心(mfg)模块只有4个子页:生产工单(workorders)、库存管理(inventory)、发货与售后(delivery)、配方与设备维护(process),完全没有「质量检验与追溯」相关页面/控制器/实体。逐项核对:(1)产品级原料/过程/成品检验——不存在;WorkOrder 实体仅有 orderNo/productName/planQty/actualQty/unit/status/workshop,没有任何检验项、实测值、限值、自动判定字段;mfg.ts API 只暴露 work-orders 与 inventory;活体 /api/oa/inspections 与 /api/oa/quality-inspections 均返回 404。(2)实测值+限值自动判定+出厂报告——全无;唯一带数值结论的 ops/quality.vue 是「水质监测」(运营管理中心废水业务,字段 COD/氨氮/pH/总磷),result(达标/超标/预警)是人工 select 手选,不是依限值自动判定,且属废水监测而非肥料成品出厂检验。(3)不合格品返工/降级/报废流——不存在;grep「返工/降级/报废」仅命中 IT/财务资产状态下拉(report scrapped asset)与前端 UI graceful-degradation 注释,与产品质量处置无关。(4)成品批次号逆向质量追溯链——不存在;WorkOrder 无 batchNo 字段,ops/trace.vue(WaterTrace)是「水质超标→排污企业→追责建议」溯源,属废水业务而非成品批次追溯。QmsRecord 确为通用 ISO9001 体系台账(type=内部审核/管理评审/不符合项/纠正预防措施/供方质量评价),LabSample 确为通用样品登记(sampleType=水样/泥样/气样,source=项目自检/客户委托/监督抽查),均无产品级检验实测值/限值判定/批次追溯能力。试图推翻但证据一致指向缺口成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/WorkOrder.java (无 batchNo/检验/限值字段)、web/WorkOrderController.java (仅 CRUD+已入库自动入库,无检验判定)、domain/QmsRecord.java + web/QmsRecordController.java (通用ISO9001台账)、domain/LabSample.java (通用样品登记)。前端: ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:383-391 (mfg 仅4子页)、src/oa/api/mfg.ts (仅 work-orders/inventory)、src/oa/pages/mfg/process.vue (配方/设备维护 settingList台账)、src/oa/pages/ops/quality.vue (水质监测,result人工手选)、src/oa/pages/ops/trace.vue (水质超标溯源,非成品批次)。活体: GET /api/oa/work-orders 返回工单无批次/检验字段;GET /api/oa/inspections 与 /api/oa/quality-inspections 均 404。grep「实测值|限值|批次号|逆向追溯|返工|降级|报废」全库无产品检验相关实现命中。" }, { "area": "制造管理中心/生物质肥料制造中心", "module": "6. 库存管理", "verdict": "PARTIAL", "gap": "批次管理、FIFO、保质期/有效期字段与到期前3月预警、半成品水分检测、包装物-成品关联、扫码收发流水缺失;仅安全库存阈值派生一条逻辑。", "severity": "high", "evidence": "InventoryItem.java 字段仅 materialName/category(原料/半成品/成品/辅料)/spec/unit/quantity/safetyStock/location/status/createdAt。InventoryItemController 有 quantity\n\n" }, { "area": "制造管理中心/生物质肥料制造中心", "module": "9. 销售与客户管理", "verdict": "PARTIAL", "gap": "客户农化字段、定制配方销售订单与产计/库存联动、发货单扫码出库与物流单号、农化服务记录、销售分析反哺产采缺失;delivery 页经 biz_record 真持久化但仅通用售后/发货台账无销售订单逻辑。", "severity": "med", "evidence": "Customer.java 字段仅 id/name/type(政府/企业/事业单位)/contact/phone/address/status — 无土壤类型/作物种类/用肥习惯农化字段。无销售订单实体(按客户定制配方NPK)与生产计划/库存联动、无发货单+扫码出库+拼车物流单号、无农化服务(测土配方/施肥指导/效果跟踪)、无产品-区域-季节销售分析。前端 delivery.vue 走 settingListStore→后端 biz_record 表(真行级持久化,非『无后端假数据』),但仅 project/device/type/planDate/status/owner 通用售后台账,无订单-生产-库存联动逻辑。", "survives": true, "reNote": "缺口属实。我尽力在前后端找销售订单链的实现,但确实不存在。逐条核验:(1)客户农化字段缺失——后端 domain/Customer.java 与 CustomerController.java 仅有 name/type/contact/phone/address/status 六个通用字段,无任何土壤/作物/种植面积/农化字段;前端无农化录入。(2)定制配方销售订单与产计/库存联动缺失——整个 oa-backend/domain 下没有任何 SalesOrder/Order(销售)/Ship/Delivery 实体,web/ 下唯一带 Order 的是 WorkOrderController(生产工单);WorkOrderController 确有\"工单状态=已入库时自动生成成品库存\"的产→库联动(autoInventory),但那是生产入库,不是销售订单驱动,且与配方无关。(3)发货单扫码出库与物流单号缺失——全后端 grep 扫码/barcode/物流单号/trackingNo/运单 零命中;前端 mfg/delivery.vue 是用 settingListStore('mfg-delivery') 的通用列表,字段=项目/设备/类型(发货/安装调试/售后维修)/计划日期/状态/负责人,纯售后+发货台账,无销售订单关联、无扫码出库、无库存扣减、无物流单号。(4)农化服务记录缺失——无对应实体/页面。(5)销售分析反哺产采缺失——无任何此类反馈链路。services/api.ts 里两处\"销售订单\"字样是 OFBiz 遗留的 OrderHeader/SalesOrderItemFact mock 摘要描述,与凯迪制造中心无关。delivery 页持久化为真(settingListStore 走 /settings 键值表),但正如描述所言仅为通用台账,无销售订单逻辑。判定 PARTIAL 成立。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Customer.java(仅6通用字段,无农化); web/CustomerController.java:44-47(CreateCustomerRequest 同样6字段); web/WorkOrderController.java:92-145(已入库工单→成品库存联动存在,但产→库非销售订单驱动,无配方); 全后端无 SalesOrder/销售订单实体(domain 仅 WorkOrder.java); grep 扫码|barcode|物流单号|trackingNo|运单 全后端零命中; 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mfg/delivery.vue:5-26(settingListStore('mfg-delivery'),通用发货/售后台账,字段 project/device/type/planDate/status/owner,无销售订单/扫码/物流); data/oaModules.ts:388-391(mfg 仅 workorders/inventory/delivery/process 四页,无销售订单/农化服务页); services/api.ts:466,1136 的\"销售订单\"为 OFBiz 遗留 mock 摘要,与制造中心无关。" }, { "area": "制造管理中心/生物质肥料制造中心", "module": "11. 与其他部门的接口要求", "verdict": "LOGIC_GAP", "gap": "LIMS 检测结果回传本中心成品检验、产品检测报告/认证/登记证/环保数据归集供申报服务部、环保设备运行维保接口、可研产能-实际比对、菌种/工艺/造粒创新实验记录流向知识产权部全部未打通;各部门为孤立模块。", "severity": "med", "evidence": "LabSample 无实测值字段且 grep LIMS/检测结果回写在域与 service 零命中(WorkflowService/TriggerRuleEngine 的『回写』均指合同 invoicedAmount/付款 paidAmount/项目 phase/用印,无 lab→mfg 成品检验回写)。Certification.java(name/certNo/issuer/scope/dates/status) 为通用资质台账,非按 mfg 产品归集肥料登记证/有机认证/绿色生产资料(grep 肥料登记证/有机认证/绿色制造零命中)。Declaration.java 绑 rdProjectId 的项目申报,非归集产品检测报告/环保排放供申报服务部。TriggerRuleEngine 跨部门联动仅 supplier.admit/合同/付款/项目/用印,无 lab/质量/工单跨中心数据接口。", "survives": true, "reNote": "尝试推翻失败,缺口属实。制造管理中心/生物质肥料制造中心的五项跨部门接口在前后端均未打通,各模块为孤立 CRUD。逐项核实:(1) LIMS→成品检验:LabSampleController 是纯 CRUD,LabSampleRepository 全仓库仅被自身控制器引用,无任何向成品检验/QmsRecord/WorkOrder 的回写;(2) 检测报告/认证/登记证/环保数据→申报服务部:唯一的自动采集 DeclarationStepController.autoCollect 只按 rdProjectId 汇总 RdExpense+Patent(研发→申报链6),不采集检测报告/认证/登记证/环保数据,QmsRecordRepository 同样无外部消费者;(3) 环保设备运行维保接口:后端 domain 无任何维保/maintenance 实体或控制器,前端 process.vue 里\"设备维护\"只是 settingList 键值表里的一行静态数据,非接口;(4) 可研产能-实际比对:无任何代码把可研(DesignDoc)产能与 WorkOrder 实际产量做比对;(5) 菌种/工艺/造粒创新实验记录→知识产权部:无任何流向 Patent 的链路。核心下游联动引擎 TriggerRuleEngine 只覆盖合同/付款/用印/项目/供应商/发票/归档关键词,完全不含制造中心跨部门规则。唯一跨引用 BusinessBiController 是单个只读 GET 看板聚合(仅 count 各模块记录用于展示),并非把数据递交给申报服务部或成品检验的部门接口。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/LabSampleController.java(纯CRUD,无下游写回); oa-backend/.../web/QmsRecordController.java(纯CRUD); grep 确认 LabSampleRepository/QmsRecordRepository 仅被各自控制器引用,web/与service/无第二处消费者; oa-backend/.../web/DeclarationStepController.java:102-129 autoCollect 只注入 RdExpenseRepository+PatentRepository,仅按 rdProjectId 采集研发费用与专利,不含检测/认证/环保数据; oa-backend/.../service/TriggerRuleEngine.java:109-128 fire() 关键词矩阵只有 付款/用印/收款/验收/供应商/合同/立项,无 LIMS/检验/维保/产能/实验 任何制造中心规则; oa-backend/.../web/WorkOrderController.java 仅依赖 WorkOrderRepository+InventoryItemRepository,与 LabSample/QmsRecord/Declaration/Certification/可研 无关联; oa-backend domain 目录 grep 维保/maintenance 零命中; oa-backend/.../web/BusinessBiController.java 仅 1 个 @GetMapping /business-overview 只读聚合; 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mfg/process.vue 的\"设备维护\"为 settingList('mfg-process') 静态种子行,非接口; oa/api/mfg.ts 仅 WorkOrder/Inventory CRUD,无跨部门接口端点。" }, { "area": "工程管理中心/质安部", "module": "1. 质量管理体系", "verdict": "PARTIAL", "gap": "缺:质量目标制定与分解、跨模块合格率/投诉率自动采集、月/季达成看板与超差预警、体系文件版本控制/在线查阅/废止提醒、内审在线检查表、管理评审输入自动汇总、CAPA有效性验证闭环、供方质量评价及不合格供应商自动限制采购联动。仅手工录入台账。", "severity": "high", "evidence": "QmsRecordController.java + domain/QmsRecord.java 是一张扁平台账,字段仅 type/title/dept/finding/dueDate/status/owner(CreateQmsRecordRequest L57-60),有完整 GET/POST/PUT/DELETE。前端 ehs/qms.vue 用 MasterDataPage 渲染,QMS_TYPES=['内部审核','管理评审','不符合项','纠正预防措施','供方质量评价'] 只是下拉枚举。无任何质量目标分解、生产/实验室/售后合格率自动采集、达成看板/超差预警、体系文件版本控制、CAPA有效性验证闭环、供方质量评价→采购联动实体。TriggerRuleEngine.java 全文 fire() 规则矩阵(付款/用印/收款/验收/供应商/合同/立项)无任何 qms 关键词/联动;grep 全后端 '内审/管理评审/CAPA/供方质量' 仅出现在 DataSeeder 种子注释。", "survives": true, "reNote": "尽力推翻但无法推翻——缺口属实(PARTIAL)。质安部/质量管理体系仅是一张手工台账CRUD,描述中列举的8项进阶能力全部缺失,仅个别有名无实。\\n\\n实际实现仅为:QmsRecord 域(domain/QmsRecord.java)是7字段扁平表(type/title/dept/finding/dueDate/status/owner),QmsRecordController 纯增删改查,前端 oa/pages/ehs/qms.vue 直接复用通用 MasterDataPage 表格(列=类型/标题/部门/发现/整改期限/状态/责任人),type 仅是下拉枚举['内部审核','管理评审','不符合项','纠正预防措施','供方质量评价']——是字符串标签,背后没有任何对应业务逻辑。\\n\\n逐条核对8项缺口:\\n1) 质量目标制定与分解——grep 质量目标/qualityGoal/target 后端前端 0 命中。无。\\n2) 跨模块合格率/投诉率自动采集——grep 合格率/passRate/qualifiedRate/complaintRate 全库 0 命中。无。\\n3) 月/季达成看板与超差预警——qms.vue 无任何图表/看板/dashboard,grep 看板/超差/预警 0 命中。无。\\n4) 体系文件版本控制/在线查阅/废止提醒——Certification 域无 version/revision/废止/查阅 任何字段(grep 计数=0),只有 name/certNo/issuer/scope/issue/expireDate/status。无版本控制。\\n5) 内审在线检查表——无独立检查表实体,仅靠 type='内部审核' 的台账行手填 finding。无。\\n6) 管理评审输入自动汇总——type='管理评审' 同样只是手填一行台账,无任何跨模块汇总逻辑。无。\\n7) CAPA有效性验证闭环——status 只有 开放/整改中/已关闭 三态手工切换,无有效性验证字段、无验证环节、无闭环逻辑。无。\\n8) 供方质量评价及不合格供应商自动限制采购联动——这是最接近\"已实现\"的一项,但方向相反:TriggerRuleEngine.ruleAdmitSupplier 只做\"准入\"(把准入中→合格 或新建合格供应商),没有质量评价、没有 合格→停用 降级、没有任何采购控制器校验 supplier.status 来拦截下单(grep 停用 仅命中 SupplierController 自身的手填 status 字段)。Supplier 域也无评分/评价字段。限制采购联动=无。\\n\\n结论:8项中 0 项真正实现,第8项有反向的准入联动但不构成\"质量评价+限制采购\"。判定 PARTIAL(仅手工台账)完全准确。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/QmsRecord.java (7字段扁平台账); oa-backend/src/main/java/com/kaidi/oa/web/QmsRecordController.java (纯CRUD,type仅字符串); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ehs/qms.vue (复用MasterDataPage通用表格,无看板/图表); ofbiz-framework/plugins/modern-ui/app/src/oa/api/qhse.ts:102 (QMS_TYPES仅枚举标签); oa-backend/src/main/java/com/kaidi/oa/domain/Supplier.java (无质量评价/评分字段); oa-backend/src/main/java/com/kaidi/oa/web/SupplierController.java (status手填,无采购拦截); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:409 ruleAdmitSupplier (只做准入合格,无降级/限购); oa-backend/src/main/java/com/kaidi/oa/domain/Certification.java (无version/废止/查阅字段); grep全库:质量目标/合格率/passRate/complaintRate/超差/看板/CAPA有效性 均0命中" }, { "area": "工程管理中心/质安部", "module": "2. 安全生产管理", "verdict": "PARTIAL", "gap": "完全缺:安全目标与责任书(签订/续签提醒)、危险源辨识与风险评估(危险源库/红橙黄蓝/JSA-HAZOP)、作业许可(动火/受限空间/高处/吊装作业票在线审批+气体检测+监护确认)、安全投入(财务联动)、安全培训、事故与事件管理(快速上报/调查/法定时限上报)、应急管理(预案/演练/物资台账)。", "severity": "high", "evidence": "八项子功能中仅「安全检查与隐患排查」有实体落地:SafetyCheck.java + SafetyCheckController.java(GET/POST/PUT/DELETE),字段 code/type/location/item/result/level/finding/responsible/rectifyStatus/dueDate/checkDate(L56-59),整改状态枚举 待整改/整改中/已闭环。前端 ehs/safety.vue 为纯表单台账,无拍照/定位/计划自动生成检查表/复查二次确认字段。domain 目录列全部 89 个实体,无 作业票/作业许可/危险源/JSA/HAZOP/安全责任书/安全投入/事故/应急预案/演练 任何实体或控制器;grep '作业票/应急预案' 仅命中 DataSeeder 种子文本。", "survives": true, "reNote": "缺口属实。工程管理中心/质安部\"安全生产管理\"链所列的七大块(安全目标与责任书及续签提醒、危险源辨识与风险评估含危险源库/红橙黄蓝/JSA-HAZOP、作业许可即动火/受限空间/高处/吊装作业票在线审批+气体检测+监护确认、安全投入财务联动、安全培训、事故与事件管理含快速上报/调查/法定时限、应急管理含预案/演练/物资台账)在代码与活体中均无实现。统一EHS模块(id:'ehs')仅有4个子项:安全检查隐患、三体系认证、质量体系、EHS看板——全部围绕\"检查→隐患→整改闭环\"和ISO认证到期预警,没有任何作业票审批、危险源库、风险评估矩阵、责任书签订续签、应急预案/演练、事故调查上报、安全培训、安全投入联动的领域模型或接口。我尽力推翻该缺口但未能成功,反向证据一致指向缺口成立。仅有的零星关键词命中均为无关上下文(HealthRecord把\"高处作业\"当职业健康危害因素;Supervision种子里的\"吊装旁站\";legal模块的\"风险评估\";knowledge/culture/favorites里\"应急预案与演练记录\"\"消防演练\"只是公告/收藏标题字符串),都不构成安全生产管理功能。", "reEvidence": "1) 唯一相关后端实体/控制器 SafetyCheck(oa-backend/src/main/java/com/kaidi/oa/domain/SafetyCheck.java 与 web/SafetyCheckController.java)注释明确为\"safety-check / hidden-danger record\",字段只有 code/type(安全|质量|环境)/location/item/result(合格|隐患|不合格)/level/finding/responsible/rectifyStatus(待整改|整改中|已闭环)/dueDate/checkDate——纯隐患排查整改,无作业许可/危险源/责任书/应急/事故概念。2) 前端 EHS 模块定义 src/data/oaModules.ts 第299-307行 id:'ehs' 只挂4个子项:/ehs/safety(安全检查隐患)、/ehs/cert(三体系认证)、/ehs/qms(质量体系)、/ehs/board(EHS看板)。3) EHS API src/oa/api/ehs.ts 仅封装 /safety-checks 与 /certifications 两类。4) 全仓 grep 责任书|危险源|风险评估|JSA|HAZOP|作业许可|动火|受限空间|作业票|气体检测|监护|安全投入|安全培训|事故|应急预案|演练|物资台账|红橙黄蓝 在后端与前端 src 下无任何对应实现,命中均为无关上下文(HealthRecordController.java 把高处作业当职业健康危害因素;DataSeeder 吊装旁站/受限空间作业票仅作隐患描述文本;legal/compliance.vue 风险评估;FavoriteController/knowledge/culture 的\"应急预案与演练记录\"\"消防演练\"为收藏/公告标题)。5) 活体 127.0.0.1:8091 携 admin token 探测:work-permits/hazards/hazard-sources/risk-assessments/emergency-plans/emergency-drills/safety-targets/responsibility-letters/incidents/safety-training/safety-investment/jsa/hazop/permits 全部 404,对照 /safety-checks 返回 200,证明这些功能端点根本不存在。" }, { "area": "工程管理中心/质安部", "module": "3. 职业健康管理", "verdict": "PARTIAL", "gap": "缺:职业病危害因素清单与定期检测+超标预警整改;体检到期自动提醒(nextExamDate 已存但无调度读取);禁忌症自动调岗提醒;PPE按岗配置/领用/更换周期/超期提醒/特殊PPE检测;作业场所粉尘/噪声/照度/温湿度监测录入与超标预警。HealthRecordController 无 PUT/DELETE。", "severity": "high", "evidence": "仅 HealthRecord.java + HealthRecordController.java,且该控制器只有 GET/POST,无 PUT/DELETE(全文仅 list/get/create)。字段含 nextExamDate(CreateHealthRecordRequest L53-55)但 AlertScheduler.java 的定时扫描只覆盖 PersonnelCert(refreshCertExpiry L144-168),从不读 HealthRecord/nextExamDate;HealthRecord 也不出现在 AlertController.aggregate() 的任何告警源里。hazardFactor 只是 HealthRecord 上一个枚举字段(粉尘/噪声等),无独立『危害因素清单+定期检测+超标预警』实体。无任何 PPE/防护用品 与 作业场所监测(粉尘/噪声/照度) 实体或控制器。", "survives": true, "reNote": "Gap is real.", "reEvidence": "HealthRecordController has only GET and POST, no PUT or DELETE; AlertScheduler does not read nextExamDate; no PPE or monitoring code exists." }, { "area": "工程管理中心/质安部", "module": "4. 环境保护管理", "verdict": "MISSING", "gap": "完全缺:环保法规合规义务清单与差距评估、排污许可管理(许可量/自行监测/超标预警/季报年报)、三废管理(有/无组织排放源+治理设施运行参数+危废转移联单电子化)、环境风险与应急预案/演练/物资、环保税费自动计算。复用的水质监测是对外经营数据,非排污合规。", "severity": "high", "evidence": "domain 目录无 排污许可/三废/废气/废水排口/危废转移联单/环保税/合规义务清单/环境应急 任何实体。唯一相关的 WastewaterClient.java + WaterQualityRecord.java(WaterQualityRecordController.java 类注释明确写 '运营管理中心,水质监测',按 clientId 关联外部受托客户的 COD/氨氮/pH/总磷),属于对外水质监测经营业务,非本企业排污合规义务;其超标记录在 BusinessBiController.opsStat() 归到运营中心而非EHS。grep '排污/危废/环保税' 全后端仅命中 DataSeeder/PriceItem(排污泵设备)/LabSample(危废样)等无关文本。", "survives": true, "reNote": "缺口属实。质安部\"环境保护管理\"在系统中完全未实现:环保法规合规义务清单与差距评估、排污许可管理(许可量/自行监测方案/超标预警/季报年报执行报告)、三废管理(有/无组织排放源+治理设施运行参数+危废转移电子联单作为本企业合规)、环境风险与应急(风险源识别/应急预案/演练/物资台账)、环保税费自动计算——这五大块在前后端均无任何对应页面、路由、API、控制器或领域实体。我尽力推翻未果。EHS模块(oaModules.ts:299-307)只有4个子项:安全检查隐患(safety)、三体系认证(cert)、质量体系(qms)、EHS看板(board);ehs.ts API仅暴露SafetyCheck+Certification的CRUD。SafetyCheck中的\"环境\"只是检查体系的一个type枚举值(安全/质量/环境,见domain/SafetyCheck.java:12与safety.vue:18),是隐患巡检整改闭环,绝非排污合规。所有\"危废/超标/排污\"关键词命中全部落在ops运营管理中心(ops/sludge.vue危废联单、ops/trace.vue超标溯源、ops/clients.vue排污客户),这正是公司作为污水处理服务商的对外经营数据(纳管排污企业客户),与质安部本企业排污合规义务无关——与缺口描述\"复用的水质监测是对外经营数据,非排污合规\"完全吻合。需求文档(requirements/_req_slices/10_工程管理中心__质安部.txt:14)明确列出该功能,但仅为规划条目,从未落地。后端无Emission/Permit/Pollut/EnvTax/Manifest/Discharge任何领域实体,仅有的WastewaterClient属于运营业务。", "reEvidence": "前端:ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:299-307(EHS仅safety/cert/qms/board四子项,无环保合规);src/oa/api/ehs.ts(仅SafetyCheck+Certification CRUD);src/oa/pages/ehs/safety.vue:18(\"环境\"仅为体系type枚举);ops模块对外经营数据 src/oa/pages/ops/sludge.vue、trace.vue、clients.vue(危废联单/超标溯源/排污客户=污水处理客户业务,非本企业合规)。后端:oa-backend/src/main/java/com/kaidi/oa/domain/SafetyCheck.java:12(type=安全/质量/环境的检查记录);domain目录下无Emission/Permit/Pollution/EnvTax/Manifest/Discharge实体,仅WastewaterClient(运营客户)。全代码库grep排污许可/许可量/自行监测/超标预警/环保税/应急预案/有组织无组织/治理设施/危废转移联单(电子化合规)/合规义务清单/差距评估/环保季报年报=后端零业务命中(仅FavoriteController.java:59与DataSeeder的种子字符串噪声)。需求侧仅为规划条目:requirements/_req_slices/10_工程管理中心__质安部.txt:14-15、requirements/_analysis/erp-master-dump.txt:100、requirements/kaidi-table-model.json:288(blocks列表中的\"环境保护管理\"待建块)。" }, { "area": "工程管理中心/质安部", "module": "5. 安全设施管理", "verdict": "MISSING", "gap": "整模块零实现:无消防设施(灭火器/消火栓/报警器)、防雷防静电、气体检测报警器、通风设施的台账与定期检查/维保记录。", "severity": "med", "evidence": "domain 目录全 89 实体经 grep(permit/fire/extinguisher/safetyfacility 等)零命中;无消防设施/灭火器/消火栓/报警器/防雷防静电/气体检测报警器/通风设施的台账实体、控制器或前端页面。ItAsset.java(信息中心IT资产)与 LabInstrument.java(实验室仪器,有校准提醒)均与安全设施无关。整模块零实现。", "survives": true, "reNote": "缺口属实。质安部\"安全设施管理\"无任何独立实现。EHS模块只有 SafetyCheck(隐患排查/整改记录:检查单号/体系/检查项/隐患等级/整改状态/责任人/检查日期——属于检查发现台账,非设施台账)、Certification(ISO三体系认证,含 expireDate)、QmsRecord、PersonnelCert。没有任何实体/仓库/控制器/路由/前端页面建模\"消防设施(灭火器/消火栓/报警器)、防雷防静电、气体检测报警器、通风设施\"的设施台账,也没有这些设施的设施类型/规格/有效期/上次检查/下次检查/维保周期/维保记录等字段。kaidiDeptView.ts 中 质安部 的\"安全设施管理\"块 status=built 只是导航别名,path 指向 /ehs/safety(pageLabel=\"安全检查隐患\"),复用既有隐患检查页,并非真实的设施台账实现。DataSeeder 里唯一相关的\"消防器材配置与有效期检查\"只是一条 SafetyCheck 隐患检查记录,不是设施台账条目。对抗复验未能推翻此缺口。", "reEvidence": "后端:oa-backend/src/main/java/com/kaidi/oa/domain/SafetyCheck.java(字段全是检查/整改类,无设施台账/维保周期字段);oa-backend/src/main/java/com/kaidi/oa/web/SafetyCheckController.java(路由 /api/oa/safety-checks,仅隐患检查CRUD);oa-backend/src/main/java/com/kaidi/oa/domain/Certification.java(ISO认证,非设施)。前端:ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ehs/safety.vue(title=\"安全检查隐患\",列与字段均为检查/整改,无设施台账);ofbiz-framework/plugins/modern-ui/app/src/oa/api/ehs.ts(仅 safety-checks + certifications);ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts:~10792(质安部\"安全设施管理\"块 status=built 但 path=\"/ehs/safety\" pageLabel=\"安全检查隐患\",为导航别名)。种子:oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:1637(\"消防器材配置与有效期检查\"为一条 SafetyCheck 隐患记录)。全仓 grep 灭火器/消火栓/气体检测/通风设施/防雷/静电 在源代码中无任何设施台账实现,仅 utils/display.ts:379 一条无关标签\"库存设施查询\"。安全相关后端路由仅 /api/oa/safety-checks 与 /api/oa/it-assets(IT资产,无关)。" }, { "area": "工程管理中心/质安部", "module": "6. 体系认证与外部审核", "verdict": "PARTIAL", "gap": "到期提醒窗口30天≠6个月且无主动推送/复评任务生成;CertificationController 无 PUT/DELETE。完全缺外部审核管理与合规性评价(及不符合项自动转CAPA)。", "severity": "med", "evidence": "CertificationController.java 认证证书管理基本到位(name/certNo/issuer/scope/issueDate/expireDate,读时按 expireDate 派生状态 deriveStatus L80-98),但 EXPIRING_WINDOW_DAYS=30(L40),远不满足需求『到期前6个月自动提醒复评』;且 Certification 未被 AlertScheduler/AlertController 纳入(scheduler 只刷 PersonnelCert,aggregate 无 Certification 源),故无主动推送/复评任务生成,仅前端 ehs/board.vue 被动展示。CertificationController 无 PUT/DELETE。无外部审核(审核计划/任务分配/不符合项整改跟踪/报告归档)与合规性评价(年度评价报告/不符合项转CAPA)任何实体。", "survives": true, "reNote": "缺口属实,尝试推翻失败——每一条子主张都被代码与活体证据坐实,证明体系认证(Certification)模块的\"外部审核/合规性评价/到期主动推送/复评任务/CAPA自动转\"确实缺失。\n\n逐条核对(对象=体系认证 Certification 实体,即\"三体系认证/施工资质\",本缺口所指模块):\n1) 到期窗口30天≠6个月:CertificationController.java:40 `EXPIRING_WINDOW_DAYS = 30`,deriveStatus(80-98)用 today.plusDays(30) 判\"即将到期\",确为30天而非6个月。\n2) 无主动推送/复评任务生成:Certification 实体在整个后端仅被自己的 controller/repository/domain 与 DataSeeder 引用(grep全仓只命中这4处);service 层、TriggerRuleEngine、AlertScheduler 全无引用。AlertScheduler.refreshCertExpiry()(144行)与 AlertController.aggregate()(104行)的到期扫描/推送只遍历 PersonnelCertRepository(人员证件),从不触及 Certification;scheduler 的 notifications.notify 仅用于流程超时,证书到期连推送都没有,更无复评任务生成。\n3) 无 PUT/DELETE:CertificationController 只有 @GetMapping/@GetMapping(\"/{id}\")/@PostMapping,无 @PutMapping/@DeleteMapping。活体:8091 实测 PUT /api/oa/certifications/1 → 405、DELETE → 405。\n4) 完全缺外部审核管理与合规性评价(及不符合项自动转CAPA):全 web 目录 grep \"外部审核/合规性评价/监督审核/复评/再认证/surveillance/recertif\" 零命中;Certification 实体字段仅 name/certNo/issuer/scope/issueDate/expireDate/status,无任何审核/合规/CAPA 字段。CAPA(QmsRecord 之\"不符合项/纠正预防措施\")仅能经 QmsRecordController 自身 POST/PUT 手工创建,与 Certification 零联动(grep 全仓无任何从证书流程 new QmsRecord 的代码)。\n\n前端同样佐证:src/oa/pages/ehs/cert.vue 是只读列表+登记(create),无编辑/删除/外部审核/合规评价/复评/推送;api/ehs.ts 仅暴露 listCertifications/createCertification。\n\n唯一需澄清的\"误判风险\"已排除:仓库内确有 AlertScheduler 的定时推送,但其作用对象是 PersonnelCert(人员个人证件)而非本缺口所指的体系认证 Certification,故不能用以推翻本缺口。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/CertificationController.java:40 (EXPIRING_WINDOW_DAYS=30), :48-129 (仅 GET/GET-by-id/POST,无 PUT/DELETE); oa-backend/src/main/java/com/kaidi/oa/domain/Certification.java:19-39 (字段无审核/合规/CAPA); oa-backend/src/main/java/com/kaidi/oa/repository/CertificationRepository.java (仅 findByStatus); oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java:144-168 refreshCertExpiry 与 :91-119 推送均针对 PersonnelCert,非 Certification; oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:104 aggregate 仅遍历 PersonnelCertRepository; oa-backend/src/main/java/com/kaidi/oa/web/QmsRecordController.java (CAPA 仅自身手工 POST/PUT,无证书联动); 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ehs/cert.vue 与 src/oa/api/ehs.ts:57-63 仅 list/create。活体:8091 实测 PUT/DELETE /api/oa/certifications/1 均返回 405。全后端 grep \"外部审核/合规性评价/监督审核/复评/再认证/recertif/surveillance\" 在 web 目录零命中;Certification 全仓仅被自身 4 文件+DataSeeder 引用。" }, { "area": "工程管理中心/质安部", "module": "7. 培训与资质管理", "verdict": "PARTIAL", "gap": "缺:培训计划与执行(年/月计划、在线报名、二维码/人脸签到、考核、自动归档个人档案);资质到期自动推送培训复证任务(PersonnelCert 有到期调度但不触发培训任务);外来人员管理(承包商/访客安全教育记录、出入证、门禁联动、未培训禁入)。注:PersonnelCert 的 PUT/DELETE 与到期调度提醒实际已具备,初判该注记应纠正。", "severity": "med", "evidence": "人员资质台账已实现:PersonnelCertController.java 有完整 GET/POST/PUT/DELETE(初判『无PUT/DELETE』之注记不成立——L80-109 均在);且 PersonnelCert.status 并非纯手填:AlertScheduler.refreshCertExpiry()(L144-168)每小时按 expireDate 重派生 有效/即将到期/已过期,并经 AlertController.aggregate()(L104-113)输出『证件预警』——初判『到期纯靠手填,无调度提醒』对 PersonnelCert 不准确。但核心缺口仍在:培训只有 admin/training.vue,经 settingListStore('admin-training') 键值表存的扁平死数据(course/lecturer/audience/date/hours/result),无后端 Training 实体/控制器(find 零命中),无计划/在线报名/签到/考核/个人档案归档,与 PersonnelCert 复证无任何联动;无外来人员(承包商/访客)安全教育/出入证/门禁联动实体。", "survives": true, "reNote": "缺口属实。我尽力在前后端彻查后无法推翻它——培训计划与执行、报名/签到/考核/自动归档、资质到期触发复证培训任务、外来人员管理三大块的实质功能均不存在。仅有的\"培训\"痕迹是 admin/training.vue 一个扁平 CRUD 记录列表(课程/讲师/对象/日期/学时/考核结果),由通用 settingList 键值表承载,无后端实体/控制器;它不含年/月计划结构、在线报名、二维码/人脸签到、考核引擎、个人档案自动归档。全仓 `签到`/`二维码`/`qrcode`/`人脸`/`报名`/`承包商`/`门禁`/`出入证` 及 contractor/visitor/exam/checkin/access 实体与控制器=NONE FOUND。AlertScheduler 的 refreshCertExpiry() 只把 PersonnelCert 状态从 expireDate 重算为 有效/即将到期/已过期 并经 AlertController 汇总成预警,不创建/推送任何培训或复证任务(`复证`/`复训`/`培训任务`/`recert`=NONE FOUND)——与缺口自带注记一致。外来人员/访客/门禁全部命中均为附带文案(AuthInterceptor 把\"门禁\"作财务访问比喻、culture mock 的通知标题、FeedController 的\"拜访客户\"、appmgr 演示表单名\"访客预约\"、\"只读访客\"角色名),无任何承包商/访客安全教育、出入证、门禁联动、未培训禁入功能。注记关于 PersonnelCert PUT/DELETE 与到期调度已具备这点属实(已核验),但只缩小缺口、并未实现其余实质内容,故缺口仍成立。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/admin/training.vue (扁平CRUD,settingListStore('admin-training'),无报名/签到/考核/归档); EHS区只有 oa/pages/ehs/cert.vue + oa/api/ehs.ts (三体系认证证书台账,非人员培训). 后端: oa-backend/.../task/AlertScheduler.java refreshCertExpiry()/pushAlerts() 仅刷新到期状态+发预警,不建培训任务; web/PersonnelCertController.java 仅 GET/POST/PUT/DELETE 证件台账; web/AlertController.java 汇总到期预警. 缺失确认: domain/ 与 web/ 下无 contractor|visitor|access|gate|train|enroll|exam|checkin 实体/控制器(NONE FOUND); 全仓 grep 复证|复训|培训任务|recert=NONE FOUND; 承包商|访客|门禁|出入证 仅命中 config/AuthInterceptor.java(财务比喻)、web/FeedController.java(拜访客户)、appdev/appmgr.vue(演示表单名/只读访客角色)、culture/mock.ts(通知标题),均非功能实现." }, { "area": "工程管理中心/质安部", "module": "8. 数据分析与报告", "verdict": "LOGIC_GAP", "gap": "看板只覆盖安全检查+认证;缺质量目标完成率/培训完成率/事故率/环保达标率/特种设备检验率等核心QHSE指标的看板与按部门/时间下钻;无政府监管格式报表导出;无事故/体检异常率趋势。报表引擎(ReportDefinitionController)QHSE侧仅含隐患单源,非全QHSE,初判『无后端报表引擎』应纠正为『引擎存在但QHSE覆盖单一』。", "severity": "med", "evidence": "前端 ehs/board.vue 看板仅前端聚合 listSafetyChecks+listCertifications 两类(检查总数/隐患数/重大/闭环率/按体系条形/认证到期);BusinessBiController.ehsStat() 后端仅产 openHazards+majorHazards 两指标。证实缺 质量目标完成率/培训完成率/事故率/环保排放达标率/特种设备检验率 等。但初判『指标全在前端硬聚合、无后端报表引擎支撑』过于绝对:ReportDefinitionController.java 是一个可配置报表引擎,已注册 source 'safety/隐患排查'(L213-222,含 检查类型/结果/隐患等级/整改状态/地点/责任人 多维度)可做分组下钻——隐患维度有后端引擎支撑。仍判 LOGIC_GAP:该引擎在QHSE侧只覆盖 SafetyCheck,无 QMS/职业健康/认证/环保 数据源,无月/季/年报自动生成,无政府监管格式导出(事故统计表/排污许可执行报告)。", "survives": true, "reNote": "缺口属实。工程管理中心/质安部的\"数据分析与报告\"在 QHSE 侧严重单一覆盖,确认未实现描述中列出的核心能力。证据:(1) 唯一的 EHS 看板 ehs/board.vue 仅消费 listSafetyChecks + listCertifications 两个数据源,指标只有\"检查总数/隐患不合格/重大隐患/隐患闭环率\"四块 tile + 按体系/整改状态分组 + 三体系认证到期预警;完全没有质量目标完成率、培训完成率、事故率、环保达标率、特种设备检验率,也没有按部门/按时间的下钻,没有事故/体检异常率趋势。(2) QHSE 相关后端控制器 SafetyCheckController/QmsRecordController/CertificationController/HealthRecordController 只有基础 CRUD 的 @GetMapping,无任何 dashboard/trend/byDept/统计/导出聚合端点。(3) 全后端 grep 培训完成率|事故率|环保达标|特种设备|质量目标完成率|accidentRate|trainingRate|envCompliance 零命中——这些指标根本不存在。(4) 无政府监管格式报表导出:全后端唯一的 byte[]/xlsx/csv 端点是 FileController 的上传文件流式下载,与 QHSE 监管报表无关;grep 监管/政府报表/监测报表/应急 仅命中 FavoriteController 一条无关字符串(\"应急预案与演练记录\")。(5) 报表引擎 ReportDefinitionController 确实存在且可运行,但其 SOURCES 白名单的 QHSE 侧只有 safety(隐患排查)单源,活体 /report-definitions/schema 返回 ['合同','付款','预算','投标','商机','发票','隐患排查','审批实例','项目']——证实\"引擎存在但 QHSE 覆盖单一\"。(6) BusinessBiController.ehsStat() 仅从 SafetyCheck 算 openHazards+majorHazards。初判\"无后端报表引擎\"应纠正为\"引擎存在但 QHSE 覆盖单一\",但缺口本身(缺多维 QHSE 指标看板/下钻/监管报表/趋势)成立。", "reEvidence": "前端看板: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ehs/board.vue (仅 listSafetyChecks+listCertifications; tiles=检查总数/隐患/重大隐患/隐患闭环率); API: src/oa/api/ehs.ts (仅 /safety-checks /certifications)。前端模块 ehs 仅 4 子项 safety/cert/qms/board (src/data/oaModules.ts:299-307)。后端报表引擎: oa-backend/src/main/java/com/kaidi/oa/web/ReportDefinitionController.java:213-222 (QHSE 仅 safety 单源); 活体 /api/oa/report-definitions/schema 返回 9 源仅含 safety:隐患排查。QHSE 控制器仅 CRUD: SafetyCheckController.java:36/50/62, QmsRecordController.java:37/51/62, CertificationController.java:48/58/105, HealthRecordController.java:36/47/58 (无聚合/导出端点)。BusinessBiController.java:250-262 ehsStat 仅算 openHazards+majorHazards。全后端 grep 培训完成率|事故率|环保达标|特种设备|质量目标完成率 零命中;监管报表导出零命中(FavoriteController.java:59 为无关字符串)。" }, { "area": "工程管理中心/质安部", "module": "9. 与其他部门的接口要求", "verdict": "MISSING", "gap": "八类部门接口全部缺自动数据贯通:生产质量数据/隐患/设备安全状况、实验室检测/环境监测/危害因素、采购供应商质量评价与安全资质、HR员工档案/培训持证、设备部特种设备台账/安全设施维保、环保治理设施运行参数、法务合规义务库共享、申报服务部认证证书共享。无任何跨模块接口/事件订阅/自动采集。", "severity": "high", "evidence": "SafetyCheck/QmsRecord/HealthRecordController 均无 publishEvent/@EventListener/subscribe/DataSyncLog 任何跨模块事件或自动采集(grep 三控制器零命中)。TriggerRuleEngine.fire() 规则矩阵无任何 QHSE 关联(不向/从 生产/实验室/采购/HR/设备 贯通质量隐患/检测/供应商资质/持证/特种设备数据)。各 QHSE 实体(QmsRecord/SafetyCheck/HealthRecord/Certification/PersonnelCert)均为孤立台账,字段无外键指向 Project 之外的其它中心,数据靠 DataSeeder 种子或手工录入。", "survives": true, "reNote": "缺口属实。质安部/EHS 中心的八类跨部门接口(生产质量/隐患/设备安全、实验室检测/环境监测/危害因素、采购供应商质量评价与安全资质、HR档案/培训持证、设备部特种设备台账/安全设施维保、环保治理设施运行参数、法务合规义务库、申报服务认证证书共享)全部没有任何自动数据贯通。SafetyCheck/QmsRecord 仅是纯手工 CRUD:前端 ehs/safety.vue 用 MasterDataPage 让用户手动填检查项/隐患等级;后端 SafetyCheckController/QmsRecordController 只有标准增删改查,无任何上游来源采集。SafetyCheck 实体连 sourceModule/fromDept/deviceId/supplierId/hrId 这类来源关联字段都没有,根本无法记录\"数据来自哪个部门\",更谈不上自动接收。全代码库无任何事件订阅/发布机制(grep ApplicationEvent/EventListener/publishEvent/subscribe 全空)。唯一的自动联动引擎 TriggerRuleEngine 只覆盖合同/付款/用印/项目/供应商准入/发票/归档七条财务-合同链,没有任何一条规则写入或读取 SafetyCheck/QmsRecord/EHS。唯一的跨模块 auto-collect 接口(declaration-steps/auto-collect 从研发/财务/IP 采集)服务于\"申报\"模块,不是质安中心,反证了代码库有能力做此类接口却未对八类质安接口实现。DataSyncLogController 自述\"实际同步通道与触发方式属甲方集成口径,当前为台账记录框架\",即只是空台账壳。AlertController/BusinessBiController/AlertScheduler 只是反向只读消费 SafetyCheck/PersonnelCert 出预警和BI看板,方向相反,不构成\"八部门自动喂入质安中心\"。推翻失败。", "reEvidence": "oa-backend/.../web/SafetyCheckController.java(纯CRUD,无跨模块采集); oa-backend/.../web/QmsRecordController.java(纯CRUD); oa-backend/.../domain/SafetyCheck.java(字段仅id/code/type/location/projectId/item/result/level/finding/responsible/rectifyStatus/dueDate/checkDate/createdAt,无任何上游来源关联字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ehs/safety.vue(MasterDataPage手工录入); oa-backend/.../service/TriggerRuleEngine.java(七条联动规则均不涉及safety/qms/ehs,grep零命中); grep ApplicationEvent|EventListener|publishEvent|subscribe 全代码库零命中; oa-backend/.../web/DataSyncLogController.java 注释\"当前为台账记录框架\"; 唯一auto-collect在 governance.ts 第69行 declaration-steps/auto-collect(服务申报,非质安)" }, { "area": "工程管理中心/资料室", "module": "1. 资料分类与档案库管理", "verdict": "PARTIAL", "gap": "缺自定义多级分类配置、每类别元数据模板、虚拟档案库、保存期限+到期提醒、实体存储位置与条码/RFID/云存储ID。维持 PARTIAL。", "severity": "high", "evidence": "Archive.java(domain/Archive.java) 字段仅 category(自由 String 单值)/title/sourceType/accessLevel/tags 等扁平字段。无多级分类配置表、无每类别独立元数据模板(项目档案的项目编号/起止/投资额无对应字段)。无虚拟档案库实体(按年度/部门/保密等级/保存期限建库)。无保存期限/到期日字段(grep retention/保存期限/expireDate 在 archive 域命中为空,仅 Certification/Policy/PersonnelCert)。无存储位置字段(库房号/密集架/盒号/条码/RFID/云存储ID)。前端 library.vue 分类仅按 a.category 动态聚合,security.vue 的密级/类别全是 settingList mock。", "survives": true, "reNote": "缺口属实。资料室/档案库当前实现是一个扁平的统一档案库:后端 Archive 实体字段固定为 id/category/title/sourceType/sourceId/fileName/fileType/fileSize/uploader/archiveDate/tags/summary/accessLevel/fileUrl/storedFileId/createdAt(活体 /api/oa/archives 返回的 keys 完全一致,24 条种子数据)。逐项核对缺口所列 5 项均无实现:(1) 自定义多级分类配置——category 只是按数据聚合出的扁平字符串分组(ArchiveController.findByCategory + library.vue 用 m[a.category] 计数),没有可配置的多级分类树/分类配置端点;FolderController 是另一套文档文件夹树(DocFolder parent/child),并未与档案分类打通。(2) 每类别元数据模板——全代码无任何 archive 元数据模板,字段是固定扁平集合。(3) 虚拟档案库——无此概念,grep 零命中。(4) 保存期限+到期提醒——Archive 无 retention/expire 字段;到期提醒只存在于证照模块(PersonnelCert/Certification + AlertScheduler 的即将到期/已过期),与档案库无关。(5) 实体存储位置与条码/RFID/云存储ID——Archive 仅有 fileUrl(预览占位)与 storedFileId(二进制关联),无 storageLocation/barcode/rfid/cloudStorageId 任一字段。已实现部分仅为:扁平分类浏览、关键字检索、在线预览+水印、批注、机密分级读权限控制。判定 PARTIAL 成立。", "reEvidence": "后端实体 oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java(字段集,无 retention/storageLocation/barcode/rfid/cloudStorageId);控制器 oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java(list 仅 category 精确匹配+keyword contains,create 字段集同实体);oa-backend/src/main/java/com/kaidi/oa/web/FolderController.java(独立 DocFolder 树,未与档案分类关联);种子 oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:1405-1504(archive() helper 参数即固定字段集);前端 API ofbiz-framework/plugins/modern-ui/app/src/oa/api/archives.ts 与页面 .../src/oa/pages/archive/library.vue(cats 由 m[a.category] 扁平聚合)。grep 证据:在 oa-backend/src 与前端 src(排除 node_modules/static/dist/assets)对 retention/保存期限/到期提醒/storageLocation/存储位置/barcode/条码/rfid/cloudStorage/云存储/virtualLibrary/虚拟档案库/metadataTemplate/元数据模板/多级分类/分类配置 全部零命中(唯一 retentionDays 命中在 appdev/ops.vue 日志保留、唯一 barcode 命中在 display.ts 示例报表标签,均与档案无关)。活体核对:POST /api/oa/auth/login 取 token 后 GET http://127.0.0.1:8091/api/oa/archives 返回 24 条,[0] keys = id,category,title,sourceType,sourceId,fileName,fileType,fileSize,uploader,archiveDate,tags,summary,accessLevel,fileUrl,storedFileId,createdAt,确认无缺口所列字段。" }, { "area": "工程管理中心/资料室", "module": "2. 资料归档与接收", "verdict": "PARTIAL", "gap": "缺归档审核退回、归档编号自动生成+条码、批量导入/扫描、电子签名交接清单、多业务源自动归档、必填元数据。维持 PARTIAL。", "severity": "high", "evidence": "ArchiveController.create(L106-128) 直接 save,无资料室管理员审核/退回流程。无归档编号自动生成规则(分类+年度+流水号)、无条码打印。无批量导入文件夹/扫描仪集成。Handover 实体为通用交接,非归档交接清单+双方电子签名。自动归档仅 TriggerRuleEngine.chainArchiveProject(L346, ruleKey=project.toArchive)一条,只覆盖项目验收;无合同/财务报表/员工档案/验收报告自动归档链。在线归档申请缺来源部门/形成日期/归档范围/保密等级/保存期限等必填项校验(create 只校验 title 非空)。", "survives": true, "reNote": "缺口属实,PARTIAL 判定成立。工程管理中心/资料室的\"资料归档与接收\"链当前仅实现:基础档案 CRUD、单文件上传归档、分类/标签/权限分级、批注评论、以及\"项目验收→自动生成项目档案\"这一条联动链。该缺口列出的六项高级能力逐一核验后均不存在或仅半实现——逐项推翻失败:(1)归档审核退回:Archive 实体无 status/reviewer/审核态字段,create 直接落库无审批/退回流程;(2)归档编号自动生成+条码:全后端全前端无 archiveNo/编号/barcode/二维码字段,id 仅为数据库自增主键非格式化档号;(3)批量导入/扫描:前端 el-upload :limit=1 单文件,无批量端点无扫描;(4)电子签名交接清单:Handover 实体与控制器无签名字段,前端 signature/签名 零命中;(5)多业务源自动归档:TriggerRuleEngine 仅 chainArchiveProject 一条(项目→档案),合同/申报/会议办结均不自动归档,活体里多 sourceType 是 DataSeeder 静态种子非引擎产生;(6)必填元数据:create 仅校验 title,category/tags/accessLevel 走默认值不强制。证据充分,维持 PARTIAL。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java(实体仅 category/title/sourceType/fileName/tags/summary/accessLevel 等,无 status/审核/archiveNo/barcode/signature); web/ArchiveController.java:106-128(create 仅校验 title,余字段默认值,无审核/退回/编号/条码); web/HandoverController.java + domain/Handover.java(交接无任何 signature/电子签名字段); service/TriggerRuleEngine.java:346-369(chainArchiveProject 是唯一自动归档链,project→archive),:678-686(rule case 表内仅 project.toArchive 一条归档规则)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue:345(el-upload :limit=1 单文件)、上传表单仅 title/category/accessLevel/tags 无编号/条码/审核/签名; oa/api/archives.ts(Archive 接口无 archiveNo/barcode/status/signature)。活体 http://127.0.0.1:8091 GET /api/oa/archives 返回 24 条,字段 keys=[accessLevel,archiveDate,category,createdAt,fileName,fileSize,fileType,fileUrl,id,sourceId,sourceType,storedFileId,summary,tags,title,uploader]——无 status/archiveNo/barcode/reviewer/signature;sourceTypes={会议,合同,手动,申报,项目} 为种子静态数据非引擎自动归档。grep 全仓 barcode/条码/二维码/批量导入/电子签名/签名/归档编号/审核退回 在 archive 相关代码均零真实命中。" }, { "area": "工程管理中心/资料室", "module": "3. 电子文件管理", "verdict": "PARTIAL", "gap": "缺真版本控制、OCR与Archive入FTS、动态水印、哈希防篡改、PDF/A、批量操作。维持 PARTIAL。", "severity": "high", "evidence": "DocumentController.uploadMeta(L50) 恒置 f.setVersion(1),无任何递增/版本历史/变更说明/现行-作废标记实体(grep versionHistory/作废/现行 在 doc 域为空)。FullTextSearchService.reindexAll 索引 事项/公告/讨论/调查/纪要/合同/供应商/客户/公司/文档(DocFile)/协作文档,Archive 表本身未入索引;body 取文本字段非二进制内容,无 OCR。水印 library.vue L110 watermark=`湖南凯迪工程科技 · 受控文件 · ${uploader}` 为静态公司名+上传者,非动态查看者用户名/时间/IP;FilePreview.vue 仅 CSS ::after 叠加该静态串。无哈希存证、无 PDF/A 转换、无批量下载/转移/改元数据。", "survives": true, "reNote": "缺口属实,无法推翻。我尽力在前后端寻找这6项的真实实现,结论是全部不成立:\n\n1. 真版本控制 — 不存在。后端 DocFile.version 只是一个 Integer,上传时硬写为 1(DocumentController.java:50 f.setVersion(1)),DesignDoc.version 是一段自由文本字符串;没有版本表、没有 revision/history/回滚接口(grep 无任何 version/history 端点)。前端\"版本历史\"是纯客户端伪造:doccenter.vue:340-362 versionRows 的注释直说\"后端暂无版本接口,本地派生\",按 top=version 向下每版回退 7 天、上传人在当前人/\"系统迁移\"间交替编造出来的假历史。\n\n2. OCR — 完全没有。后端 pom.xml 无 tesseract/tess4j/任何 OCR 依赖,全代码 grep 无 ocr 实现。\n\n3. Archive 入 FTS — 没有。FullTextSearchService 只索引 11 类实体(事项/公告/讨论/调查/纪要/合同/供应商/客户/公司/文档/协作文档),未注入 ArchiveRepository、无 index(\"档案\"...) 调用(grep 计数 0)。档案库的检索只是 ArchiveController.list 里对内存列表做 title/tags/summary/fileName 的 contains 过滤,不是 FTS。\n\n4. 动态水印 — 假的。FileController.stream 返回的是 sf.getData() 原始字节,不做任何水印嵌入。前端 archive/library.vue 的 watermark 只是一个 CSS ::after 覆盖层(arc-preview__wm,--wm 变量),文件本体下载下来无水印。\n\n5. 哈希防篡改 — 不存在。全后端 grep 无 sha256/md5/MessageDigest/checksum/digest;StoredFile/Archive/DocFile 实体均无 hash 字段,上传/下载无完整性校验。\n\n6. PDF/A — 不存在。无 pdfbox/itext 等任何 PDF 库,无 PDF/A 转换/校验代码。\n\n7. 批量操作 — 不存在。Archive/Document/File/DesignDoc 控制器均无 batch/bulk/ids/deleteAll 端点,删除只有单条 DELETE /{id}。\n\n维持 PARTIAL 判定成立。", "reEvidence": "关键证据文件与行号:\n- oa-backend/src/main/java/com/kaidi/oa/web/DocumentController.java:50 — version 硬写为 1,无版本历史接口\n- oa-backend/src/main/java/com/kaidi/oa/domain/DocFile.java — version 仅 Integer 字段,无历史表\n- oa-backend/src/main/java/com/kaidi/oa/service/FullTextSearchService.java:126-197 — reindexAll 索引 11 类实体,无 Archive;构造函数未注入 ArchiveRepository\n- oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java — Archive 仅做内存 contains 过滤,无 FTS、无哈希/水印/版本字段\n- oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java — 实体无 version/hash/checksum 字段\n- oa-backend/src/main/java/com/kaidi/oa/web/FileController.java:117,141-148 — stream 直返原始字节 sf.getData(),无水印嵌入、无哈希校验\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/knowledge/doccenter.vue:340-362 — 注释明写\"后端暂无版本接口,本地派生\",版本历史为前端编造\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue:110,291 — 水印为 CSS 覆盖层(--wm 变量 + arc-preview__wm)\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/knowledge/libmgr.vue:254-272,519-533 — versionEnabled/watermark 仅为本地 settings 开关,无对应后端实现\n- pom.xml — 无 pdfbox/itext/tesseract/tess4j 等 PDF/OCR/水印库\n- grep 全后端 watermark|ocr|sha256|md5|MessageDigest|checksum|pdfa|batch — 在四个相关控制器中均无命中" }, { "area": "工程管理中心/资料室", "module": "4. 实体档案管理", "verdict": "MISSING", "gap": "实体档案四大块(入库上架/盒卷管理/温湿度监控/修复与销毁)零实现。维持 MISSING。", "severity": "high", "evidence": "全库 grep 上架/入库/档案盒/盒号/温湿度/破损/修复/销毁/destroy 在 archive 域无任何实体或控制器(销毁 grep 仅命中 FormInstanceController 的无关删除)。Archive 域无存储位置/盒卷/位置绑定字段;无温湿度监控报警;无破损修复记录与预警;无保存期满销毁鉴定流程(审批+拍照录像+电子删除+销毁证明)。", "survives": true, "reNote": "缺口属实,无法推翻。资料室\"实体档案管理\"四大块(入库上架/盒卷管理/温湿度监控/修复与销毁)在代码中零实现。彻查证据:(1) 关键词\"温湿度/温度/湿度\"在整个前端 ofbiz-framework/plugins/modern-ui/app/src 和后端 oa-backend 全库 grep 均为 0 命中——温湿度监控完全不存在。(2) \"盒卷/案卷/档案盒/盒号/卷号/货架\"在前后端均无任何命中——盒卷管理不存在。(3) \"档案修复/档案销毁/到期销毁/鉴定销毁\"无命中——修复与销毁不存在。(4) \"入库/上架/库位/库房\"的命中全部来自无关模块(制造工单已入库、情报采集入库、申报\"入库评价\"、mfg库位、payment入库单),没有一条是档案实体库位/上架。(5) dept 视图 kaidiDeptView.ts 把\"实体档案管理\"块标为 status:\"built\" 但 path 指向 /archive/library——这与同一资料室里其余 6 块共用同一条路径,是纯标签复用、并非独立实现。(6) 该路径对应的真实页面 src/oa/pages/archive/library.vue 全文(457行)只做电子档案库:分类树+文件列表+上传归档+在线预览(水印)+批注,没有任何实体/物理档案要素。(7) 后端 domain/Archive.java 字段仅 category/title/file*/uploader/tags/summary/accessLevel/storedFileId——纯电子文档元数据,无库位、盒卷、温湿度、修复销毁状态任何字段。结论:四大块均无后端实体、无 API、无专属页面、无字段,维持 MISSING 成立。", "reEvidence": "前端页面 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue (纯电子档案库,无实体档案功能);前端API ofbiz-framework/plugins/modern-ui/app/src/oa/api/archives.ts (字段仅数字文档元数据);后端实体 oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java (无库位/盒卷/温湿度/修复销毁字段);后端控制器 oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java;dept视图 ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts (\"实体档案管理\"块 status:built 但 path=/archive/library,与其余6块共用,纯标签复用);模块定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:257-262 (archive 中心仅 library/search/globalsearch/board/security 五页,无实体档案页)。全库 grep \"温湿度/温度/湿度/盒卷/案卷/档案修复/档案销毁\" 在前端与后端均 0 命中。" }, { "area": "工程管理中心/资料室", "module": "5. 借阅与利用管理", "verdict": "LOGIC_GAP", "gap": "仅一张审批表单,无借阅利用领域实体与逻辑。维持 LOGIC_GAP。", "severity": "high", "evidence": "后端 grep borrow/Borrow/Loan/借阅 命中为空——无任何借阅记录实体或控制器。前端 oa/engine/templates/src/src-archive-borrow.ts 仅是一张 FormTemplate(归档资料查询申请表,四级审批流定义),纯审批表单,不产生借出/归还/逾期/续借/预约任何领域逻辑。无电子借阅(防下载截图/加密带水印PDF限期失效/操作日志)、无实体借阅(扫码出库/预计归还/借出通知)、无归还检查、无逾期催还、无借阅次数/热门排行/部门统计。", "survives": true, "reNote": "缺口属实。工程管理中心/资料室的\"5. 借阅与利用管理\"在代码里只有一张审批表单+一张访问策略列表,没有任何借阅/利用领域实体,也没有借阅生命周期逻辑(申请→审批→借出→归还→逾期/利用台账)。彻查证据:(1) 唯一相关业务对象是前端表单模板 src-archive-borrow.ts,定义名为\"归档资料查询申请表\"的 FormTemplate(字段:申请人/部门/项目/申请查看资料/用途/查看方式 + 法务→结算会计→吴一梅→董事长 线性审批 flow),经 templates/index.ts 的 import.meta.glob 自动注册,仅跑通用 FormInstance/WorkflowService 审批引擎——正是描述里的\"仅一张审批表单\"。(2) archive/security.vue 是通用 MasterDataPage 访问策略列表,只有一个\"借阅审批(免审/需审批)\"配置列,不是借阅记录。(3) 后端无任何 Borrow/Loan/Lend/Utiliz/Circulat/Checkout 领域实体;Archive.java 实体只有编目字段(category/title/fileName/accessLevel/tags…),无借阅人/借出日期/应还日期/归还日期/状态/逾期。无对应 repo,ArchiveController 仅 list/get/create + 机密读门槛,无借出/归还端点。(4) 所有 归还/dueDate/returnDate 命中均为误报(任务到期/合同里程碑/QMS与安全整改日期)。(5) 全仓无 借阅记录/借阅台账/利用记录/资料利用 台账。维持 LOGIC_GAP。", "reEvidence": "关键证据文件:(A) ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-archive-borrow.ts —— 唯一的借阅相关物,是一个纯审批表单模板(id: 'src-archive-borrow', name: '归档资料查询申请表'),含 form 字段与线性 approval flow,无任何借出/归还/逾期/利用数据模型。(B) ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/security.vue —— 通用 MasterDataPage 访问策略列表,仅 '借阅审批' 配置列(免审/需审批),非借阅记录。(C) oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java —— 仅编目字段(category/title/fileName/fileSize/uploader/tags/accessLevel/fileUrl/storedFileId),无 borrower/borrowDate/dueDate/returnDate/status。(D) oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java(@RequestMapping(\"/api/oa/archives\")) —— 仅 GET 列表/GET{id}/POST,含机密读门槛,无借出/归还端点。(E) domain/ 与 repo/ 目录下无任何 Borrow/Loan/Lend/Utiliz/Circulat/Checkout 命名实体或仓库(ls grep 命中为空)。(F) 全仓 grep '归还|dueDate|returnDate|borrowDate' 命中全部为无关误报(DataSeeder 任务到期、ContractMilestone/QmsRecord/SafetyCheck 整改日期)。(G) 全仓 grep '借阅记录|借阅台账|借阅登记|利用记录|资料利用' 为空。" }, { "area": "工程管理中心/资料室", "module": "6. 保密与权限管理", "verdict": "PARTIAL", "gap": "缺五级密级策略矩阵、细粒度ACL、访问日志、脱敏遮挡。维持 PARTIAL。", "severity": "high", "evidence": "ArchiveController.isConfidential(L47-50) 仅 accessLevel.contains('密') 二元判断,canSeeConfidential 仅 ADMIN/APPROVER 粗粒度;无公开/内部/秘密/机密/绝密五级各自访问策略矩阵。无单档案/文件夹细粒度 ACL(可见/预览/下载/打印/修改/删除/授权,按部门/岗位/项目组动态授权)。list/get 读路径无任何访问日志写入(grep accessLog/访问日志 为空),查询/预览/下载/打印/修改/删除均不留痕,6个月留存无从谈起。无脱敏/遮挡。security.vue 为 settingList mock,不产生运行期权限执行。", "survives": true, "reNote": "尽力反驳后仍无法推翻:PARTIAL 成立。资料室/档案保密链确有\"部分\"实现,但缺口所列四项均未真正落地。(1) 五级密级策略矩阵:唯一候选是前端 security.vue,密级下拉只有4级(公开/内部/秘密/机密)而非五级(无绝密),且它只是落在通用 /biz/archive-security 键值表的展示型 CRUD 配置,不是被强制执行的策略矩阵;后端 ArchiveController 的真实管控是二值的——accessLevel.contains(\"密\")→仅 ADMIN/APPROVER 可读,没有分级矩阵。(2) 细粒度ACL:security.vue 有 grantee/access 列但纯属不强制的展示字段;后端只做粗粒度角色门槛(ADMIN/APPROVER),File/Folder/Document 控制器完全没有 ACL/授权对象逻辑,不存在按人/按角色/按记录的细粒度 ACL 执行。(3) 访问日志:不存在任何 AccessLog/查阅日志/借阅记录 实体,读机密档案(GET /archives/{id})不落任何审计行;现存日志仅 AutomationLog/DataSyncLog/SupervisionLog,均不记档案访问。(4) 脱敏遮挡:maskPhone/maskEmail 仅在 UserController 对用户目录 PII 生效(另一模块),档案保密路径不对字段内容做脱敏,而是整条剔除(列表)或 403(详情),无内容遮挡。结论:缺口属实。", "reEvidence": "后端 ArchiveController.java:46-59,77-95 —— isConfidential() 仅判断 accessLevel.contains(\"密\"),canSeeConfidential() 仅判 ADMIN/APPROVER 角色;列表剔除机密、详情 403,二值粗粒度,无五级矩阵/无 ACL/无日志/无脱敏。domain/Archive.java:50 accessLevel 为单一自由字符串字段(注释仅 公开/内部/机密 三态)。前端 src/oa/pages/archive/security.vue:5,17 —— settingListStore('archive-security') 走通用 biz 表的展示型 CRUD,密级 options 只有 ['公开','内部','秘密','机密'](4级),grantee/access/approval 列均不被后端强制执行;活体 GET /api/oa/settings/archive-security 返回 data:null(未持久化任何策略)。UserController.java:147-168 的 maskPhone/maskEmail 仅用于用户 PII,属 HR/用户目录而非资料室。domain 目录 grep log 仅命中 AutomationLog/DataSyncLog/SupervisionLog/Blog,无 AccessLog/查阅日志实体。File/Folder/DocumentController grep acl|grantee|密级|accessLog|mask 零命中。" }, { "area": "工程管理中心/资料室", "module": "7. 合规与审计支持", "verdict": "MISSING", "gap": "审计报告、电子签名时间戳、备份恢复、长期格式全部零实现。维持 MISSING。", "severity": "high", "evidence": "无档案管理审计报告(归档合规性/借阅记录/销毁记录/权限变更记录一键导出)——其依赖的借阅/销毁/权限/访问日志数据本身均不存在(见模块4/5/6)。grep signature/timestamp/电子签名/时间戳/backup/备份/灾难恢复/PDF-A 命中均为无关文件(DataSeeder/ReportController/AlertScheduler),无任一与档案归档电子签名或可信时间戳挂钩。无电子档案自动备份(本地+异地/云,增量/全量)与灾难恢复演练记录。无永久档案自动转 PDF/A/XML 及可读性定检。", "survives": true, "reNote": "缺口属实,无法推翻。链7\"合规与审计支持\"的四项(审计报告、电子签名时间戳、备份恢复、长期格式)在工程管理中心/资料室(档案知识中心)确实零实现。我作为对抗复验员尽力在前后端代码+活体端点中搜寻反证,但所有看似相关的命中均为误报。维持 MISSING。", "reEvidence": "代码与活体双重证实,四项均无实现:\n\n1) 审计报告生成:无任何审计报告生成端点。AuditProjectController.java 仅是 audit_projects 表的纯 CRUD(list/get/create/update/delete),无报告生成;ReportController/ReportDefinitionController 是通用报表中心,与档案室合规无关。grep '@(Get|Post)Mapping.*(audit-report|compliance|report.*audit)' 全后端零命中。活体 GET /api/oa/audit-projects/1/report -> 404、/api/oa/compliance/audit-report -> 404。\n\n2) 电子签名时间戳:无数字签名/可信时间戳实现。library.vue:298 的\"归档人:…日期:…\"只是预览页面叠加的水印文字标签(line125 注释\"叠加水印与权限标识\"),非密码学签名。grep digitalSign/trustedTimestamp/tsa 命中的 design*.vue 全因\"dESIGN\"含子串\"esign\"误报;sha256 仅出现在 PasswordUtil.java 做 PBKDF2 口令哈希,与文档签名无关。活体 GET /api/oa/archives/1/sign -> 404、/archives/1/timestamp -> 404。\n\n3) 备份恢复:无备份/恢复服务或端点。grep '@(Get|Post)Mapping.*(backup|restore)' 全后端零命中;DataSeeder 里\"数据备份\"只是制度文件正文文本。活体 /api/oa/archives/backup、/archives/restore 返回 400(被 GET /archives/{id} 路由捕获且\"backup\"无法解析为 Long id,证明无专用端点)。\n\n4) 长期格式:无 PDF/A 等长期归档格式转换。grep pdf/a、pdfa、archivalFormat、longTermArchive 无真实实现。活体 /api/oa/archives/export-pdfa -> 400(同样落到 {id} 路由,无专用端点)。\n\n档案知识中心(资料室)在 oaModules.ts:252-261 仅暴露 5 个子页:档案库 library / 知识检索 search / 全文检索 globalsearch / 归档统计 board / 档案安全与权限 security(后者只是 settingList 持久化的密级-借阅权限清单)。无一对应合规与审计四要素。\n\n涉及文件(绝对路径):\n/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java\n/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java\n/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java\n/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/common/PasswordUtil.java\n/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue\n/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/security.vue\n/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts" }, { "area": "工程管理中心/资料室", "module": "8. 与其它部门的接口要求", "verdict": "PARTIAL", "gap": "仅项目验收一条链,七大部门接口与统一归档/借阅入口缺失。维持 PARTIAL。", "severity": "med", "evidence": "TriggerRuleEngine 仅 chainArchiveProject(project.toArchive)一条自动归档链(项目验收)。无申报服务部/法务/工程监理/财务/人事/知产/质安等部门的自动归档或借阅合规审查接口(grep 其它 toArchive/chainArchive 链为空)。Contract/Voucher/PersonnelCert/Patent/SafetyCheck 等均无向 Archive 的归档对接。各业务部门统一的归档申请/借阅申请/借阅历史查询入口缺失(借阅入口仅一张表单模板,无后端)。", "survives": true, "reNote": "缺口属实,维持 PARTIAL。核心论断\"七大部门接口缺失、仅项目验收一条链\"在代码里被证实:TriggerRuleEngine.java 全文只有 chainArchiveProject 一条链写入档案库(项目验收办结→自动生成\"项目档案\",ruleKey=project.toArchive)。其余联动(付款 ruleCreatePayment、销项发票 ruleCreateReceivableInvoice、合同生效 chainCreateSealUse、立项 ruleCreateProject、用印 ruleMarkSealUsed、供应商准入 ruleAdmitSupplier)都不喂档案室。资料室 interfaces 列了 8 个部门(所有业务部门/申报服务部/法务风险部/工程监理部/财务部/人力资源部/知识产权部/质安部,见 requirements/kaidi-table-model.json:323-332),但只有\"项目→档案\"这 1 条做成了自动手递手接口,另外 7 类部门接口没有自动归档/接收链。后端无任何 Borrow/Loan 实体或控制器,\"借阅与利用管理\"无台账(无外借/归还状态跟踪)。\\n\\n需如实指出对抗中发现的两处\"缺失\"被夸大(但不足以推翻 PARTIAL 判定):1) 统一归档入口其实存在——library.vue 有可用的\"上传归档\"(uploadFile + createArchive 真写后端),且 ArchiveController.create 持久化;种子档案已跨 合同/申报/会议/制度/技术 多来源。2) 借阅入口其实存在——src-archive-borrow.ts\"归档资料查询申请表\"是经 import.meta.glob('./src/*.ts') 自动注册的活体审批模板(法务→结算会计→吴一梅→董事长 + 知会成本会计),archive/security.vue 还按档案类别配置\"借阅审批/授权对象\"。但这两者都只是\"录入/审批表单 + 手动上传\",并非 7 个部门的自动接口链,也无受控借阅台账,故核心缺口成立、判定仍为 PARTIAL。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:338-369 (唯一一条 chainArchiveProject 项目验收→档案,ruleKey project.toArchive 见 :684) | grep 全后端 new Archive()/archiveRepo.save 仅 3 处:TriggerRuleEngine(项目链)、ArchiveController.create(手动)、DataSeeder.archive(种子),无第二条部门联动 | 无 Borrow/Loan 实体或控制器(ls domain/ 与 web/ 只有 Archive*、无 borrow/loan)| requirements/kaidi-table-model.json:314-332 资料室 blocks 含\"资料归档与接收/借阅与利用管理\"、interfaces 列 8 部门 | requirements/Request.MD:47 资料室职责;:103 统一档案管理 | 反证(被夸大处):ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue:189-218 confirmUpload 真上传+createArchive 统一归档入口;src/oa/engine/templates/src/src-archive-borrow.ts 借阅审批模板经 src/oa/engine/templates/index.ts:158 glob 自动注册;src/oa/pages/archive/security.vue:5-22 借阅审批/授权对象配置" }, { "area": "工程管理中心/专利工法办", "module": "1. 工法全生命周期管理", "verdict": "MISSING", "gap": "工法办的核心实体——工法本身——完全缺失。无法立项/编号/编制/评审/申报/证书有效期/应用跟踪/版本化。需新建 ConstructionMethod 实体+生命周期状态机+专家评审流转+证书到期提醒+应用次数与版本管理。", "severity": "high", "evidence": "全域不存在任何工法(ConstructionMethod/工法)实体。domain/ 目录88个实体全列清单无任何工法相关类;grep '工法/gongfa/craftmethod' 后端仅命中 seed/DataSeeder.java:430 dept(\"专利工法办\",...) 这一个部门名字符串。无工法立项、无编号自动生成、无工法文本在线编制、无技术/安全/质量专家评审流转、无企业/省/国家级申报状态机、无8年有效期/到期前6个月提醒、无应用次数跟踪、无修订版本化。工法实体本身不存在,全部需求点无落地。", "survives": true, "reNote": "缺口属实。工法核心实体 ConstructionMethod 完全不存在:全仓库 grep \"ConstructionMethod/construction_method\" 零命中,无 domain/controller/repository/前端页面。后端 domain 目录 90 个实体里无任何 method/construct/gongfa 类;Patent.java 是知识产权资产实体(类型=发明专利/实用新型/外观设计/软著/商标,状态=申请中/已受理/已授权/已驳回/已转让),与工法的立项/编号/编制/专家评审/证书有效期/应用跟踪/版本化无关。前端 src/oa/pages/rd/ 下只有 patent.vue、achievement.vue、declaration.vue 等,无工法页。\"工法\"全仓仅 3 处出现且均为被动文字:kaidiDeptView.ts 里\"专利工法办\"部门的 9 个 block 虽标 status=built,但 path 全部复用已有页面(\"工法全生命周期管理\"→/rd/patent 知识产权页,其余→/rd/declaration、/rd/board、/rd/dtemplates、/rd/declsteps、/rd/expenses),没有任何专属工法页或实体;achievement.vue 里\"工法\"只是成果类型下拉的一个选项(扁平 settingList 仅 name/type/owner/regDate/status,无任何状态机/评审/证书/版本/应用次数字段);DataSeeder.java 里\"工法\"只出现一次,作为部门名\"专利工法办\"被 seed 到工程管理中心。无立项/编号/编制/专家评审流转/证书到期提醒/应用次数/版本管理的任何实现。", "reEvidence": "1) grep -rln \"ConstructionMethod|construction_method\" oa-backend/ ofbiz-framework/plugins/modern-ui/ → 零结果。2) ls domain/ 与 grep method|construct|gongfa → 无匹配类(只有 PatentRepository.java)。3) oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java:注释明确为\"知识产权/专利资产\",字段 patentNo/applicant/inventors/applyDate/status/feeDueDate/annualFee,无工法生命周期字段。4) ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts:专利工法办 block \"工法全生命周期管理\" path=/rd/patent pageLabel=知识产权,所有 9 个 block 均指向已有 rd 页面。5) ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/achievement.vue:17 \"工法\"仅为 achType 下拉选项;该页 store 为通用 settingListStore('rd-achievement') 无生命周期/评审/证书/版本字段。6) oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:'工法'仅出现 1 次,即 dept(\"专利工法办\", engMgmt.getId(), 4) 部门播种。" }, { "area": "工程管理中心/专利工法办", "module": "2. 专利管理(侧重工程领域)", "verdict": "PARTIAL", "gap": "专利仅扁平台账。缺交底书与新颖性评估环节、官方文件流转记录与中间文件上传、状态机与法律状态自动更新/国知局同步、IPC/技术领域标签、证书扫描件/授权公告日、许可/转让/质押运营信息。", "severity": "high", "evidence": "domain/Patent.java 为扁平登记表,字段仅 name/type/patentNo/applicant/inventors/rdProjectId/applyDate/status/feeDueDate/annualFee。web/PatentController.java status 为手填字符串(create 默认'申请中', update 直接 setStatus),非状态机;无技术交底书/新颖性创造性评估端点;无受理通知书/初审/实审/补正/意见陈述等官方中间文件上传字段;无法律状态自动更新/国知局同步(grep ipc/国知局/cnipa 零命中);无IPC分类/技术领域(地基/桥梁/隧道)标签字段;无证书扫描件/授权公告日字段;无许可/转让/质押运营信息('已转让'仅是 status 枚举值之一,非转让运营记录)。前端 patent.vue 是 MasterDataPage 扁平表。", "survives": true, "reNote": "尽力推翻失败,缺口属实。专利模块全栈仅为扁平台账CRUD:domain/Patent.java 实体只有 name/type/patentNo/applicant/inventors/rdProjectId/applyDate/status/feeDueDate/annualFee 共10个标量字段;PatentController 仅 list/get/create/update/delete 五个CRUD端点,update 对 status 只是 p.setStatus(req.status()) 直接覆盖,无任何状态机/合法状态校验。描述列出的缺项逐一核查均无实现:(1) 无交底书字段或上传(无 disclosureDoc/交底);(2) 无新颖性评估环节(全库 grep 新颖性/novelty 零命中);(3) 无官方文件流转记录与中间文件上传(无 DeclarationStep 式步骤实体绑定专利);(4) 无状态机/法律状态自动更新/国知局同步(status 为普通 String,无 legalStatus/CNIPA/国知局/自动迁移逻辑);(5) 无 IPC/技术领域标签字段;(6) 无证书扫描件/授权公告日(无 certificateScan/授权公告 字段);(7) 无许可/转让/质押运营信息实体或字段(grep 质押/pledge/许可/license/转让记录 在专利上下文零命中——'已转让'仅作为 status 字符串枚举值存在,无受让方/对价/日期的转让记录)。前端 patent.vue 仅复用通用 MasterDataPage,detail 面板只遍历8个 createFields,无上述任何扩展。其余引用 Patent 的控制器(Alert/Evidence/DataCenter/BusinessBi/DeclarationStep)全是只读聚合(计数/年费预警/证据采集),不构成上述功能。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java (字段28-48行,仅10标量字段,无交底/IPC/法律状态/证书/许可转让质押);oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java (仅CRUD,update第101行 p.setStatus 纯覆盖无状态机);oa-backend/src/main/java/com/kaidi/oa/repository/PatentRepository.java (仅 findByType/findByStatus);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/patent.vue (复用 MasterDataPage,8个 createFields,detail 仅遍历这些字段);全库 grep 交底书/新颖性/novelty/IPC/国知局/cnipa/法律状态/legalStatus/质押/pledge/许可/license/证书扫描/授权公告 在专利上下文零命中。" }, { "area": "工程管理中心/专利工法办", "module": "3. 工法与专利的协同挖掘", "verdict": "MISSING", "gap": "无技术主题双关联防重复申报模型,无在线查新与相似度检索,技术成果库仅2行mock键值表无结构化检索。", "severity": "high", "evidence": "无'同一技术主题同时关联工法+专利避免重复申报'的联动模型——工法实体不存在故无从关联;最接近的 web/EvidenceController.java /{id}/evidence-chain 是按 rdProject 聚合费用+专利+申报(链6 证据链),与协同挖掘无关。无在线查新/相似度检索(grep incopat/智慧芽 仅出现在 ipmonitor.vue 的 source 文本'智慧芽预警'mock里,非检索功能)。技术成果库=oa/pages/rd/achievement.vue 仅2条硬编码 mock,用 settingListStore('rd-achievement') 键值存储,search-keys 仅 name/achType/status 的前端字符串过滤,无关键词/项目类型/技术领域结构化检索。", "survives": true, "reNote": "缺口属实。尽力查证后无法推翻:三个子能力均无实现。(1) 无技术主题双关联防重复申报模型——源码中根本没有\"工法\"实体/控制器,\"工法\"只出现在部门种子名(专利工法办,DataSeeder.java:430)、achievement.vue 成果类型下拉选项、及 kaidiDeptView 描述配置里;Patent 实体(domain/Patent.java)只有 name/type/patentNo/applicant/inventors/rdProjectId 等扁平字段,无技术主题、无与工法的关联、无任何防重复/重复申报校验;源码里仅有的 dedup/防重复 代码全部无关(OaFlowDesigner 图边去重、survey 投票防重、store.ts dedupById)。(2) 无在线查新与相似度检索——存在 FullTextSearchService(SQLite FTS5,bm25/LIKE 关键词全文检索),但它只索引 11 类通用实体(事项/公告/讨论/调查/纪要/合同/供应商/客户/公司/文档/协作文档),既不索引 Patent 也不索引成果库,且是纯关键词检索;全源码无 similarity/levenshtein/jaccard/cosine/tfidf/相似度 任何相似度或查新工作流实现。(3) 技术成果库——achievement.vue 是通用 MasterDataPage,仅播种 2 行 mock 数据,无结构化技术检索能力。唯一与缺口描述措辞略有出入的细节:成果库实际经 /api/oa/biz/{type} 落到后端 biz_record 行级表(settingList.ts),并非字面意义的\"settings 键值表\",但这不改变实质——无结构化检索、无相似度、无协同挖掘字段。PatentController 全为基础 CRUD,无查新/相似/防重接口。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java(扁平字段,无技术主题/工法关联/防重); oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java(纯CRUD,无查新/相似/防重端点); oa-backend/src/main/java/com/kaidi/oa/repository/PatentRepository.java(仅 findByType/findByStatus); oa-backend/src/main/java/com/kaidi/oa/service/FullTextSearchService.java:126-194(reindexAll 仅索引11类,不含Patent/成果;266 bm25纯关键词,无相似度); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/achievement.vue:5(2行mock,通用MasterDataPage); ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts(经/api/oa/biz/{type}行级存储); web/目录无 Gongfa/Method/Achievement/Novelty/Similarity 控制器; 全源码无 similarity/levenshtein/jaccard/cosine/tfidf/相似度/查新 实现(仅无关 dedup: OaFlowDesigner.vue:529、community.ts:82投票防重、engine/store.ts:130 dedupById)。" }, { "area": "工程管理中心/专利工法办", "module": "4. 申报材料与文档管理", "verdict": "PARTIAL", "gap": "模板更新无自动通知;版本控制仅单字段无历史与锁定;无工法/专利交底书专属模板版本控制;申报包PDF合并/一键导出完全缺失。", "severity": "med", "evidence": "DeclarationTemplate.java/dtemplates.vue 是政府项目申报模板(program=高新/科技型中小企业),非工法申报书/专利交底书专属模板;version 是单个 String 字段(domain 第42行),前端列只展示一个版本号,无每次修改生成新版/历史可追溯/提交前锁定的机制;模板更新无'自动通知相关人员'(controller 无通知/消息推送调用)。'自动生成申报包(按顺序合并为一个PDF/一键导出)'完全缺失:grep mergepdf/申报包/pdfmerge/combinepdf 全后端零命中;declaration/dtemplates 页面仅文案,无打包逻辑。", "survives": true, "reNote": "缺口属实,四条子项全部坐实,无法推翻。1) 模板更新无自动通知:DeclarationTemplateController 只有 list/get/create 三个端点,连 PUT 更新都没有,更不触发任何 Message/Alert/通知;TriggerRuleEngine 只对 FormInstance 办结联动,从不监听模板变更。2) 版本控制仅单字段无历史无锁定:DeclarationTemplate 实体只有一个 String version 字段(活体实测值\"V2.0\"),没有 versionsJson/历史数组、没有 lock/locked/checkout 字段;唯一有版本历史的是 CollabDoc(versionsJson + GET /{id}/versions),那是协同文档、与申报模板/专利无关。3) 无工法/专利交底书专属模板版本控制:全后端 java 源码 grep \"工法/交底/disclosure/method statement\" 零命中;专利模块(Patent/patent.vue)只是知识产权台账(name/type/patentNo/applicant 等),无任何模板或交底书概念,活体探测 patents/1/disclosure、method-templates、gongfa-templates、disclosure-templates 全 404。4) 申报包PDF合并/一键导出完全缺失:后端 java 无 PDFBox/iText/PdfMerge/ZipOutputStream 任何合并或打包代码,pom 无任何 PDF 库依赖(pdf.js 仅前端用于预览渲染,非合并导出);活体探测 declaration-templates/1/versions、declaration-templates/1/export、declarations/1/export-pdf、declarations/1/package 全部 404。补充:该领域被声称为\"工程管理中心/专利工法办\",但代码里这些功能实际归在研发创新中心(crumb-root=\"研发创新中心\"),无论归属如何,所列四项能力均不存在。", "reEvidence": "DeclarationTemplate.java:42 仅 `private String version;`(无历史/锁字段)。DeclarationTemplateController.java 仅 list(L35)/get(L49)/create(L61),无 PUT、无通知/锁/版本端点。CollabDocController.java:178 GET /{id}/versions 与 CollabDoc.java:45 versionsJson 是协同文档专有,与申报/专利无关。Patent.java、patent.vue、PatentController.java 全无模板/交底书概念。grep \"工法|交底|disclosure|method statement\" 于 oa-backend/src/main/java 零命中。后端 java grep PDFBox/iText/PdfMerge/ZipOutputStream/PDDocument/PdfWriter 零命中;oa-backend/pom.xml 无 pdf 库。活体(127.0.0.1:8091)实证:declaration-templates 记录仅含单 version 字段;declaration-templates/1/versions、/1/export、declarations/1/export-pdf、declarations/1/package、patents/1/disclosure、method-templates、gongfa-templates、disclosure-templates 全部 HTTP 404。" }, { "area": "工程管理中心/专利工法办", "module": "5. 申报进度与预警", "verdict": "LOGIC_GAP", "gap": "申报进度无超期自动预警/停留天数/上报联动;无年度申报计划与完成率;关键节点无自动待办;官方法定时限无自动计算;年费提醒全靠人工录入手填。", "severity": "high", "evidence": "DeclarationStep.java dueDate 为手填 String、status 手改(controller create/update 直接 set),无超期自动预警/停留天数计算/超期上报负责人的联动;board.vue(创新看板)是只读统计(按 stage/type/status 计数),无停留天数/超期预警/责任部门上报。无年度申报计划(数量/类型/责任部门/预算+完成率)实体——declaration.vue 的'申报计划'只是 program 字段列标签。关键节点(交底书/内部评审/官方答复)无自动待办推送(TriggerRuleEngine grep patent/declaration 零命中)。官方法定时限(实审3年/补正2个月)无自动计算。年费提醒:iprenewal.vue warn 字段手选'正常/即将到期/已逾期',Patent.feeDueDate 手填,未从授权公告日+缴费周期自动推算。", "survives": true, "reNote": "尽力推翻后,缺口主体仍成立。这是一条复合缺口(5子项),我逐项核查:\n\n【子项5「年费提醒全靠人工录入手填」—— 部分可推翻,但不足以翻案】后端 AlertController.aggregate() 确实自动从 Patent.feeDueDate 计算「专利年费」预警(一年内到期即报),并由 AlertScheduler @Scheduled(fixedRate=3600000) 每小时跑。活体 /api/oa/alerts 实测自动产出 6 条专利年费预警(如「一种农村供水智能调度方法及系统 年费临近 应缴日 2026-09-30」),并非纯手工。所以「年费提醒」这一点对后端 Patent 实体并不成立。但前端 rd/iprenewal.vue 是 settingListStore 纯 mock、warn 字段靠手选,且这只是 5 子项里最小的一项。\n\n【子项1-4 —— 确属缺口,证据扎实】\n1) 申报进度无超期自动预警/停留天数/上报联动:AlertController 与 AlertScheduler 全文 grep 均不引用 Declaration/DeclarationStep(grep 0 命中);DeclarationStep.dueDate(计划完成)/Declaration.deadline 是自由文本,从未与今天比对,无 overtime/停留天数/notify 上报。对比 FormInstance 走的是 scanOvertimeInstances() 的成熟超时机制——申报步骤完全没接入。\n2) 无年度申报计划与完成率:DeclarationStep 有 status(待办/进行中/已完成) 但全后端无任何 completion/完成率聚合,cockpit.vue 只显示 declarationCount 计数;无「年度申报计划」实体或字段。\n3) 关键节点无自动待办:DeclarationStepController 仅 list/get/create + auto-collect(一次性把「数据采集」步标已完成的取数助手),不存在按节点/法定时限批量生成待办的逻辑。\n4) 官方法定时限无自动计算:Declaration.deadline、DeclarationStep.dueDate、DeclarationTemplate.requiredMaterials/autoCheckRules 全是手填字符串;无任何「申报日+法定窗口→截止日」的推算。\n\n结论:判定 LOGIC_GAP 针对的是「申报进度与预警」整体。其定义性的 4 项(进度超期预警/停留/上报、年度计划与完成率、关键节点自动待办、法定时限自动算)均确未实现;唯一带自动化的「专利年费」属另一实体的旁支且前端仍是 mock。即便最大化对抗,也无法据此推翻整条缺口,故 real=true。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/DeclarationController.java(纯CRUD,deadline自由文本), web/DeclarationStepController.java(list/get/create+auto-collect,dueDate从不比对今天), web/DeclarationTemplateController.java(静态模板库,无法定时限推算), domain/Declaration.java(deadline:String), domain/DeclarationStep.java(dueDate:String,status仅待办/进行中/已完成); 关键反证: web/AlertController.java 与 task/AlertScheduler.java grep \"Declaration\" 0命中(申报未接入预警引擎); 部分自动化(年费): AlertController.java L115-127 自动算专利年费预警, AlertScheduler.java @Scheduled每小时跑; 活体: GET /api/oa/alerts 实测自动产出6条「专利年费」(无任何「申报进度/年度完成率」类预警). 前端: oa/pages/rd/declsteps.vue(申报进度=MasterDataPage静态表,无超期/停留列), oa/pages/rd/declaration.vue(申报CRUD), oa/pages/rd/iprenewal.vue(settingListStore纯mock,warn手选), oa/pages/report/cockpit.vue L148(仅declarationCount计数,无完成率), oa/api/governance.ts/rd.ts(无stats/completion/overdue接口)." }, { "area": "工程管理中心/专利工法办", "module": "6. 费用与预算管理", "verdict": "LOGIC_GAP", "gap": "费用未按专利/工法逐项归集且缺申请费/代理费/年费等类型;无分类型预算与自动扣减/超预算预警;政府资助仅mock无窗口期与财务到账;ROI 无计算。", "severity": "med", "evidence": "RdExpense.java 按 rdProjectId(研发项目)归集,category 枚举为 人工费/直接投入/折旧费用/无形资产摊销/设计费/其他(研发会计口径),无申请费/代理费/年费/实审费/查新费/奖励费类型,且非按专利/工法维度。无年度专利/工法分类型预算设定与费用发生自动扣减/超预算预警的联动(Patent/RdExpense 无预算关联)。政府资助=ipgov.vue 仅2条 settingListStore mock 合规关联表,无窗口期提醒/到账关联财务。成本效益ROI(投入vs应用项目效益)无任何计算端点。", "survives": true, "reNote": "缺口属实。专利工法办的\"费用与预算管理\"链在代码中确实未实现题述四要素。(1) 费用未按专利/工法逐项归集且缺类型:domain/Patent.java 仅有单一 annualFee(年费)+feeDueDate 两个费用字段,PatentController 的 CreatePatentRequest 也只接收 annualFee,根本没有 申请费/代理费/官费 等费用类型,更没有\"逐项明细\"子表(无 PatentFee/PatentExpense 实体或控制器);前端 patent.vue 连 annualFee 都没在表单暴露,iprenewal.vue/ipgov.vue 都是 settingListStore mock 持久化,iprenewal 仅一个\"年费金额\"字段、ipgov 只做合规关联,均无分类型费用归集。(2) 无分类型预算与自动扣减/超预算预警:Budget 实体的 element 枚举是 人工费/材料费/机械费/差旅费/管理费/外协费/分包费,不含专利费用类型,且与专利零关联(无 patentId);BudgetController.create 仅在创建时一次性比较 actual>budget 打\"超支\"标签,没有任何\"费用发生→自动扣减预算→实时超预算预警\"链路,TriggerRuleEngine 内无 budget/扣减相关规则。(3) 政府资助仅 mock 无窗口期与财务到账:Policy 实体只有 deadline 单一字段(无 开放/截止 双窗口期),PolicyApplication 的\"已拨付\"仅把 grantedAmount 回填为 appliedAmount,是纯状态机时间线,未对接 Payment/BankAccount/Voucher 任何财务到账实体。(4) ROI 无计算:全后端 grep 投资回报/收益率/净现值/回收期/payback/ROI 均零命中,前端 src 内 ROI/投入产出/收益率 也零命中。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java(仅 annualFee+feeDueDate,无费用类型/明细); oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java(CreatePatentRequest 只含 annualFee); oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java(element 枚举无专利费用类型,无 patentId 关联); oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java(仅创建时打超支标签,无自动扣减/实时预警); oa-backend/src/main/java/com/kaidi/oa/domain/Policy.java(仅 deadline 单字段,无开放/截止窗口期); oa-backend/src/main/java/com/kaidi/oa/web/PolicyApplicationController.java(已拨付仅状态机回填 grantedAmount,无 Payment/到账对接); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java(无 budget/扣减规则); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/iprenewal.vue(settingListStore mock,仅\"年费金额\"); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/ipgov.vue(settingListStore mock,仅合规关联); grep 全库 投资回报/收益率/净现值/payback/ROI = 零命中(后端与前端 src 均无ROI计算)。" }, { "area": "工程管理中心/专利工法办", "module": "7. 奖励与考核管理", "verdict": "MISSING", "gap": "无奖励配置与自动计算;发明人仅逗号串无排序/贡献比例;无授权后自动触发奖励→审批→财务联动;无专利/工法KPI统计与考核报表。", "severity": "high", "evidence": "grep reward/奖励/bonus 全后端零命中——无奖励制度配置、无按专利类型/工法级别配置金额、无自动计算应发奖励。Patent.inventors 是单个 String(逗号字符串),无发明人排序/贡献比例分配字段。专利授权/工法批准后自动触发奖励申请→审批→推送财务的联动缺失:TriggerRuleEngine.java grep patent/declaration/reward/奖励/工法 全部零命中。KPI 仅 AppMonitoringController 注释里的表单模板度量,与专利/工法绩效无关;无申请量/授权量/应用量纳入部门个人KPI的自动统计与考核报表。", "survives": true, "reNote": "缺口属实。我尽力推翻但无法成立——专利/工法的\"奖励与考核管理\"在前后端均无实现,仅把该需求块映射到一个无关的聚合看板充数。具体: (1) 无奖励配置与自动计算: Patent 实体(domain/Patent.java)字段仅 name/type/patentNo/applicant/inventors/rdProjectId/applyDate/status/feeDueDate/annualFee,无任何奖励金额/奖励规则/计算公式字段;全后端无 reward/考核/绩效相关实体或控制器(关键词搜索仅命中 Favorite 种子串、AppMonitoring 的泛化 KPI、WorkPlan 注释里的\"绩效\",均与专利奖励无关)。 (2) 发明人确为逗号串无排序/贡献比例: `private String inventors;` 单一自由文本;contributionRatio/贡献比例/贡献率/inventorOrder/firstInventor 全库零命中。 (3) 无授权后自动触发奖励→审批→财务联动: PatentController.update 设置 status(含\"已授权\")时无任何副作用;TriggerRuleEngine.java 中无以专利授权为触发点的规则(patent/授权/奖励 在该引擎零命中),无奖励审批流、无财务记账联动。 (4) 无专利/工法 KPI 统计与考核报表: kaidiDeptView.ts 中\"奖励与考核管理\"块 status:\"built\" 但 path 指向 /rd/board(创新看板),而 board.vue 仅是研发项目按阶段/知产按类型/申报资助合计/链6证据抽屉的通用聚合看板,无任何奖励、贡献度评分或考核报表逻辑——属于把无关看板换皮顶替。\"工法\"全程无生命周期/KPI 逻辑,仅作为 achievement.vue 下拉选项值和\"专利工法办\"部门名出现。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java(第36行 private String inventors; 无奖励/贡献字段); oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java(update 仅 setStatus 无奖励/审批/财务联动副作用); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java(grep patent/授权/奖励 零命中); ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts(专利工法办\"奖励与考核管理\" status:\"built\" path:\"/rd/board\" pageLabel:\"创新看板\"——换皮映射); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/board.vue(纯聚合看板:byStage/byType/fundTotal/chain 证据抽屉,无奖励/贡献/考核逻辑); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/patent.vue(列表仅 inventors 自由文本列,无排序/比例/奖励列); 全库 grep contributionRatio/贡献比例/inventorOrder 零命中。" }, { "area": "工程管理中心/专利工法办", "module": "8. 成果应用与推广", "verdict": "MISSING", "gap": "项目应用登记、应用效益汇总统计、推广计划与活动记录、知识共享门户四项全缺。", "severity": "med", "evidence": "无成果应用登记端点(无 Patent/工法 与项目的应用关联实体);无应用效益按工法/专利汇总统计(累计节约成本/缩短工期/额外产值无字段);无年度推广计划与活动记录实体;无知识共享门户(无对外只读查询门户/在线提问交流)。achievement.vue status 仅'已登记/已转化/已奖励'三态 mock,无应用登记与效益汇总逻辑。四项子功能均无实现。", "survives": true, "reNote": "缺口属实。专利工法办「8. 成果应用与推广」四项(项目应用登记/应用效益汇总统计/推广计划与活动记录/知识共享门户)确实全缺,无任何专用实现。该链在 kaidiDeptView.ts 中虽标记 status:\"built\",但只是被\"重映射\"到通用研发看板 /rd/board(创新看板),并非真实现——这是典型的占位式映射,掩盖了缺口。rd/board.vue 仅展示研发项目数/知产构成/申报资助/研发→专利→申报证据链(链6),与本链四项功能毫无关系。后端仅有 Patent 实体+PatentController(纯知产登记:申请中/已授权/转让),无应用登记、效益汇总、推广活动、知识门户的实体/控制器/接口。前端按四项关键词(应用登记/应用效益/效益汇总/推广计划/活动记录/知识共享/共享门户)精确 grep 全空。活体 API 探测相关端点全部 404/400。", "reEvidence": "1) 重映射证据:ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts 中 \"专利工法办\" 的 blocks 含 {\"name\":\"成果应用与推广\",\"status\":\"built\",\"path\":\"/rd/board\",\"pageLabel\":\"创新看板\"} —— 指向通用研发看板而非专用页。2) 目标页无四项功能:ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/board.vue 仅做 listRdProjects/listPatents/listDeclarations 统计与链6证据链归集(getEvidenceChain),无应用登记/效益汇总/推广活动/知识门户任何 UI 或逻辑。3) 前端全局 grep \"应用登记|应用效益|效益汇总|推广计划|活动记录|知识共享|共享门户|成果应用|成果推广\" 排除市场推广噪声后零命中(成果应用与推广 仅出现在 kaidiDeptView 这一行 block 名)。4) 后端:domain/ 下与本链相关实体仅 Patent.java;PatentController.java(/api/oa/patents) 字段为 name/type/patentNo/applicant/status(申请中/已授权/已转让)/annualFee 等纯知产登记,无应用/效益/推广/共享概念;domain 目录 grep achiev|promot|share|knowledge|portal|工法 仅 Patent.java。5) 活体(127.0.0.1:8091,admin 登录成功 token 获取):探测 patent-applications/achievement-applications/promotions/knowledge-portal/achievements%2Fpromotion 全 404,patents/applications、patents/promotion 因路径变量解析返回 400,均无专用端点。" }, { "area": "工程管理中心/专利工法办", "module": "9. 合规与审计追溯", "verdict": "LOGIC_GAP", "gap": "专利/工法关键操作无专属操作日志(操作人/时间/IP);核心数据无防篡改;证据链未与实体绑定;无按年度/类型的审计导出。", "severity": "med", "evidence": "PatentController/DeclarationController 无专属操作日志:grep operationLog/operatorIp/getRemoteAddr/审计日志/操作日志 在两个控制器零命中,立项/评审/申报/修改/授权操作无操作人/时间/IP 留痕。核心数据(授权信息/年费记录)无不可篡改保证(Patent 普通可 update/delete)。工法评审意见/申报材料提交/年费凭证的电子证据链未与专利/工法实体绑定(工法实体本身不存在)。AuditProjectController 是通用审计(财务/工程/合规审计),非专利/工法清单导出;无按年度/类型导出专利清单/费用明细/应用统计的审计导出能力。", "survives": true, "reNote": "缺口属实,尽力推翻失败。\"专利工法办\"在系统中仅作为部门种子条目存在(DataSeeder.java:430 `dept(\"专利工法办\", engMgmt.getId(), 4)`),没有任何实体/控制器承载它;\"工法/method-statement\"全库零实体。唯一相关的 Patent 实体属于研发创新中心(rd),是纯 CRUD。逐条核对该缺口的四个子项:(1) 专利/工法关键操作无专属操作日志——PatentController 的 create/update/delete 不写任何日志、不注入任何 log/audit repo、不接 HttpServletRequest,无操作人/时间/IP 留痕(仅有 createdAt 字段,update/delete 连这都不记);全局也无审计 @Aspect / 审计 HandlerInterceptor / OncePerRequestFilter(AuthInterceptor 只做 default-deny 访问控制,从不落库)。系统里唯一的\"留痕\"是 AutomationLog,但它只记录审批办结后的工作流下游联动(合同/付款/项目),且其字段无 user/operator/ip/actor(核对 domain/AutomationLog.java 确认无这些字段),与专利/工法操作毫无关系。(2) 核心数据无防篡改——Patent 实体无 hash/sha256/signature/防篡改字段,全库无防篡改机制。(3) 证据链未与实体绑定——EvidenceController 的 /rd-projects/{id}/evidence-chain 只是把 RdProject+费用+专利+申报临时聚合返回,不落库、不签名、不与专利操作实体绑定,纯只读拼装。(4) 无按年度/类型审计导出——PatentController/EvidenceController 无任何 export/导出/byYear/annual 端点;前端 audit 目录仅 economic/fraud/projects 三页,无专利/工法操作日志页或年度/类型审计导出。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java(全文 create/update/delete 无任何日志/IP/操作人捕获,无 log 仓注入); oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java(仅 createdAt,无 hash/签名/防篡改/操作人字段); oa-backend/src/main/java/com/kaidi/oa/domain/AutomationLog.java(无 user/operator/ip 字段,仅工作流下游联动留痕); oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java:54(evidence-chain 纯只读聚合,不落库不签名不绑定); oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:430(专利工法办仅为部门种子,无配套实体); grep 全库:无 @Aspect/审计 HandlerInterceptor、无 工法/method-statement 实体、PatentController/EvidenceController 无 export/byYear 端点" }, { "area": "工程管理中心/专利工法办", "module": "10. 与其他部门的接口要求", "verdict": "MISSING", "gap": "七部门接口与授权后自动联动(财务/人资/档案)全缺;侵权监控仅mock表无法务流转。", "severity": "high", "evidence": "七类部门接口(项目部/技术中心/财务部/申报服务部/人资部/资料室/法务部)的数据交底、证明流转、奖励与资助财务回流、自动归档、侵权监控均无实现。专利/工法授权后无任何自动联动:TriggerRuleEngine.java grep patent/declaration 零命中,无授权→财务/人资/档案的下游自动触发。侵权监控=ipmonitor.vue 仅2条 settingListStore mock 手填表,非真实监控也无法务接口。", "survives": true, "reNote": "缺口属实。专利/工法办的「与其他部门接口」与授权后自动联动(财务/人资/档案)确实全缺,侵权监控仅为前端 mock 列表、无任何法务流转。穷尽 grep/读码后无法找到实现:1) PatentController 仅是裸 CRUD,无任何 status 变更触发、无事件、无下游写入;专利从「申请中」置「已授权」不触发任何动作。2) 唯一的「办结后自动联动」引擎 TriggerRuleEngine 中无任何专利/知识产权规则——其规则矩阵只命中 付款/用印/收款/验收/供应商/合同/立项;grep 'patent|专利' 对整个 service/ 目录零命中,故根本不存在「授权后→财务付年费/奖励、→人资发明人激励、→档案归档专利证书」的联动。3) 全仓「已授权/授权后」引用只出现在种子数据、只读 BI 统计(BusinessBiController.rdStat 仅 grantedPatents++)和申报自动采集计数(DeclarationStepController 仅 patentCount++),均为读,无任何下游实体创建。4) 侵权监控 rd/ipmonitor.vue 是纯 settingListStore('rd-ipmonitor', mock)——键值表,无后端实体、无控制器、无法务流转;后端 web/ 目录下不存在 Legal/Infringement/侵权 控制器。5) 法务侧 legal/litigation.vue、legal/compliance.vue 同样是独立 settingListStore mock,与专利/侵权无任何关联,故侵权记录在概念上也无处可流转到法务流程。", "reEvidence": "PatentController.java(oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java): 纯CRUD,update() 第86-105行只 setStatus 无任何触发/联动调用。TriggerRuleEngine.java(.../service/TriggerRuleEngine.java) fire() 第94-139行规则矩阵无专利分支;grep 'patent|Patent|专利|侵权' 对 service/ 目录返回空。ipmonitor.vue(ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/ipmonitor.vue) 第5行 settingListStore('rd-ipmonitor', [...mock]) 纯前端mock、无 api 调用。后端 web/ 目录 grep 无 Legal/Infringement 控制器(仅有 Contract* 系列与 AppMonitoringController)。'已授权' 全仓命中仅 DataSeeder 种子、BusinessBiController.java:226 只读计数、DeclarationStepController.java:115-119 只读计数,皆无下游写入。legal/litigation.vue 与 legal/compliance.vue 均为 settingListStore mock,与 patent 无关联。" }, { "area": "工程管理中心/成本控制部", "module": "1. 成本基础数据管理", "verdict": "PARTIAL", "gap": "标准BOM/标准工艺路线/标准费率结构化维护与真版本管理缺失;EBOM/MBOM/损耗率/替代料字段缺失;价格库无采购价自动同步;中标清单 xlsx 导入比对+超支原因可执行性判断+利润亏损分析+收支对比建议缺失;已签合同人材机价自动入库参考缺失。", "severity": "high", "evidence": "StandardCost.java 字段仅 materialCost/laborCost/overheadCost/actualCost/totalStandard/variance/period(String)/costCenter,无标准BOM(用量定额)/标准工艺路线(工时定额)/标准费率结构化字段,period 为自由文本非版本实体(无 versionStatus/年度版/季度版枚举)。StandardCostController recompute 仅 料+工+费=标准、实际-标准=差异,无版本管理。BomItem.java 仅 unitUsage,无 EBOM/MBOM 类型、无损耗率、无替代料字段。PriceItemController.create/list 纯手填+查询,无从采购模块自动同步最新采购价(grep syncPrice/同步采购价 0 命中,且无 PurchaseOrder 实体)。BomAnalysisController.costCompare 仅按 projectName 算 bidCost/actualCost/overrun/overItems,无 xlsx 导入、无超支原因可执行判断、无利润亏损项分析、无收支价格对比建议。已签合同人材机价格无自动入库联动。", "survives": true, "reNote": "尝试推翻失败——缺口属实(PARTIAL成立)。现有实现仅为\"框架级手填\":① 标准BOM/工艺路线/标准费率结构化+版本管理:domain目录只有BomItem/StandardCost/PriceItem/CostCenter/BomSignoff,无工艺路线(routing)实体、无标准费率实体;全项目grep bomVersion/costVersion/revision/versionHistory 零命中,无任何真版本管理。BomItem本质是\"项目投标量vs实际量比对行\"(bidQty/actualQty/unitPrice),不是可复用的标准BOM。② EBOM/MBOM/损耗率/替代料字段:BomItem全部字段为 projectId/projectName/parentId/name/unit/bidQty/actualQty/unitPrice/unitUsage/category/status/signStatus/createdAt,无EBOM/MBOM分型、无损耗率(scrapRate)、无替代料(substitute);前端bom.vue:563自己白纸黑字承认\"未含损耗率/替代料/提前期/现有库存净算\"。③ 价格库采购价自动同步:PriceItemController只有list/get/create纯手工录入,无任何从采购/PO/合同回写PriceItem的逻辑(ContractController/PaymentController/SupplierController grep PriceItem 零命中)。④ 中标清单xlsx导入比对:全项目无POI/EasyExcel/xlsx依赖,bom/cost/price控制器无MultipartFile、无import端点;costCompare只对已手工POST录入的数据做投标vs实际超支计算。⑤ 超支原因可执行性判断+利润亏损分析+收支对比建议:BomAnalysisController.costCompare仅算 overrun=actualCost-bidCost 加超支/受控状态标,grep 利润亏损/盈亏/收支对比/超支原因 全项目零命中。⑥ 已签合同人材机价自动入库参考:无任何把已签合同价写入PriceItem的代码路径。六条子项全部确认未实现,缺口成立。", "reEvidence": "后端domain目录: BomItem.java/StandardCost.java/PriceItem.java/CostCenter.java/BomSignoff.java(无routing/rate实体)。BomItem.java:25-61字段清单(无EBOM/MBOM/损耗/替代)。PriceItemController.java:36-78仅list/get/create无同步。BomAnalysisController.java:45-89仅算overrun无盈亏/超支原因。前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/bom.vue:563 明文\"未含损耗率/替代料/提前期/现有库存净算\"。pricelib.vue(MasterDataPage仅create无导入)。costcompare.vue:38仅展示overrun。grep全项目: bomVersion/revision/versionHistory=0命中; 利润亏损/盈亏/收支对比/超支原因=0命中; POI/EasyExcel/xlsx依赖=0; bom/cost/price控制器MultipartFile=0、import端点=0; ContractController PriceItem引用=0。" }, { "area": "工程管理中心/成本控制部", "module": "2. 合同管理模块", "verdict": "LOGIC_GAP", "gap": "合同预审硬卡(附件类型/附件日期晚于签订日期/预审锁定退回才改)缺失;税率自动带出不含税/税额与金额大写校验缺失;甲乙方信息自动带入缺失;合同执行成本归集/结算汇总报告/成本档案趋势/合同预警全缺;原合同金额自动累加减无计算。", "severity": "high", "evidence": "ContractTemplateController 仅 list/get/create(name/contractType/applicableSubject/bodyTemplate/requiredClauses/version/status),ContractTemplate.java 无附件类型/日期校验字段,无'附件日期晚于签订日期不可提交'、无'预审提交后锁定只能退回才改'逻辑。Invoice.java 无 taxRate 字段,InvoiceController total=amount+taxAmount 由服务端直接相加(taxAmount 客户端手填),不据税率自动带出不含税/税额,无金额中文大写校验(grep 大写/amountInWords 0 命中)。ContractController.create 无甲方/乙方信息自动回填逻辑(partyA/partyB 纯手传)。无合同执行成本归集(采购订单/入库/发票/运费自动计入)、无结算汇总+成本分析报告+结算锁定、无供应商/客户成本档案趋势、无合同预警推送成控部。补充协议 parentId 存在(createSub),但原合同金额自动累加减无:createSub 仅校验分包累计不超总包,ContractChange 变更回写是直接置 amountAfter 非累加。", "survives": true, "reNote": "尽力推翻后仍确认缺口属实。合同模块(前端\"合同中心\"仅 3 个列表页: 台账/模板库/变更与终止; 后端 Contract/ContractChange/ContractTemplate/ContractMilestone)逐条核对,gap 五项均未实现:\n\n1) 合同预审硬卡(附件类型/附件日期晚于签订日期/预审锁定退回才改): \"预审/preReview/preAudit/锁定退回/预审锁定\" 在前端和后端均 0 命中。表单校验引擎 OaFormRenderer.vue validate() 只做必填空判定(164-180行),无附件类型校验、无附件日期 vs 签订日期比较、无预审锁定退回逻辑。\n\n2) 税率自动带出不含税/税额与金额大写校验: 税率/不含税/税额字段只存在于 Invoice/Payment 模板,3 个合同模板(hq-contract.ts / src-cost-contract.ts / src-group-small-contract.ts)全部无税率字段。\"大写/amountInWords\" 后端 0 命中,前端 3 处命中均在付款模板而非合同。无税率自动带出、无金额大写一致性校验。\n\n3) 甲乙方信息自动带入: 唯一的\"自动带出\"在 payment/byinvoice.vue 和 sealcenter/register.vue,与合同甲乙方无关。合同新建表单(masterdata/contract.vue createFields) partyA/partyB 为纯手填; 唯一的甲乙方推导是 createSub 派生分包时的甲乙方倒换,不是从主数据自动带入。\n\n4) 合同执行成本归集/结算汇总报告/成本档案趋势/合同预警: \"成本归集/结算汇总/成本档案/合同预警/执行成本\" 前后端全 0 命中,合同中心无任何相关页面或接口。\n\n5) 原合同金额自动累加减无计算: ContractChangeController.java 第113-114行,变更+已生效时执行 contract.setAmount(c.getAmountAfter())——直接用 amountAfter 整值覆盖,而非\"原额±变更额\"的累加减计算。\"无计算\"属实。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/ContractController.java (无税率/预审/大写/成本归集字段与逻辑), ContractChangeController.java:113-114 (setAmount(amountAfter) 整值覆盖非累加减), domain/Contract.java (仅 code/name/type/partyA/partyB/amount/.../paidAmount/invoicedAmount 字段, 无 taxRate/amountInWords/preReview)。\n前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/contract.vue (partyA/partyB 纯手填, 无税率/大写/预审), src/oa/pages/contract/{ledger,templates,changes}.vue (合同中心仅此3页), src/oa/engine/OaFormRenderer.vue:164-180 (validate 仅必填校验), src/oa/engine/templates/hq-contract.ts、src/oa/engine/templates/src/src-cost-contract.ts、src-group-small-contract.ts (均无税率/不含税/税额/大写), src/data/oaModules.ts:217-224 (contract 模块 children 仅 ledger/templates/changes)。\n全仓 grep: \"预审\"=0命中(前后端); \"成本归集/结算汇总/成本档案/合同预警/执行成本\"=0命中; \"大写/amountInWords\" 后端=0; 合同模板税率字段=0。" }, { "area": "工程管理中心/成本控制部", "module": "3. 物料清单(BOM)差异自动核算", "verdict": "MISSING", "gap": "多维差异分解模型、生产工单实际数据自动采集对比、差异原因标签库、阈值灯预警、单据下钻追溯、月末差异分摊+会计分录、差异触发标准成本修订均缺失。", "severity": "high", "evidence": "grep priceVariance/qtyVariance/usageVariance/价格差异/用量差异 0 命中,多维差异分解模型(用量/价格/损耗/替代料/工艺路线差异)完全无实现。BomAnalysisController 仅工程量 bid vs actual 量价比对,无生产工单实际投料/实际采购价/实际工时采集对比(WorkOrder 不参与差异)。无差异原因在线标记+原因标签库、无红黄绿灯阈值预警、无下钻追溯至工单/采购单/领料单/入库单、无月末差异按标准成本比例分摊至库存与销售成本生成会计分录、无差异过大触发标准成本修订。StandardCost.variance 仅单一 actual-standard 一段差,非多维分解。", "survives": true, "reNote": "未能推翻该缺口;判定 MISSING 成立。后端确实存在 BOM/标准成本的\"差异\"基础功能,但全部为简单计算差额,缺口列举的 7 项进阶能力逐条对照后均不成立。逐项核验:(1) 多维差异分解——仅有料/工/费三段拆分(StandardCost.materialCost/laborCost/overheadCost,recompute: variance=actualCost−totalStandard)+成本中心责任树多级上卷(rollup-tree),没有量差/价差等多维分解,最多算\"部分存在\";(2) 生产工单实际数据自动采集对比——不存在,actualCost 为手填(StandardCostController create/update 里 Money.of(req.actualCost())),StandardCostController 完全不引用 WorkOrder/workOrderRepo,WorkOrder 实体只有 planQty/actualQty 数量、无任何成本字段也从不回填标准成本台账;实体 Javadoc 自述\"当前实现为手填 + 自动汇总框架\";(3) 差异原因标签库——不存在,只有自由文本 note 字段,全后端无 varianceReason/原因标签 任何代码;(4) 阈值灯预警——不存在,前端 standardcost.vue 仅按 variance 正负整行染红/染绿,无可配阈值、无预警引擎;全库\"threshold/阈值\"命中均在 WorkflowService 审批路由,与差异无关;(5) 单据下钻追溯——不存在,无从差异钻到工单/源单的追溯链(唯一\"下钻\"是 BomItemController 的 MRP unitUsage 连乘展开,与差异追溯无关);(6) 月末差异分摊+会计分录——不存在,无分摊逻辑,VoucherController 零引用 StandardCost/BomItem/variance,差异不生成任何凭证;(7) 差异触发标准成本修订——不存在,TriggerRuleEngine 无 bom/cost/variance/workorder 任何规则键,无修订触发。结论:除\"多维差异分解\"勉强算部分实现外,自动采集对比/原因标签库/阈值灯预警/单据下钻追溯/月末分摊+会计分录/触发标准成本修订 六项确实全缺失,缺口描述基本属实。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/StandardCostController.java(recompute 第71-75行 variance=actual−standard 手填;create 第85-88行 Money.of(req.actualCost()) 手填;rollup-tree 第212行成本中心树上卷;无 WorkOrder/Voucher/分摊/修订 引用), domain/StandardCost.java(第35-47行 料/工/费/variance 字段;第19-22/41 行 Javadoc 自述\"手填 + 自动汇总框架\"), web/BomAnalysisController.java(/cost-compare 第45-89行仅按 projectName 算 bidCost/actualCost/overrun 量价超支), domain/BomItem.java(只有 bidQty/actualQty/unitPrice,无差异原因/标签字段), domain/WorkOrder.java(仅 planQty/actualQty 数量,无成本字段), web/WorkOrderController.java(不写标准成本台账), service/TriggerRuleEngine.java(grep bom/cost/variance/workorder 零命中), web/VoucherController.java(grep standardCost/bomItem/variance 零命中)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/standardcost.vue(第60-62/79-81 行仅按 variance 正负整行染色,无阈值/原因标签/下钻/凭证)。grep 全后端 varianceReason/原因标签/阈值灯/差异分摊/会计分录 均零命中(threshold 命中全在 service/WorkflowService.java 审批路由,与 BOM 差异无关)。" }, { "area": "工程管理中心/成本控制部", "module": "4. 项目成本控制(工程/项目型)", "verdict": "LOGIC_GAP", "gap": "WBS分解结构缺失;多源自动归集与已发生/待发生实时计算缺失;EVM(PV/AC/EV/CPI/SPI)完全缺失;完工自动成本分析报告缺失;分级预警+关键物料/分包超额推送缺失;同供应商多流程联动、超合同额阻断付款、人材机一对多进度款均缺失。", "severity": "high", "evidence": "Budget.java 无 wbs 字段,BudgetController 仅单 element 行(人工/材料/机械/分包等枚举),非按WBS分解材料/人工/机械/分包/其他直接/间接费。无从采购/库存/工时/分包/报销自动归集实际成本至WBS、无已发生/待发生(在途/已签未结)实时计算。grep CPI/SPI/挣值/PV/AC/EV 0 命中,EVM 完全缺失(前端命中 funnel/filePreview 与EVM无关)。无项目完工自动成本分析报告。预警仅 BudgetController.create 中 actual>budget 置'超支'状态,无超预算5%/10%分级+关键物料超量+分包超合同额推送项目经理/成控部。Payment 仅单 contractId 无 milestone/多源分组,PaymentService.confirmPay 只回写 paidAmount,无超合同额/超预算阻断校验(分包不超总包仅在 ContractController.createSub)。需求点3多流程联动、点4超合同额预警+阻断付款、点6人材机一对多进度款均无。", "survives": true, "reNote": "缺口属实,无法推翻。该领域块\"项目成本控制(针对工程/项目型企业)\"在 kaidiDeptView.ts 工程管理中心/成本控制部下映射到 /budget/board(成本看板)。逐条核对缺口描述,全部成立:(1) WBS分解结构缺失——全库(含前后端,排除 node_modules)整词 grep WBS/工作分解 零命中;唯一的树是 CostCenter 责任中心树(公司→部门→项目→工序,CostCenterController.tree),属成本责任中心而非工作包分解。(2) 多源自动归集+已发生/待发生实时计算缺失——Budget.actualAmount 是手填 BigDecimal 字段,BudgetController.create 直接取请求体 actualAmount,无任何从付款/发票/合同的自动归集;全库无\"待发生\"概念。(3) EVM(PV/AC/EV/CPI/SPI)完全缺失——整词 grep evm/cpi/spi/挣值/plannedValue/earnedValue/EAC/BAC 前后端零命中;board.vue 只算 execRate=actual/budget。(4) 完工自动成本分析报告缺失——无 EAC/ETC/完工预测/分析报告生成。(5) 分级预警+关键物料/分包超额推送缺失——board 仅单档超支清单(actualAmount>budgetAmount),无分级阈值、无关键物料/分包专项推送,grep 分级预警/关键物料/超额推送 零命中。(6) 同供应商多流程联动/超合同额阻断付款/人材机一对多进度款均缺失——TriggerRuleEngine.ruleCreatePayment 仅生成待付单不校验合同额,PaymentService.confirmPay 仅做 paidAmount+=amount 无超额阻断/驳回;无人材机一对多进度款拆分逻辑(仅表单模板标签与价格库),无同供应商跨流程联动。现有的只是预算vs实际看板、责任中心预算上卷、BOM量价超支比对(/bom-items/cost-compare)、标准成本/价格库等邻近能力,均不构成 WBS/EVM/多源归集/完工分析/分级预警/超合同额阻断。", "reEvidence": "前端块映射: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts (工程管理中心>成本控制部>\"项目成本控制(针对工程/项目型企业)\" status=built path=/budget/board). 看板页(仅execRate与单档超支): /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/board.vue (L29 execRate=actual/budget, L30 overruns过滤). Budget实体actualAmount为手填字段: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java (L43); 控制器直取请求体: .../web/BudgetController.java (L72-83). 责任中心树(非WBS): .../web/CostCenterController.java tree()/buildNode() 仅 rollupBudget/rollupActual. BOM量价比对(非EVM): .../web/BomAnalysisController.java costCompare(). 付款无超合同额阻断: .../service/TriggerRuleEngine.java ruleCreatePayment(L147-180 仅生成待付单), .../service/PaymentService.java confirmPay(L76-94 仅 paidAmount+=amount 无超额校验/驳回). 整词grep证据: 前后端(排除node_modules) evm/wbs/cpi/spi/挣值/工作分解/plannedValue/earnedValue/EAC/BAC 及 分级预警/关键物料/超额推送/待发生/自动归集/多源归集/超合同/阻断 均零命中(供应商多流程联动、人材机一对多进度款仅出现于表单模板标签 src-progress-payment.ts/src-payable-confirm.ts 与价格库 pricelib.vue,非计算逻辑)。" }, { "area": "工程管理中心/成本控制部", "module": "5. 采购成本控制", "verdict": "MISSING", "gap": "采购订单实体本身缺失,因此采购价监控对比预警、采购变更审批、价格趋势+节约额、招标比价+最低价推荐+定标、到货成本核算+价差全部无对应实现。", "severity": "high", "evidence": "无 PurchaseOrder/采购订单实体(ls domain grep purchase/po/procure 0 命中)。无采购订单价与标准成本/历史价/上次采购价自动对比预警、无采购变更需成控部审批。无按物料/供应商/时间段采购价格趋势(grep trend/趋势 仅命中 AppMonitoring/DataSeeder 无关)、无采购节约额(标准价-实际价)×采购量。BidController grep 比价/lowest/推荐/定标 0 命中,无在线招标比价+各家报价记录+自动推荐最低价(质量交期评分)+成控部定标。无到货成本核算(运费/关税/装卸费)更新库存成本+价差。中标清单价对比统计无。", "survives": true, "reNote": "缺口属实。我尽力推翻但无法成立。活体后端 com.kaidi.oa 共90+实体,无任何 PurchaseOrder/采购订单 实体、repository 或 controller;全仓仅有的 PurchaseOrder 字样都在已弃用的 OFBiz 脚手架里(静态生成 json + display.ts 标签字典 + services/api.ts 一句描述),而 services/api.ts 在 oa/ 活体应用里无任何引用。采购在系统中只以\"审批表单模板\"形式存在(src-office-purchase 办公用品采购申请、purchase-contract 采购合同会签),是一次性走流程的表单,不落地任何采购订单记录,也不带价监控/比价/价差等结构化逻辑。描述点名的5个子功能(采购价监控对比预警/采购变更审批/价格趋势+节约额/招标比价+最低价推荐+定标/到货成本核算+价差)全前端 grep 采购价监控|价格趋势|节约额|价差|比价|最低价|定标|到货成本|采购变更 = 0 命中。预算成本中心相邻页面是另一回事:costcompare=投标工程量清单量价比对(非供应商比价)、pricelib/PriceItem=人材机参考价格库(静态参考价,非对采购订单的价监控)、standardcost/StandardCost=产品标准成本料工费差异(非采购价差/到货成本核算)、Bid/BidController=公司对外投标(Kaidi 投别人的标,无对内供应商比价/最低价推荐/定标)。采购订单实体确缺,其上依附的整条采购成本控制子链确无对应实现。", "reEvidence": "grep -rilE \"PurchaseOrder|purchase_order|采购订单\" oa-backend/src 仅命中 static/generated/*.json(弃用OFBiz);com.kaidi.oa/domain 下90+实体无 PurchaseOrder;前端 grep 采购价监控|价格趋势|节约额|价差|比价|最低价|定标|到货成本|采购变更 = 0命中。采购仅存于表单模板:ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-office-purchase.ts 与 .../templates/purchase-contract.ts。相邻但不对应:oa/pages/budget/costcompare.vue(量价比对=投标工程量清单vs实际)、pricelib.vue+domain/PriceItem.java(人材机参考价格库)、standardcost.vue+domain/StandardCost.java(产品标准成本差异)、domain/Bid.java+web/BidController.java(对外投标,无对内比价/最低价/定标)。OFBiz services/api.ts 未被 oa/ 引用(grep -rl services/api oa/ 为空)。" }, { "area": "工程管理中心/成本控制部", "module": "6. 成本报表与决策支持", "verdict": "PARTIAL", "gap": "可配置报表仅单源聚合,不支持多表 join 穿透;产品成本计算表(期间环比同比)、合同成本明细表(穿透采购分包工单)、差异汇总分析表、降本增效跟踪表、成本趋势预测均缺失。", "severity": "med", "evidence": "ReportDefinitionController 提供单源 group-by + count/sum 可配置报表(9个白名单源 contract/payment/budget/bid/opportunity/invoice/safety/instance/project),满足需求点1'任选基础数据模块组合形成报表'入门形态;但 execute() 单 Source 内存折叠,无多表 join 穿透(合同明细穿透采购/分包/工单不可达)。无产品成本计算表(标准vs实际料工费外协+差异+环比同比):StandardCost 有 variance 但无期间环比同比对比端点。无合同成本明细表(预算/实际/偏差/毛利率+穿透)。无差异汇总分析表(差异模型本身缺失)。无降本增效跟踪表。无成本趋势预测(grep forecast/predict/趋势预测 后端 0 命中)。", "survives": true, "reNote": "尽力推翻未果,缺口属实。可配置报表(ReportDefinition/ReportDefinitionController)结构上是严格单源聚合:一个 source + 一个 dimension + 一个 measure(count/sum),无第二张表/关联字段/join,因此不支持多表穿透。run 端点只对单 source 仓库行做内存 group-by。活体 /report-definitions/schema 仅暴露 9 个单源实体(contract/payment/budget/bid/opportunity/invoice/safety/instance/project),无任何跨表能力。\\n\\n描述点名的 5 类成本报表逐一核实均缺失:\\n1) 产品成本计算表(期间环比同比):StandardCostController 的 /rollup 与 /rollup-tree 只给当期 料/工/费/标准/实际/差异 合计与按成本中心树上卷,无环比/同比;全仓 grep 环比|同比|mom|yoy|priorPeriod 仅命中一条种子公告字符串与无关注释,零计算逻辑。\\n2) 合同成本明细表(穿透采购分包工单):无任何把合同成本下钻到 采购/分包/工单 的端点;WorkOrderController 无 contract/采购/分包/join;BomItemController 的 /tree 与 /mrp 是单实体 BOM 量价上卷/展开,非合同成本跨表穿透。\\n3) 差异汇总分析表:仅有 variance=actual−standard 的逐行/按中心累加,无独立差异汇总分析报表。\\n4) 降本增效跟踪表:全仓零命中。\\n5) 成本趋势预测:无 forecast/趋势预测/回归/移动平均;forecast 命中仅 CRM 加权漏斗与 OFBiz 遗留 mock,与成本趋势无关。\\n所有控制器 @GetMapping/@PostMapping 中无 forecast/trend/预测/降本/环比/同比/drilldown 等映射。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/ReportDefinition.java(单 source/dimension/measure 字段,无 join); oa-backend/src/main/java/com/kaidi/oa/web/ReportDefinitionController.java(SOURCES 9 个单源白名单, execute() 单源内存 group-by, 无第二源/关联); oa-backend/src/main/java/com/kaidi/oa/web/StandardCostController.java(/rollup, /rollup-tree 仅当期合计/上卷, 无环比同比/预测); oa-backend/src/main/java/com/kaidi/oa/web/BomItemController.java(/tree,/mrp 单实体BOM量价, 非合同成本穿透); 全仓 grep 环比|同比|forecast|趋势预测|降本|增效|穿透|drilldown 无成本相关命中; @(Get|Post)Mapping 无 forecast/trend/预测 等端点; 活体 http://127.0.0.1:8091 /api/oa/report-definitions/schema 仅返回 9 个单源, /api/oa/standard-costs/rollup 仅 byCostCenter+6口径合计无环比同比。" }, { "area": "工程管理中心/成本控制部", "module": "7. 合规与审计追溯", "verdict": "PARTIAL", "gap": "供应商/项目/分公司单位 360 数据汇总+上溯下溯穿透钻取缺失;存货计价方法可配置+变更审批缺失;成本调整(操作人/时间/原因)专门审计日志缺失;差异明细审计接口随差异模型缺失而缺。", "severity": "med", "evidence": "SupplierController(list/get/create/update/delete + 信用代码查重)、CustomerController、ProjectController(list/get/create/advance) 均无 summary/ledger/trace 端点,无以供应商/项目/办事处分公司为单位的 360 聚合视图(全部已签合同/已结算/已开票/已支付汇总)、无按项目划分、无上溯下溯单据穿透钻取链。grep 移动平均/先进先出/FIFO/个别计价/valuationMethod 0 命中,成本核算规则(存货计价方法可配置且变更需审批)无。StandardCost/Budget update 不记录变更原因,无专门成本调整操作日志(操作人/时间/原因)。审计只读接口部分(无差异明细,差异模型本身缺失)。Voucher 有 sourceType/sourceId 留痕属凭证级,非跨合同-付款-发票-结算单一实体360。", "survives": true, "reNote": "尽力推翻后仍无法翻案,缺口基本属实(PARTIAL 判定成立)。逐条核验:(1) 360数据汇总+穿透钻取——仅项目360存在(project360.vue 聚合合同/发票/付款/用印/档案/履约/投标/预算/安全+自动联动徽标+跨模块流程链;CostCenter/StandardCost 有 /tree、/rollup、/rollup-tree 多级上卷=上溯),但供应商360、分公司单位360 全无(grep supplier360/供应商画像/分公司360 零命中;SupplierController 纯CRUD),下溯穿透到单据级仅项目维有、其余维缺,整体 PARTIAL 成立。(2) 存货计价方法可配置+变更审批——彻底缺失:InventoryItem 域字段仅 materialName/category/spec/unit/quantity/safetyStock/location/status,无任何计价方法字段,全后端 grep valuation/计价方法/加权平均/FIFO/移动平均 零命中,更无变更审批。(3) 成本调整(操作人/时间/原因)专门审计日志——缺失:StandardCostController PUT 为普通字段覆盖,无 CostAdjustment 域、无 history/reason/操作人 字段,全项目无 @Aspect/AuditLog/操作日志 切面;现有 AutomationLog(联动留痕)/FlowTrace(审批步)/DataSyncLog 均不记录成本调整的操作人/原因。(4) 差异明细审计接口——审计接口确缺(变更无留痕)。唯一可纠偏点:缺口描述\"差异模型缺失\"措辞不准——StandardCost 实有 variance 字段且 create/update 自动算 variance=actual-standard,前端 standardcost.vue 有差异/差异状态列+详情抽屉+整行染色+rollup 聚合差异;但该纠偏不足以翻案,因为围绕差异的\"审计/留痕接口\"(谁改、何时、为何)依旧不存在,子点结论(审计接口缺)仍成立。综合:4 项核心审计追溯能力中 3.5 项确缺,PARTIAL 判定无法推翻。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa:domain/InventoryItem.java(无计价方法字段)、web/InventoryItemController.java(纯CRUD无计价/审批)、web/StandardCostController.java(PUT 字段覆盖式更新,无审计/无 reason/history,有 variance 自动计算+/rollup+/rollup-tree)、domain/StandardCost.java(有 variance 字段,无 changeLog/reason)、web/SupplierController.java 与 web/ProjectController.java(纯CRUD,无360聚合端点)、web/AuditProjectController.java(审计监察模块项目,非成本调整审计日志);全后端 grep 无 valuation/计价方法/加权平均/FIFO、无 @Aspect/AuditLog/操作日志、无 CostAdjust/成本调整/adjustReason、无 supplier360/分公司360。前端 ofbiz-framework/plugins/modern-ui/app/src:oa/pages/goal/project360.vue(项目360已实现)、oa/pages/budget/standardcost.vue(差异展示已实现)、oa/api/costing.ts(rollup/rollup-tree 上卷接口已实现);无 supplier360/valuation/成本调整审计页面。" }, { "area": "工程管理中心/成本控制部", "module": "8. 与其他部门的接口要求", "verdict": "LOGIC_GAP", "gap": "采购/生产/仓库/财务/人资跨模块自动取数接口缺失(相关实体/采集缺失);供应商合同前置条件硬卡缺失;财务/法务/金融/创研固定四方会签矩阵及各自校验逻辑缺失(仅通用引擎);进度款工程/财务专项校验节点缺失。", "severity": "med", "evidence": "无 ERP 级数据集成:采购(无采购订单实体)、生产(WorkOrder 实际投料/报工工时不回流差异)、仓库(无出入库自动取材料成本)、财务(无成本结转/差异分摊凭证自动)、人资(无工时费率/部门人工分摊取数)均无自动取数接口。需求点1'供应商合同前置:安责险+施工主合同已签由资料室判定'无前置条件硬卡。点2 WorkflowService 支持可配置并行会签/或签/条件分支节点(isParallelSyncNode/recordParallelVoteAndCheck/countersignMode),但 grep 核实税率/法务核/金融核/创研/承兑 仅命中种子模板文本与 AuthInterceptor 注释,无内建'财务核税率准确性/法务核条款/金融核承兑/创研核研发费用'固定四方会签矩阵与各自校验逻辑。点3 进度款'工程中心核现场进度匹配+财务核出入库及发票附件'无内建校验节点。", "survives": true, "reNote": "缺口属实。工程管理中心/成本控制部「8.与其他部门的接口要求」的四项专项逻辑均未实现,系统仅有通用审批引擎(WorkflowService) + 通用办结联动(TriggerRuleEngine) + 静态表单模板,没有针对该接口条款的专门逻辑。\n\n(1) 采购/生产/仓库/财务/人资跨模块自动取数接口缺失:后端无 PurchaseOrder/入库单/出库单/报工/领料/工时费率 任何实体或采集;StandardCostController 头注释(L33-35)明示料/工/费实际归集来源(生产工单/领料单/工时系统/费用分摊)与工时费率「属甲方规则,当前为手填+服务端自动汇总的框架实现」。src-progress-payment/src-cost-contract 里的「实时累计应付/已付/欠付/中标合同金额」全是手填 money 字段——grep 全库无任何后端端点或前端 service 从采购/库存/财务模块自动取数回填它们。BusinessBiController 只聚合既有 OA 仓库(contract/payment/budget/bom/project 等),不触采购/库存/工时源单。\n\n(2) 供应商合同前置条件硬卡缺失:src-supplier-access.ts 流程仅张丽静→集采→成控→资料员的普通审批/知会,无「安责险购买/施工主合同已签」前置闸,无资料室判定硬卡;SupplierController.create 仅校验名称+信用代码查重。全后端 grep 安责险/主合同/前置/precondition 零命中。\n\n(3) 财务/法务/金融/创研固定四方会签矩阵及各自校验逻辑缺失:src-cost-contract.ts 有法务部经理/法人节点但无固定四方矩阵,无金融承兑比例核实节点、无创研研发费用核实节点(仅一个 belongToRd 单选字段,无校验)。会签引擎 WorkflowService.countersignMode/countersignQuorum 是通用 label 解析器(「会签:A、B」→人数配额),只有同意/退回票,无任何按方校验逻辑。WorkflowService grep 税率核实/承兑比例/研发费用核实/validate 零命中。\n\n(4) 进度款工程/财务专项校验节点缺失:src-progress-payment.ts 含工程中心负责人/质安部/财务等节点但均为通用审批/知会,isInvoiceBooked 仅单选字段+附件位,无任何程序化校验节点强制「是否与现场进度匹配」或「财务是否收到对应出入库资料及发票」;PaymentController/PaymentService 只做通用 待付→已付 闸。无专项校验节点。\n\n努力推翻未果:以上四项确为系统缺口,仅靠通用引擎兜底,无专门实现。", "reEvidence": "需求源: requirements/_req_slices/13_工程管理中心__成本控制部.txt L26-27(第8模块三条接口要求)。\n(1) oa-backend/.../web/StandardCostController.java L33-35(归集来源属甲方规则/手填); domain/ 无 PurchaseOrder/入库出库/报工/工时实体(仅 WorkOrder.java 字段为 planQty/actualQty 无投料工时成本); web/BusinessBiController.java L18-61(仅聚合既有OA仓库); 前端 src/oa/engine/templates/src/src-progress-payment.ts L62-67 实时累计字段为手填money。\n(2) src/oa/engine/templates/src/src-supplier-access.ts L46-62(普通审批流,无前置闸); web/SupplierController.java L49-69(仅名称+信用代码校验)。\n(3) src/oa/engine/templates/src/src-cost-contract.ts L93-160(无金融承兑/创研核实节点); service/WorkflowService.java L1869-1995(countersignMode/countersignQuorum 通用label解析,无按方校验)。\n(4) src/oa/engine/templates/src/src-progress-payment.ts L232-299(工程中心/质安/财务均通用审批知会节点); web/PaymentController.java + PaymentService(仅待付→已付通用闸)。\n全后端/前端 grep 安责险|主合同|税率核实|承兑比例|研发费用核实|现场进度匹配|出入库资料 均无校验逻辑命中(仅 src-progress-payment/src-cost-contract 两个模板定义里出现为静态字段)。" }, { "area": "运营管理中心/城镇污水运营中心", "module": "1. 工艺运行管理", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP。仅一张手工工艺日台账,达标状态人工下拉;完全缺 PLC/SCADA 采集、调控指令前后值留痕、分级报警推送、报表自动生成、AI 优化建议与效果反馈。", "severity": "high", "evidence": "process.vue (ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/process.vue) 是 MasterDataPage + settingListStore('ops-process') 的纯手工 CRUD 台账,status 是 select 下拉(达标/预警/超标)人工填,无任何自动判定。后端无 process 控制器/实体——全靠通用 settings 键值表持久化。全后端 grep 'SCADA|PLC|溶解氧|曝气|回流比|联锁' 零命中;grep 'AI算法|优化建议|效果反馈|预测|forecast|recommend' 在业务代码零命中。无实时采集、无在线调控指令留痕、无阈值分级报警推送、无日/周/月报与去除率/单耗自动生成、无 AI 优化建议。", "survives": true, "reNote": "缺口属实,对抗性复验无法推翻。工艺运行管理模块就是 process.vue 一张纯手工台账,达标状态是人工下拉(达标/预警/超标),全部进出水/COD/氨氮数值由 number 输入框手键,后端连实体/控制器都没有——靠通用 settingListStore('ops-process') 存成 Setting 键值 blob。逐条核对缺口的六个要素:(1) PLC/SCADA 采集:全无,全代码里唯一的\"PLC\"只是 RD 模块的样品名\"PLC控制模块\"和一个研发项目标题,无任何遥测/实时采集入库端点;(2) 调控指令前后值留痕:无,dispatch.vue 的\"调度指令\"只是一个自由文本字段,无前后值、无执行留痕;TriggerRuleEngine/AutomationLog 仅在审批办结(付款/发票/合同/项目/供应商)时联动,与工艺调控无关;(3) 分级报警推送:AlertController/AlertScheduler 确实存在且有 warning/danger 分级+每小时 push,但告警源只有 PersonnelCert/Patent/ContractMilestone/InventoryItem/LabInstrument/SafetyCheck/FormInstance/Budget 八类,工艺台账和 WaterQualityRecord 都不在其中,超标工艺读数不产生任何告警或推送;(4) 报表自动生成:工艺运行无,数据是不透明 Setting blob,不进任何 ReportDefinition;(5)(6) AI 优化建议与效果反馈:无,最接近的 WaterTraceController 只是把\"超标\"记录按 COD>=氨氮 简单二分标成\"COD超标/氨氮超标\"并吐一句硬编码固定字符串\"约谈整改+按服务合同追偿超标处理费\",是静态追责文案不是 AI 工艺优化,更无效果反馈闭环。判定维持 LOGIC_GAP。", "reEvidence": "关键文件:(1) 工艺台账纯手工+人工下拉:ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/process.vue 第5-9行 settingListStore('ops-process',[...]) 三条 mock,第29行 status 字段 type:'select' options:['达标','预警','超标'],无后端 ops-process 控制器。(2) 调度指令仅自由文本:ofbiz-framework/.../oa/pages/ops/dispatch.vue 第19行 instruction 列、第28行 {id:'instruction',label:'调度指令'} 无前后值。(3) 告警源不含工艺/水质:oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java aggregate() 只遍历 PersonnelCert/Patent/ContractMilestone/InventoryItem/LabInstrument/SafetyCheck/FormInstance/Budget;oa-backend/.../task/AlertScheduler.java @Scheduled(fixedRate=3600000) pushAlerts() 只刷证件到期+审批超时,不扫水质/工艺。(4) 静态追责非AI优化:oa-backend/.../web/WaterTraceController.java trace() 第80-86行 exceedItem 由 codValue>=ammoniaValue 二分,suggestion 硬编码 \"约谈整改+按服务合同追偿超标处理费\"。(5) WaterQualityRecord.java 全字段 double 手键,无采集来源。grep 全 src 无 scada/遥测/遥控/调控指令前后值/优化建议/效果反馈 命中(仅 built static assets 里\"采集\"是情报模块 crawl 噪声)。" }, { "area": "运营管理中心/城镇污水运营中心", "module": "2. 设备管理", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP。仅简化设备台账手填;缺运行时长/启停自动累计、完好率/运转率、预防性保养工单自动生成推送、扫码报修→派工→MTBF/MTTR、备件安全库存扣减+采购联动、设备绩效决策分析。", "severity": "high", "evidence": "equipment.vue 是 MasterDataPage + settingListStore('ops-equipment') 手工台账,字段仅 name/tag/type/status/runHours/nextMaint,runHours 与 nextMaint 均手填,无工艺段/供应商/设计寿命/备件清单/二维码。WorkOrderController.java 明确归属制造管理中心(生产工单 productName=生物质有机肥等),是成品入库自动建库存,与设备维修无关。后端 grep 'MTBF|MTTR|预防性|保养工单' 零命中。AlertController 的库存预警基于 InventoryItem.status=='低于安全线'(人工置位),非领用自动扣库的备件闭环。", "survives": true, "reNote": "缺口属实。城镇污水运营中心「设备管理」仅有一个极简手填台账页 equipment.vue,缺口描述的全部六项能力均未实现,无法推翻。\n\n证据链:\n1) 前端页面 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/equipment.vue 直接用通用工厂 settingListStore('ops-equipment', seed) 渲染 MasterDataPage。runHours(运行时长)、nextMaint(下次保养日期)都是手填字段(type:'number' / type:'date'),列定义和表单里没有任何派生指标。\n2) settingListStore(oa/api/settingList.ts)只是把记录走 /api/oa/biz/{type} 存进后端通用 biz_record 表(按 type 区分的行级 KV 台账),没有任何设备领域逻辑——纯增删改查。\n3) 后端 domain/ 下没有 Equipment/Maintenance/SparePart/Repair/Pm 等任何设备实体(只有 ItAsset,且其字段无 runHour/完好/运转/MTBF/保养)。\n4) WorkOrderController 是「制造管理中心-生产工单」(产品=生物质有机肥/复合微生物肥/PAC 等),不是设备预防性保养工单,无任何由设备到期触发的自动生成。\n5) 全后端 grep MTBF/MTTR/完好率/运转率/运行时长累计/启停累计/预防性保养/扫码报修 = 0 命中;TriggerRuleEngine 中无任何设备/保养/备件联动。\n6) 备件安全库存:仅通用 InventoryItem 有 safetyStock + AlertController 库存预警,针对的是物料库存,未与设备报修/采购联动,也不是设备备件。\n\n结论:缺运行时长自动累计、完好率/运转率、PM工单自动生成推送、扫码报修→派工→MTBF/MTTR、备件安全库存扣减+采购联动、设备绩效决策分析。LOGIC_GAP 成立。", "reEvidence": "ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/equipment.vue (手填台账, settingListStore('ops-equipment'), runHours/nextMaint 为手填字段); ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts (通用 /api/oa/biz/{type} KV CRUD, 无设备逻辑); oa-backend/src/main/java/com/kaidi/oa/domain/ (无 Equipment/Maintenance/SparePart 实体, 仅 ItAsset 无相关字段); oa-backend/src/main/java/com/kaidi/oa/web/WorkOrderController.java (生产工单, 非设备PM保养); 全后端 grep MTBF/MTTR/完好率/运转率/预防性保养/扫码报修 = 0 命中; TriggerRuleEngine.java 无设备/备件联动" }, { "area": "运营管理中心/城镇污水运营中心", "module": "3. 水质检测与实验室管理", "verdict": "PARTIAL", "gap": "维持 PARTIAL。达标判定为人工下拉,无标准自动对比/超标自动标红触发整改;缺采样计划自动生成与移动采样、LIMS/批量导入、质控(标准样/平行样/空白样)偏差、检测报告电子签名归档报送。", "severity": "high", "evidence": "承载成立但判定为人工:quality.vue result 字段是 select(达标/超标/预警)人工录入;WaterQualityRecordController.java:73 setResult(req.result()) 原样存,无任何 GB18918/标准对比逻辑。WaterTraceController.java:68 仅 filter result.equals('超标')——超标是人工录入值,不是系统判定。后端 grep 'GB18918|排放标准|质控|平行样|空白样|标准样|LIMS' 零命中。QmsRecordController 是 ISO9001 质量体系(内部审核/管理评审),非实验室质控。无采样计划自动生成/指派、无移动端采样点位录入、无批量/LIMS导入、无质控偏差计算、无检测报告+电子签名归档报送。", "survives": true, "reNote": "缺口属实,PARTIAL 判定成立。我尽力寻找反证但无法推翻。水质检测/实验室三个后端控制器(WaterQualityRecordController/LabSampleController/LabInstrumentController)均为纯 CRUD,无任何业务逻辑:result/status 都是直接透传的字符串字段。前端 ops/quality.vue 第23行 result 就是人工下拉 select(options ['达标','超标','预警']),达标判定完全靠人工选择,没有任何标准限值实体或自动对比。逐项核对7个子缺口全部成立:(1)人工下拉=真,quality.vue:23;(2)无标准自动对比=真,create/update 只存原始 result,domain 无 StandardLimit/threshold 实体;(3)无超标自动标红触发整改=真,无自动标红样式、无整改工单/工作流触发;(4)无采样计划自动生成与移动采样=真,无 SamplingPlan 实体/生成器;(5)无 LIMS/批量导入=真,三个控制器只有单条 POST,无 import/upload/batch 端点;(6)无质控(标准样/平行样/空白样)偏差=真,全代码库无任何质控字段或实体;(7)无检测报告电子签名归档报送=真,签名逻辑只存在于 DesignDoc 设计域,LabSample 无报告/签名/归档字段。唯一相邻功能 WaterTrace(/water-quality/trace 超标溯源追责)反而坐实缺口——它过滤的是人工录入的 result 字符串(\"超标\".equals(r.getResult())),exceedItem 仅靠 codValue>=ammoniaValue 两个原始读数互比(非对标准限值),suggestion 是硬编码常量字符串,未创建任何整改工作流或 AutomationLog 留痕。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/quality.vue:23 result 为人工 select 下拉。后端纯CRUD: oa-backend/src/main/java/com/kaidi/oa/web/WaterQualityRecordController.java(create:60-77/update:80-94 直接存 result 字符串)、web/LabSampleController.java、web/LabInstrumentController.java。Domain 无业务字段: domain/WaterQualityRecord.java(result 仅普通 String)、domain/LabSample.java(status 仅普通 String)。无标准限值实体: domain/ 下仅 StandardCost(成本)与 WorkPlan,无 StandardLimit/threshold/QC/Sampling 实体。WaterTrace 反证: web/WaterTraceController.java 第69-72行 if(!\"超标\".equals(r.getResult())) continue —— 依赖人工录入结果,suggestion 为硬编码\"约谈整改+按服务合同追偿超标处理费\",无工作流/AutomationLog。电子签名仅在设计域: grep 签名/signature 命中 domain/DesignDoc.java、web/DesignChangeController.java 等,lab/water 域无命中。grep 标准样/平行样/空白样/质控/采样计划/LIMS/批量导入 在 lab/water 相关文件零命中。" }, { "area": "运营管理中心/城镇污水运营中心", "module": "4. 药剂与能耗管理", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP。仅药剂投加与能耗手工台账(单耗手填);缺库存采购领用预警闭环、单耗自动计算与标杆对比、加药量推荐与差异分析、分工艺段电耗+电力对接、月度成本归集吨水完全成本+预算偏差。", "severity": "high", "evidence": "reagent.vue 是 settingListStore('ops-reagent') 手工台账,unitPower(吨水电耗)是 number 字段人工填,非系统按电耗/水量算。无药剂库存实体——InventoryItem 是通用成品/物料库,AlertController 库存预警靠人工置 status,无药剂采购入库/领用出库/库存预警闭环、无领用扣库。后端 grep '碳源|絮凝剂|药剂库|对标|标杆' 在业务代码零命中。无吨水电耗/药耗自动计算与历史/行业标杆对比、无按进水负荷推荐加药量、无分工艺段计量/峰谷/电力对接、无月成本归集算吨水完全成本与预算偏差。", "survives": true, "reNote": "缺口属实。药剂与能耗管理页(reagent.vue)是纯手工台账,五项关键能力全部缺失,前后端均无任何实现。\n\n1) 前端 reagent.vue 仅是一个 MasterDataPage,列固定为 dosingDate/reagentName/dosingAmount/treatedWater/powerUsage/unitPower。其中 unitPower(吨水电耗/单耗)是 type:'number' 的手填输入框(createFields 第25行),不是由 powerUsage/treatedWater 自动算出——印证\"单耗手填\"。\n\n2) 数据走 settingListStore('ops-reagent') → /api/oa/biz/ops-reagent → BizRecordController:把字段当 dataJson 整块存取的哑 CRUD,list/create/update/delete 全无任何业务运算、聚合或派生。活体验证 GET /api/oa/biz/ops-reagent 返回扁平空列表。\n\n3) 五项缺口逐条核实均缺:\n- 库存采购领用预警闭环:InventoryItem/InventoryItemController 是制造中心通用库存,只有 quantity=ammoniaValue 两读数互比,而非对照 GB 排放限值。全仓 grep 限值/标准值/GB8978/GB18918/排放标准 在该域零命中。(3) 无采样计划(采样计划/samplingPlan 零命中)。(4) 无质控(平行样/加标/质控 零命中)。(5) 无检测报告生成:LabSample.status 含 '已出报告' 但仅为手设状态串(LabSampleController 第92行),无报告生成逻辑;'检测报告' 命中仅为支付模板附件标签与种子文案,与实验室报告无关。", "reEvidence": "WaterQualityRecordController.java:73 r.setResult(req.result()) 与:91 update 同样直写;quality.vue:23 result 字段 type:'select' options:['达标','超标','预警'] 人工选。WaterTraceController.java:68 if(!\"超标\".equals(r.getResult())) continue; :76 exceedItem=codValue>=ammoniaValue?\"COD超标\":\"氨氮超标\"(读数互比,非对标准限值)。LabSampleController.java:70/92 status 仅默认/直写 '待检'/'已出报告' 字符串,无报告生成。grep 限值/标准值/采样计划/质控/平行样/加标/GB8978/排放标准 在 oa-backend 与 modern-ui/app/src 水质·实验室域均零命中。无 service 层对 result 做任何判定。" }, { "area": "运营管理中心/工业废水运营中心", "module": "6. 污泥(危废)全流程管理", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP:仅一张污泥台账假表,联单号是手填文本,无电子联单全流程/平台对接/GPS/费用自动计算。", "severity": "high", "evidence": "ops/sludge.vue 是 settingListStore('ops-sludge') 平铺表(date/type/output/moisture/method/dest/manifest),manifest(危废联单号)是可手填普通文本字段(createFields 里 {id:'manifest',label:'危废联单号'} 无类型约束)。无产生→暂存→转移→处置电子联单全流程、无危废代码/批次/库位、无与环保危废平台对接、无运输车辆GPS轨迹+接收回执、无一般/危废差异化处置费自动计算与成本归集、无资源化收益跟踪。后端无控制器。", "survives": true, "reNote": "缺口属实。污泥(危废)全流程管理仅为一张污泥台账假表:前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/sludge.vue 是 MasterDataPage 套 settingListStore('ops-sludge') 的薄壳,危废联单号 manifest 是 type:'text' 手填文本字段(种子值如 'HW-2026-0312' 甚至 '—')。后端无任何污泥/危废联单领域:该 store 走 /api/oa/biz/{type} → BizRecordController/BizRecord,是通用行级 CRUD(每行只是 {id,...任意 dataJson},按 bizType 字符串区分),没有联单生命周期/状态机、无运输方/接收方/GPS/费用字段、无政府固危废平台对接。WaterTraceController 是水质超标溯源(COD/氨氮),与污泥联单无关。service/(含 WorkflowService、TriggerRuleEngine) 及 resources 全文搜 sludge/污泥/危废/联单/manifest/GPS/费用自动/平台对接/电子联单 均无命中。后端仅有的污泥/危废字样全是种子文本串(一条 SafetyCheck 描述\"污泥转运联单记录不完整,缺少接收单位签收回执\"、R&D项目、专利、实验室样品、设计图),不构成任何联单流程。即:无电子联单全流程、无平台对接、无GPS、无费用自动计算。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/sludge.vue 第5-9行 settingListStore('ops-sludge', 3条种子) + 第28行 manifest 列 {id:'manifest', label:'危废联单号'} 为纯文本;store 实现 ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts 仅 list/create/update/remove 走 /biz/{key}。后端通用存储: oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java(任意 dataJson 行级CRUD,无业务语义) + domain/BizRecord.java(仅 bizType+dataJson)。无专用控制器: web/ 下仅 WastewaterClient/WaterQualityRecord/WaterTrace,WaterTraceController.java 是水质超标溯源非联单。grep 全后端 service/ 与 resources/ 对 sludge|污泥|危废|联单|manifest|GPS 仅命中 DataSeeder.java:1631-1632 等纯种子文本。" }, { "area": "运营管理中心/工业废水运营中心", "module": "7. 安全环保与合规", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP:SafetyCheck 是通用安全检查表,无废水场景巡检/MSDS/排污许可/应急预案/职业健康。", "severity": "high", "evidence": "SafetyCheck.java 是通用安全检查实体(code/type/location/item/result/level/finding/responsible/rectifyStatus/dueDate/checkDate),SafetyCheckController 无废水巡检路线/检查项(化学品存储/有限空间/应急池)/扫码打卡/拍照逻辑(grep 巡检路线/route/MSDS/有限空间/应急池/许可证/双人双锁/扫码 全 0 命中)。无危化品 MSDS+双人双锁+领用审批+存量预警+应急物资台账、无排污许可证(许可量/监测频次)管理+执行报告日期提醒、无废气噪声固废记录、无应急预案+演练+突发事件上报、无职业病体检/劳保发放。", "survives": true, "reNote": "缺口属实。无法推翻。SafetyCheck 确为通用隐患排查表(type 仅 安全/质量/环境,字段 location/item/result/level/rectifyStatus),无任何废水场景巡检、MSDS、排污许可、应急预案、职业健康功能。工业废水运营中心(ops 模块)的导航也无\"安全环保与合规\"链:其子项仅为排污客户/水质监测/设备台账/超标溯源/工艺运行/药剂能耗/污泥危废/调度/绩效。EHS 模块独立且通用(安全检查隐患/三体系认证/质量体系/EHS看板),未与废水场景绑定。邻近实体(HealthRecord 职业健康归HR、Certification 通用ISO体系、Declaration 政府研发项目申报)既不覆盖五项缺失维度、也不与废水运营挂钩。全后端+前端 grep 排污许可/应急预案/MSDS/废水巡检/patrol/inspect/permit/emergency 零功能实现(唯二命中为知识库文档标题串与无关IT网络安全工单)。", "reEvidence": "SafetyCheck 通用表: oa-backend/src/main/java/com/kaidi/oa/domain/SafetyCheck.java(L12-16 javadoc: type 安全/质量/环境, result 合格/隐患/不合格, level 一般/重大/无), web/SafetyCheckController.java(L37-48 list 仅按 type/rectifyStatus 过滤,无废水维度)。ops(工业废水运营中心)导航 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts L365-381 子项无安全环保合规链。EHS 通用导航 同文件 L299-308。邻近实体: domain/HealthRecord.java(职业健康,HR所有,无废水绑定)、domain/Certification.java(通用ISO三体系)、domain/Declaration.java(政府研发申报,非排污许可)。综合 grep 排污许可|dischargePermit|应急预案|emergencyPlan|MSDS|废水巡检|patrol|inspect|permit|emergency 在 oa-backend 与 modern-ui/src/oa/pages/ops|ehs 下零功能命中;唯一\"应急预案\"出现在 web/FavoriteController.java:59 知识库文档标题字符串。无任何 patrol/inspect/emergency/permit 命名的 Java 实体或控制器。" }, { "area": "运营管理中心/工业废水运营中心", "module": "8. 生产计划与调度", "verdict": "LOGIC_GAP", "gap": "维持 LOGIC_GAP:无处理费自动计算/账单开票收款/成本分摊,全为手填台账。", "severity": "high", "evidence": "ops/dispatch.vue 是 settingListStore('ops-dispatch') 平铺表(date/shift/planned/actual/loadRate/instruction/owner),loadRate 是手填字符串('96.5%')。无核心处理费自动计算(按合同水量/COD浓度/组合/阶梯/超标加价月度生成账单),保底水量/折扣/罚款条款缺失;无正式账单+开票/收款/欠款状态+逾期催收提醒(无 Invoice 关联到 ops 合同的逻辑);ops/performance.vue 的 unitCost/codReduce/kpi 均为手填数字,无按水量/污染负荷自动分摊计算。", "survives": true, "reNote": "缺口属实。工业废水运营中心「生产计划与调度」链下,无任何处理费自动计算、账单开票收款、成本分摊逻辑——全为手填台账。(1) WastewaterClient 为纯 CRUD,存 dailyVolume 但无单价、无 fee 字段、从不做量×价;(2) WaterTrace 里唯一的\"处理费\"是硬编码建议串\"约谈整改+按服务合同追偿超标处理费\",无金额计算;(3) Invoice 是通用进项/销项主数据,无 wastewater clientId 关联、不从水量推导金额、无自动开票;(4) 前端 /ops/dispatch、/ops/performance 仅 36/32 行 MasterDataPage 薄壳,dispatch 的计划/实际处理量、performance 的 unitCost/waterVol 全是手填种子行,money() 只是展示格式化,无量×价计算、无开票收款、无分摊;(5) 后端 /biz/{type}(BizRecordController,128行) 是通用 JSON 行存,零 fee/账单/分摊计算;(6) TriggerRuleEngine 零处 wastewater/water/fee/账单引用,办结后无下游自动生成账单或分摊成本。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/WastewaterClient.java (纯字段,无单价/fee); oa-backend/src/main/java/com/kaidi/oa/web/WastewaterClientController.java (纯CRUD); oa-backend/src/main/java/com/kaidi/oa/web/WaterTraceController.java:77 (硬编码\"追偿超标处理费\"建议串,无计算); oa-backend/src/main/java/com/kaidi/oa/domain/Invoice.java + web/InvoiceController.java (通用发票,无wastewater关联,无量×价); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/dispatch.vue (36行手填调度台账); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/performance.vue:6,12 (unitCost手填,money()仅展示); ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts + oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java (通用行存,零计费); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java (grep wastewater/water/处理费/账单/分摊 全无命中)。" }, { "area": "运营管理中心/工业废水运营中心", "module": "9. 报表与外部对接", "verdict": "MISSING", "gap": "维持 MISSING:无政府报表模板与自动生成、无在线监测平台/ERP-MES/园区对接、无内部报表自动推送。", "severity": "high", "evidence": "grep ReportController/ReportDefinitionController 中 污染源/运营月报/危废台账/排污许可/国发/监管报表/监测平台 全 0 命中——无政府监管报表内置模板与系统自动提取生成。无与环保部门在线监测平台对接(无 device/sensor/telemetry/realtime 端点,仅 LabInstrument 属实验室)、无与排污企业 ERP/MES 对接获取排水预测、无智慧园区集成。内部生产日报/设备运行/成本月报/年度报告无自动生成推送(performance/process 等均为手填台账)。", "survives": true, "reNote": "缺口属实。工业废水运营中心的\"报表与外部对接\"三项均未实现:(1) 无政府报表模板与自动生成——Declaration/DeclarationTemplate 控制器其文档头明确归属\"研发创新中心\"的政府项目申报(高新技术企业/科技型中小企业等科技立项),与废水排污许可/自行监测等环保政府报表是两个域,废水侧没有任何报表模板或自动生成;(2) 无在线监测平台/ERP-MES/园区对接——WaterQualityRecord 为人工录入(带 inspector 字段、无设备/在线数据源),全后端唯一的\"在线监测\"字样只是 DataSeeder 里一个无关 RdProject 名和专利名;\"MES\"零命中(grep 命中只是 WRITE_DATES_AS_TIMESTAMPS 的子串);\"园区\"只在种子项目名里出现,无任何对接端点;DataSyncLogController 是手工 append/list 台账(其注释自述\"a simple append/list ledger\"),无同步引擎/调度/外部连接器;(3) 无内部报表自动推送——ReportController 仅 /overview;ReportDefinitionController 是通用即席报表搭建器(schema/list/get/create/update/delete/run),对 push/推送/schedule/定时/政府/外部 全部零命中,无任何定时分发报表的调度逻辑(AlertScheduler 只管告警)。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/WastewaterClientController.java(纯CRUD排污客户主数据);WaterQualityRecordController.java(人工录入监测记录,有inspector字段无在线源);WaterTraceController.java(超标溯源,内存join,非政府报表/非推送);DeclarationController.java 第23-28行文档头自述属\"R&D innovation center 政府项目申报\"且枚举为高新/科技型中小/省重点研发计划等科技立项;DeclarationTemplateController.java 同属研发申报模板,非废水环保报表;DataSyncLogController.java 第21-22行注释\"a simple append/list ledger of sync runs\"+create为手工POST,无同步引擎/调度;ReportController.java 仅 @GetMapping(\"/overview\");ReportDefinitionController.java 端点schema/list/get/create/update/delete/{id}/run,对 push|推送|schedule|定时|government|政府|外部|MES|园区|监测 全零命中。grep全后端:\"在线监测\"仅命中 seed/DataSeeder.java 第1964/1998行(无关RdProject与专利名);\"MES\"仅命中 config/JacksonConfig.java 的 WRITE_DATES_AS_TIMESTAMPS 子串;\"园区\"仅命中 DataSeeder 项目名。前端 ofbiz-framework/plugins/modern-ui/app/src/oa/api/ops.ts 仅暴露 wastewater-clients/water-quality/trace 的CRUD,无模板生成/对接/推送接口。" }, { "area": "运营管理中心/工业废水运营中心", "module": "10. 移动端应用", "verdict": "MISSING", "gap": "维持 MISSING:无运营专属移动巡检/扫码/离线/实时监控/工单/移动审批/危废联单打印。", "severity": "med", "evidence": "ops 模块所有页面(clients/quality/equipment/process/reagent/sludge/dispatch/performance)均为桌面 MasterDataPage,无扫码查看设备/记录参数/上报故障/填巡检表/离线同步逻辑(SafetyCheck/equipment 无 scan/二维码字段);无手机端工艺流程图/各企业来水水质/报警实时监控;无维修工单接单完工填报;药剂采购/维修领料/预算外支出移动审批未落到本中心;无现场扫码填写危废转移并打印联单(sludge manifest 是手填文本)。Mobile 控制器为通用移动工作台,无 ops 专属能力。", "survives": true, "reNote": "缺口属实。我作为对抗复验员尽力寻找运营专属移动端实现,但七项要素全部缺失,无法推翻。证据如下:\n\n1) 移动端只有一个通用工作台,非运营专属。ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mobile/workbench.vue 注释明写\"统一移动工作台…移动端只做一个工作台,全部门访问…纯前端聚合,不新增后端\"。它只聚合待办审批/预警中心/项目进度填报+快捷查询(合同/支付/投标/情报/用印/档案/商机/预算),完全没有污水运营场景。oaModules.ts:490-494 确认 mobile 模块仅 1 个子项 workbench(portal)。\n\n2) 后端 MobileController.java(/api/oa/mobile/summary) 同样是通用聚合(todoCount/alertCount/dangerCount/projectCount + alerts/todos 预览),无任何运营/巡检/扫码端点。\n\n3) 无巡检:全库 grep \"巡检\" 仅命中 itasset/itservice.vue(IT机房\"网络安全巡检\"工单)与 datacenter,均非运营现场巡检;ops 页面目录内 grep \"巡检\"=0命中。\n\n4) 无扫码/二维码:ops 与 mobile 页面 grep \"扫码|二维码|qrcode|scan\"=0命中。\n\n5) 无离线:ops/mobile 页面 grep \"serviceWorker|offline|navigator.onLine|IndexedDB\"=0命中,无 PWA。\n\n6) 无实时监控:全库无 SCADA/DCS/实时监控端点;水质监测 WaterQualityRecordController 仅为手工 CRUD 台账。\n\n7) 无运营工单:WorkOrderController/WorkOrder 实体明确是\"制造管理中心 生产工单(生物质有机肥/PAC等)\",与运营巡检工单无关;无移动审批专属运营入口。\n\n8) 危废联单\"打印\"缺失:ops/sludge.vue 的\"危废联单号(manifest)\"只是 MasterDataPage 通用 CRUD 表的一个文本字段;ops 与 mobile 页面 grep \"window.print|打印|生成联单\"=0命中,没有任何联单打印/生成实现。", "reEvidence": "ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mobile/workbench.vue (注释 L2-6 明写\"只做一个工作台/纯前端聚合/不新增后端\";聚合待办/预警/进度填报/快捷查询,无运营场景); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:490-494 (mobile 模块仅 workbench 一项); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:365-379 (ops 模块全部为通用 list/report CRUD 页,无巡检/扫码/工单/实时); oa-backend/src/main/java/com/kaidi/oa/web/MobileController.java (通用 summary 聚合,无运营端点); oa-backend/src/main/java/com/kaidi/oa/web/WorkOrderController.java + domain/WorkOrder.java (生产工单≠运营巡检工单); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/ops/sludge.vue:18,28 (危废联单号仅为文本字段,无打印); grep 结果:ops/mobile 页面内 巡检/扫码/离线/实时/window.print/打印 全部 0 命中。" }, { "area": "运营管理中心/工业废水运营中心", "module": "11. 与其他部门的接口要求", "verdict": "MISSING", "gap": "维持 MISSING:七类部门接口全部无实现,无自动联动留痕(AutomationLog 无 ops ruleKey)。", "severity": "med", "evidence": "TriggerRuleEngine.java 的 ruleKey 仅 payment.create/contract.effectivate/project.create/project.accept/seal.markUsed/supplier.admit,无任何 ops 相关 ruleKey;AutomationLog 留痕也无 ops 条目。七类部门接口(环保设备制造中心/实验室/采购部/财务部/申报服务部/法务风险部/档案室)均无自动联动实现——ops 控制器(WastewaterClient/WaterQuality/WaterTrace)办结后不触发任何下游联动,与制造/采购/财务/法务/档案无数据流转。", "survives": true, "reNote": "缺口属实,无法推翻。工业废水运营中心需求第11条「与其他部门的接口要求」列了七类部门接口(环保设备制造中心/实验室/采购部/财务部/申报服务部/法务风险部/档案室),代码与活体均无任何实现,也无自动联动留痕。(1) 联动引擎 TriggerRuleEngine.fire() 的关键词矩阵只路由到 付款/用印/收款发票/立项/验收/供应商/合同,ruleKeyFor 全集仅 payment.create/receipt.invoice/contract.effectivate/contract.toSeal/project.create/project.accept/project.toArchive/seal.markUsed/supplier.admit,没有 ops/废水/排污/超标/运营/减排/纳管 任何分支或 ruleKey。(2) 三个运营控制器 WastewaterClientController、WaterQualityRecordController、WaterTraceController 均为纯 CRUD/只读内存溯源报表,无一写 AutomationLog,无一向七部门任一方推/收数据。(3) 前端 ops 页面与 api/ops.ts 完全无「接口/对接/推送/归档/追偿/减排/合规证明」概念。(4) 活体 AutomationLog 126 行,ruleKey 全部来自审批/招投标链,零 ops 相关;唯一含「运营」字样的行是 bid.win 建项目,detail 只是项目名「岳阳城乡污水处理厂运营服务项目」内嵌该词,并非运营部门接口。", "reEvidence": "需求 /Users/qiu/Desktop/ERP/requirements/_req_slices/15_运营管理中心__工业废水运营中心.txt:35-36 列七部门接口。引擎 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java fire() L109-128 关键词矩阵无 ops 分支,ruleKeyFor L677-688 ruleKey 全集无 ops/wastewater。三控制器纯 CRUD 无 AutomationLog 写入:WastewaterClientController.java、WaterQualityRecordController.java、WaterTraceController.java(全文已读)。前端 src/oa/api/ops.ts + src/oa/pages/ops/*.vue grep 七部门名/接口/对接/归档/追偿/减排 全 0 命中。活体:POST /api/oa/auth/login(admin/123456) 后 GET /api/oa/automation-logs 共 126 行,ruleKeys={receipt.invoice,contract.effectivate,contract.toSeal,payment.create,project.create,opp.toBid,bid.win.project,bid.win.contract,project.accept,project.toArchive,supplier.admit,seal.markUsed,bid.win},无任何 ops ruleKey;唯一含「运营」行为 bid.win 中标自动建档 project(项目名内嵌该词),非部门接口。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "1. 市场信息与商机管理", "verdict": "PARTIAL", "gap": "缺独立商机评估立项流程(战略/技术/资金/利润率初评→生成立项+指派负责人+风险点)、竞争对手库、阶段转化率自动统计、市场项目分析中标汇总、CrawlSource真实抓取并落地情报。", "severity": "med", "evidence": "Opportunity.java(domain)仅有 name/customer/projectType/amount/stage/probability/owner/source/stage 等字段,无任何评估/立项/风险点/战略-技术-资金-利润率初评字段;OpportunityController 无评估或立项端点,仅 CRUD + convert-bid。竞争对手分析:全库 grep 竞争对手/competitor 仅命中 DataSeeder 种子文案,无实体无控制器无页面。funnel.vue stageData 仅按 count 与 amount 聚合,条宽 = s.amount/maxAmount,全程无任何阶段间转化率(转化率)计算。市场项目分析(下浮率/分区域公司类型中标汇总):grep 下浮率/报价区间/公司类型 全空。CrawlSourceController.run() 用 System.nanoTime() 造 fetched(10..40)/screened/newIntel 随机计数并仅 save 一条 CrawlJob,从不创建 Intel 行(不落地情报/商机)。", "survives": true, "reNote": "缺口属实。市场/经营部\"市场信息与商机管理\"链确有 CRM 基础(商机 CRUD、情报→商机转化、商机→投标转化、销售漏斗),但 PARTIAL 描述列举的 5 项增强能力逐条核验均未实现:(1)独立商机评估立项流程——Opportunity 实体只有 name/stage/amount/probability/owner 等基础字段,无战略/技术/资金/利润率初评、无\"立项\"实体或状态、无风险点字段;convert-bid 只是据商机信息生成一张投标台账,并非多维评估+生成立项+指派负责人+风险点的工作流;全后端 grep 立项/利润率/风险点/appraisal 在 opportunity 相关代码零命中。(2)竞争对手库——无任何 Competitor 控制器/domain/repository/前端页,\"竞争对手\"仅作为一条种子 followup 的自由文本内容出现。(3)阶段转化率自动统计——funnel.vue 只按阶段聚合数量/金额并算总体赢单率(已赢单/已结案),并无相邻阶段的转化率(stage→stage)统计;intel/board.vue 的 convRate 是情报→商机比率,属另一指标。(4)市场项目分析中标汇总——仅 BusinessBiController.biddingStat() 对全部 Bid 做了笼统的中标/未中标/废标计数与总赢单率,属总览 BI,并非市场模块内按市场项目维度的中标汇总分析。(5)CrawlSource 真实抓取并落地情报——CrawlSourceController.run() 类注释与方法注释明写\"no real network crawling is performed\",用 System.nanoTime() 生成 10..40 的伪随机 fetched 数,screened≈60%、newIntel≈40%,只 save 一条 CrawlJob 批次记录,完全不创建任何 Intel 行(情报未落地);前端 crawl.vue 标题即标注\"(模拟)\"。综上 5 项全部缺失,PARTIAL 判定成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/CrawlSourceController.java:23-28,82-121 (明示\"no real network crawling\"+nanoTime 伪随机+只存 CrawlJob 不建 Intel); oa-backend/src/main/java/com/kaidi/oa/domain/Opportunity.java:22-52 (无评估/立项/风险点字段); oa-backend/src/main/java/com/kaidi/oa/web/OpportunityController.java:165-208 (convert-bid 仅生成投标台账非立项评估); oa-backend/src/main/java/com/kaidi/oa/web/IntelController.java:106-133 (convert-opportunity 仅情报转商机); oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java:264-283 (biddingStat 为全局 Bid 赢单率, 非市场项目维度中标汇总); web/ 目录无 Competitor/Initiation/Appraisal 控制器; grep 竞争对手 仅命中 seed/DataSeeder.java:1585 一条自由文本; grep 立项 在 opportunity 代码零命中(仅命中 RdProject 研发立项种子数据)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/intel/crawl.vue:2,48 (标注\"(模拟)\"); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/funnel.vue:30-47 (按阶段数量/金额+总体赢单率, 无阶段转化率); 全前端 grep 竞争对手/中标汇总/市场项目分析 零命中。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "2. 市场推广与活动策划(AI)", "verdict": "MISSING", "gap": "需求两条均为 AI 能力(资料生成多平台推广文案、数据报表AI复盘优化建议),系统完全无 AI/LLM 接入。", "severity": "med", "evidence": "全库 grep openai/llm/gpt/deepseek/qwen/anthropic/文案生成/aiAnalysis 后端零真实命中(仅 FileController 的无关变量);前端命中均为 display.ts 标签映射、css、富文本编辑器等假阳性,无任何 LLM 接入。campaign.vue 是 settingListStore('crm-campaign') 纯手填台账(活动主题/类型/预算/商机数/状态),无推广文案生成、无多平台版本、无数据报表AI复盘。", "survives": true, "reNote": "缺口属实:市场推广与活动策划模块的两条需求(资料生成多平台推广文案、数据报表AI复盘优化建议)均为 AI/LLM 能力,系统完全无任何 AI/LLM 接入。无法推翻。证据链:(1)后端 build.gradle 零 AI 依赖(无 openai/anthropic/spring-ai/langchain/dashscope 等),且 Java 源码零出站 HTTP 客户端(RestTemplate/WebClient/Feign/okhttp/HttpURLConnection 均无匹配),根本没有调用任何外部大模型的通道;(2)~90 个控制器中无 Marketing/Campaign/Content/Copy/AI 类控制器,service 目录仅 9 个(Auth/Authorization/FullTextSearch/Mention/NodeAssigneeResolver/Notification/Payment/TriggerRule/Workflow),无任何 AI/生成/复盘服务;(3)唯一的市场推广载体是前端 crm/campaign.vue,它只是 settingListStore 驱动的纯 CRUD 台账(字段=活动主题/类型/负责人/预算/日期/商机数/状态),既无\"生成推广文案\"也无\"AI 复盘优化建议\"按钮或逻辑;(4)全仓(后端+前端 app 源码)对 大模型/LLM/openai/anthropic/通义/文心/讯飞/AI生成/AI复盘 等关键词搜索仅命中 OFBiz 遗留页面目录里的 \"generate\" 子串噪声,无真实功能命中;(5)活体 127.0.0.1:8091 探测 ai/generate、campaign/ai、content/generate 等路径均 401(default-deny,路由不存在)。需求要求的两条核心能力均为生成式 AI,系统连最基本的 LLM 调用能力都不具备,判定 MISSING 成立。", "reEvidence": "oa-backend/build.gradle(无任何AI/LLM/HTTP客户端依赖); oa-backend/src/main/java/com/kaidi/oa(RestTemplate/WebClient/Feign/okhttp/HttpURLConnection 零匹配, JAVA-EXIT 1); oa-backend/src/main/java/com/kaidi/oa/service/(仅9个service,无AI/生成/复盘); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/campaign.vue(纯CRUD台账,字段theme/type/owner/budget/date/leads/status,无文案生成/AI复盘); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:283(campaign->/crm/campaign 仅 list 类型); 活体探测 ai/generate|campaign/ai|content/generate -> 401(路由不存在)" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "3. 招投标管理", "verdict": "PARTIAL", "gap": "缺招标文件/澄清/答疑/标书费/保证金缴退记录与截止提醒、投标决策会在线记录、标书协同编制版本控制批注、资质业绩库联动自动插材料、成本关联报价明细自动生成、合规审核+电子签章用印哈希、丢标原因案例库、保证金逾期催办。", "severity": "high", "evidence": "Bid.java 为扁平实体(projectName/bidNo/tenderee/controlPrice/bidAmount/deposit/bidMethod/status/dates/owner),deposit 仅一个金额字段,无缴纳方式/退还状态/逾期字段。bidding/ledger.vue 列即实体字段,无澄清/答疑/标书费/决策会列。grep 标书/投标决策/任务清单/丢标原因/案例库 全空。StandardCost/PriceItem 实体均无 bidId,无报价明细(直接费/间接费/利润/税金)实体,成本测算不回流 Bid。BidController 无 SealUse 打通、无电子签章/哈希。AlertController 仅对 milestone status=逾期 告警,无投标保证金逾期催办。", "survives": true, "reNote": "缺口属实。招投标模块(Bid)只实现了基础投标台账:实体 Bid.java 仅 16 个字段(projectName/bidNo/tenderee/projectType/controlPrice/bidAmount/deposit/bidMethod/status/bidDate/openDate/opportunityId/projectId/owner/orgUnit/createdAt);控制器 BidController 仅 CRUD + \"中标→自动建项目台账/总包合同草稿\"一条联动(chainWinBid)。前端只有 ledger.vue(台账) 和 board.vue(中标率看板) 两页。\n\n逐条核对缺口所列功能,全部缺失:\n1) 招标文件/澄清/答疑记录 — 全库无 \"标书\" 字样(grep 0 命中),无澄清/答疑实体或字段;DataSeeder 里 \"答疑/落标\" 仅是 CRM opportunityFollowup 的自由文本备注,非结构化招投标功能。\n2) 标书费/工本费 — 全库 grep 0 命中,无字段无接口。\n3) 保证金缴退记录 — 仅有单个金额字段 deposit,无缴纳/退还流水记录(无 depositPaid/depositRefund 等)。\n4) 截止提醒 — AlertController 注入了 8 个 Repo(PersonnelCert/Patent/ContractMilestone/Inventory/LabInstrument/SafetyCheck/Budget/FormInstance),唯独不含 BidRepository;Bid 的 openDate/bidDate 不被任何提醒扫描。\n5) 投标决策会在线记录 — grep 决策会/bidDecision 0 命中。\n6) 标书协同编制版本控制批注 — 0 命中(电子签章/版本只在 DesignDoc/DesignChange,与投标无关联)。\n7) 资质业绩库联动自动插材料 — Certification 实体独立存在但与 Bid 无任何外键/联动(无 bidId,TriggerRuleEngine/BidController 均不引用 Certification)。\n8) 成本关联报价明细自动生成 — PriceItem/StandardCost 存在但与 Bid 无关联,bidAmount 是单一手填数字,无明细行表。\n9) 合规审核+电子签章用印哈希 — SealUse 实体无任何 hash 字段(grep hash/digest/SHA 在 SealUseController/SealUse 0 命中),与投标无联动。\n10) 丢标原因案例库 — grep 丢标/失标/落标/lossReason 在代码 0 命中(仅 DataSeeder 自由文本)。\n11) 保证金逾期催办 — 无任何调度/Alert 扫描 deposit/openDate。\n\nPARTIAL 判定准确:基础台账已建,但所列 11 项专项能力全部未实现。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Bid.java (16字段, 无澄清/答疑/标书费/版本/丢标原因/哈希字段); oa-backend/src/main/java/com/kaidi/oa/web/BidController.java (仅CRUD+chainWinBid中标联动, 无决策会/资质/报价明细联动); oa-backend/src/main/java/com/kaidi/oa/repository/BidRepository.java (仅status/owner/orgUnit/opportunityId/projectId 五个finder); oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:42-66,104-197 (注入8个Repo均不含BidRepository, Bid日期不被提醒扫描); oa-backend/src/main/java/com/kaidi/oa/domain/SealUse.java (无hash字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/bidding/ (仅 ledger.vue + board.vue); ofbiz-framework/plugins/modern-ui/app/src/oa/api/bids.ts (仅 list/get/create/update/delete + 4个常量数组); 全库 grep \"标书\" 0命中, grep \"丢标/失标/决策会/标书费\" 在 *.java/*.vue/*.ts 0命中(仅DataSeeder自由文本备注)。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "4. 客户关系管理(CRM)", "verdict": "PARTIAL", "gap": "缺客户信用等级/合作历史/关键联系人/资质上传、A-B-C-D分级与授信及差异化审批权限、客户全景视图与定期维护计划、满意度调查→不满意转投诉、客户流失预警。", "severity": "high", "evidence": "Customer.java 仅 name/type/contact/phone/address/status 六字段,无信用等级/合作历史/关键联系人(生日职务偏好)/营业执照资质上传/分级A-B-C-D/授信额度。CustomerController 为纯 CRUD。客户满意度:grep 满意度 命中均为 goal/space.vue 目标文案、DataSeeder 的「OA满意度调查」、canteen 等无关页,无项目交付触发→评分→不满意转投诉。客户流失预警:grep 流失/churn 仅命中 knowledge/map.vue,AlertController 无 6 月无互动预警。OpportunityFollowup 挂 opportunityId 不挂 customerId(跟进不挂客户)。", "survives": true, "reNote": "缺口属实。统一CRM 模块只有商机/漏斗/推广活动/资质业绩库/办事处资产五块,客户主数据(Customer 实体与 CustomerController)字段仅 name/type/contact/phone/address/status,完全没有信用等级、A-B-C-D 分级授信、差异化审批权限、资质上传、关键联系人、合作历史、客户全景(360)视图、定期维护计划。Survey 是通用投票引擎,无满意度→不满意→转投诉的转化链路;funnel 只统计赢/输单,无客户流失预警。全代码库定向 grep 这些特性关键字零命中实现(仅命中 CSS 规则、知识库文档名字符串、AlertScheduler 里无关的英文注释)。", "reEvidence": "后端 Customer.java(domain) 全部字段=id/name/type/contact/phone/address/status,无任何信用/等级/资质/联系人/历史字段;CustomerController.java 仅 CRUD,无分级/授信/审批逻辑。前端 oaModules.ts:281-285 CRM 仅 5 个子页(opportunity/funnel/campaign/qualperf/branchadmin);customer.vue 列表/表单只展示同样 6 字段。qualperf.vue 是公司级资质业绩静态清单(settingListStore mock)非按客户的资质上传。Survey.java/SurveyController.java 为通用问卷投票,无 complaint/转投诉逻辑;唯一\"投诉\"出现在 DataSeeder.java:2604 一条静态 QMS 种子,与满意度调查无联动。funnel.vue:42-47 仅算 lost/winRate 无客户流失预警。全库 grep creditLevel|授信|客户分级|客户全景|customer360|churn|流失预警|差异化审批 仅命中 knowledge/map.vue:146 的文档名\"客户分级管理办法\"字符串与 AlertScheduler.java:30 无关英文注释,无实现。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "5. 客户跟进与转化(AI)", "verdict": "MISSING", "gap": "需求两条均为 AI(自动生成话术与报价单初稿、AI整理沟通记录提炼需求异议点),系统无 AI 接入。", "severity": "med", "evidence": "与模块2同源:全库无任何 AI/LLM 接入(grep 后端零真实命中、前端全假阳性)。无按行业/需求生成跟进话术与报价单初稿,无AI整理沟通记录提炼需求/异议点;OpportunityFollowup 仅 type/content/nextPlan 手填字段。", "survives": true, "reNote": "缺口属实。我尽力推翻但找不到任何 AI 实现。客户跟进与转化链的两条需求都是 AI 能力(①自动生成话术与报价单初稿 ②AI 整理沟通记录提炼需求/异议点),系统完全没有 AI 接入:(1) OpportunityFollowupController/OpportunityController 全是纯 CRUD 持久化,convert-bid 只是字段拷贝生成投标台账,无任何生成/总结逻辑;(2) OpportunityFollowup 实体只有手填字段 type/content/followDate/operator/nextPlan,无 AI 派生字段;(3) 全后端 grep openai/anthropic/deepseek/qwen/讯飞/kimi/zhipu/completions/embedding/话术/报价单初稿/异议点/智能生成 零命中;(4) 前端 src 同口径 grep 零命中,CRM 页面(opportunity.vue/campaign.vue/funnel.vue/crm.ts)无 AI 功能;(5) oa-backend/pom.xml 与前端 package.json 均无任何 AI/LLM SDK 依赖;(6) 后端无 RestTemplate/WebClient/HttpClient/OkHttp 等可调外部模型端点的 HTTP 客户端,也无 *AiService*/*Llm*/*Assist* 类。话术/异议点字样在 node_modules 与 requirements 文档外仅出现在一个日志文件里,非代码。结论 real=true。", "reEvidence": "后端控制器 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/OpportunityFollowupController.java(纯 CRUD,create 仅 save followupRepo)与 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/OpportunityController.java(convert-bid 仅字段拷贝);实体 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/OpportunityFollowup.java 仅手填字段;前端 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/opportunity.vue、campaign.vue、funnel.vue、/oa/api/crm.ts 均无 AI;构建文件 oa-backend/pom.xml 与 app/package.json 无任何 AI/LLM 依赖。全仓 grep 关键词(openai|anthropic|deepseek|qwen|讯飞|kimi|话术|报价单初稿|异议点|completions|embedding) 在源码中零命中。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "6. 经营合同管理(商务签订与跟踪)", "verdict": "PARTIAL", "gap": "缺合同多级审批流接 WorkflowService、版本锁定/电子签名、结构化回款计划与节点临期主动提醒、合同变更走重新审批。", "severity": "med", "evidence": "ContractController create/update 直接 set status,全类无 WorkflowService/FormInstance 引用(grep 确认),无经营部→法务→财务→分管→总经理多级审批节点流转。无版本锁定/电子签名字段。回款计划:仅 ContractMilestone(name/dueDate/amount/status) 通用节点,无预付款/进度款/质保金结构化;AlertController 仅在 status=逾期 时 danger 告警(反应式),无应付/应开票临期主动提醒。ContractChangeController.create 可直接传 status=已生效即回写合同金额/终止,无重新审批流。", "survives": true, "reNote": "缺口属实,判定 PARTIAL 成立。该模块有合同台账(Contract/ContractController)、合同变更(ContractChange)、履约节点(ContractMilestone)、模板(ContractTemplate)等结构,且存在一条经 WorkflowService 的合同审批联动路径,但四项具体短板里有三项确缺、第一项也仅\"松耦合\"地部分实现:\n\n1) 合同多级审批接 WorkflowService —— 部分实现但非结构化耦合。前端确有多节点合同审批模板 hq-contract.ts「总部合同审批表单」(发起者→信息中心→部门主管→董事长→CEO并行→知会归档)走通用 FormInstance/WorkflowService 引擎;办结后 TriggerRuleEngine.ruleEffectivateContract(第239行)按表单合同编号/名称匹配既有合同台账并置「已生效」,再链式生成待用印单。但 Contract 实体与 ContractController 里没有任何指向审批实例的字段(grep approvalInstanceId/instanceId 为空),也没有\"提交审批\"端点——合同是 POST 直建、status 任填;审批只是一张独立通用表单事后按名称模糊命中才回写状态。属松耦合,非\"合同记录本身驱动多级审批\"。\n\n2) 版本锁定/电子签名 —— 确缺。Contract.java 无 version/signature/lock 任何字段(唯一 version 在 ContractTemplate 上,是模板版本,无关;signDate 仅是字符串)。econtract.vue 的「已签署/待签署」是 HR 劳动合同的纯前端 mock,无后端,且非经营合同。\n\n3) 结构化回款计划+节点临期主动提醒 —— 基本确缺。ContractMilestone 有 dueDate/amount/status 结构,但 AlertController.aggregate()(第130-137行)只在 milestone.status 已是「逾期」时才出预警;不像 PersonnelCert/Patent/LabInstrument 那样按日期算\"临期/即将到期\"窗口,AlertScheduler 也只刷新证件到期、不刷新 milestone。即只有\"靠人工置逾期\"的被动告警,无 dueDate 驱动的临期主动提醒;且无独立\"回款计划\"结构。\n\n4) 合同变更走重新审批 —— 确缺。ContractChangeController.create(第72-119行)直接接收客户端传入的 status(草稿/审批中/已生效/已驳回),status=已生效 时立即回写合同金额/状态,全程无 WorkflowService 审批闸(仅 FINANCE 角色门槛),调用方可直接 POST 已生效。CHANGE_STATUSES 只是下拉枚举,无审批状态机。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Contract.java (无 version/signature/lock 字段); oa-backend/src/main/java/com/kaidi/oa/web/ContractController.java (POST 直建、status 任填、无提交审批端点); oa-backend/src/main/java/com/kaidi/oa/web/ContractChangeController.java:72-119 (status 客户端直传、已生效即回写、无 WorkflowService); oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:129-137 (milestone 仅在「逾期」时告警,无临期计算); oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java (只刷新 PersonnelCert,不刷新 ContractMilestone); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:124-262 (ruleEffectivateContract 按名称模糊匹配置已生效——唯一的 WorkflowService 联动路径,松耦合); ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/hq-contract.ts (多节点合同审批模板,但与合同记录无结构绑定); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/econtract.vue (签署状态为 HR 纯前端 mock); grep approvalInstanceId/instanceId on Contract* = 空; grep 提交审批/approv on ledger.vue = 空" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "7. 经营计划与预算", "verdict": "PARTIAL", "gap": "缺经营计划实体与按区域/部门目标分解、计划执行完成率看板与偏差预警、费用报销自动扣减预算与超预算预警。", "severity": "high", "evidence": "WorkPlanController 为个人工作计划(period 本周/本月,审阅流 待提交/待审阅),非经营目标编制;grep 无新签合同额/营业收入/市场占有率目标实体或按区域业务部门分解。计划执行跟踪 完成率看板/偏差>10%预警 无。Budget.java 有 budgetAmount/actualAmount,create 时 actual>budget 自动置「超支」,但 actualAmount 由请求手填,无费用报销(Expense)自动扣减预算联动(grep 无报销→预算回写)。", "survives": true, "reNote": "缺口属实,无法推翻。逐项核验三个子诉求:\n\n(1) 经营计划实体 + 按区域/部门目标分解 —— 不存在。唯一的\"计划\"实体是 WorkPlan(oa-backend/.../domain/WorkPlan.java),字段仅 title/owner/ownerId/period/status/content,是个人日/周/月工作计划(goal/plan.vue 也仅日报/周报/月报+审阅流),既无目标(target)字段、也无区域/部门字段、更无分解逻辑。全前后端 grep \"经营计划/目标分解/按区域分解/部门目标\" 零命中;region 字段只出现在 Intel/CrawlSource/PriceItem,与计划/预算分解无关。\n\n(2) 计划执行完成率看板 + 偏差预警 —— 不存在(按计划目标维度)。现有 budget/board.vue 是\"成本看板\",其\"整体执行率\"= 已发生成本/预算额(execRate = actual/budget),\"超支预警\"是预算超支,衡量的是预算 vs 实际成本,并非\"计划完成率 vs 目标\",也无对计划目标的偏差预警。\n\n(3) 费用报销自动扣减预算 + 超预算预警 —— 不存在。finance/expense.vue 是纯 mock 的 settingListStore('finance-expense') KV CRUD(种子 3 行硬编码),与 Budget 实体零关联;不查预算、不累加 actualAmount、不触发超预算告警。BudgetController 只有 list/get/create,没有任何 update/PATCH 端点,actualAmount 仅在 create 时一次性写入;后端 grep \"扣减/deduct\" 零命中;TriggerRuleEngine/WorkflowService 内无任何预算扣减联动。\n\n存在的相关实现(解释为何判 PARTIAL 而非完全缺失):Budget 实体含 budgetAmount/actualAmount,且 create 时 actual>budget 自动置\"超支\"状态;board.vue 有预算执行率与预算超支预警面板。但这些只覆盖\"预算 vs 实际成本\"一侧,三条核心诉求(经营计划实体+区域/部门目标分解、计划完成率看板+偏差预警、报销自动扣减预算+超预算预警)均无实现。", "reEvidence": "后端:oa-backend/src/main/java/com/kaidi/oa/domain/WorkPlan.java(仅 title/owner/period/status/content,无目标/区域/部门/分解);oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java(仅 list/get/create,无 update/PATCH,actualAmount 仅 create 时写入,84-88 行创建时一次性判超支);oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java;oa-backend/src/main/java/com/kaidi/oa/repository/BudgetRepository.java(仅 findByProjectId/Element/Status,无扣减);service/TriggerRuleEngine.java、service/WorkflowService.java grep \"budget/预算/扣减/deduct\" 零命中。前端:ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/board.vue(execRate=totalActual/totalBudget,超支预警基于预算,非计划完成率/目标偏差);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/plan.vue(日/周/月报+审阅流,无目标分解);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/expense.vue(settingListStore mock CRUD,与 Budget 零关联,不扣减不告警);ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts(budget 模块仅 ledger/standardcost/costcenters/pricelib/bom/costcompare/board,goal 模块仅 space/project/project360/plan/schedule/timeview/leadertrip,均无经营计划/目标分解/完成率看板)。全仓库 grep \"经营计划|目标分解|完成率看板|偏差预警|自动扣减预算|超预算预警\" 零命中。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "8. 经营数据分析与报表", "verdict": "PARTIAL", "gap": "缺投标分析细分维度与丢标统计投入产出比、客户分析报表(贡献度/流失率/满意度趋势)、质保金到期专项、经营业绩考核对接绩效。", "severity": "med", "evidence": "BusinessBiController.biddingStat() 仅算全局 winRate=won/decided,无按区域/行业/客户/报价区间细分(grep 报价区间/中标率区域 全空),无丢标原因统计、无投入产出比。客户分析:grep 客户贡献度/毛利/流失率 全空,无客户分析报表。合同分析:AlertController 仅 milestone 逾期计数,无质保金到期专项报表。经营业绩考核:grep 经营业绩考核/考核得分/绩效对接 全空,完全缺失。", "survives": true, "reNote": "缺口属实,PARTIAL 判定准确。已实现的是\"基础\"部分:BusinessBiController.biddingStat 提供 BiddingStat(bidCount/wonCount/winRate),且 ReportDefinitionController 的通用自助报表把 bid 源开放了 projectType/bidMethod/status/tenderee/owner/orgUnit 维度与 controlPrice/bidAmount/deposit 度量(可做基础投标细分维度聚合)。但描述里逐项点名的精细分析全部缺失:(1) 丢标投入产出比——Bid 实体根本没有 cost/投入/成本字段,全仓库无任何 ROI/投入产出计算,只有 winRate;(2) 客户分析报表(贡献度/流失率/满意度趋势)——Customer 是裸实体(name/type/contact/phone/address/status),CustomerController 纯 CRUD 无任何分析端点,后端前端全文搜不到 churn/流失率/贡献度/满意度趋势 的字段或计算;(3) 质保金到期专项——\"质保金\"只在前端一个进度付款模板里作为付款类型下拉选项出现,\"质保到期\"只是 DataSeeder 里 ContractMilestone 的自由文本节点名,没有任何质保金台账或到期专项分析;(4) 经营业绩考核对接绩效——无任何绩效/KPI 考核模块,\"绩效考核\"仅出现在 knowledge mock 文档标题等无关处。前端 crm/funnel(销售漏斗按阶段聚合)、crm/qualperf(资质业绩库CRUD)、report/analysis(通用看板)均不覆盖上述任一项。", "reEvidence": "已实现的基础部分: oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java:122-129(BiddingStat 仅暴露 bidCount/wonCount/winRate) 与 :265-282(内部算 lostCount/voidCount 但不外露、无投入产出); oa-backend/src/main/java/com/kaidi/oa/web/ReportDefinitionController.java:170-184(bid 源维度/度量白名单, 度量只有 controlPrice/bidAmount/deposit, 无 cost). 缺口证据: oa-backend/src/main/java/com/kaidi/oa/domain/Bid.java:26-58(无 cost/投入/产出/ROI 字段); oa-backend/src/main/java/com/kaidi/oa/domain/Customer.java:19-31(仅 6 个基础字段, 无贡献/流失/满意度); oa-backend/src/main/java/com/kaidi/oa/web/CustomerController.java:33-88(仅 list/get/create/delete, 无分析端点); 全后端搜 流失/churn/贡献度/满意度趋势/质保金(deposit)/绩效考核对接 仅命中 DataSeeder 种子文本(milestone \"质保到期\"、survey \"OA满意度调查\")与无关注释/收藏文档标题; 前端搜同关键词仅命中 src-progress-payment.ts:92(付款类型选项'质保金')与 knowledge mock 文档标题, 无任何分析页实现; 相关前端页 oa/pages/crm/funnel.vue(销售漏斗)、crm/qualperf.vue(资质业绩库CRUD)、report/analysis.vue(通用 overview 看板)均不实现所列分析。" }, { "area": "市场部 / 经营部/市场部 / 经营部", "module": "9. 资质与业绩库管理", "verdict": "PARTIAL", "gap": "缺资质业绩库与真实证书实体打通、到期自动预警驱动投标可用性检查、业绩自动匹配、奖项荣誉独立实体、自动更新联动。", "severity": "med", "evidence": "qualperf.vue 是 settingListStore('crm-qualperf') 静态键值表(name/type/field/amount/year/usable),与真实 Certification/PersonnelCert 实体完全脱节。CertificationController 虽有 deriveStatus 读时按 expireDate 推导即将到期/已过期,但 qualperf 页不消费它,且投标时无自动检查证书可用的联动(BidController 无 cert 校验)。业绩库自动匹配类似业绩、奖项荣誉独立实体、自动更新机制 grep 全空。", "survives": true, "reNote": "缺口属实。资质与业绩库管理为多个互不打通的静态 CRUD 台账,缺失全部声称的联动能力。(1) 真证书未打通:CRM「资质与业绩库」页 crm/qualperf.vue 走 settingListStore('crm-qualperf',...),数据落在通用 biz_record 表的 dataJson(/api/oa/biz/{type}),与真实 Certification 实体(三体系认证,有 expireDate+派生有效/即将到期/已过期)完全无引用、无 join;hr/qualification.vue 同样是独立 biz_record mock。(2) 到期预警驱动投标可用性:qualperf 的 usable「可用于投标(是/否)」是手填 select,不由任何到期日派生;BidController/AlertController/TriggerRuleEngine/Bid 实体/所有 bidding 页面对 certification|资质|业绩|usable 零引用,无任何到期→投标可用性校验联动。(3) 业绩自动匹配:业绩案例只是 qualperf 里的一行静态记录,无与招投标/项目的自动匹配逻辑;ops/performance.vue 是水厂运营 KPI,非项目业绩。(4) 奖项荣誉独立实体:无后端实体,仅 culture/award.vue「项目评优激励」(优秀项目/先进个人,biz_record),属文化评优非投标用奖项荣誉库且不与 qualperf 关联。(5) 自动更新联动:无任何 trigger/automation 将证书到期、业绩、奖项回写 usable 或下游。判定 PARTIAL 成立。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/qualperf.vue (settingListStore('crm-qualperf'), usable 为手填 select), hr/qualification.vue, culture/award.vue (项目评优激励), ops/performance.vue (水厂KPI); api/settingList.ts (走 /biz/{type} 通用 biz_record CRUD). 后端: oa-backend/src/main/java/com/kaidi/oa/domain/Certification.java + web/CertificationController.java (真证书实体+派生到期态,独立 /api/oa/certifications,与 qualperf 无打通); domain/BizRecord.java + web/BizRecordController.java (qualperf 实际落地为 dataJson 行). 反证: grep certification|资质|业绩|qualperf|usable 在 BidController.java/AlertController.java/service/TriggerRuleEngine.java/domain/Bid.java/pages/bidding/ 均为空——证实无到期驱动投标可用性、无业绩自动匹配、无自动更新联动。" }, { "area": "市场部/办事处", "module": "1. 市场与商机管理", "verdict": "LOGIC_GAP", "gap": "商机报备『系统自动查重』完全缺失;情报『自动采集』为伪随机模拟+人工触发,无定时调度与真实网络抓取,需求要求的『系统自动采集区域内项目/政策/竞争对手信息』未实现。", "severity": "high", "evidence": "OpportunityController.create()(web/OpportunityController.java:84-110)仅做 name 非空+amount 非负+probability 0-100 校验,无任何重名/同项目冲突查重;全库 grep 防冲突/查重/duplicate 仅命中 Meeting 会议室冲突、Supplier 信用代码查重、Intel→商机幂等等无关场景,商机报备无 existsByName 之类检测。情报采集:CrawlSourceController 确有 POST create 与 POST /{id}/run(初判说『CrawlJobController无POST/无run』指错了控制器),但 run() 注释明示『simulated run...no real network crawling is performed』,fetched 数由 System.nanoTime() 伪造,operator 写死『系统RPA』;全库唯一的 @Scheduled 是 AlertScheduler 的预警扫描,无任何 cron/爬虫/HttpClient/RestTemplate 拉取真实数据。", "survives": true, "reNote": "缺口属实,无法推翻。(1) 商机报备『系统自动查重』完全缺失:OpportunityController.create() 只做 name非空/金额≥0/概率0-100 校验,未对已有商机按名称/客户/项目做任何 existsBy/findByName 重复检测;OpportunityRepository 仅有 findByStage/findByOwner/findByOrgUnit,无查重方法。代码库其他模块(SupplierController 信用代码查重、DataCenterController 治理扫描)证明查重能力存在但商机处确实没接,是真实逻辑缺口而非框架限制。controller 里的『请勿重复转换』只是 convert-bid/convert-opportunity 的幂等闸,不是报备查重。(2) 情报『自动采集』为伪随机模拟+人工触发:唯一采集入口 CrawlSourceController.run() 自带 Javadoc 明示『no real network crawling』,fetched=10+(nanoTime+keywordCount*7)%31 纯合成,screened/newIntel 固定60%/40%比例,且只由 @PostMapping(/{id}/run) 人工触发,无定时调度,也不真正写入任何 Intel 行。全后端唯一 @Scheduled 是 AlertScheduler.pushAlerts()(证件到期预警),与 crawl/intel/opportunity 毫无关联(task/、service/ 全无相关引用)。无任何真实网络抓取客户端:jsoup 仅用于 HtmlSanitizer 防 XSS,全代码无 HttpClient/RestTemplate/WebClient/openConnection 用于抓取外部内容。前端也无补偿逻辑(仅有不相关的申报步骤 auto-collect)。需求要求的『系统自动采集区域内项目/政策/竞争对手信息』确未实现。", "reEvidence": "商机查重缺失: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/OpportunityController.java:80-107 (create 无查重); OpportunityRepository.java 仅 findByStage/findByOwner/findByOrgUnit。对照存在查重: SupplierController.java:54-57,88-90。\n情报采集模拟: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/CrawlSourceController.java:82-121 (Javadoc 'no real network crawling'; fetched=10+(nanoTime+keywordCount*7)%31; @PostMapping /{id}/run 人工触发); CrawlJobController.java:15-19 ('simulated run'); IntelController.java:72-94 (手工 POST)。\n无相关调度: 全后端唯一 @Scheduled = task/AlertScheduler.java:72 (证件预警, 与 crawl/intel/opportunity 无引用)。\n无真实抓取: jsoup 仅 common/HtmlSanitizer.java (XSS 清洗); grep 全无 HttpClient/RestTemplate/WebClient/openConnection。\n前端无补偿: oa/、components/erp/ 无 商机查重/情报自动采集 实现 (auto-collect 命中仅 governance.ts:69 申报步骤, 无关)。" }, { "area": "市场部/办事处", "module": "2. 客户关系管理(CRM)", "verdict": "PARTIAL", "gap": "客户档案缺『设计院』分类与客户分级(level/grade);nextPlan 无到期提醒/预警机制;无移动端现场录入专用入口。", "severity": "med", "evidence": "Customer 实体(domain/Customer.java)仅 name/type/contact/phone/address/status,type 枚举注释为『政府/企业/事业单位』——无『设计院』、无 level/grade/分级字段;CustomerController 的 Create/Update 记录亦无分级字段。下次跟进:OpportunityFollowup 有 nextPlan 字段但纯文本,AlertScheduler.pushAlerts() 只刷新 PersonnelCert 到期与 FormInstance 超时,grep followup/nextPlan/跟进 在 AlertController/AlertScheduler 零命中,无到期提醒/预警。移动端:mobile/workbench.vue 仅有 link 快捷入口『商机→/crm/opportunity』,无客户/商机现场录入专用通道。", "survives": true, "reNote": "缺口属实,三个子项全部成立,无法推翻。(1)客户档案缺『设计院』分类与客户分级:后端 domain/Customer.java 与 web/CustomerController.java 字段仅 name/type/contact/phone/address/status,type 注释与种子数据(DataSeeder.java:1202-1210)枚举只有 政府/企业/事业单位,无『设计院』;全 Customer 实体无任何 level/grade/等级 字段;活体 GET /api/oa/customers 实测返回也只有上述6字段。前端 masterdata.ts 的 Customer 接口同样无 level/grade。全前端 src 内『设计院』0 处命中(仅 expert 专家库种子里出现,与客户分类无关)。(2)nextPlan 无到期提醒/预警:OpportunityFollowup.nextPlan 仅作纯文本字符串保存(domain/OpportunityFollowup.java:33),opportunity.vue 仅原样渲染『下一步:{{f.nextPlan}}』(行299),无日期解析/比对;统一预警引擎 AlertController.aggregate() 只聚合 证件/专利/履约/库存/仪器/安全隐患/审批超时/成本超支 8 源,完全不含商机跟进 nextPlan;移动工作台 alerts 同样不含 nextPlan。(3)无移动端现场录入专用入口:唯一移动页 mobile/workbench.vue 只有 待办/预警/进度填报 三 tab + 快捷查询,CRM 仅一个『商机』quickLink 跳到桌面版 /crm/opportunity,无现场拜访/打卡/客户档案现场录入的移动专用入口。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Customer.java:21-31 (字段仅6个,无level/grade); oa-backend/src/main/java/com/kaidi/oa/web/CustomerController.java:20,44-47 (type=政府/企业/事业单位,CreateCustomerRequest 无分级字段); oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:1202-1210 (客户种子type只有三类,无设计院); oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:98-204 (聚合8源,无opportunity/nextPlan); oa-backend/src/main/java/com/kaidi/oa/domain/OpportunityFollowup.java:33 (nextPlan纯String); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/opportunity.vue:299,310 (nextPlan仅文本渲染/输入,无到期逻辑); ofbiz-framework/plugins/modern-ui/app/src/oa/api/masterdata.ts:61-69 (前端Customer接口无level/grade); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mobile/workbench.vue:110-119 (quickLinks商机仅跳桌面/crm/opportunity,无现场录入入口); 活体 GET /api/oa/customers 返回字段实测=id/name/type/contact/phone/address/status; 全前端src grep『设计院』=0命中。" }, { "area": "市场部/办事处", "module": "3. 招投标与合同管理", "verdict": "PARTIAL", "gap": "投标保证金缴纳/退还闭环未建模(无退还状态/日期);无独立回款计划表;标书编制无专门承载。", "severity": "med", "evidence": "Bid 实体(domain/Bid.java)保证金只有单个 BigDecimal deposit 字段(line 40),无 refund/return/缴纳日期/退还状态/退还日期;前端 bidding/ledger.vue 也只渲染一个『保证金』列与录入项,无退还字段。全库 grep refund/退还 零命中(仅 seed 里『保证金』作为付款类型字符串)。回款:grep 回款计划/收款计划 在前端零命中,回款仅靠 ContractMilestone 里程碑应履约金额,无独立回款计划表。标书编制确无专门承载。", "survives": true, "reNote": "缺口属实,三项均未实现,无法推翻。招投标模块的全部承载为:后端 domain/Bid.java + web/BidController.java + repository/BidRepository.java;前端 oa/api/bids.ts + oa/pages/bidding/ledger.vue(投标台账)+ board.vue(投标看板),oaModules.ts 仅注册这两个子页。逐项核验:(1) 保证金缴纳/退还闭环未建模——Bid 实体只有单一金额字段 `private BigDecimal deposit`(Bid.java:40),无 depositPaid/缴纳日期/refundStatus/退还状态/退还日期 任何字段;前端 ledger.vue 也只把 deposit 当一个 number 录入/展示。整库 grep 退还/退回/退保/refund/refundDate/refundStatus 在招投标域零命中(命中的\"退回\"全是 WorkflowService 审批退回节点,与保证金无关)。(2) 独立回款计划表不存在——无 RepaymentPlan/CollectionPlan/回款计划 任何实体、控制器、仓库或前端页。(3) 标书编制无专门承载——无 BidDocument/TenderDoc/标书/投标文件 任何实体或页面,招投标仅有台账+看板两页。中标后联动(chainWinBid)只建项目台账+总包合同草稿,与保证金退还/回款计划/标书均无关。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Bid.java:40 (唯一 deposit 字段,BigDecimal,无任何退还/缴纳状态或日期伴随字段);同文件 28-58 列出全部字段,确认无回款/退还/标书相关列。oa-backend/src/main/java/com/kaidi/oa/web/BidController.java:78-151 (CreateBidRequest/UpdateBidRequest 与 deposit 处理,无退还动作端点);chainWinBid 158-192 仅建 Project+Contract 草稿。oa-backend/src/main/java/com/kaidi/oa/repository/BidRepository.java (仅 status/owner/orgUnit/opportunityId/projectId 查询,无退还/回款方法)。前端 ofbiz-framework/plugins/modern-ui/app/src/oa/api/bids.ts:7-26 (Bid 接口字段无 refund/repayment/标书);oa/pages/bidding/ledger.vue:35,76 与 board.vue (仅展示 deposit 金额);data/oaModules.ts:289-295 (bidding 仅 ledger+board 两子页)。全仓 grep 退还|退回|退保|refund|回款计划|repaymentPlan|collectionPlan|标书编制|投标文件|tenderDoc 在招投标域零命中。" }, { "area": "市场部/办事处", "module": "5. 费用与预算控制", "verdict": "LOGIC_GAP", "gap": "报销无商机/项目关联字段;超预算预警未在报销流程联动校验;备用金(借款/核销)完全缺失。", "severity": "high", "evidence": "expense-reimburse 模板(seed/TemplateSeedData.java:221-244)字段仅 applicant/reimburseDept/expenseType/amount + expenseItems 子表,无 opportunityId/projectId 关联字段(grep 在该文件零命中)。超预算预警:BudgetController 仅在自身 create 时把 actualAmount>budgetAmount 的记录 status 设为『超支』;WorkflowService grep budget/预算 零命中,报销审批流不读预算余额、不拦截/预警。备用金:grep 备用金/借款/核销/petty/imprest/advance 后端无任何实体或控制器(仅 voucher 凭证摘要字符串『提现备用金』),FundPool 是资金池台账。finance/expense.vue 用 settingListStore('finance-expense') mock 种子。", "survives": true, "reNote": "缺口属实,三条全部成立,未能推翻。(1) 报销无商机/项目关联:报销页 finance/expense.vue 是纯 mock MasterDataPage,字段仅{报销人,部门,费用类型,金额,报销日期,状态},无商机/项目字段;Payment 实体有 contractId/projectId 但无 opportunityId,TriggerRuleEngine.ruleCreatePayment 仅从匹配到的合同回填 contractId/projectId,从不从报销表单取项目,且全无商机概念。(2) 超预算预警未在报销流程联动校验:BudgetController 仅在「新建预算」时按该行自身 actualAmount>budgetAmount 把本行 status 置「超支」;BusinessBi 仅统计「超支」行数做看板。PaymentController/WorkflowService/PaymentService 创建报销/付款前从不查 budgetRepo,无任何超预算预检或拦截。(3) 备用金(借款/核销)完全缺失:后端无 Loan/Advance/PettyCash/Borrow/WriteOff 任何实体或控制器,仅有无关的 RdExpenseController(研发费归集)、DataSeeder 里一条静态凭证字符串「提现备用金」、及无关的档案借阅模板 src-archive-borrow.ts。", "reEvidence": "报销页(纯mock,无商机/项目字段): ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/expense.vue:6-27。Payment实体无opportunityId: oa-backend/src/main/java/com/kaidi/oa/domain/Payment.java:27-50。报销自动建付款单不取项目、无商机、无预算校验: oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:147-180。预算超支仅建预算时判本行、与报销流程无联动: oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java:84-88。超支仅供BI计数: oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java:187-205。PaymentController/WorkflowService/PaymentService 无 budgetRepo 引用(grep空)。备用金/借款/核销实体与控制器全无(grep 仅命中无关 RdExpenseController、DataSeeder.java:2865「提现备用金」凭证串、src-archive-borrow.ts 档案借阅)。" }, { "area": "市场部/办事处", "module": "6. 行政与资产管理", "verdict": "PARTIAL", "gap": "车辆/物资领用/办事处信息存在但仅前端 mock(键值表)非真实后端实体;无统一资产卡、无租赁合同专项、无领用单流程。", "severity": "med", "evidence": "对初判『无车辆/vehicle承载、无领用流程』有部分纠正:前端确有 oa/pages/admin/vehicle.vue『车辆管理』(车牌/车型/用途/状态/用车人/出车日期)与 oa/pages/admin/affairs.vue『行政事务台账』含『物资领用』事项类型,crm/branchadmin.vue 办事处信息。但三者均为 settingListStore('admin-vehicle'/'admin-affairs'/'crm-branchadmin') mock 种子,仅键值表持久化,无专用后端实体/CRUD 接口。办事处租赁仅 branchadmin 里一行 mock,无专项合同;固定资产 ItAsset 仅 IT 资产,电脑/车辆/家具未统一成资产卡;物资领用是台账非领用单流程。", "survives": true, "reNote": "缺口判定 PARTIAL 总体成立,但描述中最核心、最具体的那句\"仅前端 mock(键值表)非真实后端实体\"是错的,需更正。三个页面——admin/vehicle.vue(车辆)、admin/affairs.vue(含\"物资领用\")、crm/branchadmin.vue(办事处行政与资产)——都通过 settingListStore 走 /api/oa/biz/{type} 真实 REST,落到后端 BizRecord JPA @Entity(biz_record 表)行级持久化,并非键值/settings blob。我在活体 :8091 实测:POST admin-vehicle 一行返回 id:7,GET 读回成功,DELETE 后消失——真实增删改查持久化。BizRecordController 与 BizRecord 的 Javadoc 也明确写\"替代早期把整张列表当一个 settings KV blob 的做法\"。因此\"非真实后端实体\"不实。\n\n但缺口的其余结构性断言确实成立,故整体仍为 PARTIAL(real=true):(1)无统一资产卡——只有 ItAsset(信息部 IT 资产)这一专用实体带资产卡字段,作用域限 IT,车辆/办公固定资产仍只是 biz_record 通用行,无跨域统一资产卡;(2)无租赁合同专项——Contract.type 仅 经营/成本/采购合同,无\"租赁\"类型或专项;(3)无领用单流程——物资领用只是 affairs.vue 的一行扁平台账,无领用单审批工作流模板(唯一关键词命中是付款模板里无关的\"运输车辆权属证明\"附件字段)。综上:把\"mock 键值表\"改正为\"真实 biz_record 后端实体\"后,缺口降级为\"数据已真实持久化,但缺统一资产卡/租赁合同专项/领用单专项流程\",PARTIAL 判定依然站得住。", "reEvidence": "后端真实实体(推翻\"mock 键值表\"):\n- oa-backend/.../domain/BizRecord.java —— @Entity @Table(name=\"biz_record\"),行级持久化,Javadoc 明言替代 settings KV blob。\n- oa-backend/.../web/BizRecordController.java —— @RequestMapping(\"/api/oa/biz\"),按 {type} 真 CRUD,(type,id) 防跨台账越改/越删。\n- 前端 settingList.ts —— settingListStore 注释\"真后端行级持久化\",走 /biz/{type},非 settings blob。\n- 三页面均用此 store:oa/pages/admin/vehicle.vue(key=admin-vehicle 车辆), oa/pages/admin/affairs.vue(key=admin-affairs,createFields 含\"物资领用\"选项), oa/pages/crm/branchadmin.vue(key=crm-branchadmin 办事处行政与资产)。\n- 活体 :8091 实测:POST /api/oa/biz/admin-vehicle -> {id:7} ;GET 读回 [{id:7,...}] ;DELETE /admin-vehicle/7 -> 列表空。证明真实持久化,非前端 mock。\n\n成立的结构性缺口:\n- 无统一资产卡:仅 ItAsset.java/ItAssetController.java(信息部 IT 资产)有专用资产卡字段,无跨车辆+办公固定资产的统一资产卡实体;车辆/办事处资产仍走通用 biz_record。\n- 无租赁合同专项:domain/Contract.java type 仅\"经营合同/成本合同/采购合同\",无租赁类型。\n- 无领用单流程:物资领用是 affairs.vue 一行扁平台账,无审批工作流;grep 领用/requisition 在 engine/templates 仅命中无关附件字段(src-progress-payment.ts:190 运输车辆权属证明)。" }, { "area": "市场部/办事处", "module": "7. 协同办公与流程审批", "verdict": "PARTIAL", "gap": "总部公文/制度『签收』跟踪缺失(无签收回执记录);三类请示无专用结构化模板与总部路由。", "severity": "med", "evidence": "Announcement 实体(domain/Announcement.java)字段仅 category/title/content/author/top/publishedAt/publishRange,无 read/签收/confirm/已读/回执/acknowledge/readBy 字段;全库 grep 签收/已读回执/acknowledge 在公文场景零命中(仅 Message 收件人已读、DataSeeder 里安环签收作为业务数据字符串)。请示报告复用 general-collab 通用模板,无价格调整/重大支出/合同条款三类请示的结构化字段与定向上报总部路由。", "survives": true, "reNote": "缺口属实,两半均无法推翻。(1) 总部公文/制度『签收』回执跟踪确实缺失:Announcement 实体仅有 id/category/title/content/author/top/publishedAt/publishRange 八个字段(源码+活体 /api/oa/announcements 双重确认),publishRange 只是『全体员工/各部门』这种自由文本发布范围,并非逐收件人签收记录;AnnouncementController 只有标准 CRUD(list/get/create/update/delete),无标记已读/签收/确认端点;全后端无 AnnouncementRead/*Receipt/*Acknowledge 实体或仓库(唯一的 signoff 是 BomSignoff,属 BOM 五签会签,与公文/制度无关);PolicyController 也无下发/签收/阅读跟踪。前端『待签收/已签收』只是 CollabListPage/Portal 里 FlowTask 的通用状态标签,并非公文阅读回执。全仓搜『签收回执』仅命中 DataSeeder 一句污水种子文案(无关)。(2) 三类请示无专用结构化模板与总部路由:活体 form-templates 列出 66+ 模板(含全部 kaidi-* 复刻模板),无任何专用『请示』模板;种子里的『关于完善信息安全制度的请示』实例复用通用模板 general-collab(通用事项),其表单仅 标题+发起人+正文,流程为 发起者→部门主管→结束,止于部门主管、无总部(HQ)节点;总部路由节点(信息中心/董事长/CEO/seeyon/凯迪长沙办公室)只存在于 hq-contract/hq-payment 这类合同/付款表单,不属请示。全仓无『三类请示』概念。", "reEvidence": "Announcement 实体: oa-backend/src/main/java/com/kaidi/oa/domain/Announcement.java (仅8字段,无签收/阅读字段); AnnouncementController: .../web/AnnouncementController.java (只CRUD,无签收端点); 活体返回 announcement keys=['id','category','title','content','author','top','publishedAt','publishRange']。唯一 signoff 实体 .../domain/BomSignoff.java 属BOM会签。请示实例用通用模板: .../seed/DataSeeder.java:570-572 seedInstance(\"general-collab\",\"关于完善信息安全制度的请示\",...); 通用模板定义 .../seed/TemplateSeedData.java:286-301 general() 流程仅 发起者→部门主管→结束。全模板目录 TemplateSeedData.all() 11内置 + DataSeeder 的 kaidi-* 共66+,无专用请示模板。总部路由仅见 ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/hq-contract.ts(合同表单,非请示)。全仓 grep 『三类请示/工作请示/事项请示/专项请示/请示模板』零命中;『签收回执』仅 DataSeeder.java:1632 污水文案。前端『待签收』标签 oa/portal/OaPortalPage.vue:70 与 oa/pages/collab/CollabListPage.vue:151 系 FlowTask 通用状态,非公文回执。" }, { "area": "市场部/办事处", "module": "8. 经营数据分析", "verdict": "PARTIAL", "gap": "看板为集团全局口径无 orgUnit 区域分段;缺客户贡献度、费效比(每万元合同额经营费用)、业绩排名三项分析。", "severity": "med", "evidence": "BusinessBiController.businessOverview()(web/BusinessBiController.java:140-)对全库 contract/payment/budget/project/bid 做集团全量 sum(contractStat/fundStat/costStat 等遍历 findAll 无 orgUnit 分组),无按办事处/区域分段;新签合同额/回款/中标率/费用执行率均为全局口径。grep 客户贡献/费效比/业绩排名/contribution/rank 在 BI 零命中,三项分析无对应记录/字段。", "survives": true, "reNote": "缺口属实。市场部/办事处 链[8. 经营数据分析] 在 kaidiDeptView.ts 中映射到 /report/cockpit(经营驾驶舱 cockpit.vue),该页只渲染集团全局口径:合同总额/已付/已开票 KPI、合同资金进度、业务量瓷砖、统一经营 BI 网格(合同/资金/成本/项目/研发/招投标/运营/质安/预警)、审批状态甜甜圈。数据源是 getBusinessOverview()→BusinessBiController,类注释明确写为“统一 BI 报表中心跨模块归口聚合…under a single common reporting caliber”,整段聚合无任何 orgUnit/区域维度。全仓 grep(贡献度/客户贡献/费效/每万元/业绩排名/销售排名/排行榜/ranking/contribution/costEfficiency 等同义词全扫)在前后端均找不到这三项分析的任何实现;唯一相关的“排行榜”命中是 knowledge 社区 mock 文案,与经营分析无关。orgUnit 仅以 Repository 行级过滤(OpportunityRepository.findByOrgUnit / BidRepository.findByOrgUnit)形式存在,供台账列表筛选,从未接入任何分析/看板;后端 BusinessBiController 与 ReportController 中无 groupingBy/orgUnit。CRM 销售漏斗 /crm/funnel 也是全局口径(listOpportunities() 不带 orgUnit,仅按阶段聚合)。因此“看板为集团全局口径无 orgUnit 区域分段;缺客户贡献度、费效比、业绩排名三项分析”三点全部成立,无法推翻。", "reEvidence": "1) ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts:市场部/经营部块“经营数据分析与报表”和 办事处块“经营数据分析”均 path=/report/cockpit(label=经营驾驶舱, status=built)。2) ofbiz-framework/plugins/modern-ui/app/src/oa/pages/report/cockpit.vue:仅 getOverview/listContracts/listPayments/listSealUses/listArchives/getBusinessOverview,全部集团全局;模板无 orgUnit/区域/贡献度/费效比/排名。3) oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java(GET /api/oa/reports/business-overview):类注释“single common reporting caliber”,所有 *Stat 方法对全表 findAll() 聚合,无 orgUnit、无 ranking、无 contribution、无 费用/合同额比值。4) 全仓 grep 三项分析关键词无相关命中。5) orgUnit 仅 OpportunityRepository.findByOrgUnit / BidRepository.findByOrgUnit 行级过滤,BI/Report 控制器无 groupingBy/orgUnit。6) crm/funnel.vue 调 listOpportunities() 无 orgUnit,仅按 stage 聚合。" }, { "area": "市场部/办事处", "module": "9. 移动端应用", "verdict": "LOGIC_GAP", "gap": "无 GPS 打卡/外勤轨迹、无拍照上传发票、无客户/商机导航地图;移动端仅只读聚合+link 跳转,无移动专用录入/打卡/轨迹端点。", "severity": "high", "evidence": "MobileController(web/MobileController.java)仅一个只读 GET /summary 聚合(待办数/预警/项目数+前5预览),无任何打卡/录入/轨迹端点。全库 grep GPS/geolocation/checkin/外勤/定位/拍照/导航:后端零命中(『打卡』仅 Feed 社交动态类型,『定位』仅 RD 项目算法描述),前端 navigator.geolocation/getCurrentPosition/camera/capture 零命中。mobile/workbench.vue 仅 link 跳转(商机→/crm/opportunity),经营看板亦为 link 非实时指标卡;费用报销无拍照上传发票移动入口;移动审批路由到桌面 handle 页。", "survives": true, "reNote": "Gap is real. Mobile is readonly aggregation plus link jumps only: no GPS checkin or field track, no photo invoice upload, no customer/opportunity navigation map, no mobile-specific entry/checkin/track endpoint. Backend MobileController has only a readonly GET summary endpoint, no write endpoints. Frontend mobile module mounts only the workbench portal child; workbench.vue is all readonly aggregation then router.push. OpportunityFollowup visit record has only text fields, no coordinates/photo/track. Customer and Opportunity domains have no lat/lng/map fields. Invoice controller has no photo upload or OCR. HR check-in is only an attendance-rule config toggle, not a geolocated field check-in. Only FileController (generic document center) supports MultipartFile; no mobile/invoice/visit photo-capture pipeline. No Attendance/Checkin/Track/Visit/Geo controller or domain exists.\n\n", "reEvidence": "MobileController.java only GET summary readonly; mobile workbench.vue pure aggregation plus router.push, no map camera geolocation; oaModules.ts lines 489-494 mobile only workbench child; OpportunityFollowup.java no GPS photo track fields; InvoiceController no photo image upload ocr; Customer.java and Opportunity.java no lat lng map fields; backend only FileController supports upload." }, { "area": "市场部/分公司", "module": "1. 市场与商机管理", "verdict": "LOGIC_GAP", "gap": "缺商机报备查重(系统自动查重)、区域市场容量与趋势预测分析工具、商机评估与小额决策的独立审批门槛。", "severity": "high", "evidence": "OpportunityController.create (web/OpportunityController.java:80-107) 仅做 name 非空、amount 非负、probability 0-100 校验,无任何按名称/客户/区域的查重或冲突检测;前端 opportunity.vue grep 查重/duplicate/重复 零命中。市场分析工具仅 funnel.vue:按 5 个阶段 filter 聚合数量/金额(stageData) + 加权预测(sum amount*probability/100),无区域市场容量、无趋势预测。商机评估/小额决策无独立审批门槛——create 后直接落库,无 evaluation/approval 绑定。", "survives": true, "reNote": "缺口属实。商机模块(Opportunity)三项子功能均未实现:(1) 商机报备查重——OpportunityController.create 仅做 name非空/amount非负/probability 0-100 校验后直接 save,无名称/客户相似度查重;OpportunityRepository 只有 findByStage/findByOwner/findByOrgUnit,无 existsByName/findByName 查重方法;前端 opportunity.vue 的 submitOpp() 直接调 createOpportunity 无查重。注意 SupplierController 有信用代码查重、convert-bid 有\"已转投标\"幂等,但都不是商机报备查重。(2) 区域市场容量与趋势预测——全代码库无任何市场容量/区域市场/趋势预测页面、路由或 API;唯一的预测是 funnel.vue 销售漏斗(按阶段加权赢单预测),属销售管道预测而非区域市场容量/趋势分析。(3) 商机评估与小额决策独立审批门槛——商机增改只有数值护栏,无金额分档审批门槛;WorkflowService 的通用 threshold 与 AuthInterceptor 角色门槛均未接入商机模块,无商机评估/小额决策审批分支。三项均确认缺失。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa/web/OpportunityController.java(create L80-107 无查重/无审批门槛); oa-backend/src/main/java/com/kaidi/oa/repository/OpportunityRepository.java(仅 stage/owner/orgUnit 查询,无 name/customer 查重方法); 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/opportunity.vue(submitOpp 直接创建无查重); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/funnel.vue(仅销售漏斗加权预测,非区域市场容量); ofbiz-framework/plugins/modern-ui/app/src/oa/api/crm.ts(API 仅 list/get/create/update/delete/convertToBid/followups,无查重/市场预测/审批端点); 全库 grep 市场容量|区域市场|趋势预测 仅命中 knowledge/mock.ts 一处字符串" }, { "area": "市场部/分公司", "module": "2. 客户关系管理(CRM)", "verdict": "PARTIAL", "gap": "客户档案缺信用额度/账期/分级授信字段;无客户投诉处理与满意度调查模块;下次跟进仅字段存储无主动提醒引擎。", "severity": "med", "evidence": "Customer 实体(domain/Customer.java)仅 name/type/contact/phone/address/status 六字段,无 creditLimit/账期/分级;全代码 grep 信用额度/授信/账期/分级 在 Customer 与前端 crm 模块零命中(仅命中 Supplier/DataCenter/SafetyCheck)。grep 投诉/满意度/complaint/satisfaction 在 web/domain 零命中,无 CRM 客户投诉与满意度闭环。OpportunityFollowupController 的 nextPlan 为存储字符串字段(web/OpportunityFollowupController.java:77),无主动提醒引擎(无定时/告警端点)。", "survives": true, "reNote": "缺口三项分述均属实,无法推翻。\n\n1) 客户档案缺信用额度/账期/分级授信字段——属实。domain/Customer.java 仅 6 字段(name/type/contact/phone/address/status),无 creditLimit/账期/授信任何字段;前端 masterdata/customer.vue 的 columns 与 createFields 同样只有这 6 个字段。全后端 grep \"creditLimit|信用额度|账期|授信|分级授信\" 在 Customer 相关代码零命中(仅 finance/receivable.vue 的应收\"账期\"dueDate 与客户档案无关)。\n\n2) 无客户投诉处理与满意度调查模块——属实。grep \"投诉|complaint\" 全仓仅命中两处死数据(DataSeeder 的 qmsRecord 一条文案、canteen 食堂满意度评分),无投诉处理控制器/页面/流程。Survey 模块(domain/Survey.java + SurveyController + culture/survey.vue)是通用投票/民意(title/options/votes),无 customerId 关联、无满意度评分量表、与 CRM 不挂钩(crm 页面 grep survey 零命中),不构成客户满意度调查模块。\n\n3) 下次跟进仅字段存储无主动提醒引擎——属实。OpportunityFollowup 有 nextPlan(文本)和 followDate,但无 nextFollowDate 可供调度查询的到期日字段;唯一的定时引擎 task/AlertScheduler.java(@Scheduled 每小时)只扫描人员证件到期(refreshCertExpiry)和审批实例超时滞留(scanOvertimeInstances),AlertController.aggregate() 的告警源仅证件/专利年费/履约/库存/仪器校准,全不含商机跟进。grep \"@Scheduled|跟进提醒|followReminder\" 在 followup 相关代码零命中——跟进计划仅落库展示,无任何主动到期提醒。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Customer.java(仅6字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/customer.vue(columns/createFields仅6字段); oa-backend/src/main/java/com/kaidi/oa/domain/OpportunityFollowup.java(有nextPlan/followDate无nextFollowDate); oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java(仅证件到期+实例超时, 无跟进扫描); oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java(aggregate告警源:证件/专利年费/履约/库存/仪器校准, 无客户跟进); oa-backend/src/main/java/com/kaidi/oa/domain/Survey.java(通用投票, 无customerId/无评分量表); 全仓grep \"信用额度|账期|授信|投诉|满意度|complaint|reminder\" 仅命中无关死数据(DataSeeder/canteen/finance receivable)" }, { "area": "市场部/分公司", "module": "4. 项目与任务协同", "verdict": "PARTIAL", "gap": "与总部项目管理系统数据同步未实现;进度监控为手填字段,无从任务自动汇总。", "severity": "med", "evidence": "ProjectController grep sync/同步/总部/DataSyncLog 零命中,无与总部项目系统的对接。DataSyncLog 实体存在(source/target/entity/direction/status/recordCount)但是通用同步日志表,未被 ProjectController 引用、未承载项目→总部同步。项目进度为 progress 字段手填(mobile workbench projProgress 读 p.progress),无任务级自动汇总到项目进度的逻辑。", "survives": true, "reNote": "缺口属实,无法推翻。两部分都核实成立。\n\n(1) 进度监控为手填、无任务自动汇总:Project 实体的 progress 是普通 int 字段,全代码扫描其所有写入点均非任务汇总——DataSeeder 种子写死、ProjectController.create 取请求体 req.progress()(手填)、advance 生命周期端点硬编码 100/80、BidController/TriggerRuleEngine 置 0。ProjectTaskController.update(看板拖拽改状态)完全不触碰任何 Project.progress;ProjectTaskRepository 只有 findByProjectId,没有 countByProjectIdAndStatus 等聚合方法;后端无任何 recompute/recalc 项目进度的逻辑。前端 goal/project.vue 第460行进度由 el-slider 手动拖动设置(projectForm.progress),第335行直接展示存库的 p.progress;任务看板(loadTasks/onDropTo)与项目进度互不联动。collab/monitor.vue 的\"进度\"是按审批流节点 nodeIndex/chainLen 算的流程实例进度,与项目任务完成度无关。\n\n(2) 与总部项目管理系统数据同步未实现:DataSyncLog/DataSyncLogController 仅是\"台账记录框架\"——纯 append/list/delete 日志表,类注释明确写\"实际同步通道(与甲方 ERP/财务/主数据系统的对接方式)属甲方集成口径,当前为台账记录框架\"。全后端无 RestTemplate/WebClient/HttpClient/Feign/webhook 等任何外呼集成代码,无定时拉取/推送总部数据的 @Scheduled 任务。\"总部/HQ\"在代码中仅作为审批节点机构范围词(NodeAssigneeResolver 的 HQ_SCOPES)和资产位置文案,不涉及跨系统同步。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Project.java:28 (progress 普通 int); web/ProjectController.java:68,119,124,131 (progress 手填/硬编码,无任务汇总); web/ProjectTaskController.java:64-73 (看板更新不回写项目进度); repository/ProjectTaskRepository.java:8-11 (仅 findByProjectId,无聚合); domain/DataSyncLog.java:11-19 + web/DataSyncLogController.java:20-25 (明确\"台账记录框架,实际同步通道属甲方口径\"); 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/project.vue:460 (el-slider 手填进度),:335 (直接展示 p.progress); 全后端 grep 无 RestTemplate/WebClient/HttpClient/Feign/webhook/定时同步代码" }, { "area": "市场部/分公司", "module": "5. 费用与预算控制", "verdict": "LOGIC_GAP", "gap": "缺独立利润核算(收入-成本-费用)与损益表生成;预算模块只有成本侧,无收入侧与利润口径。", "severity": "high", "evidence": "BudgetController(web/BudgetController.java)仅 budgetAmount vs actualAmount 比较(超支判定),无任何利润/损益计算;grep 利润/损益/profit/margin 在 Budget 前后端零命中。budget 看板前端 grep 收入/利润/损益/profit/income/revenue 零命中——无收入侧、无利润口径、无损益表生成端点。", "survives": true, "reNote": "缺口属实。预算/成本模块只有成本侧,无收入侧、无利润口径,也没有损益表/利润表生成。Budget 实体与 BudgetController 仅有 budgetAmount/actualAmount 两个成本字段、element 为成本要素(人工费/材料费/机械费/差旅费/管理费/外协费/分包费)、status 为 执行中/超支/已结,完全没有收入或利润字段;成本看板 board.vue 只展示预算总额/已发生成本/执行率/超支项。全后端+前端 grep 损益表/利润表/income statement/profit/净利/毛利/netProfit/grossProfit 零命中,唯一的\"损益\"只是 finance.ts 里 ACCOUNT_CATEGORIES 的科目分类下拉标签,不是生成的报表。BusinessBiController 返回 contract/fund/cost 三块互不相减,fund.netCash=应收-已付现金流出 是现金流而非利润(收入-成本-费用),从不做利润核算。活体验证 /reports/profit、/reports/income-statement、/reports/pnl、/reports/operating 全 404,/budgets/profit 400,business-overview JSON 无任何利润字段。财务页(accounts/vouchers/receivable/payable/expense/tax/asset)与 FundPoolController 均无损益表组装。无法推翻该缺口。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java(仅budgetAmount/actualAmount,无收入/利润字段); oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java(超支判定 actual>budget,纯成本); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/board.vue(预算总额/已发生成本/执行率/超支项); oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java(L99-106/169-206 fund.netCash=receivable-outflow现金流,cost块独立,从不相减算利润); ofbiz-framework/plugins/modern-ui/app/src/oa/api/finance.ts:32(损益仅为科目分类标签); 活体 GET /api/oa/reports/profit|income-statement|pnl|operating 全部404, business-overview返回无profit字段; 全仓库 grep 损益表/利润表/profit/净利/毛利 零命中" }, { "area": "市场部/分公司", "module": "6. 行政与资产管理", "verdict": "PARTIAL", "gap": "资产折旧无计算逻辑、无盘点字段与算法;印章分类(type)字段已存在(轻微纠正初判表述),但整体资产管理规范化仍不达标。", "severity": "med", "evidence": "branchadmin.vue 为 settingList('crm-branchadmin') 持久化列表,字段仅 org/kind/name/amount/owner/status,无折旧率/原值/净值/盘点字段与折旧算法。印章分类管理实为存在:Seal 实体(domain/Seal.java:10)type 取值 公章/合同章/财务章/法人章/项目章,确有独立印章分类字段——此点比初判'较弱'描述略强,但不构成达标项;SealUse 用印申请记录有效期信息。资产折旧与盘点核心能力仍缺失,PARTIAL 成立。", "survives": true, "reNote": "缺口属实,对抗推翻失败。资产折旧确实没有任何计算逻辑,盘点字段与算法完全缺失。活体后端 com.kaidi.oa 只有两个相关实体:ItAsset(仅 assetNo/name/category/spec/holder/dept/purchaseDate/status/location/createdAt,无原值/使用年限/折旧方法/累计折旧/净值/残值任何字段) 和 InventoryItem(仅 quantity/safetyStock + 阈值状态)。ItAssetController/InventoryItemController 均为纯 CRUD,无折旧公式、无盘点(盘盈/盘亏/实盘)逻辑。前端最接近折旧的是 finance/asset.vue,但其 原值/累计折旧/净值 三列全是 type:'number' 手填输入框,经通用 settingList 键值存储持久化——是录入而非计算(无 成本×年限×时间 折旧公式、无使用年限输入、无折旧方法选择)。全活体代码 grep depreciat|折旧|净值|残值|usefulLife|盘点|盘盈|盘亏|stockTak 仅命中 RdExpense 研发费用种子串、会议标题\"人才盘点\"、知识库文档名\"固定资产盘点表\"等无关项。出现的 FixedAsset/ShowFixedAssetDepreciation 全在 static/generated/pages 的弃用 OFBiz 快照里,活体 com.kaidi.oa 无对应实体/服务。印章 type(分类)字段确实存在,与缺口描述的纠正一致,不影响整体判定。", "reEvidence": "活体后端实体: oa-backend/src/main/java/com/kaidi/oa/domain/ItAsset.java (无折旧字段)、domain/InventoryItem.java (无盘点字段); 控制器纯CRUD: web/ItAssetController.java、web/InventoryItemController.java; 前端手填三列无公式: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/asset.vue 第24-26行 originalValue/depreciation/netValue 均 type:'number'; IT资产台账无折旧: oa/pages/itasset/assets.vue; grep service/ 折旧|盘点 零命中; FixedAsset/ShowFixedAssetDepreciation 仅存在于 oa-backend/src/main/resources/static/generated/pages/*.json (弃用OFBiz快照,活体无对应@Entity/@Service)。" }, { "area": "市场部/分公司", "module": "8. 经营数据分析", "verdict": "LOGIC_GAP", "gap": "缺独立财务报表(利润表/现金流量表/资产负债表);缺客户贡献度、费效比、业绩排名、部门毛利;经营看板无区域/分公司维度切分。", "severity": "high", "evidence": "全系统 grep 利润表/现金流量表/资产负债表/损益表/income statement/balance sheet/cash flow 零命中。ReportDefinitionController 报表生成器仅 9 个白名单源(合同/付款/预算/投标/商机/发票/隐患/审批实例/项目)的单源 group-by + count/sum(web/ReportDefinitionController.java:337-356 measure 只允 count/sum),无会计科目借贷净额、无多表 join、无报表结构,无法产出三大财务报表。cockpit.vue 全为公司级汇总,无区域/分公司维度切分(grep 分公司/区域/branch 在 cockpit 零命中);BusinessBiController 同为全公司聚合。无客户贡献度、费效比(每万元合同额经营费用)、业绩排名、部门费用毛利分析。", "survives": true, "reNote": "缺口属实。尽力推翻后仍无法找到对应实现。逐条核验市场部/分公司·经营数据分析的三组诉求:\n\n(1) 独立财务报表(利润表/现金流量表/资产负债表)——全项目 grep \"利润表/现金流量表/资产负债表/损益表/incomeStatement/cashFlow/balanceSheet\" 零命中。后端唯一的\"损益/利润\"字样只是会计科目(Account/DataSeeder)的 category 分类标签(资产/负债/权益/成本/损益),即科目表,不是报表。AccountController 仅 list/get/create/update/delete 科目,无任何报表生成端点;finance 模块 7 个页面(会计科目/记账凭证/应收/应付/税务/资产/费用)均为 settingListStore 台账,无三大报表页面或端点。\n\n(2) 客户贡献度/费效比/业绩排名/部门毛利——全项目 grep \"客户贡献/费效比/业绩排名/绩效排名/部门毛利/毛利/贡献度/grossMargin/costEfficiency/customerContribution/performanceRank\" 零命中,无任何前端页面或后端聚合实现这四类专题分析。\n\n(3) 经营看板无区域/分公司维度切分——属实。经营驾驶舱 report/cockpit.vue 调 /reports/business-overview(BusinessBiController),该端点对全公司做 findAll() 后内存汇总(合同/资金/成本/项目/研发/招投标/运营/质安/预警),全程无 region/branch/orgUnit 任何分组维度;report/analysis.vue 维度选项仅\"全部业务域/流程与会议/组织人事/知识与发布\",无区域或分公司维度。\n\n唯一可能算部分擦边的是自定义报表 ReportDefinitionController:它是通用\"单源 group-by 单维度 + 单度量\"即席聚合器,opportunity 源支持按\"客户/归口单位\"分组、bid 源按\"归口单位\"、budget 按\"公司主体\"分组。但这只是通用交叉表工具,无法产出三大报表(需跨科目勾稽),也未提供贡献度/费效比/排名/毛利这些命名经营分析交付物,且真正的\"经营看板\"(cockpit) 本身完全没有区域/分公司切分。三组诉求均无对应实现。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java(GET /reports/business-overview,全公司 findAll 内存汇总,9 个 record 块零 region/branch 维度);oa-backend/src/main/java/com/kaidi/oa/web/AccountController.java(仅科目 CRUD,无报表端点);oa-backend/src/main/java/com/kaidi/oa/web/ReportDefinitionController.java(通用单源单维度聚合器,dim 仅 customerName/orgUnit/companySubject 等普通分组,无三大报表/贡献度/费效比/排名/毛利);前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/report/cockpit.vue(经营驾驶舱无区域/分公司维度)、report/analysis.vue(维度仅全部业务域/流程与会议/组织人事/知识与发布)、finance/ 全 7 页为台账无三大报表。grep \"利润表|现金流量表|资产负债表|客户贡献|费效比|业绩排名|部门毛利\" 在 oa-backend/src 与 modern-ui/app/src 全部零命中。" }, { "area": "市场部/分公司", "module": "9. 移动端应用(共性需求)", "verdict": "LOGIC_GAP", "gap": "无 GPS 定位打卡与外勤轨迹;无拍照上传发票的移动报销闭环;无客户跟进地图导航;移动端为只读聚合,缺现场录入。", "severity": "high", "evidence": "grep GPS/拍照/外勤/轨迹/经纬/latitude/longitude 在 web/domain 唯一命中是 FeedController.java:59 的 mock 动态文本'打卡'与 domain/Feed.java 注释,无定位/轨迹实体或端点。grep 报销 仅命中 Payment payType 枚举'费用报销'与 Feed/Favorite 文本,无拍照上传发票的报销端点。mobile/workbench.vue 为只读聚合(待办审批/预警/进度填报三 tab + 快捷查询),'进度填报'按钮仅 router.push('/goal/project360'),无现场录入;无 GPS 打卡、无拍照发票报销、无客户跟进地图导航。MobileController.summary 同为只读汇总。", "survives": true, "reNote": "缺口属实,无法推翻。移动端确为只读聚合门户,缺四项现场录入能力。①GPS定位打卡/外勤轨迹:全量源码(前端.vue/.ts + 后端java,排除generated/node_modules)对 getCurrentPosition / navigator.geolocation / gps / latitude / longitude / 经度 / 纬度 / 外勤 / 轨迹打卡 零命中;唯一的\"打卡/考勤\"是 hr/worktime.vue,它只是考勤规则配置页(迟到分钟阈值、补卡开关等开关项),不含任何位置采集或签到动作。②拍照上传发票报销闭环:仅有一个通用\"费用报销\"审批表单模板(TemplateSeedData.java,纯文本字段 applicant/dept/amount/items),无相机/拍照/发票图片上传,对 拍照/takePhoto/camera/相机/发票上传 零命中,移动工作台内无报销入口。③客户跟进地图导航:OpportunityFollowup 实体字段仅 type/content/followDate/operator/nextPlan,无地址/经纬度字段;对 高德/amap/baidu map/tencent map/地图导航 全源码零命中。④移动端只读:后端 MobileController 仅 /summary 返回 todoCount/alertCount/projectCount + 预览列表;前端 workbench.vue 头注释明确写\"移动端只做一个工作台…不新增后端,纯前端聚合\",唯一交互\"填报进度\"也只是 router.push 跳桌面页,无现场录入。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/MobileController.java (仅 GET /summary 只读聚合,无任何写入/定位/上传端点); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mobile/workbench.vue (第2-6行注释\"移动端只做一个工作台…不新增后端,纯前端聚合\";全页只渲染待办/预警/进度列表+快捷查询link,go()/router.push 跳转,无 geolocation/camera/map); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/worktime.vue (只是考勤规则配置开关,非GPS打卡); oa-backend/src/main/java/com/kaidi/oa/domain/OpportunityFollowup.java (字段仅 type/content/followDate/operator/nextPlan,无location/经纬度); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:489-494 (mobile 模块只挂一个 workbench portal 子页); 全量 grep getCurrentPosition|navigator.geolocation|gps|latitude|longitude|经度|纬度|外勤|高德|amap|baidu map|tencent map|拍照|takePhoto|camera|发票上传 在真实 src/java 源码(排除 generated/node_modules)均零命中。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "1. 银行账户与资金池管理", "verdict": "LOGIC_GAP", "gap": "账户台账缺 启用日期/状态/授权人员/账户类型 字段; 无余额监控(可用/冻结/在途/每日同步/备付金预警); 无资金归集(实时/定时/限额留存)与下拨, 无归集下拨流水及内部往来凭证; 无银企直连(余额查询/明细下载/电子付款/回单)。FundPool 仅为按主体的应收-流出净额视图, 非真实归集池。初判成立。", "severity": "high", "evidence": "BankAccount.java(domain) 实体仅 6 字段: accountName/bankName/accountNo/companySubject/currency/purpose——无 启用日期/状态(正常冻结销户)/授权人员/账户类型分类, 无任何余额字段(可用/冻结/在途/最低备付金)。BankAccountController 只有纯 CRUD, 无余额同步/预警/银企直连端点。FundPoolController 经核实是内存聚合视图: 按 companySubject 分组, 取合同 invoicedAmount 作 invoicedTotal、status='已付' 的 Payment 作 outflowTotal, balance=invoicedTotal-outflowTotal(见其类注释与第 60-103 行), 不持有任何账户/归集/下拨/内部往来凭证逻辑。全后端 grep 无 归集/下拨/银企/回单/网银/支付指令 命中。", "survives": true, "reNote": "对抗复验未能推翻该缺口,缺口属实。逐项核验:\n\n(1) 账户台账字段缺失——属实。BankAccount 实体(domain/BankAccount.java)仅有 6 个字段:accountName, bankName, accountNo, companySubject, currency, purpose。完全没有 启用日期/状态(status,enableDate)、授权人员(authorizedPerson)、账户类型(accountType)。前端 masterdata/bank.vue 的列与表单也一一对应这 6 个字段,无任何扩展。\n\n(2) 余额监控(可用/冻结/在途/每日同步/备付金预警)——属实,完全缺失。BankAccount 没有任何余额类字段(无 availableBalance/frozenBalance/inTransit/balance)。全仓 grep 余额监控/可用余额/冻结/在途/每日同步/备付金 在 bank/fund 语境下零命中(命中的均为 RdExpense 研发费用归集、StandardCost 成本归集、AlertScheduler 轮询 sweep 等无关语境)。\n\n(3) 资金归集(实时/定时/限额留存)与下拨、归集下拨流水、内部往来凭证——属实,零实现。无 treasury/cash-pool/transfer/sweep 任何实体或控制器;Voucher 实体不含 transfer/往来/归集 概念;grep 资金归集/实时归集/定时归集/限额留存/资金下拨 全仓零命中。\n\n(4) 银企直连(余额查询/明细下载/电子付款/回单)——属实,零实现。grep 银企直连/电子回单/余额查询/明细下载/电子付款/付款指令/directConnect/h2h 等前后端全零命中。\n\n(5) FundPool 非真实归集池——属实。FundPoolController.java 类注释自述为\"按公司主体把 合同应收(invoicedTotal) 减 已付流出(outflowTotal) 得净额\"的内存聚合视图,明确\"No new entity is introduced\";前端 fundpool.vue 注释亦自述\"按公司主体的应收/流出/净现金监控\"。它只是 应收-流出净额视图,没有真实账户余额、归集流水或资金调拨。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/BankAccount.java (仅6字段,无启用日期/状态/授权人员/账户类型/余额); oa-backend/src/main/java/com/kaidi/oa/web/BankAccountController.java (CRUD仅这6字段); oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java:19-28,42-104 (类注释自述为应收-流出净额内存聚合,\"No new entity is introduced\"); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/bank.vue:5-20 (前端列/表单同6字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/fundpool.vue:2,28 (自述\"应收/流出/净现金监控\"); 全仓 grep 银企直连/资金归集/下拨/备付金/可用余额/冻结/在途/电子回单/明细下载/付款指令 前后端零命中; domain/ 88个实体与 web/ ~90控制器中无 treasury/cash-pool/transfer/sweep 任何资金归集或银企直连组件,fund/bank 相关仅 BankAccount 与 FundPool 两者。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "2. 付款结算管理", "verdict": "PARTIAL", "gap": "缺批量付款(工资/供应商/报销批量+Excel清单导入+总额与预算校验); 缺支付指令发送(银企直连/网银+状态+失败重试); 缺付款回单管理; 缺代收代扣管理; 付款申请未校验预算余额与合同付款条件。审批闸+凭证回写已存在故 PARTIAL。初判成立。", "severity": "med", "evidence": "PaymentController+PaymentService 实现: create() 强制 待付(钱权分离闸 H13)、confirmPay() 网关式结算(待付→已付)并回写合同 paidAmount + 幂等生成记账凭证(借应付账款/贷银行存款, sourceType=payment 幂等键)、reject()。付款申请有审批联动(TriggerRuleEngine payment.create)。但: 全后端 grep 无 批量付款/batchPay/工资代发/Excel导入; 无 支付指令/银企直连/网银/支付状态成功失败处理中/失败重试; 无 回单(receipt voucher)获取/关联/批量下载; 无 代收代扣。前端 byinvoice.vue 第 58 行 form.amount=iv.total 仅带出发票金额, PaymentController.create / PaymentService 全程无任何 预算余额/合同付款条件 校验(grep 预算余额/checkBudget/付款条件 在 web/+service/ 零命中)。", "survives": true, "reNote": "缺口属实,PARTIAL 判定成立。付款结算只有单笔模型(create/confirmPay/reject)+审批闸+合同回写+自动记账凭证(已被缺口承认),但描述列出的全部增量能力均确实缺失:①批量付款/Excel清单导入/总额预算校验——无 /payments/batch 类端点(grep payments/batch|批量付款|batchPay 全空)、无 POI/Excel 导入、前端5个付款页(board/byinvoice/financing/fundpool/ledger)无批量或导入UI;②支付指令发送(银企直连/网银/状态/失败重试)——银企|网银|payInstruction 仅命中 DataSeeder 种子文本,状态枚举只有待付/已付/已驳回,无指令发送/已发送/失败态,无重试机制;③付款回单管理——VoucherController/Voucher.java 无回单/receipt/附件字段;④代收代扣管理——代收|代扣 仅命中 DataSeeder,无任何控制器/领域/服务实现;⑤付款申请未校验预算余额与合同付款条件——PaymentService 与 PaymentController 零处引用 budget|预算|paymentTerm|合同付款条件,create() 仅校验 payeeName 非空与 amount>0。无法推翻。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/PaymentController.java (仅 GET list/get、POST create、POST {id}/pay、POST {id}/reject,无批量端点); oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java (create/confirmPay/reject 单笔,无 budget/预算/paymentTerm 引用); oa-backend/src/main/java/com/kaidi/oa/domain/Payment.java (字段无 batch/receipt/instruction/retry/withhold); oa-backend/src/main/java/com/kaidi/oa/domain/Voucher.java + web/VoucherController.java (无回单字段); ofbiz-framework/plugins/modern-ui/app/src/oa/api/payments.ts (仅 list/get/createPayment/payPayment/rejectPayment); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/{board,byinvoice,financing,fundpool,ledger}.vue (无批量/导入/回单/代扣UI)。grep payments/batch|批量付款|batchPay 与 银企|网银|代收|代扣 在 web/service/domain 下均无业务命中(仅 seed/DataSeeder.java)。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "3. 收款结算管理", "verdict": "LOGIC_GAP", "gap": "应收单无从销售合同/开票申请自动生成独立应收单(仅有收款确认→待开发票草稿的间接链, 非应收单管理); 无到款认领(待认领池/合同号发票号付款方匹配/模糊匹配); 无逾期催收(催收提醒/催款函/过程记录); 无退款处理。初判主体成立, 唯需注明收款确认→自动开票回写合同应收 这一相邻链确实存在(并非'关键逻辑全空', 收款入账侧有联动)。", "severity": "high", "evidence": "无 Receivable/应收单 实体(domain/ 目录无 receiv/应收/claim/dunning/refund 文件)。存在一条相关自动链: TriggerRuleEngine 第 183-230 行 receipt.invoice——'收款确认/到账'办结后自动生成一张「待开」销项发票草稿(用项目反查合同取甲方, 挂到合同), 财务在发票台账置「已开」时 InvoiceController.applyContractDelta 回写合同 invoicedAmount。这是收款侧的发票自动生成与合同应收回写, 但并非独立应收单, 也无开票申请→应收单链。到款认领: grep 认领/待认领/到款/模糊匹配 仅命中 NodeAssigneeResolver 的并行分派 claimed 集(与到款无关), 无银行到款待认领池/合同号发票号付款方匹配。催收: 无自动催收提醒/催款函/催收过程记录(逾期 仅出现在合同里程碑与 Feed 文案)。退款: grep 退款/refund 后端零命中。", "survives": true, "reNote": "缺口属实。我尽力在前后端代码与活体系统中查找反证,未能推翻。四项核心能力均缺失:(1) 无从销售合同/开票申请自动生成独立应收单——后端唯一相关自动规则是 TriggerRuleEngine.ruleCreateReceivableInvoice,它只在「收款确认/到账/回款」表单办结后生成一张「待开」销项发票草稿(即缺口已承认的相邻链:收款确认→待开发票→开具时 InvoiceController.applyContractDelta 回写合同 invoicedAmount),不存在任何应收单(应收单/receivableBill/createReceivable)实体或规则;(2) 无到款认领——无待认领池、无合同号/发票号/付款方匹配、无模糊匹配,代码中「claim/unclaimed」仅出现在 NodeAssigneeResolver 的并行审批办理人去重(语义无关),「模糊匹配」仅出现在 FullTextSearchService 全文检索(无关);(3) 无逾期催收——「逾期」只作为 mock 列表状态值/标签色与履约节点告警存在,无催收提醒生成、无催款函、无催收过程记录;(4) 无退款处理——无任何 refund/退款 端点、实体或页面。所谓「应收账款」页(finance/receivable.vue)是 settingListStore('finance-receivable') 纯 mock CRUD 硬编码表,无合同/发票联动;且它挂在「财务管理」下而非支付中心收款结算(支付中心子页仅 board/byinvoice/financing/fundpool/ledger)。活体 8091 探测 receivables/claims/dunning/refunds 等端点全部 404。缺口主体成立,相邻的收款确认→自动开票回写合同应收链确实存在(此处入账侧有联动),与缺口描述完全一致。", "reEvidence": "收款→开票草稿相邻链(非应收单管理): /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:113-115,188-233 (ruleCreateReceivableInvoice 生成「待开」销项发票); 开具回写合同应收: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/InvoiceController.java:65-79,177-179 (applyContractDelta)。无应收单/认领/催收/退款实体或端点: oa-backend/.../domain 无 receivable/claim/dunning/refund 实体;oa-backend/.../web/*.java 无任一 @*Mapping 含 claim/认领/催/refund/退款/receivable(仅 BusinessBiController/FundPoolController/InvoiceController 把 receivable 当聚合字段名或注释)。无关命中: NodeAssigneeResolver.java:84,176-177(并行审批去重的 unclaimed)、FullTextSearchService.java:243(全文检索模糊匹配)。前端「应收账款」纯 mock: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/receivable.vue:6-10,31-34 (settingListStore 硬编码三行)。支付中心子菜单不含收款结算/认领/催收/退款: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:228-237 (仅 ledger/byinvoice/fundpool/board/financing)。活体探测: receivables/receivable/claims/arrears/dunning/refunds/collections 均返回 404 (http://127.0.0.1:8091)。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "4. 内部结算管理", "verdict": "MISSING", "gap": "无内部往来记账; 无内部对账(月度对账单+在线确认+差异调整); 无内部计息(上存/占用利率+自定义周期+利息清单); 无内部结算规则配置(计价方式+分摊规则)。整模块未实现。初判成立。", "severity": "high", "evidence": "全后端 grep 内部往来/内部结算/内部对账/内部计息/interCompany/计息/interest(指内部计息) 零命中(interest 仅 ReportDefinition 字段无关项)。无任何分子公司间交易自动生成应收应付内部往来单的实体或服务; 无内部对账单生成/在线确认/差异调整; 无上存活期/占用贷款利率计息; 无成本价/市场价/协议价计价或按收入人数面积分摊规则配置。前端无对应页面。", "survives": true, "reNote": "尽力推翻未果,缺口属实。资金支付中心前端模块(oaModules.ts:228-238)仅有6个子项:支付台账/见票付款/资金池/支付看板/融资与债务管理,根本没有\"内部结算管理\"入口、路由或页面。唯一挂\"结算中心\"名号的 FundPoolController 只是按公司主体把合同/付款只读聚合成 应收/流出/净现金(fundpool.vue 同款柱状图),完全没有:①内部往来记账(分子公司间应收/应付单据自动生成);②内部对账(月度对账单+在线确认+差异调整申请);③内部计息(上存活期/占用贷款利率+自定义计息周期按日/按月+利息清单凭证);④内部结算规则配置(成本价/市场价/协议价计价+按收入/人数/面积分摊)。financing.vue 是对外融资债务(银行贷款/保理/租赁),与内部结算无关。对全后端Java+全前端Vue逐一精搜上述4项每个特征词均零命中,唯一匹配是 DataSeeder.java:3177 一条用章/移交种子记录里\"对账单清单\"纯文本,非功能代码。需求本身真实存在(requirements/_req_slices/19_支付中心__结算中心.txt:14-15 与 kaidi-table-model.json:557)。整模块确未实现。", "reEvidence": "前端模块定义无该子项:ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:228-238(payment 仅 ledger/byinvoice/fundpool/board/financing)。唯一\"结算中心\"控制器为纯聚合:oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java(注释自述 fund pool aggregation,按 companySubject 汇总 contractTotal/invoicedTotal/outflowTotal/balance,无往来单据/对账/计息/规则)。对应页面 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/fundpool.vue(应收 vs 流出柱状图)。融资页 financing.vue 为对外债务。全栈精搜 内部往来/内部对账/差异调整/利息清单/计息周期/上存资金/占用资金/内部计价/分摊规则 在 oa-backend/src/main/java 与前端 src 下零功能命中,仅 oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:3177 出现\"对账单清单\"文本(种子数据,非实现)。需求出处 requirements/_req_slices/19_支付中心__结算中心.txt:14-15、requirements/kaidi-table-model.json:557。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "5. 资金计划与预测", "verdict": "MISSING", "gap": "无资金计划编制与汇总平衡; 无计划执行差异监控与阈值预警; 无基于回款/付款计划的资金预测与净头寸; 无计划外支付特殊审批强制控制。整模块未实现。初判成立。", "severity": "high", "evidence": "全后端 grep 资金计划/资金预测/cashPlan/cashForecast/fundPlan/头寸 零命中。无年度/月度资金计划编制实体或上报汇总; 无计划执行监控(实际vs计划差异表+阈值预警); 无 7/30/90 天资金流入流出净头寸预测; 无计划外支付强制控制。前端 payment 模块 5 个子页(台账/见票付款/资金池/看板/融资债务)均无计划或预测页。", "survives": true, "reNote": "缺口属实,无法推翻。资金支付中心仅有5个页面:支付台账、见票付款、资金池、支付看板、融资与债务管理。逐项核对缺口四要素均不存在:(1)无资金计划编制与汇总平衡——FundPoolController/fundpool.vue 是对既有 Contract/Payment 的事后聚合(按公司主体算应收/流出/净现金 balance),是回顾性结算视图,不含任何计划编制或预算汇总平衡逻辑;(2)无计划执行差异监控与阈值预警——BudgetController grep variance/forecast/差异/阈值/threshold/预警 全部为空;AlertController 告警类型仅 证件预警/履约预警/库存预警/成本超支/仪器校准/安全隐患,无资金计划差异或阈值告警;(3)无基于回款/付款计划的资金预测与净头寸——全后端+前端 grep 资金计划/净头寸/资金缺口/forecast/cashflow/回款计划/付款计划,仅命中 kaidiDeptView.ts 部门视图元数据目录里的无关\"计划\"字样(如政策与申报计划)与销售预测 mock,无任何前瞻性资金预测实现;fundpool 的 balance 是历史净额非预测净头寸;(4)无计划外支付特殊审批强制控制——PaymentController grep 计划外/special/unplanned/超预算/强制/阈值 全空。活体复核:/fund-plans、/cash-plans、/fund-forecast、/fund-plan 四个端点均返回 HTTP 404(/fund-pool 正常返回聚合数据,证明 token 有效)。整模块确未实现,初判 MISSING 成立。", "reEvidence": "后端无 FundPlan/CashPlan 实体或控制器:oa-backend/src/main/java/com/kaidi/oa/domain/ 下仅 Budget.java、WorkPlan.java 与\"plan/fund\"相关,WorkPlan 是工作计划(title/owner/period/content)非资金计划,Budget 仅 budgetAmount/actualAmount 无差异/预测/阈值方法。FundPoolController.java(/api/oa/fund-pool) 第64-103行纯聚合既有合同/已付款项,doc 自述\"Aggregates contracts and payments in memory\"。AlertController.java 第70-74行告警类型枚举不含资金计划。PaymentController.java grep 计划外/special/强制 无命中。前端 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:233-237 payment 子项仅 ledger/byinvoice/fundpool/board/financing。activos live probe:curl /api/oa/fund-plans|/cash-plans|/fund-forecast|/fund-plan 全部 HTTP 404,/fund-pool 返回 code:0 聚合数据。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "6. 资金风险控制", "verdict": "MISSING", "gap": "无大额支付预警(限额拦截+高级审批+黑白名单); 无重复付款控制; 无头寸风险预警(可用余额<安全备付金/资金缺口预测); 无汇率风险(外币监控/锁汇/远期套保); 无合规性检查(收款账户黑名单/外汇/授权范围)。整模块未实现。初判成立。", "severity": "high", "evidence": "全后端 grep 大额/重复付款/备付金/黑名单/blacklist/whitelist(均无资金风控命中, whitelist 仅 ReportDefinition 字段白名单)、锁汇/远期/头寸 零命中。PaymentController.create 仅校验 payeeName 非空与 amount>0, 无单笔/累计限额拦截、无触发高级审批、无付款对象黑白名单、无同收款方相同金额相近时间的重复付款校验。AlertController 仅覆盖 证件/专利年费/履约/库存/仪器校准/安全隐患/审批超时/成本超支 8 类预警, 无 大额支付/头寸/备付金/汇率 任何资金风险预警。", "survives": true, "reNote": "缺口属实。资金风险控制(大额支付预警/重复付款控制/头寸风险/汇率风险/合规性检查)五项在前后端均无任何实现,无法推翻。后端支付链(PaymentController/PaymentService/FundPoolController/Payment实体)只实现了审批闸(创建强制「待付」、confirmPay 网关结算)、合同累计已付回写、幂等记账凭证三件事,完全没有任何风险拦截逻辑:(1)无大额支付预警——create/confirmPay 仅校验 payeeName 非空、amount>0,没有任何金额阈值→拦截或→高级/分级审批分支;(2)无黑白名单——Payment 实体无 payee 黑名单标记,全代码库 grep 黑名单/白名单/Blacklist/Whitelist 在支付域零命中(命中的全是 AuthInterceptor 路径白名单、HtmlSanitizer 标签白名单等无关项);(3)无重复付款控制——唯一的「duplicate/幂等」是 PaymentService.autoVoucher 对凭证按(sourceType,sourceId)去重,与「同收款人/同金额/同发票重复付款检测」无关,confirmPay 不做任何重复付款查重;(4)无头寸风险——FundPoolController 只按主体聚合 invoicedTotal-outflowTotal 得净 balance,从不与安全备付金比较、也无资金缺口预测;(5)无汇率风险——Payment 实体连 currency 字段都没有,更无外币监控/锁汇/远期套保;(6)无合规性检查——无收款账户黑名单校验、无外汇/授权范围校验。前端 payment 目录(board/ledger/fundpool/financing/byinvoice)全是只读聚合台账或 mock settingStore 列表(financing.vue 为 mock 融资数据),无任何风险预警 UI;支付审批模板(payment-apply.ts/src-hq-payment.ts/src-group-small-payment.ts)只有静态文字提示「无合同支撑的付款不予受理」,无金额条件分支。整模块未实现,初判 MISSING 成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java(create第60-67行仅强制待付、confirmPay第76-94行仅结算+回写+记账,无任何风险拦截; autoVoucher第113-130行的去重是凭证幂等非付款查重); oa-backend/src/main/java/com/kaidi/oa/web/PaymentController.java(create第70-93行仅校验 payeeName/amount>0); oa-backend/src/main/java/com/kaidi/oa/domain/Payment.java(字段无 currency/blacklist/risk 任何项); oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java(第60-104行仅聚合净 balance,无安全备付金比较/缺口预测)。全后端 grep Blacklist/Whitelist/Hedge/锁汇/远期/头寸/备付金/FxRisk/PaymentLimit/重复付款 在支付域零命中。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/api/payments.ts(仅 list/get/create/pay/reject); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/{board.vue,ledger.vue,financing.vue,fundpool.vue}(只读聚合/mock,无风险预警)。支付控制器仅 Payment/FundPool/BankAccount/Alert,无任何 Risk/限额/黑名单控制器。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "7. 报表与统计分析", "verdict": "MISSING", "gap": "无资金日报/月报; 无现金流量表(直接法/间接法 经营投资筹资); 无账户余额分析; 无资金集中度分析; 无利息分析; 无票据分析。仅有 receivable/outflow/netCash 聚合与付款分布看板, 远不覆盖。初判成立。", "severity": "med", "evidence": "资金类报表端点仅: ReportController /reports/overview(平台总览) 与 BusinessBiController /reports/business-overview, 其中 FundStat 仅含 receivable/outflow/netCash 三个聚合数(第 99-100、169-181 行)。前端 payment/board.vue 是付款记录按主体/类型/状态的柱状聚合看板。全后端 grep 现金流/cashFlow/资金日报/资金月报/余额调节 零命中。无直接法/间接法现金流量表、无账户余额分析(按银行公司分布/闲置资金识别)、无资金集中度分析(归集/内部结算比例/资金池效率)、无利息分析、无票据分析。", "survives": true, "reNote": "缺口属实,无法推翻。资金支付/结算中心的报表能力仅有缺口已承认的部分:board.vue 的付款分布看板(已付/待付总额、按主体/类型分布)和 FundPoolController 的 receivable/outflow/netCash 按主体聚合。彻查后端 90+ 控制器与前端 33 模块,未发现任何资金日报/月报、现金流量表(直接法/间接法 经营/投资/筹资)、账户余额分析、资金集中度分析、利息分析、票据分析的实现。关键结构性证据:BankAccount 实体根本没有 balance(余额)字段,Payment 实体没有 interest/note/票据 字段,也没有任何按日/按月的时间分桶聚合——这些报表所需的底层数据本身就不存在,故无法实现。ReportController 仅 /overview 一个通用聚合端点。唯一的 CashFlowStatement 关键词命中全在已弃用的 OFBiz 静态生成文件(ofbiz-framework/.../generated/),与活体 ERP 后端逻辑无关。六类报表全部缺失。", "reEvidence": "前端模块定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:233-237(payment 仅 ledger/byinvoice/fundpool/board/financing 五页);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/board.vue:33-48(仅已付/待付总额+按subject/payType分布);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/fundpool.vue:1-2 与 oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java:42-103(仅按主体 contract/invoiced/outflow/balance 聚合);oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java:100,169-182(FundStat 仅 receivable/outflow/netCash);oa-backend/src/main/java/com/kaidi/oa/domain/BankAccount.java:16-28(无 balance 字段);oa-backend/src/main/java/com/kaidi/oa/domain/Payment.java:25-51(无 interest/note/票据 字段,payDate 未做日/月分桶);oa-backend/src/main/java/com/kaidi/oa/web/ReportController.java:58-59(仅 /overview)。全后端 Java 对 现金流量/直接法/间接法/经营投资筹资/集中度/利息分析/票据分析/账户余额分析 关键词零命中;CashFlowStatement 仅出现在弃用的 ofbiz-framework/.../static/generated/ 静态文件。" }, { "area": "支付中心 / 结算中心/资金保障·结算复核", "module": "8. 与其他部门接口要求", "verdict": "PARTIAL", "gap": "缺银企直连/票交所/工资代发/回款认领催收/预算余额校验/资金计划与内部往来确认接口/对账单与余额调节表。仅财务凭证回写链与发票-合同联动存在。初判成立。", "severity": "med", "evidence": "已存在的接口/联动: (1)财务凭证回写链——PaymentService.confirmPay 自动生成付款记账凭证、ProjectController/InvoiceController 生成应收凭证; (2)发票联动——InvoiceController.applyContractDelta 销项已开→回写合同 invoicedAmount, TriggerRuleEngine payment.create(付款办结→待付付款单)、receipt.invoice(收款确认→待开发票)、contract.effectivate 等审批后下游联动。但缺: 银企直连(余额/明细/支付/回单)、票交所电子票据、人力工资表批量代发接口、回款认领/催收接口(模块3缺)、成本控制部预算余额校验联动(付款时不校验预算, 已在模块2核实)、各分子公司资金计划/内部往来确认接口(模块4/5缺)、银行对账单/余额调节表生成(grep 余额调节 零命中)。", "survives": true, "reNote": "尽力推翻未果,缺口属实。逐项核查支付/结算中心的\"与其他部门接口\"诉求,确认仅存在两条已实现的链路,其余全部缺失:\n\n已实现(缺口本身也承认): (1) 财务凭证回写链 — PaymentService.autoVoucher() 在付款办结(待付→已付)时自动生成记账凭证(借应付账款/贷银行存款);(2) 发票-合同联动 — InvoiceController.applyContractDelta() 在销项发票\"待开→已开\"时回写合同 invoicedAmount。TriggerRuleEngine 还含 payment.create / receipt.invoice 等下游联动。\n\n缺失(全树 grep 零命中,已排除注释/表单标签/部门视图元数据后): 银企直连、票交所(ECDS)、工资代发、回款认领/催收、预算余额校验、资金计划、内部往来(intercompany)确认接口、对账单与余额调节表 — 这八类接口均无任何实现代码。\n\n关键反证:\n- BankAccountController 仅是 bank-accounts 的纯 CRUD(GET/POST/PUT/DELETE),无任何对账/银企直连/余额拉取。\n- PaymentController/PaymentService 付款不做预算余额校验,无银企直连出账。\n- BudgetController.create 只在预算行自身 actualAmount>budgetAmount 时标记\"超支\",付款/费用申请并不反查可用预算余额(无 budgetCheck/availableBudget/预算占用)。\n- FundPoolController 只是把合同与已付付款按公司主体在内存里做汇总(invoicedTotal-outflowTotal=balance),不是对账单也不是余额调节表,无银行侧数据接入。\n- 出现\"对账\"字样的只有 src-bank-open.ts(对账周期下拉)和 src-cost-settle.ts(对账函附件)两个审批表单的字段标签,属表单文本而非接口实现。\n- 出现\"工资代发/回款/催收/资金计划/内部往来\"等仅见于 kaidiDeptView.ts 的 interfaces 数组(部门接口的文字描述/组织图元数据),非功能代码。\n- 前端 finance 页(accounts/asset/expense/payable/receivable/tax/vouchers)与 payment 页(board/byinvoice/financing/fundpool/ledger)均为 settingListStore 驱动的薄 CRUD;receivable.vue 仅 35 行、列为客户/合同/应收/已收/账期/状态,无认领/催收/核销逻辑。\n\n判定 PARTIAL 成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/PaymentController.java (纯付款CRUD+pay/reject,无预算校验/银企直连); web/BankAccountController.java (银行账户纯CRUD,无对账/直连); web/FundPoolController.java:59-104 (内存汇总而非对账单/余额调节表); web/BudgetController.java:68-99 (仅预算行自身超支标记,无付款侧余额校验); service/PaymentService.java:113 autoVoucher() (已实现的凭证回写链); web/InvoiceController.java:53-77 applyContractDelta() (已实现的发票-合同联动); service/TriggerRuleEngine.java:148,189 (payment.create/receipt.invoice 下游联动)。\n前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/receivable.vue (35行薄CRUD,无认领/催收); 同目录 accounts/asset/expense/payable/tax/vouchers.vue 及 oa/pages/payment/{board,byinvoice,financing,fundpool,ledger}.vue 均薄CRUD; oa/engine/templates/src/src-bank-open.ts:32-36 与 src-cost-settle.ts:39,44 (仅表单标签出现\"对账\"字样); data/kaidiDeptView.ts (interfaces 数组为部门接口文字描述,非实现)。\n全树验证: 对 directConnect/银企直连/票交所/ecds/payroll/工资代发/余额调节表/reconciliationStatement/balanceAdjustment/资金计划/fundPlan/内部往来/intercompany/budgetCheck/availableBudget/回款认领/dunning/催收 等关键字在 oa-backend 全 .java 树 grep 命中数为 0;前端排除 kaidiDeptView.ts 与 engine/templates 后命中数为 0。" }, { "area": "财务部/支付中心", "module": "1. 总账与会计凭证管理", "verdict": "LOGIC_GAP", "gap": "缺辅助核算多维度、科目启禁用审批、凭证制单-审核-过账状态机、红冲、凭证模板、自定义/自动结转损益、期末调汇/计提所得税/结账试算平衡、账簿查询与原始凭证穿透;自动凭证仅付款一源。", "severity": "high", "evidence": "Account.java 字段仅 code/name/category/direction/parentCode/level/balance,无任何辅助核算维度列(部门/项目/客户/供应商/成本中心),AccountController 纯 CRUD 无启禁用审批。Voucher.java status 仅字符串字段,VoucherController 仅 CRUD(已记账禁编辑),无制单→审核→过账状态机动作、无红冲、无凭证模板/结转/期末调汇/试算平衡。唯一自动凭证是 PaymentService.autoVoucher(付款已付→借应付账款/贷银行存款),无销售/费用/收款多源;无账簿(总账/明细账/科目余额表/多栏账)查询与穿透。ReportController 仅审批/会议/文档运营统计。", "survives": true, "reNote": "缺口基本属实,无法推翻。总账/会计凭证模块(财务部/支付中心 §2.7)在代码与活体均仅为最简 CRUD,所列高阶会计能力全部未实现。逐项核验:\n\n1) 辅助核算多维度——未实现。Voucher 实体(domain/Voucher.java)只有单借/单贷字符串字段(debitAccount/creditAccount),无项目/部门/往来/成本中心等任何辅助核算维度列;Account 实体也无辅助核算项配置。grep auxiliary/辅助核算/dimension/costCenter 在两实体上 0 命中。\n\n2) 科目启禁用审批——未实现。Account 实体无 status/enabled 字段,AccountController 只有增删改查;无停用/启用接口,更无审批流。活体 POST /accounts/1/disable、/enable 均 404。\n\n3) 凭证制单-审核-过账状态机——未实现。状态只是自由文本字段,VOUCHER_STATUSES=['暂存','已审核','已记账'] 由前端下拉/PUT 任意赋值(VoucherController.update 第99行 if(status!=null) 直接覆盖,可任意跳转、无流转校验)。仅有的约束是“已记账不可编辑”(第85行)。无独立 audit/post 动作接口;活体 POST /vouchers/1/audit、/post 均 404。\n\n4) 红冲——未实现。无任何 reverse/红冲逻辑;活体 POST /vouchers/1/reverse 404,/vouchers/red 405(被 /vouchers/{id} 误匹配)。\n\n5) 凭证模板——未实现。无 VoucherTemplate 实体/控制器;活体 /voucher-templates 404。\n\n6) 结转损益(自定义/自动)、期末调汇、计提所得税、结账试算平衡——全部未实现。后端无任何相关 service/controller;活体 /carry-forward、/trial-balance、/period-close 全 404。\n\n7) 账簿查询与原始凭证穿透——未实现。VoucherRepository 只有 findByStatus + existsBySourceTypeAndSourceId(幂等用),无总账/明细账/科目余额聚合查询,无穿透;活体 /ledger、/general-ledger 404。前端 finance.ts 仅导出 accounts/vouchers 两组裸 CRUD。\n\n唯一不准确之处(对缺口描述的轻微反驳):“自动凭证仅付款一源”不成立——实际有两源:PaymentService.autoVoucher(付款 借应付账款/贷银行存款)与 ProjectController.generateAcceptanceVoucher(项目验收 借应收账款/贷主营业务收入)。但这不改变 LOGIC_GAP 主体判定,缺口整体 real=true。", "reEvidence": "后端:oa-backend/src/main/java/com/kaidi/oa/domain/Voucher.java(单借/单贷无辅助核算维度,状态为纯字符串)、web/VoucherController.java(仅CRUD,update第99行任意覆盖status,第85行仅“已记账不可编辑”,无审核/过账/红冲动作)、domain/Account.java+web/AccountController.java(无status/启禁用/审批)、repository/VoucherRepository.java(仅findByStatus+幂等检查,无账簿/穿透查询)。自动凭证两源(反驳“仅付款一源”):service/PaymentService.java:113-130 与 web/ProjectController.java:145-176。前端:ofbiz-framework/plugins/modern-ui/app/src/oa/api/finance.ts(仅accounts/vouchers裸CRUD)、oa/pages/finance/vouchers.vue 与 accounts.vue(MasterDataPage纯增删改查,无任何状态机/红冲/模板/结转/试算按钮)。活体探测(127.0.0.1:8091):/vouchers/1/audit、/post、/reverse、/voucher-templates、/accounts/1/disable、/enable、/carry-forward、/trial-balance、/ledger、/general-ledger、/period-close 全部404;仅 GET /vouchers 返回200。" }, { "area": "财务部/支付中心", "module": "2. 应收账款管理", "verdict": "LOGIC_GAP", "gap": "无从销售合同/发票自动生成应收单与结构化后端实体;无收款单关联应收+按订单/发票自动核销+部分/超额/预收;无收款凭证;无坏账/信用减值按账龄/个别认定自动计提;无按履约进度确认收入。", "severity": "high", "evidence": "finance/receivable.vue 用 settingListStore('finance-receivable',[mock]) 键值持久化,客户/账期/状态仅前端文本,无后端结构化应收实体/Controller/Repository。唯一真实联动是 TriggerRuleEngine.ruleCreateReceivableInvoice:收款/到账办结→生成待开销项发票草稿,开具时 InvoiceController.applyContractDelta 回写合同 invoicedAmount——是到账→开票→入账,非销售合同/发票→应收单。无收款单核销/部分/超额/预收,无坏账账龄比例法/个别认定法计提。", "survives": true, "reNote": "缺口属实。AR(应收账款)五项要件全部缺失,无法推翻。逐项核实:(1) 无结构化应收单实体——domain 目录 81 个实体里无 Receivable/应收单/Receipt,无对应 repository/controller(grep 全空);前端 finance/receivable.vue 只是 MasterDataPage 通用 CRUD,靠 settingListStore('finance-receivable') 把行存进 BizRecord(bizType+dataJson 无模式 blob 行,/api/oa/biz/finance-receivable),客户/合同/应收金额/已收/账期/状态全是手填自由文本,无 FK;TriggerRuleEngine.ruleCreateReceivableInvoice 生成的是「待开」销项 Invoice 草稿,不是应收单。(2) 无收款单——Payment 实体是纯付款出账(payeeName,待付/已付/已驳回,confirmPay 回写 contract.paidAmount,凭证借应付账款/贷银行存款),全系统无 Receipt/收款实体;无核销(核销/writeoff grep 空),received 字段纯手填;无部分/超额/预收处理。(3) 无收款凭证——活体凭证生成仅两处:PaymentService.autoVoucher(借应付账款/贷银行存款,付款凭证)与 ProjectController.generateAcceptanceVoucher(借应收账款/贷主营业务收入,收入凭证),均非收款凭证(借银行存款/贷应收账款);DataSeeder 里那条「银行存款/应收账款」仅静态种子,无任何收款流程触发它。(4) 无坏账/信用减值/账龄计提——坏账/bad-debt/信用减值/账龄/aging/计提/provision 在前后端 grep 全空。(5) 无按履约进度确认收入——generateAcceptanceVoucher 仅在 phase 推进到「验收」里程碑时一次性按合同全额确认收入(时点法),非按履约进度/完工百分比(over-time);ContractMilestone 虽有 per-node amount 但无任何逻辑把节点进度联动到收入确认。唯一可作辩方的部分缓解是验收时确实自动生成了「借应收账款/贷主营业务收入」收入凭证(GL 层面建立了 AR 余额),但它是里程碑时点法、无结构化应收子台账、无收款/核销/账龄/坏账,故不足以推翻该复合缺口。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/Invoice.java(简单发票实体,无应收/核销/账龄字段); oa-backend/src/main/java/com/kaidi/oa/domain/Payment.java(纯付款出账); oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java:113-130(autoVoucher 借应付账款/贷银行存款,付款凭证); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:188-233(ruleCreateReceivableInvoice 仅生成待开销项发票草稿,非应收单/无核销); oa-backend/src/main/java/com/kaidi/oa/web/ProjectController.java:145-176(generateAcceptanceVoucher 验收里程碑一次性按合同全额借应收账款/贷主营业务收入,非按履约进度,非收款凭证); oa-backend/src/main/java/com/kaidi/oa/domain/ContractMilestone.java(有 amount 无收入确认联动); oa-backend/src/main/java/com/kaidi/oa/domain/BizRecord.java:23-39(通用 bizType+dataJson 行表); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/receivable.vue(MasterDataPage 通用 CRUD,全手填字段); ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts(/api/oa/biz/{type} 通用台账存储); grep 核销/坏账/账龄/信用减值/收入确认/履约进度 前后端均无实现命中; domain 目录与 web/repository 目录均无 Receivable/Receipt/Collection 实体或控制器" }, { "area": "财务部/支付中心", "module": "3. 应付账款管理", "verdict": "PARTIAL", "gap": "无从采购合同/发票自动生成应付单、无供应商/账期/发票状态结构化后端实体与采购→应付自动联动;仅付款侧凭证联动真实,缺真正应付台账。", "severity": "med", "evidence": "finance/payable.vue 为 settingListStore('finance-payable',[mock]) 纯前端手填,供应商/账期/发票状态仅文本,无后端应付实体/Repository。存在表单模板 src-payable-confirm.ts(项目人材机合同应付资金确认单,字段详尽+多公司并行审批流),但它是审批表单非应付台账实体;其名含合同应付资金确认单,在 TriggerRuleEngine 不含付款/报销/费用/请款关键词,会落入合同分支(ruleEffectivateContract),不生成应付台账。付款侧凭证联动(PaymentService.autoVoucher 借应付账款)为真,但无采购→应付自动生成链。", "survives": true, "reNote": "缺口属实(PARTIAL)。无法推翻。证据如下:\n\n1) 无真正应付台账实体。oa-backend/.../domain/ 全列表中无 Payable.java/AccountPayable.java/PurchaseOrder.java。\"应付账款\"仅以两种形式存在:(a) Account 实体的一行总账科目\"2202 应付账款\"(DataSeeder.java:2816)——只有 code/name/category/direction/balance 单一聚合余额(5320000),非按供应商/发票/合同分行的台账;(b) Voucher 的借方科目字符串\"应付账款\"。\n\n2) 无采购→应付自动联动。service/TriggerRuleEngine.java 全文无\"应付/payable\"关键字与规则;规则矩阵只覆盖 付款/合同/收款/验收/供应商/用印/立项(行109-128)。进项发票永不生成应付单。更关键:前端已备齐采购应付确认单模板 src-payable-confirm.ts(项目\"人材机\"合同应付资金确认单,含供应商+成本合同+发票含税/不含税/税额/税率/号码/开票日期+合同累计应付/已付/已开票+本次应付金额+借贷科目),但其办结时因名称含\"合同\"会落入 ruleEffectivateContract(把既有合同置\"已生效\"),完全不创建任何应付实体。\n\n3) 供应商/账期/发票状态结构化实体单薄且未联动。Supplier.java 无账期/付款条款字段。Invoice.java 有 type(进项/销项)/status(待开/已开)但只有自由文本 partyName,无 supplierId 外键、无 dueDate/账期,无法驱动应付到期台账。InvoiceController.java:45-51 明确把进项发票排除在回写之外(只有销项回写合同 invoicedAmount 应收侧),进项发票无任何应付对应回写。\n\n4) 仅付款侧凭证联动真实——与缺口描述完全吻合。PaymentService.confirmPay→autoVoucher 在结算(确认放款)时记\"借 应付账款/贷 银行存款\"(PaymentService.java:113-130)。这是付款出账瞬间的凭证,上游收货/到票时并无\"借 库存/费用 贷 应付账款\"的建账动作,故无真实应付挂账。\n\n5) 前端应付页纯 mock。finance/payable.vue 用 settingListStore('finance-payable', [...3 条硬编码])——即通用 /settings/{key} 键值 mock 持久化套路;后端 web/ 下无 /api/oa/payables 控制器(grep 确认)。\n\n综上:从采购合同/发票自动生成应付单=无;供应商/账期/发票状态结构化后端实体+采购→应付自动联动=无;真正应付台账=无;仅付款侧凭证联动真实=确认。PARTIAL 判定准确。", "reEvidence": "关键文件与行号:\n- oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java(全文无\"应付/payable\"规则;规则矩阵 fire() 行109-128 仅 付款/合同/收款/验收/供应商/用印/立项)\n- oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java:113-130(autoVoucher:仅结算放款时记\"借 应付账款/贷 银行存款\",付款侧凭证)\n- oa-backend/src/main/java/com/kaidi/oa/web/InvoiceController.java:45-51(进项发票被排除回写,无应付对应)\n- oa-backend/src/main/java/com/kaidi/oa/domain/Invoice.java(partyName 自由文本,无 supplierId、无 dueDate/账期)\n- oa-backend/src/main/java/com/kaidi/oa/domain/Supplier.java(无账期/付款条款字段)\n- oa-backend/src/main/java/com/kaidi/oa/domain/Account.java:22-42(应付账款仅单行总账科目+单一 balance)\n- oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:2816(account(\"2202\",\"应付账款\"...) 静态期初余额)\n- domain/ 目录全列表:无 Payable.java/AccountPayable.java/PurchaseOrder.java\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/payable.vue:6-10(settingListStore('finance-payable', [3 条硬编码 mock]),无真实后端)\n- ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-payable-confirm.ts(采购应付确认单模板齐备,但办结因名称含\"合同\"被 ruleEffectivateContract 误路由,不建应付)\n- web/ 下 grep 无 /api/oa/payables 控制器" }, { "area": "财务部/支付中心", "module": "4. 研发费用管理", "verdict": "LOGIC_GAP", "gap": "仅手填费用归集表;缺工时填报审核与按占比分摊、直接投入/动力/折旧自动归集、加计扣除口径校验、三口径切换、费用化/资本化记账与结转、HR/资产档案同步、交叉比对预警。", "severity": "high", "evidence": "RdExpenseController/RdExpense.java 为手填费用归集 CRUD:rdProjectId/category(人工费/直接投入/折旧/无形资产摊销/设计费/其他 select)/amount(手填)/status。无工时实体/timesheet、无库存/能源/劳务自动归集、无折旧自动分摊(全库0处折旧/计提代码)、无委托研发80%/境外2/3校验、无超10%标记、无三口径切换、无费用化/资本化区分记账与总账同步、无结题自动结转、无个税/社保交叉比对、无HR同步。", "survives": true, "reNote": "缺口属实。研发费用管理(链6)仅有一张纯手填的费用归集表,描述里列举的8项进阶能力全部缺失,我尽力在前后端彻查后无法推翻。证据如下:\n\n1) 后端 RdExpenseController.java 是纯扁平 CRUD(list/get/create/update/delete),create 直接吃前端传入的 category/amount/voucher/status;RdExpense.java 实体也只是 category/amount/voucher/status/recorder 等手填字段,无任何工时、占比、口径、记账状态字段。无任何计算逻辑。\n\n2) 缺工时填报审核+按占比分摊:全后端无 timesheet/工时填报/分摊/apportion 实体或服务;WorkflowService/TriggerRuleEngine 中 grep 不到任何 rdExpense/加计/资本化/费用化/工时审核/占比分摊/结转 引用。前端 hr/worktime.vue 只是「标准工时/考勤规则/节假日」配置页(打卡制度),不是工时填报,更无按占比向研发项目分摊的逻辑。\n\n3) 缺直接投入/动力/折旧自动归集:category 是前端下拉框(人工费/直接投入/折旧费用/无形资产摊销/设计费/其他)手选 + 金额手填,无任何从 HR/资产档案自动归集的来源。\n\n4) 缺加计扣除口径校验 / 三口径切换:全前后端 grep 不到加计扣除/super-deduct/三口径/口径切换的实现。rd/annualreport.vue 只是一张通用主数据列表(settingList store),「关键指标」是手填字符串如『研发费用1860万』,无任何口径计算或校验。\n\n5) 缺费用化/资本化记账与结转:RdExpense 无 capitalize/expense 标志位与凭证结转动作;Voucher 控制器与 service 中无 rdExpense 引用。\n\n6) 缺 HR/资产档案同步、交叉比对预警:无任何同步或比对预警逻辑。\n\n7) 前端 rd/expenses.vue 直接用通用 MasterDataPage 渲染一张手填表单(rdProjectId/category/amount/voucher 全手输),rd-expense 的 list/create/update/delete API 仅此一页消费,再无第二处带计算的页面。CostCenterController 虽有责任中心树预算/实际上卷,但与研发费用按占比分摊毫无关联。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/RdExpenseController.java (纯CRUD,create直接保存前端字段); oa-backend/src/main/java/com/kaidi/oa/domain/RdExpense.java (仅category/amount/voucher/status手填字段,无工时/占比/口径/记账态); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/expenses.vue (通用MasterDataPage手填表单); ofbiz-framework/plugins/modern-ui/app/src/oa/api/rdextra.ts (仅list/create/update/delete); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/worktime.vue (考勤配置页,非工时填报/分摊); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/annualreport.vue (通用列表,关键指标为手填字符串,无加计扣除计算); 全后端grep无 加计/资本化/费用化/三口径/工时审核/占比分摊/结转 命中(service/与VoucherController内均无rdExpense引用)" }, { "area": "财务部/支付中心", "module": "5. 费用报销管理", "verdict": "LOGIC_GAP", "gap": "报销页纯mock手填;缺预算余额自动校验/超预算冻结、发票验真查重OCR、移动端拍照、报销专用分级审批流、借款还款核销逾期扣款;仅审批办结→待付付款单推送为真。", "severity": "high", "evidence": "finance/expense.vue 为 settingListStore('finance-expense',[mock]) 纯前端手填,dept/category 仅文本,无项目/成本中心结构化。无 budget 校验:grep 确认 PaymentController/ContractController/service 写路径0处引用 budgetRepo,TriggerRuleEngine.ruleCreatePayment 不校验预算。无发票税局验真/查重/OCR、无移动端拍照、无报销专用分级审批流、无借款申请/还款核销/逾期扣工资。真实部分:ruleCreatePayment 命中报销/费用/请款办结→自动建待付付款单(payType=费用报销),待 confirmPay 放款。", "survives": true, "reNote": "缺口基本属实。尽力反驳后,五项缺失能力中仅\"报销专用分级审批流\"一项可部分推翻,其余四项(预算余额校验/超预算冻结、发票OCR/验真/查重、移动端拍照、借款还款核销逾期扣款)在前后端均查无实现;且唯一已实现的审批分流也并未挂接到缺口点名的报销页。缺口点名的 finance/expense.vue 确为纯 mock 手填,唯一为真的是\"办结→待付付款单推送\"。判定 real=true。", "reEvidence": "页面=纯mock:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/expense.vue 整页用 settingListStore('finance-expense', [...]) 做通用键值CRUD(applicant/dept/category/amount/date/status 全手填,无任何校验逻辑);活体 GET /api/oa/settings/list_finance-expense 返回 data:null。\n\n部分可推翻项(分级审批流确有实现,但与该页无关):oa-backend/.../seed/TemplateSeedData.java:221-244 expense-reimburse 模板=部门主管→财务审核→总经理多级流;同文件 ~530-568 expense-cond 模板按金额条件分流(金额≥1万→总经理审批 / <1万→直接通过→财务复核),由 service/WorkflowService.java:1136 chooseCaseTarget + evaluateNumericCondition 实时求值。这是真引擎,但走的是 FormInstance 审批子系统,未接入 finance/expense.vue。\n\n不可推翻项:\n1) 预算校验/超预算冻结=无:web/BudgetController.java 仅独立CRUD,create 时 actual>budget 仅置\"超支\"标签,与报销无任何联动;service/PaymentService.java create 中 grep budget/预算/余额/冻结=0命中;活体 /api/oa/budgets 仅200独立台账。\n2) 发票OCR/验真/查重=无:repository/InvoiceRepository.java 只有 findByProjectId,无 findByNumber/existsByNumber/唯一约束;web/ 下无 ocr/verify 控制器,无 /verify /ocr /dedup 映射;活体 /api/oa/invoices/verify、/ocr 均400(落到 /{id} 非数字)。\n3) 移动端拍照=无:前端 grep 拍照|capture=camera|getUserMedia|accept=image 在 expense/invoice 相关页 0命中。\n4) 借款/还款核销/逾期扣款=无:domain/ 与 web/ 下无 loan/advance/writeoff/borrow/repay 任何实体或控制器;前端\"借款/还款/逾期\"命中均为无关(payment/financing.vue 银行贷款、合同里程碑逾期、ErpStatusTag 状态色、collab/mock.ts:19 一个静态字符串\"财务部费用核销专项审批\"),无任何报销借款核销功能。\n5) 仅为真:service/TriggerRuleEngine.java:147-180 ruleCreatePayment 在审批办结后生成\"待付\"付款单(payType 含\"报销\"→\"费用报销\"),与缺口描述一致。" }, { "area": "财务部/支付中心", "module": "6. 税务管理", "verdict": "MISSING", "gap": "整模块仅一张手填申报状态表;销项/进项/增值税计算申报、所得税、其他税种、电子税务局对接、税务风险预警全缺。", "severity": "high", "evidence": "finance/tax.vue 为 settingListStore('finance-tax',[3行mock]),仅 taxType/period/taxBase/taxAmount/status/filingDate 手填,无任何计算。无税控盘/电子税务局对接、无销项开票/作废红冲、无进项勾选认证抵扣台账、无增值税应纳税额计算与申报表、无所得税季度/年度/递延、无印花税/房产税/土地使用税/个税代扣、无一键申报在线缴税、无税负率/发票异常/进销项不匹配预警。Invoice 有 amount/taxAmount/total 仅价税合计派生,非增值税申报。", "survives": true, "reNote": "缺口属实。税务管理整模块只有一张手填表,无任何税额计算/申报生成/电子税务局对接/风险预警。", "reEvidence": "前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/tax.vue 是唯一的税务页:用通用键值持久化 settingListStore('finance-tax', ...) 兜底,MasterDataPage 列表只有 税种/所属期/计税金额/应纳税额/申报状态/申报日期 六列;taxBase、taxAmount 均为 type:'number' 自由录入,status 为手填 select(待申报/已申报/已缴款),没有任何把应纳税额按税率从计税金额推导的逻辑。模块定义 src/data/oaModules.ts:406 仅 { key:'tax', label:'税务管理', kind:'list', path:'/finance/tax' }——一个纯 list 页。后端 oa-backend/.../web 下没有任何 *Tax* 控制器(ls 验证无);全仓 grep 电子税务局/税务局/风险预警/税务风险/计税/抵扣/留抵/发票认证/纳税申报表 在税务模块内零命中——仅命中的是 rd/annualreport.vue(研发年报)与 src-progress-payment.ts 工作流模板里的纯附件标签,均与税务模块无关。Invoice 实体(domain/Invoice.java)虽有 type 进项/销项 与 taxAmount,但 InvoiceController.java 只把销项已开金额回写合同应收(invoicedAmount),taxAmount 为手填、从不被汇总进任何增值税计算或申报;TriggerRuleEngine.java 唯一相关联动只是收款确认后自动生成一张\"待开\"销项发票草稿,不做税额计算。Declaration.java 注释明确是政府研发项目申报(高新/科技型中小企业等),与税务无关。故 销项/进项/增值税计算申报、所得税、其他税种、电子税务局对接、税务风险预警 全缺,缺口成立。" }, { "area": "财务部/支付中心", "module": "7. 资产管理", "verdict": "MISSING", "gap": "资产卡片结构化、增减变动审批、自动折旧计提+凭证+分摊、盘点扫码、新租赁准则、减值测试全缺;累计折旧人工填非系统按直线法/双倍余额递减计算。", "severity": "high", "evidence": "finance/asset.vue 为 settingListStore('finance-asset',[mock]),累计折旧/净值均手填 number 输入。全库 grep 折旧/计提/depreciation 0处代码,无任何自动折旧。无资产卡片结构化(残值/年限/折旧方法/影像)、无增减变动审批、无每月自动计提折旧+凭证+按部门成本中心分摊、无盘点扫码盘盈盘亏、无新租赁准则使用权资产/租赁负债/利息摊销、无减值测试。ItAssetController 是信息部 IT 资产台账(在用/闲置/维修/报废),无原值/残值/折旧,非财务固定资产模块。", "survives": true, "reNote": "Gap confirmed. No asset management logic exists. ItAsset entity has flat fields only with no original value, accumulated depreciation, net value, useful life, salvage, or depreciation method. Controller is plain CRUD with no approval workflow. No depreciation accrual, voucher generation, or allocation. No stocktaking scan, no lease standard, no impairment test. Accumulated depreciation is a manual number input, not computed by straight-line or double-declining-balance.\n\n", "reEvidence": "ItAsset.java has no depreciation fields. ItAssetController.java is plain CRUD. finance asset.vue lines 7 to 29 define depreciation and netValue as manual number inputs. settingList.ts is generic key-value CRUD. TriggerRuleEngine.java has no asset rule. Grep for depreciation, stocktake, impairment, lease returned zero business hits. Live GET it-assets returns no depreciation fields." }, { "area": "财务部/支付中心", "module": "8. 成本核算与管理", "verdict": "PARTIAL", "gap": "差异仅总差异无量/价/效率拆解;料工费实际手填无从采购/生产/报销自动采集;无四种成本计算法月末自动计算、无多动因可配分摊自动执行、无产品成本表/趋势图。成本中心上卷与料工费拆分为真。", "severity": "med", "evidence": "真实部分:StandardCostController 把成本拆 material/labor/overhead(料/工/费),服务端派生 totalStandard=料+工+费、variance=actual-standard;/rollup 与 /rollup-tree 按成本中心责任树多级上卷六口径。CostCenterController 有 ccType(项目/部门/公司/工序)多级树+预算/实际 rollup。但差异仅总差异(variance=actual-totalStandard),无量/价/效率拆解。料/工/费/actualCost/budgetTotal/actualTotal 全手填——控制器注释自承认料/工/费实际归集来源(生产工单/领料单/工时系统/费用分摊)当前为手填+服务端自动汇总的框架实现。WorkOrder 无成本字段→无生产采集。无品种/分批/分步/作业成本法月末计算、无多动因可配分摊自动执行、无成本计算表/趋势图。", "survives": true, "reNote": "缺口属实,无法推翻。成本核算模块(标准成本台账)确实只做了手填+轻汇总,缺口描述的每条未实现项都已逐一在代码中证实:\n\n1) 仅总差异无量/价/效率拆解 —— 属实。StandardCostController.recompute() 只算 variance = actualCost − totalStandard 单一标量(行71-75);StandardCost 实体只有一个 variance 字段(行47)。全后端 grep 无 priceVariance/quantityVariance/efficiencyVariance/价差/量差/效率差 任何命中。\n\n2) 料/工/费实际手填、无自动采集 —— 属实。materialCost/laborCost/overheadCost/actualCost 的 setter 只被 StandardCostController 从 StandardCostRequest(POST/PUT 请求体)赋值,控制器与实体里完全没有引用 WorkOrder/Invoice/RdExpense/领料/采购/工时/报销。两份源文件 javadoc 自陈\"当前实现为手填 + 自动汇总框架\"。\n\n3) 无四种成本计算法+月末自动计算 —— 属实。grep FIFO/LIFO/weighted/加权平均/先进先出/移动平均/costingMethod/成本计算法 全部零命中;唯一 @Scheduled 是 AlertScheduler(告警提醒),与成本无关。\"月末/结转\"仅出现在种子数据(一条 Voucher + 一条 Feed 动态文案)。\n\n4) 无多动因可配分摊自动执行 —— 属实。grep 动因/costDriver/apportion/allocation 无功能性命中;\"分摊\"仅见于 RdExpense 种子串与 StandardCost javadoc 自述出界口径。\n\n5) 无产品成本表/趋势图 —— 属实。前端 standardcost.vue(301行)无 chart/echart/canvas/svg/趋势 任何命中;costing.ts 仅暴露 list/create/update/delete + rollup/rollup-tree(成本中心上卷聚合)。\n\n6) 成本中心上卷与料工费拆分为真 —— 与缺口描述一致,/rollup 与 /rollup-tree(多级责任树上卷)确实实现且可用。\n\n仅有的\"自动汇总框架\"只是把已手填的料+工+费求和成 totalStandard、actual−standard 求差,并不构成缺口所列的任一缺失能力。", "reEvidence": "后端 oa-backend/src/main/java/com/kaidi/oa/web/StandardCostController.java: recompute()(行70-75) variance=Money.sub(actualCost,total) 单一总差异;create()(行77-95)与 update()(行98-118)料工费实际全从 StandardCostRequest 请求体手填;rollup()(行136-181)与 rollupTree()(行212-336)仅做成本中心维度上卷聚合。\n实体 oa-backend/src/main/java/com/kaidi/oa/domain/StandardCost.java: 仅 materialCost/laborCost/overheadCost/totalStandard/actualCost/variance 六字段,无量价效率拆分;javadoc(行20-22)自陈\"手填 + 自动汇总框架\"。\n前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/budget/standardcost.vue(301行)与 oa/api/costing.ts: 无趋势图/产品成本表/价量差/计算法/动因分摊,仅 CRUD + rollup/rollup-tree。\ngrep 验证:全后端无 priceVariance/quantityVariance/efficiencyVariance/FIFO/LIFO/加权平均/costingMethod/成本计算法/costDriver/动因 命中;setMaterialCost 等 setter 仅在 StandardCost 实体定义、仅被 StandardCostController 手填路径调用;唯一 @Scheduled 为 oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java(告警,与成本无关);\"月末结转/结转主营业务成本\"仅 DataSeeder.java:2855 与 FeedController.java:63 种子数据。" }, { "area": "财务部/支付中心", "module": "9. 财务数据处理与合规管理", "verdict": "MISSING", "gap": "AI 发票 OCR、AI 报销合规校验、AI 报表/预算初稿生成三项零实现。", "severity": "med", "evidence": "全库 grep OCR/人工智能/AI 仅命中无关上下文(配置类、识别码等),无任何 AI/OCR 集成。无发票 OCR 识别/记账凭证录入辅助、无报销单据合规性自动校验输出、无财务报表/预算分析 AI 初稿生成。无对应控制器/服务/前端页面。", "survives": true, "reNote": "缺口属实。我尽力推翻但无法找到任何一项 AI 能力的实现。三项逐一核实:(1) AI 发票 OCR——InvoiceController/Invoice 实体/masterdata/invoice.vue(仅49行)全是纯 CRUD,无文件上传识别、无扫描、无 OCR、无 model 调用;byinvoice.vue 是按发票付款,与识别无关。(2) AI 报销合规校验——报销只有 finance/expense.vue(纯 settingList CRUD)与 RdExpenseController/PaymentController,无任何合规规则引擎/校验/AI;TriggerRuleEngine 里报销办结只是确定性地\"自动生成一张待付付款单\",非 AI。(3) AI 报表/预算初稿生成——Budget/Report/ReportDefinition/BusinessBi/CostCenter/StandardCost 控制器 grep generate|draft|初稿|AI|智能|建议 零命中;report/budget 前端页里的\"草稿\"只是审批状态标签(待办/办理中/已办结/已退回/草稿),非 AI 生成。全后端零 AI/OCR/ML 依赖、零外部模型 HTTP 客户端(RestTemplate/WebClient/OkHttp/openai/dashscope/baidu/tencent/tesseract 全无命中)。Java 里 grep 到的\"AI\"均为子串误命中(智能装备产品字段、available 等)。三项 AI 功能确属零实现。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/InvoiceController.java(纯CRUD+合同回写,无OCR); oa-backend/src/main/java/com/kaidi/oa/domain/Invoice.java(无附件/识别字段); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/invoice.vue(49行纯MasterDataPage表格); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/expense.vue(报销纯settingList CRUD无合规校验); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:144,183,195(报销/到账办结为确定性自动建单,非AI); ReportController/ReportDefinitionController/BusinessBiController(grep generate|draft|初稿|AI|智能|建议 零命中); 全 oa-backend grep RestTemplate|WebClient|HttpClient|OkHttp|openai|dashscope|aip.baidubce|tencentcloudapi|ocr|tesseract 零命中; pom/build.gradle 无 AI/OCR/ML 依赖" }, { "area": "财务部/支付中心", "module": "10. 资金与出纳管理", "verdict": "PARTIAL", "gap": "出纳侧仅覆盖付款放款一环;缺日记账、银企直连、银行对账与余额调节、现金盘点限额、票据管理、资金调拨审批与内部往来凭证。", "severity": "high", "evidence": "真实部分:PaymentService.confirmPay 付款审批闸(create 强制待付,仅 confirmPay 放款回写合同 paidAmount+autoVoucher 已付自动记账)、FundPoolController 按公司主体内存聚合合同/已开票/已付/balance、BankAccountController 银行账户主档 CRUD。但 BankAccount 仅 accountName/bankName/accountNo/currency/purpose 主数据,无日记账实体(无现金/银行每日收支明细)、无银企直连/流水导入、无银行对账单导入勾对/余额调节表/未达账项、无现金盘点/限额预警、无票据领用核销作废、无集团资金调拨上划下拨审批+内部往来凭证。", "survives": true, "reNote": "缺口属实,无法推翻。资金/出纳侧只有\"付款放款\"一环真正实现,其余出纳职能在后端实体、控制器、service 与前端页面/路由四个层面均不存在。【已实现的出纳/资金相关全集(仅5个控制器)】1) PaymentController(/api/oa/payments)——付款放款,待付→已付的审批闸+回写+生成凭证,正是缺口承认覆盖的那一环;2) FundPoolController(/api/oa/fund-pool)——纯内存聚合报表(按公司主体汇总合同/已开票/流出/余额),无实体、无出纳操作;3) BankAccountController(/api/oa/bank-accounts)——仅银行账户主数据CRUD(账户名/银行/账号/主体/币种/用途),BankAccount实体连balance字段都没有,更无对账单行/调节项;4) AccountController——会计科目;5) VoucherController——通用记账凭证(摘要/借贷科目/金额/暂存-已审核-已记账),不是现金/银行日记账。前端 payment 模块只有 支付台账/见票付款/资金池/支付看板/融资与债务管理 五个子页,finance 模块只有 科目/凭证/应收/应付/费用/税务/资产。【缺口所列7项逐一证伪存在性】对全后端 src 与前端 src grep 关键词(日记账/银企直连/对账/余额调节/盘点/票据管理/资金调拨/内部往来/reconcil/transfer/journal/cashcount):后端仅命中 ReportController 注释里的\"reconciles\"(无关)与 DataSeeder 第452行 dept(\"票据管理部\")——这只是一个部门名字符串,没有任何对应实体或接口;service 层零命中。因此 日记账、银企直连、银行对账与余额调节、现金盘点限额、票据管理、资金调拨审批、内部往来凭证 七项全部缺失,PARTIAL 判定成立。", "reEvidence": "域实体目录 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/ 共90个实体,无 Journal/Reconciliation/CashCount/Note(票据)/FundTransfer/Intercompany 任一;BankAccount.java(/oa-backend/.../domain/BankAccount.java 第18-28行)仅 accountName/bankName/accountNo/companySubject/currency/purpose 六个字段,无 balance。资金相关控制器全集5个:PaymentController.java、FundPoolController.java、BankAccountController.java、AccountController.java、VoucherController.java(均在 /oa-backend/src/main/java/com/kaidi/oa/web/)。FundPoolController.java 第19-29行注释自述\"No new entity is introduced\",是纯聚合。关键词 grep 仅命中 ReportController.java:70/115(无关的\"reconciles\"用词)与 DataSeeder.java:452 dept(\"票据管理部\")(部门名,非功能);service 层 grep 零命中。前端模块定义 /ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:payment(228-239行)子页=支付台账/见票付款/资金池/支付看板/融资与债务管理;finance(395-408行)子页=会计科目/记账凭证/应收/应付/费用报销/税务/资产;前端 grep 七项治理关键词在 src 内除模板里无关的\"银行承兑\"业务字段和\"reconcileCycle\"开户表单字段外,无任何日记账/对账/盘点/调拨/往来页面。financing.vue 仅40行且零命中治理关键词。" }, { "area": "财务部/支付中心", "module": "11. 预算管理(财务预算)", "verdict": "LOGIC_GAP", "gap": "仅手填预算行+自动超支标记+看板;缺编制流程/预算分类/多版本、写入时预算余额校验+超预算审批、年中调整审批与历史、阈值预警、滚动编制。", "severity": "high", "evidence": "BudgetController/Budget.java:单行预算 CRUD,element/year/period/budgetAmount/actualAmount 手填,create 时若 actualAmount>budgetAmount 自动置超支。budget/ledger.vue 手填+执行率+看板对比。无自上而下/自下而上编制流程、无收入/成本/费用/资本/现金流预算分类、无多版本(初稿/修订/批准)。grep 确认写路径0处 budgetRepo 调用——报销/采购/合同写入时无预算余额校验+超预算审批。无年中调整审批+历史、无偏差阈值预警(仅静态超支标记)、无按月/季滚动编制未来12个月。", "survives": true, "reNote": "缺口属实。我努力想推翻它,但财务预算模块的实现确实只到\"手填预算行 + 自动超支标记 + 看板\"为止,缺口列出的高阶能力一个都没实现。\n\n后端 BudgetController(/api/oa/budgets)只有三个端点:GET 列表(按 projectId/element/status 过滤)、GET /{id}、POST 创建。完全没有 PUT/PATCH/DELETE,没有任何 update/approve/submit/version/adjust 端点。create 时唯一的\"逻辑\"是 actualAmount>budgetAmount 自动把 status 置「超支」(BudgetController.java:84-88)。Budget 实体(domain/Budget.java)字段只有 name/projectId/companySubject/element/year/period/budgetAmount/actualAmount/owner/status/createdAt,没有 version/edition/parentVersion/threshold/balance/adjustHistory 等任何字段。\n\n逐条核对缺口所列缺失项,全部确认未实现:\n1. 编制流程:无 submit/approve/审批节点,无 WorkflowService/FormInstance 与 budget 的任何挂钩(grep service/WorkflowService.java、TriggerRuleEngine.java 对 budget/预算 零命中)。\n2. 预算分类/多版本:实体无 category 之外的分类层级、无 version 字段,全后端 grep budgetVersion/预算版本/budgetEdition 零命中。\n3. 写入时预算余额校验 + 超预算审批:create 不做任何余额扣减/校验,actual 超 budget 只是打标签放行,不阻断、不触发审批。\n4. 年中调整审批与历史:无 adjust 端点、无调整历史表,grep budgetAdjust/年中调整 零命中。\n5. 阈值预警:AlertController 只对已经是「超支」状态的记录生成事后告警(AlertController.java:196-204),没有可配置阈值(如 80% 预警),属事后而非阈值预警。\n6. 滚动编制:grep 滚动/rollingBudget 零命中。\n\n前端 budget.ts 只封装 list/get/create;ledger.vue 是 MasterDataPage 手填台账(手填 budgetAmount/actualAmount/status);board.vue 是只读看板(汇总执行率、按要素分布、超支项列表)。全部与后端能力一致,没有任何前端独有的编制/版本/调整/校验逻辑。\n\n唯一一处\"预算编制\"字样是 FavoriteController.java:57 里一个收藏夹文档名字符串\"2026年度预算编制指南\",与功能无关。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java(仅 GET 列表/GET {id}/POST 创建;line 84-88 仅 actual>budget 自动置「超支」;无 PUT/DELETE/approve/version/adjust); oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java(实体仅 11 个基础字段,无 version/threshold/balance/adjust); oa-backend/src/main/java/com/kaidi/oa/repository/BudgetRepository.java(仅 findByProjectId/Element/Status); oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:196-204(仅对已是「超支」状态的记录事后告警,无可配置阈值)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/api/budget.ts(仅 listBudgets/getBudget/createBudget); .../oa/pages/budget/ledger.vue(MasterDataPage 手填台账); .../oa/pages/budget/board.vue(只读看板)。全后端 grep budgetVersion/预算版本/budgetAdjust/年中调整/滚动/rollingBudget/budgetApprov/预算审批 仅命中 FavoriteController.java:57 一个无关文档名字符串。" }, { "area": "财务部/支付中心", "module": "12. 财务报表与合并报表", "verdict": "MISSING", "gap": "法定报表、管理报表、集团合并报表与抵消分录、报表附注、财务分析指标全缺;可配置BI仅单实体分组求和,出不了会计报表。", "severity": "high", "evidence": "全库 grep 资产负债表/利润表/现金流量表/合并报表/抵消 0处代码。ReportDefinitionController 是可配置 BI:单一源按一个维度 group-by+count/sum,白名单字段、无跨表 join、无借贷平衡。BusinessBiController 是跨模块计数聚合(合同/资金/成本/项目/研发 stat),非会计报表。无法定三表(直接法/间接法)/所有者权益变动表、无管理报表多维利润表、无集团合并(内部交易/往来/投资抵消+多准则+合并三表)、无抵消分录、无报表附注、无财务分析指标(流动比率/速动比率/毛利率/净利率/ROE/周转率)与趋势同环比。", "survives": true, "reNote": "缺口属实。财务报表与合并报表整体缺失,无法被推翻。后端财务相关控制器只有 AccountController(会计科目纯CRUD,期末余额为手填字段,凭证不滚算)、VoucherController(记账凭证单借单贷单金额CRUD,无多行分录/无过账/无试算平衡/无期末结转)、CompanySubjectController(公司主体主数据,无实体间关系/无抵消逻辑)。全后端(domain+service+web)grep 资产负债表/利润表/损益表/现金流量表/法定报表/管理报表/报表附注/合并报表/抵消/elimination/intercompany/少数股东 全部零命中(唯一'抵消'命中是 ContractController 关于分包金额符号累计的无关注释)。可配置BI(ReportDefinitionController + BusinessBiController)确实如描述所言只能'单实体 group-by + count/sum'——选一个源实体、一个维度、一个度量,无法跨实体、无法产出会计报表结构。前端 finance 页面仅 accounts/vouchers/asset/expense/payable/receivable/tax,无任何报表/合并报表页,grep 报表关键字零命中。财务分析指标也无独立实现。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/VoucherController.java(单借单贷单金额,无过账,L56-77 create只存一行); AccountController.java(L76 balance为手填,无凭证滚算,无试算平衡); CompanySubjectController.java(纯主数据,无抵消); ReportDefinitionController.java(L46-53/L433-479 单实体group-by+count/sum,run仅对单一source分组求和); BusinessBiController.java(各模块独立汇总). 全后端 grep consolidat/抵消/elimination/资产负债表/利润表/损益表/现金流量表/报表附注/合并 仅1条无关命中(ContractController.java:99 分包符号注释). 前端: ofbiz-framework/plugins/modern-ui/app/src/oa/api/finance.ts(只有accounts+vouchers); src/oa/pages/finance/ 仅 accounts.vue/vouchers.vue/asset.vue/expense.vue/payable.vue/receivable.vue/tax.vue,无任何报表页; 该目录grep报表关键字零命中。" }, { "area": "财务部/支付中心", "module": "13. 财务合规与审计", "verdict": "MISSING", "gap": "财务单据操作日志、岗位级菜单/科目/金额权限矩阵、关键操作二次授权、审计只读接口与电子底稿、多准则配置、电子会计档案全缺;仅通用审批/联动留痕。", "severity": "high", "evidence": "全库无操作日志实体(grep 操作日志/auditlog/修改前后 仅命中 WorkflowService 审批留痕注释,非财务单据增删改查/审核/过账/红冲含操作人/时间/IP/前后内容的日志)。无按岗位(出纳/应收/应付/总账/税务/财务经理/CFO)的菜单/科目/金额权限矩阵(AuthInterceptor 是粗粒度角色 default-deny)。无过账/红冲二次授权、无审计只读账号+导出凭证账簿报表+电子审计底稿、无多会计准则切换科目映射/报表格式、无电子会计档案归档一键导出备份。AutomationLog 是联动留痕非财务专用审计接口。", "survives": true, "reNote": "缺口属实。我尽力推翻但找不到任一组件的实现,证据如下:\n\n1) 财务单据操作日志:全后端无操作日志实体/接口/AOP。grep `操作日志|operationLog|auditLog|actionLog|@Aspect|@Around|@AfterReturning|OncePerRequest` 在 oa-backend 下零命中。PaymentController.pay()/VoucherController 仅改单据自身字段(把付款人 label 写到 Payment 上),无独立不可篡改的操作流水。唯一的 *Log 实体是 AutomationLog(H16 流程办结联动台账)、DataSyncLog、SupervisionLog(工程监理),均非财务单据级操作日志——正是缺口所述\"仅通用审批/联动留痕\"。\n\n2) 岗位级菜单/科目/金额权限矩阵:AuthorizationService 只有粗粒度角色集(ADMIN/USER/APPROVER)+ isOwner 属主判定,无按岗位的菜单/科目/金额阈值矩阵。grep `权限矩阵|金额权限|科目权限|amountLimit|approvalLimit` 后端零命中。前端唯一\"权限矩阵\"在 appdev/appmgr.vue,是应用搭建器的通用角色 CRUD 权限,与财务科目/金额无关。\n\n3) 关键操作二次授权:grep `二次授权|二次确认|二次审批|dual.?auth|second.?approv|reauth|双重授权|otp` 前后端零命中。PaymentController 单次 POST /{id}/pay 即完成 待付→已付 结算,无二次授权环节。WorkflowService 里唯一\"复核\"命中(行464)是退回后的提示文案,非财务二次授权。\n\n4) 审计只读接口与电子底稿:AuditProjectController 是通用审计项目台账(增删改查 name/auditType/auditee/status/findings计数),本身可写删,非只读;无电子底稿(workpaper)实体/接口。EvidenceController 是研发项目 evidence-chain 聚合(立项-费用-知识产权-申报),与财务审计底稿无关。grep `底稿|workpaper|审计只读|只读接口|tamper|防篡改|hash.?chain` 零命中。\n\n5) 多准则配置:grep `多准则|准则配置|准则|gaap|ifrs|accountingStandard|criteria` 零命中。\n\n6) 电子会计档案:grep `会计档案|电子档案|electronic.?archive` 零命中。Archive 实体是通用档案知识中心,非 e-会计档案。\n\n六项均无实现,缺口判定 MISSING 成立。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/PaymentController.java(pay()仅单次结算无日志无二次授权), web/VoucherController.java(仅已记账不可改,无操作日志), web/AuditProjectController.java(通用审计项目台账,可写删非只读底稿), web/EvidenceController.java(研发evidence-chain非财务审计), service/AuthorizationService.java(粗粒度角色,无科目/金额/岗位矩阵), domain/AutomationLog.java(H16联动留痕,非单据操作日志)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/{finance,payment,audit}/*.vue 无任一相关页;唯一\"权限矩阵\"在 oa/pages/appdev/appmgr.vue 为应用搭建器通用角色权限,与财务无关。多组 grep(操作日志/二次授权/权限矩阵/底稿/会计档案/多准则/@Aspect/@Around/OncePerRequest)在前后端全部零命中。" }, { "area": "财务部/支付中心", "module": "14. 与其他部门接口要求", "verdict": "PARTIAL", "gap": "仅打通合同-付款-发票-资金池链;采购→应付、生产→成本、项目→收入确认、成本控制、HR 工资社保个税、法务、申报、分子公司合并对账等多数部门间接口未建。", "severity": "med", "evidence": "真实部分:合同↔付款↔发票↔资金池资金确认链——InvoiceController.applyContractDelta(销项已开回写 invoicedAmount)、PaymentService.confirmPay(已付回写 paidAmount+autoVoucher)、FundPoolController 按主体聚合、TriggerRuleEngine 收款→待开发票/付款报销→待付付款单。但采购订单/入库单/采购发票→应付无自动接口(见模块3);WorkOrder 无成本字段→生产工单/领料/工时/在制品→成本无接口;项目预算/成本归集/进度→收入确认无接口;成本控制部标准成本/差异/预算执行无对外接口;HR 工资/社保/个税→费用入账与代扣无接口;法务/申报服务/分子公司财务报表/内部往来对账接口未建。", "survives": true, "reNote": "缺口(PARTIAL)总体属实,无法推翻。尝试推翻后只能纠正描述里的一个子项(项目→收入确认实际已实现),但 PARTIAL 判定本身成立:除合同-付款-发票-资金池链外,描述列举的多数部门间接口确实未建。\n\n证据逐项核对:\n1) 已打通链(与缺口\"仅打通\"一致):TriggerRuleEngine.fire 联动 付款/收款/合同生效/用印/验收归档/供应商准入;PaymentService.confirmPay 回写合同 paidAmount 并自动生成付款凭证(借应付账款/贷银行存款);InvoiceController 销项发票回写合同 invoicedAmount;FundPoolController 仅聚合 Contract+Payment。\n2) 描述错误的一项——项目→收入确认其实已建:ProjectController.generateAcceptanceVoucher(advance 进入\"验收\"时触发)自动生成收入确认凭证(借应收账款/贷主营业务收入),金额取项目首个关联合同,带(acceptance,projectId)幂等。所以\"项目→收入确认未建\"这条不成立。\n3) 真未建(支撑 PARTIAL):\n - 采购→应付:无采购订单实体(grep PurchaseOrder/采购订单 domain 与 web 均空);进项发票被 InvoiceController 标注为应付但显式\"NOT inflate\",不向下游记任何应付凭证。\n - 生产→成本:WorkOrder 实体只有 planQty/actualQty/workshop 等,无 cost/amount 字段,不联动 CostCenter/StandardCost,也不生成成本凭证。\n - HR 工资/社保/个税:全仓 grep 薪资/工资单/payroll/salary/社会保险/公积金/个人所得税/代扣代缴 在 domain/web/service 均无命中;无 HR 工资控制器。\n - 法务:无 LegalController(ls web | grep legal 空);无法务→财务接口。\n - 分子公司合并对账:CompanySubject 无合并/对账/往来逻辑;Voucher 来源 sourceType 仅 \"acceptance\" 与 \"payment\" 两种,无合并/对账来源。\n - 成本控制:CostCenter/StandardCost 为独立主数据,无生产实际成本归集回写。\n综上,real=true(缺口属实),仅描述中\"项目→收入确认\"一项需更正。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java (fire 联动矩阵); oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java:84-94,113-130 (confirmPay 回写+应付账款凭证); oa-backend/src/main/java/com/kaidi/oa/web/ProjectController.java:118-176 (generateAcceptanceVoucher 项目→收入确认凭证, 借应收账款/贷主营业务收入, 已实现); oa-backend/src/main/java/com/kaidi/oa/web/InvoiceController.java:43-79 (进项=应付但显式不入账不联动); oa-backend/src/main/java/com/kaidi/oa/domain/WorkOrder.java:23-43 (无成本字段); oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java:34-74 (仅聚合Contract+Payment); grep 全仓: 无 PurchaseOrder/采购订单, 无 payroll/工资单/社保/个税, 无 LegalController, Voucher sourceType 仅 acceptance/payment" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "1. 融资管理(融资主体与额度/授信管理/金融机构关系)", "verdict": "MISSING", "gap": "无融资主体/额度配置实体,无综合/专项授信台账,无剩余可用额度与使用率自动监控/接近限额预警,无金融机构档案(合作历史/审批效率/客户经理)与定期评价分级。仅一张可增删改查的扁平清单。", "severity": "high", "evidence": "全仓 grep 关键词(融资/授信/creditLine/额度/金融机构档案)在 oa-backend 与前端均零命中专用实现。后端 90 个控制器、90 个 domain 实体里没有任何融资/授信/金融机构实体。唯一承载是前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue,一张 8 列(institution/type/amount/rate/起息日/到期日/本息余额/status)的 MasterDataPage 平表,经 settingListStore('payment-financing') 走通用 /api/oa/biz/{type} biz_record 行表持久化,无任何业务逻辑。kaidiDeptView.ts 中 '融资管理' block 即 path=/payment/financing 指向此页。", "survives": true, "reNote": "缺口属实。融资管理仅有一张扁平 CRUD 清单,无任何专用实体/台账/监控/机构档案。前端 financing.vue 用通用工厂 settingListStore('payment-financing', seed) 把行存进后端通用 biz_record 表(/api/oa/biz/{type},所有部室台账共用的无 schema kv 表),列只有 机构/类型/金额/利率/起止日/余额/状态 七个自由字段。后端 90 个控制器与全部 domain 实体里:无融资主体/授信额度实体,无综合/专项授信台账,无可用额度与使用率计算,无接近限额预警(grep 使用率/可用额度/接近限额/授信/creditLine/creditLimit/usageRate 全项目零命中),Alert/TriggerRuleEngine 未与融资额度挂钩。最接近的 FundPoolController 只是把合同+付款按公司主体内存聚合,无额度概念;BankAccount 实体只有 accountName/bankName/accountNo/companySubject/currency/purpose,无合作历史/审批效率/客户经理/评价分级字段。无法推翻该缺口。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue (settingListStore('payment-financing',...),仅 7 列扁平 CRUD);工厂: src/oa/api/settingList.ts (走 /api/oa/biz/{type} 通用 biz_record 表);模块定义: src/data/oaModules.ts:237 kind:'list' path:/payment/financing。后端: 无 Credit/Financing/CreditLine 等 domain 或 controller (find 仅命中 FundPoolController);oa-backend/.../web/FundPoolController.java 仅按公司主体聚合合同/付款无额度;domain/BankAccount.java 无授信/合作历史/客户经理/评价字段。全项目 grep 授信/额度/可用额度/使用率/creditLine/creditLimit/usageRate 零命中。" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "2. 融资申请与审批流程(融资申请/审批流/方案比选)", "verdict": "MISSING", "gap": "无融资申请单(金额/用途/期限/意向银行+政策与授信自动校验),无金融办→财务→风控→高管的融资专属审批流,无多机构方案比选与综合融资成本 IRR/XIRR 测算择优。借用了通用 BPM 门户充数。", "severity": "high", "evidence": "kaidiDeptView.ts 将 '融资申请与审批流程' block 映射到 path=/collab/portal(协同BPM门户)——一个通用审批门户,并非融资专用申请单。全仓无 xirr/irr 命中(grep 仅匹配到 ProseMirror 等无关词),无融资政策/授信自动校验逻辑,无多机构方案比选与综合成本测算。WorkflowService 是通用审批引擎,无按融资金额/品种/风险等级的融资专属审批配置。", "survives": true, "reNote": "缺口属实。融资中心只有一个台账页 financing.vue(MasterDataPage 列表,字段=机构/类型/金额/利率/起止日/余额/状态,是已有债务记录),不存在含金额/用途/期限/意向银行的融资申请单,也无政策与授信自动校验。约40个工作流模板中无任何融资专属审批流;唯一\"金融办\"出现在 src-progress-payment.ts 的某个审批意见节点标签(工程进度付款流),并非金融办→财务→风控→高管的融资链,\"风控\"在源码中根本不存在。前端源码全量 grep IRR/XIRR/xirr 零命中,无多机构方案比选与综合融资成本择优;两处\"方案比选\"只是 DataSeeder 中无关业务的种子文本(设备报价、水环境模型)。后端全部 web/*.java 控制器对 融资/financing/授信/贷款 零命中,API.md 无融资端点;PolicyApplication 实体是政府补贴申报(policyTitle/grantedAmount),与信贷授信无关。financing 页通过通用 settingList('payment-financing') 键值表做 mock CRUD,未接任何审批/联动引擎。确为借用通用 BPM 充数。", "reEvidence": "前端台账页: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue (MasterDataPage, settingListStore('payment-financing')); 模块定义: src/data/oaModules.ts:237 {key:'financing',kind:'list',path:'/payment/financing'}; 唯一金融办标签: src/oa/engine/templates/src/src-progress-payment.ts:222 '金融办负责人审核意见'(工程进度付款流的审批意见节点,非融资流); IRR/XIRR grep 前端源码零命中; '方案比选'仅 oa-backend DataSeeder.java:1588,1963 无关种子文本; 后端 grep '融资|financing|授信|贷款' over web/*.java 零命中; PolicyApplication.java 字段=policyTitle/projectName/appliedAmount/grantedAmount(政府补贴申报,非信贷); API.md 无融资端点。" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "3. 融资合同与提款管理(融资合同台账/提款/费用)", "verdict": "MISSING", "gap": "无融资合同专用台账(贷款人/利率/还款方式/担保/提款条件/费用明细+扫描件版本),无提款申请审批与到账自动扣减合同剩余额度并推财务/结算,无融资费用归集与综合成本计算。仅复用普通采购/销售合同台账实体。", "severity": "high", "evidence": "kaidiDeptView.ts 将 '融资合同与提款管理' 映射到 path=/contract/ledger(通用合同台账)。检查 oa-backend/.../domain/Contract.java:grep 确认无 lender/drawdown/提款/授信/credit/利率/担保/repay 等任何融资专用字段(输出 'NO financing-specific fields in Contract entity')。全仓无 drawdown/提款/还款计划/费用归集 命中。", "survives": true, "reNote": "缺口基本属实。融资中心仅有一个 payment/financing.vue 通用列表页(标题\"融资与债务管理\"),它只是 MasterDataPage 套 settingListStore('payment-financing') 的薄壳,数据落在通用 BizRecord(dataJson) 平表里,无任何专用实体/业务逻辑。该页字段仅 7 项:金融机构、融资类型(银行贷款/保理/融资租赁)、融资金额、利率%、起息日、到期日、本息余额、状态——没有贷款人(只有机构)、没有还款方式、没有担保方式、没有提款条件、没有费用明细、没有扫描件版本。缺口三大核心指控全部成立:(1)无融资合同专用台账实体——domain 目录无 Loan/Financing/Drawdown/CreditLine 任何实体,Contract.java 也无任何融资字段;(2)无提款申请审批+到账自动扣减剩余额度+推财务/结算——全代码搜 提款/drawdown 零命中(WorkflowService/TriggerRuleEngine 里的\"放款\"是普通付款单出账,与融资额度无关),本息余额只是一个可手填数字字段,从不被任何提款事件扣减;(3)无融资费用归集与综合成本计算——搜\"综合融资成本/资金成本/费用归集明细\"零命中。FundPoolController 只是按公司主体聚合普通合同与付款,非融资专用。描述中\"仅复用普通采购/销售合同台账实体\"一句略有偏差(实际用的是 BizRecord 通用平表而非 Contract 实体),但不影响缺口实质成立。无法推翻。", "reEvidence": "前端 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue(仅 MasterDataPage+settingListStore('payment-financing'),字段:institution/type/amount/rate/startDate/endDate/balance/status);后端持久化 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/BizRecord.java + web/BizRecordController.java(通用 dataJson 平表 /api/oa/biz/{type});前端 store /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts;普通合同实体(无融资字段)/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Contract.java;聚合视图 web/FundPoolController.java(仅按主体汇总普通合同+付款)。全仓搜 提款/drawdown/放款 仅命中 service/WorkflowService.java:577、service/TriggerRuleEngine.java:51/144/174/178、pages/datacenter/automation.vue(均为普通付款单\"待付不放款\"语义,与融资额度扣减无关);搜 综合融资成本/资金成本/费用归集明细 在源码中零命中。domain 目录 90 个实体中无 Loan/Financing/Drawdown/CreditLine/Fund 类融资专用实体。" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "4. 还本付息与债务管理(还款计划/到期预警/债务台账/执行)", "verdict": "LOGIC_GAP", "gap": "承载页确有'债务行'(balance/status列)但关键逻辑全空:无按合同条款自动生成还本付息计划表(等额本息/本金/到期还本等多方式),无分级到期预警(30/15/7/3天)与逾期自动升级,无全口径债务多维统计与带息负债规模/成本率,无还本付息执行联动结算中心自动生成付款单与还款凭证。", "severity": "high", "evidence": "kaidiDeptView.ts 将 '还本付息与债务管理' block 映射到 path=/payment/financing——即模块1那同一张 8 列平表。该页只有 amount/rate/balance/status 等静态列与 3 条 seed 行(institution/type/amount/rate/dates/balance/status),financing.vue 内 grep '财务/结算/推送/联动/trigger' 全 NONE。全仓无还款计划/repaymentSchedule/amortiz/带息负债/到期预警/分级预警 命中。无 TriggerRuleEngine 联动结算中心生成付款单的规则。", "survives": true, "reNote": "缺口属实。承载页 financing.vue 仅是一个通用 MasterDataPage CRUD 表格(有 balance/本息余额、status/状态 列),数据来自通用 settings 键值存储(settingListStore('payment-financing', ...)),无任何关键逻辑实现。我尽力反驳但四项关键能力在前后端均无实现:(1) 无按合同条款自动生成还本付息计划表——后端 grep 等额本息/等额本金/到期还本/amortiz/principal+interest/repaymentSchedule 全部零命中,无 RepaymentPlan 实体;(2) 无分级到期预警与逾期升级——AlertController.aggregate() 仅扫描 8 个源(证件/专利年费/履约/库存/仪器校准/安全隐患/审批超时/成本超支),完全没有 financing/债务到期源,无 30/15/7/3 天分级窗口、无逾期自动升级;(3) 无全口径债务多维统计/带息负债规模与成本率——无任何聚合控制器,FundPoolController 只聚合合同与付款,不含融资债务;(4) 无还本付息执行联动结算中心生成付款单与还款凭证——TriggerRuleEngine 仅 6 条规则键(contract.effectivate/payment.create/project.accept/project.create/receipt.invoice/supplier.admit),无 repay/loan/financing/债务 联动,grep 还款凭证/repaymentVoucher 零命中。", "reEvidence": "前端: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue (全文40行,纯 MasterDataPage CRUD,store=settingListStore('payment-financing'),无 schedule/统计/预警/凭证逻辑)。后端缺失证据: 全 com/kaidi/oa grep '等额本息|等额本金|到期还本|amortiz|principal.*interest|repaymentSchedule|带息负债|成本率' 零命中; domain/ 无 Loan/Financing/Debt/RepaymentPlan/DebtLedger 实体; web/ 无 Loan/Financing/Debt/Repay 控制器。/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java (98-210行 aggregate() 8 个预警源中无融资/债务到期,无 30/15/7/3 分级)。/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java (只聚合 Contract+Payment,无债务)。service/TriggerRuleEngine.java 规则键仅 6 条,无还款联动; grep '还款凭证|repaymentVoucher' 零命中。" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "5. 融资成本分析与决策支持(成本测算/结构分析/投融平衡/驾驶舱)", "verdict": "MISSING", "gap": "无每笔融资综合成本 XIRR/IRR 动态测算与对比基准利率识别高成本,无按品种/期限/利率/机构多维结构分析及可视化图表,无投融平衡动态监控,无融资驾驶舱。借用通用报表分析页。", "severity": "high", "evidence": "kaidiDeptView.ts 将 '融资成本分析与决策支持' 映射到 path=/report/analysis(通用报表分析),非融资专用驾驶舱。全仓 grep xirr/irr 零命中专用实现;无融资结构分析(期限/利率/品种)图表、无投融平衡测算、无融资驾驶舱(总额/平均成本率/授信使用率/到期分布/穿透查询)的任何代码。ReportDefinitionController 仅是通用 group-by + count/sum 报表引擎。", "survives": true, "reNote": "缺口属实。支付中心金融办「融资成本分析与决策支持」链的四项核心能力(每笔融资综合成本 XIRR/IRR 动态测算+对比基准利率识别高成本、按品种/期限/利率/机构多维结构分析及可视化图表、投融平衡动态监控、融资驾驶舱)在前后端均无任何实现。唯一相关页面 financing.vue 只是一个基于通用 MasterDataPage + settingListStore 键值持久化的纯 CRUD 台账(字段=机构/类型/金额/利率/起止日/余额/状态),不含任何成本测算、利率对比、结构图表、投融平衡或驾驶舱逻辑;fundpool.vue 是结算中心按主体的应收/流出/净现金监控,与融资成本无关;report/cockpit.vue 是跨中心通用经营 BI 看板,并非融资专用驾驶舱。后端无对应控制器/服务计算 IRR 或融资结构。判定 MISSING 成立,\"借用通用报表分析页/通用台账页\"的描述准确。", "reEvidence": "1) 前端唯一融资页 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue 全文仅 41 行,仅 import MasterDataPage 与 settingListStore('payment-financing',...),columns 为机构/类型/金额/利率/日期/余额/状态的纯列表,无任何 IRR/XIRR/基准利率/结构图表/投融平衡/驾驶舱代码。2) oaModules.ts:237 该模块 kind:'list' path:'/payment/financing'(普通列表),驾驶舱仅 line106 'cockpit' kind:'report' path:'/report/cockpit'(通用经营看板,非融资专用)。3) 全前端 .ts/.vue 源码 grep XIRR|内部收益率|投融平衡|融资驾驶舱|融资成本测算|融资结构|平均成本率|授信使用率 → 0 匹配(exit 1);全后端 oa-backend/src/main/java grep 同关键词+benchmarkRate → 0 匹配(exit 1)。唯一 IRR/XIRR 命中位于打包产物 static/assets/vendor-xlsx-*.js(第三方库,无关)与需求文档本身。4) FundPoolController.java grep 融资/IRR/rate/投融 → 0 匹配。5) fundpool.vue 注释自述为「按公司主体聚合应收/流出/净现金」,与融资成本分析无关。6) 需求规格 /Users/qiu/Desktop/ERP/requirements/_req_slices/21_支付中心__金融办.txt 第17-18行「## 5. 融资成本分析与决策支持」明确要求 融资成本测算(XIRR/IRR 动态、对比基准利率识别高成本)/融资结构分析(期限结构图、利率分布图、品种占比图)/投融资平衡分析(资金缺口与盈余动态监控)/融资大屏驾驶舱(平均成本率、授信使用率、到期债务分布),四项全部未实现。" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "6. 贷后管理工作(维护银行信贷关系)", "verdict": "MISSING", "gap": "无贷后银行信贷关系维护记录(走访/沟通/续授信跟踪/合规事项),无与金融机构档案关联。三个模块(1/4/6)共用同一张 8 列平表充数。", "severity": "med", "evidence": "kaidiDeptView.ts 将 '贷后管理工作' block 映射到 path=/payment/financing——又是模块1/4那同一张融资清单平表。全仓 grep '贷后' 零命中任何专用实现。该平表无走访/沟通/续授信跟踪/合规事项记录字段,无与金融机构档案的关联(金融机构档案本身也不存在,见模块1)。", "survives": true, "reNote": "缺口属实。金融办(贷款融资)的第6块\"贷后管理工作—维护银行信贷关系\"确无任何专用实现。前端整个资金支付中心只有一个融资页 financing.vue(标题\"融资与债务管理\"),是一张 8 列平表(金融机构/融资类型/金额/利率/起息日/到期日/本息余额/状态),把需求第1块(融资管理)和第4块(还本付息与债务管理)塞进同一张表;既无第6块独立页面/路由,8 列与新建表单里也没有走访/沟通/续授信跟踪/合规事项任何字段,更没有与金融机构档案的任何关联(institution 只是自由文本字符串)。后端 domain 下根本没有 financing/loan/credit/debt 任何实体(只有 BankAccount 与 Payment);financing.vue 走通用 settingListStore('payment-financing') 落到 BizRecord 这张 bizType+dataJson 通用 blob 平表,不是建模过的信贷关系实体。全仓 grep 金融机构档案/FinancialInstitution/CreditLine/授信额度/续授信/信贷关系 在前后端均零命中;所有\"走访/拜访/沟通记录\"命中全部属于 CRM OpportunityFollowup(挂 opportunityId 的客户拜访),与银行信贷无关。活体后端 127.0.0.1:8091 也证实:无 payment-postloan 端点,任意 bizType 只返回通用空列表。竭力反驳后无法推翻。", "reEvidence": "需求: /Users/qiu/Desktop/ERP/requirements/_req_slices/21_支付中心__金融办.txt L20-21(第6块\"贷后管理工作/维护银行信贷关系\")、L6(金融机构关系管理/档案)。唯一融资页: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue —8 列平表 columns(institution/type/amount/rate/startDate/endDate/balance/status),用 settingListStore('payment-financing')。模块定义: src/data/oaModules.ts L233-237 payment 中心仅 ledger/byinvoice/fundpool/board/financing,无贷后/债务/授信项。通用平表: oa-backend/.../domain/BizRecord.java(bizType+dataJson)。后端 domain 仅 BankAccount.java、Payment.java,无任何融资/信贷/债务实体。grep 金融机构档案/institutionArchive/FinancialInstitution/CreditLine/授信额度/续授信/信贷关系=前后端零命中;走访/拜访命中全在 CRM OpportunityFollowup.java(挂 opportunityId)。活体: curl 127.0.0.1:8091 /api/oa/biz/payment-postloan 返回空,无专用端点。" }, { "area": "支付中心 / 金融办/金融办(贷款融资)", "module": "7. 与其他部门接口要求(财务/结算/成本/法务/经营/子公司/银行)", "verdict": "MISSING", "gap": "融资域对外接口全套缺失:提款到账/还款付息指令推结算中心、利息费用/投资收益/担保代偿凭证推财务、融资成本分摊给成本控制部、融资担保合同法务审核衔接、项目融资需求经营部对接、银企直连(授信/贷款/还款/余额查询)均无任何代码。", "severity": "high", "evidence": "kaidiDeptView.ts 的金融办 blocks 数组里根本没有接口模块条目(仅列出融资管理/申请审批/合同提款/还本付息/成本分析/贷后6块)。全仓无银企直连/银企/对外推送结算中心/利息费用推财务 等融资域接口实现。financing.vue grep '推送/联动/trigger' 全 NONE。TriggerRuleEngine 无任何融资相关 ruleKey。FundPoolController 仅按公司主体聚合现有 contract/payment 现金,与融资域无关。", "survives": true, "reNote": "尽力推翻但无法推翻:融资域对外接口全套确实缺失。唯一融资相关产物是前端 financing.vue(\"融资与债务管理\"),它是纯 mock 增删改查台账(机构/类型/金额/利率/起止息日/本息余额/状态),靠通用 settingListStore('payment-financing', …) 键值表持久化,无任何对外接口逻辑。后端零融资控制器/实体——domain 目录无 FundPool/Loan/Financing/Credit/Guarantee/Interest 实体,唯一 FundPoolController 是结算中心聚合(按公司主体汇总合同与已付款),与融资无关。BankAccountController 是纯银行账户主数据 CRUD(accountName/bankName/accountNo/companySubject/currency/purpose),并非银企直连(无授信/贷款/还款/余额查询端点)。下游自动联动引擎 TriggerRuleEngine 全部 ruleKey 仅 9 条(payment.create / receipt.invoice / contract.effectivate / contract.toSeal / project.create / project.accept / project.toArchive / seal.markUsed / supplier.admit),无一条与融资有关,因此:提款到账/还款付息推结算、利息费用/投资收益/担保代偿凭证推财务、融资成本分摊给成本控制部、融资担保合同法务审核衔接、项目融资需求经营部对接、银企直连——六类接口均无任何代码。全仓 grep 银企/授信/余额查询/提款到账/还款付息/代偿凭证/融资成本分摊/融资担保合同/项目融资需求/drawdown/repayment/disbursement/credit-line 在源码中零命中(仅命中一个 minified 构建产物,经 -oc 复核为 0 真实词命中,系误报)。缺口属实。", "reEvidence": "前端唯一产物 financing.vue: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue(第6行 settingListStore('payment-financing', [...]) 纯 mock;模板仅绑定 store.list/create/update/remove,无接口调用)。后端 FundPoolController(结算聚合,非融资): /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/FundPoolController.java。BankAccountController(纯主数据 CRUD,非银企直连): /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/BankAccountController.java。下游联动引擎: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java 第148/189/240/270/301/324/347/376/410 行——全部 ruleKey 仅 payment.create/receipt.invoice/contract.effectivate/contract.toSeal/project.create/project.accept/project.toArchive/seal.markUsed/supplier.admit,无融资项。grep 融资/贷款/授信/担保/付息/提款/还款/银企/代偿/投资收益 在 oa-backend/src/main/java 仅命中 DataSeeder/TemplateSeedData/AuthInterceptor/VoucherController/AccountController/ContractChangeController/BizRecord/Account/Voucher,逐行核验均为通用财务总账(会计科目/记账凭证)或审批流财务节点,无一为融资域对外接口。domain 目录无任何 fund/loan/financ/credit/guarant/interest 实体(ls grep 空)。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "1. 合同全生命周期管理", "verdict": "PARTIAL", "gap": "但初判核心缺口属实:1)无电子签名、SealUse.java(全字段已读)无任何 hash/sha256/fileHash 字段,Seal.java 亦无电子印章/防伪字段——全库 grep 无 sha256/signature/防篡改实现;2)合同审批与合同主数据的绑定是文本匹配(编号/名称)而非强制 FK,且 Contract 实体无 risk 字段,不存在『类型×金额×风险等级』三维硬绑差异化链;3)ContractTemplate.status 仅 启用/停用(ContractTemplateController create 默认『启用』),无『法务审核后发布』版本受控审批闸;4)逾期自动推法务确认缺失——AlertScheduler.java 定时扫描只覆盖 PersonnelCert 到期 与 in-flight FormInstance 超时滞留,根本不扫 ContractMilestone(其 逾期 状态靠手填,控制器无 dueDate 计算);5)无 Office 在线协同/修订痕迹。", "severity": "high", "evidence": "维持 PARTIAL。真实后端:Contract/ContractTemplate/ContractChange/ContractMilestone 实体+控制器齐全,且 TriggerRuleEngine.ruleEffectivateContract (oa-backend/.../service/TriggerRuleEngine.java:239) 确实把合同审批表单办结与合同生效绑定——办结后按「合同编号」精确匹 Contract.code、再按名称模糊匹,命中即置「已生效」并链式自动在用章中心生成「待用印」单(chainCreateSealUse:269)。WorkflowService(:584,699-737) 支持按金额/字段/AND-OR复合条件的条件分支链。这部分比初判描述更强。", "survives": true, "reNote": "尽力推翻但未能推翻——合同全生命周期管理的五项核心缺口在代码中全部坐实,PARTIAL 判定属实。逐条复核:1)无电子签名/防篡改:全后端唯一的 SHA-256/MessageDigest 仅出现在 common/PasswordUtil.java(密码哈希),SealUse.java/Seal.java/Contract.java 均无任何 hash/sha256/fileHash/signature 或电子印章/防伪字段,grep 电子签/电子印章全库零命中。2)审批↔合同主数据为文本绑定而非强制FK:FormInstance.java 字段仅有 title/category/dataJson(JSON blob)+templateId 等,无 contractId 外键;Contract.java 无 risk 字段——故不存在『类型×金额×风险等级』三维硬绑链。需注意:WorkflowService 确实支持通用按金额阈值(金额>1万→总经理审批)与字段条件分支,但它读的是表单 dataJson blob,既非对 Contract 实体的强制FK,也无结构化风险等级维度,不构成三维硬绑差异化链。3)模板无『法务审核后发布』版本受控闸:ContractTemplate.status 仅启用/停用,ContractTemplateController.create 默认直接置『启用』,version 为客户端自填自由文本,无审核/发布/草稿/待发布状态机。4)逾期自动推法务缺失:AlertScheduler.java 仅扫 PersonnelCert 到期 与 in-flight FormInstance 超时(IN_FLIGHT),完全不触碰 ContractMilestone;ContractMilestoneController 的 dueDate/status 全为手填字符串,无 dueDate 驱动的逾期计算、无任何调度扫描里程碑。5)无 Office 在线协同/修订痕迹:在线协同/修订痕迹/trackChanges/onlyoffice/revision 全库零命中。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/domain/SealUse.java(无任何hash/签名字段); domain/Seal.java(仅name/type/companySubject/custodian/status,无防伪); domain/Contract.java(无risk字段,L1-171); common/PasswordUtil.java:89-98(唯一SHA-256,仅用于密码); domain/FormInstance.java:25-81(仅dataJson/title/category,无contractId外键); web/ContractTemplateController.java:72(create默认status『启用』,无审核发布闸); domain/ContractTemplate.java:41(status仅启用/停用); task/AlertScheduler.java:44,72-119,144-168(只扫PersonnelCert到期+FormInstance超时,从不扫ContractMilestone); web/ContractMilestoneController.java:60-66(dueDate/status手填,无逾期计算/调度); grep 电子签|电子印章|在线协同|修订痕迹|onlyoffice|revision 全库零命中; service/WorkflowService.java:1343,1357(仅有通用金额阈值条件分支,无结构化风险等级维度,且读dataJson非FK)" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "2. 合规管理", "verdict": "MISSING", "gap": "五大子功能全部无承载无逻辑,仅一张通用台账 mock 页『合规与法律服务』。", "severity": "high", "evidence": "维持 MISSING。grep 合规/违规/举报/监管报送/外规内化 在 oa-backend 仅命中 AuditProject(审计)与种子/拦截器无关代码,无任何合规专属实体或控制器。前端仅 oa/pages/legal/compliance.vue 一页,是 settingListStore('legal-compliance',[...]) 纯静态 mock(3条硬编码事项),无外规内化库、无合规检查清单分发/在线填报/法务复核、无风险规则库自动触发、无违规事件登记/匿名举报、无监管报送截止日+超期预警。", "survives": true, "reNote": "缺口属实。合规管理(法务风险部模块2)的五大子功能——外规内化库、合规检查清单(自查任务下发/在线填报/法务复核)、合规风险预警(风险规则库触发预警)、违规事件管理(含匿名举报)、监管报送管理(报送状态/截止/超期预警)——在前后端均无任何专属承载与逻辑。法务合规中心整个模块只有 2 个子页:/legal/litigation(诉讼仲裁台账) 和 /legal/compliance(合规与法律服务)。后者(compliance.vue)是一张纯通用 mock 台账,基于 settingListStore('legal-compliance') 携 3 条假种子数据,字段只有 事项名称/类型/申请部门/风险等级/处理意见/状态,与五大子功能的语义完全无关。kaidiDeptView.ts 里更把这一张 /legal/compliance 同时复用为「合规管理」「法律咨询与内部服务」「风险控制与评估」三个模块的承载,坐实「仅一张通用台账页」。后端 90 个 domain、约 90 个 controller 中无任何 Compliance/Regulation/Violation/Inspection/Checklist/Whistleblower/RegulatoryReport 实体或控制器;PolicyController/Policy 是申报政策库(政府资金/资质政策匹配),非外规内化库;WorkflowService/TriggerRuleEngine 无合规自查或违规事件相关 ruleKey。试图推翻失败。", "reEvidence": "前端承载: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/ 目录仅 compliance.vue + litigation.vue 两个文件。compliance.vue(L5 settingListStore('legal-compliance', [3条mock]); L32-39 columns=事项名称/类型/申请部门/风险等级/处理意见/状态; L52 title='合规与法律服务')。模块定义 oaModules.ts L479-487 legal 只有 litigation + compliance 两个 children。承载复用证据: data/kaidiDeptView.ts 内控部/法务风险部 blocks: 合规管理→/legal/compliance、法律咨询与内部服务→/legal/compliance、风险控制与评估→/legal/compliance、合规审核与风险预警→/report/alerts、制度与授权管理→/knowledge/doccenter。/report/alerts 实为通用期限聚合: AlertController.java 注释\"全平台期限/异常预警聚合\",聚合 PersonnelCert/Patent/ContractMilestone/Inventory/LabInstrument/SafetyCheck/Budget(证件/年费/履约/库存/校准/隐患/超支),无合规风险规则库。后端无合规实体: ls domain/ 90个文件中无 compliance/regulation/violation/inspect/checklist/whistle 命名实体。关键词彻查 grep -rliE '外规|内化|合规检查|检查清单|合规风险|违规事件|举报|监管报送' 后端仅命中 GlobalExceptionHandler.java(DataIntegrityViolationException 误命中),前端仅命中 kaidiDeptView.ts(部门职责描述文本),均非实现。Policy.java/PolicyController.java 自述为申报政策库(authority=科技/工信/发改, category=资质/资金/荣誉/人才),与外规内化无关。需求出处 requirements/_req_slices/22_内控部__法务风险部.txt 第2节明列这五大子功能。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "3. 合规审核与风险预警(AI)", "verdict": "MISSING", "gap": "两项 AI 核心能力完全无实现。", "severity": "high", "evidence": "维持 MISSING。全库 grep openai/gpt/claude/llm/大模型/AI审核/deepseek/通义/文心/prompt 仅命中 File/StoredFile 中的『ai』子串假阳性(fail/available),无任何 LLM/AI 调用代码或配置。无合同条款 AI 审核、无风险报告生成、无法规更新自动对比推送。", "survives": true, "reNote": "缺口属实。链3「合规审核与风险预警(AI)」要求两项AI核心能力:①合同条款合规性AI审核(识别风险条款/合规漏洞→生成风险报告);②AI自动对比法律法规更新→提醒业务部门合规要点。两项在前后端均无任何实现。整个项目无任何LLM/AI集成(grep openai/llm/gpt/deepseek/tongyi/大模型/prompt/embedding 全后端零真命中;前端唯二\"AI\"字样为\"API_TIMEOUT\"与\"DETAIL\"子串误命中)。能力①:ContractController 仅 list/get/create/createSub/update/delete 纯CRUD,无条款分析/风险报告端点;ContractTemplateController 仅 list/get/create 纯CRUD,无模板自动核查。能力②:法务合规页 legal/compliance.vue 是 settingListStore 支撑的纯CRUD列表,\"风险等级\"和\"处理意见\"全靠人手填,无任何自动比对/法规diff/提醒逻辑;PolicyController/Policy 实为申报补贴政策库(字段 authority/fundAmount/deadline),其 /match 仅做标签重叠计分,非法规更新对比。缺口为真,未实现。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/ContractController.java(行37-162仅CRUD+createSub,无AI审核/风险报告);oa-backend/src/main/java/com/kaidi/oa/web/ContractTemplateController.java(行35-61仅list/get/create);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/compliance.vue(行5-48 settingListStore纯CRUD,risk/opinion手填);oa-backend/src/main/java/com/kaidi/oa/web/PolicyController.java(match为标签计分)+ domain/Policy.java(行30-46 申报补贴字段非法规库);全后端 grep openai|llm|gpt|deepseek|tongyi|大模型|prompt|embedding 零真命中。需求出处 requirements/_req_slices/22_内控部__法务风险部.txt:11-12。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "4. 知识产权管理与保护", "verdict": "LOGIC_GAP", "gap": "被侵权应对(案件登记+内部评估+外部律师分配)、IP特殊审批(许可范围/地域/royalties)、商业秘密密级管理(接触人员/访问日志/离职保密提醒)全部缺失,无对应实体。", "severity": "high", "evidence": "维持 LOGIC_GAP。仅 Patent 实体+PatentController(增删改查)是真后端台账(rd-project 关联,有 feeDueDate/annualFee/status 字段)。但 iprenewal.vue/ipmonitor.vue/ipgov.vue 三页均为 settingListStore 静态 mock:iprenewal 的 warn 字段硬编码('即将到期'/'正常')与 dueDate 无任何计算联动;ipmonitor 的 source 写死『智慧芽预警/市场巡查』为人工录入,无自动采集,线索登记后无侵权评估流程(发律师函/投诉/诉讼决策留痕)。", "survives": true, "reNote": "尝试推翻失败,缺口基本属实(无任何专用实体,三项专门工作流均未实现)。逐项核查:\n\n【1. 被侵权应对(案件登记+内部评估+外部律师分配)】未实现。后端 grep 'infring|侵权|维权|律师|lawyer|诉讼|litigation' 在 oa-backend 仅命中 DataSeeder 里一条\"律师\"专家种子,无任何案件/维权实体。前端有两处擦边但都不是该工作流:legal/litigation.vue 是\"诉讼仲裁台账\"(案由含'知识产权纠纷'选项,算粗略案件登记),但无内部评估字段、无外部律师分配字段;rd/ipmonitor.vue 是\"知识产权外部监控\"看板(监控类型含'侵权监控',状态含'待评估'),只是发现/跟进看板,不含评估意见+律师指派。二者均基于通用 settingList(/api/oa/biz/{type} 通用 biz_record 行),无专用实体。\n\n【2. IP特殊审批(许可范围/地域/royalties)】完全缺失。全仓 grep 'royalt|许可|license scope|许可范围|许可地域|特殊审批|ip approv' 在应用代码(oa-backend + modern-ui/app/src)零命中;royalty 仅出现在第三方 LICENSE 文件与已弃用 OFBiz demo 数据。无许可审批实体、无页面、无审批流。\n\n【3. 商业秘密密级管理(接触人员/访问日志/离职保密提醒)】未实现。archive/security.vue\"档案安全与权限\"有'密级'(公开/内部/秘密/机密)+访问权限+授权对象+借阅审批,但这是档案文档分级,非商业秘密管理,且无'接触人员名册'、无'访问日志'、无'离职保密提醒'。Handover 实体含'离职交接'但无任何保密提醒联动(grep 保密/商业秘密/secret 在 HandoverController/Handover 零命中)。\n\ndomain 目录 90+ 实体中唯一 IP 实体是 Patent.java,字段仅 name/type/patentNo/applicant/inventors/rdProjectId/applyDate/status/feeDueDate/annualFee — 纯登记台账,无侵权/许可/密级任何字段。PatentController 仅 CRUD。结论:三项专门能力均无对应专用实体,'无对应实体'严格成立;仅存在少量通用台账擦边页(侵权监控看板/诉讼台账/档案密级),不构成对所述三大工作流的实现。", "reEvidence": "实体/控制器: oa-backend/src/main/java/com/kaidi/oa/domain/Patent.java (唯一IP实体,纯登记字段) ; oa-backend/src/main/java/com/kaidi/oa/web/PatentController.java (仅CRUD) ; domain/ 90+实体中无 Infringement/License/TradeSecret/IpCase 任何专用实体。\n前端擦边页(均走 settingList 通用 biz_record,非专用实体):\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/ipmonitor.vue (侵权监控看板,只 target/risk/status,无内部评估+律师分配)\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/litigation.vue (诉讼仲裁台账,无律师分配字段)\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/security.vue (档案密级,无接触人员/访问日志/离职提醒)\n- ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/{ipgov,iprenewal,patent}.vue (合规关联/年费预警/登记,均无三项工作流)\ngrep 证据: 后端 'infring|侵权|律师|诉讼' 仅命中 DataSeeder 一条律师专家种子; 应用代码 'royalt|许可范围|许可地域|特殊审批' 零命中(royalty 仅第三方LICENSE/OFBiz弃用demo); HandoverController/Handover 'secret|保密|商业秘密' 零命中。\nstore 性质: ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts 证明擦边页落到通用 /biz/{type} 行,非专用领域实体。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "5. 诉讼与仲裁管理", "verdict": "LOGIC_GAP", "gap": "无关联合同/业务单据、无举证/开庭/上诉期限自动提醒(AlertScheduler 不扫案件)、无文书归档全文检索、无律师/律所档案(领域/收费/胜诉率)、无案件费用归集与财务联动、无胜诉率/挽回损失统计报表。六子功能仅『案件登记』以 mock 形式覆盖。", "severity": "high", "evidence": "维持 LOGIC_GAP。仅 oa/pages/legal/litigation.vue 一页,settingListStore('legal-litigation',[...]) 3条硬编码案件 mock,字段仅 案件名/角色/对方/案由/金额/阶段/结果,纯手填台账。无诉讼/仲裁/律师/案件费用后端实体(全库 grep 仅 DataSeeder 命中『诉讼』)。", "survives": true, "reNote": "缺口属实。我尽力推翻但反而坐实了它。诉讼与仲裁管理仅有前端一个『诉讼仲裁台账』页(litigation.vue),是纯 MasterDataPage CRUD,字段只有案件名称/我方角色/对方当事人/案由/争议金额/阶段/结果。它通过 settingListStore('legal-litigation') 走通用 /api/oa/biz/{type} 接口,后端落到 BizRecord 表(仅 bizType+dataJson 两个业务字段的扁平 JSON 行存)——没有任何诉讼专属领域实体、表结构或服务逻辑。逐项核对六个声称缺失的子功能:1) 无关联合同/业务单据:litigation.vue 中『合同』仅出现在案由文字和 mock 数据里,无任何 contractId 字段或合同/单据外键关联。2) AlertScheduler 不扫案件:已读全文,@Scheduled 仅做 refreshCertExpiry(扫人事证件到期)与 scanOvertimeInstances(扫表单实例超时),完全不涉及案件/开庭/举证/上诉期限;全后端 grep『开庭|上诉|举证|hearing|appeal』零命中。3) 无文书归档全文检索:grep『文书归档|legalDoc|courtDoc』零命中。4) 无律师/律所档案(领域/收费/胜诉率):全后端唯一『律师』命中是 DataSeeder.java:3241 一条专家库种子(孙立军/湖南金州律师事务所),非可维护的律师档案模块,更无收费/胜诉率维度。5) 无案件费用归集与财务联动:无任何案件费用实体或与 Payment/Voucher 的联动。6) 无胜诉率/挽回损失报表:唯一『胜诉/winRate』命中是 BusinessBiController 的招投标中标率(BiddingStat.winRate),与诉讼无关;『挽回/recovery』零命中。六子功能确实只有『案件登记』以 mock 形式覆盖。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/litigation.vue (纯 MasterDataPage CRUD, store=settingListStore('legal-litigation'), 7字段无合同/期限/文书); oaModules.ts:484 注册为 kind:'list'。持久化: oa/api/settingList.ts 走 /biz/{key}。后端: web/BizRecordController.java(@RequestMapping /api/oa/biz, 通用 list/create/update/delete) + domain/BizRecord.java(仅 bizType+dataJson 扁平行存)。无诉讼专属控制器/实体: find『Litigation/Lawsuit/Arbitration/LegalCase』零命中。task/AlertScheduler.java 全文已读:仅扫 PersonnelCert(refreshCertExpiry)与 FormInstance(scanOvertimeInstances),不扫案件期限。web/EvidenceController.java 是研发项目证据链聚合(@RequestMapping /api/oa/rd-projects),与诉讼举证无关。零命中: grep『开庭|上诉|举证|hearing|appeal』、『文书归档|legalDoc|courtDoc』、『挽回|recovery』。误导性命中已排除: DataSeeder.java:3241(律师=专家库一条种子)、BusinessBiController.java:126/281(winRate=招投标中标率)。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "6. 法律咨询与内部服务", "verdict": "MISSING", "gap": "四项均无独立承载与逻辑。", "severity": "med", "evidence": "维持 MISSING。无法律咨询工单/法律意见书/法务知识库/培训管理任何专属实体或控制器。legal 模块在 oaModules.ts(:479-485) 仅含 litigation 与 compliance 两页,均为静态 mock。compliance.vue 的 type 选项含『法律咨询』但只是台账下拉值,无工单分配/在线留档/FAQ自动解答/意见书审批签发归档逻辑。", "survives": true, "reNote": "缺口属实。链6\"法律咨询与内部服务\"要求4子项(法律咨询工单/法律意见书/法务知识库/培训管理),四项均无独立承载页面也无后端逻辑,缺口成立。法务合规中心(legal)模块仅有\"诉讼仲裁台账\"(链5)与\"合规与法律服务\"两个子页;后者legal/compliance.vue只是一个settingList键legal-compliance的扁平MasterDataPage通用列表,把\"法律咨询\"仅作为type下拉的一个选项,既无工单分派承办/常见问题知识库自动解答,也无意见书在线签发归档、无法务知识库检索、无培训计划与参训考核记录——不构成链6的独立承载,也没有任何专属逻辑。后端90个控制器与domain中无consult/opinion/legal/train/ticket/advice任何实体或控制器;唯一的WorkOrder是制造生产工单(productName/workshop/plannedDate),与法律咨询无关。WorkflowService中的opinion是审批意见通用字段,非\"法律意见书\"。合同/用章/研发/知识社区等相关域亦无任一项承载。", "reEvidence": "需求源: requirements/_req_slices/22_内控部__法务风险部.txt §6 明列4子项。模块定义: ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts 第479-487行 legal模块仅2个children(litigation/compliance),无链6入口。承载页: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/compliance.vue 为通用settingListStore('legal-compliance')扁平列表,字段matter/type/dept/risk/opinion/status,'法律咨询'仅是type的select选项之一(第43行),无工单分派/意见书签发/知识库/培训任何逻辑。Grep全仓: 前后端均无\"意见书/法律意见/咨询工单/法务知识库/法务培训/合规培训\"匹配。后端 web/ 与 domain/ 无 consult|opinion|legal|train|ticket|advice 任何控制器或实体(WorkOrder为制造生产工单)。service/WorkflowService.java 与 TriggerRuleEngine.java 无任何法律咨询/意见书/培训路由逻辑,其中opinion为审批意见通用字段。活体:8091登录未取得token,候选端点(legal-consults/opinions/trainings等)全部401(default-deny),不构成存在证据。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "7. 风险控制与评估", "verdict": "MISSING", "gap": "作为『内控部』核心职责的五大子功能完全缺失,名为内控部却无内控矩阵。", "severity": "high", "evidence": "维持 MISSING。全库 grep riskregister/riskassess/内控矩阵/风险库/风险评估/风险应对 在 oa-backend 零命中,无任何风险或内控实体/控制器。前端无风险库/风险热力图/应对计划/风险事件/内控矩阵承载页。", "survives": true, "reNote": "缺口属实。法务风险部(内控部)的链\"7.风险控制与评估\"按需求(requirements/_req_slices/22_内控部__法务风险部.txt)应含五大子功能:风险库、风险评估(热力图)、风险应对计划、风险事件管理、内控矩阵。全仓(前端 modern-ui/app/src + 后端 oa-backend/src/main/java)对这五项所有关键词变体(风险库/风险清单/热力图/风险矩阵/内控矩阵/控制矩阵/风险应对/风险事件/控制有效性/内控测试/内控自评)grep 全部零命中。组织视图 kaidiDeptView.ts 虽把\"风险控制与评估\"块标为 status:\"built\",但 path 重映射到 /legal/compliance——一个 56 行的通用 MasterDataPage 法律事项流水列表(列:事项名称/类型/申请部门/风险等级/处理意见/状态),没有风险库、热力图、应对计划跟踪、风险事件生命周期,更没有把风险点映射到流程控制并测试控制有效性的内控矩阵。法务合规中心导航(oaModules.ts)仅两个子项(诉讼仲裁台账、合规与法律服务);~90 个后端控制器中无 Risk/InternalControl/ControlMatrix 控制器;oa/pages 下无任何 risk/control/matrix 页面。\"built\"只是标签级重映射到通用合规列表,五大内控核心功能确实缺失。", "reEvidence": "前端页面 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/compliance.vue(56行,通用MasterDataPage,仅事项名称/类型(合规审查|法律咨询|风险评估)/申请部门/风险等级/处理意见/状态六列,无矩阵/风险库)。组织映射 ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts:\"风险控制与评估\"块 status:\"built\" path:\"/legal/compliance\" pageLabel:\"合规与法律服务\"——指向同一通用列表。导航 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts 中 legal(法务合规中心)仅 children: litigation(/legal/litigation)+compliance(/legal/compliance)。需求 requirements/_req_slices/22_内控部__法务风险部.txt 第7节明列五子功能(风险库/风险评估/风险应对计划/风险事件管理/内控矩阵)。全仓 grep 五项全部变体关键词在 ofbiz-framework/plugins/modern-ui/app/src 与 oa-backend/src/main/java 下零命中(exit 1)。oa-backend web 控制器目录无 Risk/InternalControl/ControlMatrix 控制器;oa/pages 下无 risk/control/matrix/内控 命名页面。AuditProjectController.java:23 与 domain/AuditProject.java:13 的\"内控评价\"仅为审计项目 type 枚举字符串,非内控矩阵功能。" }, { "area": "内控部 / 法务风险部/法务合规中心 / 合同中心 / 用章中心 / 知识产权(研发创新中心)", "module": "10. 外部数据接口", "verdict": "MISSING", "gap": "四类外部数据接口全部缺失。", "severity": "high", "evidence": "维持 MISSING。全库(后端+前端 src)grep 企查查/天眼查/tianyancha/qichacha/裁判文书/wenshu/北大法宝/威科/征信/国家企业信用 零命中(node_modules 已排除)。无任何第三方信用/裁判文书/法规库/征信对接代码或配置;CrawlJob/CrawlSource 为情报中心通用爬虫,未对接上述法务外部源。", "survives": true, "reNote": "缺口属实。需求(requirements/_req_slices/22_内控部__法务风险部.txt 第32-33行)\"10. 外部数据接口\"明确要求四类对接:①企业信用信息查询(企查查/天眼查/国家企业信用信息公示系统,自动获取工商信息/涉诉/行政处罚/经营异常) ②裁判文书网(定期检索公司及客户/供应商涉诉) ③法律法规数据库(北大法宝/威科先行,自动更新法规并推送业务部门) ④征信系统(人行/第三方征信,获取客户/供应商信用评分)。我尽力反证仍找不到任何实现:后端全库无 RestTemplate/WebClient/HttpClient/HttpURLConnection 等任何真实外部 HTTP 调用(唯一 Jsoup 用于 HtmlSanitizer 做 XSS 净化),无任何信用查询/涉诉检索/法规推送/工商核验的控制器或路由;前端全 src 对\"企查查/天眼查/裁判文书/北大法宝/威科/征信/涉诉/信用查询/工商信息/经营异常\"零命中。最接近的 CrawlSource/CrawlJob/Intel 属于统一情报中心(招投标采集,且其 Javadoc 明写\"No real network crawling is performed\"),与法务四类接口无关。法务合规中心仅 litigation.vue/compliance.vue 两个纯手填 CRUD 台账,诉讼数据靠人工录入而非裁判文书网拉取。Supplier 仅有静态 creditCode 文本字段、Customer 连信用字段都没有,均无外部征信查询/评分。四类接口全部缺失,判定 MISSING 成立。", "reEvidence": "需求源: /Users/qiu/Desktop/ERP/requirements/_req_slices/22_内控部__法务风险部.txt:32-33 (四类外部数据接口定义)。\n反证(均无实现):\n- 后端无真实外部HTTP: grep RestTemplate|WebClient|HttpClient|HttpURLConnection|okhttp|RestClient 在 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa 仅命中 common/HtmlSanitizer.java(Jsoup净化,非抓取)。\n- 全部 /api/oa/* 路由中无 credit/legal/litigation/regulation/company-verify 类端点。\n- CrawlSource/CrawlJob 属情报中心且模拟: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/CrawlSource.java:16-17、CrawlJob.java:15-16 注释 \"No real network crawling is performed\"。\n- 前端零命中: grep 企查查|天眼查|裁判文书|北大法宝|威科|征信|涉诉|信用查询|工商信息|经营异常 在 modern-ui/app/src 无结果(仅 rd/ipmonitor.vue:5 出现静态mock文本\"智慧芽预警\")。\n- 法务模块仅两手填台账: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/legal/litigation.vue 与 compliance.vue;oaModules.ts:483-486 法务合规中心只挂这两页。\n- Customer.java 无信用字段;Supplier.java:23 仅静态 creditCode 文本字段,无外部征信查询/评分。" }, { "area": "内控部/审计监察部", "module": "1. 审计计划与资源管理", "verdict": "PARTIAL", "gap": "无年度审计计划编制(按风险/重要性排项目)及计划审批流;立项无审计组成员/计划起止日字段;完全无资源管理(资质/专长/可用时间/排程冲突);无项目预算与费用(差旅/外聘费/报销关联)。维持 PARTIAL。", "severity": "high", "evidence": "后端仅 AuditProject.java 一张扁平表(字段=name/auditType/auditee/leadAuditor/period/findings:int/status),无子实体。前端 audit/projects.vue 经 MasterDataPage 直接 CRUD 这张表(/api/oa/audit-projects)。WorkflowService.java 与 TriggerRuleEngine.java grep 'audit' 零命中;全仓 grep 'auditPlan/年度审计/审计资源/审计预算' 零命中。", "survives": true, "reNote": "尽力推翻失败,缺口属实,维持 PARTIAL。审计监察模块只有 AuditProject(审计项目) 一个实体加两个 mock setting-store 列表(舞弊 audit-fraud / 经济责任 audit-economic),四项缺失全部坐实:(1) 无年度审计计划编制:无\"审计计划\"菜单/路由,无按风险/重要性排项目的评分逻辑,无计划级审批流;grep 审计.*计划/annual.*plan/plan.*approv 只命中状态枚举注释,非功能。(2) 立项缺审计组成员/计划起止日:AuditProject 仅 8 字段(id,name,auditType,auditee,leadAuditor,period,findings,status,createdAt),对实体 grep startDate/endDate/起止/members/teamMembers 返回 EXIT=1 零命中;period 是自由文本字符串(如\"2023-2026\")非结构化起止日,只有单个 leadAuditor 字符串无审计组成员字段。(3) 完全无资源管理:无资质/专长/可用时间/排程冲突任何字段或控制器。(4) 无项目预算与费用:AuditProject 无 budget/cost/expense 字段,唯一\"差旅报销\"命中是 fraud.vue 里 mock 舞弊线索文本而非真实费用功能。WorkPlan 是通用个人工作计划(本周/本月/本季)与审计无关。", "reEvidence": "后端实体 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/AuditProject.java(仅 name/auditType/auditee/leadAuditor/period/findings/status,无成员/起止日/预算/资源字段);后端控制器 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java(CreateAuditProjectRequest 同样 7 业务字段,纯 CRUD 无计划编制/审批/资源/费用);前端模块菜单 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:442-449(audit 子菜单只有 projects/fraud/economic,无审计计划项);前端页面 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/audit/projects.vue(列表/表单字段与后端一致,无组员/起止/预算)、economic.vue 与 fraud.vue 均为 settingListStore mock 列表;WorkPlan /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/WorkPlan.java 是通用周/月/季个人计划与审计无关。验证命令:grep startDate/endDate/起止/members/teamMembers/budget/cost 对 AuditProject.java 返回 EXIT=1(零命中);grep 审计.*计划/annual.*plan/plan.*approv 仅命中注释。" }, { "area": "内控部/审计监察部", "module": "2. 审计项目实施管理", "verdict": "MISSING", "gap": "无通知书/签收、方案与标准程序库、资料收集上传、在线工作底稿(版本/复核/留痕/模板)、证据管理(分类/标签/检索/水印/哈希)、发现登记(描述/金额/制度/等级/自动编号)、沟通确认、自动报告。维持 MISSING。", "severity": "high", "evidence": "findings 仅是 AuditProject 上的 int 计数字段,无明细实体。全仓 grep 'workpaper/底稿/审计通知/审计方案/复核人' 零命中。EvidenceController.java 名为 Evidence 但实为研发链路聚合(@RequestMapping /api/oa/rd-projects,evidence-chain 折叠 RdProject+RdExpense+Patent+Declaration),与审计证据无关。", "survives": true, "reNote": "缺口属实。审计监察\"审计项目实施管理\"链所述的全部能力均未实现。后端审计模块只有一个扁平实体 AuditProject(8字段:name/auditType/auditee/leadAuditor/period/findings(int计数)/status/createdAt)+ 纯CRUD控制器 AuditProjectController(/api/oa/audit-projects),无任何通知书/签收、方案与标准程序库、资料收集上传、在线工作底稿(版本/复核/留痕/模板)、证据管理(分类/标签/检索/水印/哈希)、发现登记(描述/金额/制度/等级/自动编号)、沟通确认、自动报告的子资源或专用领域。EvidenceController 是误导项——它挂在 /api/oa/rd-projects/{id}/evidence-chain,聚合的是研发项目的费用/专利/申报(业务链6),与审计证据完全无关,也无分类/标签/水印/哈希。前端审计模块(oaModules.ts 442-449)仅3个简单master-data列表页(projects.vue/fraud.vue/economic.vue),无底稿编辑器、证据管理、发现登记表单、自动编号、通知签收流程或自动报告。代码中 hash 仅用于 UserController/PasswordUtil 的密码哈希,与证据完整性无关;水印/签收命中全在档案库/知识社区/成本结算模板/协同待办等无关模块。维持 MISSING 成立。", "reEvidence": "后端: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/AuditProject.java (扁平8字段,findings为int计数); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java (纯CRUD,无子资源); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java (实为RD研发证据链@/api/oa/rd-projects/{id}/evidence-chain,与审计无关). grep确认: domain/与web/下无 workpaper/底稿/finding登记/通知书/签收/审计evidence 实体或控制器; 无 auditProjectId 外键关联文档/证据; MessageDigest/hash 仅在 UserController/PasswordUtil 做密码哈希。前端: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:442-449 审计模块仅3子页; /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/audit/{projects,fraud,economic}.vue 均为 MasterDataPage 简单列表,无底稿/证据/发现登记/通知签收/自动报告 UI。" }, { "area": "内控部/审计监察部", "module": "3. 问题整改与跟踪闭环", "verdict": "MISSING", "gap": "无问题→整改任务自动分派与期限、整改计划提交审核、进展跟踪/证据上传验证、逾期预警升级、整改台账状态机与完成率统计、重复问题根源分析。维持 MISSING。", "severity": "high", "evidence": "AuditProject 中'整改'仅是 status 枚举值之一(计划/实施中/报告/整改/已结),非整改任务实体。全仓审计上下文无 rectif/remediation 实体(grep 命中的整改全在 SafetyCheck/QmsRecord/WaterTrace 等他模块)。无被审计单位提交/审核/进展跟踪逻辑。", "survives": true, "reNote": "尽力反驳后仍无法推翻:内控部/审计监察部的「问题整改与跟踪闭环」确属 MISSING。审计监察模块(oaModules.ts:442-449)只有3个页面——审计项目(projects.vue)、舞弊监测(fraud.vue)、经济责任审计(economic.vue),全部是 MasterDataPage 纯增删改查列表,没有任何整改闭环。逐条核对6项需求:(1)问题→整改任务自动分派与期限:无。AuditProject/SafetyCheck 都是手工 create/PUT,TriggerRuleEngine/WorkflowService 里 grep 不到任何\"由问题生成整改任务\"的联动规则(seed 联动规则里无 rectify/整改/audit 项);(2)整改计划提交审核:无此提交-审核流程;(3)进展跟踪/证据上传验证:审计域无证据上传校验绑定整改项;(4)逾期预警升级:AlertController 仅对未闭环 SafetyCheck/逾期里程碑出单条 alert,无分级升级(escalation),且 AuditProject 根本不跟踪逾期;(5)整改台账状态机与完成率统计:AuditProject 只有粗粒度单字段 status(计划/实施中/报告/整改/已结)+findings 计数,无逐条问题台账、无完成率;(6)重复问题根源分析:全库 grep 不到 root-cause/重复问题/根源分析。唯一沾边的 rectifyStatus 状态机(待整改/整改中/已闭环)属于 SafetyCheck,归属\"统一EHS\"域(safety.vue crumb-root=\"统一EHS\")而非审计/内控域,且只是一个手工切换的单字段,并不构成需求所述的闭环。", "reEvidence": "审计模块定义=ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:442-449(仅 projects/fraud/economic 三页)。审计页面=src/oa/pages/audit/projects.vue、fraud.vue、economic.vue(均为纯 CRUD MasterDataPage,无整改任务/计划审核/证据/升级/完成率/根源分析)。后端 AuditProjectController.java 仅含 name/auditType/auditee/leadAuditor/period/findings/status 七字段,无逐条整改项实体。SafetyCheckController.java:24,77-78,104(rectifyStatus 待整改/整改中/已闭环 单字段,手工 PUT 切换,属 EHS 域)。AlertController.java:176-184(SafetyCheck 未闭环出单条预警,无分级升级)。BusinessBiController.java:250-262(ehsStat 仅统计 openHazards/majorHazards,非整改完成率)。TriggerRuleEngine.java/WorkflowService.java 及 seed 规则中 grep rectif/整改/audit 无任何\"问题→整改任务\"自动分派联动。全库 grep root-cause/重复问题/根源分析/escalat(限定整改场景) 零命中。" }, { "area": "内控部/审计监察部", "module": "4. 风险管理审计", "verdict": "MISSING", "gap": "整模块零实现。维持 MISSING。", "severity": "med", "evidence": "全仓 grep 'risk/风险库/riskLibrary/heatmap/热力' 在 web/ domain/ 零命中。无任何风险库实体、风险自评、风险值计算、热力图、有效性审计。前端 audit 模块仅 projects/fraud/economic 三页(oaModules.ts 442-449),无风险页。", "survives": true, "reNote": "缺口属实。链「4. 风险管理审计」(需求 requirements/_req_slices/23_内控部__审计监察部.txt 第14-15行) 要求三项专有能力:风险库(风险类型/等级/责任部门)、风险评估(定期自评算风险值+热力图)、风险管理有效性审计(评估应对措施有效性并生成问题)。这三项在前后端均零实现。\n\n后端:无任何 Risk* 实体/仓储/控制器,无 /risk 端点,无\"风险库\"。唯一审计实体 AuditProject(domain/AuditProject.java)只有 name/auditType/auditee/leadAuditor/period/findings/status 七个字段,既无风险库结构、也无风险值计算、更无有效性评估字段。AuditProjectController 仅对审计项目做通用 CRUD。\n\n前端:审计模块(oaModules.ts 第442-451行)只有 3 个子页——审计项目 projects.vue、舞弊监测 fraud.vue、经济责任 economic.vue;不存在风险库/风险评估/风险管理有效性页面,无热力图组件,无风险路由。全站\"热力图/风险评估\"命中仅在 legal/compliance.vue 与 rd/ipmonitor.vue,与本链无关。\n\n关键证据:部门视图映射(kaidiDeptView.ts)把\"风险管理审计\"块的 path 直接指向 /audit/projects(审计项目),与链1、链2 完全同一个通用审计项目列表——是\"挂了标签、指向无关功能\",并非实现。属于典型 label-exists-capability-missing。维持 MISSING 成立。", "reEvidence": "requirements/_req_slices/23_内控部__审计监察部.txt:14-15 (链4定义:风险库/风险评估/风险管理有效性审计); oa-backend/src/main/java/com/kaidi/oa/domain/AuditProject.java:22-38 (实体仅7字段,无风险模型); oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java (仅通用审计项目CRUD,无风险逻辑); 后端全树 grep 'class Risk|RiskRegister|RiskLibrary|RiskAssess|风险库' 及 '/risk' 端点均零命中; ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:442-451 (audit模块仅projects/fraud/economic三子页); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/audit/ 仅 projects.vue/fraud.vue/economic.vue 三文件; ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts (审计监察部\"风险管理审计\"块 status=built 但 path 别名指向 /audit/projects,与链1链2同一通用列表,非真实现)" }, { "area": "内控部/审计监察部", "module": "5. 经济责任审计(离任审计)", "verdict": "LOGIC_GAP", "gap": "表面有页逻辑空:不依任免触发、无指标体系、最核心的ERP跨模块采集完全没有、无自动初评。维持 LOGIC_GAP。", "severity": "high", "evidence": "economic.vue 用 settingListStore('audit-economic', 硬编码mock) 渲染纯手填台账,字段仅 auditNo/target/post/auditType/period/status,无任何取数逻辑或后端实体。TriggerRuleEngine grep 'hr/离任/handover/任免/audit' 零命中,无任免文件触发立项。无指标体系、无跨模块自动采集(收入/利润/资产损失/处罚)、无自动评价。", "survives": true, "reNote": "缺口属实。经济责任审计(离任审计)确为\"有页无逻辑\":前端 economic.vue 仅为通用 MasterDataPage + settingList 键值存储 + 2条硬编码 mock,字段全是自由文本/下拉(审计编号/被审计对象/任职岗位/审计类型/审计期间/状态);后端 AuditProject 实体扁平、findings 仅为手填 int,AuditProjectController 增改只透传手填字段、status 默认\"计划\"、findings 默认0——无任何计算或初评。四项子断言逐一坐实:①不依任免/离任触发——TriggerRuleEngine 及全部 service 对 handover/离职/离任/任免→audit 零引用,Handover 与审计完全脱钩,无 AutomationLog 规则产出审计项目;②无指标体系——实体无任何指标字段;③ERP跨模块采集完全没有——grep 确认 AuditProject 仅被自身 controller/repo/seeder 引用,无 finance/budget/contract/payment/inventory 汇聚,活体 /api/oa/audit-projects 返回扁平静态行;④无自动初评——无评分/初评派生逻辑。维持 LOGIC_GAP 成立。我已尽力寻找反证(任免触发、跨模块采集、自动初评、隐藏 trigger 规则、活体聚合端点)均无果,无法推翻。", "reEvidence": "前端: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/audit/economic.vue (settingListStore('audit-economic', 2条mock); 字段纯文本/select; 无指标/采集/初评). 后端域: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/AuditProject.java (扁平实体, findings 为 plain int). 控制器: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java (create/update 仅透传手填字段, status 默认\"计划\", findings 默认0, 无计算). 无触发证据: grep service/*.java 对 handover/离职/离任/任免/economic→audit 零命中(仅 AuthService 注释); TriggerRuleEngine 无 audit 规则; AuditProject 仅被自身 controller/repo/DataSeeder(seed/DataSeeder.java:3089) 引用, 无 finance/budget/contract 汇聚. 活体 :8091 /api/oa/audit-projects 返回扁平静态行(findings 为手填整数); /api/oa/settings/audit-economic data=null(前端默认mock). Handover 链路: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/HandoverController.java 与审计完全独立, 确认/完成交接不产出审计项目." }, { "area": "内控部/审计监察部", "module": "7. 持续监控与自动预警", "verdict": "LOGIC_GAP", "gap": "有自动预警骨架但非可配置持续监控;无监控规则库、无快速审查/转审计流、无审计风险仪表盘。维持 LOGIC_GAP。", "severity": "high", "evidence": "AlertController.java 是对8个固定源(证件/专利年费/履约/库存/校准/安全隐患/审批超时/成本超支)的硬编码聚合(aggregate()),逻辑写死、无用户可配规则、无阈值/频率设置参数、无异常清单转审计项目的处理流。前端 audit 目录 grep 'dashboard/仪表盘/看板' 零命中。", "survives": true, "reNote": "对抗复验失败,缺口属实。审计监察域(chain 7 持续监控与自动预警)只有一个固定的预警骨架,四个声称缺失的能力(可配置持续监控、监控规则库、快速审查/转审计流、审计风险仪表盘)在代码和活体中均确实不存在,维持 LOGIC_GAP 成立。\n\n具体: (1)预警是硬编码扫描,非可配置规则库——AlertController.aggregate() 用一连串写死的 if 分支扫 8 类实体(证件/专利/履约/库存/校准/隐患/审批超时/超支),阈值是常量(WARN_WINDOW_DAYS=30、OVERTIME_DAYS=3),无任何规则实体/表可配置;TriggerRuleEngine 同样是写死的关键字 if-else 链(containsAny(tag,\"付款\",\"报销\"...)),非数据驱动。domain/ 下无任何 Rule/Risk/Monitor/Threshold 实体,无 RuleRepository。(2)无监控规则库——后端无监控规则的增删改查端点(活体 /api/oa/monitor-rules、/api/oa/risk-rules 均 404)。(3)无快速审查/转审计流——audit 模块前端仅 projects/fraud/economic 三个纯 MasterDataPage CRUD 列表;fraud.vue 里\"数据预警\"只是手填下拉枚举值,没有任何把预警自动/一键转成审计线索的流转逻辑;无 audit 控制器与 alert/risk/monitor 交叉。(4)无审计风险仪表盘——唯一的 /monitoring 端点是 AppMonitoringController,服务的是应用定制平台(CAP/appdev)的运行看板(表单/实例/会议计数),与审计风险无关;活体 /api/oa/audit/risk-dashboard、/api/oa/audit/monitoring 均 404。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java(L98-210 硬编码多源扫描,常量阈值,无规则库); oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java(L37-44 常量 WARN_WINDOW_DAYS=30/OVERTIME_DAYS=3 写死, L72 固定 fixedRate 全平台扫); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java(L109-126 写死关键字 if-else 联动, 非可配置); oa-backend/src/main/java/com/kaidi/oa/web/AppMonitoringController.java(L38-64 /api/oa/appdev/monitoring 是 CAP 应用平台看板, 非审计风险); oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java(纯 CRUD, 无监控/预警/风险逻辑); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/audit/{projects,fraud,economic}.vue(三页全是 MasterDataPage CRUD, fraud.vue L21 \"数据预警\"仅手填枚举无转审计流); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts(L442-449 audit 模块仅 projects/fraud/economic, 无规则库/风险仪表盘子页); domain/ 目录无 Rule/Risk/Monitor 实体; 活体 8091: /api/oa/monitor-rules /api/oa/risk-rules /api/oa/audit/risk-dashboard /api/oa/audit/monitoring 全部 404, 仅 /api/oa/alerts 返回固定聚合预警feed。" }, { "area": "内控部/审计监察部", "module": "8. 审计数据分析(CAATs)", "verdict": "MISSING", "gap": "完全缺失。维持 MISSING。", "severity": "med", "evidence": "全仓 grep 'benford/caat/本福特/重复付款/duplicate pay' 零命中。无在线提取ERP数据(过滤/抽样)、无分析模型库、无可视化分析、无连续审计。", "survives": true, "reNote": "缺口属实,CAATs(审计数据分析)确实完全缺失。我尽力想推翻它:dept-view 元数据(kaidiDeptView.ts)确实把\"审计数据分析(CAATs)\"标了 status:\"built\" 并映射到 path:/report/analysis(pageLabel\"报表分析\")——这是唯一可声称的\"实现\"。但打开该页证明这只是把 CAATs 挂到一个无关的通用运营看板上,名不副实,无法成立。\n\n事实链:\n1) 审计模块(oaModules.ts:442-449, /audit)只有 3 个子页,全是 MasterDataPage 包的简单增删改查列表:审计项目(projects.vue)、舞弊监测与调查(fraud.vue)、经济责任审计(economic.vue)。无任何分析功能。fraud.vue 里\"数据预警\"只是线索来源的一个静态枚举选项(source select),背后没有任何分析引擎跑数据。\n2) 后端审计相关仅 AuditProject 一套(domain/web/repository),纯 CRUD:name/auditType/auditee/leadAuditor/period/findings(整数计数)/status。无取数、无规则、无疑点筛查。\n3) 被映射为 CAATs 的 /report/analysis(report/analysis.vue)是报表中心下的通用运营看板:只读展示流程实例数/会议/用户/部门/文档/公告总量 + 流程状态占比,数据源 oaApi.getOverview(from,to)。它不属于审计模块、不查任何业务交易数据、不做 CAATs 的任何技术(重复支付检测/序列断号/Benford/统计抽样/异常离群/例外提取/连续审计)。\n4) 全后端 web/ 与 service/ 无任何审计分析控制器或服务(service 层只有 Auth/Authorization/FullTextSearch/Mention/NodeAssigneeResolver/Notification/Payment/TriggerRuleEngine/Workflow)。grep benford/sampling/抽样/疑点/outlier/连续审计/continuous-audit 在前后端均无实质命中。\n\n结论:把通用报表看板冒充 CAATs 不成立,缺口判定 MISSING 正确。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:442-449 (audit 模块仅 projects/fraud/economic 三页); src/oa/pages/audit/projects.vue、fraud.vue、economic.vue (均 MasterDataPage 纯列表CRUD); src/data/kaidiDeptView.ts (把\"审计数据分析(CAATs)\"标 status:\"built\"→path:/report/analysis); src/oa/pages/report/analysis.vue (实为通用运营KPI看板, 数据源 oaApi.getOverview, 仅流程/会议/用户/部门/文档/公告聚合, 与审计无关, 无任何CAATs技术)。后端: oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java + domain/AuditProject.java + repository/AuditProjectRepository.java (纯审计项目CRUD, findings仅整数计数); service/ 目录无任何审计分析服务。grep caat/benford/抽样/疑点/连续审计 全库无实质实现命中。" }, { "area": "内控部/审计监察部", "module": "11. 与其他部门接口要求", "verdict": "LOGIC_GAP", "gap": "仅有可被读取的数据表,无审计接口逻辑串联;内控自评问卷与整改反馈通道完全缺失。维持 LOGIC_GAP。", "severity": "med", "evidence": "底层各部门控制器(Voucher/Supplier/Customer/WorkOrder/HealthRecord/BankAccount/Contract/Declaration等)存在,但 audit engext.ts 仅暴露 /audit-projects CRUD,无任何跨模块取数接口。SurveyController 是通用投票工具(title/options/votes/vote去重),非内控自评问卷:无审计上下文、无按部门分发、无整改反馈回写通道。", "survives": true, "reNote": "缺口属实,无法推翻。审计监察模块只有可读写的孤立数据表,没有任何与其他部门接口串联的逻辑,内控自评问卷与整改反馈通道也确实完全缺失。具体证据:(1) AuditProjectController.java 仅 5 个端点全是纯 CRUD(GET 列表/GET 详情/POST/PUT/DELETE),无任何聚合或跨部门数据拉取;AuditProject.java 实体没有任何指向其他部门记录的外键/引用字段,auditee 只是自由文本字符串(如“财务部”),并非真正的数据串联。(2) AuditProject 不被任何 service 引用——WorkflowService、TriggerRuleEngine 都不涉及它;TriggerRuleEngine.ruleKeyFor 的 switch 只覆盖 payment/receipt/contract/project/seal/supplier,没有 audit 规则,故审计完全不参与平台其余部分赖以“串联”的触发联动引擎。作为对比,研发模块有真正的跨模块聚合 EvidenceController /rd-projects/{id}/evidence-chain,审计模块没有任何等价的串联端点。(3) 通用 Survey 模块存在但种子全是“OA满意度/团建投票/培训需求”,没有任何内控自评问卷,且 Survey 与审计/部门/内控无任何绑定。(4) “整改”在 AuditProject 上仅是状态枚举值(计划/实施中/报告/整改/已结),是个标签而非流程;审计模块及其控制器里没有任何整改反馈端点、整改实体或反馈通道。代码里存在的 rectif/整改 实现都在完全独立的 EHS/质量模块(SafetyCheckController、QmsRecordController、ehs/lab 前端页),不属于审计内控接口。(5) 前端审计页 projects.vue/economic.vue/fraud.vue 全是纯 MasterDataPage 增删改查(其中 economic/fraud 还是 settingList 键值 mock 存储),没有问卷采集 UI,也没有反馈提交通道。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/AuditProjectController.java (5个端点全CRUD, 37-104行); oa-backend/src/main/java/com/kaidi/oa/domain/AuditProject.java (无任何跨部门外键字段, 仅auditee自由文本); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:676-688 (ruleKeyFor无audit规则, AuditProject不被任何service引用); oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java (研发模块有真聚合串联端点作对比, 审计无等价物); oa-backend/src/main/java/com/kaidi/oa/web/SurveyController.java + seed/DataSeeder.java:953-960 (通用问卷无内控自评, 与审计无绑定); oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:3076-3095 (审计仅为孤立种子表, 整改仅是status枚举); 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/audit/projects.vue|economic.vue|fraud.vue (纯MasterDataPage CRUD, 无问卷/反馈通道)" }, { "area": "品牌推广部/宣传部", "module": "1. 宣传计划与预算管理", "verdict": "MISSING", "gap": "缺年度/季度宣传计划编制审批、宣传项目独立立项(类型/受众/预算/起止)、宣传费用预算+报销关联+余额自动校验+超预算预警、广告/媒体/印刷供应商资质/合作历史/报价/服务评价+比价招标。映射页 /goal/plan 仅通用工作计划,全不覆盖。", "severity": "high", "evidence": "组织视图 data/kaidiDeptView.ts 将本块映射到 /goal/plan(工作计划)。oa/pages/goal/plan.vue 是通用日/周/月计划填报,仅有单步审阅流(待提交→待审阅→已审阅/已退回,patchPlan 改 status),后端 WorkPlan 连计划类型都不单独存(由 period 前缀派生)。无年度/季度宣传计划编制审批;无宣传任务(展会/专题/视频)独立立项的类型/受众/预算/起止字段;无宣传费用预算编制、无报销关联宣传项目、无预算余额自动校验、无超预算预警。供应商侧 domain/Supplier.java 仅有 name/creditCode/category/contact/phone/bank/status,无资质/合作历史/报价/服务评价字段,更无比价/招标逻辑。", "survives": true, "reNote": "缺口属实。领域[品牌推广部/宣传部] 链[1.宣传计划与预算管理] 在 kaidiDeptView.ts 中映射页为 /goal/plan(pageLabel\"工作计划\"),该页确为通用日/周/月工作计划,四项专属能力全部未实现:(1)年度/季度宣传计划编制审批——/goal/plan 只有 日报/周报/月报 通用填报+待提交/待审阅/已审阅 三态流转,无年度/季度宣传计划概念;(2)宣传项目独立立项(类型/受众/预算/起止)——后端 WorkPlan 实体仅 title/owner/period/status/content,无 类型/受众/预算/起止 字段,/goal/project 亦为通用项目任务,全无;(3)宣传费用预算+报销关联+余额自动校验+超预算预警——通用 Budget 实体虽有 budgetAmount/actualAmount/超支态,但宣传部该链块根本不映射到 /budget(映射的是 /goal/plan),且 Budget 成本要素为 人工费/材料费/机械费/差旅费/管理费/外协费/分包费 无\"宣传费\",无报销关联、无针对宣传费的余额校验与预警落地;(4)广告/媒体/印刷供应商资质/合作历史/报价/服务评价+比价招标——Supplier 实体仅 name/creditCode/category/contact/phone/bank/status,无资质明细/合作历史/报价/服务评价;/culture/media 仅为媒体名称/类型/对接人/合作内容/等级的通用主数据列表,无报价、无服务评价、无比价招标。oaModules.ts 无任何 宣传/品牌推广 模块入口,pages 下无 publicity/promo/brand 专属目录。多次尝试以通用 Budget/Supplier 兜底均不成立——既未映射也无宣传专属字段与逻辑。", "reEvidence": "映射证据 src/data/kaidiDeptView.ts:\"品牌推广部\">\"宣传部\"(duty:活动策划 文化宣传 内刊成册) 首块 {\"name\":\"宣传计划与预算管理\",\"status\":\"built\",\"path\":\"/goal/plan\",\"pageLabel\":\"工作计划\"}。/goal/plan 实现 src/oa/pages/goal/plan.vue(PLAN_TYPES=['日报','周报','月报'],字段 title/planType/owner/period/status/content,无任何预算/受众/立项/供应商字段)。后端 oa-backend/src/main/java/com/kaidi/oa/domain/WorkPlan.java 字段仅 id/title/owner/ownerId/period/status/content。Supplier.java 字段仅 id/name/creditCode/category/contact/phone/bankName/bankAccount/status(无资质/报价/评价/合作历史)。culture/media.vue 列仅 media/mediaType/contact/cooperation/lastTouch/level,无报价/评价/比价。Budget.java element 注释列举 人工费/材料费/机械费/差旅费/管理费/外协费/分包费(无宣传费),且宣传部链块未映射到 /budget。oaModules.ts grep 宣传/品牌推广/publicity/promo 无模块入口;pages 下无 promo/brand/publicity 目录。" }, { "area": "品牌推广部/宣传部", "module": "2. 内容创作与审核发布", "verdict": "LOGIC_GAP", "gap": "缺内容库版本/标签/全文检索、创作任务指派+状态、多级在线批注审核流程、发布渠道管理、发布日历。富文本发布(公告/新闻)仅作内容承载,审核与渠道/日历全缺。", "severity": "high", "evidence": "映射到 /culture/news。oa/pages/culture/news.vue 调 oaApi.listAnnouncements('新闻')/createAnnouncement/updateAnnouncement,后端 AnnouncementController.java 是纯 CRUD(list/get/create/update/delete + HtmlSanitizer),create 直接 setPublishedAt(now),无任何审核状态机、无审批节点、无批注留痕。无内容库版本管理、无标签分类、无全文检索(仅前端 title/author includes 过滤);无内容创作任务指派+状态;最关键的多级审核(部门负责人→法务→品牌总监→高管,可按重要性配置,在线批注)完全未接到内容;无发布渠道管理(官网/公众号/抖音/B站链接截图);无发布日历。", "survives": true, "reNote": "Gap real: content block is immediate rich-text publish only; no review/version/tag/channel/calendar/creation-task/annotation.", "reEvidence": "news.vue and Announcement.java do CRUD only; AnnouncementController sets publishedAt=now with no WorkflowService; grep found no channel/calendar/creation-task/review/annotation." }, { "area": "品牌推广部/宣传部", "module": "3. 媒体关系管理", "verdict": "PARTIAL", "gap": "缺记者/编辑联系人+影响力评分+深度检索、互动记录+联系提醒、投放计划+效果对比、媒体简报自动抓取分类。仅扁平 master-data 台账。", "severity": "med", "evidence": "映射到 /culture/media。oa/pages/culture/media.vue 复用 MasterDataPage + settingListStore('culture-media'),仅 6 列扁平台账(媒体名称/类型/对接人/合作内容/最近对接/合作等级),搜索键仅 media/mediaType/level。无记者/编辑联系人粒度+影响力评分、无按行业地域深度检索;无媒体互动详细记录+定期联系提醒;无广告/软文投放计划(版面/时段/费用/排期)+投放效果自动对比(阅读量/转载量);无媒体报道简报定期自动抓取分类。", "survives": true, "reNote": "缺口属实。媒体关系管理仅有一个扁平 master-data 台账,缺口描述的四类深度能力全部缺失,无法推翻。\n\n页面实现:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/media.vue 整体是 MasterDataPage.vue(通用 CRUD 列表,303 行,无任何媒体专属逻辑)+ settingListStore('culture-media') 键值存储。列只有 media/mediaType/contact/cooperation/lastTouch/level 六个扁平字段,contact 是单个\"对接人\"文本字段,不是记者/编辑联系人实体。导航定义 oaModules.ts:178 { key:'media', label:'媒体关系管理', kind:'list' } —— kind 就是 list(台账)。\n\n逐项核对缺口四要素,均无实现:\n1. 记者/编辑联系人+影响力评分+深度检索:无任何 journalist/editor/reporter/influence 域实体或字段;search-keys 仅 ['media','mediaType','level'] 的关键字过滤,谈不上\"深度检索\",更无影响力评分。\n2. 互动记录+联系提醒:无互动记录时间线、无联系提醒;contact 仅一个文本框,lastTouch 仅一个日期文本字段(无提醒触发)。\n3. 投放计划+效果对比:grep 全仓 placement/投放/效果对比 在该模块下零命中。\n4. 媒体简报自动抓取分类:唯一的 CrawlSource/CrawlJob 控制器是通用\"采集批次中心\"(注释明确写 Collection batch / 模拟 run),与媒体简报、媒体关系模块无任何关联,不做媒体简报抓取分类。\n\n后端无任何媒体关系相关域实体(domain 目录无 media/press/journalist/briefing/influence/placement 实体),无专属控制器。", "reEvidence": "media.vue(L2 import MasterDataPage; L5 settingListStore('culture-media',[扁平种子]); L7-14 六列扁平字段; L26-30 直接渲染通用 MasterDataPage)。oaModules.ts:178 kind:'list'。后端 domain/ 目录无任何媒体关系实体。CrawlSourceController.java:26 注释\"simulated run on a source generates a CrawlJob batch record\"——通用采集批次,非媒体简报。活体验证(127.0.0.1:8091):/api/oa/media、/press、/journalist、/reporter、/mediabriefing、/pr-contact 全部 404;/api/oa/settings/culture-media 仅返回键值存储(data:null)。全仓 grep 影响力评分/互动记录/联系提醒/投放计划/效果对比 在该模块零命中。" }, { "area": "品牌推广部/宣传部", "module": "4. 活动策划与执行", "verdict": "LOGIC_GAP", "gap": "缺活动立项(规模/目标/类型多样)、物料清单/进度/库存/领用、嘉宾+电子邀请函+出席确认、现场签到+照片视频上传、活动总结+计划实际差异对比。通用任务板仅承载任务分解一环,执行闭环缺失。", "severity": "high", "evidence": "映射到 /goal/project。oa/pages/goal/project.vue 是通用项目/任务板:项目(名称/负责人/起止/进度/状态)+任务(标题/负责人/优先级/状态/截止)的列表/看板(拖拽)/甘特图,调 listProjects/listTasks/createProject/createTask/updateTask。有任务分解+责任人+截止,但无活动立项的规模/目标/类型(展会/发布会/答谢会/年会)专属建模;无物料清单/制作进度/库存/领用;无嘉宾管理+电子邀请函+出席确认;无现场签到(二维码/人脸)+照片视频上传+流程实时记录;无活动总结(实际人数/曝光/线索转化/费用)+计划实际差异自动对比。代码与后端均无嘉宾/签到/物料/总结实体。", "survives": true, "reNote": "缺口属实。宣传部\"活动策划与执行\"块仅映射到 /goal/project 这个通用项目/任务板,活动执行闭环全部缺失。尽力推翻未果:(1) project.vue 只有项目(名称/负责人/部门/起止/进度/状态)和任务(标题/负责人/状态/优先级/截止日)字段,三视图为列表/看板/甘特图——只承载\"任务分解\"一环,无任何活动专有概念;(2) 无活动立项(规模/目标/类型多样)字段;(3) 无物料清单/进度/库存/领用(BomItem/InventoryItem 属研发与制造链,未接入活动;admin/affairs 的\"物资领用\"是行政办公用品,与活动无关);(4) 无嘉宾名单/电子邀请函/出席确认(meeting 的 attendees 是参会人字段,非活动嘉宾邀请函体系);(5) 无现场签到/照片视频上传;(6) 无活动总结/计划与实际差异对比。后端无 Campaign/Activity/Guest/Invitation/Checkin/Attendance 任何领域实体或控制器,唯一的 Event 是 ScheduleEvent.java(普通日历事件:title/type/start/end/owner)。CRM 的 campaign.vue 是市场推广商机清单(主题/类型/负责人/预算/日期/商机数/状态),亦非执行闭环。全量关键词扫描(签到/出席确认/邀请函/嘉宾名单/物料清单/领用/活动总结/计划实际差异/照片视频上传)在前后端均无命中。", "reEvidence": "映射定义: ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts —— 品牌推广部/宣传部 block '活动策划与执行' status=built path=/goal/project label='项目/任务'。承载页: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/project.vue(通用项目/任务板,字段与视图见上,无活动执行字段)。仅有活动相关页: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/crm/campaign.vue(CRM市场推广商机清单)。后端唯一Event实体: oa-backend/src/main/java/com/kaidi/oa/domain/ScheduleEvent.java(日历事件)。否定证据: domain 目录下 grep -iE 'Campaign|Activity|Guest|Invit|Checkin|Attend|Material' 仅命中 ScheduleEvent; find 前端 *event*/*campaign*/*activit*/*guest*/*signin*/*checkin* 仅命中 crm/campaign.vue; grep '签到|出席确认|邀请函|嘉宾名单|物料清单|领用|活动总结|计划实际差异|照片视频' 在 src 与 oa-backend/src/main/java 无活动闭环命中。" }, { "area": "品牌推广部/宣传部", "module": "5. 舆情监测与危机管理", "verdict": "MISSING", "gap": "缺品牌舆情抓取+情感分类、负面阈值自动预警推送、危机事件库+应对预案(口径/发言人/步骤)+触发调用、危机处理记录+案例复盘库。情报域与品牌舆情完全不同,全无实现。", "severity": "high", "evidence": "映射到 /intel/ledger。oa/pages/intel/ledger.vue 类别取 INTEL_CATEGORIES(含招标公告),详情动作是 convertIntelToOpportunity(转 CRM 商机);同域 intel/crawl.vue 抓取源页头明写'重点招投标信息',批次字段是 fetched/screened/newIntel;intel/board.vue 统计是招标线索/转商机/转化率。三页全是招投标线索情报域。后端 AlertController.aggregate() 预警源仅 PersonnelCert(证件)/Patent(年费)/ContractMilestone(履约)/InventoryItem(库存)/LabInstrument(校准),无任何舆情源。无品牌/产品/高管言论抓取、无正/中/负情感分类、无负面阈值(转发量/负面词频)自动推送、无危机事件库/应对预案/处理记录/案例复盘。", "survives": true, "reNote": "缺口属实。我尽力推翻但无法成立。品牌推广部「5. 舆情监测与危机管理」在前端组织视图 kaidiDeptView.ts 里确实存在且标 status:\"built\",但它只是把该 block 的 path 伪映射到 /intel/ledger(pageLabel:\"情报台账\"),属纯标签挂靠、零实质。该映射目标是「统一情报中心」的竞品/招投标情报,与品牌舆情完全是两回事,正如缺口所述。具体逐条核验:(1) 缺品牌舆情抓取+情感分类——Intel/CrawlSource/CrawlJob 是政府采购/公共资源/招标公告的模拟采集,Intel 实体字段为 title/category/source/region/keyword/summary/status/owner,category 取自 INTEL_CATEGORIES(招标公告/中标公示/政策法规/竞品动态/客户动态/行业资讯),无任何 sentiment/情感/正负面字段或评分;(2) 缺负面阈值自动预警推送——无 negative-threshold 机制,Alert/抓取仅按关键词命中,不按负面情感阈值触发;(3) 缺危机事件库+应对预案(口径/发言人/步骤)+触发调用——全库无 crisis/危机/应对预案/发言人/spokesperson 任何实体、控制器、页面;(4) 缺危机处理记录+案例复盘库——「复盘」命中全是博客随笔/报价复盘等无关文本。全仓(前端 src + 后端 java,排除 build 产物)对 情感分类/舆情/sentiment/危机事件/应对预案/发言人/案例复盘库/public opinion/负面阈值 的搜索零真实命中。culture/media.vue 仅为「媒体关系管理」联系人台账,与舆情危机无关。结论:功能全无实现,组织视图里的「built」是 cosmetic 重映射假象。", "reEvidence": "前端伪映射证据 ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts 品牌推广部块: {\"name\":\"舆情监测与危机管理\",\"status\":\"built\",\"path\":\"/intel/ledger\",\"pageLabel\":\"情报台账\"} —— 指向情报中心而非舆情危机。映射目标页 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/intel/ledger.vue(title=\"情报台账\" crumb-root=\"统一情报中心\",字段无情感/负面/危机,含「情报转商机」动作)。后端 oa-backend/src/main/java/com/kaidi/oa/domain/Intel.java(类注释明确 category 为 招标公告/中标公示/政策法规/竞品动态/客户动态/行业资讯,可转 CRM 商机)、CrawlSource.java/CrawlJob.java(注释「no real network crawling」「政府采购平台/公共资源交易中心/企业官网/行业门户」)。控制器 oa-backend/src/main/java/com/kaidi/oa/web/IntelController.java 端点仅 list/get/create/convert-opportunity,无任何 sentiment/crisis。全仓 grep 情感分类|舆情|sentiment|危机事件|应对预案|发言人|spokesperson|案例复盘库|负面阈值 在前端 src 与后端 java(排除 build/*.js)零真实命中(唯一 舆情 命中即上述 kaidiDeptView 伪映射 block 本身)。媒体页 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/media.vue 为「媒体关系管理」联系人列表,与舆情危机无关。" }, { "area": "品牌推广部/宣传部", "module": "6. 品牌资产管理", "verdict": "MISSING", "gap": "缺品牌标识规范文件+授权版本下载、品牌应用合规审核、荣誉资质库、宣传物料库存领用补货。映射页是会计固定资产,需求完全错配。", "severity": "high", "evidence": "映射到 /finance/asset。oa/pages/finance/asset.vue 是会计固定资产台账:字段为资产名称/类别(机器设备/电子设备/运输工具/房屋建筑/办公家具)/原值/累计折旧/净值/使用部门/状态(在用/闲置/报废),settingListStore('finance-asset')。与品牌资产完全错配。全栈 grep 无 LOGO/标准色/标准字/品牌形象规范文件下载、无品牌应用审核(名片/PPT/背景板)、无荣誉资质库(奖项/颁发机构/证明文件)、无宣传物料库存(宣传册/礼品/纪念品 领用补货)。", "survives": true, "reNote": "缺口属实。品牌推广部/宣传部的\"品牌资产管理\"块在 kaidiDeptView.ts 中被映射到 path:\"/finance/asset\" (pageLabel:\"资产管理\"),而该路径在 oaModules.ts 第407行明确注册为\"财务管理\"模块下的子项,与会计科目/记账凭证/应收账款并列。对应页面 pages/finance/asset.vue 是会计固定资产台账(列:资产名称/类别[机器设备/电子设备/运输工具/房屋建筑/办公家具]/原值/累计折旧/净值/使用部门/状态[在用/闲置/报废],crumb-root=\"财务管理\"),与品牌资产毫无关系——映射完全错配,正如缺口描述。需求要求的四项能力全部缺失:品牌标识规范文件+授权版本下载、品牌应用合规审核、荣誉资质库、宣传物料库存领用补货。全代码库无任何对应实现:无后端控制器(web/ 目录下无 Brand/Honor/Material/Promo/Identity 控制器),无相关前端页面,对\"授权版本/品牌应用合规/荣誉资质库/宣传物料库/物料领用/物料补货/标识规范文件\"等关键词的全库 grep 均零命中。尽力推翻未果。", "reEvidence": "1) /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts (宣传部 subdept): {\"name\": \"品牌资产管理\", \"status\": \"built\", \"path\": \"/finance/asset\", \"pageLabel\": \"资产管理\"}。\n2) /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts 第407行: { key: 'asset', label: '资产管理', kind: 'list', path: '/finance/asset' } —— 位于 id:'finance' label:'财务管理' 模块 children 内,与会计科目/记账凭证/应收账款/应付账款同级。\n3) /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/finance/asset.vue: 固定资产折旧台账,列含 原值/累计折旧/净值/类别(机器设备…)/状态(在用/闲置/报废),crumb-root=\"财务管理\",seed 数据为\"生产车间数控机床/研发中心服务器/行政办公轿车\"。\n4) ls oa-backend/src/main/java/com/kaidi/oa/web/ | grep -i 'brand|honor|material|promo|identity' = 空; grep -rni '授权版本|品牌应用合规|荣誉资质库|宣传物料库|物料领用|物料补货|标识规范文件' 全库 = 零命中。" }, { "area": "品牌推广部/宣传部", "module": "7. 内部宣传与文化", "verdict": "PARTIAL", "gap": "缺投稿+审核+发布工作流、企业大事记时间轴、员工宣传素材库。仅基础公告/新闻 CRUD。", "severity": "med", "evidence": "映射到 /culture/notice。oa/pages/culture/notice.vue 调 listAnnouncements('公告'),与 news 同走 AnnouncementController 纯 CRUD,create 直接发布无审批。承载了内刊/内网的基础发布与置顶,但无在线投稿+审核+发布工作流(公告无审批节点);全栈 grep 无企业大事记(开业/并购/获奖/里程碑)时间轴展示页/实体;无员工宣传素材库(企业简介PPT/宣传视频链接/标准照片 供员工转发)。", "survives": true, "reNote": "缺口属实,三项被指功能均确实未实现,文化建设模块仅为基础CRUD。\\n\\n【投稿+审核+发布工作流】Announcement 实体无任何审核/状态字段(仅 category/title/content/author/top/publishedAt/publishRange);AnnouncementController.create() 第84行直接 setPublishedAt(Instant.now()) 立即发布,无草稿→投稿→审核→发布状态机,未接入 WorkflowService。news.vue/notice.vue 均直接调 createAnnouncement 即发即published,notice 里唯一的\"状态\"是展示用标签(置顶/已发布),并非工作流状态。\\n\\n【企业大事记时间轴】全前后端精确检索 大事记/企业大事/发展历程 = 0 命中。所有 milestone 命中均为 ContractMilestone(合同履约节点 contractId/amount/dueDate),与公司大事记无关;所有 timeline 命中均为通用 el-timeline 组件(collab/goal/meeting 用)。\\n\\n【员工宣传素材库】全项目精确检索 宣传素材/素材库/宣传物料/品牌素材 = 0 命中。享空间(share.vue)是 Feed 社交动态流(点赞/评论),非素材/物料库;media.vue 是媒体关系管理 settingList 主数据表,award.vue 是项目评优 settingList 主数据表,均无素材资源库语义。\\n\\n文化建设7子模块(news/notice/discuss/survey/share/media/award)全为基础CRUD:news/notice 直发公告CRUD;media/award 为 settingListStore 主数据表(有 status 下拉但无流程引擎)。无法推翻该缺口。", "reEvidence": "后端: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Announcement.java (无审核/状态字段); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AnnouncementController.java:84 (create 即设 publishedAt=Instant.now() 直接发布,无审核端点)。前端: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/news.vue (直发CRUD), notice.vue:215 (status 仅展示置顶/已发布标签), media.vue+award.vue (settingList 主数据CRUD), share.vue (Feed 社交流非素材库)。检索证据: 全前后端 grep 大事记/企业大事/发展历程=0、宣传素材/素材库/宣传物料/品牌素材=0、投稿/稿件/审稿=0;milestone 命中全为 ContractMilestone(合同履约节点),timeline 命中全为通用 el-timeline 组件。" }, { "area": "品牌推广部/宣传部", "module": "8. 协同与接口", "verdict": "LOGIC_GAP", "gap": "缺申报/经营/研发/HR/法务/财务六向真实集成与自动触发规则。接口仅在组织视图声明,无落地的接口/联动引擎规则。", "severity": "med", "evidence": "kaidiDeptView.ts 中本部 interfaces 仅声明了申报服务部/经营部/技术研发部/人力资源部/法务风险部/财务部 6 个对象,是静态字符串数组。service/TriggerRuleEngine.java 的 ruleKeyFor 全部规则键为 payment.create/receipt.invoice/contract.effectivate/contract.toSeal/project.create/project.accept/project.toArchive/seal.markUsed/supplier.admit,无任何品牌/宣传相关联动(荣誉/重大新闻→申报、展会信息→经营、新品技术亮点←研发、企业文化←HR、文案合规→法务、宣传费用→财务)。", "survives": true, "reNote": "缺口属实。宣传部(品牌推广部)在组织视图声明的 6 个接口(申报服务部/经营部/技术研发部/人力资源部/法务风险部/财务部)仅为静态展示标签,无任何落地的接口集成或联动引擎规则支撑,无自动触发。我尽力寻找反证但每条线索都坐实缺口:(1) interfaces 字段全项目仅被 orgview/dept.vue 当作 chip 渲染(\"与其他部门协作(数据接口)\"),无任何逻辑消费;(2) TriggerRuleEngine 的 7 条触发分支只命中 付款/用印/收款/验收/供应商/合同/立项,无 宣传/品牌/活动策划/舆情/文化 任一关键词,也不产出申报/经营/研发/HR/法务的跨部门联动;(3) 整个后端 src 对 宣传/舆情/内刊/活动策划/品牌资产/媒体关系 的 grep 全部为空,WorkflowService 也无相关条件分支;(4) 该部门\"built\"块全是通用 CRUD/共享页(media.vue 是 settingListStore 主数据列表,其余指向 /goal/plan、/culture/news、/intel/ledger、/finance/asset 等通用页),不构成与 6 个部门的真实自动数据流;(5) 唯一提及 集成/integration 的后端文件分别是人名\"周集成\"、组织富化种子和 DataSyncLog(后者明确属甲方外部 ERP 对接口径,非宣传部内部六向集成)。", "reEvidence": "前端声明(纯展示): ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts(品牌推广部>宣传部 interfaces=[\"申报服务部\",\"经营部\",\"技术/研发部\",\"人力资源部\",\"法务风险部\",\"财务部\"]); 唯一消费者: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/orgview/dept.vue:96-104(v-for 渲染 chip)。触发引擎无相关规则: oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:109-128(7 条 containsAny 分支无任何宣传/品牌/文化/申报关键词)。后端零引用: grep \"宣传|舆情|内刊|活动策划|品牌资产|媒体关系\" 遍历 oa-backend/src/main/java 无任何命中; WorkflowService.java 无 宣传/品牌/申报 条件分支。块页为通用 CRUD: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/media.vue(settingListStore('culture-media') 主数据列表)。干扰项排除: OrgEnrichmentSeeder.java:51 \"周集成\"为人名; DataSyncLog.java:17 注释表明其为甲方外部 ERP/财务系统对接口径,非宣传部六向集成。" }, { "area": "品牌推广部/宣传部", "module": "9. 移动端应用", "verdict": "PARTIAL", "gap": "缺移动端内容审核、活动签到扫码、舆情实时推送、发布日历四项专属场景的后端支撑。仅通用待办审批/预警/填报可用。", "severity": "med", "evidence": "映射到 /mobile/workbench。oa/pages/mobile/workbench.vue 注释自述'纯前端聚合,不新增后端',聚合 listInstances('todo')待办审批 + budget/safety/milestone/cert/patent 预警 + 进度填报 + 快捷查询。通用移动审批可用,但本部 4 项专属场景均无后端支撑:内容审核依赖模块2多级审核(缺);活动签到扫码管理嘉宾依赖模块4签到(缺);负面舆情实时推送依赖模块5舆情/阈值(Alert 无舆情源,缺);发布日历(模块2发布日历不存在,缺)。", "survives": true, "reNote": "real gap; no backend for the four PR mobile scenarios", "reEvidence": "MobileController only has summary endpoint; grep for checkin scan qrcode sentiment publishCalendar contentReview all zero" }, { "area": "品牌推广部/项目文化", "module": "1. 项目文化建设规划", "verdict": "MISSING", "gap": "公司级年度/季度文化建设计划编制与分解到项目、逐项目文化目标设定、文化预算管理及报销关联项目+预算校验全缺。维持 MISSING。", "severity": "high", "evidence": "culture 模块仅 7 页(news/notice/discuss/survey/share/media/award),无任何文化建设计划编制页。grep goal/budget/components 内 '文化/凝聚力/宣传稿件/故事挖掘/文化目标/文化预算' 零命中。后端无对应控制器/domain,WorkflowService 与 TriggerRuleEngine 无 culture 相关流转。无公司级计划编制、无分解到项目、无逐项目文化目标(凝聚力/满意度/稿件数)、无文化预算+报销关联项目校验。", "survives": true, "reNote": "缺口属实,维持 MISSING。我尽力推翻但无法成立。该缺口要求四件事,逐项查证均无真实现:(1) 公司级年度/季度文化建设计划编制并分解到项目——无。kaidiDeptView.ts 里\"项目文化建设规划\"块虽标 status:\"built\",但只是把它映射到 /goal/plan(通用\"工作计划\"页),纯属映射充数;后端 WorkPlan.java 仅有 title/owner/ownerId/period(本周/本月/本季)/status/content 六字段,前端 plan.vue 是日报/周报/月报填报+审阅流,毫无\"计划→分解到项目\"的父子关系或年度/季度文化计划概念。(2) 逐项目文化目标设定——无,全站无文化目标字段,工作计划只有自由文本 content。(3) 文化预算管理——无,Budget.java 是通用\"项目预算 vs 实际\"台账(成本要素=人工费/材料费/机械费/差旅费/管理费/外协费/分包费),没有文化/宣传预算口径,也不与文化计划关联。(4) 报销关联项目+预算校验——无,expense-reimburse 表单模板字段为 reimburseDept/expenseType/amount/expenseItems,无项目字段、无预算校验;WorkflowService 与 TriggerRuleEngine 全文无任何 budget 引用,BudgetController 仅在自身 create 时按 actualAmount>budgetAmount 置\"超支\",报销流程从不触碰预算。四项全缺。", "reEvidence": "ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts(品牌推广部/项目文化 节点,\"项目文化建设规划\"块 path:\"/goal/plan\" pageLabel:\"工作计划\" status:\"built\",文件 offset~27035;该块周边无\"文化预算\"/\"文化目标\"字样);ofbiz-framework/plugins/modern-ui/app/src/oa/pages/goal/plan.vue(通用日/周/月工作计划页,无项目分解/预算/目标);oa-backend/src/main/java/com/kaidi/oa/domain/WorkPlan.java(仅 title/owner/ownerId/period/status/content);oa-backend/src/main/java/com/kaidi/oa/domain/Budget.java(通用预算台账,无文化口径,与计划无关联);oa-backend/src/main/java/com/kaidi/oa/seed/TemplateSeedData.java:221-242(expense-reimburse 表单仅 reimburseDept/expenseType/amount/expenseItems,无项目字段无预算校验);oa-backend/.../web/BudgetController.java(仅自身超支判定,无报销联动);WorkflowService.java/TriggerRuleEngine.java 全文无 budget 引用;culture 各页(news/notice/discuss/survey/share/media/award)均为简单列表 CRUD,无任何规划/预算/分解/文化目标功能。" }, { "area": "品牌推广部/项目文化", "module": "2. 项目宣传与故事挖掘", "verdict": "LOGIC_GAP", "gap": "项目宣传员配置、宣传任务(周报/节点/专访)下达+跟踪、项目故事库(标签+多媒体)、素材按项目分类全文检索、多级审核流、简报月刊自动汇总均缺。维持 LOGIC_GAP。", "severity": "high", "evidence": "news.vue 为纯发布/浏览板(只有'发布新闻',无项目负责人→文化部→法务多级审核);discuss.vue grep '项目/故事/攻坚/创新/协作/标签/审核/复盘/案例' 全部零命中(普通讨论区);share.vue/Feed.java 为通用社交流,Feed 实体字段仅 author/dept/type/content/tags/images/likes/comments,无 projectId、无故事分类标签、无短视频/照片专项上传。无宣传员配置、无宣传任务下达跟踪、无项目故事库、无按项目分类全文检索、无多级审核流、无简报/月刊自动汇总。", "survives": true, "reNote": "我作为对抗复验员尽力推翻该缺口,但无法找到任何实现,缺口属实。逐项核对\"品牌推广部/项目文化 - 项目宣传与故事挖掘\"全部六类功能均缺:(1)项目宣传员配置 — 全库无;(2)宣传任务(周报/节点/专访)下达+跟踪 — 全库无;(3)项目故事库(标签+多媒体) — 全库无;(4)素材按项目分类全文检索 — 仅有通用跨模块FTS5检索(FullTextSearchService 索引公告/合同/客户等),无\"素材\"实体、无按项目分类;(5)多级审核流 — 该领域无;(6)简报月刊自动汇总 — 全库无。文化建设(culture)模块仅 7 个子模块:新闻/公告/讨论/调查/享空间/媒体关系管理/项目评优激励,且 media/award 为简单主数据列表页(MasterDataPage),news/notice 为 Announcement 列表,share 为社交动态流(Feed),均不构成宣传员/宣传任务/项目故事库。后端 ~90 控制器无任何 Story/Material/Publicity/Propaganda/Digest/Newsletter 控制器。\"品牌推广\"在全库仅作为 DataSeeder 中的部门名出现,非功能模块。维持 LOGIC_GAP。", "reEvidence": "前端模块定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:168-179 culture 仅含 news/notice/discuss/survey/share/media/award 七子模块,无宣传/故事/素材/简报项。culture 页面目录 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/ 仅 award.vue/discuss.vue/media.vue/news.vue/notice.vue/share.vue/survey.vue + mock.ts;media.vue 与 award.vue 为 MasterDataPage 简单 CRUD 列表;news.vue:28 走 oaApi.listAnnouncements('新闻') 纯新闻发布;share.vue 为 Feed 社交流。全库 grep(前端 src + 后端 java)对 宣传员|宣传任务|项目故事|故事库|素材库|简报|月刊|专访|节点专访|propaganda|newsletter|story.library 零功能命中。后端 oa-backend/src/main/java/com/kaidi/oa/web/ ~90 控制器无 Story/Material/Publicity/Digest 等控制器。全文检索 oa-backend/src/main/java/com/kaidi/oa/service/FullTextSearchService.java:113-218 为通用 fts_index(索引公告/合同/客户等 title+body),无\"素材\"实体亦无按项目分类维度。\"品牌推广\"唯一出现于 oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:470 作为部门名,非功能。" }, { "area": "品牌推广部/项目文化", "module": "3. 项目知识沉淀与案例库", "verdict": "MISSING", "gap": "经验教训库(提交+审核+检索)、复盘报告上传自动关联档案、优秀案例评选入库、案例应用借鉴跟踪与价值统计全缺。维持 MISSING。", "severity": "high", "evidence": "knowledge 模块页(blog/doccenter/favorites/libmgr/map/portal/rss)为通用文档/博客/RSS。Blog/Discussion/Document domain grep 'projectId/caseType/lesson/复盘/review/honor/story' 零命中。后端无经验教训库/复盘报告/优秀案例评选/案例应用跟踪相关控制器或字段,无审核流,无关联项目档案,无案例价值统计。", "survives": true, "reNote": "缺口属实。领域[品牌推广部/项目文化]的\"项目知识沉淀与案例库\"在 kaidiDeptView.ts 中虽标 status:\"built\",但 path 仅复用通用文档中心 /knowledge/doccenter,并非真正的案例库实现。逐项核对四项要求全部缺失:(1) 经验教训库(提交+审核+检索) 无;(2) 复盘报告上传自动关联档案 无;(3) 优秀案例评选入库 无;(4) 案例应用借鉴跟踪与价值统计 无。后端无任何对应控制器/领域实体,前端无任何对应页面。我尽力尝试推翻但无法找到任何实现证据,应维持 MISSING。", "reEvidence": "1) 数据映射:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts 中\"项目文化\"部门块 {\"name\":\"项目知识沉淀与案例库\",\"status\":\"built\",\"path\":\"/knowledge/doccenter\"}——仅别名到通用文档中心,无专属案例库页。\n\n2) 目标页只是通用文档库:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/knowledge/doccenter.vue 为文件夹树+上传(uploadMeta)+版本历史(本地派生)+预览的通用文档中心,无经验教训提交/审核工作流、无案例评选、无复盘报告自动关联档案、无案例应用/借鉴/价值统计字段或逻辑。\n\n3) 后端无支撑:web/ 目录无 Lesson/CaseStudy/Knowledge/Retrospective 控制器(仅 Archive/ArchiveComment/Blog/Document/Folder 等通用文档类);domain/ 无对应实体;grep 经验教训/优秀案例/案例评选/借鉴跟踪/案例应用/价值统计/复盘报告(自动关联) 在 oa-backend/src/main/java 下无功能性命中(WorkflowService.java 中的 cases 是 switch 分支路由,与知识案例无关)。\n\n4) 活体验证:登录 127.0.0.1:8091 取 token 后,GET /api/oa/{lessons,cases,caseStudy,knowledgeCase,retrospective,experienceLib,bestPractice} 全部返回 404。" }, { "area": "品牌推广部/项目文化", "module": "4. 项目评优与激励", "verdict": "LOGIC_GAP", "gap": "评选周期/标准/奖励形式配置、在线申报+资格自动校验、评审流程(初审→专家→领导小组)打分投票留痕、公示通知自动生成+表彰+发放记录、荣誉墙均缺。维持 LOGIC_GAP。", "severity": "high", "evidence": "award.vue 仅 31 行,为 settingListStore('culture-award') 通用 MasterDataPage CRUD 表;status 是自由下拉(评定中/已公示/已发放)的静态字符串,非工作流状态。grep award.vue '评审/公示/打分/投票/申报/资格校验/表彰/发放' 仅命中种子数据字符串,无任何逻辑。'荣誉墙' 全前端 grep 零命中。后端无评优控制器,WorkflowService 无评优流转。", "survives": true, "reNote": "缺口属实。品牌推广部/项目文化的\"项目评优与激励\"仅实现为单页扁平台账 award.vue,五项核心能力(周期/标准/奖励配置、在线申报+资格自动校验、初审→专家→领导小组评审打分投票留痕、公示自动生成+表彰+发放记录、荣誉墙)全部缺失,未接任何工作流/规则引擎。竭力反证后仍无法推翻。", "reEvidence": "前端唯一实现 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/award.vue:直接复用通用 MasterDataPage + settingListStore('culture-award'),只有 6 个纯文本/下拉列 name/project/awardType/winner/awardDate/status,无任何评审/打分/校验/工作流逻辑。awardType 是静态下拉(优秀项目/先进个人/...),status 也是静态下拉(评定中/已公示/已发放),无配置实体、无周期/标准/奖励形式配置页。settingList.ts(/Users/qiu/.../oa/api/settingList.ts)证明它落到通用 biz_record 表,无领域逻辑。导航定义 data/oaModules.ts:179 仅 { key:'award', kind:'list', path:'/culture/award' }——是 list 不是流程页。后端无任何评优控制器:web/ 目录下只有 Declaration*Controller(政府项目申报:高新企业/科技型中小企业,见 DeclarationController.java 类注释,与评优无关且自身无资格校验);全后端 grep 评优/评选/荣誉/表彰/资格自动校验/公示/发放记录 仅命中编译产物 award-*.js 与无关的中标公示/合同主体资格(DataSeeder.java:1866/2236)。打分投票仅存在于无关的 survey.vue 问卷模块(voteSurvey),未与评优挂钩;'优秀员工评选投票'只是 mock.ts:209 的问卷标题字符串。WorkflowService/TriggerRuleEngine 均未接入 award。活体验证:登录后 GET /api/oa/biz/culture-award 返回空数据的通用台账,GET /api/oa/awards 返回 404(无专用路由)。荣誉墙页面在 culture/ 目录(award/discuss/media/news/notice/share/survey)中完全不存在。" }, { "area": "品牌推广部/项目文化", "module": "5. 项目文化评估与反馈", "verdict": "PARTIAL", "gap": "匿名多题量表问卷、自动统计→分析报告、HR 满意度/敬业度关联、纳入项目经理年度考核自动采集生成得分、改进建议→整改任务→指派→闭环跟踪均缺,仅最基础投票。维持 PARTIAL。", "severity": "med", "evidence": "Survey 实体仅 title/description/optionsJson({label,votes})/votersJson/responseCount/deadline;SurveyController.VoteRequest(Integer optionIndex, String voter) 为单题单选投票且记录投票人姓名(votersJson 去重),非匿名。survey.vue grep '匿名/多题/量表/团队协作/领导关怀/幸福感/归属感/分析报告/考核/整改/HR/敬业' 仅命中 voterName 回退'匿名用户'与作者占位,无多题量表、无自动分析报告、无 HR 关联、无项目经理考核采集、无改进建议→整改任务→闭环。", "survives": true, "reNote": "无法推翻,缺口属实。链[5.项目文化评估与反馈]在“文化建设/调查”模块里只有最基础的单题投票(poll),且全部声称缺失的能力(匿名多题量表问卷、自动统计→分析报告、HR满意度/敬业度关联、纳入项目经理年度考核自动采集生成得分、改进建议→整改任务→指派→闭环跟踪)在前后端及活体均无实现。后端 Survey 域只有 optionsJson=[{label,votes}]、单 optionIndex 投票、按 voter 去重;SurveyController 仅 list/get/create/update/delete/vote,无多题作答、无聚合分析报告端点、无HR/年度考核/得分/整改任务字段或联动。实际路由的前端页面 survey.vue 是单题单选投票+百分比柱状图,仅从 mock 引入 people。值得注意:culture/mock.ts 里确有更丰富的结构(surveyQuestions 含 rate/multiple/text 题型、anonymous 匿名标志、surveyStats 聚合统计、surveyList),但全仓 grep 证实这些标识符零处被 import——纯孤儿死代码,从未渲染、从未持久化、无后端支撑,反而印证“做了脚手架但没落地”。后端对 敬业度/满意度量表/匿名/年度考核/整改任务/改进建议/闭环 及 engagement/satisfaction/likert/questionnaire 关键字检索,无任何控制器或域实现。活体 /api/oa/surveys 返回的正是 {label,votes} 基础投票形态。维持 PARTIAL 判定成立。", "reEvidence": "后端域 oa-backend/src/main/java/com/kaidi/oa/domain/Survey.java(仅 title/description/author/status/optionsJson=[{label,votes}]/votersJson/responseCount/deadline,无题目/量表/匿名/报告/HR/考核/任务字段);后端控制器 oa-backend/src/main/java/com/kaidi/oa/web/SurveyController.java(端点仅 GET /api/oa/surveys、GET/{id}、POST、PUT/{id}、DELETE/{id}、POST/{id}/vote,vote 仅接受单个 optionIndex,无多题提交/分析报告/HR/考核/整改任务);前端实际页面 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/survey.vue(单题单选 el-radio-group 投票+el-progress 百分比,第9行只 import { people } from './mock');孤儿死mock ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/mock.ts 第201-274行(surveyCategories/surveyList(anonymous)/SurveyQuestion+surveyQuestions(rate,multiple,text)/SurveyStat+surveyStats)——全仓 grep 'surveyQuestions|surveyStats|surveyCategories|SurveyQuestion|SurveyStat' 在 mock.ts 之外零命中,无任何消费者;前端API ofbiz-framework/plugins/modern-ui/app/src/oa/api/community.ts(Survey 接口仅 options?:SurveyOption[]{label,votes},listSurveys/getSurvey/createSurvey/voteSurvey(optionIndex)/updateSurvey/deleteSurvey);活体 GET http://127.0.0.1:8091/api/oa/surveys 返回 optionsJson=[{label,votes}] 基础投票数据。后端关键字检索 敬业度/满意度量表/匿名/年度考核/整改任务/改进建议/闭环 与 engagement/satisfaction/anonymous/likert/questionnaire 均无控制器/域实现。" }, { "area": "品牌推广部/项目文化", "module": "6. 项目文化资产归档", "verdict": "PARTIAL", "gap": "文化资产专项打包(宣传稿/活动照片/仪式视频/故事案例/评优记录/调查数据)、文化年报自动生成、数字展厅/文化墙(地图/时间轴)均缺,仅通用全周期归档。维持 PARTIAL。", "severity": "med", "evidence": "archive 页(board/globalsearch/library/search/security)为通用档案库,library.vue 上传表单为通用档案名称/分类/访问权限/标签,非文化资产专项打包。archive 内 grep '文化/年报/展厅/文化墙/荣誉墙/宣传稿/仪式视频' 零命中。'数字展厅/文化展厅/文化墙/展厅' 全前端仅 display.ts 一处无关的'组件展厅'工具映射。rd/annualreport 为研发年报,与文化年报无关。", "survives": true, "reNote": "缺口属实。我尽力推翻但无法证伪。\"项目文化资产归档\"块在 kaidiDeptView.ts 中明确映射到 /archive/library(通用档案库),其实现(library.vue + Archive.java domain)只是通用全周期归档:固定分类为 项目档案/合同档案/申报成果/制度文件/会议纪要/技术资料,功能为上传/分类/水印预览/批注——并无文化资产专项打包(宣传稿/活动照片/仪式视频/故事案例/评优记录/调查数据 的成包归档)。全前后端 grep \"文化年报/数字展厅/文化墙/时间轴/exhibition/annualReport/资产包/专项打包\" 均无文化语境命中:唯一的 annualreport 是 /rd/annualreport.vue(研发费用加计扣除/高企认定,与文化无关);所有 \"map\" 命中均为 JS 数组 .map() 调用,非地理地图;culture/archive 目录内无任何 timeline/时间轴/地图/展厅组件。三项专项能力(专项打包、文化年报自动生成、数字展厅/文化墙)确实缺失,仅余通用归档。维持 PARTIAL 成立。", "reEvidence": "映射证据 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts:项目文化子部门块 {\"name\":\"项目文化资产归档\",\"status\":\"built\",\"path\":\"/archive/library\",\"pageLabel\":\"档案库\"}。通用归档实现 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue(分类/上传/水印预览/批注,无文化专项打包);后端 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java(category 仅 项目档案/合同档案/申报成果/制度文件/会议纪要/技术资料)。文化页面目录 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/culture/(news/notice/award/survey/share/discuss/media)无任何年报生成/展厅/文化墙/时间轴/地图。无关命中:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/annualreport.vue 为研发费用年报。" }, { "area": "品牌推广部/项目文化", "module": "7. 移动端应用", "verdict": "MISSING", "gap": "移动端 5 项采集功能(随手拍上传/扫码签到/评优申报/匿名问卷/故事投稿)全无,仅通用工作台门户。维持 MISSING。", "severity": "high", "evidence": "mobile 模块仅 workbench.vue 单页(通用门户);grep '随手拍/签到/扫码/投稿/匿名/短视频/素材库/拍照' 零命中。无随手拍即时上传素材库、无团队活动扫码签到+参与人数统计、无手机端评优申报+证明材料、无手机匿名文化问卷、无移动端故事投稿(图文/短视频)。", "survives": true, "reNote": "缺口属实,无法推翻。移动端只有一个聚合工作台门户,5 项采集功能(随手拍上传/扫码签到/评优申报/匿名问卷/故事投稿)在前后端均不存在。(1) 前端 mobile 模块在 data/oaModules.ts:489-496 只定义一个子项 workbench,路由由 router/index.ts:18 的 import.meta.glob 从模块子项生成,唯一对应页面 oa/pages/mobile/workbench.vue。(2) 该 workbench.vue 自述\"移动端只做一个工作台...聚合既有后端端点:待办审批/预警中心/进度填报/快捷查询\",整页只有 todo/alert/fill 三个 tab + 快捷查询宫格,没有任何拍照、扫码、签到、投稿、问卷表单。(3) 后端 MobileController 仅有 GET /api/oa/mobile/summary 做计数聚合(todoCount/alertCount/dangerCount/projectCount + 预览列表),无任何采集写接口。(4) 全仓 grep 二维码/qrcode/扫码/签到/check-in/随手拍/camera/拍照/投稿/故事/story/匿名问卷 在 mobile 上下文零命中(命中的只是 meeting 的 VideoCamera 图标、hr/worktime 的 checkIn 开关、history 噪声)。(5) culture 模块虽有 award(项目评优激励)和 survey(调查)桌面 list 页,但它们是后台台账/管理页,不是移动端采集入口;且 SurveyController 投票按认证 userId 绑定(voter=\"uid:\"+su.getId() 一人一票去重),是实名计票,恰恰不是\"匿名问卷\"。culture/share(享空间)是基于 Feed 的桌面动态流,也非移动\"故事投稿\"采集。", "reEvidence": "data/oaModules.ts:489-496 (mobile 模块仅 workbench 一个子项); oa/pages/mobile/workbench.vue (整页仅 todo/alert/fill+快捷查询,无采集功能,目录下仅此一文件); oa-backend/.../web/MobileController.java (仅 /summary 聚合读,无采集写接口); router/index.ts:18 (路由由模块子项 glob 生成,mobile 仅一页); SurveyController.java:182-215 (投票按 uid: 实名去重,非匿名); 全仓 grep qrcode/扫码/签到/随手拍/投稿/故事/匿名问卷 在移动端零命中" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "1. 资质基础信息与台账", "verdict": "PARTIAL", "gap": "无资质分类体系、无扫描件 storedFileId、无使用记录(超范围防控)、Certification 未进预警聚合、无多档预警与过期自动上报。前后端两套数据不通属实。", "severity": "high", "evidence": "确认两套数据不通:hr/qualification.vue 第5行 settingListStore('hr-qualification') 纯 localStorage mock;后端 Certification(domain/Certification.java)由 ehs/cert.vue「三体系认证」承载(listCertifications/createCertification),二者无交集。Certification 实体仅平铺 name/certNo/issuer/scope/issueDate/expireDate/status,无分类层级、无 storedFileId(无扫描件绑定)、无使用记录字段。AlertController.aggregate() 第104-113行只遍历 PersonnelCert 产「证件预警」,Certification 完全未纳入聚合;AlertScheduler.refreshCertExpiry() 仅刷 PersonnelCert。预警窗口为单一30天(CertificationController EXPIRING_WINDOW_DAYS=30 / AlertScheduler WARN_WINDOW_DAYS=30),无6/3/1月/15天多档、无过期未处理上报主管。", "survives": true, "reNote": "Gap is real.", "reEvidence": "Certification.java lacks classification/storedFileId/usage fields; AlertController.aggregate omits Certification; AlertScheduler only refreshes PersonnelCert; hr/qualification.vue uses settingListStore not the Certification API." }, { "area": "行政 / 综合部/行政 / 综合部", "module": "2. 资质申报与升级管理", "verdict": "MISSING", "gap": "整套资质申报与升级管理缺失;现有 Declaration 体系是科研项目申报,域不同,不能覆盖。", "severity": "high", "evidence": "查 Declaration/DeclarationTemplate/DeclarationStep/PolicyApplication 系列控制器,domain/DeclarationTemplate.java 注释明确 program 为「高新技术企业/科技型中小企业/省重点研发计划/专精特新/创新平台」,属研发创新中心政府项目申报,非资质(施工/设计资质)申报升级。无年度申报计划审批、无子任务分解指派、无按资质标准的材料模板协同填报、无从HR/项目自动匹配人员业绩提示缺口、无外部受理-评审-公示-领证阶段跟踪、无补正陈述、无申报费用预算控制的任何承载。", "survives": true, "reNote": "缺口属实,无法推翻。综合部职责明确要求\"资质申报、延续、升级申报\"全流程管理,但系统在 kaidiDeptView.ts 中把该需求仅映射到一个名为\"资质基础信息与台账\"的 block,指向 /hr/qualification。该页面(hr/qualification.vue)只是一个 MasterDataPage CRUD 列表,字段为 资质名称/证书编号/等级/持证主体/发证机关/有效期/状态,完全是台账登记,没有任何\"申报(application)\"\"延续(renewal)\"\"升级申报(upgrade)\"的审批工作流。后端 Certification 实体/Controller 同样只是带到期状态派生的证书清单(三体系认证台账),无任何申报/升级/延续接口。Declaration 体系经核实是\"政府项目申报\"(高新技术企业/科技型中小企业/省重点研发计划等,归属研发创新中心-申报服务部),域不同,且 program 枚举与资质无关,不能覆盖企业资质申报升级。其它含\"资质\"字样的代码(supplier.ts供应商准入、src-cost-contract/src-progress-payment 的资质证书附件字段、crm/qualperf 投标资质业绩库)均属不同业务域,无一是综合部自有资质的申报/升级审批流程。结论:整套资质申报与升级管理确实缺失,仅有静态台账,无申报/升级流程引擎接入。", "reEvidence": "综合部映射: oa-backend/src/main/resources/static/assets/kaidiDeptView-DS3oCDhr.js (源 ofbiz-framework/plugins/modern-ui/app/src/data/kaidiDeptView.ts) — 综合部 duty=\"...3.资质申报、延续、升级申报\" 但 blocks 只有 {\"name\":\"资质基础信息与台账\",\"status\":\"built\",\"path\":\"/hr/qualification\",\"pageLabel\":\"企业资质管理\"}。\n台账页(无申报/升级): ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/qualification.vue — 仅 MasterDataPage CRUD,列 certName/certNo/level/holder/authority/expireDate/status,无审批流。\n后端仅证书清单: oa-backend/src/main/java/com/kaidi/oa/domain/Certification.java 与 web/CertificationController.java — 仅 list/get/create + 按 expireDate 派生 有效/即将到期/已过期,无 upgrade/renew/申报 接口(grep upgrade|renew|升级|延续 命中为空)。\nDeclaration 域不同: oa-backend/src/main/java/com/kaidi/oa/domain/Declaration.java javadoc=\"政府项目申报 program=高新技术企业/科技型中小企业/省重点研发计划/专精特新/创新平台\",oaModules.ts 第318行归属 rd 研发创新中心,与企业资质无关。\n其它资质引用均异域: supplier.ts(供应商准入)、src-cost-contract.ts/src-progress-payment.ts(附件字段)、crm/qualperf.vue(投标资质业绩库)。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "3. 资质维护与延续", "verdict": "MISSING", "gap": "年检年报自动任务、到期自动启动延续复用历史、企业变更触发资质变更、动态核查清单导出、升级缺口计算 全无承载。", "severity": "high", "evidence": "全库 grep「年检/年报/延续/变更/动态核查/升级条件」无资质域承载。Certification 实体无年检周期、无延续流程、无变更前后留痕字段。无按资质标准导出人员社保/业绩/设备清单生成核查报告的逻辑,无企业指标与更高等级差距缺口计算。", "survives": true, "reNote": "缺口属实。行政/综合部\"资质维护与延续\"块映射到 /hr/qualification (hr/qualification.vue),它只是一个通用 MasterDataPage CRUD 台账(settingListStore key 'hr-qualification',列=资质名称/编号/等级/持证主体/发证机关/有效期/状态,status 还是手动下拉),同一页被综合部7个资质块复用。描述列举的5项专有功能全部不存在:(1)年检年报自动任务——无;(2)到期自动启动延续复用历史——无,到期只在 CertificationController 读时派生状态、AlertScheduler 只刷新 PersonnelCert 状态并发到期预警,绝不自动开延续流程也不复用历史;(3)企业变更触发资质变更——TriggerRuleEngine 中无任何 CompanySubject/工商/营业执照→资质 联动;(4)动态核查清单导出——无;(5)升级缺口计算——无。对 升级缺口/核查清单/延续复用/企业变更触发/年检年报 的全库精确 grep(前端+后端)零命中。判定 MISSING 成立。", "reEvidence": "承载页 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/qualification.vue 第5行 settingListStore('hr-qualification',...),仅 MasterDataPage 增删改查,status 为手选 select(第28行)。映射来源 data/kaidiDeptView.ts:行政/综合部\"资质维护与延续\" path=/hr/qualification status=built(与其余6个资质块共用同一页)。后端 oa-backend/.../web/CertificationController.java 仅 list/get/create + deriveStatus 读时派生(无延续/历史/清单/缺口)。oa-backend/.../task/AlertScheduler.java refreshCertExpiry() 仅刷 PersonnelCert 状态+到期预警,不启延续流程。oa-backend/.../service/TriggerRuleEngine.java grep CompanySubject/工商/营业执照/企业变更 零命中。全库 grep '升级缺口|核查清单|延续复用|企业变更触发|年检年报' 零命中。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "4. 人员资质管理", "verdict": "PARTIAL", "gap": "仅台账+到期预警;证书使用管理/续期继续教育/借出催办/业绩关联/HR在职联动 全缺,dept 为字符串非 User 关联。", "severity": "high", "evidence": "PersonnelCert(domain/PersonnelCert.java + PersonnelCertController)仅台账CRUD字段 personName/dept/certType/certNo/issuer/issueDate/expireDate/status;预警靠 AlertScheduler 刷状态+AlertController 聚合。全库 grep「证书使用/借出/续期/继续教育/挂靠」仅命中 SupplierController(供应商黑名单,无关)。dept 为手填 String 非关联 User,与 staff.vue 走 oaApi.listUsers 的真实用户库无外键联动。无在建锁定、无续期/继续教育记录、无原件借出登记催办、无个人业绩档案关联。", "survives": true, "reNote": "缺口属实。人员资质管理仅实现台账+到期预警,描述列出的五项(证书使用管理/续期继续教育/借出催办/业绩关联/HR在职联动)全部找不到任何实现,dept 确为字符串非 User 关联。已尽力反证但无法推翻。", "reEvidence": "域模型 PersonnelCert.java 第28行 private String dept; 整个实体只有 personName/dept/certType/certNo/issuer/issueDate/expireDate/status 八个字符串字段,无 @ManyToOne/@JoinColumn/userId 任何 User 外键(grep 验证为空)。PersonnelCertController.java 只有 list/get/create/update/delete 纯 CRUD,无使用/借出/续期/业绩端点。到期预警确实存在:task/AlertScheduler.java 第25-29行扫描证件库刷新有效/即将到期/已过期,CertificationController.deriveStatus 按 expireDate 派生状态——这正是描述承认的\"到期预警\"部分。穷举搜索缺失项全无落点:`ls web/ | grep -iE \"Usage|Borrow|Renew|Continu|Perform\"` 空;domain 目录 grep usage|borrow|renew|continu|perform 空;后端 grep 续期|继续教育|借出|证书使用|业绩|在职联动 仅 TaskController 的工作流\"催办\"命中(与证件无关)。前端 hr/qualification.vue 仅为 MasterDataPage 列表(certName/certNo/level/holder/authority/expireDate/status),由 mock settingListStore 持久化,无任何使用/借出/续期/业绩/HR联动 UI。crm/qualperf 是另一独立\"资质与业绩库\"列表,未与 PersonnelCert 关联。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "5. 业绩管理(资质相关)", "verdict": "LOGIC_GAP", "gap": "表面有列表,业绩证明文件上传/指标提取/查重/证明人 关键逻辑全空。", "severity": "med", "evidence": "crm/qualperf.vue 第6行 settingListStore('crm-qualperf') 纯 localStorage mock,资质与业绩混在一张平铺表(name/type/field/amount/year/usable)。无业绩证明文件(中标通知书/合同/竣工验收/用户评价)上传、无 storedFileId、无按资质标准自动提取关键指标(面积/长度/处理能力)、无业绩查重逻辑、无甲方证明人/联系方式字段。", "survives": true, "reNote": "缺口属实。行政/综合部\"业绩管理(资质相关)\"块在 kaidiDeptView.ts 中映射到 /hr/qualification(pageLabel\"企业资质管理\"),同源块\"资质与业绩库\"映射到 /crm/qualperf。两页都只是 MasterDataPage 的薄壳 CRUD:qualification.vue 字段=certName/certNo/level/holder/authority/expireDate/status;qualperf.vue 字段=name/type/field/amount/year/usable。二者经 settingListStore('hr-qualification'/'crm-qualperf') 走通用 BizRecordController(/api/oa/biz/{type}),后端只是把一条记录当 dataJson(JSON blob) 存进 biz_record 表,纯增删改查。4 项关键逻辑全部缺失:(1)业绩证明文件上传——MdField 类型联合里根本没有 file/upload 类型,两页也未引入任何 file/upload/附件/FileController;(2)指标提取——无任何解析/提取代码;(3)查重——BizRecordController 直接 save,无对既有业绩记录的唯一性/重复校验,全后端的\"查重/existsBy\"命中全在 Voucher/Customer 等无关控制器;(4)证明人——无该字段、无核验流程。后端也无任何 perform/achiev/qualif 专用 domain/controller/service。\"表面有列表、关键逻辑全空\"成立。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/qualification.vue(37行,仅7列CRUD) 与 oa/pages/crm/qualperf.vue(35行,仅6列CRUD); 映射 data/kaidiDeptView.ts 内\"业绩管理(资质相关)\"->\"path\":\"/hr/qualification\"; 字段类型 oa/pages/masterdata/MasterDataPage.vue:26 MdField type 仅 'text'|'textarea'|'number'|'select'|'date'(无file/upload); 存储 oa/api/settingList.ts(settingListStore->http /biz/{key} 纯CRUD)。后端: oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java(create/update 仅 writeData(JSON) 后 repo.save,无查重/提取/上传/证明人) 与 domain/BizRecord.java(只有 bizType+dataJson blob)。负向证据: web/、domain/ 目录无 perform/achiev/qualif 专用类;grep 业绩证明/证明人/指标提取/MultipartFile 在两页及其调用链零命中(MultipartFile 仅 FileController 通用上传,未与资质/业绩记录挂钩)。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "6. 资质使用与投标支持", "verdict": "MISSING", "gap": "投标资质匹配、一键导出打包、真伪验证、电子证照管理 全无承载。", "severity": "med", "evidence": "无承载页。grep「真伪验证/政府接口/电子证照/二维码/一键导出打包」于资质域无命中。无输入招标资质条件自动检索公司是否具备+显示有效期可用人员的逻辑,无证书/人员/业绩一键打包ZIP/PDF,无对接政府平台验真,无电子证照二维码管理。", "survives": true, "reNote": "缺口属实。链6\"资质使用与投标支持\"在 requirements/_req_slices/26_行政__综合部.txt:21 明确为四项能力:投标资质匹配、资质证件一键导出打包(ZIP/PDF)、资质真伪验证(对接政府接口)、电子证照管理(电子文件+二维码验证链接)。逐项核验代码均无承载:\n\n1) 投标资质匹配——BidController(oa-backend/.../web/BidController.java)与 Certification/PersonnelCert 完全无关联,无任何\"输入招标要求→检索公司是否具备+有效期+剩余可用人员\"的匹配逻辑或端点;前端 bidding 模块仅 ledger.vue(投标台账CRUD)+board.vue(中标率看板)两页。\n\n2) 一键导出打包——全后端无 export/ZIP/PDF 打包资质的端点;前端仅有通用联系人CSV导出(OaContactsPage.vue)与通用文件预览下载(FilePreview.vue),皆非资质包导出。\n\n3) 真伪验证——无 verify/真伪/核验 任何端点;活体 /certifications/verify 返回与假路径相同的 id 格式 400。\n\n4) 电子证照管理——Certification/PersonnelCert 实体仅 name/certNo/issuer/日期/status,无电子证照文件、无二维码/验证链接字段,无管理页。\n\n存在的只是相邻数据登记:CertificationController + hr/qualification.vue(企业资质CRUD,settingStore mock) + ehs/cert.vue(三体系认证CRUD) + BidController(投标台账+中标→项目/合同自动链)。这些是证书/投标台账,但四项链6能力(匹配/打包导出/验真/电子证照)无一实现。无法推翻。", "reEvidence": "关键词全域检索零命中(资质匹配/匹配资质/一键导出/导出打包/真伪/验真/电子证照/证照管理/核验)于 oa-backend 与 modern-ui/app/src。活体探测(127.0.0.1:8091):/bids/qualification-match 返回 {\"code\":400,\"message\":\"参数「id」格式不正确\"} 与控制组假路径 /bids/totallyfakepath123 完全一致(只是命中 GET /bids/{id} 的非数字 id);/bid-qualifications 与 /qualifications 均 404(无映射)。BidController.java(全文已读)仅 list/get/create/update/delete + chainWinBid(中标→建项目台账+总包合同草稿),无资质字段/匹配/导出。CertificationController.java 仅 list/get/create + 到期派生状态,无 verify/export。PersonnelCertController.java 仅人员证件 CRUD。oaModules.ts:288-297 bidding 仅 ledger+board 两子项。前端 ledger.vue/board.vue/hr/qualification.vue/ehs/cert.vue 均为 MasterDataPage 纯增删改查,无匹配/打包/验真/二维码逻辑。需求原文见 requirements/_req_slices/26_行政__综合部.txt:21 与 requirements/_analysis/erp-master-dump.txt:254。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "8. 报表与决策分析", "verdict": "PARTIAL", "gap": "资质专项决策报表(全景图/到期日历/证书差距/业绩统计/ROI)全缺,现有看板是档案/HR通用统计。", "severity": "med", "evidence": "archive/board.vue 是档案分布统计(按分类/来源/文件类型),hr/stats.vue 是员工/部门人数概览,均非资质决策口径。无资质全景图(按业务板块图形化)、无未来12个月资质到期日历、无人员证书按类型/专业/等级统计对照资质标准差距、无业绩按年份/规模统计、无申报成本与中标额ROI分析。", "survives": true, "reNote": "缺口属实。行政/综合部域下\"资质专项决策报表\"的五项(全景图/到期日历/证书差距/业绩统计/ROI)在前后端均无实现。现有资质相关页面全是CRUD台账或通用统计:hr/qualification.vue 与 crm/qualperf.vue 都是 MasterDataPage 平铺增删改查表;ehs/cert.vue 同为登记表;ehs/board.vue 是安全隐患看板,仅附一条\"认证到期预警\"列表(列证书+状态标签),不构成到期日历/差距/ROI 决策分析;report/analysis.vue 是流程/会议/用户/部门/文档/公告六项通用计数看板,无资质维度。后端 CertificationController、PersonnelCertController 均为纯 CRUD(读时按 expireDate 派生 有效/即将到期/已过期),无任何聚合或决策报表端点;ReportController/ReportDefinitionController/report/manage.vue 的数据源仅 流程引擎/会议/组织人事/知识文档/信息发布,无资质报表预设。关键词全量检索:全景图仅命中 goal/space.vue(无关),到期日历/ROI/资质决策/证书差距 零有效命中。判定 PARTIAL 准确。", "reEvidence": "五类报表关键词检索结果(在 ofbiz-framework/plugins/modern-ui/app/src 与 oa-backend/src 下):全景图→仅 oa/pages/goal/space.vue(目标管理,无关);到期日历→0;证书差距/gap→仅 CSS与组件类名(tokens.css/modern.css/ErpDonutChart.vue等);ROI/投资回报→0;资质决策/资质全景/资质到期/资质ROI→0。现有页面:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/qualification.vue(MasterDataPage CRUD)、.../crm/qualperf.vue(MasterDataPage CRUD)、.../ehs/cert.vue(MasterDataPage CRUD)、.../ehs/board.vue(安全隐患看板+认证到期清单,非决策报表)、.../report/analysis.vue(流程/会议/用户/部门/文档/公告六项通用看板,无资质维度)。后端 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/CertificationController.java 与 PersonnelCertController.java 均纯CRUD(仅 deriveStatus 按 expireDate 派生状态),无聚合/报表GET端点。grep ReportController.java/ReportDefinitionController.java 资质|证书|qualif|cert → 空。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "10. 员工电子档案(一人一档)", "verdict": "LOGIC_GAP", "gap": "非一人一档;核心档案袋聚合、事件自动归档、证件到期推送、完整性检查 全空。", "severity": "high", "evidence": "hr/staff.vue 详情抽屉(第402-435行)仅两个 tab:基本信息(姓名/登录名/部门/职务/状态)与联系方式(电话/邮箱),数据全来自 OaUser 基础账号字段,无合同/履历/资质证书/培训/绩效/薪酬/奖惩/离职任一档案袋分类聚合。process.vue 的 archiveLink 是手选字符串'已联动'/'待联动'(第5/19行),无真实事件自动归档。无身份证/合同/职称证 90/30天到期推送,无按档案清单的完整性检查与缺失项提醒。", "survives": true, "reNote": "缺口整体属实:模块\"员工电子档案(一人一档)\"映射到 /hr/staff → staff.vue,本质是一张扁平的用户名录,不构成一人一档。四点中 3 点确缺、1 点被夸大但未集成进本模块。【①核心档案袋聚合=空(属实)】staff.vue 详情抽屉(模板 402-442 行)只显示基本信息+联系方式;openStaff()(195-218 行)只调 oaApi.getUser(id),不拉该人的证件/体检/交接/事件。后端 UserController 仅存 id/loginName/displayName/deptId/title/phone/email/enabled,无任何按人聚合子记录的接口;全后端没有一个控制器同时引用 {PersonnelCert,HealthRecord,Handover} 两个以上仓库(grep 交叉引用=0)。更关键:PersonnelCert/HealthRecord/Handover 三个领域对象都用自由文本 personName/handoverPerson 关联(无 userId/工号外键),根本无法可靠地绑定成\"一人一档\"。【②事件自动归档=空(属实)】无任何规则把生命周期事件写入员工个人档案;TriggerRuleEngine 里唯一的\"自动归档\"(363 行)是项目验收级归集项目资料,与员工档案无关。【③证件到期推送=被夸大,但不在本模块内(此分句站不住但不足以推翻整体缺口)】系统确有真实日历驱动的证件到期引擎:AlertScheduler.refreshCertExpiry() 每小时按 expireDate 重算 有效/即将到期/已过期(30 天窗口),AlertController.aggregate() 产出\"证件预警\"并推送给办理人——但这是平台级 PersonnelCert 库预警,没有出现在员工档案页内,且证件未绑定到员工记录。【④完整性检查=空(属实)】HR/员工档案上下文里没有任何 缺件/完整度/完整性检查 逻辑。结论:模块不是真正的一人一档,real=true;唯一需修正复核员的措辞是\"证件到期推送全空\"——平台层存在该能力,只是未集成进一人一档。", "reEvidence": "前端模块映射 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:189 ({ key:'staff', label:'员工档案管理', path:'/hr/staff' });kaidiDeptView.ts 中 {\"name\":\"员工电子档案(一人一档)\",\"status\":\"built\",\"path\":\"/hr/staff\",...}。实现页 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/staff.vue(openStaff 195-218 行仅 getUser,详情模板 402-442 行仅基本信息+联系方式,无证件/体检/交接/事件聚合)。后端 oa-backend/src/main/java/com/kaidi/oa/web/UserController.java(toView 133-144 行字段清单,无子记录聚合接口)。领域无外键:oa-backend/src/main/java/com/kaidi/oa/domain/PersonnelCert.java(26 行 personName,无 userId)、HealthRecord.java(26 行 personName)、Handover.java(24 行 handoverPerson)。证件到期引擎(平台级,非本模块):oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java:144-168 refreshCertExpiry()、oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:104-113 证件预警聚合。唯一\"自动归档\"为项目级:oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:363。grep 全后端无 档案袋/dossier/完整性检查/缺件,无控制器交叉引用两个以上 HR 子库。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "11. 招聘与人才管理", "verdict": "LOGIC_GAP", "gap": "仅招聘台账;AI 简历筛选/面试话术题库/HR参考文档/入职资料生成 全无。", "severity": "med", "evidence": "hr/recruit.vue 第5行 settingListStore('hr-recruit') 纯 mock 招聘台账(岗位/部门/人数/渠道/候选人/状态)。全库 grep 无 openai/gpt/llm/简历筛选/面试话术/题库生成 的任何 AI 集成(FileController 命中为误报,无 AI 逻辑)。需求4项全是 AI 能力,全部缺失。", "survives": true, "reNote": "尽力推翻但无法成立,缺口属实。招聘与人才管理仅有一个台账页 recruit.vue,是 MasterDataPage + settingListStore('hr-recruit') 的通用键值 CRUD(6列:岗位/部门/人数/渠道/候选人/状态),无任何 AI/智能/生成逻辑。HR 模块 11 个页面(org/staff/health/handover/stats/worktime/fields/qualification/recruit/econtract/process)无一涉及简历筛选、面试话术题库、HR参考文档或入职资料生成。后端无招聘/人才/简历/面试/入职相关控制器(仅 HealthRecordController 因含'hr'子串误命中);全后端 grep AI/智能/生成式/大模型/prompt/openai 仅命中无关项('供水智能调度'项目、WorkOrder'自动生成成品库存');招聘/面试/入职字样仅出现在种子数据文本(WorkPlan 描述、Feed 帖子)。'新员工入职指引'仅是 knowledge/mock.ts 里的一个示例文档标题,非生成器。router/ 与 components/erp/ 均无招聘/人才专属路由或组件。四项子能力全无,缺口成立。", "reEvidence": "recruit.vue: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/recruit.vue (第5行 settingListStore('hr-recruit',...) + MasterDataPage,纯CRUD台账)。settingListStore 为通用键值CRUD: ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts。HR模块定义: src/data/oaModules.ts 第183-198行(11页无AI项)。后端无招聘控制器: oa-backend/.../web/ 下仅 HealthRecordController 子串命中。grep '简历筛选|智能筛选|话术|题库|入职资料|入职生成' 全 src 返回 0 结果;后端 AI/智能/生成式/openai 仅命中'供水智能调度'/'自动生成成品库存'等无关项。'新员工入职指引' 唯一出现在 src/oa/pages/knowledge/mock.ts:122 作为示例标题。router/、components/erp/ 无招聘/人才专属路由或组件。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "12. 人事流程与档案联动", "verdict": "LOGIC_GAP", "gap": "档案联动是手工字符串标记,入职建档/转正调岗归档/离职封存/合同续签 自动逻辑全空。", "severity": "high", "evidence": "hr/process.vue 第5行 settingListStore('hr-process') mock;archiveLink 是 createFields 里的 select['已联动','待联动'](第19行)手工标记,无任何归档动作。入职不自动建档归档 offer/登记表/证件/合同,转正/调岗/晋升不自动归档对应表单,离职不封存档案改权限,劳动合同到期不提醒续签关联新旧合同。无 WorkflowService/TriggerRuleEngine 对人事档案的联动规则。", "survives": true, "reNote": "缺口属实。人事流程的\"档案联动\"确实只是手工字符串标记,入职建档/转正调岗归档/离职封存/合同续签的自动联动逻辑全部缺失。\n\n证据链:\n1. 前端页 process.vue(src/oa/pages/hr/process.vue)用 MasterDataPage 把\"档案联动\"做成普通下拉字段:createFields 里 archiveLink 的 type='select'、options=['已联动','待联动'],由人工选择填写,纯字符串标记,没有任何自动逻辑触发。流程类型(procType)同样是 select ['入职','转正','调岗','离职'],纯录入。\n\n2. 该页走 settingListStore('hr-process'),底层是通用 /api/oa/biz/{type} REST(BizRecordController),后端就是按 type 区分的 biz_record 表行级 CRUD(list/create/update/delete 四个 Mapping),没有任何针对 hr-process 的特殊逻辑、没有触发任何联动、没有调用 TriggerRuleEngine。\n\n3. 后端唯一的\"办结后自动联动\"引擎 TriggerRuleEngine.fire() 的关键词矩阵只匹配 付款/报销/用印/收款/验收/供应商/合同/立项,完全没有 入职/转正/离职/调岗/续签/建档/封存/人事 任何关键词(grep 在该类只命中\"项目→档案\"链 chainArchiveProject 的注释,与人事无关)。\n\n4. 全仓自动建档(new Archive / archiveRepo.save)只出现在三处:DataSeeder(播种)、ArchiveController(纯手工 @PostMapping CRUD)、TriggerRuleEngine.chainArchiveProject(仅\"项目验收→项目档案\"链)。没有任何一处由 User 创建(入职)、Handover(离职/调动交接)、ContractChange(续签)、Seal(封存) 触发自动建档/归档/封存。\n\n5. 相关实体彼此孤立:UserController 建用户(建档)不写 Archive;HandoverController(离职/调动/轮岗交接)只是状态机 CRUD(进行中→已完成→已确认),不联动档案;ContractChange(含\"续签\"类型)、Seal(含\"封存\"状态)同样无自动联动到人事档案。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/process.vue (archiveLink/procType 均为手工 select 字段);ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts (通用 /biz/{type} CRUD)。后端: oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java (纯泛型 type CRUD,无 HR 逻辑);oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java 第109-128行关键词矩阵无任何人事关键词,自动建档仅 chainArchiveProject(第346-369行 项目→档案);oa-backend/src/main/java/com/kaidi/oa/web/UserController.java / HandoverController.java / ContractChangeController.java / SealController.java 均无 Archive 联动调用。grep 'new Archive()|archiveRepo.save' 仅命中 DataSeeder/ArchiveController(手工CRUD)/TriggerRuleEngine(仅项目链)。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "13. 档案利用与HR业务支持", "verdict": "MISSING", "gap": "员工档案多条件检索、人事档案借阅审批临时权限、证明材料自助生成签章、按条件批量导出 全缺;档案中心借阅是综合档案不覆盖。", "severity": "med", "evidence": "archive/search.vue、globalsearch.vue 是档案/公告/合同全文检索(FTS5),非员工档案按姓名/工号/身份证/学历/证书类型多条件组合检索。archive-borrow 模板(src-archive-borrow.ts)是「归档资料查询申请表」,表单字段为项目名称/申请查看资料/用途,属企业综合档案借阅,确非员工人事档案,与需求注意事项一致。无在职/收入/离职证明模板自动提取生成+审批+电子签章自助下载,无按条件批量导出员工档案(如某年度职称证书清单)。", "survives": true, "reNote": "缺口属实,四项子能力全部缺失,无法推翻。逐项核查:(1) 员工档案多条件检索——后端 UserController.list() 是无参 findAll(),零查询条件;前端 hr/staff.vue 只是客户端单关键字+部门下拉+在职/停用页签的本地过滤,不是按部门/岗位/状态/入职日期等多条件的档案检索;archive/search.vue 是跨档案单关键字全文搜,与员工档案无关。(2) 人事档案借阅审批临时权限——后端无任何 borrow/permission/grant/temp-permission 控制器;唯一的\"借阅\"是 archive/security.vue,一个按 archive-security setting 键的通用 CRUD 配置表(档案类别/密级/授权对象/借阅审批是否标志),正是缺口自述的\"综合档案不覆盖人事\";src-archive-borrow.ts 仅是\"归档资料查询申请表\"静态表单模板,并非授予限时临时权限的人事档案借阅流。(3) 证明材料自助生成签章——PersonnelCertController/CertificationController 仅做证件/资质记录的纯 CRUD 与到期跟踪,无文档生成、无 PDF、无盖章;SealController/SealUseController 是通用用印审批,没有\"自助生成证明并自动签章\"的管线。(4) 按条件批量导出——任何 HR/personnel/user 控制器都无导出端点;后端唯一 csv 是 FileController 里上传文件的 MIME 类型判断;前端 hr 页面无任何导出逻辑。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/UserController.java:42-47 (list 为无参 findAll,无多条件查询); PersonnelCertController.java:37-49 (仅 certType/status 单字段 CRUD,无证明生成/签章/导出); CertificationController.java (资质到期跟踪 CRUD); FileController.java:192 (csv 仅为文件下载 MIME 判断,非 HR 导出)。无 borrow/permission/grant/proof/certificate 命名的控制器(ls web/ grep 为空)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/staff.vue:151-168 (纯客户端单关键字+部门+页签过滤); oa/pages/hr/process.vue (人事流程与档案联动仅 settingListStore mock CRUD,无借阅/临时权限); oa/pages/archive/security.vue:1-30 (借阅审批是综合档案权限配置表,不覆盖人事); oa/pages/archive/search.vue:14-24 (跨档案单关键字全文检索)。grep '证明材料|自助生成|临时权限|批量导出|借阅审批' 在 hr 页面目录下结果为空。oa/engine/templates/src/src-archive-borrow.ts 仅为归档资料查询申请静态表单模板。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "14. 档案全生命周期管理", "verdict": "PARTIAL", "gap": "归档审核流程、自定义元数据、实体档案管理、保存期限与销毁 全缺,生命周期后半段缺失。", "severity": "high", "evidence": "archive/library.vue 分类由数据动态聚合(cats computed),但归档无审核流程(确认上传即 createArchive 落库,无档案室审格式/完整性/保密等级通过)、无自动生成归档编号/存放位置。Archive 实体(api/archives.ts 接口)无按类型自定义元数据(如合同档案的合同编号/金额/对方单位)。无实体档案管理(库房/密集架/盒号/条码/RFID/温湿度)。无保存期限(永久/30年/10年)设置与到期鉴定-审批-销毁及销毁记录。", "survives": true, "reNote": "缺口属实。档案模块只实现了生命周期前半段(上传归档/分类/在线预览+水印/批注评论/按密级访问控制),后半段四项全缺:①归档审核流程——Archive 域无 reviewStatus/审核态字段,ArchiveController 只有 list/get/create,前端 library.vue 的 confirmUpload 直接 createArchive 落库为终态,无任何审批/审核环节(不接 WorkflowService);②自定义元数据——元数据是固定模式 title/category/tags/accessLevel,无用户可定义的元数据 schema/扩展字段;③实体档案管理——无库位/盒号/借阅/归还/状态等实体档案登记字段或控制器(archive-borrow 模板只是一张通用审批表单,security.vue 只是密级/借阅审批的权限配置清单);④保存期限与销毁——无 retentionPeriod/destroyDate/disposal 任何字段或端点。活体验证:archives/1/audit、archives/1/destroy、archive-retention、archive-loan、archives/1/approve 全部 404;样例记录无任何生命周期字段。后端 domain/web 下也不存在 retention/destroy/physical/loan/disposal 相关实体或控制器。", "reEvidence": "后端域 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java 字段仅 category/title/sourceType/sourceId/fileName/fileType/fileSize/uploader/archiveDate/tags/summary/accessLevel/fileUrl/storedFileId/createdAt,无审核态/保存期限/销毁/实体档案/自定义元数据字段。控制器 /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java 仅暴露 list/get/create,create() 直接 archiveRepo.save 落终态、不接 WorkflowService。前端 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue confirmUpload() 直接调 createArchive 无审核步骤、上传表单字段固定。/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/security.vue 是 settingListStore('archive-security') 权限配置清单(密级/借阅审批/生效-停用),非生命周期。/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-archive-borrow.ts 仅为通用审批 FormTemplate。活体探测(127.0.0.1:8091):archives/1/audit=404, archives/1/destroy=404, archive-retention=404, archive-loan=404, archives/1/approve=404;GET /api/oa/archives 样例记录无任何生命周期字段。全后端 domain/web 下 grep retentionPeriod/destroyDate/storageLocation/borrower/borrowStatus/disposalDate 等无任何命中(reviewStatus 仅 DesignDoc.java,属设计研究中心,与档案无关)。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "15. 档案利用(借阅与下载)", "verdict": "PARTIAL", "gap": "密级动态审批链/记录级临时授权、动态水印(时间IP)/防截图、纸质扫码出入库催还、借阅热度统计 全缺。", "severity": "med", "evidence": "archive-borrow 是固定流程表单模板(法务→结算会计→吴一梅→董事长固定链),未按档案密级动态选审批链,未与具体档案记录绑定授临时下载/预览权限。library.vue watermark(第110行)是静态文案'湖南凯迪…受控文件…uploader',不含时间/IP,无禁截图/打印控制。无纸质档案扫码出库/归还/逾期催还/损坏登记。无借阅次数/热门档案/部门活跃度热度统计。", "survives": true, "reNote": "缺口属实。模块15「档案利用(借阅与下载)」的四个子点全部未实现,无法推翻。后端 Archive 仅有 list/get/create(域 Archive.java 只有 category/title/accessLevel/fileUrl/storedFileId 等元数据字段),鉴权仅 accessLevel.contains(\"密\")→ADMIN/APPROVER 静态角色门槛,无任何 borrow/loan/checkout/grant 控制器、仓储或实体。逐点核对:(1)密级动态审批链/记录级临时授权——无;security.vue 只是 MasterDataPage+settingList 键值表的普通 CRUD,「借阅审批」只是一个文字列(免审/需审批)非真流程;src-archive-borrow.ts 仅是一张静态借阅申请表模板,未与档案记录绑定按密级路由审批。(2)动态水印(时间IP)/防截图——水印存在但为静态字符串(library.vue 传 `湖南凯迪工程科技 · 受控文件 · {uploader}`,FilePreview.vue 用 CSS ::after 渲染),不含时间戳与 IP,且无防截图。(3)纸质扫码出入库催还——全树零命中(scan/qrcode/出入库/催还/归还提醒)。(4)借阅热度统计——board.vue 仅按 category/source/fileType 做 groupCount(归档分布),Archive 实体无阅读量/借阅次数字段,无热度/排行。PARTIAL 判定准确:在线预览/水印框架/分类检索已建,但这四个利用层特性确缺。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java (仅 list/get/create + isConfidential 静态密级门槛); oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java (无 borrow/readCount/grant 字段)。前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue:110 watermark=`湖南凯迪工程科技 · 受控文件 · ${uploader}` (无时间/IP); src/components/FilePreview.vue:228-344 (CSS ::after 静态水印, 无防截图); src/oa/pages/archive/security.vue (MasterDataPage+settingList 纯 CRUD, \"借阅审批\"为文字列非流程); src/oa/pages/archive/board.vue:29-39 (groupCount 仅 category/sourceType/fileType, 无借阅热度); src/oa/engine/templates/src/src-archive-borrow.ts (静态借阅申请表模板, 未绑定档案记录)。全树 grep borrow|loan|checkout|催还|出入库|临时授权|记录级|热度|扫码|qrcode|防截图 在 oa-backend/src + modern-ui/app/src 零命中。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "16. 档案安全与权限", "verdict": "PARTIAL", "gap": "五级密级与差异化权限、操作日志(IP/留存6月)、动态水印+哈希存证、敏感信息脱敏 仅密级访问控制一项较实。", "severity": "high", "evidence": "archive/security.vue 第5行 settingListStore('archive-security') mock,密级 createFields options 为['公开','内部','秘密','机密'](第17行)缺绝密,且按类别整批授权非按岗位差异化查阅/下载/打印。library.vue accessLevel 实际仅公开/内部/机密三档。无访问/下载/修改/借阅/销毁操作日志(操作人/时间/IP,≥6月)。水印静态(第110行)、无防篡改哈希存证。无身份证号/银行账号敏感信息自动脱敏展示。", "survives": true, "reNote": "缺口属实,PARTIAL 判定成立。我尽力推翻但无法成立:四项要素只有「密级访问控制」一项真实落地,其余三项缺失或仅装饰。逐项核验:(1) 五级密级——不成立。ArchiveController.isConfidential 只用 lvl.contains(\"密\") 二分(受限/不受限),活体 24 条档案 accessLevel 仅 公开/内部/机密 三档;前端 security.vue 密级下拉仅 公开/内部/秘密/机密 四档,无「绝密」,凑不齐五级。差异化权限仅 ADMIN/APPROVER 可见机密这一刀切,无按密级×角色矩阵。(2) 操作日志(IP/留存6月)——完全缺失。后端无任何档案访问/借阅日志实体;全后端搜不到 getRemoteAddr/X-Forwarded/ipAddress,AutomationLog 无 IP 字段也无留存策略;security.vue 的「借阅审批」只是 settingList 键值持久化的配置行,非真实日志。(3) 动态水印+哈希存证——水印仅 CSS ::after 叠加(content: var(--wm),library.vue 第424-425行 / FilePreview.vue 第228行),纯视觉、不进文件、不防篡改;哈希存证彻底缺失,全后端无 MessageDigest/DigestUtils/sha256 用于档案,EvidenceController 是研发立项-费用-IP-申报的链路聚合,与档案存证无关。(4) 敏感信息脱敏——档案模块无任何字段级脱敏;唯一的 maskPhone 在 UserController(用户 PII),与 archive 无关。结论:除访问控制外,操作日志、哈希存证、档案脱敏均未实现,水印仅装饰,五级密级凑不齐。", "reEvidence": "后端: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ArchiveController.java (isConfidential 仅 contains(\"密\") 二分, 第47-50行; list/get 仅 ADMIN/APPROVER 看机密, 第78-95行); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain/Archive.java (accessLevel 单字段 公开/内部/机密, 第17/50行, 无密级枚举/IP/hash字段); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java (研发链路聚合, 与档案存证无关); 全后端 grep 无 getRemoteAddr/sha256/MessageDigest/DigestUtils/留存6月/borrowLog/AccessLog; 唯一脱敏 maskPhone 在 UserController.java 第147行(用户PII非档案). 前端: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/security.vue (密级下拉仅4档无绝密, 第17行; 借阅审批为 settingList 配置非日志, 第5行); /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/archive/library.vue (水印=watermark computed 第110行 + CSS ::after 纯视觉 第421-425行, 无hash); /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/components/FilePreview.vue (watermark 仅 CSS 叠加 第228行); /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/archives.ts (accessLevel 注释明确 公开/内部/机密三档, 第20行). 活体 127.0.0.1:8091 GET /api/oa/archives: 24条, accessLevel 集合={公开,内部,机密}, 无IP/hash/密级枚举字段." }, { "area": "行政 / 综合部/行政 / 综合部", "module": "17. 电子劳动合同", "verdict": "LOGIC_GAP", "gap": "仅合同台账;模板管理、第三方电子签章在线签署、签署后归档、批量发起 在线签署核心逻辑全缺。", "severity": "med", "evidence": "hr/econtract.vue 第5行 settingListStore('hr-econtract') 纯 mock 合同台账(姓名/部门/类型/期限/签署状态/签署日期)。无合同模板管理(劳务/实习/法务审核条款)、无第三方电子签章平台(法大大/上上签)集成与手机端实名认证签署、无签署后自动归档至个人档案、无新员工批量发起签署。", "survives": true, "reNote": "缺口属实。电子劳动合同(HR管理/电子劳动合同, oaModules.ts:197 注册为 kind:'list' → /hr/econtract)仅是一个台账。页面 hr/econtract.vue 整体基于通用 MasterDataPage + settingListStore('hr-econtract',...)(纯键值 mock 持久化)做增删改查,字段只有 员工姓名/部门/合同类型/合同期限/签署状态/签署日期。其中\"签署状态(待签署/已签署)\"\"签署日期\"都是用户手填的普通 CRUD 字段,没有任何签署动作。全库 grep(esign/签章/在线签署/法大大/e签宝/批量发起/归档 等)在劳动合同链路上零命中:唯一与\"签章\"相关的业务逻辑是 TriggerRuleEngine.java 把\"用印/盖章/签章\"作为关键词路由到用章中心审批流(物理用印审批,非第三方电子签);ContractTemplateController 虽存在但注释明确写\"统一合同中心(业务链3)\"、合同类型为经营/采购/成本/销售/法务合同(商务合同,非劳动合同),且只存 bodyTemplate 文本,无电子签,econtract 页面也从不引用它。因此:模板管理(绑定劳动合同)、第三方电子签章在线签署、签署后归档、批量发起——四项在线签署核心逻辑全部缺失,仅有合同台账CRUD。", "reEvidence": "ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/econtract.vue(整页=MasterDataPage+settingListStore('hr-econtract'),字段仅name/dept/type/term/status/signDate,status与signDate为手填CRUD字段,无签署/模板/归档/批量逻辑); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:197(econtract 注册为 kind:'list' → /hr/econtract,纯列表); oa-backend/src/main/java/com/kaidi/oa/web/ContractTemplateController.java(注释自述为\"统一合同中心 business chain 3\",合同类型经营/采购/成本/销售/法务,只存bodyTemplate文本,无电子签,与劳动合同无关且econtract不引用); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java(唯一\"签章\"命中是用印/盖章关键词路由到用章中心审批,非第三方电子签); 全库 grep esign/在线签署/法大大/e签宝/批量发起 在劳动合同链路零命中。" }, { "area": "行政 / 综合部/行政 / 综合部", "module": "18. 员工自助服务", "verdict": "MISSING", "gap": "整模块无自助侧承载:我的档案自查纠错、个人信息自助更新、证书自助上传 全缺。", "severity": "med", "evidence": "全库 grep「自助/我的档案/纠错」于 oa/pages 无员工自助承载页(命中均为 archive-security 与 appdev/appmgr,无关)。无'我的档案'员工自查与纠错申请、无个人信息(联系方式/紧急联系人/学历)自助更新+HR审核入库、无员工自行上传职称/技能证书+HR审核归档。staff.vue 为 HR 管理侧,非员工自助侧。", "survives": true, "reNote": "缺口属实。全栈彻查后未找到任何\"员工自助侧\"承载:(1) 我的档案自查纠错——无;唯一档案页 hr/staff.vue 是无条件管理员视角的\"员工档案管理\",按 id 增删改查所有员工,无\"仅本人/isSelf/own profile\"自查纠错逻辑(grep 该类关键词在 hr 页面为空)。(2) 个人信息自助更新——无;后端 UserController 只有 @PatchMapping(\"/{id}\") 这种按 id 的通用管理员更新,无 /me 或当前用户自更新端点,且该写接口在 AuthInterceptor 里走 ADMIN 角色门槛,前端也无自助更新 UI。(3) 证书自助上传——无;PersonnelCertController(人员证件库)/CertificationController 存在但是管理员/EHS 侧台账:PersonnelCert 前端唯一消费者是 mobile/workbench.vue 仅读取临期/过期证件告警(只读聚合),ehs/cert.vue 是 EHS 企业资质台账,均无\"员工上传自己证书\"流程;hr/fields.vue 里的\"学历证书 upload\"只是信息项配置(visible:false),非真实上传页。oaModules.ts 无\"员工自助服务\"模块、无自助路由、无导航入口;\"个人门户\"OaPortalPage.vue(948行)是仪表盘,零 profile/证书/自助/纠错内容。推翻尝试失败。", "reEvidence": "前端:ofbiz-framework/plugins/modern-ui/app/src/oa/pages/hr/staff.vue(纯管理员档案 CRUD,无自助/属主限制);oaModules.ts:183-198(hr 模块清单无自助项);oa/portal/OaPortalPage.vue(仪表盘,grep 档案/证书/自助/纠错 全空);oa/pages/mobile/workbench.vue:42,72-97(仅读 listPersonnelCerts 做临期告警);oa/pages/ehs/cert.vue(EHS 企业资质台账);oa/pages/hr/qualification.vue(企业资质,非个人);router/index.ts:58(myportal→OaPortalPage)。后端:oa-backend/src/main/java/com/kaidi/oa/web/UserController.java:105-106(@PatchMapping(\"/{id}\") 按 id 管理员更新,无 /me/自助端点);PersonnelCertController.java(@RequestMapping(\"/api/oa/personnel-certs\") 管理员侧证件库)。grep 全仓 自助|self-service|我的档案|档案自查|证书自助上传 在真实页面无任何命中。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "1. IT资产管理(硬件/软件/设施)", "verdict": "PARTIAL", "gap": "缺软件授权台账(版本/授权类型/数量/激活码/有效期/安装设备)及到期自动预警;缺资产生命周期状态机;缺折旧自动计算;缺条码/二维码与扫码盘点;缺 IT采购申请-审批-订单-入库及预算/供应商关联。维持 PARTIAL。", "severity": "high", "evidence": "ItAsset.java(domain) 字段仅 assetNo/name/category/spec/holder/dept/purchaseDate/status/location,无任何软件授权字段(版本/授权类型/授权数量/激活码/有效期/安装设备)、无 depreciation 折旧字段、无条码/二维码字段。前端 itasset/assets.vue 直连此扁平实体,IT_ASSET_CATEGORIES 虽含'软件'但软件类与硬件共用同一表无专属授权字段。ItAssetController.java 仅 CRUD,status 为可手改的下拉枚举(在用/闲置/维修/报废)无生命周期状态机/流转校验。AlertController.aggregate() 的 8 个预警源(PersonnelCert/Patent/ContractMilestone/InventoryItem/LabInstrument/SafetyCheck/FormInstance/Budget)无 ItAsset 源,AlertScheduler.pushAlerts() 只刷新证件到期与审批超时,均无软件授权到期预警。domain 目录无 license/software/depreciation 实体。无 IT采购申请-审批-订单-入库链(TriggerRuleEngine 规则键无 it-purchase)。", "survives": true, "reNote": "缺口属实,PARTIAL 判定成立。IT资产为纯通用CRUD台账,描述列出的6项增强能力均未实现:(1)无软件授权台账——ItAsset实体仅11个通用字段(assetNo/name/category/spec/holder/dept/purchaseDate/status/location/createdAt/id),无version/授权类型/数量/激活码/有效期/安装设备字段;\"软件\"类资产(IT-008用友U8+、IT-009 Office365授权)只是category=\"软件\"的普通行。(2)无到期自动预警——AlertController.aggregate()的告警源为PersonnelCert/Patent/ContractMilestone/InventoryItem/LabInstrument/SafetyCheck,ItAsset完全未接入告警引擎(line169的assetNo属于LabInstrument仪器校准)。(3)无生命周期状态机——status为自由字符串,无转移约束(对比Project/PolicyApplication确有状态机)。(4)无折旧自动计算——全后端无任何资产折旧代码。(5)无条码/二维码与扫码盘点——barcode/qrcode/二维码/条码/扫码/盘点零匹配。(6)无IT采购申请-审批-订单-入库及预算/供应商关联——ItAsset从未出现在WorkflowService/TriggerRuleEngine/Automation中;itasset/budget.vue是孤立的settingList键值存储,与资产/供应商无关联。前端assets.vue与后端字段一一对应,同样无任何授权/折旧/扫码/采购UI。多角度证伪均未找到实现。", "reEvidence": "后端实体 oa-backend/src/main/java/com/kaidi/oa/domain/ItAsset.java(仅11通用字段,无授权/有效期/折旧字段);控制器 oa-backend/src/main/java/com/kaidi/oa/web/ItAssetController.java(纯list/get/create/update/delete CRUD,无状态机/折旧/预警逻辑);仓储 oa-backend/src/main/java/com/kaidi/oa/repository/ItAssetRepository.java(仅findByCategory);告警引擎 oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java:98-180(aggregate告警源不含ItAsset);种子 oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:3115-3158(itAsset()辅助方法仅填通用字段);前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/assets.vue(9通用列,无license/扫码/采购)、budget.vue(孤立settingList,无资产/供应商关联)。全后端grep:depreciat/折旧(非种子)=0、barcode/qrcode/二维码/条码/扫码/盘点=0、licenseKey/activationCode/激活码/授权类型/安装设备=0;service/目录grep ItAsset/itasset=0(未接入审批/联动引擎)。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "2. 系统运维与监控", "verdict": "LOGIC_GAP", "gap": "表面有监控表实为静态手录数据。缺实时采集、阈值自动告警(短信/邮件)、日志集中、备份/恢复、巡检报告、容灾切换。维持 LOGIC_GAP。", "severity": "high", "evidence": "前端 itasset/monitor.vue 使用 settingListStore('itasset-monitor', ...) —— 即键值表持久化的手录列表,value/threshold/status 全是人工填写的字符串('42%'/'80%'/'正常'),无任何探针/agent/定时拉取。AppMonitoringController.java(/api/oa/appdev/monitoring) 是 CAP 表单实例的业务看板聚合,与服务器/CPU/内存监控无关。AlertScheduler.java 仅 @Scheduled 刷新证件到期+审批超时,无 CPU/内存/磁盘采集、无阈值触发告警、无日志集中收集/检索/保留期、无备份策略与成功失败记录、无恢复演练、无巡检报告、无高可用容灾切换记录。NotificationService 仅站内消息无短信/邮件。", "survives": true, "reNote": "缺口属实,无法推翻。信息中心\"系统运维监控\"完全是静态手录主数据,缺实时采集/阈值自动告警(短信/邮件)/集中日志/备份恢复/巡检报告/容灾切换。核查要点:(1) 监控页 itasset/monitor.vue 只是 MasterDataPage 套 settingListStore('itasset-monitor', [...]) 的薄包装,seed 里 CPU使用率\"42%\"、连接数\"186\"、阈值\"80%/200\"、状态\"正常/告警\"全是硬编码字符串,只能靠手工新建/编辑表单录入;\"告警\"状态是手打的,从未被程序拿\"当前值 vs 阈值\"算出来。(2) 全后端只有一个 @Scheduled——AlertScheduler,它只扫人事证件到期(refreshCertExpiry)和审批节点超时(scanOvertimeInstances),根本不采集任何系统指标(CPU/内存/磁盘/连接数),也不碰 IT 监控数据。(3) \"告警\"投递唯一通道 NotificationService.notify() 仅向 Message 表写一行站内消息,无 JavaMailSender/MailSender/sendMail、无短信网关、无 webhook(grep 全空),即无短信/邮件外发。(4) threshold/阈值比较逻辑只出现在 WorkflowService(审批条件分支) 和 CountersignVote(会签投票),与监控指标无关。(5) backup/restore/failover/容灾/备份 在后端零实现(唯一命中是 DataSeeder 误报),无任何备份/恢复/容灾切换端点。(6) itservice.vue(IT服务与安全) 同样是 settingListStore 静态工单数据,\"季度网络安全巡检\"只是一条手录工单文本,无真实巡检报告生成。维持 LOGIC_GAP。", "reEvidence": "前端:/Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/monitor.vue 第5行 settingListStore('itasset-monitor',[{system:'OA应用服务器',metric:'CPU使用率',value:'42%',threshold:'80%',status:'正常',owner:'信息部'},{system:'数据库主库',metric:'连接数',value:'186',threshold:'200',status:'告警',owner:'信息部'}]) 全为硬编码手录;同目录 itservice.vue 同模式。后端调度:/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java(唯一@Scheduled,只做证件到期+审批超时,不采集系统指标)。告警投递:/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/NotificationService.java(notify 仅 messageRepo.save 写站内 Message,无邮件/短信)。聚合:/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java(业务期限预警聚合,不含 IT 运维指标)。资产 CRUD:/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ItAssetController.java(纯增删改查,无监控/采集)。grep 全库证伪:JavaMailSender/MailSender/sendMail/sms网关/webhook=0 命中;backup/restore/failover/容灾 在后端仅 DataSeeder 误报,无实现;threshold 比较仅在 WorkflowService/CountersignVote,与监控指标无关。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "3. IT服务与用户支持", "verdict": "LOGIC_GAP", "gap": "只是手填工单清单。缺自动分配、SLA与超时升级、知识库、远程协助、截图上传。维持 LOGIC_GAP。", "severity": "high", "evidence": "前端 itasset/itservice.vue 是 settingListStore 手填工单列表(MasterDataPage 通用 CRUD),字段 ticketNo/type/applicant/desc/priority/status/handler 全人工录入,无自动分配逻辑。后端 WorkOrderController.java 经核实是制造管理中心『生产工单』(productName=生物质有机肥/复合微生物肥等),与 IT 服务工单无关,非本模块实现。无 SLA 实体(domain 无 sla/ticket)、无响应/解决时限计时器、无超时升级调度(AlertScheduler 只管审批超时)。无知识库实体/页面、无自助搜索、无引用回复。无远程协助集成、无拍照截图上传绑定。", "survives": true, "reNote": "缺口属实。信息中心(itasset)的\"IT服务与用户支持\"链就是一张纯手填工单清单,五项能力(自动分配/SLA与超时升级/知识库/远程协助/截图上传)全部缺失,无法推翻。\n\n证据链:\n1. 前端 IT服务页 oa/pages/itasset/itservice.vue 直接套用通用 MasterDataPage,数据走 settingListStore('itasset-itservice', seed)。字段仅 ticketNo/type/applicant/desc/priority/status/handler,全部是 text/select/textarea 手填项——其中 handler(处理人)是人工填的纯文本,priority/status 是手选下拉,没有任何自动派单或时限计算。\n\n2. settingListStore(oa/api/settingList.ts) 把每条工单作为一行落到后端通用 biz_record 表(REST /api/oa/biz/itasset-itservice),与审批引擎 FormInstance 完全脱钩。因此:\n - service/WorkflowService.java 的 NodeAssigneeResolver(按节点解析办理人) 根本不会作用到工单 → 无自动分配。\n - task/AlertScheduler.java 的\"超时滞留/升级\"扫描只针对 FormInstance 节点(currentNode 滞留 N 天才告警),IT 工单不是 FormInstance → 无 SLA、无超时升级。后端全库 grep \"SLA/sla/escalat/自动分配/响应时限/解决时限\" 在 IT 工单链路上零命中。\n\n3. MasterDataPage.vue 表单控件只有 text/textarea/number/select/date 五种,无 el-upload;itasset 目录下 grep \"el-upload/upload/截图/附件\" 零命中 → 无截图/附件上传。\n\n4. 全前后端 grep \"远程协助/remote\" 与工单无任何关联 → 无远程协助。\n\n5. 知识库不成立:知识社区(knowledge 模块)是独立的文档/博客/RSS 社区门户(知识门户/我的收藏/文档中心/知识地图/我的博客/RSS订阅/文档库管理),与 IT 工单流程无任何绑定,不是 IT 支持知识库。\n\n6. 后端 BizRecordController 对 type=itasset-itservice 无任何专属逻辑(无 assign/SLA/超时/升级 分支),\"itservice\"/\"itasset-itservice\" 字符串在整个后端零出现 → 后端把它当不透明的通用台账行存储,无任何 IT 服务引擎。\n\n注意:后端虽有 WorkOrderController/WorkOrder.java,但那是制造管理中心的\"生产工单\"(productName=生物质有机肥等、status=待生产/生产中/已入库),与 IT 服务工单完全无关,不能用来抵这条缺口。维持 LOGIC_GAP。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/itservice.vue (L5-29 settingListStore + 仅 text/select 手填字段,无 handler 自动赋值); oa/api/settingList.ts (L18-48 走 /biz/{key} 通用 biz_record 存储,与审批引擎脱钩); oa/pages/masterdata/MasterDataPage.vue (L22-29,240-254 表单控件无 el-upload); data/oaModules.ts (L453-461 itasset 四子页全为 list/无工单引擎; L143-154 knowledge 为独立社区门户). 后端: oa-backend/src/main/java/com/kaidi/oa/web/ItAssetController.java + domain/ItAsset.java (纯资产台账,无工单/SLA字段); web/WorkOrderController.java + domain/WorkOrder.java (是制造生产工单,非IT工单); service/WorkflowService.java(NodeAssigneeResolver 仅作用于 FormInstance); task/AlertScheduler.java(L40,78,112 超时扫描仅针对 FormInstance 节点); web/BizRecordController.java(对 itasset-itservice 无任何专属 assign/SLA 逻辑). 全后端 grep \"itservice\"/\"itasset-itservice\" 零命中。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "4. 网络与信息安全", "verdict": "MISSING", "gap": "整模块缺失:网络拓扑、安全设备、漏洞补丁、安全事件应急、数据安全DLP、安全培训。维持 MISSING。", "severity": "high", "evidence": "domain 目录 grep license/topolog/firewall/vulnerab/patch/incident/dlp 全无命中(仅 Account/BankAccount 为财务科目,无关)。前端 itasset 仅 4 页(assets/itservice/monitor/budget),itservice.vue 里把'安全检查'仅作为工单 type 选项(一条季度巡检的手录工单),无网络拓扑图(VLAN/IP/防火墙/VPN)、无配置备份、无安全设备配置与日志、无漏洞扫描/等级/修复状态、无补丁统一管理、无安全事件记录与应急响应、无敏感数据加密/脱敏/DLP/导出审批、无安全培训(钓鱼演练/考试)记录。权限/账号离职禁用见模块6亦缺。", "survives": true, "reNote": "缺口属实。彻查前后端均未找到\"网络与信息安全\"模块的任一子能力实现:无网络拓扑、无漏洞/补丁管理、无安全事件应急响应流程、无数据安全DLP、无安全培训。信息中心(itasset)前端仅有4页:assets台账/budget预算/itservice工单/monitor运维监控;后端ItAssetController只是IT资产清单CRUD(category=服务器/网络设备/终端/软件/办公设备),~90个控制器中无任何安全管理专用控制器。oaModules.ts对所有安全关键词(拓扑/漏洞/补丁/安全事件/DLP/安全培训/网络安全/信息安全)零命中。全库仅有的零星痕迹都是无关项,不构成模块实现。维持MISSING成立。", "reEvidence": "全库对 拓扑/topology、漏洞/vulnerab、补丁(patch作为安全补丁)、安全事件/应急响应、DLP/数据安全、安全培训、安全设备 的 grep 在前后端 router/页面/控制器/oaModules.ts 中均无功能实现命中。仅有的相关文本:(1) ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/itservice.vue 是\"IT服务与安全\"通用工单页,第8行一条种子数据自由文本提到\"季度网络安全巡检:弱口令排查与防火墙策略复核\"(type=安全检查),属helpdesk工单描述,非拓扑/漏洞/应急/DLP/培训任一模块;(2) oa-backend/.../web/ItAssetController.java 为纯资产清单CRUD(@RequestMapping /api/oa/it-assets),无安全字段/端点;(3) DataSeeder.java:3125 \"深信服 防火墙 AF-2000\"仅为一条IT资产(网络设备)清单项;DataSeeder \"应急管理厅\"为政府机构名(证书种子)与安全应急无关;(4) appdev/appmgr.vue:548 的 patch 是 semver 版本号变量,与安全补丁无关。信息中心前端目录仅含 assets.vue/budget.vue/itservice.vue/monitor.vue 四页。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "5. IT预算与成本", "verdict": "LOGIC_GAP", "gap": "只是手填IT预算表。缺超预算自动判定/拦截、成本分摊计算、IT成本报表。维持 LOGIC_GAP。", "severity": "med", "evidence": "前端 itasset/budget.vue 是 settingListStore('itasset-budget') 手填列表,budget/used 为数字但 status('执行中/已超支/已结余')是人工选择的下拉,无 used>budget 自动判定/拦截/预警。注意:后端通用 BudgetController.create() 确有 Money.gt(actual,budget) 自动置'超支'的逻辑,但该 Budget 是预算成本中心的通用实体(element=人工费/材料费等),IT预算页根本未走此后端、走的是键值表,故 IT 预算无自动超预算判定。无 IT支出与预算关联校验、无成本分摊算法(grep 分摊仅命中 RdExpense 的'折旧分摊'种子文本标签,非IT云服务/软件授权按部门项目分摊)、无 IT成本报表定义。", "survives": true, "reNote": "缺口属实,无法推翻。信息中心「IT预算与成本」页就是一张纯手填台账:itasset/budget.vue 用 settingListStore('itasset-budget') 把数据写到通用 /api/oa/biz/{type}(BizRecordController),后者是无 schema 的整行 JSON 增删改查,完全没有任何预算/成本逻辑。具体三项全缺:(1) 超预算自动判定/拦截——页面的「状态」字段(执行中/已超支/已结余)是用户手选的下拉(create field, options 写死),没有任何 used>budget 的比较来自动置「已超支」,更没有创建/编辑时的拦截或预警;MasterDataPage 虽有通用 rowClass 染色钩子,但 budget.vue 没传 rowClass/row-class,连视觉提示都没有。(2) 成本分摊计算——全代码库 grep「分摊/allocat」在 IT 侧零命中。(3) IT成本报表——ReportController/ReportDefinitionController 对 itasset/IT/信息中心零引用。对照证明这不是\"功能已在别处实现\":通用预算模块 BudgetController 确实有 Money.gt(actual,budget)→自动置「超支」、CostCenterController 确实有树形预算上卷(rollupBudget/rollupActual/rollupRate),但 IT 预算页根本没接这两个控制器,走的是 /biz 通用台账,享受不到任何这些逻辑。维持 LOGIC_GAP 成立。", "reEvidence": "前端 IT预算页(纯mock台账): /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/budget.vue 第6行 settingListStore('itasset-budget',...);状态为手选下拉 第22行。settingListStore 实为 /biz/{key} 通用CRUD: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/api/settingList.ts:18。后端通用记录无业务逻辑: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/BizRecordController.java(纯dataJson行级CRUD)。IT资产控制器也无预算逻辑: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ItAssetController.java。对比——超支自动判定只存在于通用预算: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/BudgetController.java:84-88 (Money.gt(actual,budget)→setStatus(\"超支\"));预算上卷只存在于成本中心: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/CostCenterController.java:303-316 (rollupBudget/rollupActual/rollupRate);IT预算页均未接入。分摊/IT成本报表全库零命中(ReportController/ReportDefinitionController 对 itasset 无引用)。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "6. 与其他部门接口要求", "verdict": "MISSING", "gap": "整组接口缺失,尤其 HR→IT 账号联动完全没有。维持 MISSING。", "severity": "high", "evidence": "TriggerRuleEngine.java(办结后下游联动)规则键经 grep 仅 payment.create/receipt.invoice/contract.effectivate/project.create/project.accept/supplier.admit —— 无任何 HR→IT 账号联动规则。grep 入职/离职/onboard/provision/disable 在引擎中零命中。最关键的 HR 入职自动开通账号/离职自动禁用账号/岗位变动调权完全缺失。无 IT采购付款/资产折旧/成本分摊回写财务接口。无各业务部门系统需求/数据质量整改对接。无采购部 IT采购流转(WorkOrder 是生产工单)。无法务风险部信息安全合规/合同审核对接。", "survives": true, "reNote": "缺口属实。彻查后台联动引擎、IT/账号/交接/用户控制器及前端 itasset 全套页面,确认 HR→IT 账号联动及整组\"与其他部门接口\"在代码中完全没有实现。TriggerRuleEngine 是唯一的办结后下游联动引擎,其关键词路由(fire())只覆盖 付款/用印/收款/验收/供应商/合同/立项,没有任何 入职/离职/账号/开通/IT 分支,也没有创建 SysUser/ItAsset 的规则方法——任何 HR 事件都无法触发 IT 账号开通或回收。AccountController(/api/oa/accounts)是财务会计科目(资产/负债/权益),非登录账号,与账号开通无关。HandoverController(离职/调动交接)只是纯 CRUD,字段仅 handoverPerson/receiver/dept/items/status,既无账号回收字段也不联动 IT。UserController.create 只能由管理员直接 POST 建用户,不由任何 HR 入职/交接事件触发。前端唯一相关命中是 itasset/itservice.vue 第7行一条 mock 工单字符串\"申请为新入职员工开通ERP采购模块权限及邮箱账号\",纯静态 settingListStore 假数据,无后端接线、无自动化、不真正建账号。全后端对 开通/分配账号/onboard/provision/账号回收/HR→IT/部门接口 的 grep 全为零实现命中。维持 MISSING 成立。", "reEvidence": "证据文件: (1) /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java fire() L109-128 关键词路由无任何 入职/离职/账号/开通/IT 分支,全部规则方法只产出 Payment/Invoice/Contract/Project/SealUse/Supplier/Archive,无 SysUser/ItAsset/Account 创建。 (2) /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AccountController.java 是会计科目 CRUD(L22-28 注释:财务总账会计科目),非用户账号。 (3) /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/HandoverController.java 纯 CRUD,CreateHandoverRequest L60-63 字段无账号/IT,无任何 IT 联动。 (4) /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ItAssetController.java 纯资产 CRUD,无 holder→账号开通逻辑。 (5) /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/UserController.java create() L72-98 仅管理员直建,非 HR 触发。 (6) 前端 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/itservice.vue L7 仅一条 mock 工单文字,settingListStore 假数据无接线。 全后端 grep '开通|分配账号|onboard|provision|账号回收|HR.{0,4}IT|部门接口' 零实现命中。" }, { "area": "行政 / 信息部/信息部(信息中心 itasset / 应用定制平台 appdev / 移动工作台 mobile)", "module": "7. 移动端应用", "verdict": "PARTIAL", "gap": "仅一个汇总首页。缺 IT工单移动闭环、扫码盘点、监控告警移动主动推送、IT专门移动入口。维持 PARTIAL。", "severity": "med", "evidence": "MobileController.java(/api/oa/mobile/summary) 仅返回 todoCount/alertCount/dangerCount/projectCount + alerts/todos 预览(各前5),是只读汇总首页。无 IT 工单移动提交/接单/处理反馈闭环(todos 来自 FormInstance 审批,非 IT 工单实体)。无资产扫码盘点能力/盘点流程。监控告警为被动聚合且对非 ADMIN/APPROVER 剥除,AlertScheduler 无主动 push 到移动端、无短信/邮件推送,仅站内 NotificationService 用于审批超时。无 IT采购/变更/权限申请专门移动入口,移动审批依赖通用 FormInstance。", "survives": true, "reNote": "缺口属实,无法推翻。尽力查证后证据如下:\n\n1. 移动端只有一个汇总首页,且全平台唯一移动入口。\n - 前端 mobile 目录只有一个文件 workbench.vue(src/oa/pages/mobile/workbench.vue),它自我注释为\"统一移动工作台…移动端只做一个工作台…不新增后端,纯前端聚合\"。功能仅:待办审批 / 预警中心 / 进度填报 / 快捷查询(8个快捷链接=合同/支付/投标/情报/用印/档案/商机/预算)。\n - 全前端唯一移动路由是 /mobile/workbench(oaModules.ts:489-494 只注册一个 portal 子项)。kaidiDeptView.ts 中每个部门的\"移动端应用\"块 path 去重后只有一个值:\"/mobile/workbench\" —— 即所有部门的移动端都复用这同一个工作台,没有任何专门移动入口。\n - 后端 MobileController 只有一个 GET /api/oa/mobile/summary(纯聚合待办/预警/项目计数+前5预览),无任何子功能端点。\n\n2. 缺 IT工单移动闭环 —— 属实。workbench.vue 中对 work-order/工单/it-asset 的 grep 全空;快捷链接里没有\"工单/IT\"项;前端无任何 mobile 下的 work-order/itasset 页面或组件。WorkOrderController 仅普通 REST CRUD,无移动专用端点。\n\n3. 缺扫码盘点 —— 属实。全前端 grep 扫码/二维码/条码/qrcode/barcode/getCamera/navigator.mediaDevices/html5-qrcode/jsqr/zxing 全部无命中(仅有的 scan 命中是 datacenter 治理扫描、报表 barcode 标签文案、身份证附件字段,与移动盘点无关)。后端无 scan/盘点 端点。\n\n4. 缺监控告警移动主动推送 —— 属实。AppMonitoringController(/api/oa/appdev/monitoring) 仅只读看板聚合,无任何推送。存在的 NotificationService/AlertScheduler.pushAlerts() 是站内通知表+每小时审批超时/证件到期 sweep(NodeAssignee 办理人站内通知),不是面向移动端的主动推送(无 FCM/APNS/WebPush),且与 IT/监控告警无关;WebSocket(WebSocketConfig/CollabSocketHandler) 仅用于文档协同 CollabDoc,不推告警。移动端预警 tab 也是前端 onMounted 主动拉取各台账后客户端计算(workbench.vue:79-108),是拉模式而非推送。\n\n5. 缺 IT专门移动入口 —— 属实,见第1点,所有移动端共用一个通用工作台,无信息部/IT 专属移动入口。\n\n判定 PARTIAL 成立。", "reEvidence": "前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mobile/workbench.vue (唯一移动页, 仅待办/预警/填报/快捷查询); src/data/oaModules.ts:489-494 (唯一路由 /mobile/workbench); src/data/kaidiDeptView.ts (所有部门\"移动端应用\"path 去重后仅 \"/mobile/workbench\")。后端: oa-backend/src/main/java/com/kaidi/oa/web/MobileController.java (仅 GET /summary 聚合); web/AppMonitoringController.java:63 (仅只读看板, 无推送); task/AlertScheduler.java:74 pushAlerts() (站内审批超时/证件到期 sweep, 非移动推送, 与IT监控无关); web/WorkOrderController.java (仅普通CRUD, 无移动端点)。全前端 grep 扫码/qrcode/barcode/camera/zxing/jsqr 零命中(真扫码盘点不存在)。" }, { "area": "行政 / 办公室/行政后勤中心 (admin)", "module": "1. 非生产性物资管理(办公/劳保/清洁用品)", "verdict": "PARTIAL", "gap": "缺四类(办公/劳保/清洁/低值易耗)分类档案含规格/参考单价/安全库存;缺采购申请汇总生成采购计划并转采购执行联动;缺扫码入出库领用登记;缺低于安全库存自动提醒(仅制造库存有status派生);缺批次/有效期;缺岗位/部门领用定额与超定额特批;缺领用费用按部门/项目自动归集与月末分摊报表推财务。", "severity": "high", "evidence": "唯一相关后端是 InventoryItemController.java + InventoryItem.java,但其注释/category 明确是制造管理中心库存(原料/半成品/成品/辅料),字段仅 materialName/category/spec/unit/quantity/safetyStock/location/status;status 在 quantitybudget 时自动置 status='超支'(Money.gt),AlertController.java:196-204 据此产出 '成本超支' danger 预警。但后勤侧并未接它——cost.vue 用 settingListStore('admin-cost') → /api/oa/biz/admin-cost(BizRecord 通用 CRUD),status 是用户在下拉里手填的自由文本('正常/超支/节约'),与 actual/budget 数值无任何计算关系,永不触发上述预警。通用 SupplierController 存在但未在后勤侧挂接(canteen/vehicle/cost 三页均无 supplier 字段/合同/付款/服务评价)。", "survives": true, "reNote": "缺口属实,无法推翻。行政后勤中心 admin 模块的后勤成本/预算完全是独立 mock 页,与真 Budget/CostCenter 引擎零联动;分摊算法、后勤侧供应商档案-合同-付款-评价均不存在。\n\n1) 超支状态靠人工填写:cost.vue 用 settingListStore('admin-cost', [...hardcoded...]),status 是手选 select(options=['正常','超支','节约']),由人录入。真 Budget 引擎(BudgetController 84-88 行 Money.gt(actual,budget) 自动判 超支)确实存在且能用,但 cost.vue 从不调用 /api/oa/budgets 或 /api/oa/cost-centers——grep 全部 admin 页对 budgets/cost-centers 引用为 0。\n\n2) 分类未接真预算科目:cost.vue 类别只是文本串['食堂','车辆','物业','办公','差旅'],未绑定 Budget.element 科目或 CostCenter 主档;canteen/vehicle/affairs 同为各自独立 mock store,无任何预算科目绑定。\n\n3) 无按人头/面积/里程分摊算法与分摊报表:在 admin 模块 grep 分摊/allocation/按人头/按面积/按里程 全部为空。app 代码里唯一的「分摊」在 budget/standardcost.vue(独立的预算成本中心页,做料+工+费标准成本上卷),其注释自承「费用分摊回填...属甲方核算口径...当前为手填+服务端自动汇总的框架实现」,既无人头/面积/里程驱动的分摊算法,也未与后勤模块联动。\n\n4) 后勤侧供应商档案-合同-付款-评价未建:通用 SupplierController/Supplier 域只有 name/creditCode/category/contact/phone/bank/status 字段,无 rating/评价/服务质量,无合同/付款关联;category 是 材料/设备/劳务/服务(非 食材/维修厂/保洁外包);且无任何 admin 页引用 Supplier(grep 为空)。\n\n5) 后端无任何 admin/canteen/vehicle/logistic 控制器把后勤与预算引擎桥接。结论 real=true。", "reEvidence": "前端 admin/cost.vue:6 settingListStore('admin-cost', [{...,\"status\":\"超支\"},...]),:22 status 手选 select options=['正常','超支','节约'];grep 全部 oa/pages/admin/* 对 budgets/cost-centers/api 引用=0。真引擎 oa-backend/.../web/BudgetController.java:84-88 自动判超支(未被 admin 调用)、CostCenterController.java 提供 /tree 上卷(未被 admin 调用)。分摊:grep 分摊/allocation 在 admin=空;唯一在 oa/pages/budget/standardcost.vue(独立页+自承框架实现)。供应商:oa-backend/.../web/SupplierController.java + domain/Supplier.java 仅 name/creditCode/category/contact/phone/bank/status,无 rating/评价/合同/付款;grep admin 页 Supplier/供应商=空。后端 web/ 目录无 admin/canteen/vehicle/logistic 控制器。" }, { "area": "行政 / 后勤/行政后勤中心(admin 模块)", "module": "3. 服务满意度与改进(满意度调查/投诉建议闭环/服务响应时效)", "verdict": "MISSING", "gap": "缺失:针对食堂/班车/宿舍/保洁的定期满意度问卷+评分统计+改进报告;员工在线投诉建议→后勤分配处理→跟踪闭环;维修/用车/保洁 申请到完成时长记录+平均响应时间自动计算+纳入 KPI。", "severity": "high", "evidence": "尽力反驳但无法翻案。有通用 SurveyController.java(title/options/vote/responseCount)——纯投票问卷,无评分统计/改进报告,且未与食堂口味/班车准点/宿舍维修/保洁质量等后勤场景绑定。全后端 grep responseTime|完成时长|平均响应|complaint|投诉 命中均为他模块(SupervisionLog/SafetyCheck 的整改闭环、AuthService 的计时平衡),无后勤服务响应时效实现。无投诉提交→后勤分配→跟踪闭环实体。", "survives": true, "reNote": "缺口属实。行政后勤中心(admin)仅有6个基于 MasterDataPage 的通用CRUD台账页(affairs/vehicle/dorm/training/canteen/cost),全部走 settingListStore 键值持久化,后端无任何 admin/canteen/dorm/vehicle/complaint/satisfaction/feedback/repair/response 控制器映射。逐条核对三项能力均缺失:(1)定期满意度问卷+评分统计+改进报告——canteen.vue 只有一个手填的 score(满意度评分)单元格和 issue 自由文本,非问卷;无周期性问卷、无评分聚合统计(MasterDataPage 零 avg/sum/reduce)、无改进报告;dorm/vehicle 连满意度字段都没有;通用 SurveyController(/api/oa/surveys)是全站投票引擎,种子是\"OA满意度/团建/培训需求\",不针对食堂/班车/宿舍/保洁,也无分服务评分统计与改进报告生成。(2)在线投诉建议→后勤分配处理→跟踪闭环——无投诉/建议实体、控制器或页面,grep 投诉/complaint/建议箱/feedback/闭环/分配处理/跟踪处理 在 admin 侧零命中。(3)维修/用车/保洁申请到完成时长+平均响应时间自动计算+纳入KPI——无任何时长/响应时间字段,WorkOrder 域无 startedAt/completedAt/responseTime/duration,搜索 响应时长/平均响应时间/申请到完成/avgResponseTime/纳入KPI 全空;唯一报修工单页 itservice.vue 属信息中心且无时间戳与时效计算。未能在代码中找到任何可推翻该缺口的实现。", "reEvidence": "前端 admin 页: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/admin/{affairs,vehicle,dorm,training,canteen,cost}.vue (均为 MasterDataPage 通用CRUD)。canteen.vue 第7-9行 score/issue 仅手填字段;MasterDataPage.vue 无任何聚合统计。模块定义 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts 第465-475行 admin 仅6个子菜单。后端 SurveyController /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/SurveyController.java 为全站投票引擎,无服务满意度统计/改进报告。grep 全仓(排除 static 构建产物): 投诉/complaint/建议箱/feedback、闭环/分配处理/跟踪处理、改进报告/改进措施、avgResponseTime/平均响应时间/响应时长/申请到完成、纳入KPI 在 admin 侧全部零命中。domain 目录无 complaint/feedback/satisfaction/suggest/repair 实体。WorkOrder.java 无响应/时长/startedAt/completedAt 字段。后端控制器 grep RequestMapping 无 admin/canteen/dorm/vehicle/complaint/satisfaction/repair/response 映射。报修页仅 /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/itasset/itservice.vue(信息中心,无时间戳)。活体 http://127.0.0.1:8091 登录成功确认环境可达。" }, { "area": "行政 / 后勤/行政后勤中心(admin 模块)", "module": "4. 报表与看板(后勤成本看板/车辆运行报表/食堂成本报表/宿舍入住率/满意度趋势)", "verdict": "MISSING", "gap": "缺失:月度后勤费用/预算执行率/各科目占比实时看板;车辆使用率/油耗趋势/维修费排行;人均餐费/食材损耗率/最受欢迎菜品报表;各宿舍楼入住率/空置房统计;季度满意度趋势与投诉分类统计。无任何后勤看板/报表实现,宿舍页(dorm.vue)有 beds/occupied 字段但无入住率聚合计算。", "severity": "high", "evidence": "尽力反驳但无法翻案。全前端 grep 人均餐费|损耗率|入住率|油耗|预算执行率|后勤成本看板|满意度趋势 仅 2 命中且均非后勤:budget/bom.vue:563 是 MRP 损耗率说明,appdev/appmgr.vue:60 把 '访客预约' 列为表单模板名之一。admin 目录下 6 个页面(affairs/canteen/cost/dorm/training/vehicle)全部是 MasterDataPage 列表台账,无任何图表/看板/统计聚合组件。", "survives": true, "reNote": "缺口属实。行政后勤中心(admin)模块完全没有任何看板/报表实现,所有需求点(后勤费用/预算执行率/科目占比看板、车辆使用率/油耗趋势/维修费排行、人均餐费/食材损耗率/最受欢迎菜品、各宿舍楼入住率/空置统计、季度满意度趋势/投诉分类)均缺失。admin 模块在 oaModules.ts 中仅定义了 6 个子项(affairs/vehicle/dorm/training/canteen/cost),全部 kind:'list',无任何 board/dashboard/report 类型条目;路由里也无 admin 看板路由。六个页面均为 30-35 行的纯 CRUD 表格(MasterDataPage + settingListStore 前端 mock 数据),无任何 computed 聚合、reduce、ECharts 图表、占比/趋势/排行计算。dorm.vue 确实有 beds/occupied 字段但只作为表格列原样展示,全文无入住率/空置率聚合(grep occupied/入住率 仅命中列定义本身)。后端无任何后勤实体或报表端点:vehicle/canteen/dorm/admin-cost 数据从不落库(纯前端 settingListStore),ReportController./overview 只统计 formInstance/meeting/file/user/dept,BusinessBiController./business-overview 聚合 contract/fund/cost(Budget实体)/project/rd/ops/ehs/bidding/alert——均不含任何后勤(车辆/食堂/宿舍)维度。试图推翻未果,缺口成立。", "reEvidence": "前端页面(全为纯CRUD表格,无聚合无图表): /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/oa/pages/admin/cost.vue (31行), vehicle.vue (35行), canteen.vue (35行), dorm.vue (34行,occupied仅第6-8/15行作列展示), affairs.vue, training.vue。模块定义: /Users/qiu/Desktop/ERP/ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts 第464-477行 admin 仅6个 kind:'list' 子项,无看板。后端报表端点不覆盖后勤: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/ReportController.java 第58行 /overview(仅instance/meeting/file/user/dept); /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/BusinessBiController.java 第140行 /business-overview(contract/fund/cost/project/rd/ops/ehs/bidding/alert,无车辆/食堂/宿舍维度)。全前端 grep 后勤看板/入住率/油耗/损耗/满意度趋势/空置 关键词在 admin 页面外零命中;router 无 admin board/dashboard 路由。" }, { "area": "行政 / 后勤/行政后勤中心(admin 模块)", "module": "5. 移动端应用(报餐订餐/用车申请/报修/访客预约二维码/满意度问卷/快递通知/入住退宿申请)", "verdict": "MISSING", "gap": "缺失:手机报餐/取消/查菜单、提交用车+查派车状态、拍照报修+查维修进度、访客预约生成二维码、满意度问卷手机填写、快递取件通知、入住/退宿申请。移动工作台只是通用待办/预警聚合,全部后勤移动场景未实现。", "severity": "high", "evidence": "尽力反驳但无法翻案。mobile 模块(oaModules.ts:489-494)仅注册一个 /mobile/workbench。workbench.vue(282行)仅 todo/alert/fill 三 tab,聚合 listInstances('todo')+预警,grep 报餐|用车|报修|访客|二维码|满意度|快递|入住|退宿|食堂 零命中。后端 MobileController.java 只有 /summary 一个端点,返回本人待办计数+项目数+预警(且对非ADMIN剥除),无任何后勤场景端点。", "survives": true, "reNote": "缺口属实,全部7个后勤移动场景均未实现,无法推翻。1) 后端 MobileController.java 仅做通用聚合:/api/oa/mobile/summary 只返回本人待办(form instance)计数+预览、平台预警(复用AlertController)、项目数;全程无任何报餐/用车/报修/访客/满意度/快递/入住退宿端点。后端关键字搜索的命中全是误报——ItAssetController/LabInstrumentController 里的\"维修/报修\"是资产状态枚举(在用/闲置/维修/报废),FeedController 的\"拜访客户\"是销售动态文本,\"express\"只命中 import 字样,SurveyController 是通用投票(进行中/已结束)与后勤满意度无关。2) 前端移动端只有唯一一个页面 oa/pages/mobile/workbench.vue,oaModules.ts(行489-494) 的 mobile 模块只挂一个子项 workbench(kind=portal);workbench 仅渲染\"待办审批/预警中心(预算超支/安全隐患/履约临期/证件临期/专利年费)/项目进度填报/快捷查询(合同·支付·投标·情报·用印·档案·商机·预算)\",完全就是缺口描述的\"通用待办/预警聚合\"。3) admin 桌面页(vehicle/canteen/dorm/affairs/training/cost)只是纯后台台账表(车辆状态列表、食堂每日成本日志、宿舍入住占用表),无用车申请表+派车状态查询、无报餐/订餐/查菜单/取消、无拍照报修+维修进度、无访客二维码生成、无满意度问卷手机填写、无快递取件通知、无入住/退宿申请,且都不是移动端流程。4) 全仓7场景关键词扫描唯一命中在 appdev/appmgr.vue(行60\"访客预约\"是低代码应用目录里的示例应用名字符串,与\"物资采购申请/请假调休/名片申请\"并列;行506\"只读访客\"是权限角色名),均非功能实现。判定 MISSING 成立。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/web/MobileController.java(整文件=todo/alert/project聚合,@RequestMapping(\"/api/oa/mobile\"),仅 GET /summary); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/mobile/workbench.vue(唯一移动页,仅 todo/alert/fill/quicklinks 四块,无任何后勤场景); ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts:489-494(mobile模块仅 workbench 一个子项); ofbiz-framework/plugins/modern-ui/app/src/router/index.ts:18,41-51(路由由 import.meta.glob 自动生成,无移动后勤路由); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/admin/vehicle.vue,canteen.vue,dorm.vue(纯台账表,无申请/派车状态/报餐/取消/二维码/进度/问卷); ofbiz-framework/plugins/modern-ui/app/src/oa/pages/appdev/appmgr.vue:60(访客预约=示例应用名字符串),:506(只读访客=角色名); 后端\"维修\"误报:web/ItAssetController.java:23、web/LabInstrumentController.java:23(资产状态枚举);web/FeedController.java:59(拜访客户=销售动态文本)。" }, { "area": "逻辑链", "module": "工程业务流程:查网→制作标书→开标→领取中标通知书→签订总包合同→施工前准备→施工图审查→材料等分包合同→办理施工许可证→季度考评→竣工备案→资料存档", "verdict": "PARTIAL", "gap": "整条链『有承载』基本到位(12 环全部能在系统找到页面/台账或表单),但端到端『自动联动』只在两端打通、中段断裂,且存在两处真实承载缺口:(1)自动联动只覆盖前段『查网→情报转商机→商机转投标→中标(自动建项目+总包合同草稿)』和后段『验收/竣工办结→项目phase置验收→自动归档』两段,各由 IntelController/OpportunityController/BidController.chainWinBid 与 TriggerRuleEngine 的 accept/archive 规则驱动;(2)TriggerRuleEngine.fire 的关键词矩阵(付款/用印/收款/验收/供应商/合同/立项)完全没有为『开标/图审/施工许可/季度考评/竣工备案』设规则,故这些工程实施期环节即便有状态字段(DesignDoc.reviewStatus、ContractMilestone、Bid.openDate)也是孤立手填,办结/状态变更不触发下游,环节间靠人工衔接;(3)两个真缺口——『办理施工许可证』仅为表单内 radio 标记位(无许可证台账/办理流程/联动)、『季度考评』无任何周期考评承载(SupervisionLog 是监理日志类型而非考评、design score 非周期项目考评);(4)『竣工备案』只到『验收+归档』,政府备案登记本身无承载。即:招投标段强联动、实施段弱(纯状态字段无触发)、考评与施工许可两环缺承载、竣工只到验收。", "severity": "med", "evidence": "查网(线索采集):有;制作标书:部分;开标:部分;领取中标通知书:部分;签订总包合同:有;施工前准备:部分;施工图审查:部分;材料等分包合同:有;办理施工许可证:缺;季度考评:缺;竣工备案:部分;资料存档:有", "survives": true, "reNote": "尽力推翻未果,缺口属实(PARTIAL判定准确)。逐条核验:\n\n(1) 自动联动确实只打通两端。前段由 BidController.chainWinBid 驱动:仅当 bid.status 新变为「中标」且未关联项目时,才自动建 Project(phase=中标)+总包合同草稿(草稿态)并回填 projectId;openDate 等字段纯为存储属性、不触发任何下游。后段由 TriggerRuleEngine 的 validate/archive 规则驱动(验收→phase=验收→chainArchiveProject 自动归档)。中段无联动。\n\n(2) TriggerRuleEngine.fire 的关键词矩阵(TriggerRuleEngine.java:109-127)只有 付款/报销·用印/盖章·收款/到账·验收/结项/竣工·供应商/准入·合同·立项 七组;grep 确认全仓无『开标/图审/施工许可/季度考评/竣工备案』任何触发关键词。DesignDocController 完全不 import/调用 TriggerRuleEngine、无任何 chain* 方法——reviewStatus 是孤立手填字段,状态变更不触发下游。全仓仅 TriggerRuleEngine/WorkflowService/BidController/AutomationController 涉及联动逻辑。\n\n(3) 两个真承载缺口成立:\n - 施工许可证:grep『ConstructionPermit/施工许可/permitNo/许可证编号』后端零命中;前端仅在表单模板 src-project-transfer.ts(hasConstructionPermit radio)与 src-bid-winner.ts 出现『是否办理施工许可证』radio 标记位——无许可证台账/办理流程/联动实体。\n - 季度考评:grep『季度考评/周期考评/项目考评/考评表/考评记录』前后端全零命中。SupervisionLog 经实体注释证实为监理记录(logType=旁站/巡视/平行检验/监理通知/计量支付),无 score/quarter/考评字段;supervision 前端目录仅 logs.vue。DesignDoc 无 score 字段。周期考评确无承载。\n\n(4) 竣工备案:grep『竣工备案/备案登记/filing/备案号』全零命中;链路只到 chainAcceptProject(phase=验收)+chainArchiveProject(内部档案库归档),政府备案登记本身无承载。\n\n结论:招投标段强联动、实施段纯状态字段无触发、考评与施工许可两环缺承载、竣工只到验收——与描述完全吻合。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:109-128 (关键词矩阵无开标/图审/许可/考评/备案); oa-backend/src/main/java/com/kaidi/oa/web/BidController.java:158-192 (chainWinBid 仅 status==中标 触发, openDate 无下游); oa-backend/src/main/java/com/kaidi/oa/web/DesignDocController.java (无 TriggerRuleEngine 引用/无 chain*, reviewStatus 孤立手填); oa-backend/src/main/java/com/kaidi/oa/domain/SupervisionLog.java:11-13 (监理记录非考评, 字段无 score/季度); ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-project-transfer.ts:15 与 src-bid-winner.ts:28 (施工许可仅 radio 标记位); grep 全仓『ConstructionPermit/施工许可台账/permitNo』『季度考评/周期考评』『竣工备案/备案登记/filing』均零命中" }, { "area": "逻辑链", "module": "合同流程:供应商入库→取模板合同(IT维护)→线上填写→自动化比对→合约部在线审核→进入OA审批→通知合同专员下载上传盖章电子合同→电子签自动进入盖章系统", "verdict": "LOGIC_GAP", "gap": "链路两端打通、中段断裂。强项是「合同办结→自动生效→自动生成待用印单→盖章登记闭环」这段用印联动(已活体验证 contract.effectivate→contract.toSeal→seal.markUsed 三段留痕),以及供应商入库、OA审批引擎均真实可用。但需求三处重点有两处实质缺失:(1)『自动化比对』完全不存在——模板的 requiredClauses/bodyTemplate 从不与已填合同做任何条款比对校验,全仓「比对」只服务于BOM量价;(2)『取模板合同』虽有 IT 可维护的模板库,却与线上填写脱钩——选模板不带出正文、不预填、不约束,bodyTemplate 无任何页面消费,使『取模板→线上填写→自动化比对』这条需求主线退化为「自由填合同字段」;(3)末端『电子签自动进入盖章系统』无任何外部签章/盖章系统集成,盖章后电子合同的上传回传也未落地,用印仅靠台账人工置态。即:审批与用印的自动联动(引擎层)成立,但模板驱动的起草+智能比对+电子签三项需求特征性能力缺位,构成逻辑链中段+末端的断点。", "severity": "high", "evidence": "供应商入库(供应商建档/准入):有;系统取模板合同(IT维护更新模板):部分;线上填写(按模板在线起草合同):部分;自动化比对(填写内容 vs 模板必备条款):缺;合约部在线审核 + 进入OA审批:有;用印联动(合同生效→通知合同专员→生成待用印→盖章登记):有;通知合同专员下载/上传盖章电子合同 + 电子签自动进入盖章系统:缺", "survives": true, "reNote": "缺口属实,无法推翻。三处需求特征性能力中两端/中段确缺:(1)『自动化比对』不存在——全后端仅 ContractTemplate.java 自身有 getBodyTemplate()/getRequiredClauses() 两个 getter,零消费者;无任何代码读模板 requiredClauses 与已填合同做条款比对;全仓唯一的「比对」是 BomAnalysisController 的 BOM 量价比对,与合同条款无关。(2)『取模板→线上填写』脱钩——合同新建 UI(masterdata/contract.vue createFields L37-48)是自由字段(编号/名称/类型/甲乙方/金额…),无模板选择器;bodyTemplate 仅在模板库详情抽屉(templates.vue L53
)只读展示,从不带出正文/预填/约束合同起草。(3)『电子签自动进入盖章系统』+盖章电子合同上传回传——缺失:无任何外部签章集成(无 法大大/e签宝/DocuSign/externalSign;前端「签章」命中全在 design 设计模块,与合同无关);TriggerRuleEngine 的用印联动(effectivate L239→chainCreateSealUse/contract.toSeal L269→markUsed L375)仅翻转台账状态字符串(待用印→已用印)并写 AutomationLog,生成的 SealUse 无文件字段、无上传、无盖章合同回传。描述所称「强项=用印状态联动(引擎层)成立、模板驱动起草+智能比对+电子签三项缺位」与代码完全吻合,构成逻辑链中段+末端断点。",
   "reEvidence": "后端 getBodyTemplate/getRequiredClauses 消费者: 仅 oa-backend/src/main/java/com/kaidi/oa/domain/ContractTemplate.java:79,87(getter自身),无其他引用。后端唯一「比对」: oa-backend/src/main/java/com/kaidi/oa/web/BomAnalysisController.java:17(BOM量价比对)。合同新建无模板选择: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/masterdata/contract.vue:37-48(createFields 自由字段,无 template)。bodyTemplate 仅只读展示: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/contract/templates.vue:53(
{{ row.bodyTemplate }}
)。用印联动仅改状态无文件回传: oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:239(contract.effectivate 置「已生效」)→269-294(chainCreateSealUse/contract.toSeal 建 SealUse status=待用印,无文件字段)→375-393(seal.markUsed 翻「已用印」)。无外部电子签集成: 全后端 grep 电子签/esign/签章/法大大/e签宝/DocuSign/externalSign 在合同相关文件零命中(命中均在 DesignDoc/DesignChange 设计模块)。" }, { "area": "逻辑链", "module": "资金确认 (项目部向甲方请款→财务资金到账确认→开票→应付/入账凭证)", "verdict": "PARTIAL", "gap": "两处实质缺口,均非阻断但使链条不完全闭环: (1) 无独立『资金到账确认』实体——到账仅以项目收款确认单办结代替,不与真实银企流水/到账金额核销,无法验证甲方实际打款(TriggerRuleEngine 仅凭表单关键词触发,domain 无 Receipt/资金流水)。(2) 开票(待开→已开)只回写 contract.invoicedAmount(应收台账),不自动生成销项/确认收入的会计记账凭证(Voucher)——InvoiceController.applyContractDelta 不触达 VoucherRepository;系统中唯一自动凭证来自付款侧 PaymentService.autoVoucher(借应付账款/贷银行存款)。即审计点名的『应付入账』凭证联动只在付款分支成立,收款(甲方请款)分支的『入账』落在合同应收回写而非总账凭证。除此之外 请款→收款确认→开票→应收回写 四环均有真实级联写入并经活体验证,幂等(receipt.invoice/payment.create/voucher sourceType+sourceId)齐全。", "severity": "med", "evidence": "项目部向甲方请款 (发起请款/收款/开票申请单):有;财务资金到账确认:部分;开票 (生成销项发票):有;入账/凭证联动 (回写合同应收 + 记账凭证):部分", "survives": true, "reNote": "尽力推翻但无法推翻:缺口的两处实质缺陷均属实。我找到的唯一反证(ProjectController 验收凭证)只能纠正缺口的一句枝节措辞,纠正不了核心判定。\n\n(1) 无独立『资金到账确认』实体属实。domain/ 86 个实体里无 Receipt/FundFlow/CashFlow/到账确认/资金流水 任何一个;BankAccount.java 是纯主数据(户名/开户行/账号/用途,无余额、无流水明细、无核销字段);DataSeeder 里唯一的\"到账\"是一条种子讨论评论字符串(\"缩短到账周期\"),非实体。资金确认仅靠『收款确认单』(FormInstance)办结后被 TriggerRuleEngine.fire 按关键词(\"收款/到账/回款\")触发 ruleCreateReceivableInvoice 生成待开发票,全程不与真实银企流水/到账金额核销,无法验证甲方实际打款——与缺口描述完全一致。\n\n(2) 开票(待开→已开)不自动生成销项/确认收入会计凭证属实。InvoiceController.java 全文 Voucher 引用计数=0,构造器只注入 (invoiceRepo, contractRepo),无 VoucherRepository。applyContractDelta(行65-79)只调 contractRepo.save 回写 contract.invoicedAmount(应收台账),不触达 VoucherRepository。收款(甲方请款)分支的『入账』落在合同应收回写,而非总账凭证。\n\n反证及为何不成立:ProjectController.generateAcceptanceVoucher(行145-176)确实自动生成一张收入确认凭证(借应收账款/贷主营业务收入,sourceType=acceptance)。这使缺口里\"系统中唯一自动凭证来自付款侧\"这句枝节措辞不准确(实为两处:付款侧 PaymentService.autoVoucher + 验收侧)。但它由【项目生命周期『验收』(phase=验收)】触发、按合同金额入账、keyed on (acceptance, projectId),属于项目→验收链而非本『资金确认链』的开票/收款确认步骤;缺口的核心断言——开票/收款确认这一步本身不生成总账凭证、收款分支入账只回写合同应收——仍然成立且未被推翻。判定 PARTIAL(非阻断、链条不完全闭环)准确。", "reEvidence": "domain/ 实体清单无 Receipt/FundFlow/到账确认(共86实体已列举); domain/BankAccount.java 仅 accountName/bankName/accountNo/companySubject/currency/purpose 六字段无余额无流水; service/TriggerRuleEngine.java:113-115 关键词触发 + :188-233 ruleCreateReceivableInvoice 仅生成待开发票草稿; web/InvoiceController.java Voucher引用计数=0, 构造器:38 只(invoiceRepo,contractRepo), applyContractDelta:65-79 仅 contractRepo.save 回写 invoicedAmount; service/PaymentService.java:113-130 autoVoucher(借应付账款/贷银行存款,sourceType=payment); web/ProjectController.java:145-176 generateAcceptanceVoucher(借应收账款/贷主营业务收入,sourceType=acceptance,由验收phase触发非开票触发)——此为反证但仅纠正措辞不闭合缺口。" }, { "area": "逻辑链", "module": "资料流程:项目部(发起,项目发起类目)→办事处(凯迪长沙办公室)→资料室(戴艳兰,p1审批+f2知会)→工程中心(主任n5审批)→法务(法人n8审批)→董事长(f1知会)→档案室(f3知会)。承载模板=后端活体 kaidi-proj-seal-use「项目资料印签使用表单」(前端 src-project-doc-seal.ts),经 WorkflowService 多节点审批引擎跑通到办结。", "verdict": "PARTIAL", "gap": "链路在审批引擎层端到端打通(7环节全部被访问并留痕,真并行会签+条件分流+CC自动抄送均实测生效,办结落到 seal.markUsed 真回写用印台账),但「归档」这一终点环节缺真实自动联动:1) TriggerRuleEngine 无「资料/印签→档案室建档」规则,chainArchiveProject(唯一真写 Archive 落库的链)仅挂在 ruleAcceptProject(验收)下,资料印签链根本不可达,故 7 环节走完后档案知识中心(/api/oa/archives)不会新增任何档案记录,「档案室」只剩一条「已知会」抄送 trace 与一句「流程办结,归档」的台账文案,属伪归档。2) 摘要 trace 与真实规则不一致:downstreamSummary() 的「用印」关键字集(用印/盖章/用章)漏了「印签/印鉴/签章」,导致本表单摘要误落到立项分支打印「已自动触发下游:新建项目台账」,而 fire() 实际命中的是 seal.markUsed——办理详情时间线上的下游摘要与真实联动张冠李戴(虽不写脏项目,但误导审计/用户)。3) 语义偏差:需求「法务」环节实际是「法人(n8)」审批,「办事处」是末端 CC 而非正向流转级,与需求逐级流转描述不完全吻合。", "severity": "med", "evidence": "项目部→发起 (起点/项目发起类目):有;办事处 (凯迪长沙办公室):部分;资料室 (戴艳兰):有;工程中心 (主任):有;法务 (法人):部分;董事长 (知会):有;档案室 (归档落库):部分", "survives": true, "reNote": "缺口属实,判定 PARTIAL 正确。我作为对抗复验员尽力寻找\"其实已实现\"的证据,未能找到任何可推翻它的实现。三条子论点均经静态代码确证:\n\n【1 伪归档——核心,确实未实现】TriggerRuleEngine.fire() 对该表单的路由是确定的:tag = category+templateName = \"项目发起\"+\"项目资料印签使用表单\"。fire() 的 if-else 链(第109-128行)按序判定,第一个命中的是第111行 `containsAny(tag,\"用印\",\"盖章\",\"用章\",\"印签\",\"印鉴\",\"签章\")`——tag 含\"印签\"→进 ruleMarkSealUsed(第375行),它只把既有\"待用印\"SealUse 台账置\"已用印\",从不写 Archive。而唯一真正 new Archive()/archiveRepo.save() 的代码在 chainArchiveProject(第356、365行,sourceType 硬编码\"项目\"),它只被 ruleAcceptProject(第339行)调用,后者只在\"验收/结项/竣工/交付\"分支(第116-118行)可达。印签链根本走不到验收分支,故 7 环节办结后 /api/oa/archives 不会新增任何档案记录。全后端 grep 确认:自动联动里没有任何以 印签/资料/用印/seal 为源建档的规则(ArchiveController:114 是手工 REST、DataSeeder 是种子数据,均与本工作流办结无关)。\"档案室\"仅得一条知会 trace + WorkflowService.finalize 第540行那句固定\"流程办结,归档。\"台账文案——属伪归档。\n\n【2 摘要张冠李戴——确实存在】WorkflowService.downstreamSummary()(第572-590行)的\"用印\"关键字集第578行只有 `\"用印\",\"盖章\",\"用章\"`,漏了\"印签/印鉴/签章\"。对 tag=\"项目发起项目资料印签使用表单\":第578行不命中(无\"用印\"等字面),落到第580行\"立项/项目发起/项目启动\"命中\"项目发起\"→返回\"新建项目台账\"。于是 triggerDownstream(第560-568行)在时间线打印\"已自动触发下游:新建项目台账\",而 fire() 实际命中的是 seal.markUsed——摘要与真实联动张冠李戴(虽不写脏项目,但误导审计/用户)。\n\n【3 语义偏差——确实存在】模板 flow(src-project-doc-seal.ts)中 legalPerson 节点 label=\"法人\" type=\"审批\"(第98行),并非需求文案的\"法务(n8)\";changshaOffice\"凯迪长沙办公室\"type=\"知会\"(第102行),经 edge ['legalPerson','changshaOffice'](第124行)作为 legalPerson 后的并行 CC 扇出,是末端知会而非正向逐级流转级。与需求逐级流转描述不完全吻合(次要描述性偏差)。\n\n补充:活体 :8091 登录返回空 token(后端当前不可达),但以上结论纯由静态代码即可确证,不依赖活体。", "reEvidence": "oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java:111(印签→ruleMarkSealUsed 路由)、:116-118(验收分支独占 chainArchive 入口)、:339(仅 ruleAcceptProject 调 chainArchiveProject)、:346-369(唯一 new Archive,sourceType=\"项目\");oa-backend/src/main/java/com/kaidi/oa/service/WorkflowService.java:540(固定\"归档\"文案 trace)、:564-568(triggerDownstream 打印摘要)、:578(downstreamSummary 漏\"印签\"关键字)、:580(误落\"项目发起\"→\"新建项目台账\");ofbiz-framework/plugins/modern-ui/app/src/oa/engine/templates/src/src-project-doc-seal.ts:6-7(category=项目发起,name=项目资料印签使用表单)、:98(法人/审批)、:102 与 :124(凯迪长沙办公室=知会,legalPerson 并行CC)。全后端 grep setSourceType 仅 TriggerRuleEngine:359 一处自动建档(\"项目\"),无任何印签/资料/用印来源建档规则。" }, { "area": "逻辑链", "module": "流程驱动/自动触发:办结(状态迁移)→TriggerRuleEngine.fire()→真实下游写入(付款单/合同生效/项目/用印/供应商/发票)+链式联动(合同→用印, 项目验收→档案)+AutomationLog留痕→前端 /datacenter/automation 可视化;财务记账(confirmPay→autoVoucher)独立闭环。", "verdict": "PARTIAL", "gap": "骨架与多数下游链(付款/合同/项目/用印/供应商/发票/财务记账)真实端到端打通且活体可复现,机制(同事务/幂等/钱权分离/失败留痕/前端留痕页)健全。但需求明确点名的两条后续流程缺失:(1)成本风险检查——办结后无任何成本/预算风险自动校验规则;(2)生产排程——审批办结不自动生成工单/排产,制造侧仍纯手工。规则路由为硬编码中文关键词匹配(非可配置规则表/无复合条件),属\"流程驱动\"而非需求所述\"规范化/AI化\"的可配置条件引擎。另发现金额解析精度泄漏:活体台账中自动付款单出现 5.07、9.9999999997 等浮点伪值(parseNumber 走 double 未按 scale 规整),已 spawn_task task_410859f9 跟进。", "severity": "med", "evidence": "迁移→触发 连接点(办结即触发,同事务):有;TriggerRuleEngine 真实下游联动规则(非桩):有;端到端活体打通(实测一次办结真建下游单):有;钱权分离与幂等防重:有;财务记账自动化(付款→凭证):有;前端承载页与导航:有;成本风险检查 自动触发(需求点名):缺;生产排程 自动触发(需求点名):缺", "survives": true, "reNote": "缺口属实。这是一条 PARTIAL 判定,对抗复验仍无法推翻其核心两点。需求 Request.MD 第30/88/407行明确点名\"数据条件生成后自动触发【成本风险检查、生产排程、财务记账】等后续流程\"——三条都要在办结后由流程驱动自动触发。实际只有\"财务记账\"一条打通(PaymentService.confirmPay→autoVoucher),另两条确实缺失:\n\n(1) 成本/预算风险检查——TriggerRuleEngine.fire() 的规则矩阵(7个分支:payment/seal/invoice/project-accept/supplier-admit/contract-effectivate/project-create)无任何成本或预算风险校验分支;引擎构造函数未注入 BudgetRepository/CostCenterRepository/StandardCostRepository,结构上不可能在办结时拿当前单据金额去比对预算/标准成本。全后端 grep 成本风险/预算风险/riskCheck/超预算 在 service 层零命中。唯一相关的 AlertController\"成本超支\"(L196-204)只是读时被动扫描已是\"超支\"状态的 Budget 行展示告警,不在办结时触发、不评估刚办结单据、不写校验结果——非\"自动校验规则\"。\n\n(2) 生产排程/工单——fire() 无 WorkOrder 分支,未注入 WorkOrderRepository;WorkOrderController 工单仅靠人工 POST /api/oa/work-orders 创建,未注入 TriggerRuleEngine、不被 WorkflowService.finalize 调用,其唯一自动化是反向的\"已入库工单→成品库存(autoInventory)\"。办结→工单/排产链不存在,制造侧纯手工。\n\n另:规则路由是硬编码中文关键词 containsAny(tag,\"付款\",\"报销\"...)(L109-128),属\"流程驱动\"而非需求所述\"规范化/AI化可配置条件引擎\";parseNumber(L598-619)走 Double.parseDouble→Money.of(double),double 精度泄漏属实。判定 PARTIAL 准确,缺口成立。", "reEvidence": "需求点名三流程: /Users/qiu/Desktop/ERP/requirements/Request.MD L30 \"流程驱动 + AI 化:数据条件生成后自动触发成本风险检查、生产排程、财务记账等后续流程\"(同义见 L88、L407)。\n引擎缺两分支: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java fire() L94-139 仅7条规则(L109-128),无 cost-risk、无 work-order;构造函数 L68-88 未注入 Budget/CostCenter/StandardCost/WorkOrder 任何 repo。grep 成本风险/预算风险/riskCheck/排产/排程/生成工单 在 service 层与全 web 控制器办结链均零命中。\n工单纯手工: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/WorkOrderController.java create() L72-96 仅 POST 手工建,未注入 TriggerRuleEngine;autoInventory L134-145 是\"工单→库存\"反向自动化,与办结无关;WorkflowService.finalize 不调用它。\n办结触发点只调 fire(): /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/WorkflowService.java finalize L531-547、triggerDownstream L550-562 仅 triggerRuleEngine.fire(inst,now)。\n财务记账已实现(三选一): /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java confirmPay L76-91 → autoVoucher L113-124。\n成本超支仅读时告警非校验: /Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/web/AlertController.java L196-204 扫描已\"超支\"Budget 行。\n精度泄漏: TriggerRuleEngine.parseNumber L598-619 Double.parseDouble → ruleCreatePayment L166 Money.of(double amount)。" }, { "area": "逻辑链", "module": "跨模块数据自动采集(研发申报条件自查 + 研发费用归集证据链自动化)", "verdict": "PARTIAL", "gap": "真正打通的只是『R&D 中心内部三张兄弟表(费用/专利/申报)按 rdProjectId 的按需聚合』,且费用数据本身是人工录入。需求要的两件核心事都缺失:(1)『申报条件自查自动生成达标清单』——autoCheckRules 阈值串纯静态展示,没有任何代码去财务/HR 取实际研发费用占比、科技人员占比、高新收入占比并与阈值比对判达标;(2)『从财务/HR 模块自动取数』——Voucher/Invoice/HR 三模块数据从未被 join 进采集,所谓跨模块实为同一中心内自有表聚合。整条链是『一键查看证据包』而非『跨模块自动采集+条件自查达标判定』。无事件驱动联动(TriggerRuleEngine 无钩子)。", "severity": "high", "evidence": "研发证据链跨表自动归集(立项→费用→知产→申报):有;申报「数据采集」步骤一键自动填充:有;数据源真正跨财务/HR/知识产权模块(而非R&D中心自有表):部分;申报条件自查→生成达标清单(取实数比对阈值):缺;事件驱动自动联动(办结后下游自动取数):缺", "survives": true, "reNote": "缺口属实。我尽力在代码里寻找『申报条件自查达标判定』和『跨财务/HR自动取数』的实现,但两件核心事都确实不存在,整条链只是R&D中心内部三/四张兄弟表按rdProjectId的同库聚合。\n\n(1) autoCheckRules 纯静态:DeclarationTemplate.autoCheckRules 仅是逗号分隔字符串(domain第37行注释\"comma-separated list of system self-check rules\")。DataSeeder.java:2093 写入\"研发费用占比≥3%,科技人员占比≥10%,高新技术产品收入占比≥60%...\"这种阈值串;前端 dtemplates.vue:51 只把它 split 后渲染成 el-tag 标签展示。全后端 grep 不到任何把这些阈值解析、去财务/HR取实际占比、再与阈值比对判达标的代码——没有 selfCheck/eligibility/compliance/qualify 端点,没有占比计算,没有\"达标/不达标\"输出。\n\n(2) 跨模块自动采集名不副实:真正的\"自动采集\"实现是 DeclarationStepController.autoCollect (POST /declaration-steps/auto-collect/{declarationId}, 第102-129行)。它 resolve rdProjectId 后只做两件事:rdExpenseRepo.findByRdProjectId 求和 + patentRepo 计数,输出字符串\"已自动采集研发费用¥X、知识产权Y件\",把\"数据采集\"步骤标记为已完成。该控制器构造器只注入 stepRepo/declarationRepo/rdExpenseRepo/patentRepo——根本没有 VoucherRepository、InvoiceRepository 或任何 HR 仓库。EvidenceController(/rd-projects/{id}/evidence-chain) 同理,只折叠 RdProject 自己的 RdExpense/Patent/Declaration 三张表。Voucher/Invoice/HR(PersonnelCert/HealthRecord) 这些独立模块的数据从未被 join 进采集路径。RdExpense.voucher 只是个自由文本凭证号 String(domain第41行),不是对 Voucher 实体的外键。\n\n(3) 无事件驱动:TriggerRuleEngine grep 不到任何 declaration/rd/evidence/占比 钩子,办结联动里没有为研发费用归集或申报达标判定挂任何下游规则。\n\n整条链是『一键查看/汇总同中心证据包』而非需求要的『跨模块自动取数 + 条件自查达标判定』。判定 PARTIAL 成立,缺口属实。", "reEvidence": "后端: oa-backend/src/main/java/com/kaidi/oa/web/EvidenceController.java:54-88 (仅聚合RdExpense/Patent/Declaration三张兄弟表按rdProjectId,无Voucher/Invoice/HR); oa-backend/src/main/java/com/kaidi/oa/web/DeclarationStepController.java:102-129 (autoCollect只求和rdExpenseRepo+计数patentRepo并写汇总字符串,构造器无任何财务/HR仓库注入); oa-backend/src/main/java/com/kaidi/oa/domain/DeclarationTemplate.java:17,37 (autoCheckRules仅注释为comma-separated self-check rules字符串); oa-backend/src/main/java/com/kaidi/oa/web/DeclarationTemplateController.java:71 (只是setAutoCheckRules原样存取,无解析比对); oa-backend/src/main/java/com/kaidi/oa/seed/DataSeeder.java:2093 (阈值串\"研发费用占比≥3%,科技人员占比≥10%,高新技术产品收入占比≥60%\"纯种子数据); oa-backend/src/main/java/com/kaidi/oa/domain/RdExpense.java:41 (voucher是String自由文本非外键); oa-backend/src/main/java/com/kaidi/oa/service/TriggerRuleEngine.java (grep无declaration/rd/占比/达标钩子). 前端: ofbiz-framework/plugins/modern-ui/app/src/oa/pages/rd/dtemplates.vue:51 (autoCheckRules仅split成el-tag标签静态展示); ofbiz-framework/plugins/modern-ui/app/src/oa/api/rd.ts:4-20 (EvidenceChain类型仅expenses/patents/declarations,无voucher/invoice/hr/占比/达标字段). 全后端grep selfCheck/eligibility/compliance/qualify/达标判定+VoucherRepository/InvoiceRepository注入到RD路径:零命中。" }, { "area": "逻辑链", "module": "三系统数据打通(OA / 财务T+ / ERP 数据共享 + 支付中心写入财务/做账数据共享)", "verdict": "PARTIAL", "gap": "系统内的“支付中心→财务总账”自动做账链是真打通的(办结即回写合同+自动生成已记账凭证,幂等、事务、不可篡改、活体可复现)。但需求核心的“三系统(OA/财务T+/ERP)数据共享/对接”并未实现:DataSyncLog 只是手工增删查的同步台账框架,没有任何同步执行器/适配器/定时任务/外部系统连接,付款办结也只产出内部 Voucher 而不落任何 DataSyncLog;DataCenter 仅对 OA 自身库做只读聚合与治理扫描,非跨系统共享。代码与 Javadoc 自陈“实际同步通道属甲方集成口径,当前为台账记录框架”。活体验证 data-sync-logs 在办结后仍为 0。即:系统内打通=有;跨三系统对接同步=缺(占位台账)。", "severity": "high", "evidence": "支付中心→财务:付款办结后自动写入财务(做账数据共享,系统内):有;财务凭证不可篡改/账务可追溯(写入财务的一致性保护):有;统一数据中心:跨模块主数据/业务计数总览 + 治理扫描(数据共享视图):部分;OA↔财务T+↔ERP 三系统对接/同步通道(拉取/推送/双向真实同步):缺;同步自动联动留痕(办结触发同步并记录):缺;前端承载页与跳转:部分", "survives": true, "reNote": "缺口属实(PARTIAL 判定准确)。系统内\"支付中心→财务总账\"自动做账链确实是真打通的(活体已验证),但需求核心的\"三系统 OA/财务T+/ERP 数据共享/对接\"确实未实现,DataSyncLog 只是手工增删查的占位台账,跨系统同步执行链缺失。我尽力推翻但所有证据反向坐实了缺口。\n\n要点:(1) 全后端零 HTTP 客户端——grep RestTemplate/WebClient/HttpClient/FeignClient/java.net.http 全部 0 命中,没有任何外部系统连接;(2) 唯一的 @Scheduled 作业是 task/AlertScheduler.java,只做证件到期/超时预警,不是同步任务;无 executeSync/runSync/pushTo/pullFrom 等同步执行方法;(3) DataSyncLog 仅被其自身 controller/repository/domain 引用,DataSyncLogController 只有 list/create/delete 三个手工接口,是纯 append/list 台账;其 Javadoc 自陈\"实际同步通道...属甲方集成口径,当前为台账记录框架\";(4) PaymentService.confirmPay 只回写 contract.paidAmount + 生成内部 Voucher,从不写 DataSyncLog;(5) DataCenter 只对 OA 自身库做只读 count 聚合与重名/缺字段治理扫描,非跨系统共享;(6) \"用友/T+\" 关键词命中均为误报(GlobalExceptionHandler 的\"友好提示\";DataSeeder 把\"用友 U8+\"当作 IT 资产清单条目,非集成)。结论:系统内打通=有;跨三系统对接同步=缺(占位台账)。PARTIAL 成立。", "reEvidence": "活体验证(http://127.0.0.1:8091):登录后 GET /api/oa/data-sync-logs 办结前 count=0;POST /api/oa/payments/4/pay 把待付付款(金额1720000,关联合同1)办结为\"已付\",返回 code=0;办结后再查 data-sync-logs 仍 count=0(无任何同步日志产生);同时 GET /api/oa/vouchers 出现新凭证 id=43 {voucherNo:\"记-付款-4\", debitAccount:\"应付账款\", creditAccount:\"银行存款\", amount:1720000, status:\"已记账\", sourceType:\"payment\", sourceId:4}——证明内部做账链真打通、跨系统同步链确实空缺。\n\n代码证据:\n- oa-backend/src/main/java/com/kaidi/oa/domain/DataSyncLog.java:11-19 Javadoc 自陈\"实际同步通道...属甲方集成口径,当前为台账记录框架\"\n- oa-backend/src/main/java/com/kaidi/oa/web/DataSyncLogController.java:20-76 仅 list/create/delete 手工 CRUD\n- oa-backend/src/main/java/com/kaidi/oa/web/DataCenterController.java:34-44 Javadoc\"Read-only aggregation across existing master data / business repos\",仅 OA 自身库\n- oa-backend/src/main/java/com/kaidi/oa/service/PaymentService.java:76-94 confirmPay 只写 contract+Voucher,无 DataSyncLog\n- oa-backend/src/main/java/com/kaidi/oa/task/AlertScheduler.java 唯一 @Scheduled,做预警非同步\n- grep 全树:RestTemplate/WebClient/HttpClient/FeignClient/java.net.http = 0 命中;executeSync/runSync/pushTo/pullFrom = 0 命中;DataSyncLog 仅被 domain/repository/web(自身) 引用" } ], "critic": { "suspiciousMet": [ "市场部/分公司 (MET2) 与 市场部/办事处 (MET1):两者被判 MET,但后端不存在任何「分公司/办事处」域模型或数据隔离——grep 全仓 0 处分公司/办事处实体。两者实际共用同一套通用 CRM 端点(/customers /opportunities /opportunity-followups),分公司/办事处只是 opportunity 上一个自由文本 orgUnit 过滤参(经营部等),无机构级目录、无权限隔离、无独立台账。把同一通用 CRM 当作两个不同二级机构各记一次 MET,属重复计功,须重查这 3 个 MET 是否名实相符。", "制造管理中心/生物质肥料制造中心 (MET1):唯一 MET 立足于 work-orders+inventory 的扁平 CRUD,加一条「已入库工单→自动生成成品库存」联动(WorkOrderController.autoInventory)。但该联动是控制器内私有方法,不走 TriggerRuleEngine、无 ruleKey、无 AutomationLog 留痕、无幂等保护,与全系统其余 7 条正规链(payment.create/contract.effectivate 等)不同源;且 LOGIC7 声称的生产链(领料/MRP/质检流转)在引擎里 0 条 ruleKey 对应。该 MET 的「逻辑闭环」含金量存疑,宜按 PART 重核。", "工程管理中心/质安部 (MET0 但 PART5) 与 工程监理部 (PART0/MISS9):safety-checks/qms-records/supervision-logs 三表均为单表扁平 CRUD,把 5 类 logType(旁站/巡视/平行检验/监理通知/计量支付)与多类检查塞进一张表、无按类型的独立工作流、无与项目/审批引擎联动。监理被判 MISS9 方向上是对的,但反过来说明质安部的 5 个 PART 也多为「有表即判 PART」,须复核 PART 判定是否把单表 CRUD 误当功能覆盖。" ], "underCovered": [ "支付中心/结算中心(资金保障·结算复核 MET0/PART2/MISS4 与 财务部/支付中心 MET0/PART4/MISS5):付款单(payments)与资金池只读聚合(fund-pool)在,但全仓无 settlement/reconciliation/结算复核 端点,复核(双人/对账)工作流缺失;整条结算复核域覆盖明显不足,应补审 MISS 是否漏掉真实需求行。", "支付中心/金融办(贷款融资)PART0/MISS6:grep 全仓贷款/融资/金融办 0 命中,无任何后端控制器与实体,整个融资域为空白。被判全 MISS 方向正确,但作为一个完整二级机构零实现,需作为整域漏审项单列复核而非逐行 MISS。", "内控部/法务合规中心(legal):前端有 legal 模块条目,但后端无 legal-cases/compliance 等专属控制器,仅借用 Contract/Seal;前端列模块=有覆盖的假象需复核。法务合规与审计监察(audit-projects 单表 CRUD, MET0/MISS6)整体覆盖薄,建议整域补审。", "创新研发中心/知识产权部(MISS2/LOGIC8) 与 工程管理中心/专利工法办(MISS5/LOGIC3):patents/certifications 有数据,但 LOGIC8/LOGIC3 声称的专利申报-授权-工法转化链在 TriggerRuleEngine 里 0 条 ruleKey 对应,逻辑链多为纸面声明、引擎不实际触发,须复核这些 LOGIC 判定的真实性。", "运营管理中心/城镇污水(LOGIC7) 与 工业废水(LOGIC7) 运营中心:water-quality-records、water-traces 端点返回 404(控制器名在册但路由不通或未挂载),仅 wastewater-clients 可用;LOGIC7 的运营在线监测-超标预警-溯源链缺引擎支撑且核心读端点失效,整域覆盖与活性都不足,需重测端点连通性后补审。" ], "note": "审计方法:对 8091 活体逐端点取证 + 比对 ~90 控制器源码与 TriggerRuleEngine 实际 ruleKey。两条系统性偏差贯穿全表:(1) MET/PART 普遍把「单表扁平 CRUD+种子数据」当作功能覆盖,未校验是否实现需求行描述的真实工作流(按类型流转/复核/隔离),导致分公司=办事处=通用CRM 这类重复计功、以及监理/质安单表通吃多类业务。(2) 大量 LOGIC 分(运营/制造/知识产权 LOGIC7-8)缺引擎落地——全系统仅 7 条正规联动链(payment/contract/project/seal/supplier 周边),其余「逻辑链」无 ruleKey、不触发、无留痕,属纸面声明。另发现 water-quality-records / water-traces / crm 子路由等多个在册控制器返回 404,「控制器名在册」不等于「端点活」,建议覆盖统计中所有判 MET/PART 的项都补一次活体端点连通性核验。需求侧 29 机构/285 行中,融资、结算复核、法务合规三域为接近空白的整域漏洞,价值高于零散 MISS 行,应优先整域补审。" }, "summary": { "units": 29, "gapsTotal": 289, "survived": 272, "overturned": 8, "highMedReverified": 280 } }