diff --git a/src/main/java/cn/teammodel/common/PK.java b/src/main/java/cn/teammodel/common/PK.java index 486e5b3..d32b40b 100644 --- a/src/main/java/cn/teammodel/common/PK.java +++ b/src/main/java/cn/teammodel/common/PK.java @@ -36,6 +36,7 @@ public interface PK { String CLASS_RESULT = "ExamClassResult-%s"; String EXAM = "Exam-%s"; String PTTEACHER = "PtTeacher-%s"; + String TEACHER = "Teacher-%s"; /** * 构建分区键 diff --git a/src/main/java/cn/teammodel/controller/admin/controller/TeacherController.java b/src/main/java/cn/teammodel/controller/admin/controller/TeacherController.java index 2754207..825a6c0 100644 --- a/src/main/java/cn/teammodel/controller/admin/controller/TeacherController.java +++ b/src/main/java/cn/teammodel/controller/admin/controller/TeacherController.java @@ -41,6 +41,21 @@ public class TeacherController { Map res = teacherService.getTeacherDetail(teacherDto,request); return R.success(res); } + + @PostMapping("compareData") + @ApiOperation("比对IES5相关数据") + public R> compareData(@Valid @RequestBody TeacherDto teacherDto, HttpServletRequest request) { + Map res = teacherService.compareData(teacherDto,request); + return R.success(res); + } + + @PostMapping("getTeacherFromIes") + @ApiOperation("获取IES5教师基础数据内容") + public R> getTeacherFromIes(@Valid @RequestBody TeacherDto teacherDto, HttpServletRequest request) { + List res = teacherService.getTeacherFromIes(teacherDto,request); + return R.success(res); + } + @PostMapping("getTeacherCountRecordOfWeek") @ApiOperation("获取当前学期指定教师每周课程数") public R> getTeacherCountRecordOfWeek(@Valid @RequestBody TeacherDto teacherDto) { @@ -121,4 +136,10 @@ public class TeacherController { List res = teacherService.saveOrUpdate(gpTeacherDtos,request); return R.success(res); } + @PostMapping("dataSync") + @ApiOperation("同步教师信息") + public R dataSync(@Valid @RequestBody GpTeacherRequest gpTeacherDtos, HttpServletRequest request) { + teacherService.dataSync(gpTeacherDtos,request); + return R.success("同步成功"); + } } diff --git a/src/main/java/cn/teammodel/controller/admin/service/TeacherService.java b/src/main/java/cn/teammodel/controller/admin/service/TeacherService.java index 5656e7e..f80791f 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/TeacherService.java +++ b/src/main/java/cn/teammodel/controller/admin/service/TeacherService.java @@ -15,6 +15,8 @@ import java.util.Map; public interface TeacherService { List> getTeacherList(TeacherDto teacherDto); + Map compareData(TeacherDto teacherDto, HttpServletRequest request); + List getTeacherFromIes(TeacherDto teacherDto, HttpServletRequest request); Map getTeacherDetail(TeacherDto teacherDto, HttpServletRequest request); Map getTeacherByRecord(TeacherDto teacherDto); Map getTeacherLearningCategory(TeacherDto teacherDto); @@ -29,4 +31,5 @@ public interface TeacherService { List batchImportPtTeachers(List gpTeachers, HttpServletRequest request); List> findTeachers(CoreUser dto, HttpServletRequest request); List saveOrUpdate(GpTeacherRequest gpTeacherRequest, HttpServletRequest request); + void dataSync(GpTeacherRequest gpTeacherRequest, HttpServletRequest request); } diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java index a76222c..a695162 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java @@ -162,6 +162,55 @@ public class TeacherServiceImpl implements TeacherService { return result; } + @Override + public Map compareData(TeacherDto teacherDto, HttpServletRequest request) { + Map res = new HashMap<>(); + try { + //从IES5获取相关教师基础信息 + String url = env.getProperty("ies.server-url-get-teacher-all"); + Map teacherInfos =GroupUtil.getGroupId(teacherDto, new GroupUtil(env), request, url); + List existingTeachers = new ArrayList<>(); + if (teacherInfos != null) { + //转换为GpTeacherVo对象数组 + List teachersList = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode()); + String code = String.format(PK.PTTEACHER, teacherDto.getCode()); + List ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherDto.getCode(),code); + //根据ID筛选出teachersList中不在ptTeacherInfos中的数据 + existingTeachers = teachersList.stream() + .filter(t -> ptTeacherInfos.stream().anyMatch(pt -> pt.getId().equals(t.getId()))) + .collect(Collectors.toList()); + res.put("Add", existingTeachers); + //根据source属性 筛选出ptTeacherInfos中source为ies 缺在teachersList没被找到的数据 + List toDeactivate = ptTeacherInfos.stream() + .filter(pt -> pt.getSource().equals("ies")) + .filter(pt -> teachersList.stream().noneMatch(t -> t.getId().equals(pt.getId()))) + .collect(Collectors.toList()); + res.put("Delete", toDeactivate); + + } + return res; + }catch (Exception ex){ + throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "获取教师数据失败"); + } + } + + @Override + public List getTeacherFromIes(TeacherDto teacherDto, HttpServletRequest request) { + List teachers = new ArrayList<>(); + try { + //从IES5获取相关教师基础信息 + String url = env.getProperty("ies.server-url-get-teacher-all"); + Map teacherInfos = GroupUtil.getGroupId(teacherDto, new GroupUtil(env), request, url); + if (teacherInfos != null) { + //转换为GpTeacherVo对象数组 + teachers = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode()); + } + return teachers; + }catch(Exception ex){ + throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "获取教师数据失败"); + } + } + @Override public Map getTeacherDetail(TeacherDto teacherDto, HttpServletRequest request) { @@ -184,39 +233,10 @@ public class TeacherServiceImpl implements TeacherService { } } List teachersList = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode()); - //List phones = teachersList.stream().map(GpTeacherVo::getPhone).collect(Collectors.toList()); - GpTeacherDto gpTeacherDto = new GpTeacherDto(); - //gpTeacherDto.setMobiles(phones); - //Map tBase = getTeacherBase(gpTeacherDto, request); - //List gpTeachers = convertToGpTeacherList(tBase); - // 优化1:使用Map加速查找 - /*Map phoneToGpTeacher = gpTeachers.stream() - .collect(Collectors.toMap( - gp -> gp.getMobile().toLowerCase(), - Function.identity() - ));*/ - - // 处理教师信息 - /* teachersList.forEach(teacher -> { - String phoneKey = teacher.getPhone() != null ? teacher.getPhone().toLowerCase() : ""; - GpTeacher gpTeacher = phoneToGpTeacher.get(phoneKey); - if (gpTeacher != null) { - teacher.setGender(gpTeacher.getBasic() != null ? gpTeacher.getBasic().getGender() : ""); - teacher.setPracticeTime(gpTeacher.getPracticeTime() != null ? gpTeacher.getPracticeTime() : 0L); - teacher.setDegree(gpTeacher.getDegree() != null ? gpTeacher.getDegree() : ""); - } - });*/ List copyList = new ArrayList<>(teachersList); // 同步保存,确保数据持久化 asyncTeacherService.asyncSavePtTeacherInfos(Collections.unmodifiableList(copyList)); - //asyncTeacherService.syncSavePtTeacherInfos(teachersList); // 假设改为同步方法 - - // 优化查询与匹配 - /* Set teacherIds = teachersList.stream() - .map(GpTeacherVo::getId) - .collect(Collectors.toSet());*/ - String code = String.format(PK.PTTEACHER, teacherDto.getCode()); List ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherDto.getCode(),code); @@ -228,28 +248,8 @@ public class TeacherServiceImpl implements TeacherService { Map degreeCount = ptTeacherInfos.stream() .filter(gpTeacher -> StringUtils.isNotEmpty(gpTeacher.getDegree())) .collect(Collectors.groupingBy(PtTeacherInfo::getDegree, Collectors.counting())); - //Map practiceCount = getStringIntegerMap(teacherDto, gpTeachers); - - /*if(!genderCount.containsKey("F")) { - genderCount.put("F",0L); - }else if (!genderCount.containsKey("S")) { - genderCount.put("S",0L); - }else if (!genderCount.containsKey("M")){ - genderCount.put("M",0L); - }*/ - teachers.put("gender", genderCount); teachers.put("degree", degreeCount); - -// Map idToPtTeacherInfo = ptTeacherInfos.stream() -// .collect(Collectors.toMap(PtTeacherInfo::getId, Function.identity())); -// -// teachersList.forEach(teacher -> { -// PtTeacherInfo info = idToPtTeacherInfo.get(teacher.getId()); -// if (info != null) { -// teacher.setIdentity(info.getIdentity()); -// } -// }); teachers.put("info", ptTeacherInfos); @@ -1773,6 +1773,113 @@ public class TeacherServiceImpl implements TeacherService { return missingTeachers; } + @Override + public void dataSync(GpTeacherRequest gpTeacherRequest, HttpServletRequest request) { + String schoolCode = SecurityUtil.getLoginUser().getSchoolId(); + try { + if (gpTeacherRequest.getOpt().equalsIgnoreCase("Add")) { + List schoolTeachers = new ArrayList<>(); + for (GpTeacherVo teacher : gpTeacherRequest.getGpTeacherDtos()) { + //处理新加入的学校教师 + String code = String.format(PK.TEACHER, teacher.getCode()); + SchoolTeacher schoolTeacher = new SchoolTeacher(); + schoolTeacher.setName(teacher.getName()); + schoolTeacher.setPicture(teacher.getPicture()); + schoolTeacher.setJob(teacher.getJob()); + schoolTeacher.setSubjectIds(teacher.getSubjectIds()); + schoolTeacher.setPeriodId(teacher.getPeriodId()); + schoolTeacher.setRoles(teacher.getRoles()); + schoolTeacher.setStatus("join"); + schoolTeacher.setCreateTime(System.currentTimeMillis()); + schoolTeacher.setId(teacher.getId()); + schoolTeacher.setCode(code); + schoolTeacher.setSize(0); + schoolTeacher.setPermissions(new ArrayList<>()); + schoolTeachers.add(schoolTeacher); + } + schoolTeacherRepository.saveAll(schoolTeachers); + //处理已存在教师得Base信息,先查询变更教师所有得Base信息 + List teacherIds = gpTeacherRequest.getGpTeacherDtos().stream() + .map(GpTeacherVo::getId) + .collect(Collectors.toList()); + //获取学校简易信息 + List schoolBases = schoolRepository.findBasePictureById(schoolCode); + List BaseTeachers = teacherRepository.findAllByCodeAndIdIn(schoolCode,teacherIds); + //检测teacherIds中的教师是否已存在BaseTeachers中 + List missIds = teacherIds.stream() + .filter(id -> !BaseTeachers.stream().map(Teacher::getId).collect(Collectors.toList()).contains(id)) + .collect(Collectors.toList()); + if (!missIds.isEmpty()) { + //根据missIds筛选出gpTeacherRequest.getGpTeacherDtos()的对象数组 + List missTeachers = gpTeacherRequest.getGpTeacherDtos().stream() + .filter(teacher -> missIds.contains(teacher.getId())) + .collect(Collectors.toList()); + List teachers = new ArrayList<>(); + for (GpTeacherVo missTeacher : missTeachers) { + Teacher teacher = new Teacher(); + teacher.setId(missTeacher.getId()); + teacher.setName(missTeacher.getName()); + teacher.setPicture(missTeacher.getPicture()); + teacher.setDefaultSchool(schoolCode); + teacher.setCreateTime(System.currentTimeMillis()); + teacher.setPk("Teacher"); + teacher.setCode("Base"); + teacher.setPicture(missTeacher.getPicture()); + Teacher.School school = new Teacher.School(); + school.setSchoolId(schoolBases.get(0).getId()); + school.setName(schoolBases.get(0).getName()); + school.setPicture(schoolBases.get(0).getPicture()); + school.setAreaId(schoolBases.get(0).getAreaId()); + school.setStatus("join"); + school.setTime(System.currentTimeMillis()); + teacher.setSchools(Collections.singletonList(school)); + Teacher.Area area = new Teacher.Area(); + area.setAreaId(schoolBases.get(0).getAreaId()); + area.setName(schoolBases.get(0).getAreaId()); + area.setStatus("join"); + teacher.setArea(area); + teacher.setLoginInfos(new ArrayList<>()); + teacher.setSize(0); + teachers.add(teacher); + } + teacherRepository.saveAll(teachers); + }else { + BaseTeachers.forEach(teacher -> { + Teacher.School school = new Teacher.School(); + school.setSchoolId(schoolBases.get(0).getId()); + school.setName(schoolBases.get(0).getName()); + school.setPicture(schoolBases.get(0).getPicture()); + school.setAreaId(schoolBases.get(0).getAreaId()); + school.setStatus("join"); + school.setTime(System.currentTimeMillis()); + teacher.setSchools(Collections.singletonList(school)); + }); + teacherRepository.saveAll(BaseTeachers); + } + + + }else { + //筛选出删除的教师ID + List teacherIds = gpTeacherRequest.getGpTeacherDtos().stream() + .map(GpTeacherVo::getId) + .collect(Collectors.toList()); + String code = String.format(PK.TEACHER, schoolCode); + List schoolTeachers = schoolTeacherRepository.findAllByCodeAndIdIn(code, teacherIds); + //删除该对象数组 + schoolTeacherRepository.deleteAll(schoolTeachers); + List teachers = teacherRepository.findAllByCodeAndIdIn(schoolCode, teacherIds); + //移除teachers中含有schoolId为schoolCode的对象 + teachers = teachers.stream().filter(teacher -> !teacher.getSchools().stream() + .map(Teacher.School::getSchoolId).collect(Collectors.toList()) + .contains(schoolCode)).collect(Collectors.toList()); + teacherRepository.saveAll(teachers); + + } + }catch (Exception e) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "同步数据异常"); + } + } + // 手机号正则表达式(中国大陆) private static final String PHONE_REGEX = "^1\\d{10}$"; /** diff --git a/src/main/java/cn/teammodel/model/entity/school/Teacher.java b/src/main/java/cn/teammodel/model/entity/school/Teacher.java index 6f91aed..8371a0c 100644 --- a/src/main/java/cn/teammodel/model/entity/school/Teacher.java +++ b/src/main/java/cn/teammodel/model/entity/school/Teacher.java @@ -27,6 +27,10 @@ public class Teacher extends BaseItem { private String lang; private String pk; + public void setArea(Area area) { + + } + @Data public static class School { private String schoolId; diff --git a/src/main/java/cn/teammodel/repository/SchoolRepository.java b/src/main/java/cn/teammodel/repository/SchoolRepository.java index cc98af9..8d865f6 100644 --- a/src/main/java/cn/teammodel/repository/SchoolRepository.java +++ b/src/main/java/cn/teammodel/repository/SchoolRepository.java @@ -25,6 +25,7 @@ public interface SchoolRepository extends CosmosRepository { List findSubjectById(@Param("schoolId") String schoolId, @Param("periodId") String periodId); @Query("select s.period,s.subjects from School as s where s.id = @schoolId and s.code = 'Base' ") List findBaseById(@Param("schoolId") String schoolId); - + @Query("select s.picture,s.areaId from School as s where s.id = @schoolId and s.code = 'Base' ") + List findBasePictureById(@Param("schoolId") String schoolId); School findSchoolByIdAndCode(String schoolId, String code); } diff --git a/src/main/java/cn/teammodel/repository/SchoolTeacherRepository.java b/src/main/java/cn/teammodel/repository/SchoolTeacherRepository.java index cfb3587..316174b 100644 --- a/src/main/java/cn/teammodel/repository/SchoolTeacherRepository.java +++ b/src/main/java/cn/teammodel/repository/SchoolTeacherRepository.java @@ -13,4 +13,6 @@ import java.util.List; public interface SchoolTeacherRepository extends CosmosRepository { @Query("select c.id, c.name,c.job,c.subjectIds from SchoolTeacher as c where c.code = @code") List findAllByCode(String code); + @Query("select c.id from SchoolTeacher as c where c.code = @code and c.id in (@ids)") + List findAllByCodeAndIdIn(String code, Collection ids); } diff --git a/src/main/java/cn/teammodel/test/AsyncTeacherService.java b/src/main/java/cn/teammodel/test/AsyncTeacherService.java index 02b9583..1b046a4 100644 --- a/src/main/java/cn/teammodel/test/AsyncTeacherService.java +++ b/src/main/java/cn/teammodel/test/AsyncTeacherService.java @@ -33,28 +33,28 @@ public class AsyncTeacherService { // 加载现有教师数据(假设已按学校码过滤) Map existingTeachers = loadExistingTeachers(teachersList); - - // 收集传入教师ID集合 - Set incomingIds = teachersList.stream() - .map(GpTeacherVo::getId) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - - // 直接使用existingTeachers获取待停用教师 - List toDeactivate = existingTeachers.values().stream() - .filter(pt -> !incomingIds.contains(pt.getId()) && pt.getId() != null) - .filter(pt -> !"pt".equals(pt.getSource())) // 提前过滤无需处理的记录 - .peek(pt -> { - pt.setState(2); - pt.setVersion(pt.getVersion() + 1); - }) - .collect(Collectors.toList()); - - // 批量停用 - if (!toDeactivate.isEmpty()) { - ptTeacherRepository.saveAll(toDeactivate); - // toDeactivate.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); - } +// +// // 收集传入教师ID集合 +// Set incomingIds = teachersList.stream() +// .map(GpTeacherVo::getId) +// .filter(Objects::nonNull) +// .collect(Collectors.toSet()); +// +// // 直接使用existingTeachers获取待停用教师 +// List toDeactivate = existingTeachers.values().stream() +// .filter(pt -> !incomingIds.contains(pt.getId()) && pt.getId() != null) +// .filter(pt -> !"pt".equals(pt.getSource())) // 提前过滤无需处理的记录 +// .peek(pt -> { +// pt.setState(2); +// pt.setVersion(pt.getVersion() + 1); +// }) +// .collect(Collectors.toList()); +// +// // 批量停用 +// if (!toDeactivate.isEmpty()) { +// ptTeacherRepository.saveAll(toDeactivate); +// // toDeactivate.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); +// } // 处理更新(合并过滤与转换操作) List updates = teachersList.stream()