ai-engineering-init 1.7.0 → 1.8.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 (118) hide show
  1. package/.claude/hooks/skill-forced-eval.js +46 -62
  2. package/.claude/settings.json +10 -1
  3. package/.claude/skills/api-development/SKILL.md +179 -130
  4. package/.claude/skills/architecture-design/SKILL.md +102 -212
  5. package/.claude/skills/backend-annotations/SKILL.md +166 -220
  6. package/.claude/skills/bug-detective/SKILL.md +225 -186
  7. package/.claude/skills/code-patterns/SKILL.md +127 -244
  8. package/.claude/skills/collaborating-with-codex/SKILL.md +96 -113
  9. package/.claude/skills/crud-development/SKILL.md +226 -307
  10. package/.claude/skills/data-permission/SKILL.md +131 -202
  11. package/.claude/skills/database-ops/SKILL.md +158 -355
  12. package/.claude/skills/error-handler/SKILL.md +224 -285
  13. package/.claude/skills/file-oss-management/SKILL.md +174 -169
  14. package/.claude/skills/git-workflow/SKILL.md +123 -341
  15. package/.claude/skills/json-serialization/SKILL.md +121 -137
  16. package/.claude/skills/performance-doctor/SKILL.md +83 -89
  17. package/.claude/skills/redis-cache/SKILL.md +134 -185
  18. package/.claude/skills/scheduled-jobs/SKILL.md +187 -224
  19. package/.claude/skills/security-guard/SKILL.md +168 -276
  20. package/.claude/skills/sms-mail/SKILL.md +266 -228
  21. package/.claude/skills/social-login/SKILL.md +257 -195
  22. package/.claude/skills/tenant-management/SKILL.md +172 -188
  23. package/.claude/skills/utils-toolkit/SKILL.md +214 -222
  24. package/.claude/skills/websocket-sse/SKILL.md +251 -172
  25. package/.claude/skills/workflow-engine/SKILL.md +178 -250
  26. package/.codex/skills/api-development/SKILL.md +179 -130
  27. package/.codex/skills/architecture-design/SKILL.md +102 -212
  28. package/.codex/skills/backend-annotations/SKILL.md +166 -220
  29. package/.codex/skills/bug-detective/SKILL.md +225 -186
  30. package/.codex/skills/code-patterns/SKILL.md +127 -244
  31. package/.codex/skills/collaborating-with-codex/SKILL.md +96 -113
  32. package/.codex/skills/crud-development/SKILL.md +226 -307
  33. package/.codex/skills/data-permission/SKILL.md +131 -202
  34. package/.codex/skills/database-ops/SKILL.md +158 -355
  35. package/.codex/skills/error-handler/SKILL.md +224 -285
  36. package/.codex/skills/file-oss-management/SKILL.md +174 -169
  37. package/.codex/skills/git-workflow/SKILL.md +123 -341
  38. package/.codex/skills/json-serialization/SKILL.md +121 -137
  39. package/.codex/skills/performance-doctor/SKILL.md +83 -89
  40. package/.codex/skills/redis-cache/SKILL.md +134 -185
  41. package/.codex/skills/scheduled-jobs/SKILL.md +187 -224
  42. package/.codex/skills/security-guard/SKILL.md +168 -276
  43. package/.codex/skills/sms-mail/SKILL.md +266 -228
  44. package/.codex/skills/social-login/SKILL.md +257 -195
  45. package/.codex/skills/tenant-management/SKILL.md +172 -188
  46. package/.codex/skills/utils-toolkit/SKILL.md +214 -222
  47. package/.codex/skills/websocket-sse/SKILL.md +251 -172
  48. package/.codex/skills/workflow-engine/SKILL.md +178 -250
  49. package/.cursor/hooks/cursor-skill-eval.js +66 -6
  50. package/.cursor/skills/api-development/SKILL.md +179 -130
  51. package/.cursor/skills/architecture-design/SKILL.md +102 -212
  52. package/.cursor/skills/backend-annotations/SKILL.md +166 -220
  53. package/.cursor/skills/bug-detective/SKILL.md +225 -186
  54. package/.cursor/skills/code-patterns/SKILL.md +127 -244
  55. package/.cursor/skills/collaborating-with-codex/SKILL.md +96 -113
  56. package/.cursor/skills/crud-development/SKILL.md +226 -307
  57. package/.cursor/skills/data-permission/SKILL.md +131 -202
  58. package/.cursor/skills/database-ops/SKILL.md +158 -355
  59. package/.cursor/skills/error-handler/SKILL.md +224 -285
  60. package/.cursor/skills/file-oss-management/SKILL.md +174 -169
  61. package/.cursor/skills/git-workflow/SKILL.md +123 -341
  62. package/.cursor/skills/json-serialization/SKILL.md +121 -137
  63. package/.cursor/skills/performance-doctor/SKILL.md +83 -89
  64. package/.cursor/skills/redis-cache/SKILL.md +134 -185
  65. package/.cursor/skills/scheduled-jobs/SKILL.md +187 -224
  66. package/.cursor/skills/security-guard/SKILL.md +168 -276
  67. package/.cursor/skills/sms-mail/SKILL.md +266 -228
  68. package/.cursor/skills/social-login/SKILL.md +257 -195
  69. package/.cursor/skills/tenant-management/SKILL.md +172 -188
  70. package/.cursor/skills/utils-toolkit/SKILL.md +214 -222
  71. package/.cursor/skills/websocket-sse/SKILL.md +251 -172
  72. package/.cursor/skills/workflow-engine/SKILL.md +178 -250
  73. package/AGENTS.md +49 -540
  74. package/CLAUDE.md +73 -119
  75. package/README.md +37 -6
  76. package/bin/index.js +5 -1
  77. package/package.json +1 -1
  78. package/src/skills/api-development/SKILL.md +179 -130
  79. package/src/skills/architecture-design/SKILL.md +102 -212
  80. package/src/skills/backend-annotations/SKILL.md +166 -220
  81. package/src/skills/bug-detective/SKILL.md +225 -186
  82. package/src/skills/code-patterns/SKILL.md +127 -244
  83. package/src/skills/collaborating-with-codex/SKILL.md +96 -113
  84. package/src/skills/crud-development/SKILL.md +226 -307
  85. package/src/skills/data-permission/SKILL.md +131 -202
  86. package/src/skills/database-ops/SKILL.md +158 -355
  87. package/src/skills/error-handler/SKILL.md +224 -285
  88. package/src/skills/file-oss-management/SKILL.md +174 -169
  89. package/src/skills/git-workflow/SKILL.md +123 -341
  90. package/src/skills/json-serialization/SKILL.md +121 -137
  91. package/src/skills/performance-doctor/SKILL.md +83 -89
  92. package/src/skills/redis-cache/SKILL.md +134 -185
  93. package/src/skills/scheduled-jobs/SKILL.md +187 -224
  94. package/src/skills/security-guard/SKILL.md +168 -276
  95. package/src/skills/sms-mail/SKILL.md +266 -228
  96. package/src/skills/social-login/SKILL.md +257 -195
  97. package/src/skills/tenant-management/SKILL.md +172 -188
  98. package/src/skills/utils-toolkit/SKILL.md +214 -222
  99. package/src/skills/websocket-sse/SKILL.md +251 -172
  100. package/src/skills/workflow-engine/SKILL.md +178 -250
  101. package/.claude/skills/skill-creator/LICENSE.txt +0 -202
  102. package/.claude/skills/skill-creator/SKILL.md +0 -479
  103. package/.claude/skills/skill-creator/agents/analyzer.md +0 -274
  104. package/.claude/skills/skill-creator/agents/comparator.md +0 -202
  105. package/.claude/skills/skill-creator/agents/grader.md +0 -223
  106. package/.claude/skills/skill-creator/assets/eval_review.html +0 -146
  107. package/.claude/skills/skill-creator/eval-viewer/generate_review.py +0 -471
  108. package/.claude/skills/skill-creator/eval-viewer/viewer.html +0 -1325
  109. package/.claude/skills/skill-creator/references/schemas.md +0 -430
  110. package/.claude/skills/skill-creator/scripts/__init__.py +0 -0
  111. package/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
  112. package/.claude/skills/skill-creator/scripts/generate_report.py +0 -326
  113. package/.claude/skills/skill-creator/scripts/improve_description.py +0 -248
  114. package/.claude/skills/skill-creator/scripts/package_skill.py +0 -136
  115. package/.claude/skills/skill-creator/scripts/quick_validate.py +0 -103
  116. package/.claude/skills/skill-creator/scripts/run_eval.py +0 -310
  117. package/.claude/skills/skill-creator/scripts/run_loop.py +0 -332
  118. package/.claude/skills/skill-creator/scripts/utils.py +0 -47
