ai-engineering-init 1.3.4 → 1.4.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 (226) hide show
  1. package/.claude/hooks/skill-forced-eval.js +2 -0
  2. package/.claude/settings.json +3 -3
  3. package/.claude/skills/add-skill/SKILL.md +79 -32
  4. package/.claude/skills/api-development/SKILL.md +83 -377
  5. package/.claude/skills/architecture-design/SKILL.md +138 -632
  6. package/.claude/skills/backend-annotations/SKILL.md +134 -506
  7. package/.claude/skills/banana-image/SKILL.md +10 -3
  8. package/.claude/skills/brainstorm/SKILL.md +103 -535
  9. package/.claude/skills/bug-detective/SKILL.md +147 -1097
  10. package/.claude/skills/bug-detective/references/error-patterns.md +242 -0
  11. package/.claude/skills/code-patterns/SKILL.md +116 -426
  12. package/.claude/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  13. package/.claude/skills/crud-development/SKILL.md +64 -304
  14. package/.claude/skills/data-permission/SKILL.md +105 -412
  15. package/.claude/skills/data-permission/references/custom-data-scope.md +90 -0
  16. package/.claude/skills/file-oss-management/SKILL.md +106 -714
  17. package/.claude/skills/file-oss-management/references/entities.md +105 -0
  18. package/.claude/skills/file-oss-management/references/service-impl.md +104 -0
  19. package/.claude/skills/leniu-api-development/SKILL.md +142 -626
  20. package/.claude/skills/leniu-api-development/references/real-examples.md +273 -0
  21. package/.claude/skills/leniu-architecture-design/SKILL.md +176 -391
  22. package/.claude/skills/leniu-backend-annotations/SKILL.md +132 -519
  23. package/.claude/skills/leniu-brainstorm/SKILL.md +132 -541
  24. package/.claude/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  25. package/.claude/skills/leniu-crud-development/SKILL.md +232 -938
  26. package/.claude/skills/leniu-crud-development/references/templates.md +597 -0
  27. package/.claude/skills/leniu-customization-location/SKILL.md +410 -0
  28. package/.claude/skills/leniu-data-permission/SKILL.md +70 -0
  29. package/.claude/skills/leniu-java-entity/SKILL.md +76 -590
  30. package/.claude/skills/leniu-java-entity/references/templates.md +237 -0
  31. package/.claude/skills/leniu-java-export/SKILL.md +94 -379
  32. package/.claude/skills/leniu-java-logging/SKILL.md +106 -709
  33. package/.claude/skills/leniu-java-logging/references/data-mask.md +46 -0
  34. package/.claude/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  35. package/.claude/skills/leniu-java-mybatis/SKILL.md +73 -446
  36. package/.claude/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  37. package/.claude/skills/leniu-report-customization/SKILL.md +111 -365
  38. package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
  39. package/.claude/skills/leniu-report-standard-customization/SKILL.md +111 -334
  40. package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  41. package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  42. package/.claude/skills/leniu-security-guard/SKILL.md +133 -347
  43. package/.claude/skills/mysql-debug/SKILL.md +364 -0
  44. package/.claude/skills/openspec-apply-change/SKILL.md +10 -1
  45. package/.claude/skills/openspec-archive-change/SKILL.md +9 -1
  46. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  47. package/.claude/skills/openspec-continue-change/SKILL.md +9 -1
  48. package/.claude/skills/openspec-explore/SKILL.md +10 -1
  49. package/.claude/skills/openspec-ff-change/SKILL.md +9 -1
  50. package/.claude/skills/openspec-new-change/SKILL.md +9 -1
  51. package/.claude/skills/openspec-onboard/SKILL.md +15 -130
  52. package/.claude/skills/openspec-sync-specs/SKILL.md +9 -1
  53. package/.claude/skills/openspec-verify-change/SKILL.md +9 -1
  54. package/.claude/skills/performance-doctor/SKILL.md +110 -434
  55. package/.claude/skills/redis-cache/SKILL.md +89 -595
  56. package/.claude/skills/redis-cache/references/listeners.md +23 -0
  57. package/.claude/skills/scheduled-jobs/SKILL.md +88 -407
  58. package/.claude/skills/security-guard/SKILL.md +137 -532
  59. package/.claude/skills/security-guard/references/encrypt-config.md +103 -0
  60. package/.claude/skills/security-guard/references/sensitive-strategies.md +42 -0
  61. package/.claude/skills/sms-mail/SKILL.md +116 -574
  62. package/.claude/skills/sms-mail/references/mail-config.md +88 -0
  63. package/.claude/skills/sms-mail/references/sms-config.md +74 -0
  64. package/.claude/skills/social-login/SKILL.md +112 -514
  65. package/.claude/skills/social-login/references/provider-configs.md +118 -0
  66. package/.claude/skills/tenant-management/SKILL.md +129 -444
  67. package/.claude/skills/tenant-management/references/tenant-scenarios.md +91 -0
  68. package/.claude/skills/test-development/SKILL.md +86 -540
  69. package/.claude/skills/test-development/references/parameterized-examples.md +119 -0
  70. package/.claude/skills/utils-toolkit/SKILL.md +52 -305
  71. package/.claude/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  72. package/.claude/skills/websocket-sse/SKILL.md +105 -550
  73. package/.claude/skills/workflow-engine/SKILL.md +147 -502
  74. package/.codex/skills/add-skill/SKILL.md +79 -32
  75. package/.codex/skills/api-development/SKILL.md +172 -599
  76. package/.codex/skills/architecture-design/SKILL.md +138 -504
  77. package/.codex/skills/backend-annotations/SKILL.md +134 -496
  78. package/.codex/skills/banana-image/SKILL.md +10 -3
  79. package/.codex/skills/brainstorm/SKILL.md +103 -535
  80. package/.codex/skills/bug-detective/SKILL.md +147 -1097
  81. package/.codex/skills/bug-detective/references/error-patterns.md +242 -0
  82. package/.codex/skills/code-patterns/SKILL.md +120 -282
  83. package/.codex/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  84. package/.codex/skills/crud-development/SKILL.md +64 -292
  85. package/.codex/skills/data-permission/SKILL.md +108 -407
  86. package/.codex/skills/data-permission/references/custom-data-scope.md +90 -0
  87. package/.codex/skills/database-ops/SKILL.md +8 -154
  88. package/.codex/skills/error-handler/SKILL.md +10 -0
  89. package/.codex/skills/file-oss-management/SKILL.md +106 -714
  90. package/.codex/skills/file-oss-management/references/entities.md +105 -0
  91. package/.codex/skills/file-oss-management/references/service-impl.md +104 -0
  92. package/.codex/skills/git-workflow/SKILL.md +27 -5
  93. package/.codex/skills/leniu-api-development/SKILL.md +142 -626
  94. package/.codex/skills/leniu-api-development/references/real-examples.md +273 -0
  95. package/.codex/skills/leniu-architecture-design/SKILL.md +176 -391
  96. package/.codex/skills/leniu-backend-annotations/SKILL.md +132 -519
  97. package/.codex/skills/leniu-brainstorm/SKILL.md +132 -541
  98. package/.codex/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  99. package/.codex/skills/leniu-crud-development/SKILL.md +232 -938
  100. package/.codex/skills/leniu-crud-development/references/templates.md +597 -0
  101. package/.codex/skills/leniu-customization-location/SKILL.md +410 -0
  102. package/.codex/skills/leniu-data-permission/SKILL.md +70 -0
  103. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  104. package/.codex/skills/leniu-java-entity/SKILL.md +76 -590
  105. package/.codex/skills/leniu-java-entity/references/templates.md +237 -0
  106. package/.codex/skills/leniu-java-export/SKILL.md +94 -379
  107. package/.codex/skills/leniu-java-logging/SKILL.md +106 -709
  108. package/.codex/skills/leniu-java-logging/references/data-mask.md +46 -0
  109. package/.codex/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  110. package/.codex/skills/leniu-java-mybatis/SKILL.md +73 -446
  111. package/.codex/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  112. package/.codex/skills/leniu-report-customization/SKILL.md +111 -365
  113. package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
  114. package/.codex/skills/leniu-report-standard-customization/SKILL.md +111 -334
  115. package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  116. package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  117. package/.codex/skills/leniu-security-guard/SKILL.md +133 -347
  118. package/.codex/skills/mysql-debug/SKILL.md +364 -0
  119. package/.codex/skills/openspec-apply-change/SKILL.md +10 -1
  120. package/.codex/skills/openspec-archive-change/SKILL.md +9 -1
  121. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  122. package/.codex/skills/openspec-continue-change/SKILL.md +9 -1
  123. package/.codex/skills/openspec-explore/SKILL.md +10 -1
  124. package/.codex/skills/openspec-ff-change/SKILL.md +9 -1
  125. package/.codex/skills/openspec-new-change/SKILL.md +9 -1
  126. package/.codex/skills/openspec-onboard/SKILL.md +15 -130
  127. package/.codex/skills/openspec-sync-specs/SKILL.md +9 -1
  128. package/.codex/skills/openspec-verify-change/SKILL.md +9 -1
  129. package/.codex/skills/performance-doctor/SKILL.md +110 -434
  130. package/.codex/skills/project-navigator/SKILL.md +20 -1
  131. package/.codex/skills/redis-cache/SKILL.md +93 -589
  132. package/.codex/skills/redis-cache/references/listeners.md +23 -0
  133. package/.codex/skills/scheduled-jobs/SKILL.md +88 -407
  134. package/.codex/skills/security-guard/SKILL.md +141 -527
  135. package/.codex/skills/security-guard/references/encrypt-config.md +103 -0
  136. package/.codex/skills/security-guard/references/sensitive-strategies.md +42 -0
  137. package/.codex/skills/sms-mail/SKILL.md +116 -574
  138. package/.codex/skills/sms-mail/references/mail-config.md +88 -0
  139. package/.codex/skills/sms-mail/references/sms-config.md +74 -0
  140. package/.codex/skills/social-login/SKILL.md +112 -514
  141. package/.codex/skills/social-login/references/provider-configs.md +118 -0
  142. package/.codex/skills/store-pc/SKILL.md +258 -383
  143. package/.codex/skills/tenant-management/SKILL.md +129 -444
  144. package/.codex/skills/tenant-management/references/tenant-scenarios.md +91 -0
  145. package/.codex/skills/test-development/SKILL.md +86 -540
  146. package/.codex/skills/test-development/references/parameterized-examples.md +119 -0
  147. package/.codex/skills/ui-pc/SKILL.md +350 -387
  148. package/.codex/skills/utils-toolkit/SKILL.md +52 -283
  149. package/.codex/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  150. package/.codex/skills/websocket-sse/SKILL.md +105 -550
  151. package/.codex/skills/workflow-engine/SKILL.md +147 -502
  152. package/.cursor/hooks.json +3 -3
  153. package/.cursor/skills/add-skill/SKILL.md +79 -32
  154. package/.cursor/skills/api-development/SKILL.md +83 -377
  155. package/.cursor/skills/architecture-design/SKILL.md +138 -632
  156. package/.cursor/skills/backend-annotations/SKILL.md +134 -506
  157. package/.cursor/skills/banana-image/SKILL.md +10 -3
  158. package/.cursor/skills/brainstorm/SKILL.md +103 -535
  159. package/.cursor/skills/bug-detective/SKILL.md +147 -1097
  160. package/.cursor/skills/bug-detective/references/error-patterns.md +242 -0
  161. package/.cursor/skills/code-patterns/SKILL.md +116 -426
  162. package/.cursor/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  163. package/.cursor/skills/crud-development/SKILL.md +64 -304
  164. package/.cursor/skills/data-permission/SKILL.md +105 -412
  165. package/.cursor/skills/data-permission/references/custom-data-scope.md +90 -0
  166. package/.cursor/skills/file-oss-management/SKILL.md +106 -714
  167. package/.cursor/skills/file-oss-management/references/entities.md +105 -0
  168. package/.cursor/skills/file-oss-management/references/service-impl.md +104 -0
  169. package/.cursor/skills/git-workflow/SKILL.md +27 -5
  170. package/.cursor/skills/leniu-api-development/SKILL.md +142 -626
  171. package/.cursor/skills/leniu-api-development/references/real-examples.md +273 -0
  172. package/.cursor/skills/leniu-architecture-design/SKILL.md +176 -391
  173. package/.cursor/skills/leniu-backend-annotations/SKILL.md +132 -519
  174. package/.cursor/skills/leniu-brainstorm/SKILL.md +132 -541
  175. package/.cursor/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  176. package/.cursor/skills/leniu-crud-development/SKILL.md +232 -938
  177. package/.cursor/skills/leniu-crud-development/references/templates.md +597 -0
  178. package/.cursor/skills/leniu-customization-location/SKILL.md +410 -0
  179. package/.cursor/skills/leniu-data-permission/SKILL.md +70 -0
  180. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  181. package/.cursor/skills/leniu-java-entity/SKILL.md +76 -590
  182. package/.cursor/skills/leniu-java-entity/references/templates.md +237 -0
  183. package/.cursor/skills/leniu-java-export/SKILL.md +94 -379
  184. package/.cursor/skills/leniu-java-logging/SKILL.md +106 -709
  185. package/.cursor/skills/leniu-java-logging/references/data-mask.md +46 -0
  186. package/.cursor/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  187. package/.cursor/skills/leniu-java-mybatis/SKILL.md +73 -446
  188. package/.cursor/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  189. package/.cursor/skills/leniu-report-customization/SKILL.md +111 -365
  190. package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
  191. package/.cursor/skills/leniu-report-standard-customization/SKILL.md +111 -334
  192. package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  193. package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  194. package/.cursor/skills/leniu-security-guard/SKILL.md +133 -347
  195. package/.cursor/skills/mysql-debug/SKILL.md +364 -0
  196. package/.cursor/skills/openspec-apply-change/SKILL.md +10 -1
  197. package/.cursor/skills/openspec-archive-change/SKILL.md +9 -1
  198. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  199. package/.cursor/skills/openspec-continue-change/SKILL.md +9 -1
  200. package/.cursor/skills/openspec-explore/SKILL.md +10 -1
  201. package/.cursor/skills/openspec-ff-change/SKILL.md +9 -1
  202. package/.cursor/skills/openspec-new-change/SKILL.md +9 -1
  203. package/.cursor/skills/openspec-onboard/SKILL.md +15 -130
  204. package/.cursor/skills/openspec-sync-specs/SKILL.md +9 -1
  205. package/.cursor/skills/openspec-verify-change/SKILL.md +9 -1
  206. package/.cursor/skills/performance-doctor/SKILL.md +110 -434
  207. package/.cursor/skills/redis-cache/SKILL.md +89 -595
  208. package/.cursor/skills/redis-cache/references/listeners.md +23 -0
  209. package/.cursor/skills/scheduled-jobs/SKILL.md +88 -407
  210. package/.cursor/skills/security-guard/SKILL.md +137 -532
  211. package/.cursor/skills/security-guard/references/encrypt-config.md +103 -0
  212. package/.cursor/skills/security-guard/references/sensitive-strategies.md +42 -0
  213. package/.cursor/skills/sms-mail/SKILL.md +116 -574
  214. package/.cursor/skills/sms-mail/references/mail-config.md +88 -0
  215. package/.cursor/skills/sms-mail/references/sms-config.md +74 -0
  216. package/.cursor/skills/social-login/SKILL.md +112 -514
  217. package/.cursor/skills/social-login/references/provider-configs.md +118 -0
  218. package/.cursor/skills/tenant-management/SKILL.md +129 -444
  219. package/.cursor/skills/tenant-management/references/tenant-scenarios.md +91 -0
  220. package/.cursor/skills/test-development/SKILL.md +86 -540
  221. package/.cursor/skills/test-development/references/parameterized-examples.md +119 -0
  222. package/.cursor/skills/utils-toolkit/SKILL.md +52 -305
  223. package/.cursor/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  224. package/.cursor/skills/websocket-sse/SKILL.md +105 -550
  225. package/.cursor/skills/workflow-engine/SKILL.md +147 -502
  226. package/package.json +1 -1
