update 数据同步

develop
hhb@hotmail.com 3 weeks ago
parent dc5dfc1348
commit ffe07a6e1b

@ -36,6 +36,7 @@ public interface PK {
String CLASS_RESULT = "ExamClassResult-%s";
String EXAM = "Exam-%s";
String PTTEACHER = "PtTeacher-%s";
String TEACHER = "Teacher-%s";
/**
*

@ -41,6 +41,21 @@ public class TeacherController {
Map<String, Object> res = teacherService.getTeacherDetail(teacherDto,request);
return R.success(res);
}
@PostMapping("compareData")
@ApiOperation("比对IES5相关数据")
public R<Map<String, Object>> compareData(@Valid @RequestBody TeacherDto teacherDto, HttpServletRequest request) {
Map<String, Object> res = teacherService.compareData(teacherDto,request);
return R.success(res);
}
@PostMapping("getTeacherFromIes")
@ApiOperation("获取IES5教师基础数据内容")
public R<List<GpTeacherVo>> getTeacherFromIes(@Valid @RequestBody TeacherDto teacherDto, HttpServletRequest request) {
List<GpTeacherVo> res = teacherService.getTeacherFromIes(teacherDto,request);
return R.success(res);
}
@PostMapping("getTeacherCountRecordOfWeek")
@ApiOperation("获取当前学期指定教师每周课程数")
public R<Map<Long, Integer>> getTeacherCountRecordOfWeek(@Valid @RequestBody TeacherDto teacherDto) {
@ -121,4 +136,10 @@ public class TeacherController {
List<PtTeacherInfo> res = teacherService.saveOrUpdate(gpTeacherDtos,request);
return R.success(res);
}
@PostMapping("dataSync")
@ApiOperation("同步教师信息")
public R<String> dataSync(@Valid @RequestBody GpTeacherRequest gpTeacherDtos, HttpServletRequest request) {
teacherService.dataSync(gpTeacherDtos,request);
return R.success("同步成功");
}
}

@ -15,6 +15,8 @@ import java.util.Map;
public interface TeacherService {
List<Map<String,Integer>> getTeacherList(TeacherDto teacherDto);
Map<String, Object> compareData(TeacherDto teacherDto, HttpServletRequest request);
List<GpTeacherVo> getTeacherFromIes(TeacherDto teacherDto, HttpServletRequest request);
Map<String,Object> getTeacherDetail(TeacherDto teacherDto, HttpServletRequest request);
Map<Long, Integer> getTeacherByRecord(TeacherDto teacherDto);
Map<String,Object> getTeacherLearningCategory(TeacherDto teacherDto);
@ -29,4 +31,5 @@ public interface TeacherService {
List<GpTeacherVo> batchImportPtTeachers(List<GpTeacherVo> gpTeachers, HttpServletRequest request);
List<Map<String, Object>> findTeachers(CoreUser dto, HttpServletRequest request);
List<PtTeacherInfo> saveOrUpdate(GpTeacherRequest gpTeacherRequest, HttpServletRequest request);
void dataSync(GpTeacherRequest gpTeacherRequest, HttpServletRequest request);
}

@ -162,6 +162,55 @@ public class TeacherServiceImpl implements TeacherService {
return result;
}
@Override
public Map<String, Object> compareData(TeacherDto teacherDto, HttpServletRequest request) {
Map<String, Object> res = new HashMap<>();
try {
//从IES5获取相关教师基础信息
String url = env.getProperty("ies.server-url-get-teacher-all");
Map<String, Object> teacherInfos =GroupUtil.getGroupId(teacherDto, new GroupUtil(env), request, url);
List<GpTeacherVo> existingTeachers = new ArrayList<>();
if (teacherInfos != null) {
//转换为GpTeacherVo对象数组
List<GpTeacherVo> teachersList = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode());
String code = String.format(PK.PTTEACHER, teacherDto.getCode());
List<PtTeacherInfo> 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<PtTeacherInfo> 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<GpTeacherVo> getTeacherFromIes(TeacherDto teacherDto, HttpServletRequest request) {
List<GpTeacherVo> teachers = new ArrayList<>();
try {
//从IES5获取相关教师基础信息
String url = env.getProperty("ies.server-url-get-teacher-all");
Map<String, Object> 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<String, Object> getTeacherDetail(TeacherDto teacherDto, HttpServletRequest request) {
@ -184,39 +233,10 @@ public class TeacherServiceImpl implements TeacherService {
}
}
List<GpTeacherVo> teachersList = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode());
//List<String> phones = teachersList.stream().map(GpTeacherVo::getPhone).collect(Collectors.toList());
GpTeacherDto gpTeacherDto = new GpTeacherDto();
//gpTeacherDto.setMobiles(phones);
//Map<String, Object> tBase = getTeacherBase(gpTeacherDto, request);
//List<GpTeacher> gpTeachers = convertToGpTeacherList(tBase);
// 优化1使用Map加速查找
/*Map<String, GpTeacher> 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<GpTeacherVo> copyList = new ArrayList<>(teachersList);
// 同步保存,确保数据持久化
asyncTeacherService.asyncSavePtTeacherInfos(Collections.unmodifiableList(copyList));
//asyncTeacherService.syncSavePtTeacherInfos(teachersList); // 假设改为同步方法
// 优化查询与匹配
/* Set<String> teacherIds = teachersList.stream()
.map(GpTeacherVo::getId)
.collect(Collectors.toSet());*/
String code = String.format(PK.PTTEACHER, teacherDto.getCode());
List<PtTeacherInfo> ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherDto.getCode(),code);
@ -228,28 +248,8 @@ public class TeacherServiceImpl implements TeacherService {
Map<String, Long> degreeCount = ptTeacherInfos.stream()
.filter(gpTeacher -> StringUtils.isNotEmpty(gpTeacher.getDegree()))
.collect(Collectors.groupingBy(PtTeacherInfo::getDegree, Collectors.counting()));
//Map<String, Integer> 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<String, PtTeacherInfo> 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<SchoolTeacher> 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<String> teacherIds = gpTeacherRequest.getGpTeacherDtos().stream()
.map(GpTeacherVo::getId)
.collect(Collectors.toList());
//获取学校简易信息
List<School> schoolBases = schoolRepository.findBasePictureById(schoolCode);
List<Teacher> BaseTeachers = teacherRepository.findAllByCodeAndIdIn(schoolCode,teacherIds);
//检测teacherIds中的教师是否已存在BaseTeachers中
List<String> 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<GpTeacherVo> missTeachers = gpTeacherRequest.getGpTeacherDtos().stream()
.filter(teacher -> missIds.contains(teacher.getId()))
.collect(Collectors.toList());
List<Teacher> 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<String> teacherIds = gpTeacherRequest.getGpTeacherDtos().stream()
.map(GpTeacherVo::getId)
.collect(Collectors.toList());
String code = String.format(PK.TEACHER, schoolCode);
List<SchoolTeacher> schoolTeachers = schoolTeacherRepository.findAllByCodeAndIdIn(code, teacherIds);
//删除该对象数组
schoolTeacherRepository.deleteAll(schoolTeachers);
List<Teacher> 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}$";
/**

@ -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;

@ -25,6 +25,7 @@ public interface SchoolRepository extends CosmosRepository<School, String> {
List<School.Subject> 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<School> findBaseById(@Param("schoolId") String schoolId);
@Query("select s.picture,s.areaId from School as s where s.id = @schoolId and s.code = 'Base' ")
List<School> findBasePictureById(@Param("schoolId") String schoolId);
School findSchoolByIdAndCode(String schoolId, String code);
}

@ -13,4 +13,6 @@ import java.util.List;
public interface SchoolTeacherRepository extends CosmosRepository<SchoolTeacher, String> {
@Query("select c.id, c.name,c.job,c.subjectIds from SchoolTeacher as c where c.code = @code")
List<SchoolTeacher> findAllByCode(String code);
@Query("select c.id from SchoolTeacher as c where c.code = @code and c.id in (@ids)")
List<SchoolTeacher> findAllByCodeAndIdIn(String code, Collection<String> ids);
}

@ -33,28 +33,28 @@ public class AsyncTeacherService {
// 加载现有教师数据(假设已按学校码过滤)
Map<String, PtTeacherInfo> existingTeachers = loadExistingTeachers(teachersList);
// 收集传入教师ID集合
Set<String> incomingIds = teachersList.stream()
.map(GpTeacherVo::getId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 直接使用existingTeachers获取待停用教师
List<PtTeacherInfo> 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<String> incomingIds = teachersList.stream()
// .map(GpTeacherVo::getId)
// .filter(Objects::nonNull)
// .collect(Collectors.toSet());
//
// // 直接使用existingTeachers获取待停用教师
// List<PtTeacherInfo> 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<PtTeacherInfo> updates = teachersList.stream()

Loading…
Cancel
Save