cdspec 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/AGENTS.md +14 -0
  2. package/CLAUDE.md +10 -0
  3. package/README.md +55 -0
  4. package/cdspec.config.yaml +34 -0
  5. package/dist/cli.js +94 -0
  6. package/dist/config/default.js +48 -0
  7. package/dist/config/loader.js +30 -0
  8. package/dist/config/path.js +11 -0
  9. package/dist/config/types.js +1 -0
  10. package/dist/skill-core/adapters/claudecode-adapter.js +35 -0
  11. package/dist/skill-core/adapters/codex-adapter.js +28 -0
  12. package/dist/skill-core/adapters/iflow-adapter.js +39 -0
  13. package/dist/skill-core/adapters/index.js +34 -0
  14. package/dist/skill-core/adapters/shared.js +36 -0
  15. package/dist/skill-core/agent-config.js +40 -0
  16. package/dist/skill-core/manifest-loader.js +63 -0
  17. package/dist/skill-core/scaffold.js +169 -0
  18. package/dist/skill-core/service.js +156 -0
  19. package/dist/skill-core/tool-interactions.js +70 -0
  20. package/dist/skill-core/types.js +1 -0
  21. package/dist/skill-core/validator.js +25 -0
  22. package/dist/task-core/parser.js +70 -0
  23. package/dist/task-core/service.js +28 -0
  24. package/dist/task-core/storage.js +159 -0
  25. package/dist/task-core/types.js +1 -0
  26. package/dist/utils/frontmatter.js +40 -0
  27. package/dist/utils/fs.js +37 -0
  28. package/package.json +29 -0
  29. package/src/cli.ts +105 -0
  30. package/src/config/default.ts +51 -0
  31. package/src/config/loader.ts +37 -0
  32. package/src/config/path.ts +13 -0
  33. package/src/config/types.ts +22 -0
  34. package/src/skill-core/adapters/claudecode-adapter.ts +45 -0
  35. package/src/skill-core/adapters/codex-adapter.ts +36 -0
  36. package/src/skill-core/adapters/iflow-adapter.ts +49 -0
  37. package/src/skill-core/adapters/index.ts +39 -0
  38. package/src/skill-core/adapters/shared.ts +45 -0
  39. package/src/skill-core/manifest-loader.ts +79 -0
  40. package/src/skill-core/scaffold.ts +192 -0
  41. package/src/skill-core/service.ts +199 -0
  42. package/src/skill-core/tool-interactions.ts +95 -0
  43. package/src/skill-core/types.ts +22 -0
  44. package/src/skill-core/validator.ts +28 -0
  45. package/src/task-core/parser.ts +89 -0
  46. package/src/task-core/service.ts +49 -0
  47. package/src/task-core/storage.ts +177 -0
  48. package/src/task-core/types.ts +15 -0
  49. package/src/types/yaml.d.ts +4 -0
  50. package/src/utils/frontmatter.ts +55 -0
  51. package/src/utils/fs.ts +41 -0
  52. package/templates/design-doc/SKILL.md +99 -0
  53. package/templates/design-doc/agents/openai.yaml +4 -0
  54. package/templates/design-doc/references//345/237/272/347/272/277/346/250/241/346/235/277.md +46 -0
  55. package/templates/design-doc/references//345/242/236/351/207/217/351/234/200/346/261/202/346/250/241/346/235/277.md +32 -0
  56. package/templates/design-doc/references//345/275/222/346/241/243/346/243/200/346/237/245/346/270/205/345/215/225.md +15 -0
  57. package/templates/design-doc/references//347/224/237/344/272/247/345/267/245/345/215/225/345/237/272/347/272/277/347/244/272/344/276/213.md +470 -0
  58. package/templates/design-doc/scripts/validate_doc_layout.sh +49 -0
  59. package/templates/frontend-develop-standard/SKILL.md +63 -0
  60. package/templates/frontend-develop-standard/agents/openai.yaml +4 -0
  61. package/templates/frontend-develop-standard/references/frontend_develop_standard.md +749 -0
  62. package/templates/standards-backend/SKILL.md +55 -0
  63. package/templates/standards-backend/agents/openai.yaml +4 -0
  64. package/templates/standards-backend/references/DDD/346/236/266/346/236/204/347/272/246/346/235/237.md +103 -0
  65. package/templates/standards-backend/references/JUC/345/271/266/345/217/221/350/247/204/350/214/203.md +232 -0
  66. package/templates/standards-backend/references//344/274/240/347/273/237/344/270/211/345/261/202/346/236/266/346/236/204/347/272/246/346/235/237.md +35 -0
  67. package/templates/standards-backend/references//345/220/216/347/253/257/345/274/200/345/217/221/350/247/204/350/214/203.md +49 -0
  68. package/templates/standards-backend/references//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +116 -0
  69. package/templates/standards-backend/references//350/256/276/350/256/241/346/250/241/345/274/217/350/220/275/345/234/260/346/211/213/345/206/214.md +395 -0
  70. package/tests/skill.test.ts +191 -0
  71. package/tests/task.test.ts +55 -0
  72. package/tsconfig.json +16 -0
  73. package/vitest.config.ts +9 -0
