ai-engineering-init 1.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 (313) hide show
  1. package/.claude/agents/code-reviewer.md +139 -0
  2. package/.claude/agents/project-manager.md +159 -0
  3. package/.claude/audio/completed.wav +0 -0
  4. package/.claude/commands/add-todo.md +255 -0
  5. package/.claude/commands/check.md +210 -0
  6. package/.claude/commands/crud.md +454 -0
  7. package/.claude/commands/dev.md +503 -0
  8. package/.claude/commands/init-docs.md +681 -0
  9. package/.claude/commands/next.md +251 -0
  10. package/.claude/commands/progress.md +242 -0
  11. package/.claude/commands/start.md +199 -0
  12. package/.claude/commands/sync.md +307 -0
  13. package/.claude/commands/update-status.md +428 -0
  14. package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
  15. package/.claude/docs/README.md +167 -0
  16. package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
  17. package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
  18. package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
  19. package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
  20. package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
  21. package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
  22. package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
  23. package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
  24. package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
  25. package/.claude/framework-config.json +73 -0
  26. package/.claude/hooks/pre-tool-use.js +117 -0
  27. package/.claude/hooks/skill-forced-eval.js +167 -0
  28. package/.claude/hooks/stop.js +58 -0
  29. package/.claude/settings.json +41 -0
  30. package/.claude/skills/add-skill/SKILL.md +352 -0
  31. package/.claude/skills/api-development/SKILL.md +560 -0
  32. package/.claude/skills/architecture-design/SKILL.md +756 -0
  33. package/.claude/skills/backend-annotations/SKILL.md +674 -0
  34. package/.claude/skills/banana-image/CHANGELOG.md +37 -0
  35. package/.claude/skills/banana-image/README.md +146 -0
  36. package/.claude/skills/banana-image/SKILL.md +164 -0
  37. package/.claude/skills/banana-image/assets/logo.png +0 -0
  38. package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
  39. package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
  40. package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  41. package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
  42. package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
  43. package/.claude/skills/banana-image/scripts/package.json +18 -0
  44. package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
  45. package/.claude/skills/banana-image/templates/poster.json +22 -0
  46. package/.claude/skills/banana-image/templates/product.json +17 -0
  47. package/.claude/skills/banana-image/templates/social.json +22 -0
  48. package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
  49. package/.claude/skills/brainstorm/SKILL.md +648 -0
  50. package/.claude/skills/bug-detective/SKILL.md +1206 -0
  51. package/.claude/skills/code-patterns/SKILL.md +590 -0
  52. package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
  53. package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  54. package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
  55. package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  56. package/.claude/skills/crud-development/SKILL.md +649 -0
  57. package/.claude/skills/data-permission/SKILL.md +599 -0
  58. package/.claude/skills/database-ops/SKILL.md +407 -0
  59. package/.claude/skills/error-handler/SKILL.md +371 -0
  60. package/.claude/skills/file-oss-management/SKILL.md +863 -0
  61. package/.claude/skills/git-workflow/SKILL.md +375 -0
  62. package/.claude/skills/json-serialization/SKILL.md +357 -0
  63. package/.claude/skills/leniu-api-development/SKILL.md +803 -0
  64. package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
  65. package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
  66. package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
  67. package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
  68. package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
  69. package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
  70. package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
  71. package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
  72. package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
  73. package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
  74. package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
  75. package/.claude/skills/leniu-java-export/SKILL.md +560 -0
  76. package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
  77. package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
  78. package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
  79. package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
  80. package/.claude/skills/leniu-java-task/SKILL.md +367 -0
  81. package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
  82. package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  83. package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  84. package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
  85. package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
  86. package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
  87. package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
  88. package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
  89. package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
  90. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  91. package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
  92. package/.claude/skills/openspec-explore/SKILL.md +290 -0
  93. package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
  94. package/.claude/skills/openspec-new-change/SKILL.md +74 -0
  95. package/.claude/skills/openspec-onboard/SKILL.md +529 -0
  96. package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
  97. package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
  98. package/.claude/skills/performance-doctor/SKILL.md +627 -0
  99. package/.claude/skills/project-navigator/SKILL.md +305 -0
  100. package/.claude/skills/redis-cache/SKILL.md +839 -0
  101. package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
  102. package/.claude/skills/security-guard/SKILL.md +748 -0
  103. package/.claude/skills/sms-mail/SKILL.md +766 -0
  104. package/.claude/skills/social-login/SKILL.md +668 -0
  105. package/.claude/skills/store-pc/SKILL.md +366 -0
  106. package/.claude/skills/task-tracker/SKILL.md +307 -0
  107. package/.claude/skills/tech-decision/SKILL.md +393 -0
  108. package/.claude/skills/tenant-management/SKILL.md +603 -0
  109. package/.claude/skills/test-development/SKILL.md +755 -0
  110. package/.claude/skills/ui-pc/SKILL.md +438 -0
  111. package/.claude/skills/utils-toolkit/SKILL.md +615 -0
  112. package/.claude/skills/websocket-sse/SKILL.md +716 -0
  113. package/.claude/skills/workflow-engine/SKILL.md +676 -0
  114. package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
  115. package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
  116. package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
  117. package/.codex/skills/add-skill/SKILL.md +352 -0
  118. package/.codex/skills/add-todo/SKILL.md +269 -0
  119. package/.codex/skills/api-development/SKILL.md +693 -0
  120. package/.codex/skills/architecture-design/SKILL.md +628 -0
  121. package/.codex/skills/backend-annotations/SKILL.md +664 -0
  122. package/.codex/skills/banana-image/CHANGELOG.md +37 -0
  123. package/.codex/skills/banana-image/README.md +146 -0
  124. package/.codex/skills/banana-image/SKILL.md +164 -0
  125. package/.codex/skills/banana-image/assets/logo.png +0 -0
  126. package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
  127. package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
  128. package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  129. package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
  130. package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
  131. package/.codex/skills/banana-image/scripts/package.json +18 -0
  132. package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
  133. package/.codex/skills/banana-image/templates/poster.json +22 -0
  134. package/.codex/skills/banana-image/templates/product.json +17 -0
  135. package/.codex/skills/banana-image/templates/social.json +22 -0
  136. package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
  137. package/.codex/skills/brainstorm/SKILL.md +648 -0
  138. package/.codex/skills/bug-detective/SKILL.md +1206 -0
  139. package/.codex/skills/check/SKILL.md +367 -0
  140. package/.codex/skills/code-patterns/SKILL.md +442 -0
  141. package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
  142. package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  143. package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
  144. package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  145. package/.codex/skills/crud/SKILL.md +265 -0
  146. package/.codex/skills/crud-development/SKILL.md +637 -0
  147. package/.codex/skills/data-permission/SKILL.md +591 -0
  148. package/.codex/skills/database-ops/SKILL.md +553 -0
  149. package/.codex/skills/dev/SKILL.md +187 -0
  150. package/.codex/skills/error-handler/SKILL.md +361 -0
  151. package/.codex/skills/file-oss-management/SKILL.md +863 -0
  152. package/.codex/skills/git-workflow/SKILL.md +375 -0
  153. package/.codex/skills/init-docs/SKILL.md +194 -0
  154. package/.codex/skills/json-serialization/SKILL.md +357 -0
  155. package/.codex/skills/leniu-api-development/SKILL.md +803 -0
  156. package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
  157. package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
  158. package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
  159. package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
  160. package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
  161. package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
  162. package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
  163. package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
  164. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  165. package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
  166. package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
  167. package/.codex/skills/leniu-java-export/SKILL.md +560 -0
  168. package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
  169. package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
  170. package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
  171. package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
  172. package/.codex/skills/leniu-java-task/SKILL.md +367 -0
  173. package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
  174. package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  175. package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  176. package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
  177. package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
  178. package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
  179. package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
  180. package/.codex/skills/next/SKILL.md +137 -0
  181. package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
  182. package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
  183. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  184. package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
  185. package/.codex/skills/openspec-explore/SKILL.md +290 -0
  186. package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
  187. package/.codex/skills/openspec-new-change/SKILL.md +74 -0
  188. package/.codex/skills/openspec-onboard/SKILL.md +529 -0
  189. package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
  190. package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
  191. package/.codex/skills/performance-doctor/SKILL.md +627 -0
  192. package/.codex/skills/progress/SKILL.md +193 -0
  193. package/.codex/skills/project-navigator/SKILL.md +286 -0
  194. package/.codex/skills/redis-cache/SKILL.md +829 -0
  195. package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
  196. package/.codex/skills/security-guard/SKILL.md +739 -0
  197. package/.codex/skills/sms-mail/SKILL.md +766 -0
  198. package/.codex/skills/social-login/SKILL.md +668 -0
  199. package/.codex/skills/start/SKILL.md +154 -0
  200. package/.codex/skills/store-pc/SKILL.md +491 -0
  201. package/.codex/skills/sync/SKILL.md +149 -0
  202. package/.codex/skills/task-tracker/SKILL.md +307 -0
  203. package/.codex/skills/tech-decision/SKILL.md +393 -0
  204. package/.codex/skills/tenant-management/SKILL.md +603 -0
  205. package/.codex/skills/test-development/SKILL.md +755 -0
  206. package/.codex/skills/ui-pc/SKILL.md +475 -0
  207. package/.codex/skills/update-status/SKILL.md +159 -0
  208. package/.codex/skills/utils-toolkit/SKILL.md +593 -0
  209. package/.codex/skills/websocket-sse/SKILL.md +716 -0
  210. package/.codex/skills/workflow-engine/SKILL.md +676 -0
  211. package/.cursor/agents/code-reviewer.md +139 -0
  212. package/.cursor/agents/project-manager.md +159 -0
  213. package/.cursor/commands/opsx-apply.md +152 -0
  214. package/.cursor/commands/opsx-archive.md +157 -0
  215. package/.cursor/commands/opsx-bulk-archive.md +242 -0
  216. package/.cursor/commands/opsx-continue.md +114 -0
  217. package/.cursor/commands/opsx-explore.md +174 -0
  218. package/.cursor/commands/opsx-ff.md +94 -0
  219. package/.cursor/commands/opsx-new.md +69 -0
  220. package/.cursor/commands/opsx-onboard.md +525 -0
  221. package/.cursor/commands/opsx-sync.md +134 -0
  222. package/.cursor/commands/opsx-verify.md +164 -0
  223. package/.cursor/mcp.json +22 -0
  224. package/.cursor/skills/add-skill/SKILL.md +352 -0
  225. package/.cursor/skills/api-development/SKILL.md +560 -0
  226. package/.cursor/skills/architecture-design/SKILL.md +756 -0
  227. package/.cursor/skills/backend-annotations/SKILL.md +674 -0
  228. package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
  229. package/.cursor/skills/banana-image/README.md +146 -0
  230. package/.cursor/skills/banana-image/SKILL.md +164 -0
  231. package/.cursor/skills/banana-image/assets/logo.png +0 -0
  232. package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
  233. package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
  234. package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  235. package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
  236. package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
  237. package/.cursor/skills/banana-image/scripts/package.json +18 -0
  238. package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
  239. package/.cursor/skills/banana-image/templates/poster.json +22 -0
  240. package/.cursor/skills/banana-image/templates/product.json +17 -0
  241. package/.cursor/skills/banana-image/templates/social.json +22 -0
  242. package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
  243. package/.cursor/skills/brainstorm/SKILL.md +648 -0
  244. package/.cursor/skills/bug-detective/SKILL.md +1206 -0
  245. package/.cursor/skills/code-patterns/SKILL.md +590 -0
  246. package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
  247. package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  248. package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
  249. package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  250. package/.cursor/skills/crud-development/SKILL.md +649 -0
  251. package/.cursor/skills/data-permission/SKILL.md +599 -0
  252. package/.cursor/skills/database-ops/SKILL.md +407 -0
  253. package/.cursor/skills/error-handler/SKILL.md +371 -0
  254. package/.cursor/skills/file-oss-management/SKILL.md +863 -0
  255. package/.cursor/skills/git-workflow/SKILL.md +375 -0
  256. package/.cursor/skills/json-serialization/SKILL.md +357 -0
  257. package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
  258. package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
  259. package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
  260. package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
  261. package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
  262. package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
  263. package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
  264. package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
  265. package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
  266. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  267. package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
  268. package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
  269. package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
  270. package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
  271. package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
  272. package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
  273. package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
  274. package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
  275. package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
  276. package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  277. package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  278. package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
  279. package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
  280. package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
  281. package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
  282. package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
  283. package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
  284. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  285. package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
  286. package/.cursor/skills/openspec-explore/SKILL.md +290 -0
  287. package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
  288. package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
  289. package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
  290. package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
  291. package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
  292. package/.cursor/skills/performance-doctor/SKILL.md +627 -0
  293. package/.cursor/skills/project-navigator/SKILL.md +305 -0
  294. package/.cursor/skills/redis-cache/SKILL.md +839 -0
  295. package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
  296. package/.cursor/skills/security-guard/SKILL.md +748 -0
  297. package/.cursor/skills/sms-mail/SKILL.md +766 -0
  298. package/.cursor/skills/social-login/SKILL.md +668 -0
  299. package/.cursor/skills/store-pc/SKILL.md +366 -0
  300. package/.cursor/skills/task-tracker/SKILL.md +307 -0
  301. package/.cursor/skills/tech-decision/SKILL.md +393 -0
  302. package/.cursor/skills/tenant-management/SKILL.md +603 -0
  303. package/.cursor/skills/test-development/SKILL.md +755 -0
  304. package/.cursor/skills/ui-pc/SKILL.md +438 -0
  305. package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
  306. package/.cursor/skills/websocket-sse/SKILL.md +716 -0
  307. package/.cursor/skills/workflow-engine/SKILL.md +676 -0
  308. package/AGENTS.md +669 -0
  309. package/CLAUDE.md +205 -0
  310. package/README.md +205 -0
  311. package/bin/index.js +179 -0
  312. package/init.sh +178 -0
  313. package/package.json +27 -0
