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

81 lines
7.9 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-fullbuild-w1',
description: '长尾全建W1:23个未建深的二级机构并行从0建缺失深水功能(新建文件+回传共享片段)',
phases: [{ title: '长尾机构并行建设' }],
}
const COMMON = `黄金模板(照抄风格):实体 domain/Financing.java、控制器 web/FinancingController.java(CRUD+业务动作+@Transactional级联)、服务 service/MrpService.java、聚合只读 web/FundPoolController.java(无实体跨表聚合)、前端 oa/pages/payment/financing.vue(MasterDataPage接真API)与 repayment.vue(自定义工作流页)。
硬约束:①金额一律BigDecimal+com.kaidi.oa.common.Money.of/add/sub/nz(无裸double算钱;乘法BigDecimal.multiply再Money.of);②日期String(YYYY-MM-DD),算天/折旧用java.time.LocalDate/ChronoUnit;③控制器@RestController @RequestMapping("/api/oa/<资源复数>"),返回com.kaidi.oa.common.ApiResp.ok(),请求体record,找不到抛com.kaidi.oa.common.NotFoundException,校验抛com.kaidi.oa.common.ApiException(400/409,中文),状态迁移/级联写@Transactional;④仓库extends org.springframework.data.jpa.repository.JpaRepository<X,Long>派生查询;⑤前端真实页接你的真后端(import { http } from 相对路径的 api/http;http.get/post/patch/del已解包ApiResp.data;token键oa.token),列表CRUD套 pages/masterdata/MasterDataPage.vue,工作流/联动/看板页用el-table+el-dialog+el-card自定义;**现有 settingListStore('xxx') 假数据页要改接你新建的真后端**;⑥无emoji(图标@element-plus/icons-vue)、无渐变(纯色蓝主调#2f6fed)、排版/间距/承载形态慎重(美观+简单易用);⑦类名/表名按域加前缀,先 grep 确认与现有~136控制器/实体零撞名。
**关键纪律**:①**只新建文件**或改你这个机构自己的页;凡需改共享文件(config/AuthInterceptor.java、data/oaModules.ts、service/TriggerRuleEngine.java、service/WorkflowService.java)一律**不自改**,放进 sharedFileSnippets(file+anchor原文+change改法+why)由主代理串行合并;②**不运行gradle/npm**(并行争用),逐文件仔细自审语法(import齐全/类型匹配/record字段一致/@Entity@Table+getter-setter完整/Vue标签与import配平);③加法式,绝不破坏现有7条联动链与审批流。`
const RESULT = {
type: 'object', additionalProperties: false,
properties: {
unit: { type: 'string' },
backendFiles: { type: 'array', items: { type: 'string' } },
frontendFiles: { type: 'array', items: { type: 'string' } },
authFinancePrefixes: { 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'] } },
endpoints: { type: 'array', items: { type: 'string' } },
summary: { type: 'string' },
},
required: ['unit', 'backendFiles', 'frontendFiles', 'authFinancePrefixes', 'authSensitiveRead', 'navEntries', 'sharedFileSnippets', 'endpoints', 'summary'],
}
const SLICE = '/Users/qiu/Desktop/ERP/requirements/_req_slices'
const UNITS = [
{ dept: '创新研发中心', sub: '产品开发部', mod: 'rd', file: `${SLICE}/01_创新研发中心__产品开发部.txt` },
{ dept: '创新研发中心', sub: '申报服务部', mod: 'rd', file: `${SLICE}/02_创新研发中心__申报服务部.txt` },
{ dept: '创新研发中心', sub: '知识产权部', mod: 'rd', file: `${SLICE}/03_创新研发中心__知识产权部.txt` },
{ dept: '设计研究中心', sub: '咨询可研院', mod: 'design', file: `${SLICE}/05_设计研究中心__咨询可研院.txt` },
{ dept: '设计研究中心', sub: '规划设计部', mod: 'design', file: `${SLICE}/06_设计研究中心__规划设计部.txt` },
{ dept: '制造管理中心', sub: '环保设备制造中心', mod: 'mfg', file: `${SLICE}/08_制造管理中心__环保设备制造中心.txt` },
{ dept: '制造管理中心', sub: '生物质肥料制造中心', mod: 'mfg', file: `${SLICE}/09_制造管理中心__生物质肥料制造中心.txt` },
{ dept: '工程管理中心', sub: '质安部', mod: 'ehs', file: `${SLICE}/10_工程管理中心__质安部.txt` },
{ dept: '工程管理中心', sub: '资料室', mod: 'archive', file: `${SLICE}/11_工程管理中心__资料室.txt` },
{ dept: '工程管理中心', sub: '专利工法办', mod: 'rd', file: `${SLICE}/12_工程管理中心__专利工法办.txt` },
{ dept: '工程管理中心', sub: '成本控制部', mod: 'budget', file: `${SLICE}/13_工程管理中心__成本控制部.txt` },
{ dept: '运营管理中心', sub: '城镇污水运营中心', mod: 'ops', file: `${SLICE}/14_运营管理中心__城镇污水运营中心.txt` },
{ dept: '运营管理中心', sub: '工业废水运营中心', mod: 'ops', file: `${SLICE}/15_运营管理中心__工业废水运营中心.txt` },
{ dept: '市场部', sub: '经营部', mod: 'crm', file: `${SLICE}/16_市场部__经营部.txt` },
{ dept: '市场部', sub: '办事处', mod: 'crm', file: `${SLICE}/17_市场部__办事处.txt` },
{ dept: '市场部', sub: '分公司', mod: 'crm', file: `${SLICE}/18_市场部__分公司.txt` },
{ dept: '内控部', sub: '审计监察部', mod: 'audit', file: `${SLICE}/23_内控部__审计监察部.txt` },
{ dept: '品牌推广部', sub: '宣传部', mod: 'culture', file: `${SLICE}/24_品牌推广部__宣传部.txt` },
{ dept: '品牌推广部', sub: '项目文化', mod: 'culture', file: `${SLICE}/25_品牌推广部__项目文化.txt` },
{ dept: '行政', sub: '综合部', mod: 'hr', file: `${SLICE}/26_行政__综合部.txt` },
{ dept: '行政', sub: '信息部', mod: 'itasset', file: `${SLICE}/27_行政__信息部.txt` },
{ dept: '行政', sub: '办公室', mod: 'admin', file: `${SLICE}/28_行政__办公室.txt` },
{ dept: '行政', sub: '后勤', mod: 'admin', file: `${SLICE}/29_行政__后勤.txt` },
]
log(`长尾全建W1${UNITS.length} 个机构并行建设`)
phase('长尾机构并行建设')
const results = await parallel(UNITS.map((u) => () =>
agent(
`你是资深全栈工程师,为凯迪 ERP 平台【把这个二级机构的深水功能从现状补建到真实可用】:${u.dept} / ${u.sub}
第一步 Read 需求规格:${u.file}
第二步 grep/读码盘点该机构现状(很可能只有扁平 CRUD 或 settingListStore 假数据页,缺真实工作流/状态机/自动联动/跨模块取数)。
第三步 建缺失的【深水功能】——为需求文件里每个功能模块补上它描述的真实能力(状态机流转/审批/自动计算/跨模块聚合取数/预警/台账),新建 实体+仓库+控制器(+服务) 与 真实前端页(接真后端);把现有 settingListStore 假数据页改接你的真后端。优先做该机构最核心、最能体现"真实工作流而非空壳"的 3-6 个模块,做深做真,而非每个模块都浅尝。
前端页挂到模块 '${u.mod}'(在 oaModules 对应模块加 children,作为 sharedFileSnippets 回传,不自改)。
${COMMON}
返回结构化结果:新建文件、需合并的鉴权前缀(含金额/机密读→authSensitiveRead;财务写→authFinancePrefixes)、导航条目(moduleId='${u.mod}')、共享文件片段、关键端点、summary(说明做深了哪几个模块)。`,
{ label: `建:${u.sub}`, phase: '长尾机构并行建设', schema: RESULT, model: 'sonnet' }
)
)).then((a) => a.filter(Boolean))
return { built: results.length, total: UNITS.length, results }