@@ -1,256 +1,295 @@
1
1
  ---
2
2
  name: bug-detective
3
3
  description: |
4
- leniu 后端 Bug 排查指南。包含错误诊断决策树、日志分析、分层定位、本项目特有错误模式库。
5
-
6
- 触发场景:
7
- - 接口返回 4xx/5xx 错误需要排查
8
- - NullPointerException、SQLException 等异常定位
9
- - 数据查不到、对象转换失败、租户隔离问题
10
- - 日志文件分析(./logs/sys-console.log)
11
- - 前端页面不显示、API 调用异常
12
-
13
- 联动技能:数据问题自动联动 mysql-debug 查库验证
14
-
15
- 触发词:Bug、报错、异常、不工作、500错误、NullPointerException、SQLException、数据查不到、日志分析、排查、调试、debug、错误排查、精度丢失
4
+ 通用 Bug 排查指南。提供分层定位方法论、日志分析技巧、HTTP 错误码诊断决策树。
5
+ 触发场景:Bug 排查、错误分析、日志诊断、线上问题定位。
6
+ 触发词:Bug、排查、报错、异常、日志分析、线上问题。
7
+ 注意:如果项目有专属技能(如 `leniu-bug-detective`),优先使用专属版本。
16
8
  ---
17
9
 
