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,派生查询如 findByStatus/findByXxxIdOrderBy...。 4. **绝不编辑共享文件**(AuthInterceptor.java / oaModules.ts / router)——只新建文件,并把需要加的鉴权前缀与导航条目以结构化结果回传,由主代理中央合并。 5. 前端真实页放 oa/pages//.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 }