feat:通知新增分支参数

This commit is contained in:
2026-06-16 16:50:27 +08:00
parent 8ecc22e8af
commit 3c79428246
20 changed files with 74 additions and 29 deletions

View File

@@ -68,6 +68,7 @@ public class CodeCheckMain implements Callable<Integer> {
}
GitChangeScanner gitScanner = new GitChangeScanner(repoRoot.toAbsolutePath());
String branch = gitScanner.getCurrentBranch();
DtoNestIndex nestIndex = DtoNestIndex.build(repoRoot.toAbsolutePath(), appConfig);
List<ClassChangeReport> classReports = List.of();
List<EndpointChangeReport> apiReports = List.of();
@@ -86,8 +87,8 @@ public class CodeCheckMain implements Callable<Integer> {
OverlapNotificationFilter.FilterResult filtered = OverlapNotificationFilter.apply(
classReports, apiReports, appConfig.getDtoOverlapMode(), nestIndex);
int totalSent = sendClassNotifications(appConfig, filtered.classReports())
+ sendApiNotifications(appConfig, filtered.apiReports());
int totalSent = sendClassNotifications(appConfig, filtered.classReports(), branch)
+ sendApiNotifications(appConfig, filtered.apiReports(), branch);
if (totalSent == 0 && appConfig.isOnlyOnChange()) {
System.out.println("无变更,静默退出");
@@ -155,24 +156,24 @@ public class CodeCheckMain implements Callable<Integer> {
return new ArrayList<>(merged.values());
}
private int sendClassNotifications(AppConfig appConfig, List<ClassChangeReport> reports) {
private int sendClassNotifications(AppConfig appConfig, List<ClassChangeReport> reports, String branch) {
if (reports.isEmpty()) {
return 0;
}
WeComNotifier notifier = new WeComNotifier();
if (appConfig.isWecomEnabled()) {
return notifier.sendAll(appConfig.getWecomWebhookUrl(), reports, modifier, modifyTime);
return notifier.sendAll(appConfig.getWecomWebhookUrl(), reports, modifier, modifyTime, branch);
}
notifier.logAll(reports, modifier, modifyTime);
notifier.logAll(reports, modifier, modifyTime, branch);
return reports.size();
}
private int sendApiNotifications(AppConfig appConfig, List<EndpointChangeReport> reports) {
private int sendApiNotifications(AppConfig appConfig, List<EndpointChangeReport> reports, String branch) {
if (reports.isEmpty()) {
return 0;
}
ApiChangeNotifier notifier = new ApiChangeNotifier();
return notifier.sendAll(appConfig.getWecomWebhookUrl(), reports, modifier, modifyTime,
return notifier.sendAll(appConfig.getWecomWebhookUrl(), reports, modifier, modifyTime, branch,
appConfig.isWecomEnabled());
}
}

View File

@@ -18,14 +18,14 @@ public class ApiChangeNotifier {
private final WeComMarkdownSender sender = new WeComMarkdownSender();
public int sendAll(String webhookUrl, List<EndpointChangeReport> reports,
String modifier, String modifyTime, boolean wecomEnabled) {
String modifier, String modifyTime, String branch, boolean wecomEnabled) {
if (reports == null || reports.isEmpty()) {
System.out.println("无 API 变更,不发送通知");
return 0;
}
int sent = 0;
for (EndpointChangeReport report : reports) {
String markdown = buildMarkdown(report, modifier, modifyTime);
String markdown = buildMarkdown(report, modifier, modifyTime, branch);
if (wecomEnabled) {
if (sender.send(webhookUrl, markdown)) {
sent++;
@@ -43,20 +43,20 @@ public class ApiChangeNotifier {
return sent;
}
public String buildMarkdown(EndpointChangeReport report, String modifier, String modifyTime) {
public String buildMarkdown(EndpointChangeReport report, String modifier, String modifyTime, String branch) {
ApiChangeKind kind = report.getChangeKind();
if (kind == ApiChangeKind.PATH_CHANGED
|| kind == ApiChangeKind.NEW_ENDPOINT
|| kind == ApiChangeKind.REMOVED_ENDPOINT) {
return buildPathMarkdown(report, modifier, modifyTime);
return buildPathMarkdown(report, modifier, modifyTime, branch);
}
if (kind == ApiChangeKind.METHOD_CHANGED) {
return buildMethodMarkdown(report, modifier, modifyTime);
return buildMethodMarkdown(report, modifier, modifyTime, branch);
}
return buildParamMarkdown(report, modifier, modifyTime);
return buildParamMarkdown(report, modifier, modifyTime, branch);
}
private String buildPathMarkdown(EndpointChangeReport report, String modifier, String modifyTime) {
private String buildPathMarkdown(EndpointChangeReport report, String modifier, String modifyTime, String branch) {
String changeLabel;
switch (report.getChangeKind()) {
case NEW_ENDPOINT:
@@ -72,10 +72,10 @@ public class ApiChangeNotifier {
StringBuilder sb = new StringBuilder();
sb.append("# 【API路径变更通知】").append("\n\n");
sb.append(MarkdownStyles.quoteKvBold("变更类型", MarkdownStyles.colorWarning(changeLabel))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("路径",
MarkdownStyles.colorInfo(MarkdownStyles.safe(report.getSourceFile())))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("修改人", MarkdownStyles.colorComment(modifier))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("时间", MarkdownStyles.colorComment(modifyTime))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("路径", MarkdownStyles.colorInfo(MarkdownStyles.safe(report.getSourceFile())))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("分支", MarkdownStyles.colorComment(branch))).append("\n");
sb.append("\n## 【URI变更详情】").append("\n\n");
sb.append(MarkdownStyles.quoteKvBold("接口说明", formatEndpointDescription(report))).append("\n");
appendPathUriLines(sb, report, changeLabel);
@@ -103,12 +103,13 @@ public class ApiChangeNotifier {
}
}
private String buildMethodMarkdown(EndpointChangeReport report, String modifier, String modifyTime) {
private String buildMethodMarkdown(EndpointChangeReport report, String modifier, String modifyTime, String branch) {
StringBuilder sb = new StringBuilder();
sb.append("# 【API请求方式变更通知】").append("\n\n");
sb.append(MarkdownStyles.quoteKvBold("变更类型", MarkdownStyles.colorWarning("修改请求方式"))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("路径",
MarkdownStyles.colorInfo(MarkdownStyles.safe(report.getSourceFile())))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("分支", MarkdownStyles.colorComment(branch))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("修改人", MarkdownStyles.colorComment(modifier))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("时间", MarkdownStyles.colorComment(modifyTime))).append("\n");
sb.append("\n## 【请求方式变更详情】").append("\n\n");
@@ -122,7 +123,7 @@ public class ApiChangeNotifier {
return sb.toString();
}
private String buildParamMarkdown(EndpointChangeReport report, String modifier, String modifyTime) {
private String buildParamMarkdown(EndpointChangeReport report, String modifier, String modifyTime, String branch) {
StringBuilder sb = new StringBuilder();
sb.append("# 【API参数变更通知】").append("\n\n");
sb.append(MarkdownStyles.quoteKvBold("修改人", MarkdownStyles.colorComment(modifier))).append("\n");
@@ -133,6 +134,7 @@ public class ApiChangeNotifier {
+ MarkdownStyles.inlineCode(report.getUri()))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("路径",
MarkdownStyles.colorInfo(MarkdownStyles.safe(report.getSourceFile())))).append("\n");
sb.append(MarkdownStyles.quoteKvBold("分支", MarkdownStyles.colorComment(branch))).append("\n");
sb.append("\n## 【接口参数变动详情】").append("\n\n");
appendParameterDetails(sb, report);
return sb.toString();

View File

@@ -23,6 +23,7 @@ import java.util.Map;
public class GitChangeScanner {
private final Path repoRoot;
private final ClassDeclParser classDeclParser = new ClassDeclParser();
public static final String UNKNOWN_BRANCH = "未知";
public GitChangeScanner(Path repoRoot) {
this.repoRoot = repoRoot;
@@ -203,6 +204,23 @@ public class GitChangeScanner {
return runGit("diff", "--name-only", oldSha, newSha);
}
/** 获取当前检出的分支名detached HEAD 等情况返回「未知」) */
public String getCurrentBranch() {
try {
List<String> lines = runGit("rev-parse", "--abbrev-ref", "HEAD");
if (lines.isEmpty()) {
return UNKNOWN_BRANCH;
}
String branch = lines.get(0) == null ? "" : lines.get(0).trim();
if (branch.isBlank() || "HEAD".equalsIgnoreCase(branch)) {
return UNKNOWN_BRANCH;
}
return branch;
} catch (IOException e) {
return UNKNOWN_BRANCH;
}
}
/** 在 repoRoot 下执行 git 命令并返回 stdout 行 */
private List<String> runGit(String... args) throws IOException {
String[] command = new String[args.length + 3];

View File

@@ -20,7 +20,8 @@ public class WeComNotifier {
private final WeComMarkdownSender sender = new WeComMarkdownSender();
/** 逐条发送企微通知,返回成功条数 */
public int sendAll(String webhookUrl, List<ClassChangeReport> reports, String modifier, String modifyTime) {
public int sendAll(String webhookUrl, List<ClassChangeReport> reports,
String modifier, String modifyTime, String branch) {
if (reports == null || reports.isEmpty()) {
System.out.println("无类变更,不发送到企业微信");
return 0;
@@ -28,7 +29,7 @@ public class WeComNotifier {
int sent = 0;
for (ClassChangeReport report : reports) {
String markdown = buildMarkdown(report, modifier, modifyTime);
String markdown = buildMarkdown(report, modifier, modifyTime, branch);
if (postMarkdown(webhookUrl, markdown)) {
sent++;
System.out.println("已发送类变更通知: " + report.getClassName());
@@ -41,7 +42,7 @@ public class WeComNotifier {
}
/** 企微关闭时打印 Markdown 到控制台 */
public void logAll(List<ClassChangeReport> reports, String modifier, String modifyTime) {
public void logAll(List<ClassChangeReport> reports, String modifier, String modifyTime, String branch) {
if (reports == null || reports.isEmpty()) {
System.out.println("无类变更,无日志输出");
return;
@@ -52,17 +53,17 @@ public class WeComNotifier {
ClassChangeReport report = reports.get(i);
System.out.println("========== 类变更 [" + (i + 1) + "/" + reports.size()
+ "]: " + report.getClassName() + " ==========");
System.out.println(buildMarkdown(report, modifier, modifyTime));
System.out.println(buildMarkdown(report, modifier, modifyTime, branch));
System.out.println("========== 结束 ==========");
}
System.out.println("" + reports.size() + " 条类变更结果(未发送到企业微信)");
}
/** 组装完整 Markdown 正文(引用块 + 换行,每项独立一行) */
public String buildMarkdown(ClassChangeReport report, String modifier, String modifyTime) {
public String buildMarkdown(ClassChangeReport report, String modifier, String modifyTime, String branch) {
StringBuilder sb = new StringBuilder();
sb.append("# 【类变更通知】").append("\n\n");
appendHeader(sb, report, modifier, modifyTime);
appendHeader(sb, report, modifier, modifyTime, branch);
sb.append("\n## 【对象变更细节】").append("\n\n");
appendChangeDetails(sb, report);
@@ -87,11 +88,12 @@ public class WeComNotifier {
/** 头部元信息,每项一行引用(加粗) */
private void appendHeader(StringBuilder sb, ClassChangeReport report,
String modifier, String modifyTime) {
String modifier, String modifyTime, String branch) {
sb.append(quoteKvBold("变更对象", formatChangeTarget(report))).append("\n");
sb.append(quoteKvBold("修改人", colorComment(modifier))).append("\n");
sb.append(quoteKvBold("时间", colorComment(modifyTime))).append("\n");
sb.append(quoteKvBold("路径", colorComment(report.getSourceFile()))).append("\n");
sb.append(quoteKvBold("分支", colorComment(branch))).append("\n");
}
/** 渲染删除 / 重命名 / 字段变更 */

View File

@@ -14,6 +14,7 @@
变更类型: <font color="warning">**修改请求方式**</font>
路径: <font color="info">**jnpf-ftb/jnpf-ftb-biz/src/main/java/jnpf/workflow/controller/ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00

View File

@@ -15,6 +15,7 @@
- **变更类型:** <font color="warning">**修改参数**</font>
- **URI** **POST** `/apply/clockIn`
- **路径:** <font color="info">**jnpf-ftb/jnpf-ftb-biz/src/main/java/jnpf/workflow/controller/ApplyClockInController.java**</font>
- **分支:** code/code_change_detection_v1.0
---------------------------------------
@@ -51,6 +52,7 @@
- **变更类型:** <font color="warning">**修改参数**</font>
- **URI** **GET** `/apply/clockIn/{id}`
- **路径:** <font color="info">**jnpf-ftb/.../ApplyClockInController.java**</font>
- **分支:** code/code_change_detection_v1.0
---------------------------------------

View File

@@ -12,6 +12,7 @@
变更类型: <font color="warning">**修改路径**</font>
路径: <font color="info">**jnpf-ftb/jnpf-ftb-biz/src/main/java/jnpf/workflow/controller/ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00
@@ -31,6 +32,7 @@
变更类型: <font color="warning">**新增接口**</font>
路径: <font color="info">**jnpf-ftb/.../ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00
@@ -52,6 +54,7 @@
变更类型: <font color="warning">**删除接口**</font>
路径: <font color="info">**jnpf-ftb/.../ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00

View File

@@ -11,14 +11,14 @@ Push 触发 CI 后,按变更类的后缀(`Dto` / `Vo` / `Entity` / `Model`
| `#` / `##` / `###` | 标题(主区块用【】) |
| `` `行内代码` `` | 字段名、URI |
| `>` | 引用行(每项一行) |
| `**bold**` | 头部行、统计行加粗 |
| `**bold**` | 头部行、统计行加粗 |
| `<font color="info">` | 绿类名、新增、HTTP 方法、新类型 |
| `<font color="comment">` | 灰:说明、路径、无影响 |
| `<font color="warning">` | 橙:[修改]/[删除]、旧类型、统计数字 |
## 布局约定
1. **# 【类变更通知】** — 头部 4 项,每项一行 `>**标签: 值**`(加粗,冒号后两空格);变更对象括号内展示类中文说明(@Schema / @ApiModel / Javadoc无说明则仅类名
1. **# 【类变更通知】** — 头部 5(新增「分支」),每项一行 `>**标签: 值**`(加粗,冒号后两空格);变更对象括号内展示类中文说明(@Schema / @ApiModel / Javadoc无说明则仅类名
2. **## 【对象变更细节】** — 统计行 + 每条变更单行(标签/说明/类型合并)
3. **## 【影响范围】** — 各 ### 小节内,每项一行引用
@@ -31,6 +31,7 @@ Push 触发 CI 后,按变更类的后缀(`Dto` / `Vo` / `Entity` / `Model`
> **修改人: <font color="comment">dongzi</font>**
> **时间: <font color="comment">2026-06-07 20:14:35</font>**
> **路径: <font color="comment">jnpf-ftb/.../ApplyAttendanceChangeDto.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
```
## 影响范围

View File

@@ -15,6 +15,7 @@
> **修改人: <font color="comment">dongzi</font>**
> **时间: <font color="comment">2026-06-07 20:14:35</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/model/workflow/dto/ApplyAttendanceChangeDto.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -14,6 +14,7 @@
> **修改人: <font color="comment">张三</font>**
> **时间: <font color="comment">2026-06-07 14:30:00</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/entity/training/TrainingPositionEntity.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -14,6 +14,7 @@
> **修改人: <font color="comment">张三</font>**
> **时间: <font color="comment">2026-06-07 14:30:00</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/model/attendance/AttendanceRuleModel.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -15,6 +15,7 @@
> **修改人: <font color="comment">张三</font>**
> **时间: <font color="comment">2026-06-07 14:30:00</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/model/attendance/vo/AttendanceDetailVo.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -14,6 +14,7 @@
变更类型: <font color="warning">**修改请求方式**</font>
路径: <font color="info">**jnpf-ftb/jnpf-ftb-biz/src/main/java/jnpf/workflow/controller/ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00

View File

@@ -15,6 +15,7 @@
- **变更类型:** <font color="warning">**修改参数**</font>
- **URI** **POST** `/apply/clockIn`
- **路径:** <font color="info">**jnpf-ftb/jnpf-ftb-biz/src/main/java/jnpf/workflow/controller/ApplyClockInController.java**</font>
- **分支:** code/code_change_detection_v1.0
---------------------------------------
@@ -51,6 +52,7 @@
- **变更类型:** <font color="warning">**修改参数**</font>
- **URI** **GET** `/apply/clockIn/{id}`
- **路径:** <font color="info">**jnpf-ftb/.../ApplyClockInController.java**</font>
- **分支:** code/code_change_detection_v1.0
---------------------------------------

View File

@@ -12,6 +12,7 @@
变更类型: <font color="warning">**修改路径**</font>
路径: <font color="info">**jnpf-ftb/jnpf-ftb-biz/src/main/java/jnpf/workflow/controller/ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00
@@ -31,6 +32,7 @@
变更类型: <font color="warning">**新增接口**</font>
路径: <font color="info">**jnpf-ftb/.../ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00
@@ -52,6 +54,7 @@
变更类型: <font color="warning">**删除接口**</font>
路径: <font color="info">**jnpf-ftb/.../ApplyClockInController.java**</font>
分支: code/code_change_detection_v1.0
修改人: dongzi
修改时间: 2026-06-08 16:30:00

View File

@@ -11,14 +11,14 @@ Push 触发 CI 后,按变更类的后缀(`Dto` / `Vo` / `Entity` / `Model`
| `#` / `##` / `###` | 标题(主区块用【】) |
| `` `行内代码` `` | 字段名、URI |
| `>` | 引用行(每项一行) |
| `**bold**` | 头部行、统计行加粗 |
| `**bold**` | 头部行、统计行加粗 |
| `<font color="info">` | 绿类名、新增、HTTP 方法、新类型 |
| `<font color="comment">` | 灰:说明、路径、无影响 |
| `<font color="warning">` | 橙:[修改]/[删除]、旧类型、统计数字 |
## 布局约定
1. **# 【类变更通知】** — 头部 4 项,每项一行 `>**标签: 值**`(加粗,冒号后两空格);变更对象括号内展示类中文说明(@Schema / @ApiModel / Javadoc无说明则仅类名
1. **# 【类变更通知】** — 头部 5(新增「分支」),每项一行 `>**标签: 值**`(加粗,冒号后两空格);变更对象括号内展示类中文说明(@Schema / @ApiModel / Javadoc无说明则仅类名
2. **## 【对象变更细节】** — 统计行 + 每条变更单行(标签/说明/类型合并)
3. **## 【影响范围】** — 各 ### 小节内,每项一行引用
@@ -31,6 +31,7 @@ Push 触发 CI 后,按变更类的后缀(`Dto` / `Vo` / `Entity` / `Model`
> **修改人: <font color="comment">dongzi</font>**
> **时间: <font color="comment">2026-06-07 20:14:35</font>**
> **路径: <font color="comment">jnpf-ftb/.../ApplyAttendanceChangeDto.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
```
## 影响范围

View File

@@ -15,6 +15,7 @@
> **修改人: <font color="comment">dongzi</font>**
> **时间: <font color="comment">2026-06-07 20:14:35</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/model/workflow/dto/ApplyAttendanceChangeDto.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -14,6 +14,7 @@
> **修改人: <font color="comment">张三</font>**
> **时间: <font color="comment">2026-06-07 14:30:00</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/entity/training/TrainingPositionEntity.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -14,6 +14,7 @@
> **修改人: <font color="comment">张三</font>**
> **时间: <font color="comment">2026-06-07 14:30:00</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/model/attendance/AttendanceRuleModel.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】

View File

@@ -15,6 +15,7 @@
> **修改人: <font color="comment">张三</font>**
> **时间: <font color="comment">2026-06-07 14:30:00</font>**
> **路径: <font color="comment">jnpf-ftb/jnpf-ftb-entity/src/main/java/jnpf/model/attendance/vo/AttendanceDetailVo.java</font>**
> **分支: <font color="comment">code/code_change_detection_v1.0</font>**
## 【对象变更细节】