@@ -0,0 +1,461 @@
1
+ ---
2
+ name: leniu-java-amount-handling
3
+ description: |
4
+ leniu-tengyun-core 项目金额处理规范。金融系统中金额以分(Long 类型)存储,展示时转换为元。
5
+
6
+ 触发场景:
7
+ - VO/Entity 类含金额字段(amountFen/amountYuan)
8
+ - MyBatis XML 查询含金额字段
9
+ - Excel 导出含金额列,需分转元
10
+ - 报表合计查询含金额汇总
11
+
12
+ 触发词:金额、分转元、元转分、Long 金额、money、fen、cents、金额字段、金额处理、AmountConverter、AmountUtil
13
+ ---
14
+
15
+ # leniu-tengyun-core 金额处理规范
16
+
17
+ ## 两种金额存储模式
18
+
19
+ 项目中存在两种金额存储模式,根据业务模块选择:
20
+
21
+ ### 模式 A:Long(分)→ BigDecimal(元)[钱包/账户模块]
22
+
23
+ 适用于余额、充值、补贴等精度要求高的模块:
24
+
25
+ - **数据库**:存储为 Long(分)
26
+ - **Entity**:使用 Long 类型
27
+ - **VO**:使用 BigDecimal 类型(MyBatis 自动转换分→元)
28
+ - **Excel 导出**:使用 `CustomNumberConverter` 转换器
29
+
30
+ ### 模式 B:BigDecimal(分)[订单/报表模块]
31
+
32
+ 适用于订单金额、报表汇总等复杂计算模块:
33
+
34
+ - **数据库**:存储为 BigDecimal(值为分,如 10000 = 100.00元)
35
+ - **Entity**:直接使用 BigDecimal 类型(以分为单位)
36
+ - **VO**:同样使用 BigDecimal(字段注释需标注单位)
37
+ - **SQL SUM**:直接 `SUM(amount)`,不需要 /100
38
+
39
+ > 参考:`OrderInfo.payableAmount`(BigDecimal,以分为单位)
40
+
41
+ ## 金额类型速查
42
+
43
+ | 类型 | 用途 | 示例 |
44
+ |------|------|------|
45
+ | `Long` | 钱包/账户存储(分) | `private Long orderAmount; // 10000 = 100.00元` |
46
+ | `BigDecimal` | 订单/报表存储(分) | `private BigDecimal payableAmount; // 10000 = 100.00元` |
47
+ | `BigDecimal` | VO 展示(元,模式A) | `private BigDecimal amount; // 100.00` |
48
+
49
+ ## Entity(模式A:Long存储)
50
+
51
+ ```java
52
+ import com.baomidou.mybatisplus.annotation.*;
53
+ import io.swagger.annotations.ApiModel;
54
+ import io.swagger.annotations.ApiModelProperty;
55
+ import lombok.Data;
56
+
57
+ @Data
58
+ @TableName(value = "wallet_table", autoResultMap = true)
59
+ public class WalletEntity {
60
+
61
+ @TableId
62
+ @ApiModelProperty(value = "钱包ID")
63
+ private Long id;
64
+
65
+ @ApiModelProperty(value = "余额(分)")
66
+ private Long balance;
67
+
68
+ @ApiModelProperty(value = "充值金额(分)")
69
+ private Long rechargeAmount;
70
+ }
71
+ ```
72
+
73
+ **要点**:
74
+ - Entity 使用 `Long` 类型存储金额(分)
75
+ - 字段注释明确标注"(分)"
76
+
77
+ ## Entity(模式B:BigDecimal存储,适用订单模块)
78
+
79
+ ```java
80
+ @Data
81
+ @TableName("order_info")
82
+ public class OrderInfo {
83
+
84
+ @ApiModelProperty(value = "应付金额(分)")
85
+ private BigDecimal payableAmount;
86
+
87
+ @ApiModelProperty(value = "实付金额(分)")
88
+ private BigDecimal realAmount;
89
+
90
+ @ApiModelProperty(value = "优惠金额(分)")
91
+ private BigDecimal discountsAmount;
92
+ }
93
+ ```
94
+
95
+ **要点**:
96
+ - 字段类型为 BigDecimal,但值以分为单位存储
97
+ - 不需要 MyBatis 类型转换
98
+
99
+ ## VO(响应层)
100
+
101
+ ```java
102
+ import com.alibaba.excel.annotation.ExcelProperty;
103
+ import io.swagger.annotations.ApiModel;
104
+ import io.swagger.annotations.ApiModelProperty;
105
+ import lombok.Data;
106
+ import lombok.experimental.Accessors;
107
+ import net.xnzn.core.common.export.converter.CustomNumberConverter;
108
+
109
+ import java.math.BigDecimal;
110
+
111
+ @Data
112
+ @Accessors(chain = true)
113
+ @ApiModel("订单信息")
114
+ public class OrderVO {
115
+
116
+ @ApiModelProperty("订单ID")
117
+ private Long id;
118
+
119
+ @ApiModelProperty("订单金额(元)")
120
+ @ExcelProperty(value = "订单金额(元)", converter = CustomNumberConverter.class)
121
+ private BigDecimal orderAmount;
122
+
123
+ @ApiModelProperty("优惠金额(元)")
124
+ @ExcelProperty(value = "优惠金额(元)", converter = CustomNumberConverter.class)
125
+ private BigDecimal discountAmount;
126
+
127
+ @ApiModelProperty("实付金额(元)")
128
+ @ExcelProperty(value = "实付金额(元)", converter = CustomNumberConverter.class)
129
+ private BigDecimal payAmount;
130
+ }
131
+ ```
132
+
133
+ **要点**:
134
+ - VO 使用 `BigDecimal` 类型(元)
135
+ - Excel 导出必须使用 `converter = CustomNumberConverter.class`
136
+ - MyBatis 会自动将 Long 分转换为 BigDecimal 元
137
+
138
+ ## MyBatis XML 查询
139
+
140
+ ### 列表查询
141
+
142
+ ```xml
143
+ <select id="listOrders" resultType="OrderVO">
144
+ SELECT
145
+ order_id,
146
+ order_amount, -- ❌ 不要 /100.0
147
+ discount_amount, -- ❌ 不要 /100.0
148
+ pay_amount -- ❌ 不要 /100.0
149
+ FROM order_table
150
+ <where>...</where>
151
+ ORDER BY crtime DESC
152
+ </select>
153
+ ```
154
+
155
+ ### 合计查询
156
+
157
+ ```xml
158
+ <select id="getOrderTotal" resultType="OrderVO">
159
+ SELECT
160
+ SUM(order_amount) AS order_amount, -- ❌ 不要 /100.0
161
+ SUM(discount_amount) AS discount_amount,-- ❌ 不要 /100.0
162
+ SUM(pay_amount) AS pay_amount -- ❌ 不要 /100.0
163
+ FROM order_table
164
+ <where>...</where>
165
+ </select>
166
+ ```
167
+
168
+ **重要**:
169
+ - 永远不要在 SQL 中使用 `/100.0`
170
+ - 合计查询只返回数值字段,不返回非数值字段(如日期、名称)
171
+
172
+ ## 金额工具类
173
+
174
+ ### AmountUtil(分转元)
175
+
176
+ ```java
177
+ import java.math.BigDecimal;
178
+ import java.math.RoundingMode;
179
+
180
+ /**
181
+ * 分与元金额转换
182
+ */
183
+ public class AmountUtil {
184
+
185
+ /**
186
+ * 分转元(String)
187
+ */
188
+ public static String fen2YuanStr(Integer fen) {
189
+ if (fen == null) {
190
+ return "0.00";
191
+ }
192
+ BigDecimal amountFen = new BigDecimal(fen);
193
+ BigDecimal amountYuan = amountFen.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
194
+ return amountYuan.toPlainString();
195
+ }
196
+
197
+ /**
198
+ * 分转元(String 重载)
199
+ */
200
+ public static String fen2YuanStr(String fen) {
201
+ if (fen == null || fen.isEmpty()) {
202
+ return "0.00";
203
+ }
204
+ BigDecimal amountFen = new BigDecimal(fen);
205
+ BigDecimal amountYuan = amountFen.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
206
+ return amountYuan.toPlainString();
207
+ }
208
+
209
+ /**
210
+ * 分转元(BigDecimal)
211
+ */
212
+ public static BigDecimal fen2Yuan(Integer fen) {
213
+ if (fen == null) {
214
+ return BigDecimal.ZERO;
215
+ }
216
+ BigDecimal amountFen = new BigDecimal(fen);
217
+ return amountFen.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
218
+ }
219
+
220
+ /**
221
+ * 分转元(Long)
222
+ */
223
+ public static BigDecimal fen2Yuan(Long fen) {
224
+ if (fen == null) {
225
+ return BigDecimal.ZERO;
226
+ }
227
+ BigDecimal amountFen = new BigDecimal(fen);
228
+ return amountFen.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
229
+ }
230
+
231
+ /**
232
+ * 元转分
233
+ */
234
+ public static Integer yuan2Fen(String yuan) {
235
+ if (yuan == null || yuan.isEmpty()) {
236
+ return 0;
237
+ }
238
+ BigDecimal balance = new BigDecimal(yuan);
239
+ return Integer.parseInt(balance.multiply(new BigDecimal("100"))
240
+ .setScale(0, RoundingMode.HALF_UP)
241
+ .toPlainString());
242
+ }
243
+
244
+ /**
245
+ * 元转分(BigDecimal)
246
+ */
247
+ public static Integer yuan2Fen(BigDecimal yuan) {
248
+ if (yuan == null) {
249
+ return 0;
250
+ }
251
+ return yuan.multiply(new BigDecimal("100"))
252
+ .setScale(0, RoundingMode.HALF_UP)
253
+ .intValue();
254
+ }
255
+ }
256
+ ```
257
+
258
+ ### 使用示例
259
+
260
+ ```java
261
+ // 分转元
262
+ Integer fenAmount = 10000; // 10000分
263
+ BigDecimal yuanAmount = AmountUtil.fen2Yuan(fenAmount); // 100.00元
264
+
265
+ // 元转分
266
+ BigDecimal yuan = new BigDecimal("99.99");
267
+ Integer fenAmount = AmountUtil.yuan2Fen(yuan); // 9999分
268
+ ```
269
+
270
+ ## 常见场景
271
+
272
+ ### 场景1:订单报表 VO
273
+
274
+ ```java
275
+ @Data
276
+ @Accessors(chain = true)
277
+ @ApiModel("订单报表")
278
+ public class OrderReportVO {
279
+
280
+ @ExcelProperty(value = "月度", order = 1)
281
+ @ApiModelProperty("月度")
282
+ private String dateMonth;
283
+
284
+ @ExcelProperty(value = "订单总额(元)", order = 2, converter = CustomNumberConverter.class)
285
+ @ApiModelProperty("订单总额(元)")
286
+ private BigDecimal totalAmount;
287
+
288
+ @ExcelProperty(value = "订单数量", order = 3)
289
+ @ApiModelProperty("订单数量")
290
+ private Integer totalCount;
291
+
292
+ @ExcelProperty(value = "平均金额(元)", order = 4, converter = CustomNumberConverter.class)
293
+ @ApiModelProperty("平均金额(元)")
294
+ private BigDecimal avgAmount;
295
+ }
296
+ ```
297
+
298
+ ### 场景2:工资汇总 VO
299
+
300
+ ```java
301
+ @Data
302
+ @Accessors(chain = true)
303
+ @ApiModel("工资汇总")
304
+ public class SalarySummaryVO {
305
+
306
+ @ExcelProperty(value = "月度", order = 1)
307
+ @ApiModelProperty("月度")
308
+ private String dateMonth;
309
+
310
+ @ExcelProperty(value = "基本工资(元)", order = 2, converter = CustomNumberConverter.class)
311
+ @ApiModelProperty("基本工资(元)")
312
+ private BigDecimal basicSalary;
313
+
314
+ @ExcelProperty(value = "绩效工资(元)", order = 3, converter = CustomNumberConverter.class)
315
+ @ApiModelProperty("绩效工资(元)")
316
+ private BigDecimal performanceSalary;
317
+
318
+ @ExcelProperty(value = "应发工资(元)", order = 4, converter = CustomNumberConverter.class)
319
+ @ApiModelProperty("应发工资(元)")
320
+ private BigDecimal totalSalary;
321
+ }
322
+ ```
323
+
324
+ ### 场景3:合计行 SQL
325
+
326
+ ```xml
327
+ <!-- 列表查询 -->
328
+ <select id="pageSalary" resultType="SalarySummaryVO">
329
+ SELECT
330
+ date_month,
331
+ staff_count,
332
+ basic_salary,
333
+ performance_salary,
334
+ total_salary
335
+ FROM salary_summary
336
+ <where>...</where>
337
+ ORDER BY date_month DESC
338
+ </select>
339
+
340
+ <!-- 合计查询:只返回数值字段 -->
341
+ <select id="getSalaryTotal" resultType="SalarySummaryVO">
342
+ SELECT
343
+ SUM(staff_count) AS staff_count,
344
+ SUM(basic_salary) AS basic_salary,
345
+ SUM(performance_salary) AS performance_salary,
346
+ SUM(total_salary) AS total_salary
347
+ FROM salary_summary
348
+ <where>...</where>
349
+ </select>
350
+ ```
351
+
352
+ ### 场景4:平均值计算
353
+
354
+ ```xml
355
+ <!-- 平均值计算(除零处理) -->
356
+ CASE
357
+ WHEN SUM(staff_count) = 0 THEN 0
358
+ ELSE SUM(total_salary) / SUM(staff_count)
359
+ END AS avgSalary
360
+
361
+ <!-- 按维度平均 -->
362
+ CASE
363
+ WHEN SUM(staff_count) = 0 THEN 0
364
+ ELSE SUM(total_salary) / COUNT(DISTINCT tenant_id)
365
+ END AS avgSalary
366
+ ```
367
+
368
+ ## 数据流
369
+
370
+ ```
371
+ 数据库(Long/分) → MyBatis → VO(BigDecimal/元) → 前端(自动 /100)
372
+
373
+ Excel(converter /100)
374
+ ```
375
+
376
+ ## Excel 导出
377
+
378
+ ### 转换器
379
+
380
+ ```java
381
+ @ExcelProperty(value = "订单金额(元)", converter = CustomNumberConverter.class)
382
+ private BigDecimal orderAmount;
383
+ ```
384
+
385
+ ### 必要的导入
386
+
387
+ ```java
388
+ import com.alibaba.excel.annotation.ExcelProperty;
389
+ import net.xnzn.core.common.export.converter.CustomNumberConverter;
390
+ ```
391
+
392
+ ## 常见错误
393
+
394
+ ### 错误1:在 SQL 中使用 /100.0
395
+
396
+ ```xml
397
+ <!-- ❌ 错误:在 SQL 中除以 100 -->
398
+ SELECT
399
+ order_amount / 100.0 AS order_amount
400
+ FROM order_table
401
+
402
+ <!-- ✅ 正确:不进行除法,MyBatis 自动转换 -->
403
+ SELECT
404
+ order_amount AS order_amount
405
+ FROM order_table
406
+ ```
407
+
408
+ ### 错误2:钱包模块 Entity 使用 BigDecimal(模式A适用)
409
+
410
+ ```java
411
+ // ❌ 错误:钱包/账户模块 Entity 使用 BigDecimal(应用 Long)
412
+ @Data
413
+ public class WalletEntity {
414
+ @ApiModelProperty("余额(元)")
415
+ private BigDecimal balance;
416
+ }
417
+
418
+ // ✅ 正确:钱包/账户模块 Entity 使用 Long(分)
419
+ @Data
420
+ public class WalletEntity {
421
+ @ApiModelProperty("余额(分)")
422
+ private Long balance;
423
+ }
424
+ ```
425
+
426
+ > **注意**:订单模块(OrderInfo)使用 BigDecimal 存储金额(以分为单位),这是模式B,属于正确用法,不是错误。
427
+
428
+ ### 错误3:VO 不使用转换器
429
+
430
+ ```java
431
+ // ❌ 错误:Excel 导出不使用转换器
432
+ @ExcelProperty(value = "订单金额(元)")
433
+ private BigDecimal orderAmount;
434
+
435
+ // ✅ 正确:使用 CustomNumberConverter
436
+ @ExcelProperty(value = "订单金额(元)", converter = CustomNumberConverter.class)
437
+ private BigDecimal orderAmount;
438
+ ```
439
+
440
+ ### 错误4:合计查询返回非数值字段
441
+
442
+ ```xml
443
+ <!-- ❌ 错误:合计查询返回非数值字段 -->
444
+ <select id="getOrderTotal" resultType="OrderVO">
445
+ SELECT
446
+ SUM(order_amount) AS order_amount,
447
+ order_date -- ❌ 非数值字段
448
+ FROM order_table
449
+ </select>
450
+
451
+ <!-- ✅ 正确:只返回数值字段 -->
452
+ <select id="getOrderTotal" resultType="OrderVO">
453
+ SELECT
454
+ SUM(order_amount) AS order_amount
455
+ FROM order_table
456
+ </select>
457
+ ```
458
+
459
+ ## 参考文档
460
+
461
+ 详见:[leniu-tengyun-core 源码](/Users/xujiajun/Developer/gongsi_proj/core/leniu-tengyun-core)