18
- # Bug 排查指南(leniu 四层架构)
19
-
20
- > 本项目四层架构:Controller -> Business -> Service -> Mapper,包名 `net.xnzn.core.*`
21
- > 详细错误案例库见 `references/error-patterns.md`
22
-
23
- ## 错误关键词索引
10
+ # Bug 排查指南
24
11
 
25
- | 关键词 | 原因 | 解决 |
26
- |--------|------|------|
27
- | `NullPointerException` | 对象为空 | selectById 判空,用 Optional |
28
- | `SQLException` | SQL 语法/字段名 | 检查表名、字段、类型 |
29
- | `401/403` | Token/权限 | 检查 `@RequiresAuthentication`、角色配置 |
30
- | `404` | URL 路径错误 | 检查 `@RequestMapping` |
31
- | `500` | 后端异常 | 读日志 `./logs/sys-console.log` |
32
- | `data 为 null, msg 有值` | **LeResponse 返回陷阱** | 见下方特有问题 #1 |
33
- | `精度丢失/ID 不对` | 雪花 ID 大数 | Long -> String 或 `@JsonSerialize(using = ToStringSerializer.class)` |
34
- | `like 报错` | 非 String 类型 | Long/Date 用 eq/in/between |
35
- | `查询无结果` | 租户/del_flag/条件 | 检查双库切换、del_flag=2 |
36
- | `BeanUtil 转换 null` | 源对象为空 | 转换前判空 |
12
+ > 通用模板。如果项目有专属技能(如 `leniu-bug-detective`),优先使用。
37
13
 
38
- ---
14
+ ## 核心规范
39
15
 
40
- ## 诊断决策树
16
+ ### 排查方法论:分层定位
41
17
 
