Files
UserclassService/.zcode/plans/plan-sess_c50300fe-a0f6-414e-ad2c-09599f93480a.md
T
wanghu cee411472a
build / build-push (push) Successful in 1m4s
同步班级学生
2026-10-21 08:47:21 +08:00

3.5 KiB
Raw Blame History

根因

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):

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())));
}
  1. 三个接口调用处:
    • 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,且键名为原始大写形式)。