Files
ERP/.claude/wf-w3.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

87 lines
6.7 KiB
JavaScript
Raw 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-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 }