42
18
  ```
43
- 接口返回错误
44
- +-- 4xx
45
- | +-- 400 -> 参数格式/类型错误(@RequestBody、LeRequest<T>)
46
- | +-- 401 -> Token 过期(检查 Admin-Token)
47
- | +-- 403 -> 无权限(检查 @RequiresAuthentication)
48
- | +-- 404 -> 路径错误(检查 /api/v2/web|mobile|android/{module})
49
- |
50
- +-- 500
51
- | +-- 有堆栈 -> 按异常类型定位
52
- | | +-- NullPointerException -> 查询返回 null 未判空
53
- | | +-- SQLException -> SQL 语法/字段错误
54
- | | +-- LeException -> 业务逻辑主动抛出
55
- | +-- 无堆栈 -> 全局异常处理器吞掉了异常
56
- |
57
- +-- 200 但数据不对
58
- +-- data=null, msg有值 -> LeResponse 返回陷阱(见特有问题 #1)
59
- +-- data=null, msg=null -> 查询条件错误/del_flag/双库切换
60
- +-- 字段缺失 -> BeanUtil.copyProperties 字段名不匹配
61
- +-- ID 精度丢失 -> 雪花 ID 大数问题
19
+ [问题现象]
20
+
21
+
22
+ [1. 复现] ── 能否稳定复现?记录复现步骤
23
+
24
+
25
+ [2. 定位层] ── 问题出在哪一层?
26
+
27
+ ├── 前端层 ── 浏览器控制台、网络请求、渲染问题
28
+ ├── 网关层 ── 路由、限流、认证
29
+ ├── 接口层 ── 参数校验、序列化
30
+ ├── 业务层 ── 业务逻辑、数据状态
31
+ ├── 数据层 ── SQL、数据一致性
32
+ └── 基础设施 ── 网络、配置、资源
33
+
34
+
35
+ [3. 缩小范围] ── 二分法排除
36
+
37
+
38
+ [4. 根因分析] ── 找到根本原因,而非表象
39
+
40
+
41
+ [5. 修复验证] ── 修复 + 回归测试
62
42
  ```
63
43
 
64
- ---
44
+ ### 信息收集清单
45
+
46
+ 排查前先收集:
65
47
 
66
- ## 分层定位
48
+ - [ ] 错误信息 / 错误码 / 堆栈
49
+ - [ ] 发生时间、频率
50
+ - [ ] 影响范围(所有用户 / 特定用户 / 特定数据)
51
+ - [ ] 最近的代码变更(最近一次部署了什么)
52
+ - [ ] 环境信息(开发 / 测试 / 生产)
53
+ - [ ] 能否复现,复现步骤
54
+
55
+ ### 前后端分离定位
67
56
 
68
57
  ```
69
58
  步骤 1:Postman/curl 直接调接口
70
- +-- 返回正确 -> 问题在前端
71
- +-- 返回错误 -> 问题在后端
59
+ ├── 返回正确 问题在前端(请求参数、渲染、状态管理)
60
+ └── 返回错误 问题在后端(继续向下排查)
72
61
 
73
- 步骤 2(后端):读日志 ./logs/sys-console.log
74
- +-- 有 ERROR -> 定位异常类和行号
75
- +-- 无 ERROR -> 打断点逐层排查
62
+ 步骤 2(后端):读应用日志
63
+ ├── 有 ERROR 堆栈 定位异常类和行号
64
+ └── 无 ERROR 打断点或加诊断日志逐层排查
76
65
 
77
66
  步骤 3:按调用链向下
78
- Controller -> Business -> Service -> Mapper -> 数据库
67
+ Controller Service Mapper 数据库
79
68
  ```
80
69
 
81
- | 层级 | 常见问题 | 排查重点 |
82
- |------|---------|---------|
83
- | Controller | 参数绑定、路径 404 | `@RequestMapping`、`LeRequest<T>`、`@Validated` |
84
- | Business | 业务编排错误、跨 Service 协调 | 方法调用顺序、数据组装 |
85
- | Service | 查询条件、事务回滚 | `buildWrapper`、`@Transactional`、判空 |
86
- | Mapper | SQL 语法、字段映射 | `@TableName`、`@TableField`、XML SQL |
87
-
88
- ---
89
-
90
- ## 日志分析
91
-
92
- ### 日志文件位置
93
-
94
- | 环境 | 文件 | 说明 |
95
- |------|------|------|
96
- | 开发 | `./logs/sys-console.log` | 本次启动完整日志(INFO/WARN/ERROR + SQL) |
97
- | 生产 | `./logs/sys-info.log` | INFO 日志(60 天) |
98
- | 生产 | `./logs/sys-error.log` | ERROR 日志(60 天) |
99
- | 生产 | `./logs/sys-sql.log` | SQL 日志(7 天) |
70
+ ## HTTP 错误码诊断决策树
100
71
 
