## 根因 `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 teachers, Integer schId)`**:批量查询组关系并回填到每个教师的 `@Transient groupList` 字段,复用项目既有模式(SchTeacherService.java:96-98 的 `findByTeaIdIn` + `groupingBy`): ```java private void fillGroupList(List teachers, Integer schId) { if (teachers == null || teachers.isEmpty()) return; List teaIds = teachers.stream() .map(SchTeacher::getTeaId) .filter(Objects::nonNull) .collect(Collectors.toList()); if (teaIds.isEmpty()) return; List relations = (schId != null) ? schTeacherGroupRepository.findByTeaIdInAndSchId(teaIds, schId) : schTeacherGroupRepository.findByTeaIdIn(teaIds); Map> 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,且键名为原始大写形式)。