SNAPSHOT W7 已部署稳定态 — 凯迪ERP+OA一体化平台 (MET 73.3%)
恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。 == 此快照内容 == - 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091) - 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static) - 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB) - 交接文档 go.md + go-code-reference/endpoints/entities/database.md - 多代理建设脚本 .claude/wf-*.js == 状态 == - 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板) - 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用 - W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成) - 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456 == 排除(gitignore, 可再生) == node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui) 完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules) 时间戳: 20260615-191517 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,312 @@
|
||||
export const meta = {
|
||||
name: 'erp-req-compliance-audit',
|
||||
description: 'ERP xlsx 需求 vs 现系统:三轮全量合规审计(功能覆盖/逻辑流程链/对抗复验)+完整性批判,产出合规报告与缺口清单',
|
||||
phases: [
|
||||
{ title: 'R1功能覆盖' },
|
||||
{ title: 'R1对抗验证' },
|
||||
{ title: 'R2逻辑流程链' },
|
||||
{ title: 'R3完整性批判' },
|
||||
{ title: 'R3缺口复验' },
|
||||
{ title: '汇总报告' },
|
||||
],
|
||||
}
|
||||
|
||||
// ---- 现系统实现面(给审计员定位用,避免空跑) ----
|
||||
const IMPL_MAP = `【前端模块 33(定义 ofbiz-framework/plugins/modern-ui/app/src/data/oaModules.ts,路由 src/router/,页面 src/oa/**、src/components/erp/**)】
|
||||
orgview组织视图 collab协同工作 appdev应用定制平台 report报表中心 goal目标管理 meeting会议管理 knowledge知识社区 doccollab文档协作 culture文化建设 hr-HR管理 masterdata主数据中心 contract合同中心 payment资金支付中心 sealcenter用章中心 archive档案知识中心 intel统一情报中心 crm统一CRM bidding统一招投标 ehs统一EHS rd研发创新中心 budget预算成本中心 datacenter数据中心 ops运营管理中心 mfg制造管理中心 finance财务管理 lab实验室 design设计研究中心 supervision工程监理 audit审计监察 itasset信息中心 admin行政后勤中心 legal法务合规中心 mobile移动工作台
|
||||
【后端控制器 ~90(oa-backend/src/main/java/com/kaidi/oa/web/*.java)】
|
||||
Account Alert Announcement AppMonitoring ArchiveComment Archive AuditProject Auth Automation BankAccount Bid BizRecord Blog BomAnalysis BomItem Budget BusinessBi Certification CollabDoc CompanySubject Contract ContractChange ContractMilestone ContractTemplate CostCenter CrawlJob CrawlSource Customer DataCenter DataSyncLog Declaration DeclarationStep DeclarationTemplate Delegation Dept DesignChange DesignDoc Discussion Document Evidence Expert Favorite Feed File Folder FormInstance FormTemplate FundPool Handover HealthRecord Intel InventoryItem Invoice ItAsset LabInstrument LabSample LeaderTrip Meeting MeetingMinute MeetingRoom Message Mobile Opportunity OpportunityFollowup Patent Payment PersonnelCert PolicyApplication Policy PriceItem Project ProjectTask QmsRecord RdExpense RdProject Report ReportDefinition Role SafetyCheck ScheduleEvent Seal SealUse Search Setting StandardCost Supervision Supplier Survey Task User Voucher WastewaterClient WaterQualityRecord WaterTrace WorkOrder WorkPlan
|
||||
【关键逻辑引擎】service/WorkflowService.java(审批流转/条件分支) service/TriggerRuleEngine.java(办结后下游自动联动) domain/AutomationLog(联动留痕)
|
||||
【活体】http://127.0.0.1:8091 登录 POST /api/oa/auth/login {"loginName":"admin","password":"123456"} 取 token,带 Authorization: Bearer <token>`
|
||||
|
||||
const REPO = `前端 ofbiz-framework/plugins/modern-ui/app/src ;后端 oa-backend/src/main/java/com/kaidi/oa`
|
||||
|
||||
// ---- schemas ----
|
||||
const FINDINGS = {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
dept: { type: 'string' }, suborg: { type: 'string' },
|
||||
modules: {
|
||||
type: 'array', items: {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
module: { type: 'string' },
|
||||
verdict: { type: 'string', enum: ['MET', 'PARTIAL', 'MISSING', 'LOGIC_GAP'] },
|
||||
evidence: { type: 'string', description: '具体文件:行/路由/控制器端点/实体字段;MISSING写"无"' },
|
||||
gap: { type: 'string', description: '缺什么或逻辑哪里不符;MET留空' },
|
||||
severity: { type: 'string', enum: ['none', 'low', 'med', 'high'] },
|
||||
},
|
||||
required: ['module', 'verdict', 'evidence', 'gap', 'severity'],
|
||||
},
|
||||
},
|
||||
summary: { type: 'string' },
|
||||
},
|
||||
required: ['dept', 'suborg', 'modules', 'summary'],
|
||||
}
|
||||
|
||||
const VERIFY = {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
revised: {
|
||||
type: 'array', items: {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
module: { type: 'string' },
|
||||
finalVerdict: { type: 'string', enum: ['MET', 'PARTIAL', 'MISSING', 'LOGIC_GAP'] },
|
||||
overturned: { type: 'boolean', description: '是否推翻初判' },
|
||||
evidence: { type: 'string' },
|
||||
gap: { type: 'string' },
|
||||
},
|
||||
required: ['module', 'finalVerdict', 'overturned', 'evidence', 'gap'],
|
||||
},
|
||||
},
|
||||
},
|
||||
required: ['revised'],
|
||||
}
|
||||
|
||||
const CHAIN = {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
chain: { type: 'string' },
|
||||
verdict: { type: 'string', enum: ['MET', 'PARTIAL', 'MISSING', 'LOGIC_GAP'] },
|
||||
steps: {
|
||||
type: 'array', items: {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
step: { type: 'string' },
|
||||
status: { type: 'string', enum: ['有', '部分', '缺'] },
|
||||
evidence: { type: 'string' },
|
||||
},
|
||||
required: ['step', 'status', 'evidence'],
|
||||
},
|
||||
},
|
||||
gap: { type: 'string' },
|
||||
severity: { type: 'string', enum: ['none', 'low', 'med', 'high'] },
|
||||
},
|
||||
required: ['chain', 'verdict', 'steps', 'gap', 'severity'],
|
||||
}
|
||||
|
||||
const CRITIC = {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
suspiciousMet: { type: 'array', items: { type: 'string' }, description: '被判 MET 但可疑、需重查的功能模块' },
|
||||
underCovered: { type: 'array', items: { type: 'string' }, description: '整体覆盖不足、需补审的机构/领域' },
|
||||
note: { type: 'string' },
|
||||
},
|
||||
required: ['suspiciousMet', 'underCovered', 'note'],
|
||||
}
|
||||
|
||||
const VERDICT = {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
real: { type: 'boolean', description: 'true=缺口属实(确实未实现/逻辑确缺);false=其实已实现,缺口不成立' },
|
||||
note: { type: 'string' },
|
||||
evidence: { type: 'string' },
|
||||
},
|
||||
required: ['real', 'note', 'evidence'],
|
||||
}
|
||||
|
||||
const REPORT = {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: {
|
||||
overallVerdict: { type: 'string' },
|
||||
coveragePct: { type: 'number' },
|
||||
counts: {
|
||||
type: 'object', additionalProperties: false,
|
||||
properties: { met: { type: 'number' }, partial: { type: 'number' }, missing: { type: 'number' }, logicGap: { type: 'number' } },
|
||||
required: ['met', 'partial', 'missing', 'logicGap'],
|
||||
},
|
||||
reportMarkdown: { type: 'string', description: '完整 markdown 合规报告(含覆盖统计、按机构表、5条流程链状态、按严重度的缺口清单、整改建议)' },
|
||||
},
|
||||
required: ['overallVerdict', 'coveragePct', 'counts', 'reportMarkdown'],
|
||||
}
|
||||
|
||||
// ---- 审计单元(29 个二级机构;各代理读自己的需求切片文件)----
|
||||
const SLICE_DIR = '/Users/qiu/Desktop/ERP/requirements/_req_slices'
|
||||
const units = [
|
||||
{ n: 1, dept: '创新研发中心', sub: '产品开发部', file: `${SLICE_DIR}/01_创新研发中心__产品开发部.txt` },
|
||||
{ n: 2, dept: '创新研发中心', sub: '申报服务部', file: `${SLICE_DIR}/02_创新研发中心__申报服务部.txt` },
|
||||
{ n: 3, dept: '创新研发中心', sub: '知识产权部', file: `${SLICE_DIR}/03_创新研发中心__知识产权部.txt` },
|
||||
{ n: 4, dept: '创新研发中心', sub: '实验室', file: `${SLICE_DIR}/04_创新研发中心__实验室.txt` },
|
||||
{ n: 5, dept: '设计研究中心', sub: '咨询可研院', file: `${SLICE_DIR}/05_设计研究中心__咨询可研院.txt` },
|
||||
{ n: 6, dept: '设计研究中心', sub: '规划设计部', file: `${SLICE_DIR}/06_设计研究中心__规划设计部.txt` },
|
||||
{ n: 7, dept: '设计研究中心', sub: '工程监理部', file: `${SLICE_DIR}/07_设计研究中心__工程监理部.txt` },
|
||||
{ n: 8, dept: '制造管理中心', sub: '环保设备制造中心', file: `${SLICE_DIR}/08_制造管理中心__环保设备制造中心.txt` },
|
||||
{ n: 9, dept: '制造管理中心', sub: '生物质肥料制造中心', file: `${SLICE_DIR}/09_制造管理中心__生物质肥料制造中心.txt` },
|
||||
{ n: 10, dept: '工程管理中心', sub: '质安部', file: `${SLICE_DIR}/10_工程管理中心__质安部.txt` },
|
||||
{ n: 11, dept: '工程管理中心', sub: '资料室', file: `${SLICE_DIR}/11_工程管理中心__资料室.txt` },
|
||||
{ n: 12, dept: '工程管理中心', sub: '专利工法办', file: `${SLICE_DIR}/12_工程管理中心__专利工法办.txt` },
|
||||
{ n: 13, dept: '工程管理中心', sub: '成本控制部', file: `${SLICE_DIR}/13_工程管理中心__成本控制部.txt` },
|
||||
{ n: 14, dept: '运营管理中心', sub: '城镇污水运营中心', file: `${SLICE_DIR}/14_运营管理中心__城镇污水运营中心.txt` },
|
||||
{ n: 15, dept: '运营管理中心', sub: '工业废水运营中心', file: `${SLICE_DIR}/15_运营管理中心__工业废水运营中心.txt` },
|
||||
{ n: 16, dept: '市场部', sub: '经营部', file: `${SLICE_DIR}/16_市场部__经营部.txt` },
|
||||
{ n: 17, dept: '市场部', sub: '办事处', file: `${SLICE_DIR}/17_市场部__办事处.txt` },
|
||||
{ n: 18, dept: '市场部', sub: '分公司', file: `${SLICE_DIR}/18_市场部__分公司.txt` },
|
||||
{ n: 19, dept: '支付中心', sub: '结算中心', file: `${SLICE_DIR}/19_支付中心__结算中心.txt` },
|
||||
{ n: 20, dept: '支付中心', sub: '财务部', file: `${SLICE_DIR}/20_支付中心__财务部.txt` },
|
||||
{ n: 21, dept: '支付中心', sub: '金融办', file: `${SLICE_DIR}/21_支付中心__金融办.txt` },
|
||||
{ n: 22, dept: '内控部', sub: '法务风险部', file: `${SLICE_DIR}/22_内控部__法务风险部.txt` },
|
||||
{ n: 23, dept: '内控部', sub: '审计监察部', file: `${SLICE_DIR}/23_内控部__审计监察部.txt` },
|
||||
{ n: 24, dept: '品牌推广部', sub: '宣传部', file: `${SLICE_DIR}/24_品牌推广部__宣传部.txt` },
|
||||
{ n: 25, dept: '品牌推广部', sub: '项目文化', file: `${SLICE_DIR}/25_品牌推广部__项目文化.txt` },
|
||||
{ n: 26, dept: '行政', sub: '综合部', file: `${SLICE_DIR}/26_行政__综合部.txt` },
|
||||
{ n: 27, dept: '行政', sub: '信息部', file: `${SLICE_DIR}/27_行政__信息部.txt` },
|
||||
{ n: 28, dept: '行政', sub: '办公室', file: `${SLICE_DIR}/28_行政__办公室.txt` },
|
||||
{ n: 29, dept: '行政', sub: '后勤', file: `${SLICE_DIR}/29_行政__后勤.txt` },
|
||||
]
|
||||
log(`审计单元 ${units.length} 个(二级机构);开始 R1 功能覆盖审计`)
|
||||
|
||||
function auditPrompt(u) {
|
||||
return `你是 ERP 需求合规审计员。审计单元:${u.dept} / ${u.sub}。
|
||||
第一步:用 Read 工具读取本单元的需求规格文件(xlsx 原文逐功能模块):${u.file}
|
||||
${IMPL_MAP}
|
||||
代码位置:${REPO}
|
||||
|
||||
任务:对该需求文件里【每一个功能模块(## 标题)】,判定现系统是否实现且逻辑正确。必须用 grep/读码找真实证据(文件:行 / 路由 / 控制器端点 / 实体字段 / 前端页面),可调活体接口佐证。判定档:
|
||||
- MET 完整实现且逻辑符合需求
|
||||
- PARTIAL 有页面/接口但只覆盖一部分子功能
|
||||
- LOGIC_GAP 有承载页但关键逻辑/自动联动/自动采集/校验缺失(表面有、逻辑空)
|
||||
- MISSING 无任何对应实现
|
||||
严禁臆测;找不到证据一律 MISSING。gap 写清缺什么。severity 按业务重要性(high/med/low/none)。需求文件里每个功能模块都要给一条结论。`
|
||||
}
|
||||
|
||||
function verifyPrompt(u, gaps) {
|
||||
return `对抗验证员。审计单元 ${u.dept}/${u.sub}。先 Read 需求切片文件:${u.file}
|
||||
下面是对若干功能模块的"非达标"初判,你的职责是**尽力反驳**——在代码里努力找出它其实已实现(可能换了名字/并入别的模块/在别的控制器)。能找到确凿证据就翻案(overturned=true)给出 finalVerdict 与 evidence;找不到则维持并确认 gap。
|
||||
【待验证初判】
|
||||
${gaps.map((g) => `- 【${g.module}】初判 ${g.verdict}:${g.gap}`).join('\n')}
|
||||
${IMPL_MAP}
|
||||
代码位置:${REPO}
|
||||
对每条给最终判定。基于真实代码,不放水也不冤枉。`
|
||||
}
|
||||
|
||||
// ===== R1: 功能覆盖审计 → 对抗验证(pipeline,无屏障)=====
|
||||
const r1 = await pipeline(
|
||||
units,
|
||||
(u) => agent(auditPrompt(u), { label: `审计:${u.sub}`, phase: 'R1功能覆盖', schema: FINDINGS, model: 'sonnet' }),
|
||||
(finding, u) => {
|
||||
if (!finding) return null
|
||||
const gaps = (finding.modules || []).filter((m) => m.verdict !== 'MET')
|
||||
if (!gaps.length) return finding
|
||||
return agent(verifyPrompt(u, gaps), { label: `验证:${u.sub}`, phase: 'R1对抗验证', schema: VERIFY, model: 'sonnet' })
|
||||
.then((v) => {
|
||||
if (v && Array.isArray(v.revised)) {
|
||||
const map = new Map(v.revised.map((r) => [r.module, r]))
|
||||
finding.modules = finding.modules.map((m) => {
|
||||
const r = map.get(m.module)
|
||||
return r ? { ...m, verdict: r.finalVerdict, evidence: r.evidence || m.evidence, gap: r.gap } : m
|
||||
})
|
||||
}
|
||||
return finding
|
||||
})
|
||||
}
|
||||
)
|
||||
const r1ok = r1.filter(Boolean)
|
||||
log(`R1 完成:${r1ok.length}/${units.length} 单元有结果`)
|
||||
|
||||
// ===== R2: 逻辑/流程链审计(xlsx 强调的"逻辑要求")=====
|
||||
const CHAINS = [
|
||||
{ key: '工程业务流程', desc: '查网→制作标书→开标→领取中标通知书→签订总包合同→施工前准备→施工图审查→材料等分包合同→办理施工许可证→季度考评→竣工备案→资料存档。逐环节核对是否有承载与流转。' },
|
||||
{ key: '合同流程', desc: '供应商入库→系统取模板合同(IT维护更新)→线上填写→自动化比对→合约部在线审核→进入OA审批→通知合同专员下载并上传盖章电子合同(电子签自动进入盖章系统)。重点查模板取用、自动化比对、用印联动。' },
|
||||
{ key: '资金确认', desc: '项目部向甲方请款→财务资金到账确认→开票→应付入账。查请款单、到账确认、发票、应付凭证联动。' },
|
||||
{ key: '支付流程', desc: '供应商→人材机审核确认→支付申请→打款→写入财务系统。查支付申请审批、打款、写财务。' },
|
||||
{ key: '资料流程', desc: '项目部→办事处→资料室→工程中心→法务→董事长→档案室。查多级流转归档链。' },
|
||||
{ key: '流程驱动/自动触发', desc: '数据中心统一数据库、流程驱动:条件生成后系统自动触发成本风险检查/生产排程/财务记账等后续流程(规范化/自动化/AI化)。重点查 TriggerRuleEngine 是否有真实下游联动规则。' },
|
||||
{ key: '跨模块数据自动采集', desc: '申报条件自查自动从财务/HR/知识产权/项目模块提取数据生成达标清单;研发费用归集证据链自动化。查是否真有跨模块自动取数而非人工录入。' },
|
||||
{ key: 'BOM差异自动核算', desc: '成控部:物料清单(BOM)差异能自动核算以控制成本。查 BomAnalysis/标准成本/实际对比逻辑。' },
|
||||
{ key: '三系统数据打通', desc: 'OA/财务T+/ERP 数据共享、财务系统打通(支付中心写入财务、做账数据共享)。查是否有数据同步/共享机制(DataSyncLog/DataCenter)。' },
|
||||
]
|
||||
log(`R2:逻辑/流程链审计 ${CHAINS.length} 条`)
|
||||
const r2 = await parallel(CHAINS.map((c) => () =>
|
||||
agent(
|
||||
`你是端到端逻辑链审计员。审计链:【${c.key}】。
|
||||
需求(xlsx):${c.desc}
|
||||
${IMPL_MAP}
|
||||
代码位置:${REPO}
|
||||
任务:在代码里逐环节核对该链是否端到端打通且具备自动联动。重点读 service/TriggerRuleEngine.java、service/WorkflowService.java、相关控制器的级联写入、前端承载页与跳转。给出每个环节 有/部分/缺 + 证据,并给整链 verdict(MET/PARTIAL/MISSING/LOGIC_GAP)+gap+severity。基于真实代码,不臆测。`,
|
||||
{ label: `链:${c.key}`, phase: 'R2逻辑流程链', schema: CHAIN, model: 'sonnet' }
|
||||
)
|
||||
)).then((a) => a.filter(Boolean))
|
||||
log(`R2 完成:${r2.length}/${CHAINS.length} 条链`)
|
||||
|
||||
// ===== 汇总缺口 =====
|
||||
const allGaps = []
|
||||
for (const f of r1ok) {
|
||||
for (const m of (f.modules || [])) {
|
||||
if (m.verdict !== 'MET') allGaps.push({ area: `${f.dept}/${f.suborg}`, module: m.module, verdict: m.verdict, gap: m.gap, severity: m.severity || 'low', evidence: m.evidence })
|
||||
}
|
||||
}
|
||||
for (const c of r2) {
|
||||
if (c.verdict !== 'MET') allGaps.push({ area: `逻辑链`, module: c.chain, verdict: c.verdict, gap: c.gap, severity: c.severity || 'med', evidence: (c.steps || []).map((s) => `${s.step}:${s.status}`).join(';') })
|
||||
}
|
||||
log(`累计缺口 ${allGaps.length} 条`)
|
||||
|
||||
// ===== R3a: 完整性批判 =====
|
||||
const coverageSummary = r1ok.map((f) => {
|
||||
const c = { MET: 0, PARTIAL: 0, MISSING: 0, LOGIC_GAP: 0 }
|
||||
for (const m of (f.modules || [])) c[m.verdict] = (c[m.verdict] || 0) + 1
|
||||
return `${f.dept}/${f.suborg}: MET${c.MET} PART${c.PARTIAL} MISS${c.MISSING} LOGIC${c.LOGIC_GAP}`
|
||||
}).join('\n')
|
||||
const critic = await agent(
|
||||
`你是合规审计的完整性批判员。下面是各机构覆盖统计与现系统实现面。请指出:(1) 哪些被判 MET 的领域可疑、需重查(suspiciousMet);(2) 哪些机构/领域整体覆盖明显不足、可能漏审(underCovered)。
|
||||
【覆盖统计】
|
||||
${coverageSummary}
|
||||
${IMPL_MAP}
|
||||
需求共 29 个二级机构、285 功能模块行 + 5 条业务流程链。只列真正存疑项。`,
|
||||
{ phase: 'R3完整性批判', schema: CRITIC, model: 'sonnet' }
|
||||
)
|
||||
|
||||
// ===== R3b: 对抗复验 high/med 缺口(尽力推翻)=====
|
||||
const hi = allGaps.filter((g) => g.severity === 'high' || g.severity === 'med')
|
||||
log(`R3 复验 high/med 缺口 ${hi.length} 条(对抗式尝试推翻)`)
|
||||
const reverified = await parallel(hi.map((g) => () =>
|
||||
agent(
|
||||
`对抗复验员。有人声称下面这条是系统缺口,你的职责是**尽力推翻它**——在代码里努力证明它其实已实现或逻辑其实存在。
|
||||
缺口:领域[${g.area}] 模块/链[${g.module}] 判定[${g.verdict}] 描述[${g.gap}]
|
||||
${IMPL_MAP}
|
||||
代码位置:${REPO}
|
||||
用 grep/读码彻查。real=true 表示确认缺口属实(找不到实现);real=false 表示其实已实现(给出证据)。`,
|
||||
{ label: `复验:${g.module}`, phase: 'R3缺口复验', schema: VERDICT, model: 'sonnet' }
|
||||
).then((v) => ({ ...g, survives: v ? v.real : true, reNote: v ? v.note : '复验失败默认保留', reEvidence: v ? v.evidence : '' }))
|
||||
)).then((a) => a.filter(Boolean))
|
||||
const survivedGaps = reverified.filter((g) => g.survives)
|
||||
const overturnedGaps = reverified.filter((g) => !g.survives)
|
||||
log(`复验结果:缺口属实 ${survivedGaps.length},被推翻(其实已实现) ${overturnedGaps.length}`)
|
||||
|
||||
// ===== 汇总报告 =====
|
||||
const counts = { met: 0, partial: 0, missing: 0, logicGap: 0 }
|
||||
for (const f of r1ok) for (const m of (f.modules || [])) {
|
||||
if (m.verdict === 'MET') counts.met++
|
||||
else if (m.verdict === 'PARTIAL') counts.partial++
|
||||
else if (m.verdict === 'MISSING') counts.missing++
|
||||
else if (m.verdict === 'LOGIC_GAP') counts.logicGap++
|
||||
}
|
||||
|
||||
const synthInput = {
|
||||
coverageSummary,
|
||||
counts,
|
||||
chains: r2.map((c) => ({ chain: c.chain, verdict: c.verdict, gap: c.gap })),
|
||||
critic,
|
||||
survivedGaps: survivedGaps.map((g) => ({ area: g.area, module: g.module, verdict: g.verdict, gap: g.gap, severity: g.severity })),
|
||||
overturnedCount: overturnedGaps.length,
|
||||
}
|
||||
const report = await agent(
|
||||
`你是首席合规审计官。基于以下三轮审计的汇总数据,产出一份权威《xlsx 需求合规审计报告》(中文 markdown)。
|
||||
要求报告包含:① 总体结论与合规率(coveragePct=MET/总模块行 估算);② 功能覆盖统计(MET/PARTIAL/LOGIC_GAP/MISSING 计数);③ 按二级机构覆盖表;④ 5 条业务流程链 + 4 项跨模块逻辑的达标状态;⑤ 经对抗复验仍属实的缺口清单(按 high→med→low 排序,含所在领域与缺什么);⑥ 完整性批判指出的存疑/欠审项;⑦ 整改优先级建议(先补 high)。客观、可执行、不夸大。
|
||||
【数据(JSON)】
|
||||
${JSON.stringify(synthInput).slice(0, 60000)}`,
|
||||
{ phase: '汇总报告', schema: REPORT, model: 'sonnet' }
|
||||
)
|
||||
|
||||
return {
|
||||
units: units.length,
|
||||
counts,
|
||||
chains: r2.map((c) => ({ chain: c.chain, verdict: c.verdict })),
|
||||
gapsTotal: allGaps.length,
|
||||
highMedReverified: reverified.length,
|
||||
survived: survivedGaps.length,
|
||||
overturned: overturnedGaps.length,
|
||||
critic,
|
||||
survivedGaps,
|
||||
report,
|
||||
}
|
||||
Reference in New Issue
Block a user