101
- ### AI 自动读取流程
102
-
103
- **触发条件**(任一):用户报告问题无堆栈、需分析 SQL、需查看流程、用户说"看日志"
72
+ ### 4xx 客户端错误
104
73
 
105
74
  ```
106
- 1. Read ./logs/sys-console.log
107
- 2. 搜索 ERROR/WARN -> 定位异常堆栈
108
- 3. 搜索 p6spy -> 分析 SQL 执行和耗时
109
- 4. 结合代码给出诊断和修复方案
75
+ 400 Bad Request
76
+ ├── 请求参数格式错误? 检查 JSON 格式、字段类型
77
+ ├── 参数校验失败? 检查 @Valid 注解和 DTO 约束
78
+ └── Content-Type 不匹配? → 检查请求头
79
+
80
+ 401 Unauthorized
81
+ ├── Token 缺失? → 检查请求头是否携带认证信息
82
+ ├── Token 过期? → 检查 Token 有效期
83
+ └── Token 无效? → 检查签发逻辑和密钥
84
+
85
+ 403 Forbidden
86
+ ├── 角色/权限不足? → 检查权限配置
87
+ ├── IP 白名单? → 检查网关或防火墙配置
88
+ └── CORS 跨域? → 检查跨域配置
89
+
90
+ 404 Not Found
91
+ ├── URL 拼写错误? → 对照 API 文档
92
+ ├── 路由未注册? → 检查 Controller 注解和包扫描路径
93
+ ├── 资源确实不存在? → 检查数据库数据
94
+ └── 网关路由未配置? → 检查网关转发规则
95
+
96
+ 405 Method Not Allowed
97
+ └── HTTP 方法不匹配? → GET vs POST,检查 Controller 映射
98
+
99
+ 409 Conflict
100
+ └── 数据冲突? → 唯一约束、并发修改、乐观锁失败
110
101
  ```
111
102
 
112
- ### 日志格式
103
+ ### 5xx 服务端错误
113
104
 
114
105
  ```
115
- 2026-01-08 22:12:10 [xxx] [http-nio-8080-exec-1] INFO p6spy - Execute SQL: SELECT ... | Cost: 5 ms
116
- 2026-01-08 22:12:10 [xxx] [http-nio-8080-exec-1] ERROR net.xnzn.core.xxx - 错误信息
106
+ 500 Internal Server Error
107
+ ├── NullPointerException 检查空值处理
108
+ ├── SQL 异常 → 检查 SQL 语法、字段类型
109
+ ├── 类型转换异常 → 检查数据格式
110
+ ├── 序列化异常 → 检查对象中的循环引用、日期格式
111
+ └── 第三方调用失败 → 检查外部服务状态
112
+
113
+ 502 Bad Gateway
114
+ ├── 后端服务未启动? → 检查进程状态
115
+ ├── 端口未监听? → 检查端口占用
116
+ └── 反向代理配置错误? → 检查 Nginx/网关配置
117
+
118
+ 503 Service Unavailable
119
+ ├── 服务过载? → 检查 CPU/内存/线程池
120
+ ├── 熔断触发? → 检查熔断器状态
121
+ └── 正在部署? → 检查发布状态
122
+
123
+ 504 Gateway Timeout
124
+ ├── 慢查询? → 检查 SQL 执行计划
125
+ ├── 外部调用超时? → 检查第三方服务响应时间
126
+ └── 超时配置过短? → 调整网关/代理超时设置
117
127
  ```
118
128
 
119
- **SQL 耗时阈值**:<50ms 正常 | 50-200ms 关注 | >200ms 需优化
129
+ ## 日志分析技巧
120
130
 
121
- ---
131
+ ### 关键信息提取
122
132
 
