Files
ERP/.claude/wf-p0-build.js
T
QiufengandClaude Opus 4.8 5e51dc3f56 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>
2026-06-15 19:19:15 +08:00

102 lines
8.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const meta = {
name: 'erp-p0-domain-build',
description: 'P0 剩余4整域(工程监理/结算复核/法务合规/实验室)并行从0建:各建新后端+前端文件,回传集成片段',
phases: [
{ title: 'P0域并行建设' },
],
}
const REF = `黄金模板(照抄风格/约定)
- 后端实体 oa-backend/src/main/java/com/kaidi/oa/domain/Financing.java、RepaymentPlan.java
- 后端仓库 repository/FinancingRepository.java、RepaymentPlanRepository.java
- 后端控制器 web/FinancingController.java(CRUD + 业务动作 + 跨域联动 + @Transactional删除级联)
- 前端 ofbiz-framework/plugins/modern-ui/app/src/oa/pages/payment/financing.vue(MasterDataPage接真API)、repayment.vue(自定义联动页)
- 鉴权数组 config/AuthInterceptor.java 的 FINANCE_PREFIXES / SENSITIVE_READ_PREFIXES
- 路由约定 requirements/ROUTE-CONVENTION.md(前端只在 data/oaModules.ts 对应模块 children 加条目→路由自动生成)`
const RULES = `硬约束(务必遵守)
1. 金额一律 BigDecimal + com.kaidi.oa.common.Money.of()收口(无乘法用 BigDecimal.multiply 再 Money.of);日期字段用 String(YYYY-MM-DD),到期/天数算用 java.time.LocalDate/ChronoUnit。
2. 控制器 @RestController @RequestMapping("/api/oa/<资源复数>"),返回 com.kaidi.oa.common.ApiResp.ok(...);请求体用 record;找不到抛 com.kaidi.oa.common.NotFoundException,校验失败抛 com.kaidi.oa.common.ApiException(400,"中文")DELETE 加 @Transactional 且级联清子表(参考 Financing.delete)。
3. 仓库 extends org.springframework.data.jpa.repository.JpaRepository<X,Long>,派生查询如 findByStatus/findByXxxIdOrderBy...。
4. **绝不编辑共享文件**(AuthInterceptor.java / oaModules.ts / router)——只新建文件,并把需要加的鉴权前缀与导航条目以结构化结果回传,由主代理中央合并。
5. 前端真实页放 oa/pages/<moduleId>/<key>.vue:列表CRUD套 pages/masterdata/MasterDataPage.vue(传 load/create/update/remove,用 import { http } from '../../api/http'http.get/post/patch/del 已解包 ApiResp.data);联动/工作流类用 el-table+el-button 自定义页(参考 repayment.vue)。**绝不用 settingListStore 假数据**——必须接你新建的真后端。
6. 铁律:无 emoji(图标用 @element-plus/icons-vue)、无渐变色(纯色蓝主调)、排版/间距/承载形态慎重(美观+简单易用)。
7. 类名/表名按域加前缀避免与现有~90控制器/实体重名(先 grep 确认不撞名)。
8. **绝不运行 ./gradlew / npm(多域并行会争用同一构建目录与守护进程)**——只写文件并逐文件仔细自审语法(import 齐全、类型匹配、record 字段与用法一致、@Entity/@Table/getter-setter 完整),编译由主代理统一执行修错。`
const DOMAINS = [
{
key: 'supervision', name: '工程监理部', moduleId: 'supervision',
slice: '/Users/qiu/Desktop/ERP/requirements/_req_slices/07_设计研究中心__工程监理部.txt',
brief: `审计10行9MISS整域空白。建监理域:监理项目(SupervisionProject:编号/项目/合同/总监/规模/阶段/状态)、监理记录(SupervisionInspection:旁站/巡视/平行检验/监理通知 类型+部位+结论+问题+整改状态)、计量支付(MeasurementPayment:期次/申报量/核定金额/审批状态)、竣工验收(CompletionAcceptance)。与现有 Project、DesignDoc(图纸版本)、SafetyCheck/QmsRecord 关联(存 projectId/contractId 外键即可)。已有 web/SupervisionLogController/SupervisionController 勿覆盖,新建 SupervisionProjectController 等承载新实体。前端挂 supervision 模块。`,
},
{
key: 'settlement', name: '结算复核/资金风控(结算中心)', moduleId: 'payment',
slice: '/Users/qiu/Desktop/ERP/requirements/_req_slices/19_支付中心__结算中心.txt',
brief: `审计:无 settlement/reconciliation 端点、复核工作流缺。建:结算单(Settlement:类型 付款/收款/内部, 金额, 关联付款单/合同, 状态 待复核/复核中/已复核/已驳回, 复核人1 reviewer1, 复核人2 reviewer2 双人复核)+复核动作端点(/{id}/review 记录复核人与意见,双人复核齐才置已复核)、银行对账(Reconciliation:银行账户, 对账日, 银行流水余额, 账面余额, 差额自动算, 状态)、资金计划(FundPlan:期间/计划流入/计划流出/预测余额)。风控:大额(阈值,如>100万)与重复(同收款方同金额近7天)付款拦截——做一个 /settlements/risk-check 端点对一笔拟付款返回风险标记。银企直连标注为外部对接项(留接口不实做)。前端挂 payment 模块(结算复核/银行对账/资金计划 三页)。`,
},
{
key: 'legal', name: '法务合规/内控矩阵', moduleId: 'legal',
slice: '/Users/qiu/Desktop/ERP/requirements/_req_slices/22_内控部__法务风险部.txt',
brief: `审计:名为内控部却无内控矩阵,仅借用 Contract/Seal。建专属实体:合规义务库(ComplianceObligation:法规/义务/责任部门/到期/状态)、内控矩阵(InternalControlMatrix:流程/风险点/控制措施/控制类型 预防/检查/控制频率/责任人/有效性)、诉讼仲裁(LitigationCase:案号/案由/对方/我方角色 原告/被告/金额/阶段/承办律师/结果)、法律咨询(LegalConsult:咨询事项/部门/法律意见/状态)、风险评估(RiskAssessment:风险/可能性/影响/等级/应对)。各配控制器。前端挂 legal 模块(合规义务/内控矩阵/诉讼仲裁/法律咨询/风险评估 页)。`,
},
{
key: 'lab', name: '实验室', moduleId: 'lab',
slice: '/Users/qiu/Desktop/ERP/requirements/_req_slices/04_创新研发中心__实验室.txt',
brief: `审计:样品/任务/试剂/报告多数 MISSING。已有 LabSample/LabInstrument 控制器可复用关联,勿覆盖。新建:检测任务(TestTask:样品id/检测项目/方法/仪器/检测人/结果值/判定 合格-不合格-OOS偏差/状态)、检测方法库(TestMethod:方法编号/名称/标准依据/适用样品)、试剂耗材(Reagent:名称/批号/有效期/库存量/单位; 出入库扣减)、检测报告(TestReport:报告编号/样品/结论/模板/电子签名人/签发状态)。样品全流程状态流转(收样→分配→检测→复核→报告→留样/处置)在 TestTask/LabSample 状态字段体现。前端挂 lab 模块(检测任务/方法库/试剂耗材/检测报告 页)。`,
},
]
const RESULT = {
type: 'object', additionalProperties: false,
properties: {
domain: { type: 'string' },
backendFiles: { type: 'array', items: { type: 'string' } },
frontendFiles: { type: 'array', items: { type: 'string' } },
authFinancePrefixes: { type: 'array', items: { type: 'string' }, description: '需加入 FINANCE_PREFIXES 的 /api/oa/xxx(含金额/资金写口)' },
authSensitiveRead: { type: 'array', items: { type: 'string' }, description: '需加入 SENSITIVE_READ_PREFIXES 的 /api/oa/xxx(含金额/机密/PII读口)' },
navEntries: {
type: 'array', items: {
type: 'object', additionalProperties: false,
properties: {
moduleId: { type: 'string' },
items: {
type: 'array', items: {
type: 'object', additionalProperties: false,
properties: {
key: { type: 'string' }, label: { type: 'string' },
kind: { type: 'string' }, path: { type: 'string' },
},
required: ['key', 'label', 'kind', 'path'],
},
},
},
required: ['moduleId', 'items'],
},
},
endpoints: { type: 'array', items: { type: 'string' }, description: '关键端点(供活体冒烟)' },
compiles: { type: 'boolean', description: '是否已在本机 ./gradlew compileJava 自检通过' },
summary: { type: 'string' },
},
required: ['domain', 'backendFiles', 'frontendFiles', 'authFinancePrefixes', 'authSensitiveRead', 'navEntries', 'endpoints', 'compiles', 'summary'],
}
phase('P0域并行建设')
const results = await parallel(DOMAINS.map((d) => () =>
agent(
`你是资深全栈工程师,为凯迪 ERP 平台【从0建设一个整域】:${d.name}
第一步 Read 需求规格:${d.slice}
建设要点:${d.brief}
${REF}
${RULES}
交付:在仓库真实创建后端(实体/仓库/控制器)与前端页面文件并写入磁盘;前端页面必须接你新建的真后端 API。**不要运行 gradle/npm**(并行会争用构建),改为逐文件仔细自审语法。
返回结构化结果:列出新建文件、需主代理合并到 AuthInterceptor 的前缀、需加到 oaModules 对应模块的导航条目、关键端点、summary。compiles 字段填你"语法自审是否有把握"。`,
{ label: `建域:${d.key}`, phase: 'P0域并行建设', schema: RESULT }
)
)).then((a) => a.filter(Boolean))
return { built: results.length, results }