export const meta = { name: 'erp-w3-buildable', description: 'W3:29机构并行补可建(内部逻辑)剩余缺口,把PARTIAL推向MET(新建文件+回传共享片段)', phases: [{ title: '补可建缺口' }], } const COMMON = `黄金模板:web/FinancingController.java、web/DevProjectController.java(状态机+审批自动展开)、聚合 web/FundPoolController.java、前端 oa/pages/payment/repayment.vue。 硬约束:①金额BigDecimal+com.kaidi.oa.common.Money(无裸double);②日期String+LocalDate/ChronoUnit;③控制器@RestController @RequestMapping("/api/oa/<资源>"),ApiResp.ok(),record请求体,NotFoundException/ApiException(400/409中文),状态迁移/级联@Transactional;④仓库extends JpaRepository派生查询;⑤前端真页接真后端(import { http },已解包ApiResp.data,token键oa.token;**http 删除用 http.del() 不是 http.delete()**;**el-table-column 插槽写 #default="{ row }" 或 #default="{ row }: { row: any }",绝不套外括号**);⑥无emoji(@element-plus/icons-vue)、无渐变(纯色蓝#2f6fed);⑦类名表名加域前缀,grep确认与现有~436控制器零撞名。 **关键纪律**:①**只新建文件**或改你机构自己的页;共享文件(AuthInterceptor/oaModules/TriggerRuleEngine/WorkflowService)不自改,放sharedFileSnippets;②不运行gradle/npm;③加法式不破坏现有链;④**逐文件自审Java语法**(import齐全[@PathVariable/@RequestBody/domain类]、ApiResp用record访问器.data()非.getData()、括号配平、record字段一致、实体setter存在)与**Vue语法**(插槽不套外括号、http.del、{row}加:{row:any})。` const RESULT = { type: 'object', additionalProperties: false, properties: { unit: { type: 'string' }, backendFiles: { type: 'array', items: { type: 'string' } }, frontendFiles: { type: 'array', items: { type: 'string' } }, authSensitiveRead: { type: 'array', items: { type: 'string' } }, 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'] } }, sharedFileSnippets: { type: 'array', items: { type: 'object', additionalProperties: false, properties: { file: { type: 'string' }, anchor: { type: 'string' }, change: { type: 'string' }, why: { type: 'string' } }, required: ['file', 'anchor', 'change', 'why'] } }, closedGaps: { type: 'array', items: { type: 'string' }, description: '本轮补完的缺口模块名' }, summary: { type: 'string' }, }, required: ['unit', 'backendFiles', 'frontendFiles', 'authSensitiveRead', 'navEntries', 'sharedFileSnippets', 'closedGaps', 'summary'], } const GAPS = '/Users/qiu/Desktop/ERP/requirements/_xlsx_audit_round3.json' const SLICE = '/Users/qiu/Desktop/ERP/requirements/_req_slices' const UNITS = [ ['创新研发中心','产品开发部','rd','01_创新研发中心__产品开发部'], ['创新研发中心','申报服务部','rd','02_创新研发中心__申报服务部'], ['创新研发中心','知识产权部','rd','03_创新研发中心__知识产权部'], ['创新研发中心','实验室','lab','04_创新研发中心__实验室'], ['设计研究中心','咨询可研院','design','05_设计研究中心__咨询可研院'], ['设计研究中心','规划设计部','design','06_设计研究中心__规划设计部'], ['设计研究中心','工程监理部','supervision','07_设计研究中心__工程监理部'], ['制造管理中心','环保设备制造中心','mfg','08_制造管理中心__环保设备制造中心'], ['制造管理中心','生物质肥料制造中心','mfg','09_制造管理中心__生物质肥料制造中心'], ['工程管理中心','质安部','ehs','10_工程管理中心__质安部'], ['工程管理中心','资料室','archive','11_工程管理中心__资料室'], ['工程管理中心','专利工法办','rd','12_工程管理中心__专利工法办'], ['工程管理中心','成本控制部','budget','13_工程管理中心__成本控制部'], ['运营管理中心','城镇污水运营中心','ops','14_运营管理中心__城镇污水运营中心'], ['运营管理中心','工业废水运营中心','ops','15_运营管理中心__工业废水运营中心'], ['市场部','经营部','crm','16_市场部__经营部'], ['市场部','办事处','crm','17_市场部__办事处'], ['市场部','分公司','crm','18_市场部__分公司'], ['支付中心','结算中心','payment','19_支付中心__结算中心'], ['支付中心','财务部','finance','20_支付中心__财务部'], ['支付中心','金融办','payment','21_支付中心__金融办'], ['内控部','法务风险部','legal','22_内控部__法务风险部'], ['内控部','审计监察部','audit','23_内控部__审计监察部'], ['品牌推广部','宣传部','culture','24_品牌推广部__宣传部'], ['品牌推广部','项目文化','culture','25_品牌推广部__项目文化'], ['行政','综合部','hr','26_行政__综合部'], ['行政','信息部','itasset','27_行政__信息部'], ['行政','办公室','admin','28_行政__办公室'], ['行政','后勤','admin','29_行政__后勤'], ] log(`W3:${UNITS.length} 机构补可建缺口`) phase('补可建缺口') const results = await parallel(UNITS.map(([dept, sub, mod, fn]) => () => agent( `你是资深全栈工程师,为凯迪 ERP【补完这个机构可建的剩余缺口】:${dept} / ${sub}。 第一步 运行 python3 读取本机构的剩余缺口(只取 buildable 内部逻辑类):python3 -c "import json;d=json.load(open('${GAPS}'));[print('-',g['module'],':',g['gap']) for g in d['buildable'] if '${sub}' in g['area']]" 第二步 Read 需求切片 ${SLICE}/${fn}.txt 对照。 第三步 grep/读码确认现状(本机构已有很多控制器),针对上面列出的【可建缺口】补实现:缺的状态机端点/甘特或日历聚合API/结构化字段/跨模块联动/自动触发/趋势分析端点等,新建实体+仓库+控制器(+服务)与真实前端页,把 PARTIAL 推向真正可用。**跳过需外部系统的**(真PKI电子签CA/BIM/CAD/NLP向量/IoT/JPush推送/外部对接)——那些非本轮目标。优先 high/med 缺口。 前端页挂模块 '${mod}'。 ${COMMON} 返回结构化结果(closedGaps列出补完的模块;导航 moduleId='${mod}')。`, { label: `W3:${sub}`, phase: '补可建缺口', schema: RESULT, model: 'sonnet' } ) )).then((a) => a.filter(Boolean)) return { built: results.length, total: UNITS.length, results }