123
- ## 本项目特有问题库
133
+ ```bash
134
+ # 按关键字搜索错误
135
+ grep -n "ERROR\|Exception\|WARN" app.log | tail -50
124
136
 
125
- ### 1. LeResponse 返回 String 的陷阱
137
+ # 按时间范围过滤
138
+ sed -n '/2024-01-01 10:00/,/2024-01-01 10:30/p' app.log
126
139
 
127
- ```java
128
- // ---- 错误:R.ok(String) 匹配到 ok(String msg) ----
129
- return R.ok(code); // { code: 200, msg: "ABC123", data: null }
130
-
131
- // ---- 正确 ----
132
- return R.ok(null, code); // { code: 200, msg: null, data: "ABC123" }
133
- return R.ok("成功", code); // { code: 200, msg: "成功", data: "ABC123" }
134
- ```
140
+ # 按请求 ID 追踪(如果有链路追踪)
141
+ grep "traceId=abc123" app.log
135
142
 
136
- **原因**:当 T 是 String 时,Java 优先匹配 `ok(String msg)` 而非泛型 `ok(T data)`。
143
+ # 统计错误类型分布
144
+ grep "Exception" app.log | awk -F: '{print $NF}' | sort | uniq -c | sort -rn
137
145
 
138
- ### 2. 双库架构数据查不到
146
+ # 查看某个时间点前后的上下文
147
+ grep -n "OutOfMemoryError" app.log # 先找到行号
148
+ sed -n '95,115p' app.log # 查看前后各 10 行
149
+ ```
139
150
 
140
- ```java
141
- // leniu 是物理双库(系统库 + 商户库),无 tenant_id 字段
142
- // 默认操作商户库,切换系统库需要:
143
- Executors.doInSystem(() -> { /* 系统库操作 */ });
144
- Executors.doInTenant(tenantId, () -> { /* 指定商户库 */ });
151
+ ### 日志级别含义
145
152
 
146
- // 排查:数据在哪个库?请求头 MERCHANT-ID 是否正确?
147
- ```
153
+ | 级别 | 用途 | 排查价值 |
154
+ |------|------|---------|
155
+ | ERROR | 系统错误,需要立即关注 | 最高,直接定位问题 |
156
+ | WARN | 潜在问题,可能导致错误 | 高,可能是问题前兆 |
157
+ | INFO | 业务关键节点 | 中,了解业务流程 |
158
+ | DEBUG | 详细调试信息 | 开发环境排查用 |
159
+ | TRACE | 最详细的跟踪信息 | 极少使用 |
148
160
 
149
- ### 3. del_flag 值反直觉
161
+ ### 常见日志模式识别
150
162
 
151
- ```java
152
- // leniu: 1=删除, 2=正常(非通用的 0=正常, 1=删除)
153
- wrapper.eq(XxxEntity::getDelFlag, 2); // 查正常数据
154
- entity.setDelFlag(1); // 逻辑删除
155
163
  ```
164
+ # 连接池耗尽
165
+ "Cannot get a connection, pool error Timeout waiting for idle object"
166
+ → 检查连接池配置、是否有连接泄漏
156
167
 
157
- ### 4. 查询条件不生效
168
+ # 内存溢出
169
+ "java.lang.OutOfMemoryError: Java heap space"
170
+ → 检查堆内存配置、是否有内存泄漏
158
171
 
159
- ```java
160
- // ---- 错误:无条件判断 ----
161
- wrapper.eq(Xxx::getStatus, bo.getStatus()); // null 时报错
162
- wrapper.like(Xxx::getName, bo.getName()); // 空串时 LIKE '%%'
172
+ # 死锁
173
+ "Deadlock found when trying to get lock"
174
+ 检查事务范围、锁顺序
163
175
 
164
- // ---- 正确 ----
165
- wrapper.eq(ObjectUtil.isNotNull(bo.getStatus()), Xxx::getStatus, bo.getStatus());
166
- wrapper.like(StrUtil.isNotBlank(bo.getName()), Xxx::getName, bo.getName());
176
+ # SQL
177
+ "SlowQuery: execution time exceeds"
178
+ 分析 SQL 执行计划,添加索引
167
179
  ```
