ai-engineering-init 1.4.2 → 1.5.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 (132) hide show
  1. package/.claude/skills/leniu-java-export/SKILL.md +389 -95
  2. package/.codex/skills/leniu-java-export/SKILL.md +389 -95
  3. package/.cursor/skills/bug-detective/SKILL.md +19 -19
  4. package/.cursor/skills/leniu-java-export/SKILL.md +389 -95
  5. package/.cursor/skills/project-navigator/SKILL.md +164 -258
  6. package/package.json +7 -1
  7. package/scripts/build-skills.js +180 -0
  8. package/src/platform-map.json +56 -0
  9. package/src/skills/add-skill/SKILL.md +488 -0
  10. package/src/skills/add-todo/SKILL.md +269 -0
  11. package/src/skills/api-development/SKILL.md +266 -0
  12. package/src/skills/architecture-design/SKILL.md +262 -0
  13. package/src/skills/backend-annotations/SKILL.md +302 -0
  14. package/src/skills/banana-image/CHANGELOG.md +37 -0
  15. package/src/skills/banana-image/README.md +146 -0
  16. package/src/skills/banana-image/SKILL.md +171 -0
  17. package/src/skills/banana-image/assets/logo.png +0 -0
  18. package/src/skills/banana-image/references/advanced-usage.md +189 -0
  19. package/src/skills/banana-image/scripts/apply_template.py +125 -0
  20. package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  21. package/src/skills/banana-image/scripts/batch_prep.py +82 -0
  22. package/src/skills/banana-image/scripts/package-lock.json +1437 -0
  23. package/src/skills/banana-image/scripts/package.json +18 -0
  24. package/src/skills/banana-image/scripts/requirements.txt +10 -0
  25. package/src/skills/banana-image/templates/poster.json +22 -0
  26. package/src/skills/banana-image/templates/product.json +17 -0
  27. package/src/skills/banana-image/templates/social.json +22 -0
  28. package/src/skills/banana-image/templates/thumbnail.json +17 -0
  29. package/src/skills/brainstorm/SKILL.md +216 -0
  30. package/src/skills/bug-detective/SKILL.md +256 -0
  31. package/src/skills/bug-detective/references/error-patterns.md +242 -0
  32. package/src/skills/check/SKILL.md +367 -0
  33. package/src/skills/code-patterns/SKILL.md +280 -0
  34. package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  35. package/src/skills/codex-code-review/SKILL.md +135 -0
  36. package/src/skills/collaborating-with-codex/SKILL.md +174 -0
  37. package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  38. package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
  39. package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  40. package/src/skills/crud/SKILL.md +265 -0
  41. package/src/skills/crud-development/SKILL.md +409 -0
  42. package/src/skills/data-permission/SKILL.md +292 -0
  43. package/src/skills/data-permission/references/custom-data-scope.md +90 -0
  44. package/src/skills/database-ops/SKILL.md +407 -0
  45. package/src/skills/dev/SKILL.md +187 -0
  46. package/src/skills/error-handler/SKILL.md +371 -0
  47. package/src/skills/file-oss-management/SKILL.md +255 -0
  48. package/src/skills/file-oss-management/references/entities.md +105 -0
  49. package/src/skills/file-oss-management/references/service-impl.md +104 -0
  50. package/src/skills/git-workflow/SKILL.md +397 -0
  51. package/src/skills/init-docs/SKILL.md +194 -0
  52. package/src/skills/json-serialization/SKILL.md +357 -0
  53. package/src/skills/leniu-api-development/SKILL.md +319 -0
  54. package/src/skills/leniu-api-development/references/real-examples.md +273 -0
  55. package/src/skills/leniu-architecture-design/SKILL.md +383 -0
  56. package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
  57. package/src/skills/leniu-brainstorm/SKILL.md +242 -0
  58. package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  59. package/src/skills/leniu-code-patterns/SKILL.md +411 -0
  60. package/src/skills/leniu-crud-development/SKILL.md +404 -0
  61. package/src/skills/leniu-crud-development/references/templates.md +597 -0
  62. package/src/skills/leniu-customization-location/SKILL.md +410 -0
  63. package/src/skills/leniu-data-permission/SKILL.md +341 -0
  64. package/src/skills/leniu-database-ops/SKILL.md +426 -0
  65. package/src/skills/leniu-error-handler/SKILL.md +462 -0
  66. package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
  67. package/src/skills/leniu-java-code-style/SKILL.md +510 -0
  68. package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
  69. package/src/skills/leniu-java-entity/SKILL.md +237 -0
  70. package/src/skills/leniu-java-entity/references/templates.md +237 -0
  71. package/src/skills/leniu-java-export/SKILL.md +570 -0
  72. package/src/skills/leniu-java-logging/SKILL.md +229 -0
  73. package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
  74. package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  75. package/src/skills/leniu-java-mq/SKILL.md +338 -0
  76. package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
  77. package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  78. package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
  79. package/src/skills/leniu-java-task/SKILL.md +367 -0
  80. package/src/skills/leniu-java-total-line/SKILL.md +196 -0
  81. package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  82. package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  83. package/src/skills/leniu-mealtime/SKILL.md +215 -0
  84. package/src/skills/leniu-redis-cache/SKILL.md +331 -0
  85. package/src/skills/leniu-report-customization/SKILL.md +335 -0
  86. package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
  87. package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
  88. package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  89. package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  90. package/src/skills/leniu-security-guard/SKILL.md +306 -0
  91. package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
  92. package/src/skills/mysql-debug/SKILL.md +364 -0
  93. package/src/skills/next/SKILL.md +137 -0
  94. package/src/skills/openspec-apply-change/SKILL.md +165 -0
  95. package/src/skills/openspec-archive-change/SKILL.md +122 -0
  96. package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  97. package/src/skills/openspec-continue-change/SKILL.md +126 -0
  98. package/src/skills/openspec-explore/SKILL.md +299 -0
  99. package/src/skills/openspec-ff-change/SKILL.md +109 -0
  100. package/src/skills/openspec-new-change/SKILL.md +82 -0
  101. package/src/skills/openspec-onboard/SKILL.md +414 -0
  102. package/src/skills/openspec-sync-specs/SKILL.md +146 -0
  103. package/src/skills/openspec-verify-change/SKILL.md +176 -0
  104. package/src/skills/performance-doctor/SKILL.md +303 -0
  105. package/src/skills/progress/SKILL.md +193 -0
  106. package/src/skills/project-navigator/SKILL.md +211 -0
  107. package/src/skills/redis-cache/SKILL.md +333 -0
  108. package/src/skills/redis-cache/references/listeners.md +23 -0
  109. package/src/skills/scheduled-jobs/SKILL.md +314 -0
  110. package/src/skills/security-guard/SKILL.md +353 -0
  111. package/src/skills/security-guard/references/encrypt-config.md +103 -0
  112. package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
  113. package/src/skills/sms-mail/SKILL.md +308 -0
  114. package/src/skills/sms-mail/references/mail-config.md +88 -0
  115. package/src/skills/sms-mail/references/sms-config.md +74 -0
  116. package/src/skills/social-login/SKILL.md +266 -0
  117. package/src/skills/social-login/references/provider-configs.md +118 -0
  118. package/src/skills/start/SKILL.md +154 -0
  119. package/src/skills/store-pc/SKILL.md +366 -0
  120. package/src/skills/sync/SKILL.md +149 -0
  121. package/src/skills/task-tracker/SKILL.md +307 -0
  122. package/src/skills/tech-decision/SKILL.md +393 -0
  123. package/src/skills/tenant-management/SKILL.md +288 -0
  124. package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
  125. package/src/skills/test-development/SKILL.md +301 -0
  126. package/src/skills/test-development/references/parameterized-examples.md +119 -0
  127. package/src/skills/ui-pc/SKILL.md +438 -0
  128. package/src/skills/update-status/SKILL.md +159 -0
  129. package/src/skills/utils-toolkit/SKILL.md +362 -0
  130. package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  131. package/src/skills/websocket-sse/SKILL.md +271 -0
  132. package/src/skills/workflow-engine/SKILL.md +321 -0
