@specpow/framework 0.6.0 → 0.6.1
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.
- package/CHANGELOG.md +15 -0
- package/builtin/schemas/mes-prd-to-code/references.md +20 -7
- package/builtin/schemas/mes-prd-to-code/rules.md +8 -4
- package/builtin/schemas/mes-prd-to-code/schema.yaml +2 -2
- package/builtin/schemas/mes-prd-to-code/templates/tech-design.md +10 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.6.1] - 2026-09-10
|
|
9
|
+
|
|
10
|
+
### 🔧 mes-prd-to-code Schema 规则修正
|
|
11
|
+
|
|
12
|
+
统一后端 Excel 导出/导入公共基类约定,修正包路径错误。
|
|
13
|
+
|
|
14
|
+
#### 变更内容
|
|
15
|
+
|
|
16
|
+
- **后端公共类引用规则**:导出统一使用 `BaseExcelExportTemplate`、导入统一使用 `BaseAnalysisEventListener`(均为 `com.twsz.mom.ds.util.excel`)
|
|
17
|
+
- **后端 Controller 规范**:导出/导入逻辑封装在 ServiceImpl,Controller 只负责调用
|
|
18
|
+
- **EasyExcel 白名单**:仅允许 `EasyExcel.read(...)`(作为 `BaseAnalysisEventListener` 的驱动入口);禁止 `EasyExcel.write(...)`、`doReadSync()`
|
|
19
|
+
- **ExcelUtil 废弃**:`com.twsz.mom.web.utils.ExcelUtil` 标注为已废弃,禁止使用
|
|
20
|
+
- 修正 `BaseExcelExportTemplate` 包路径(`core.web.excel` → `ds.util.excel`)并补齐 API 说明(`getTotal()`、`getData(start, size)`,start 从 1 开始)
|
|
21
|
+
- `templates/tech-design.md` 伪代码由 `uploadExcel(List<T>)` 改为 `export(...)` + `handle(List<T>)`
|
|
22
|
+
|
|
8
23
|
## [0.5.29] - 2026-08-31
|
|
9
24
|
|
|
10
25
|
### ✨ Memory Auto Adapter 系统
|
|
@@ -37,13 +37,14 @@
|
|
|
37
37
|
- `new BaseException(String message)` → 从消息构造
|
|
38
38
|
- `new BaseException(HttpStatus status, Object... args)` → 带参数格式化
|
|
39
39
|
|
|
40
|
-
### ExcelUtil (com.twsz.mom.
|
|
40
|
+
### ExcelUtil (com.twsz.mom.web.utils.ExcelUtil) 【已废弃,禁止使用】
|
|
41
41
|
- `importExcel(InputStream is)` → `List<Map<String, Object>>`(原始导入)
|
|
42
42
|
- `importExcel(InputStream is, Class<T> clazz)` → `List<T>`(类型化导入)
|
|
43
43
|
- `export(HttpServletResponse resp, Class<T> clazz, Boolean isCsv, Collection<?> data)` → 标准导出
|
|
44
44
|
- `export(HttpServletResponse resp, Class<T> clazz, Boolean isCsv, Supplier<Collection<?>> supplier)` → 懒加载导出
|
|
45
45
|
- `responseJson(HttpServletResponse resp, ResponseWrapper<T> wrapper)` → 写 JSON 错误响应
|
|
46
46
|
- `exportException(HttpServletResponse resp, Throwable e)` → 写异常为 JSON
|
|
47
|
+
- 废弃说明: 导出改用 BaseExcelExportTemplate,导入改用 BaseAnalysisEventListener;本节仅用于识别存量代码
|
|
47
48
|
|
|
48
49
|
### ApplicationContextUtil (com.twsz.mom.core.utils.ApplicationContextUtil)
|
|
49
50
|
- `getUserActName()` → 获取当前登录用户名称(仅在业务逻辑中需要用户名时使用,如日志记录、业务校验)
|
|
@@ -53,12 +54,24 @@
|
|
|
53
54
|
- `fastSimpleUUID()` → 生成无横线 UUID(用于导出文件名等)
|
|
54
55
|
|
|
55
56
|
### EasyExcel (com.alibaba.excel.EasyExcel)
|
|
56
|
-
- `EasyExcel.
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
### BaseExcelExportTemplate (com.twsz.mom.
|
|
60
|
-
-
|
|
61
|
-
-
|
|
57
|
+
- `EasyExcel.read(InputStream, Class<T>, ReadListener).sheet().doRead()` → 监听式导入(唯一允许用法,必须配合 BaseAnalysisEventListener)
|
|
58
|
+
- 禁止: EasyExcel.write(...)、EasyExcel.read(...).doReadSync()
|
|
59
|
+
|
|
60
|
+
### BaseExcelExportTemplate (com.twsz.mom.ds.util.excel.BaseExcelExportTemplate)
|
|
61
|
+
- 定义: public abstract class BaseExcelExportTemplate<T>
|
|
62
|
+
- 抽象方法: int getTotal() 与 List<T> getData(Integer start, Integer size)
|
|
63
|
+
- 重要: getData 的 start 参数从 1 开始(源码按 getData(i + 1, batchSize) 调用)
|
|
64
|
+
- 构造器: (Class<T>) / (String fileName, String sheetName, Class<T>) / (..., Integer batchSize) / (..., Integer batchSize, Integer sheetNum)
|
|
65
|
+
- 默认值: batchSize=1000, sheetNum=1048576;sheetNum < batchSize 抛 BaseException
|
|
66
|
+
- exportBatch(HttpServletResponse, Converter<?>...) → 同步导出,内置 try-catch,失败回写 ResponseWrapper.ofFail("导出失败")
|
|
67
|
+
- exportBatch(OutputStream, WriteHandler, Converter<?>...) → 异步落文件,抛异常
|
|
68
|
+
|
|
69
|
+
### BaseAnalysisEventListener (com.twsz.mom.ds.util.excel.BaseAnalysisEventListener)
|
|
70
|
+
- 定义: public abstract class BaseAnalysisEventListener<T> extends com.alibaba.excel.event.AnalysisEventListener<T>
|
|
71
|
+
- 构造器: (int batchSize)
|
|
72
|
+
- 抽象方法: void handle(List<T> dataList) — 唯一需要实现的方法
|
|
73
|
+
- 分批机制: invoke() 累积满 batchSize 触发 handle() 并清空;doAfterAllAnalysed() 冲刷余量
|
|
74
|
+
- 用法: EasyExcel.read(inputStream, Entity.class, new BaseAnalysisEventListener<Entity>(1000){ handle(list) }).sheet().doRead()
|
|
62
75
|
|
|
63
76
|
### ViewModel 常量 (com.twsz.mom.ds.model.ViewModel)
|
|
64
77
|
- `ViewModel.OPT_ADD = "1"` — 新增标记
|
|
@@ -58,8 +58,10 @@
|
|
|
58
58
|
- Controller 只做参数校验和结果封装,禁止写业务逻辑
|
|
59
59
|
- 禁止在 Controller 中 try-catch(全局异常处理器 @ControllerAdvice 统一处理)
|
|
60
60
|
- delete 接口: @DeleteMapping,接收 `Long[] ids`
|
|
61
|
-
- export 接口:
|
|
62
|
-
-
|
|
61
|
+
- export 接口: 必须用 BaseExcelExportTemplate 匿名子类(实现 getTotal()、getData(start, size),start 从 1 开始),调用 exportBatch(HttpServletResponse, Converter...) 写入响应;禁止 ExcelUtil.export()、禁止 EasyExcel.write()
|
|
62
|
+
- export 位置: 匿名子类封装在 ServiceImpl 导出方法中(如 entityService.export(entity, response)),Controller 只注入调用,禁止在 Controller 内写导出逻辑
|
|
63
|
+
- import 接口: 接收 MultipartFile,必须用 EasyExcel.read(inputStream, Entity.class, new BaseAnalysisEventListener<Entity>(batchSize) { handle(List<Entity>) }).sheet().doRead() 驱动;禁止 ExcelUtil.importExcel()、禁止 doReadSync() 裸读
|
|
64
|
+
- import 位置: 校验与入库逻辑写在 BaseAnalysisEventListener.handle(List<Entity>) 内,由 batchSize 控制分批;禁止在 handle() 内单条循环查询
|
|
63
65
|
|
|
64
66
|
## 后端 Service 规范
|
|
65
67
|
|
|
@@ -107,8 +109,10 @@
|
|
|
107
109
|
- BaseException: `new BaseException(AIHttpStatus.XXX.getCode(), AIHttpStatus.XXX.getMessage())` — com.twsz.mom.core.exception.BaseException
|
|
108
110
|
- PageForm<T>: size(页大小), current(页码,1-based), condition(查询条件对象) — com.twsz.mom.core.common.PageForm
|
|
109
111
|
- ApplicationContextUtil: 获取当前用户名称(getUserActName) — com.twsz.mom.core.utils.ApplicationContextUtil
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
+
- BaseExcelExportTemplate: 导出统一基类,匿名子类实现 getTotal() 与 getData(start, size)(start 从 1 开始),调用 exportBatch(response, converters...) — com.twsz.mom.ds.util.excel.BaseExcelExportTemplate
|
|
113
|
+
- BaseAnalysisEventListener: 导入统一监听器,new BaseAnalysisEventListener<T>(batchSize){ handle(list) },配合 EasyExcel.read(...) 驱动 — com.twsz.mom.ds.util.excel.BaseAnalysisEventListener
|
|
114
|
+
- EasyExcel: 仅允许 EasyExcel.read(...) 驱动 BaseAnalysisEventListener,禁止 EasyExcel.write() — com.alibaba.excel.EasyExcel
|
|
115
|
+
- ExcelUtil: 【已废弃,禁止使用】 — com.twsz.mom.web.utils.ExcelUtil
|
|
112
116
|
- ViewModel.OPT_ADD = "1", OPT_MODIFY = "2", OPT_DELETE = "3", OPT_NOT_MODIFY_DATE = "0"
|
|
113
117
|
- IdUtil: cn.hutool.core.util.IdUtil(fastSimpleUUID 等)
|
|
114
118
|
|
|
@@ -230,7 +230,7 @@ artifacts:
|
|
|
230
230
|
- PUT /{entity}/update — 修改
|
|
231
231
|
- DELETE /{entity}/delete — 批量删除
|
|
232
232
|
- POST /{entity}/export — 导出
|
|
233
|
-
- POST /{entity}/uploadExcel —
|
|
233
|
+
- POST /{entity}/uploadExcel — 导入(如有),由 BaseAnalysisEventListener 承载批量校验与入库
|
|
234
234
|
- 外部接口(如功能文档有定义):
|
|
235
235
|
- 按功能文档定义的路径和方法
|
|
236
236
|
- 请求/响应格式按功能文档
|
|
@@ -409,7 +409,7 @@ artifacts:
|
|
|
409
409
|
- deleteByIds: 批量删除+级联
|
|
410
410
|
- search: 分页查询
|
|
411
411
|
- list: 列表查询
|
|
412
|
-
-
|
|
412
|
+
- uploadExcel: BaseAnalysisEventListener.handle() 内批量校验、跳过统计(如有)
|
|
413
413
|
|
|
414
414
|
## 文件路径
|
|
415
415
|
测试文件放在: src/test/java/{与ServiceImpl相同的包路径}/
|
|
@@ -236,10 +236,17 @@ insert({Entity} entity):
|
|
|
236
236
|
1. <校验规则描述>
|
|
237
237
|
2. <校验通过> → baseMapper.insert(entity)
|
|
238
238
|
|
|
239
|
-
|
|
239
|
+
export({Entity} entity, HttpServletResponse response):
|
|
240
|
+
new BaseExcelExportTemplate<{Entity}>({Entity}.class) {
|
|
241
|
+
getTotal() → <总数查询描述>
|
|
242
|
+
getData(start, size) → <分页查询描述,start 从 1 开始>
|
|
243
|
+
}.exportBatch(response)
|
|
244
|
+
|
|
245
|
+
handle(List<{Entity}> list):
|
|
246
|
+
// BaseAnalysisEventListener 回调,由 EasyExcel.read(...).doRead() 驱动
|
|
240
247
|
@Transactional(rollbackFor = Exception.class)
|
|
241
|
-
1.
|
|
242
|
-
2.
|
|
248
|
+
1. <批量导入校验描述>
|
|
249
|
+
2. 批量 insert(按 batchSize 分批)
|
|
243
250
|
```
|
|
244
251
|
|
|
245
252
|
### 3.4 Controller
|