168
180
 
169
- ### 5. like 仅限 String 类型
181
+ ## 代码示例
170
182
 
171
- | 字段类型 | 用法 |
172
- |---------|------|
173
- | String | `like()` |
174
- | Long/Integer | `eq()` / `in()` |
175
- | Date/LocalDateTime | `between()` / `ge()` / `le()` |
176
-
177
- ### 6. 雪花 ID 精度丢失
183
+ ### 排查辅助:添加诊断日志
178
184
 
179
185
  ```java
180
- // JS Number 最大安全整数 2^53-1,雪花 ID 超出
181
- // 方案 1:VO 中 String 类型
182
- // 方案 2:@JsonSerialize(using = ToStringSerializer.class)
183
- // 方案 3:全局 JacksonConfig(本项目已配置,检查是否生效)
186
+ @Slf4j
187
+ @Service
188
+ public class OrderServiceImpl {
189
+
190
+ public OrderVO getOrderDetail(Long id) {
191
+ log.info("查询订单详情, id={}", id);
192
+
193
+ Order order = orderMapper.selectById(id);
194
+ if (order == null) {
195
+ log.warn("订单不存在, id={}", id);
196
+ throw new [你的业务异常类]("订单不存在");
197
+ }
198
+
199
+ log.debug("订单数据: status={}, amount={}", order.getStatus(), order.getAmount());
200
+ // ... 业务逻辑
201
+ return orderVO;
202
+ }
203
+ }
184
204
  ```
185
205
 
186
- ### 7. Self 自注入事务失效
206
+ ### 排查辅助:请求链路追踪
187
207
 
188
208
  ```java
189
- // 同类方法互调,被调用方有 @Transactional 时,必须用 self 调用
190
- @Autowired @Lazy
191
- private XxxBusiness self;
192
-
193
- public void doSave(OrderDTO dto) {
194
- self.save(dto); // 通过代理调用,事务生效
195
- // this.save(dto); // 直接调用,事务不生效
209
+ // 使用 MDC 添加请求上下文
210
+ @Component
211
+ public class TraceInterceptor implements HandlerInterceptor {
212
+
213
+ @Override
214
+ public boolean preHandle(HttpServletRequest request,
215
+ HttpServletResponse response,
216
+ Object handler) {
217
+ String traceId = request.getHeader("X-Trace-Id");
218
+ if (traceId == null) {
219
+ traceId = UUID.randomUUID().toString().replace("-", "");
220
+ }
221
+ MDC.put("traceId", traceId);
222
+ return true;
223
+ }
224
+
225
+ @Override
226
+ public void afterCompletion(HttpServletRequest request,
227
+ HttpServletResponse response,
228
+ Object handler, Exception ex) {
229
+ MDC.clear();
230
+ }
196
231
  }
197
232
  ```
198
233
 
199
- ### 8. BeanUtil 转换注意
200
-
201
- ```java
202
- // leniu 用 Hutool BeanUtil,不是 MapstructUtils
203
- XxxVO vo = BeanUtil.copyProperties(entity, XxxVO.class); // 源对象为 null 时返回 null
204
- // 转换前务必判空
234
+ ```xml
235
+ <!-- logback 配置中包含 traceId -->
236
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
205
237
  ```
206
238
 
207
- ---
239
+ ### 常见 Bug 排查模板
208
240
 
209
- ## 数据库排查(委托 mysql-debug)
241
+ ```markdown
242
+ ## Bug 报告
210
243
 
211
- 当诊断结果指向数据问题时,**必须联动 `mysql-debug` 技能**进行数据库查询验证:
244
+ **现象**:[描述用户看到的问题]
212
245
 
213
- ```
214
- 诊断决策树判定"数据相关问题"
215
-
216
- 自动激活 mysql-debug 技能
217
-
218
- mysql-debug 执行:配置检查 → 日志提取数据库名 → 执行只读 SQL → 返回结果
219
-
220
- bug-detective 结合查询结果给出修复方案
221
- ```
246
+ **复现步骤**:
247
+ 1. ...
248
+ 2. ...
249
+ 3. ...
250
+
251
+ **预期行为**:[应该发生什么]
252
+
253
+ **实际行为**:[实际发生了什么]
222
254
 