@@ -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()`,只重写需要变更的部分
@@ -269,3 +269,73 @@ public class TenantConfigProperties {
269
269
  3. 跨租户操作需要使用 `Executors.doInTenant()` 或 `Executors.readInTenant()`
270
270
  4. 事务会在方法执行结束后自动切回原来的数据源
271
271
  5. `TenantContextHolderFilter` 自动从请求头解析租户 ID
272
+
273
+ ---
274
+
275
+ ## 报表场景下的数据权限使用
276
+
277
+ ### 报表场景数据权限使用模式
278
+
279
+ 在定制报表(leniu-yunshitang 仓库)中,数据权限通过以下三层协作实现:
280
+
281
+ **1. Service 层:获取权限参数**
282
+
283
+ ```java
284
+ @Autowired
285
+ private MgrAuthV2Api mgrAuthApi;
286
+
287
+ @Autowired
288
+ private ReportDataPermissionService reportDataPermissionService;
289
+
290
+ // 在每个查询/导出方法中调用
291
+ MgrUserAuthPO authPO = mgrAuthApi.getUserAuthPO();
292
+ ReportDataPermissionParam dataPermission = reportDataPermissionService.getDataPermission(authPO);
293
+ ```
294
+
295
+ **2. Mapper 接口:传递权限参数**
296
+
297
+ ```java
298
+ List<XxxVO> listPage(@Param("param") XxxParam param,
299
+ @Param("authPO") MgrUserAuthPO authPO,
300
+ @Param("dataPermission") ReportDataPermissionParam dataPermission);
301
+
302
+ XxxVO getTotal(@Param("param") XxxParam param,
303
+ @Param("authPO") MgrUserAuthPO authPO,
304
+ @Param("dataPermission") ReportDataPermissionParam dataPermission);
305
+ ```
306
+
307
+ **3. MyBatis XML:引入公共权限片段**
308
+
309
+ ```xml
310
+ <!-- 在 baseWhere 的 SQL 片段末尾加入 -->
311
+ <sql id="baseWhere">
312
+ <!-- 业务过滤条件... -->
313
+ <include refid="net.xnzn.core.report.statistics.common.mapper.ReportDataPermissionMapper.dataPermission"/>
314
+ </sql>
315
+ ```
316
+
317
+ **完整调用链示例:**
318
+
319
+ ```java
320
+ public ReportBaseTotalVO<DzMealDetailVO> pageWithTotal(DzMealDetailParam param) {
321
+ // 获取权限
322
+ MgrUserAuthPO authPO = mgrAuthApi.getUserAuthPO();
323
+ ReportDataPermissionParam dataPermission = reportDataPermissionService.getDataPermission(authPO);
324
+
325
+ ReportBaseTotalVO<DzMealDetailVO> result = new ReportBaseTotalVO<>();
326
+ // 查询合计行
327
+ if (CollUtil.isEmpty(param.getExportCols())) {
328
+ DzMealDetailVO totalLine = mapper.getTotal(param, authPO, dataPermission);
329
+ result.setTotalLine(Optional.ofNullable(totalLine).orElse(new DzMealDetailVO()));
330
+ }
331
+ // 查询列表
332
+ if (param.getPage() != null) {
333
+ PageMethod.startPage(param.getPage());
334
+ }
335
+ List<DzMealDetailVO> list = mapper.listPage(param, authPO, dataPermission);
336
+ result.setResultPage(PageVO.of(list));
337
+ return result;
338
+ }
339
+ ```
340
+
341
+ **注意:** 导出方法(exportXxx)中同样需要获取权限并传给 Mapper,不能省略。