@@ -0,0 +1,410 @@
1
+ ---
2
+ name: leniu-customization-location
3
+ description: |
4
+ leniu 定制项目代码位置规范。在 leniu-tengyun-wuhanxieheyiyuan(或其他定制仓库)中开发定制功能时,确定代码位置和修改方式。
5
+
6
+ 触发场景:
7
+ - 在定制仓库中新建类,不知道放哪个目录或包名
8
+ - 需要修改 core 仓库的 Service/Controller/Business/API
9
+ - 新建定制报表 Service 时遇到 MQ 双重注册问题
10
+ - 需要确认定制文件命名规范(Dz 前缀)
11
+ - 新建数据库表,不知道表名前缀和表结构
12
+ - Mapper XML 放错目录
13
+ - 定制仓库如何调用原 core 类的方法(super())
14
+ - 实现新的接口扩展点(PayCustomBusiness 等)
15
+
16
+ 触发词:定制开发、定制代码位置、Dz 前缀、leniu-yunshitang、dz_ 表名、定制仓库、覆盖 Service、@Primary、迁移 core 文件、定制开始、定制结束、net.xnzn.yunshitang、wuhanxiehe 定制、bootstrap-ext
17
+ ---
18
+
19
+ # leniu 定制项目代码位置规范
20
+
21
+ ## 适用场景
22
+
23
+ 当在 `leniu-tengyun-wuhanxieheyiyuan`(或其他定制仓库)中开发定制功能时,遵循以下规范确定代码位置和修改方式。
24
+
25
+ ---
26
+
27
+ ## 一、定制项目特征识别
28
+
29
+ | 特征 | 说明 |
30
+ |------|------|
31
+ | **仓库名** | `leniu-tengyun-wuhanxieheyiyuan` |
32
+ | **主模块** | `leniu-yunshitang` |
33
+ | **包名根路径** | `net.xnzn.yunshitang.*`(新写类)/ `net.xnzn.core.*`(迁移类) |
34
+ | **类名前缀** | `Dz`(如 `DzReportSummaryService`、`DzOrderOpenApi`) |
35
+ | **表名前缀** | `dz_`(如 `dz_subsidy_batch`、`dz_report_sum_canteen_wallet_mealtime`) |
36
+ | **注释标记** | `// 定制开始` / `// 定制结束` |
37
+
38
+ ---
39
+
40
+ ## 二、新写代码的位置
41
+
42
+ ### 2.1 新写类的存放路径
43
+
44
+ 所有新写的定制类放在:
45
+
46
+ ```
47
+ leniu-yunshitang/src/main/java/net/xnzn/yunshitang/
48
+ ```
49
+
50
+ **文件名前缀必须用 `Dz`**,示例:
51
+ - `DzMealOnlineService.java`
52
+ - `DzReportSummaryController.java`
53
+ - `DzMealDetailVO.java`
54
+ - `DzSubsidyBatch.java`(Entity)
55
+ - `DzCustInfoMapper.java`(Mapper)
56
+
57
+ ### 2.2 标准包结构
58
+
59
+ ```
60
+ net.xnzn.yunshitang/
61
+ ├── account/ # 账户/补贴模块
62
+ │ ├── controller/
63
+ │ ├── service/
64
+ │ ├── mapper/
65
+ │ ├── model/ # Entity:DzSubsidyBatch、DzSubsidyDetail
66
+ │ ├── dto/
67
+ │ ├── vo/
68
+ │ └── enums/
69
+ ├── customer/ # 人员模块
70
+ │ ├── mapper/ # DzCustInfoMapper(继承 CustInfoMapper)
71
+ │ └── service/
72
+ ├── notice/ # 通知模块
73
+ │ ├── business/ # DzNoticeBurialPointBusiness
74
+ │ └── config/
75
+ ├── order/
76
+ │ └── open/ # DzOrderOpenApi
77
+ ├── pay/
78
+ │ └── custom/ # PayCustomBusinessImpl
79
+ └── report/
80
+ └── statistics/
81
+ └── order/
82
+ ├── basic/ # 基础报表(直接查 report_order_info)
83
+ │ ├── controller/
84
+ │ ├── service/
85
+ │ ├── mapper/ # DzXxxMapper.java + DzXxxMapper.xml(同目录)
86
+ │ ├── param/
87
+ │ └── vo/
88
+ ├── analysis/ # 分析报表
89
+ └── summary/ # 汇总报表
90
+ ```
91
+
92
+ ### 2.3 注释规范
93
+
94
+ 在修改/新增的代码块上下方加注释:
95
+
96
+ ```java
97
+ // 定制开始:计算线下订单销售额占比
98
+ if (CollUtil.isNotEmpty(list) && total != null) {
99
+ list.forEach(item -> {
100
+ BigDecimal proportion = item.getSalesAmount()
101
+ .divide(total.getSalesAmount(), 4, RoundingMode.HALF_UP)
102
+ .setScale(2, RoundingMode.HALF_UP);
103
+ item.setSalesAmountProportion(proportion);
104
+ });
105
+ }
106
+ // 定制结束
107
+ ```
108
+
109
+ **何时使用注释**:
110
+ - 新写 `Dz` 前缀的类:类文件整体被认为是定制,注释可选
111
+ - 迁移改造的 `net.xnzn.core.*` 类:每个改动处**必须**加注释
112
+ - 在父类方法中插入逻辑时**必须**加注释
113
+
114
+ ### 2.4 Mapper XML 存放位置
115
+
116
+ MyBatis XML **不能**放在 `resources/mapper/` 目录,必须与 Mapper 接口同目录:
117
+
118
+ ```
119
+ net/xnzn/yunshitang/.../mapper/DzXxxMapper.java
120
+ net/xnzn/yunshitang/.../mapper/DzXxxMapper.xml ← 同目录!
121
+ ```
122
+
123
+ pom.xml 需配置资源过滤:
124
+ ```xml
125
+ <build>
126
+ <resources>
127
+ <resource>
128
+ <directory>src/main/java</directory>
129
+ <includes>
130
+ <include>**/*.xml</include>
131
+ </includes>
132
+ </resource>
133
+ <resource>
134
+ <directory>src/main/resources</directory>
135
+ </resource>
136
+ </resources>
137
+ </build>
138
+ ```
139
+
140
+ ### 2.5 新建表名前缀
141
+
142
+ 定制业务新建的数据库表,表名必须以 `dz_` 开头:
143
+
144
+ ```sql
145
+ CREATE TABLE dz_subsidy_batch
146
+ (
147
+ id BIGINT NOT NULL COMMENT '主键(雪花ID)',
148
+ batch_num VARCHAR(255) NOT NULL COMMENT '批次号',
149
+ subsidy_date DATE DEFAULT NULL COMMENT '补贴日期',
150
+ total_count INT DEFAULT 0 COMMENT '总人数',
151
+ -- 审计字段
152
+ crby VARCHAR(64) COMMENT '创建人',
153
+ crtime DATETIME COMMENT '创建时间',
154
+ upby VARCHAR(64) COMMENT '更新人',
155
+ uptime DATETIME COMMENT '更新时间',
156
+ del_flag INT DEFAULT 2 COMMENT '删除标识(1-删除,2-正常)',
157
+ PRIMARY KEY (id)
158
+ ) COMMENT = '定制-补贴批次主表';
159
+ -- ⚠️ 无需 tenant_id(双库物理隔离)
160
+ ```
161
+
162
+ ---
163
+
164
+ ## 三、修改 core 文件的三种方式
165
+
166
+ ### 方式选择决策树
167
+
168
+ ```
169
+ 需要修改 core 类?
170
+ ├── 是否是报表 Service(实现 ReportOrderConsumeService/含 consume/fix 方法)?
171
+ │ ├── 是 → 【方式三:迁移】将文件迁移到定制仓库的 net.xnzn.core.* 路径
172
+ │ └── 否 → 【方式一:继承 + @Primary】新建 Dz 前缀子类覆盖
173
+
174
+ ├── 是否是新增扩展点实现(实现新接口)?
175
+ │ └── 是 → 【方式二:实现接口 + @Primary】
176
+
177
+ └── 是否是 Mapper 接口?
178
+ └── 是 → 【方式四:继承 Mapper + @Primary】
179
+ ```
180
+
181
+ ---
182
+
183
+ ### 方式一:继承 Service/Business/API + @Primary(推荐)
184
+
185
+ 适用于:普通 Service、Business、Open API 等单实现场景。
186
+
187
+ ```java
188
+ // 定制开始
189
+ @Primary
190
+ @Service
191
+ @Slf4j
192
+ public class DzOrderOpenApi extends OrderOpenApi {
193
+
194
+ @Lazy
195
+ @Autowired
196
+ private OrderRefundMapper orderRefundMapper;
197
+
198
+ @Override
199
+ public PageVO<QueryRefundTradeOpenVO> queryConsumeOrderRefundFlow(OrderOpenRefundFlowQueryDTO queryDTO) {
200
+ // 先调用父类逻辑
201
+ PageVO<QueryRefundTradeOpenVO> pageVO = super.queryConsumeOrderRefundFlow(queryDTO);
202
+
203
+ if (CollUtil.isEmpty(pageVO.getRecords())) {
204
+ return pageVO;
205
+ }
206
+
207
+ // 定制开始:补充退款申请时间和审核时间
208
+ List<Long> refundIds = pageVO.getRecords().stream()
209
+ .map(QueryRefundTradeOpenVO::getRefundOrdId).toList();
210
+
211
+ Map<Long, OrderRefund> orderRefundMap = orderRefundMapper
212
+ .selectList(Wrappers.lambdaQuery(OrderRefund.class)
213
+ .select(OrderRefund::getOrderRefundId, OrderRefund::getApplyTime, OrderRefund::getCheckTime)
214
+ .in(OrderRefund::getOrderRefundId, refundIds))
215
+ .stream()
216
+ .collect(Collectors.toMap(OrderRefund::getOrderRefundId, Function.identity()));
217
+
218
+ for (QueryRefundTradeOpenVO record : pageVO.getRecords()) {
219
+ OrderRefund orderRefund = orderRefundMap.get(record.getRefundOrdId());
220
+ if (orderRefund != null) {
221
+ record.setApplyTime(orderRefund.getApplyTime());
222
+ record.setCheckTime(orderRefund.getCheckTime());
223
+ }
224
+ }
225
+ // 定制结束
226
+
227
+ return pageVO;
228
+ }
229
+ }
230
+ // 定制结束
231
+ ```
232
+
233
+ **Business 层继承示例**(覆盖通知渠道):
234
+
235
+ ```java
236
+ @Service
237
+ @Slf4j
238
+ @Primary
239
+ public class DzNoticeBurialPointBusiness extends NoticeBurialPointBusiness {
240
+
241
+ @Resource
242
+ private NoticeSendWebServiceSMSBusiness noticeSendWebServiceSMSBusiness;
243
+
244
+ @Override
245
+ public NoticeSendBusiness getSpecialNoticeSendBusiness(Integer templateType) {
246
+ if (NoticeTemplateTypeEnum.isSms(templateType)) {
247
+ // 定制开始:使用医院本地短信服务
248
+ return noticeSendWebServiceSMSBusiness;
249
+ // 定制结束
250
+ }
251
+ return null;
252
+ }
253
+
254
+ @Override
255
+ public boolean isXnSmsPlatform() {
256
+ return false; // 定制:不使用讯牛短信,改用本地 WebService 短信
257
+ }
258
+ }
259
+ ```
260
+
261
+ **关键规则**:
262
+ - `@Primary` 确保 Spring 优先注入定制类
263
+ - `@Lazy` 防止循环依赖(注入新 Bean 时使用)
264
+ - 调用 `super.xxx()` 复用父类逻辑,再追加定制逻辑
265
+
266
+ ---
267
+
268
+ ### 方式二:实现新接口 + @Primary
269
+
270
+ 适用于:framework 提供了扩展点接口,需要提供实现。
271
+
272
+ ```java
273
+ // 定制开始
274
+ @Primary
275
+ @Service
276
+ public class PayCustomBusinessImpl implements PayCustomBusiness {
277
+
278
+ @Override
279
+ public AutoQuerySupportVO didSupportAutoQuery(UnifyPayDTO unifyPayDTO,
280
+ UnifyPayVO unifyPayVO,
281
+ AutoQuerySupportVO supportVO) {
282
+ // 定制开始:微信JSAPI支付通过招商银行通道时启用自动查询
283
+ if (PayTypeEnum.isWechatJsapiPay(unifyPayDTO.getPayType())
284
+ && PayChannelEnum.CMB_PAY.getKey().equals(unifyPayDTO.getPayChannel())) {
285
+ supportVO.setNeedAutoQuery(true);
286
+ supportVO.setExpireSeconds(180L);
287
+ supportVO.setAutoDelaySeconds(5L);
288
+ }
289
+ // 定制结束
290
+ return supportVO;
291
+ }
292
+ }
293
+ // 定制结束
294
+ ```
295
+
296
+ ---
297
+
298
+ ### 方式三:迁移报表 Service(含 consume/fix 方法)
299
+
300
+ **⚠️ 不能用 @Primary 继承** — 会导致 MQ 消费双重注册(两个 Bean 都收到消息)。
301
+
302
+ 正确做法:
303
+ 1. 将原文件从 `leniu-tengyun-core` 复制到定制仓库
304
+ 2. 保持**包名不变**(仍是 `net.xnzn.core.*`),但存放在定制仓库目录
305
+ 3. 在修改处加 `// 定制开始` / `// 定制结束`
306
+
307
+ ```
308
+ # 原位置(core 仓库)
309
+ leniu-tengyun-core/sys-canteen/src/.../service/ReportSumDishesService.java
310
+
311
+ # 迁移后(定制仓库,包名不变!)
312
+ leniu-yunshitang/src/main/java/net/xnzn/core/report/statistics/order/summary/service/ReportSumDishesService.java
313
+ ```
314
+
315
+ 迁移文件中的定制部分:
316
+ ```java
317
+ @Override
318
+ public ReportBaseTotalVO<ReportSumDishesVO> pageDishesSalesSummary(ReportDishesParam param) {
319
+ // ... 原有逻辑 ...
320
+
321
+ // 定制开始:自助餐类型使用特殊 Mapper 方法
322
+ if (param.getOrderTypeList().stream().allMatch(s -> s == 12)) {
323
+ list = reportSumDishesMapper.listBuffetOrderDishesSum(param, authPO, dataPermission);
324
+ total = reportSumDishesMapper.getBuffetSummaryTotal(param, authPO, dataPermission);
325
+ }
326
+ // 定制结束
327
+
328
+ // ... 原有逻辑 ...
329
+ }
330
+ ```
331
+
332
+ ---
333
+
334
+ ### 方式四:继承 Mapper 接口 + @Primary
335
+
336
+ 适用于:需要扩展原 Mapper 的查询方法,或添加定制 SQL。
337
+
338
+ ```java
339
+ @Mapper
340
+ @Primary
341
+ public interface DzCustInfoMapper extends CustInfoMapper {
342
+ // 继承原有所有方法
343
+ // 可新增定制查询方法
344
+ List<CustInfoVO> selectByPayrollNo(@Param("payrollNo") String payrollNo);
345
+ }
346
+ ```
347
+
348
+ ---
349
+
350
+ ## 四、核心包路径对照
351
+
352
+ | 内容 | 核心路径(core 仓库) | 定制路径(wuhanxiehe 仓库) |
353
+ |------|-------------------|-----------------------|
354
+ | **新写定制类** | — | `net.xnzn.yunshitang.*` |
355
+ | **迁移改造的 core 类** | `net.xnzn.core.*` | `net.xnzn.core.*`(同包名,放在定制仓库) |
356
+ | **定制 Mapper XML** | — | 与 Java 文件同目录(不放 resources) |
357
+ | **定制数据库表** | — | 表名前缀 `dz_` |
358
+ | **定制配置** | — | `bootstrap-ext.yml`(定制仓库 resources 下) |
359
+
360
+ ---
361
+
362
+ ## 五、配置文件规范
363
+
364
+ 定制项目特有配置放在 `bootstrap-ext.yml`:
365
+
366
+ ```yaml
367
+ # 定制项目报表配置
368
+ yunshitang:
369
+ report:
370
+ exclude-canteen-name: ${EXCLUDE_CANTEEN_NAME:本院营养食堂}
371
+ headquarter:
372
+ area:
373
+ name: 本部食堂
374
+
375
+ # 定制第三方服务(如医院短信平台)
376
+ wuhanxiehe:
377
+ sms:
378
+ service-url: ${PROJECT_WUHANXIEHE_SMS_SERVICE_URL:http://...}
379
+ username: ${PROJECT_WUHANXIEHE_SMS_USERNAME:xxx}
380
+ timeout: ${PROJECT_WUHANXIEHE_SMS_TIMEOUT:30000}
381
+ ```
382
+
383
+ ---
384
+
385
+ ## 六、完整定制报表功能实现步骤
386
+
387
+ 新建一个完整的定制报表功能的标准步骤:
388
+
389
+ 1. **创建定制查询参数** → `DzXxxParam.java`(继承 `ReportBaseParam` 或 `PageDTO`)
390
+ 2. **创建定制返回 VO** → `DzXxxVO.java`(金额字段 BigDecimal,以分为单位)
391
+ 3. **创建定制 Mapper** → `DzXxxMapper.java`(接口,3 参数:param + authPO + dataPermission)
392
+ 4. **创建定制 Mapper XML** → `DzXxxMapper.xml`(同目录,baseWhere 引入权限片段)
393
+ 5. **创建定制 Service** → `DzXxxService.java`(注入权限 Bean,pageWithTotal/getTotal/export 三个方法)
394
+ 6. **注册到 Controller** → 在 `DzReportSummaryController` 中注入 Service,新增接口
395
+
396
+ ---
397
+
398
+ ## 七、检查清单
399
+
400
+ - [ ] 新写类文件名有 `Dz` 前缀
401
+ - [ ] 新写类放在 `net.xnzn.yunshitang.*` 包下
402
+ - [ ] 修改代码处有 `// 定制开始` / `// 定制结束` 注释
403
+ - [ ] Mapper XML 与 Java 文件同目录(非 resources)
404
+ - [ ] pom.xml 已配置 `src/main/java` 下 xml 资源过滤
405
+ - [ ] 新建表以 `dz_` 开头,审计字段用 crby/crtime/upby/uptime/del_flag
406
+ - [ ] 覆盖普通 Service/Business/API 时使用 `@Primary` 继承
407
+ - [ ] 报表 MQ Service(有 consume/fix 方法)必须迁移,不能用 @Primary
408
+ - [ ] 不直接修改 `leniu-tengyun-core` 仓库的文件
409
+ - [ ] 报表查询方法注入 `MgrAuthV2Api` + `ReportDataPermissionService`,所有 Mapper 调用传权限参数
410
+ - [ ] 继承类中调用父类逻辑时用 `super.xxx()`,只重写需要变更的部分