223
- **触发 mysql-debug 的信号**:
224
- - 查询返回空/数据不存在
225
- - 数据数量、金额、状态不对
226
- - SQL 异常(DataIntegrityViolation、DuplicateKey)
227
- - 关联数据不一致
228
- - 特定租户才出现的问题
255
+ **环境**:[开发/测试/生产]
229
256
 
230
- > 如果 mysql-debug 配置未就绪(密码未设置/mysql CLI 未安装),仍可继续纯代码分析路径。
257
+ **日志/截图**:[关键日志片段]
231
258
 
232
259
  ---
233
260
 
234
- ## 常见问题速查
261
+ ## 排查过程
235
262
 
236
- | 问题 | 原因 | 解决 |
237
- |------|------|------|
238
- | 接口 404 | URL/未启动 | 检查路由前缀 `/api/v2/web/{module}` |
239
- | 接口 500 | 后端异常 | 读日志 |
240
- | data 为 null | LeResponse 陷阱 | `R.ok(null, value)` |
241
- | 转换失败 | BeanUtil 源为 null | 转换前判空 |
242
- | 数据查不到 | 双库/del_flag | 检查 Executors 切换、del_flag=2 |
243
- | 事务不回滚 | 异常被吞/非 public/this 调用 | 检查 @Transactional、用 self |
244
- | Bean 注入失败 | 包名/注解 | 必须 `net.xnzn.core.*` + `@Service` |
263
+ **定位层**:[前端/网关/接口/业务/数据/基础设施]
245
264
 
246
- ---
265
+ **根因**:[根本原因分析]
266
+
267
+ **修复方案**:[如何修复]
247
268
 
248
- ## Skill 联动
269
+ **回归验证**:[如何确认修复有效]
270
+ ```
249
271
 
250
- | 排查发现 | 推荐 Skill |
251
- |---------|-----------|
252
- | 数据问题(查不到/不一致/状态异常) | `mysql-debug`(自动联动) |
253
- | SQL 性能慢 | `performance-doctor` |
254
- | 权限配置问题 | `security-guard` |
255
- | BO/VO 映射错误 | `leniu-crud-development` |
256
- | 前端组件用法 | `ui-pc` |
272
+ ### 常见问题速查
273
+
274
+ | 问题 | 可能原因 | 排查方向 |
275
+ |------|---------|---------|
276
+ | 接口 404 | URL 错误/服务未启动 | 检查路由映射、服务状态 |
277
+ | 接口 500 | 后端异常 | 读应用日志 ERROR 堆栈 |
278
+ | 数据查不到 | 条件错误/逻辑删除/权限 | 检查 SQL、deleted 字段、数据权限 |
279
+ | 事务不回滚 | 异常被吞/非 public/this 调用 | 检查 @Transactional、代理调用 |
280
+ | Bean 注入失败 | 包扫描/注解缺失 | 检查包路径、@Service/@Component |
281
+ | 对象转换字段丢失 | 字段名不匹配 | 检查源和目标对象字段名 |
282
+ | 雪花 ID 精度丢失 | JS Number 精度限制 | Long 序列化为 String |
283
+
284
+ ## 常见错误
285
+
286
+ | 错误 | 正确做法 |
287
+ |------|---------|
288
+ | 看到错误就改代码 | 先理解根因再修复 |
289
+ | 只看最后一行异常信息 | 从 `Caused by` 往上找根因 |
290
+ | 生产环境开 DEBUG 日志 | 临时开启,问题解决后立即关闭 |
291
+ | 修复后不验证 | 修复后必须复现场景验证 |
292
+ | 只修表象不修根因 | 加 null 判断不如搞清楚为什么是 null |
293
+ | 修复时引入新 Bug | 修复范围最小化,充分回归 |
294
+ | 依赖"重启解决" | 重启只是临时手段,必须找到根因 |
295
+ | 忽略 WARN 日志 | WARN 往往是问题的前兆 |