@@ -0,0 +1,470 @@
1
+ # 生产工单老代码详细设计(精简版)
2
+
3
+ > 目标:只保留开发最需要的信息,聚焦数据库设计、关键接口、关键方法伪代码。
4
+
5
+ ## 1. 文档信息
6
+
7
+ | 项目 | 内容 |
8
+ |---|---|
9
+ | 文档版本 | v1.3.1 |
10
+ | 日期 | 2026-03-06 |
11
+ | 业务范围 | 生产工单主链路(下推、下达、开工、暂停、完工、反完工) |
12
+
13
+ ## 2. 数据库设计
14
+
15
+ ### 2.1 核心表字段
16
+
17
+ #### `product_work_order`(生产工单主表)
18
+
19
+ | 字段 | 类型 | 非空 | 默认值 | 字典项key | 说明 |
20
+ |---|---|---|---|---|---|
21
+ | `id` | varchar(36) | Y | - | - | 主键 |
22
+ | `work_order_code` | varchar(64) | Y | - | - | 工单号(租户内唯一) |
23
+ | `work_order_status` | varchar(32) | Y | - | `work_order_status` | 工单状态 |
24
+ | `production_order_id` | varchar(36) | Y | - | - | 所属生产订单ID |
25
+ | `order_number` | varchar(64) | Y | - | - | 订单号 |
26
+ | `source_id` | varchar(36) | N | null | - | 来源工序ID |
27
+ | `process_id` | varchar(36) | Y | - | - | 工序ID |
28
+ | `process_code` | varchar(64) | Y | - | - | 工序编码 |
29
+ | `production_line_code` | varchar(64) | N | null | - | 产线编码 |
30
+ | `classes_code` | varchar(64) | N | null | - | 班次编码 |
31
+ | `work_order_num` | decimal(18,4) | Y | 0 | - | 工单数量 |
32
+ | `product_num` | decimal(18,4) | Y | 0 | - | 已生产数量 |
33
+ | `release_time` | datetime | N | null | - | 下达时间 |
34
+ | `actual_start_time` | datetime | N | null | - | 开工时间 |
35
+ | `actual_end_time` | datetime | N | null | - | 完工时间 |
36
+ | `previous_state` | varchar(16) | N | null | `work_order_previous_state` | 前序状态 |
37
+ | `dependent_process` | varchar(255) | N | null | - | 依赖工序 |
38
+ | `tenant_id` | int | Y | - | - | 租户ID |
39
+ | `del_flag` | tinyint | Y | 0 | `del_flag` | 逻辑删除 |
40
+ | `createBy` | varchar(64) | N | null | - | 创建人 |
41
+ | `createTime` | datetime | N | null | - | 创建时间 |
42
+ | `updateBy` | varchar(64) | N | null | - | 更新人 |
43
+ | `updateTime` | datetime | N | null | - | 更新时间 |
44
+ | `sys_org_code` | varchar(64) | N | null | - | 所属组织编码 |
45
+
46
+ `product_work_order` 索引与约束
47
+ 1. `PRIMARY KEY (id)`。
48
+ 2. `UNIQUE uk_work_order_code(work_order_code)`。
49
+ 3. `INDEX idx_wo_production_order_id(production_order_id)`。
50
+ 4. `INDEX idx_wo_source_id(source_id)`。
51
+
52
+ #### `product_process`(生产工序)
53
+
54
+ | 字段 | 类型 | 非空 | 默认值 | 字典项key | 说明 |
55
+ |---|---|---|---|---|---|
56
+ | `id` | varchar(36) | Y | - | - | 工序ID |
57
+ | `production_order_id` | varchar(36) | Y | - | - | 订单ID |
58
+ | `process_id` | varchar(36) | Y | - | - | 工序主数据ID |
59
+ | `process_code` | varchar(64) | Y | - | - | 工序编码 |
60
+ | `un_planned_production_num` | decimal(18,4) | Y | 0 | - | 待排数量 |
61
+ | `planned_production_num` | decimal(18,4) | Y | 0 | - | 已排数量 |
62
+ | `un_release_production_num` | decimal(18,4) | Y | 0 | - | 待下达数量 |
63
+ | `production_line_code` | varchar(64) | N | null | - | 产线编码 |
64
+ | `del_flag` | tinyint | Y | 0 | `del_flag` | 逻辑删除 |
65
+ | `createBy` | varchar(64) | N | null | - | 创建人 |
66
+ | `createTime` | datetime | N | null | - | 创建时间 |
67
+ | `updateBy` | varchar(64) | N | null | - | 更新人 |
68
+ | `updateTime` | datetime | N | null | - | 更新时间 |
69
+ | `sys_org_code` | varchar(64) | N | null | - | 所属组织编码 |
70
+
71
+ `product_process` 索引与约束
72
+ 1. `PRIMARY KEY (id)`。
73
+ 2. `INDEX idx_process_production_order_id(production_order_id)`。
74
+
75
+ #### `product_order`(生产订单)
76
+
77
+ | 字段 | 类型 | 非空 | 默认值 | 字典项key | 说明 |
78
+ |---|---|---|---|---|---|
79
+ | `id` | varchar(36) | Y | - | - | 订单ID |
80
+ | `order_number` | varchar(64) | Y | - | - | 订单号 |
81
+ | `product_status` | varchar(32) | Y | - | `product_order_status` | 订单状态 |
82
+ | `product_plan_status` | varchar(32) | Y | - | `product_plan_status` | 排产状态 |
83
+ | `priority` | int | N | null | - | 优先级 |
84
+ | `tenant_id` | int | Y | - | - | 租户ID |
85
+ | `del_flag` | tinyint | Y | 0 | `del_flag` | 逻辑删除 |
86
+ | `createBy` | varchar(64) | N | null | - | 创建人 |
87
+ | `createTime` | datetime | N | null | - | 创建时间 |
88
+ | `updateBy` | varchar(64) | N | null | - | 更新人 |
89
+ | `updateTime` | datetime | N | null | - | 更新时间 |
90
+ | `sys_org_code` | varchar(64) | N | null | - | 所属组织编码 |
91
+
92
+ `product_order` 索引与约束
93
+ 1. `PRIMARY KEY (id)`。
94
+
95
+ ### 2.2 字典项说明(集中查看)
96
+
97
+ | 字典项key | 字典值 |
98
+ |---|---|
99
+ | `work_order_status` | `PLANNED` 已排、`ISSUED` 已下达、`STARTED` 已开工、`PRODUCTING` 生产中、`SUSPEND` 暂停、`FINISHED` 完工 |
100
+ | `work_order_previous_state` | `READY` 前序已就绪、`UNREADY` 前序未就绪 |
101
+ | `product_order_status` | `DRAFT`,`SUBMIT`,`AUDITED`,`PLANNED`,`INPRODUCTION`,`CLOSED`,`FINISH` |
102
+ | `product_plan_status` | `ALL_PLANNED`,`PART_PLANNED`,`ALL_UNPLANNED` |
103
+ | `del_flag` | `0` 未删除、`1` 已删除 |
104
+
105
+ ## 3. 关键前后端接口定义(JSON 示例)
106
+
107
+ > 控制器前缀:`/product/productWorkOrder`。
108
+ > 返回统一包装:`Result<T>`。
109
+
110
+ ### 3.1 查询待排工序 `GET /queryUnPlanedProcessList`
111
+
112
+ 入参示例(Query)
113
+
114
+ ```jsonc
115
+ {
116
+ "orderIds": "orderId1,orderId2", // 可选:订单ID串,逗号分隔
117
+ "productionLineCode": "LINE-01" // 可选:产线编码
118
+ }
119
+ ```
120
+
121
+ 出参示例(`Result<List<UnPlanedProcessVO>>`)
122
+
123
+ ```jsonc
124
+ {
125
+ "success": true,
126
+ "result": [
127
+ {
128
+ "id": "processRowId", // 工序记录ID
129
+ "processId": "processId", // 工序ID
130
+ "processCode": "GX-001", // 工序编码
131
+ "unPlannedProductionNum": 120.0, // 待排数量
132
+ "productionLineCode": "LINE-01", // 产线编码
133
+ "productionLineName": "一号线", // 产线名称
134
+ "processName": "切割", // 工序名称
135
+ "orderNumber": "MO-20260306-001" // 订单号
136
+ }
137
+ ]
138
+ }
139
+ ```
140
+
141
+ ### 3.2 下推已排 `POST /pushDown`
142
+
143
+ 入参示例(Body: `ReqBaseSingleVO`)
144
+
145
+ ```jsonc
146
+ {
147
+ "ids": "processId1,processId2" // 必填:待下推工序ID串
148
+ }
149
+ ```
150
+
151
+ 出参示例(`Result<String>`)
152
+
153
+ ```jsonc
154
+ {
155
+ "success": true,
156
+ "result": "下推已排成功!"
157
+ }
158
+ ```
159
+
160
+ ### 3.3 查询已排/已下达 `GET /queryPlanedProcessList`
161
+
162
+ 入参示例(Query)
163
+
164
+ ```jsonc
165
+ {
166
+ "orderIds": "orderId1,orderId2", // 可选:订单ID串
167
+ "productionLineCode": "LINE-01", // 可选:产线编码
168
+ "workOrderStatus": "PLANNED", // 可选:工单状态
169
+ "queryStartTime": "2026-03-01 00:00:00", // 可选:查询开始时间
170
+ "queryEndTime": "2026-03-31 23:59:59", // 可选:查询结束时间
171
+ "pageNo": 1, // 可选:默认1
172
+ "pageSize": 10 // 可选:默认10
173
+ }
174
+ ```
175
+
176
+ 出参示例(`Result<IPage<PlanedProcessVO>>`)
177
+
178
+ ```jsonc
179
+ {
180
+ "success": true,
181
+ "result": {
182
+ "records": [
183
+ {
184
+ "id": "workOrderId", // 工单ID
185
+ "workOrderCode": "WO-20260306-001", // 工单号
186
+ "workOrderStatus": "PLANNED", // 工单状态
187
+ "workOrderNum": 100.0, // 工单数量
188
+ "productionLineCode": "LINE-01", // 产线编码
189
+ "classesCode": "SHIFT-A" // 班次编码
190
+ }
191
+ ],
192
+ "total": 1
193
+ }
194
+ }
195
+ ```
196
+
197
+ ### 3.4 已排产下达 `POST /release`
198
+
199
+ 入参示例(Body: `ReqPlanedProcessQueryVO`)
200
+
201
+ ```jsonc
202
+ {
203
+ "ids": "workOrderId1,workOrderId2", // 必填:待下达工单ID串
204
+ "orderIds": "orderId1,orderId2", // 可选:订单过滤
205
+ "productionLineCode": "LINE-01" // 可选:产线过滤
206
+ }
207
+ ```
208
+
209
+ 出参示例(`Result<String>`)
210
+
211
+ ```jsonc
212
+ {
213
+ "success": true,
214
+ "result": "下达成功!"
215
+ }
216
+ ```
217
+
218
+ ### 3.5 工单开工 `POST /beginOrder`
219
+
220
+ 入参示例(Body: `ProductWorkOrder` 关键字段)
221
+
222
+ ```jsonc
223
+ {
224
+ "id": "workOrderId", // 必填:工单ID
225
+ "workGroupPerson": "张三,李四" // 可选:班组人员
226
+ }
227
+ ```
228
+
229
+ 出参示例(`Result<Void>`)
230
+
231
+ ```jsonc
232
+ {
233
+ "success": true,
234
+ "result": null
235
+ }
236
+ ```
237
+
238
+ ### 3.6 工单暂停 `GET /stopOrder`
239
+
240
+ 入参示例(Query)
241
+
242
+ ```jsonc
243
+ {
244
+ "id": "workOrderId" // 必填:工单ID
245
+ }
246
+ ```
247
+
248
+ 出参示例(`Result<Void>`)
249
+
250
+ ```jsonc
251
+ {
252
+ "success": true,
253
+ "result": null
254
+ }
255
+ ```
256
+
257
+ ### 3.7 工单完工 `GET /finishProductWorkOrder`
258
+
259
+ 入参示例(Query)
260
+
261
+ ```jsonc
262
+ {
263
+ "id": "workOrderId" // 必填:工单ID
264
+ }
265
+ ```
266
+
267
+ 出参示例(`Result<String>`)
268
+
269
+ ```jsonc
270
+ {
271
+ "success": true,
272
+ "result": "完工成功"
273
+ }
274
+ ```
275
+
276
+ ### 3.8 工单反完工 `GET /reverseCompletionOrder`
277
+
278
+ 入参示例(Query)
279
+
280
+ ```jsonc
281
+ {
282
+ "id": "workOrderId" // 必填:工单ID
283
+ }
284
+ ```
285
+
286
+ 出参示例(`Result<Void>`)
287
+
288
+ ```jsonc
289
+ {
290
+ "success": true,
291
+ "result": null
292
+ }
293
+ ```
294
+
295
+ ### 3.9 工单详情 `GET /queryById`
296
+
297
+ 入参示例(Query)
298
+
299
+ ```jsonc
300
+ {
301
+ "id": "workOrderId" // 必填:工单ID
302
+ }
303
+ ```
304
+
305
+ 出参示例(`Result<ProductWorkOrderVO>` 关键字段)
306
+
307
+ ```jsonc
308
+ {
309
+ "success": true,
310
+ "result": {
311
+ "id": "workOrderId", // 工单ID
312
+ "workOrderCode": "WO-20260306-001", // 工单号
313
+ "workOrderStatus": "ISSUED", // 工单状态
314
+ "orderNumber": "MO-20260306-001", // 订单号
315
+ "workOrderNum": 100.0, // 工单数量
316
+ "productionLineCode": "LINE-01", // 产线编码
317
+ "classesCode": "SHIFT-A" // 班次编码
318
+ }
319
+ }
320
+ ```
321
+
322
+ ## 4. 关键方法清单(用于代码对照)
323
+
324
+ | 中文动作 | 英文方法名(开发使用) | 建议方法签名 |
325
+ |---|---|---|
326
+ | 下推已排 | `pushPlannedProcesses` | `void pushPlannedProcesses(PushPlannedProcessesCmd cmd)` |
327
+ | 工单下达 | `releaseWorkOrders` | `void releaseWorkOrders(ReleaseWorkOrdersCmd cmd)` |
328
+ | 工单开工 | `startWorkOrder` | `void startWorkOrder(StartWorkOrderCmd cmd)` |
329
+ | 工单暂停 | `suspendWorkOrder` | `void suspendWorkOrder(SuspendWorkOrderCmd cmd)` |
330
+ | 工单完工 | `completeWorkOrder` | `void completeWorkOrder(CompleteWorkOrderCmd cmd)` |
331
+ | 反完工 | `reverseWorkOrderCompletion` | `void reverseWorkOrderCompletion(ReverseWorkOrderCompletionCmd cmd)` |
332
+
333
+ ## 5. 关键方法伪代码
334
+
335
+ ### 5.1 `pushPlannedProcesses`(下推已排)
336
+
337
+ **方法目的**:把待排工序转成工单,并确保“建工单 + 扣待排 + 刷订单排产状态”一致。
338
+
339
+ ```text
340
+ # 1) 遍历待下推工序
341
+ for each processId in cmd.processIds:
342
+ # 2) 查询工序并校验
343
+ process = processRepository.getById(processId)
344
+ assert process 存在
345
+ assert process.productionLineCode 非空
346
+ assert process.unPlannedProductionNum > 0
347
+
348
+ # 3) 查询订单并创建工单
349
+ order = orderRepository.getById(process.productionOrderId)
350
+ workOrder = workOrderFactory.buildFromProcess(process, order)
351
+ workOrder.status = PLANNED
352
+ workOrderRepository.save(workOrder)
353
+
354
+ # 4) 扣减待排量(原值条件更新,防并发)
355
+ affected = processRepository.decreaseUnplannedQuantity(
356
+ process.id,
357
+ expected = process.unPlannedProductionNum,
358
+ delta = process.unPlannedProductionNum
359
+ )
360
+ if affected == 0:
361
+ throw BizException("待排数量变化,请刷新重试")
362
+
363
+ # 5) 刷新订单排产状态
364
+ orderDomainService.refreshPlanStatus(relatedOrderIds)
365
+ ```
366
+
367
+ ### 5.2 `releaseWorkOrders`(工单下达)
368
+
369
+ **方法目的**:按顺序下达工单,状态变更为 ISSUED,并回写待下达数量。
370
+
371
+ ```text
372
+ # 1) 读取可下达有序列表
373
+ ordered = workOrderRepository.listPlannedInOrder(cmd.orderIds)
374
+
375
+ # 2) 校验请求是否“从第一个开始连续下达”
376
+ assert cmd.workOrderIds == firstN(ordered, size(cmd.workOrderIds)).ids
377
+
378
+ # 3) 执行下达
379
+ for each workOrderId in cmd.workOrderIds:
380
+ wo = workOrderRepository.getById(workOrderId)
381
+ assert wo.status == PLANNED
382
+ assert wo.classesCode 非空
383
+
384
+ wo.status = ISSUED
385
+ wo.releaseTime = now
386
+ workOrderRepository.save(wo)
387
+
388
+ # 回写工序待下达
389
+ processRepository.decreaseUnreleasedQuantity(wo.sourceId, wo.workOrderNum)
390
+
391
+ # 租户策略扩展
392
+ policyFactory.getPolicy(wo.tenantId).afterRelease(wo)
393
+ ```
394
+
395
+ ### 5.3 `startWorkOrder`(工单开工)
396
+
397
+ **方法目的**:工单进入生产执行态,并把订单状态联动到生产中。
398
+
399
+ ```text
400
+ # 1) 查询工单
401
+ wo = workOrderRepository.getById(cmd.workOrderId)
402
+
403
+ # 2) 状态机校验并流转
404
+ if wo.status == ISSUED:
405
+ wo.status = tenantPolicy.startStatus(wo.tenantId) # STARTED 或 PRODUCTING
406
+ wo.actualStartTime = now
407
+ else if wo.status == SUSPEND:
408
+ wo.status = PRODUCTING
409
+ else:
410
+ throw BizException("当前状态不允许开工")
411
+
412
+ # 3) 保存工单
413
+ workOrderRepository.save(wo)
414
+
415
+ # 4) 订单联动
416
+ order = orderRepository.getByOrderNumber(wo.orderNumber)
417
+ order.status = INPRODUCTION
418
+ orderRepository.save(order)
419
+ ```
420
+
421
+ ### 5.4 `completeWorkOrder`(工单完工)
422
+
423
+ **方法目的**:完工前做质检校验,完工后联动订单状态与后序工单前序状态。
424
+
425
+ ```text
426
+ # 1) 查询工单
427
+ wo = workOrderRepository.getById(cmd.workOrderId)
428
+ assert wo.status != FINISHED
429
+
430
+ # 2) 质检校验
431
+ process = processRepository.getById(wo.sourceId)
432
+ if process.requiresQualityCheck and wo.tenantId != YHC:
433
+ hasDetecting = reportRepository.existsDetectingOrNullResult(wo.id)
434
+ if hasDetecting:
435
+ throw BizException("需质检合格后才能完工")
436
+
437
+ # 3) 更新完工
438
+ wo.status = FINISHED
439
+ wo.actualEndTime = now
440
+ workOrderRepository.save(wo)
441
+
442
+ # 4) 订单与后序联动
443
+ orderDomainService.tryMarkFinished(wo.productionOrderId)
444
+ workOrderDomainService.refreshDependentPreviousState(wo.orderNumber)
445
+
446
+ # 5) 租户后置动作
447
+ policyFactory.getPolicy(wo.tenantId).afterComplete(wo)
448
+ ```
449
+
450
+ ### 5.5 `reverseWorkOrderCompletion`(工单反完工)
451
+
452
+ **方法目的**:将强制完工后的工单回退到完工前状态。
453
+
454
+ ```text
455
+ # 1) 查询工单
456
+ wo = workOrderRepository.getById(cmd.workOrderId)
457
+
458
+ # 2) 校验可反完工
459
+ if wo.compulsionFinishStatus is null:
460
+ throw BizException("当前工单不允许反完工")
461
+
462
+ # 3) 回退工单状态
463
+ wo.status = wo.compulsionFinishStatus
464
+ workOrderRepository.save(wo)
465
+
466
+ # 4) 回退订单状态
467
+ order = orderRepository.getByOrderNumber(wo.orderNumber)
468
+ order.status = INPRODUCTION
469
+ orderRepository.save(order)
470
+ ```
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # 用途:校验某业务是否符合 design-doc-lifecycle 的目录硬约束
5
+ # 用法:./scripts/validate_doc_layout.sh 生产订单
6
+
7
+ if [[ $# -ne 1 ]]; then
8
+ echo "用法: $0 <业务名>" >&2
9
+ exit 2
10
+ fi
11
+
12
+ business="$1"
13
+ business_dir="docs/${business}"
14
+ baseline_file="${business_dir}/baseline-${business}.md"
15
+ feature_dir="${business_dir}/feature"
16
+ archive_file="${business_dir}/archive-log.md"
17
+
18
+ if [[ ! -d "${business_dir}" ]]; then
19
+ echo "校验失败: 业务目录不存在 -> ${business_dir}" >&2
20
+ exit 1
21
+ fi
22
+
23
+ if [[ ! -f "${baseline_file}" ]]; then
24
+ echo "校验失败: 缺少基线文件 -> ${baseline_file}" >&2
25
+ exit 1
26
+ fi
27
+
28
+ if [[ ! -d "${feature_dir}" ]]; then
29
+ echo "校验失败: 缺少 feature 目录 -> ${feature_dir}" >&2
30
+ exit 1
31
+ fi
32
+
33
+ if [[ ! -f "${archive_file}" ]]; then
34
+ echo "校验失败: 缺少归档日志 -> ${archive_file}" >&2
35
+ exit 1
36
+ fi
37
+
38
+ baseline_count=$(find "${business_dir}" -maxdepth 1 -type f -name 'baseline-*.md' | wc -l | tr -d ' ')
39
+ if [[ "${baseline_count}" != "1" ]]; then
40
+ echo "校验失败: ${business_dir} 下 baseline 文件数量应为 1,实际为 ${baseline_count}" >&2
41
+ exit 1
42
+ fi
43
+
44
+ if find "docs" -mindepth 1 -maxdepth 2 -type f -name "baseline-${business}.md" | grep -v "^${baseline_file}$" >/dev/null 2>&1; then
45
+ echo "校验失败: 发现同业务 baseline 落在多个目录,请先收敛到单目录" >&2
46
+ exit 1
47
+ fi
48
+
49
+ echo "校验通过: ${business} 目录结构符合约束"
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: frontend-standards
3
+ description: 部门级前端开发规范执行技能,覆盖 Vue3 编码规范、工程配置规范、Git 提交规范与前端最佳实践。用于前端需求开发、重构、代码评审、工程初始化与联调前自检;当任务涉及 Vue3/TypeScript 页面与组件实现、样式规范、ESLint/Prettier/Husky/Commitlint 配置时触发。
4
+ ---
5
+
6
+ # 部门前端开发规范技能
7
+
8
+ ## 总体目标
9
+
10
+ 在实现前端需求时,优先保证可维护性、一致性与可扩展性,避免临时方案累积技术债务。先明确需求边界与页面职责,再按规范完成编码、样式、工程配置与提交自检。
11
+
12
+ ## 增量开发优先级
13
+
14
+ 针对系统开发中的增量工作,按以下优先级执行:
15
+
16
+ 1. 业务需求与用户明确指令(最高优先级)。
17
+ 2. 项目既有规范与代码风格(默认优先遵循)。
18
+ 3. 本技能与通用前端规范(用于补充与兜底)。
19
+
20
+ 冲突处理原则:
21
+
22
+ - 不冲突时:遵循项目现有风格,本技能作为检查清单。
23
+ - 存在冲突时:以项目既有风格为准,避免在本次需求中做大范围风格迁移。
24
+ - 涉及安全、严重缺陷或团队已达成统一升级决策时,可在说明影响范围后做规范升级。
25
+
26
+ ## 执行流程
27
+
28
+ 1. 识别任务类型与范围。
29
+
30
+ - 若为页面/组件开发,重点执行 Vue3 组件规范、命名规范、样式作用域规范。
31
+ - 若为工程治理任务,重点执行 EditorConfig、Prettier、ESLint、Husky、Commitlint 配置规范。
32
+ - 若用户已指定现有项目约束,以用户约束优先,在不冲突前提下遵循本技能。
33
+
34
+ 2. 加载参考规范并制定实现方案。
35
+
36
+ - 始终加载 `references/frontend_develop_standard.md`。
37
+ - 若任务仅涉及局部改动,只应用与改动相关的条目,避免过度改造。
38
+
39
+ 3. 编码与配置时强制执行。
40
+
41
+ - 命名语义化:组件、变量、常量、类型命名遵循规范。
42
+ - 统一代码风格:模板双引号、脚本单引号、多属性换行。
43
+ - 样式默认使用作用域(`scoped`),穿透样式使用 `:deep()`。
44
+ - 禁止保留 `console.log`、`debugger` 和无效注释代码。
45
+ - 事件与处理函数命名保持一致(如 `on-*`、`handle*`)。
46
+
47
+ 4. 交付前执行自检。
48
+
49
+ - 检查格式化与 lint 规则是否一致。
50
+ - 检查组件职责是否清晰、是否存在可复用代码未抽离。
51
+ - 检查性能与安全风险(如不必要渲染、`v-html`、输入校验缺失)。
52
+ - 检查提交信息是否符合约定式提交规范。
53
+
54
+ ## 交付要求
55
+
56
+ 1. 明确说明本次改动遵循的前端规范条目(至少包含命名、样式、质量自检中的关键项)。
57
+ 2. 若涉及工程配置,列出新增或调整的配置文件与关键配置项。
58
+ 3. 若涉及组件开发,说明组件职责、事件约定与样式边界处理方式。
59
+ 4. 输出遗留风险与后续建议,避免把隐患留给后续维护者。
60
+
61
+ ## 参考资料
62
+
63
+ - `references/frontend_develop_standard.md`
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Frontend Develop Standard"
3
+ short_description: "Generated from templates/frontend_develop_standard.md"
4
+ default_prompt: "Use $frontend-develop-standard to follow this template skill."