49 lines
3.5 KiB
Markdown
49 lines
3.5 KiB
Markdown
## 根因
|
||
|
||
`TeainfoController.convertToTeaInfoVO`(TeainfoController.java:84-86)检查 `teacher.getGroupList()`,但它是一个 `@Transient` 字段,而 `getSchTeacherList` 查询链路(SchTeacherCacheService.java:36-44)只查 `sch_teacher` 本表、从不填充它。因此**每个教师都在第 86 行 `return null`**,`stream().map()` 不过滤 null,接口最终返回 `200 OK + [null, null, ...]`。`GetTeainfo` 和 `GetArrTeainfo` 共用同一转换方法,有一模一样的 bug。
|
||
|
||
## 修复方案
|
||
|
||
### 改动 1:TeainfoController.java(修复 null 元素)
|
||
|
||
1. **注入 `SchTeacherGroupRepository`**(新增 `@Autowired` 字段 + import:`SchTeacherGroupRepository`、`java.util.Map`、`java.util.Collections`、`java.util.Objects`)。
|
||
|
||
2. **新增私有方法 `fillGroupList(List<SchTeacher> teachers, Integer schId)`**:批量查询组关系并回填到每个教师的 `@Transient groupList` 字段,复用项目既有模式(SchTeacherService.java:96-98 的 `findByTeaIdIn` + `groupingBy`):
|
||
|
||
```java
|
||
private void fillGroupList(List<SchTeacher> teachers, Integer schId) {
|
||
if (teachers == null || teachers.isEmpty()) return;
|
||
List<Integer> teaIds = teachers.stream()
|
||
.map(SchTeacher::getTeaId)
|
||
.filter(Objects::nonNull)
|
||
.collect(Collectors.toList());
|
||
if (teaIds.isEmpty()) return;
|
||
List<SchTeacherGroup> relations = (schId != null)
|
||
? schTeacherGroupRepository.findByTeaIdInAndSchId(teaIds, schId)
|
||
: schTeacherGroupRepository.findByTeaIdIn(teaIds);
|
||
Map<Integer, List<SchTeacherGroup>> groupMap = relations.stream()
|
||
.filter(g -> g.getTeaId() != null)
|
||
.collect(Collectors.groupingBy(SchTeacherGroup::getTeaId));
|
||
teachers.forEach(t -> t.setGroupList(groupMap.getOrDefault(t.getTeaId(), Collections.emptyList())));
|
||
}
|
||
```
|
||
|
||
3. **三个接口调用处**:
|
||
- `getSchTeainfo`(:143-147):查询后调用 `fillGroupList(teachers, resolvedSchId)`(按学校过滤组关系,保证 GroupID/SchSerID 取的是本校分组),流上加 `.filter(Objects::nonNull)` 兜底。
|
||
- `getArrTeainfo`(:107-110):调用 `fillGroupList(teachers, null)`(无学校上下文,按教师ID查全部分组),流上加 `.filter(Objects::nonNull)`。
|
||
- `getTeainfo`(:52-55):`Optional.map` 内对单个教师调用 `fillGroupList(Collections.singletonList(teacher), null)`(Java 8,不用 `List.of`)。
|
||
|
||
### 改动 2:TeaInfoVO.java(锁定 JSON 键名)
|
||
|
||
每个字段加 `@JsonProperty("原始字段名")`(如 `@JsonProperty("SchSerID") private String SchSerID;`),与同包 SchInfoVO 的写法一致,确保输出键名为 `SchSerID`/`TeaIDCard`/`GroupID` 等原始大写形式,而不是 Jackson 默认推导的 `schSerID`/`teaIDCard`。新增 import `com.fasterxml.jackson.annotation.JsonProperty`。
|
||
|
||
## 保持现状(不在本次范围)
|
||
|
||
- `TeaNo` 映射的是 `sort` 排序号、其余 12 个字段(SchName、Photo 等)从不赋值恒为 null —— 属于字段映射契约问题,另行确认。
|
||
- `findTeaIdsBySchId` 不过滤 `transfer_status`(已转出教师也会出现在列表中)—— 与其他接口口径不一致,保持现状。
|
||
- 文件中历史遗留的乱码注释不动;新增代码 UTF-8 + CRLF 与文件一致。
|
||
|
||
## 验证
|
||
|
||
- `mvn -q compile` 编译通过。
|
||
- 如有条件,本地起服务后请求 `/oapi/OATea/GetSchTeainfo?schId=xxx`,确认返回教师数组(元素为对象而非 null,且键名为原始大写形式)。 |