From a0f789bd074a6eb8d5b4e6c20e4f2f9856210d25 Mon Sep 17 00:00:00 2001 From: "hhb@hotmail.com" Date: Thu, 15 May 2025 10:13:22 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=EF=BC=8C=E4=BA=94=E8=82=B2=E7=AD=89=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MoralEducationController.java | 17 +- .../admin/controller/TeacherController.java | 8 + .../admin/service/FiveEducationService.java | 10 + .../admin/service/MoralEducationService.java | 10 +- .../admin/service/TeacherService.java | 2 + .../impl/FiveEducationServiceImpl.java | 53 ++++ .../impl/MoralEducationServiceImpl.java | 151 +++++----- .../service/impl/TeacherServiceImpl.java | 279 ++++++++++++++++-- .../model/dto/admin/Moral/MoralDto.java | 29 ++ .../model/dto/admin/common/FiveDto.java | 16 + .../model/entity/teacher/PtTeacherInfo.java | 31 +- .../teammodel/model/vo/admin/GpTeacherVo.java | 6 +- .../teammodel/test/AsyncTeacherService.java | 68 ++++- .../java/cn/teammodel/utils/GroupUtil.java | 58 ++++ src/main/resources/application.yml | 11 +- src/main/resources/logback-spring.xml | 31 ++ src/main/resources/logback.xml | 17 -- 17 files changed, 649 insertions(+), 148 deletions(-) create mode 100644 src/main/java/cn/teammodel/controller/admin/service/FiveEducationService.java create mode 100644 src/main/java/cn/teammodel/controller/admin/service/impl/FiveEducationServiceImpl.java create mode 100644 src/main/java/cn/teammodel/model/dto/admin/Moral/MoralDto.java create mode 100644 src/main/java/cn/teammodel/model/dto/admin/common/FiveDto.java create mode 100644 src/main/resources/logback-spring.xml delete mode 100644 src/main/resources/logback.xml diff --git a/src/main/java/cn/teammodel/controller/admin/controller/MoralEducationController.java b/src/main/java/cn/teammodel/controller/admin/controller/MoralEducationController.java index d17458a..290cc91 100644 --- a/src/main/java/cn/teammodel/controller/admin/controller/MoralEducationController.java +++ b/src/main/java/cn/teammodel/controller/admin/controller/MoralEducationController.java @@ -2,6 +2,7 @@ package cn.teammodel.controller.admin.controller; import cn.teammodel.common.R; import cn.teammodel.controller.admin.service.MoralEducationService; +import cn.teammodel.model.dto.admin.Moral.MoralDto; import cn.teammodel.model.dto.admin.labor.FindDto; import cn.teammodel.model.dto.admin.labor.LaborDto; import io.swagger.annotations.Api; @@ -25,8 +26,8 @@ public class MoralEducationController { private MoralEducationService moralEducationService; @PostMapping("getMoralAnalysis") @ApiOperation("获取劳育看板详细内容") - public R> getMoralAnalysis(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) { - Map res = moralEducationService.getAnalysis(laborDto,request); + public R> getMoralAnalysis(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) { + Map res = moralEducationService.getAnalysis(moralDto,request); return R.success(res); } @PostMapping("getDetails") @@ -37,22 +38,22 @@ public class MoralEducationController { } @PostMapping("getStudentSemesterScores") @ApiOperation("分学期比对分析") - public R> getStudentSemesterScores(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) { - Map res = moralEducationService.getStudentSemesterScores(laborDto,request); + public R> getStudentSemesterScores(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) { + Map res = moralEducationService.getStudentSemesterScores(moralDto,request); return R.success(res); } @PostMapping("getStudentMonthlyScores") @ApiOperation("按月比对分析") - public R>>> getStudentMonthlyScores(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) { - Map>> res = moralEducationService.getStudentMonthlyScores(laborDto,request); + public R>>> getStudentMonthlyScores(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) { + Map>> res = moralEducationService.getStudentMonthlyScores(moralDto,request); return R.success(res); } @PostMapping("getExamDetails") @ApiOperation("获取指定考试数据") - public R> getExamDetails(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) { - Map res = moralEducationService.getExamDetails(laborDto,request); + public R> getExamDetails(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) { + Map res = moralEducationService.getExamDetails(moralDto,request); return R.success(res); } } 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 9ac243c..5e1d89c 100644 --- a/src/main/java/cn/teammodel/controller/admin/controller/TeacherController.java +++ b/src/main/java/cn/teammodel/controller/admin/controller/TeacherController.java @@ -2,7 +2,9 @@ package cn.teammodel.controller.admin.controller; import cn.teammodel.common.R; import cn.teammodel.controller.admin.service.TeacherService; +import cn.teammodel.model.dto.admin.teacher.GpTeacherDto; import cn.teammodel.model.dto.admin.teacher.TeacherDto; +import cn.teammodel.model.vo.admin.GpTeacherVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; @@ -97,4 +99,10 @@ public class TeacherController { teacherService.delete(teacherDto); return R.success("删除成功"); } + @PostMapping("batchImportPtTeachers") + @ApiOperation("批量导入教师信息") + public R> batchImportPtTeachers(@Valid @RequestBody List gpTeacherDtos, HttpServletRequest request) { + List res = teacherService.batchImportPtTeachers(gpTeacherDtos,request); + return R.success(res); + } } diff --git a/src/main/java/cn/teammodel/controller/admin/service/FiveEducationService.java b/src/main/java/cn/teammodel/controller/admin/service/FiveEducationService.java new file mode 100644 index 0000000..3a365cf --- /dev/null +++ b/src/main/java/cn/teammodel/controller/admin/service/FiveEducationService.java @@ -0,0 +1,10 @@ +package cn.teammodel.controller.admin.service; + +import cn.teammodel.model.dto.admin.common.FiveDto; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +public interface FiveEducationService { + Map getAnalysis(FiveDto fiveDto, HttpServletRequest request); +} diff --git a/src/main/java/cn/teammodel/controller/admin/service/MoralEducationService.java b/src/main/java/cn/teammodel/controller/admin/service/MoralEducationService.java index 865b74c..6d1cf8e 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/MoralEducationService.java +++ b/src/main/java/cn/teammodel/controller/admin/service/MoralEducationService.java @@ -1,16 +1,16 @@ package cn.teammodel.controller.admin.service; +import cn.teammodel.model.dto.admin.Moral.MoralDto; import cn.teammodel.model.dto.admin.labor.FindDto; -import cn.teammodel.model.dto.admin.labor.LaborDto; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; public interface MoralEducationService { - Map getAnalysis(LaborDto laborDto, HttpServletRequest request); + Map getAnalysis(MoralDto moralDto, HttpServletRequest request); Map getDetails(FindDto findDto, HttpServletRequest request); - Map getStudentSemesterScores(LaborDto laborDto, HttpServletRequest request); - Map>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request); - Map getExamDetails(LaborDto laborDto,HttpServletRequest request); + Map getStudentSemesterScores(MoralDto moralDto, HttpServletRequest request); + Map>> getStudentMonthlyScores(MoralDto moralDto,HttpServletRequest request); + Map getExamDetails(MoralDto moralDto,HttpServletRequest request); } 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 341f2a2..cc90e4a 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/TeacherService.java +++ b/src/main/java/cn/teammodel/controller/admin/service/TeacherService.java @@ -3,6 +3,7 @@ package cn.teammodel.controller.admin.service; import cn.teammodel.model.dto.admin.teacher.GpTeacherDto; import cn.teammodel.model.dto.admin.teacher.TeacherDto; import cn.teammodel.model.entity.teacher.PtTeacherInfo; +import cn.teammodel.model.vo.admin.GpTeacherVo; import javax.servlet.http.HttpServletRequest; import java.util.LinkedHashMap; @@ -22,4 +23,5 @@ public interface TeacherService { void update (TeacherDto teacherDto); Map findIdentityByTmdId(TeacherDto teacherDto); void delete(TeacherDto teacherDto); + List batchImportPtTeachers(List gpTeachers, HttpServletRequest request); } diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/FiveEducationServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/FiveEducationServiceImpl.java new file mode 100644 index 0000000..08dda67 --- /dev/null +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/FiveEducationServiceImpl.java @@ -0,0 +1,53 @@ +package cn.teammodel.controller.admin.service.impl; + +import cn.teammodel.controller.admin.service.*; +import cn.teammodel.model.dto.admin.common.FiveDto; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.HttpServletRequest; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class FiveEducationServiceImpl implements FiveEducationService { + + @Autowired + private ExamService examService; + @Autowired + private LaborEducationService laborEducationService; + @Autowired + private MoralEducationService moralLaborService; + @Autowired + private ArtService artService; + @Override + public Map getAnalysis(FiveDto dto, HttpServletRequest request) { + Map integratedResult = new ConcurrentHashMap<>(); + + // 1. 处理概况分析 + if (dto.getOverViewDto() != null) { + integratedResult.put("overView", + examService.getAnalysis(dto.getOverViewDto(), request)); + } + + // 2. 处理艺术分析 + if (dto.getArtAnalysisDto() != null) { + integratedResult.put("artAnalytics", + artService.getArtAnalytics(dto.getArtAnalysisDto(), request)); + } + + // 3. 处理德育分析 + if (dto.getLaborDto() != null) { + integratedResult.put("moralAnalysis", + laborEducationService.getAnalysis(dto.getLaborDto(), request)); + } + + // 4. 处理劳育分析 + if (dto.getMoralDto() != null) { + integratedResult.put("laborAnalysis", + moralLaborService.getAnalysis(dto.getMoralDto(), request)); + } + + return integratedResult; + + } +} diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java index 187eb75..c1c0763 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java @@ -4,14 +4,13 @@ import cn.teammodel.common.ErrorCode; import cn.teammodel.common.PK; import cn.teammodel.config.exception.ServiceException; import cn.teammodel.controller.admin.service.CommonService; -import cn.teammodel.controller.admin.service.LaborEducationService; import cn.teammodel.controller.admin.service.MoralEducationService; +import cn.teammodel.model.dto.admin.Moral.MoralDto; import cn.teammodel.model.dto.admin.common.GCDto; import cn.teammodel.model.dto.admin.common.GroupDto; import cn.teammodel.model.dto.admin.common.RGroupList; import cn.teammodel.model.dto.admin.common.RMember; import cn.teammodel.model.dto.admin.labor.FindDto; -import cn.teammodel.model.dto.admin.labor.LaborDto; import cn.teammodel.model.entity.appraise.Appraise; import cn.teammodel.model.entity.appraise.AppraiseTreeNode; import cn.teammodel.model.entity.common.Exam; @@ -83,20 +82,20 @@ public class MoralEducationServiceImpl implements MoralEducationService { MoralEducationServiceImpl.environment = env; // 在初始化时将非静态字段赋值给静态字段 } @Override - public Map getAnalysis(LaborDto laborDto, HttpServletRequest request) { + public Map getAnalysis(MoralDto moralDto, HttpServletRequest request) { //根据具体参数查询相关课列内容 List records; LessonRecordQueryService queryService = new LessonRecordQueryService(lessonRecordRepository); String schoolId = SecurityUtil.getLoginUser().getSchoolId(); - String lessonRecordKey = String.format(PK.PK_LESSON_RECORD, laborDto.getCode()); - Long startTime = laborDto.getStartTime(); - Long endTime = laborDto.getEndTime(); - String subjectId = laborDto.getSubjectId(); - //String tmdId = laborDto.getTmdId(); - String grade = laborDto.getGrade(); - String periodId = laborDto.getPeriodId(); - String academicYearId = laborDto.getAcademicYearId(); + String lessonRecordKey = String.format(PK.PK_LESSON_RECORD, moralDto.getCode()); + Long startTime = moralDto.getStartTime(); + Long endTime = moralDto.getEndTime(); + String subjectId = moralDto.getSubjectId(); + //String tmdId = moralDto.getTmdId(); + String grade = moralDto.getGrade(); + String periodId = moralDto.getPeriodId(); + String academicYearId = moralDto.getAcademicYearId(); try { records = queryService.queryLessonsInParallel( @@ -127,7 +126,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { queryService.shutdown(); } //总评价数 - List classes = classRepository.findClassBySchoolIdAndPeriodId(laborDto.getPeriodId(), String.format(PK.CLASS, schoolId)); + List classes = classRepository.findClassBySchoolIdAndPeriodId(moralDto.getPeriodId(), String.format(PK.CLASS, schoolId)); if (classes.isEmpty()) { throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "暂无班级"); } @@ -159,7 +158,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { //获取所有课程下的课中活动 List exams = new ArrayList<>(); if (!recordIds.isEmpty()) { - exams = examRepository.findExamsByIds(laborDto.getSource(),recordIds); + exams = examRepository.findExamsByIds(moralDto.getSource(),recordIds); exams = exams.stream() .filter(exam -> !exam.getClasses().isEmpty()) .collect(Collectors.toList()); @@ -187,7 +186,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { } List examResults = new ArrayList<>(); if (!examIds.isEmpty()) { - examResults = examClassResultRepository.findAll(String.format(PK.CLASS_RESULT, laborDto.getCode()),examIds); + examResults = examClassResultRepository.findAll(String.format(PK.CLASS_RESULT, moralDto.getCode()),examIds); } //获取学校基础信息 List period = schoolRepository.findPeriodById(schoolId,periodId); @@ -208,11 +207,11 @@ public class MoralEducationServiceImpl implements MoralEducationService { Map> knowledgeBlockToPointsMap = getKnowledgeBlockToPointsMap(appraise); Map classScoreRate = new HashMap<>(); Map gradeScoreRate = new HashMap<>(); - if (laborDto.getClassId() != null) { - classScoreRate = calculateKnowledgeScoreRateForClass(laborDto.getClassId(), examResults, knowledgeMap, appraise, point,res,request); + if (moralDto.getClassId() != null) { + classScoreRate = calculateKnowledgeScoreRateForClass(moralDto.getClassId(), examResults, knowledgeMap, appraise, point,res,request); } - if (laborDto.getGrade() != null) { - gradeScoreRate = calculateKnowledgeScoreForGrade(laborDto.getGrade(), examResults, knowledgeMap,appraise, point,res,gradeAndClassVos,request); + if (moralDto.getGrade() != null) { + gradeScoreRate = calculateKnowledgeScoreForGrade(moralDto.getGrade(), examResults, knowledgeMap,appraise, point,res,gradeAndClassVos,request); } Map schoolScoreRate = calculateKnowledgeScoreForSchool(examResults, knowledgeMap,appraise, point,res,period,gradeAndClassVos,request); resMap.put("gradeScoreRate", gradeScoreRate); @@ -243,16 +242,16 @@ public class MoralEducationServiceImpl implements MoralEducationService { return resMap; } @Override - public Map getExamDetails(LaborDto laborDto, HttpServletRequest request) { + public Map getExamDetails(MoralDto moralDto, HttpServletRequest request) { Map resMap = new HashMap<>(); try { List examResults = new ArrayList<>(); - if (!laborDto.getExamId().isEmpty()) { + if (!moralDto.getExamId().isEmpty()) { Map>> knowledgeMap = new HashMap<>(); Map> points = new HashMap<>(); // 1. 查询考试信息 - Exam exam = examRepository.findExamById(String.format(PK.EXAM, laborDto.getTmdId()), laborDto.getExamId()).get(0); + Exam exam = examRepository.findExamById(String.format(PK.EXAM, moralDto.getTmdId()), moralDto.getExamId()).get(0); if (exam.getPapers() != null && !exam.getPapers().isEmpty()) { knowledgeMap.put(exam.getId(), exam.getPapers().get(0).getKnowledge()); points.put(exam.getId(), exam.getPapers().get(0).getPoint()); @@ -260,15 +259,15 @@ public class MoralEducationServiceImpl implements MoralEducationService { // 2. 查询考试结果 examResults = examClassResultRepository.findById( - String.format(PK.CLASS_RESULT, laborDto.getCode()), - laborDto.getClassId(), - laborDto.getExamId() + String.format(PK.CLASS_RESULT, moralDto.getCode()), + moralDto.getClassId(), + moralDto.getExamId() ); // 3. 查询知识块-知识点映射关系 Appraise appraise = appraiseRepository.findAppraiseBySchoolIdAndPeriodIdAndCode( - laborDto.getCode(), - laborDto.getPeriodId(), + moralDto.getCode(), + moralDto.getPeriodId(), PK.PK_APPRAISE ); appraise = evaluationService.buildTree(appraise); @@ -278,7 +277,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { Map knowledgeTotalScore = new HashMap<>(); if (!examResults.isEmpty()) { // 假设计算所有学生的平均分(或指定某个学生) - String studentId = laborDto.getStudentId(); // 如果传入了学生ID + String studentId = moralDto.getStudentId(); // 如果传入了学生ID calculateStudentScoreRates(studentId, examResults, knowledgeMap, points, knowledgeTotalScore); } else { // 如果没有考试数据,默认所有知识点60分 @@ -1503,23 +1502,23 @@ public class MoralEducationServiceImpl implements MoralEducationService { //获取每月各个知识库综合得分以及整体得分内容 - public Map>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request) { + public Map>> getStudentMonthlyScores(MoralDto moralDto,HttpServletRequest request) { // 1. 获取基础信息 String schoolId = SecurityUtil.getLoginUser().getSchoolId(); - String studentId = laborDto.getStudentId(); + String studentId = moralDto.getStudentId(); List classStudentIds = Collections.emptyList(); // 2. 获取相关开课记录 - List records = getLessonRecords(laborDto, schoolId); + List records = getLessonRecords(moralDto, schoolId); List res; int rightCount = 0; int wrongCount = 0; - if (laborDto.getClassId() == null) { + if (moralDto.getClassId() == null) { res = appraiseRecordRepository.getStudentRecords( String.format(PK.PK_APPRAISE_RECORD, schoolId), - laborDto.getAcademicYearId(), - laborDto.getStudentId(), - laborDto.getStartTime(), - laborDto.getEndTime(), + moralDto.getAcademicYearId(), + moralDto.getStudentId(), + moralDto.getStartTime(), + moralDto.getEndTime(), "劳育" ); //表扬的次数 @@ -1528,10 +1527,10 @@ public class MoralEducationServiceImpl implements MoralEducationService { wrongCount = (int) res.stream().filter(record -> !record.isPraise()).count(); }else { //当班级ID 存在时 获取该班级下所有名单即学生Id - List classIds = Collections.singletonList(laborDto.getClassId()); + List classIds = Collections.singletonList(moralDto.getClassId()); GroupDto groupDto = new GroupDto(); groupDto.setIds(classIds); - groupDto.setSchoolId(laborDto.getCode()); + groupDto.setSchoolId(moralDto.getCode()); String url = environment.getProperty("ies.server-url-group"); Map groupId = GroupUtil.getGroupId(groupDto, new GroupUtil(environment), request, url); List rGroupList = new ArrayList<>(); @@ -1546,7 +1545,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { } rMembers = rGroupList.stream() .flatMap(rGroupList1 -> rGroupList1.getMembers().stream()) - .filter(rMember -> rMember.getClassId().equals(laborDto.getClassId())) + .filter(rMember -> rMember.getClassId().equals(moralDto.getClassId())) .collect(Collectors.toList()); classStudentIds = rMembers.stream().map(RMember::getId).collect(Collectors.toList()); /*String className = rGroupList.stream() @@ -1556,9 +1555,9 @@ public class MoralEducationServiceImpl implements MoralEducationService { .orElse("未知班级"); // 如果未找到则返回默认值 "未知班级"*/ res = appraiseRecordRepository.getRecords( String.format(PK.PK_APPRAISE_RECORD, schoolId), - laborDto.getAcademicYearId(), - laborDto.getClassId(), - laborDto.getStudentId(), + moralDto.getAcademicYearId(), + moralDto.getClassId(), + moralDto.getStudentId(), "劳育" ); //表扬的次数 @@ -1570,20 +1569,20 @@ public class MoralEducationServiceImpl implements MoralEducationService { // 3. 获取考试及知识点映射 Map>> examKnowledgeMap = new HashMap<>(); Map> points = new HashMap<>(); - List exams = getExamsWithKnowledge(laborDto, records, examKnowledgeMap, points); + List exams = getExamsWithKnowledge(moralDto, records, examKnowledgeMap, points); // 4. 获取考试结果并按月份分组 - List targetStudents = laborDto.getClassId() != null ? + List targetStudents = moralDto.getClassId() != null ? classStudentIds : Collections.singletonList(studentId); Map> monthlyResults = getMonthlyExamResults( - schoolId, laborDto.getClassId(), exams, records, + schoolId, moralDto.getClassId(), exams, records, examKnowledgeMap, points, targetStudents // 传入目标学生列表 ); // 5. 获取知识块配置 Appraise appraise = appraiseRepository.findAppraiseBySchoolIdAndPeriodIdAndCode( - schoolId, laborDto.getPeriodId(), PK.PK_APPRAISE + schoolId, moralDto.getPeriodId(), PK.PK_APPRAISE ); appraise = evaluationService.buildTree(appraise); Map> knowledgeBlockMap = getKnowledgeBlockToPointsMap(appraise); @@ -1599,7 +1598,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { Map> finalBlockMonthlyCounts = blockMonthlyCounts; res.stream() - .filter(vo -> laborDto.getClassId() != null ? + .filter(vo -> moralDto.getClassId() != null ? targetStudents.contains(vo.getTargetId()) : studentId.equals(vo.getTargetId())) .forEach(vo -> { @@ -1634,7 +1633,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { targetStudents, monthlyResults, knowledgeBlockMap, - getMonthsBetween(laborDto.getStartTime(), laborDto.getEndTime()), + getMonthsBetween(moralDto.getStartTime(), moralDto.getEndTime()), blockMonthlyCounts ); } @@ -1676,17 +1675,17 @@ public class MoralEducationServiceImpl implements MoralEducationService { return result; } - private List getLessonRecords(LaborDto laborDto, String schoolId) { + private List getLessonRecords(MoralDto moralDto, String schoolId) { LessonRecordQueryService queryService = new LessonRecordQueryService(lessonRecordRepository); try { return queryService.queryLessonsInParallel( String.format(PK.PK_LESSON_RECORD, schoolId), - laborDto.getStartTime(), - laborDto.getEndTime(), - laborDto.getSubjectId(), + moralDto.getStartTime(), + moralDto.getEndTime(), + moralDto.getSubjectId(), null, null, - laborDto.getPeriodId() + moralDto.getPeriodId() ); } catch (InterruptedException | ExecutionException e) { throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "课程查询异常"); @@ -1695,11 +1694,11 @@ public class MoralEducationServiceImpl implements MoralEducationService { } } - private List getExamsWithKnowledge(LaborDto laborDto, List records, + private List getExamsWithKnowledge(MoralDto moralDto, List records, Map>> examKnowledgeMap, Map> points) { List lessonRecordIds = records.stream().map(LessonRecord::getId).collect(Collectors.toList()); - List exams = examRepository.findExamsByIds(laborDto.getSource(), lessonRecordIds); + List exams = examRepository.findExamsByIds(moralDto.getSource(), lessonRecordIds); exams.forEach(exam -> { if (!exam.getPapers().isEmpty() && exam.getPapers().get(0).getKnowledge() != null) { @@ -2067,9 +2066,9 @@ public class MoralEducationServiceImpl implements MoralEducationService { } // 分学期比对,分析 学期数据 - public Map getStudentSemesterScores(LaborDto laborDto,HttpServletRequest request) { + public Map getStudentSemesterScores(MoralDto moralDto,HttpServletRequest request) { // 1. 获取学期配置 - List semesters = schoolRepository.findSemestersById(laborDto.getCode(), laborDto.getPeriodId()); + List semesters = schoolRepository.findSemestersById(moralDto.getCode(), moralDto.getPeriodId()); List configs = new ArrayList<>(); for (School.Semester semester : semesters) { configs.add(new SemesterConfig(semester.getName(), semester.getStart(), semester.getMonth(), semester.getDay(), semester.getId())); @@ -2081,20 +2080,20 @@ public class MoralEducationServiceImpl implements MoralEducationService { // 学生数据处理 Map studentResult = Collections.emptyMap(); - if (StringUtils.isNotBlank(laborDto.getStudentId())) { - studentResult = processIndividual(laborDto, current, last, request); + if (StringUtils.isNotBlank(moralDto.getStudentId())) { + studentResult = processIndividual(moralDto, current, last, request); } // 班级数据处理 Map classResult = Collections.emptyMap(); - if (StringUtils.isNotBlank(laborDto.getClassId())) { - classResult = processClass(laborDto, current, last, request); + if (StringUtils.isNotBlank(moralDto.getClassId())) { + classResult = processClass(moralDto, current, last, request); } // 组合最终结果 - return combineAllResults(laborDto, studentResult, classResult); + return combineAllResults(moralDto, studentResult, classResult); } - private Map combineAllResults(LaborDto dto, + private Map combineAllResults(MoralDto dto, Map studentResult, Map classResult) { Map finalResult = new LinkedHashMap<>(); @@ -2110,7 +2109,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { return finalResult; } - private Map processIndividual(LaborDto dto, + private Map processIndividual(MoralDto dto, SemesterPeriod current, SemesterPeriod last, HttpServletRequest request) { @@ -2120,12 +2119,12 @@ public class MoralEducationServiceImpl implements MoralEducationService { return combineResults(dto, currentData, lastData); } - private Map processClass(LaborDto dto, + private Map processClass(MoralDto dto, SemesterPeriod current, SemesterPeriod last, HttpServletRequest request) { // 克隆DTO并清除学生ID - LaborDto classDto = new LaborDto(); + MoralDto classDto = new MoralDto(); classDto.setCode(dto.getCode()); classDto.setPeriodId(dto.getPeriodId()); classDto.setClassId(dto.getClassId()); @@ -2147,7 +2146,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { return combineClassResults(classDto, currentData, lastData); } - private Map combineClassResults(LaborDto dto, + private Map combineClassResults(MoralDto dto, Map current, Map last) { Map result = new LinkedHashMap<>(); @@ -2160,7 +2159,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { return result; } - private List> buildClassScoreBlocks(LaborDto dto, + private List> buildClassScoreBlocks(MoralDto dto, Map current, Map last) { @@ -2325,7 +2324,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { } // 处理学期数据 - private Map processSemesterData(LaborDto laborDto, + private Map processSemesterData(MoralDto moralDto, SemesterPeriod semester, HttpServletRequest request, boolean isCurrent, @@ -2333,11 +2332,11 @@ public class MoralEducationServiceImpl implements MoralEducationService { Map result = new HashMap<>(); // 1. 设置时间范围查询条件 - laborDto.setStartTime(convertToTimestamp(semester.startDate)); - laborDto.setEndTime(convertToTimestamp(semester.endDate)); + moralDto.setStartTime(convertToTimestamp(semester.startDate)); + moralDto.setEndTime(convertToTimestamp(semester.endDate)); // 2. 获取原始分析数据 - Map analysisData = getAnalysis(laborDto, request); + Map analysisData = getAnalysis(moralDto, request); if (isClassMod) { // 班级知识点统计 @@ -2359,7 +2358,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { if (isCurrent) { List> scores = (List>) analysisData.get("scores"); Map knowledgeCounts = scores.stream() - .filter(s -> laborDto.getStudentId().equals(s.get("studentId"))) + .filter(s -> moralDto.getStudentId().equals(s.get("studentId"))) .findFirst() .map(s -> (List>) s.get("appraises")) .map(appraises -> appraises.stream() @@ -2373,7 +2372,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { } // 4. 提取综合得分 - Map blockScores = extractBlockScores(analysisData, laborDto.getStudentId()); + Map blockScores = extractBlockScores(analysisData, moralDto.getStudentId()); result.put("blockScores", blockScores); // 5. 提取班级均分 @@ -2426,14 +2425,14 @@ public class MoralEducationServiceImpl implements MoralEducationService { } // 结果合并方法 - private Map combineResults(LaborDto laborDto, + private Map combineResults(MoralDto moralDto, Map currentData, Map lastData) { Map result = new LinkedHashMap<>(); - result.put("studentId", laborDto.getStudentId()); + result.put("studentId", moralDto.getStudentId()); - Appraise appraise = appraiseRepository.findAppraiseBySchoolIdAndPeriodIdAndCode(laborDto.getCode(), laborDto.getPeriodId(), PK.PK_APPRAISE); + Appraise appraise = appraiseRepository.findAppraiseBySchoolIdAndPeriodIdAndCode(moralDto.getCode(), moralDto.getPeriodId(), PK.PK_APPRAISE); // 获取知识块配置 appraise = evaluationService.buildTree(appraise); Set knowledgeBlocks = loadKnowledgeBlocks(appraise); 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 32d24bb..fd4a8d0 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 @@ -32,14 +32,18 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.core.env.Environment; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; +import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.File; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; @@ -78,6 +82,9 @@ public class TeacherServiceImpl implements TeacherService { private Environment env; private static final double K = 0.08; // 衰减系数常量 + // 添加日志对象 + private static final Logger logger = LoggerFactory.getLogger(TeacherServiceImpl.class); + // 引入缓存,需根据实际情况配置大小和过期时间 每次服务重启时 缓存会清空 public static final Cache PT_TEACHER_CACHE = CacheBuilder.newBuilder() .maximumSize(500) @@ -159,20 +166,20 @@ public class TeacherServiceImpl implements TeacherService { try { teachers = GroupUtil.getGroupId(teacherDto,new GroupUtil(env), request,url); List teachersList = convertToGpTeacherVoList(teachers, teacherDto.getCode()); - List phones = teachersList.stream().map(GpTeacherVo::getPhone).collect(Collectors.toList()); + //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); + //gpTeacherDto.setMobiles(phones); + //Map tBase = getTeacherBase(gpTeacherDto, request); + //List gpTeachers = convertToGpTeacherList(tBase); // 优化1:使用Map加速查找 - Map phoneToGpTeacher = gpTeachers.stream() + /*Map phoneToGpTeacher = gpTeachers.stream() .collect(Collectors.toMap( gp -> gp.getMobile().toLowerCase(), Function.identity() - )); + ));*/ // 处理教师信息 - teachersList.forEach(teacher -> { + /* teachersList.forEach(teacher -> { String phoneKey = teacher.getPhone() != null ? teacher.getPhone().toLowerCase() : ""; GpTeacher gpTeacher = phoneToGpTeacher.get(phoneKey); if (gpTeacher != null) { @@ -180,21 +187,22 @@ public class TeacherServiceImpl implements TeacherService { teacher.setPracticeTime(gpTeacher.getPracticeTime() != null ? gpTeacher.getPracticeTime() : 0L); teacher.setDegree(gpTeacher.getDegree() != null ? gpTeacher.getDegree() : ""); } - }); - Map genderCount = gpTeachers.stream() - .collect(Collectors.groupingBy(gpTeacher -> gpTeacher.getBasic().getGender(), Collectors.counting())); - Map degreeCount = gpTeachers.stream() + });*/ + Map genderCount = teachersList.stream() + .filter(gpTeacher -> gpTeacher.getGender() != null) + .collect(Collectors.groupingBy(GpTeacherVo::getGender, Collectors.counting())); + Map degreeCount = teachersList.stream() .filter(gpTeacher -> gpTeacher.getDegree() != null) - .collect(Collectors.groupingBy(GpTeacher::getDegree, Collectors.counting())); + .collect(Collectors.groupingBy(GpTeacherVo::getDegree, Collectors.counting())); //Map practiceCount = getStringIntegerMap(teacherDto, gpTeachers); - if(!genderCount.containsKey("F")) { + /*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); @@ -208,8 +216,8 @@ public class TeacherServiceImpl implements TeacherService { .map(GpTeacherVo::getId) .collect(Collectors.toSet()); - //String code = teacherDto.getCode() +"-"+ teacherDto.getTmdId(); - List ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, teacherDto.getCode()); + String code = String.format(PK.PTTEACHER, teacherDto.getCode()); + List ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, code); Map idToPtTeacherInfo = ptTeacherInfos.stream() .collect(Collectors.toMap(PtTeacherInfo::getId, Function.identity())); @@ -220,7 +228,7 @@ public class TeacherServiceImpl implements TeacherService { } }); teachers.put("info", teachersList); - teachers.remove("teachers"); + //teachers.remove("teachers"); }catch (Exception e) { @@ -230,6 +238,7 @@ public class TeacherServiceImpl implements TeacherService { return teachers; } + private List convertToGpTeacherVoList(Map teachers,String code) { List teachersList = new ArrayList<>(); for (Map.Entry entry : teachers.entrySet()) { @@ -355,8 +364,8 @@ public class TeacherServiceImpl implements TeacherService { teacher.setPicture((String) map.get("picture")); teacher.setIname((String) map.get("iname")); teacher.setJob((String) map.get("job")); + teacher.setStatus((String) map.get("status")); teacher.setRoles((List) map.get("roles")); - //teacher.setGroups((List) map.get("groups")); List> groupList = (List>) map.get("groups"); if (groupList != null) { @@ -372,9 +381,6 @@ public class TeacherServiceImpl implements TeacherService { } teacher.setGroups(groups); } - //teacher.setDegree((String) map.get("degree")); - //teacher.setPracticeTime((String) map.get("practiceTime")); - //teacher.setGender((String) map.get("gender")); teacher.setNote((String) map.get("note")); teacher.setSubjectIds((List) map.get("subjectIds")); teacher.setSubjectNames((List) map.get("subjectNames")); @@ -662,11 +668,6 @@ public class TeacherServiceImpl implements TeacherService { }else { teacher.setGender(""); } - if (gpTeacher.getPracticeTime() != null && gpTeacher.getPracticeTime() > 0) { - teacher.setPracticeTime(gpTeacher.getPracticeTime()); - }else { - teacher.setPracticeTime(0L); - } if(gpTeacher.degree != null) { teacher.setDegree(gpTeacher.degree); }else { @@ -1441,6 +1442,232 @@ public class TeacherServiceImpl implements TeacherService { } } + @Override + public List batchImportPtTeachers(List gpTeachers,HttpServletRequest request) { + + if (gpTeachers == null || gpTeachers.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "导入数据为空"); + } + // 获取当前登录用户信息 + User loginUser = SecurityUtil.getLoginUser(); + String operator = loginUser != null ? loginUser.getName() : "system"; + String schoolCode = SecurityUtil.getLoginUser().getSchoolId(); + logger.info("用户[{}]开始批量写入教师数据,数量:{}", operator, gpTeachers.size()); + + // 检查导入数据中的教师电话号码是否重复 + + Set codeSet = new HashSet<>(); + for (GpTeacherVo teacher : gpTeachers) { + String code = teacher.getPhone(); + if (StringUtils.isBlank(code)) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "教师电话号码不能为空"); + } + if (!codeSet.add(code)) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "存在重复的电话号码: " + code); + } + } + //获取手机号集合 + List phoneNumbers = gpTeachers.stream() + .map(GpTeacherVo::getPhone) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + //校验这些手机号码是否正常 + validatePhoneNumbers(phoneNumbers); + //同理检查邮箱是否正确 + List emails = gpTeachers.stream() + .map(GpTeacherVo::getEmail) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + validateEmails(emails); + + //验证该手机号是否已在IES5中创建账号 + String url = env.getProperty("ies.server-url-get-core-user-data"); + List> userData = GroupUtil.getUsers(phoneNumbers, new GroupUtil(env), request, url); + + //从userData中获取手机号 key 为 mobile + // 提取所有已存在的 mobile 字段值 + Set existingMobiles = userData.stream() + .map(user -> (String) user.get("mobile")) + .collect(Collectors.toSet()); + // 找出未返回的手机号 + List missingPhones = phoneNumbers.stream() + .filter(phone -> !existingMobiles.contains(phone)) + .collect(Collectors.toList()); + + if (!missingPhones.isEmpty()) { + //剔除含有这些号码的gpTeachers对象 + gpTeachers.removeIf(t -> missingPhones.contains(t.getPhone())); + //throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "手机号未在IES5中创建账号: " + String.join(", ", missingPhones)); + } + + if (gpTeachers.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "手机号未在IES5中创建账号: " + String.join(", ", missingPhones)); + //return missingPhones; + } + // 提取 userData 中的 mobile 到 id 映射 + Map mobileToIdMap = new HashMap<>(); + for (Map user : userData) { + String mobile = (String) user.get("mobile"); + String id = (String) user.get("id"); + mobileToIdMap.put(mobile, id); + } + + // 给 gpTeachers 对象赋值 id + for (GpTeacherVo teacher : gpTeachers) { + String phone = teacher.getPhone(); + String userId = mobileToIdMap.get(phone); + if (userId != null) { + teacher.setId(userId); // 将匹配到的 id 赋值给 gpTeachers 对象 + } + } + + //从userData中获取手机号 key 为 mail 赋值给 gpTeachers 中每个对象中email,如果为空则赋值,不为空则跳过 + for (GpTeacherVo gpTeacher : gpTeachers) { + if (StringUtils.isBlank(gpTeacher.getEmail())) { + gpTeacher.setEmail(userData.stream() + .filter(user -> user.get("mobile").equals(gpTeacher.getPhone())) + .map(user -> (String) user.get("mail")) + .findFirst() + .orElse(null)); + } + } + //同理操作name属性 + for (GpTeacherVo gpTeacher : gpTeachers) { + if (StringUtils.isBlank(gpTeacher.getName())) { + gpTeacher.setName(userData.stream() + .filter(user -> user.get("mobile").equals(gpTeacher.getPhone())) + .map(user -> (String) user.get("name")) + .findFirst() + .orElse(null)); + } + } + + List> idCodePairs = gpTeachers.stream() + .filter(t -> t.getId() != null) + .map(t -> Pair.of(t.getId(), "PtTeacher-" + schoolCode)) + .collect(Collectors.toList()); + List idAndCode = idCodePairs.stream() + .map(pair -> new IdCodePair(pair.getLeft(), pair.getRight())) + .collect(Collectors.toList()); + List existingList = ptTeacherRepository.findByIdCodePairs(idAndCode); + + Map codeToTeacherMap = existingList.stream() + .collect(Collectors.toMap(PtTeacherInfo::getCode, Function.identity())); + + List ptTeacherInfos = new ArrayList<>(); + for (GpTeacherVo teacher : gpTeachers) { + // 数据校验 + if (StringUtils.isBlank(teacher.getName())) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "姓名不能为空"); + } + + String businessCode = "PtTeacher-" + schoolCode; + PtTeacherInfo ptTeacherInfo = codeToTeacherMap.get(businessCode); + + if (ptTeacherInfo != null) { + // 更新现有记录:保留ID,更新其他字段 + ptTeacherInfo.setName(teacher.getName()); + ptTeacherInfo.setPhone(teacher.getPhone()); + ptTeacherInfo.setEmail(teacher.getEmail()); + ptTeacherInfo.setPicture(teacher.getPicture()); + ptTeacherInfo.setJob(teacher.getJob()); + ptTeacherInfo.setSubjectIds(teacher.getSubjectIds()); + ptTeacherInfo.setRoles(teacher.getRoles()); + ptTeacherInfo.setDegree(teacher.getDegree()); + ptTeacherInfo.setGender(teacher.getGender()); + ptTeacherInfo.setGrade(teacher.getGrade()); + ptTeacherInfo.setPeriodId(teacher.getPeriodId()); + ptTeacherInfo.setAge(teacher.getAge()); + ptTeacherInfo.setTeachingAge(teacher.getTeachingAge()); + ptTeacherInfo.setStatus(teacher.getStatus()); + ptTeacherInfo.setJoinTime(teacher.getJoinTime()); + ptTeacherInfo.setSchool(teacher.getCode()); + ptTeacherInfo.setVersion(ptTeacherInfo.getVersion() + 1); // 版本号递增 + } else { + // 新增记录:生成新ID + ptTeacherInfo = new PtTeacherInfo(); + ptTeacherInfo.setId(teacher.getId()); + ptTeacherInfo.setCode(businessCode); + ptTeacherInfo.setPk("PtTeacher"); + ptTeacherInfo.setTtl(-1); + ptTeacherInfo.setName(teacher.getName()); + ptTeacherInfo.setPhone(teacher.getPhone()); + ptTeacherInfo.setEmail(teacher.getEmail()); + ptTeacherInfo.setPicture(teacher.getPicture()); + ptTeacherInfo.setJob(teacher.getJob()); + ptTeacherInfo.setSubjectIds(teacher.getSubjectIds()); + ptTeacherInfo.setRoles(teacher.getRoles()); + ptTeacherInfo.setDegree(teacher.getDegree()); + ptTeacherInfo.setGender(teacher.getGender()); + ptTeacherInfo.setGrade(teacher.getGrade()); + ptTeacherInfo.setPeriodId(teacher.getPeriodId()); + ptTeacherInfo.setAge(teacher.getAge()); + ptTeacherInfo.setTeachingAge(teacher.getTeachingAge()); + ptTeacherInfo.setStatus(teacher.getStatus()); + ptTeacherInfo.setJoinTime(teacher.getJoinTime()); + ptTeacherInfo.setState(1); + ptTeacherInfo.setIdentity(Collections.singletonList("teacher")); + ptTeacherInfo.setVersion(1); + } + ptTeacherInfos.add(ptTeacherInfo); + } + + // 数据持久化日志 + logger.info("用户[{}]即将{}教师数据(新增:{}条,更新:{}条)", + operator, + existingList.isEmpty() ? "全部新增" : "批量更新", + gpTeachers.size() - existingList.size(), + existingList.size()); + ptTeacherRepository.saveAll(ptTeacherInfos); + logger.info("用户[{}]成功完成教师数据写入,有效数据:{}条,缺失账号:{}条", + operator, + gpTeachers.size(), + missingPhones.size()); + + return missingPhones; + } + + // 手机号正则表达式(中国大陆) + private static final String PHONE_REGEX = "^1\\d{10}$"; + /** + * 校验手机号列表中的无效号码 + * @param phoneNumbers 手机号列表 + * @throws ServiceException 如果存在无效号码 + */ + public static void validatePhoneNumbers(List phoneNumbers) { + List invalidPhones = phoneNumbers.stream() + .filter(phone -> !isValidPhoneNumber(phone)) + .collect(Collectors.toList()); + + if (!invalidPhones.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "存在无效的手机号码: " + String.join(", ", invalidPhones)); + } + } + + /** + * 判断单个手机号是否合法 + * @param phone 手机号字符串 + * @return 是否有效 + */ + private static boolean isValidPhoneNumber(String phone) { + return phone != null && phone.matches(PHONE_REGEX); + } + + + private static void validateEmails(List emails) { + List invalidEmails = emails.stream() + .filter(email -> !isValidEmail(email)) + .collect(Collectors.toList()); + + if (!invalidEmails.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "邮箱格式不正确: " + String.join(", ", invalidEmails)); + } + } + // 验证邮箱 + private static boolean isValidEmail(String email) { + return StringUtils.isNotBlank(email) && email.matches("^[A-Za-z0-9+_.-]+@(.+)$"); + } + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 引入缓存,需根据实际情况配置大小和过期时间 每次服务重启时 缓存会清空 private static final Cache> REQUEST_CACHE = CacheBuilder.newBuilder() diff --git a/src/main/java/cn/teammodel/model/dto/admin/Moral/MoralDto.java b/src/main/java/cn/teammodel/model/dto/admin/Moral/MoralDto.java new file mode 100644 index 0000000..4e2d9e0 --- /dev/null +++ b/src/main/java/cn/teammodel/model/dto/admin/Moral/MoralDto.java @@ -0,0 +1,29 @@ +package cn.teammodel.model.dto.admin.Moral; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class MoralDto { + @ApiModelProperty("学校编码") + public String code; + @ApiModelProperty("TmdId") + public String tmdId; + public Long startTime; + public Long endTime; + @ApiModelProperty("学段Id") + public String periodId; + public Integer year; + @ApiModelProperty("年级") + public String grade; + public String gradeName; + @ApiModelProperty("科目信息") + public String subjectId; + public String semesterId; + private String academicYearId; + private String classId; + private String source = "1"; + private String studentId; + private String targetType; // "student" 或 "class" + private String examId; +} diff --git a/src/main/java/cn/teammodel/model/dto/admin/common/FiveDto.java b/src/main/java/cn/teammodel/model/dto/admin/common/FiveDto.java new file mode 100644 index 0000000..b481c98 --- /dev/null +++ b/src/main/java/cn/teammodel/model/dto/admin/common/FiveDto.java @@ -0,0 +1,16 @@ +package cn.teammodel.model.dto.admin.common; + +import cn.teammodel.model.dto.admin.Moral.MoralDto; +import cn.teammodel.model.dto.admin.art.ArtAnalysisDto; +import cn.teammodel.model.dto.admin.exam.OverViewDto; +import cn.teammodel.model.dto.admin.labor.LaborDto; +import lombok.Data; + +@Data +public class FiveDto { + private OverViewDto overViewDto; + private LaborDto laborDto; + private MoralDto moralDto; + private ArtAnalysisDto artAnalysisDto; + +} diff --git a/src/main/java/cn/teammodel/model/entity/teacher/PtTeacherInfo.java b/src/main/java/cn/teammodel/model/entity/teacher/PtTeacherInfo.java index ac686fb..ab323f5 100644 --- a/src/main/java/cn/teammodel/model/entity/teacher/PtTeacherInfo.java +++ b/src/main/java/cn/teammodel/model/entity/teacher/PtTeacherInfo.java @@ -19,9 +19,30 @@ public class PtTeacherInfo extends BaseItem { public String pk ; public Integer ttl ; public String school; - - //新增身份信息 - public List identity ; - public Integer version; // 添加版本控制字段 - + public String name ; + public String code ; + //这是从CoreService中获取的 phone email + public String phone ; + public String email ; + public String picture ; + public String job ; + public List subjectIds ; + public List subjectNames ; + public List roles; + public String degree; + public String gender ; + public List grade; + public String periodId ; + public List identity; + public Integer age; + public Integer teachingAge; + //教师状态 join invite 以IES5为准 + public String status; + //职称 + public String title; + //入校时间 + public Long joinTime; + //该基础信息是否有效 + public Integer state = 1; + public Integer version = 1; } diff --git a/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java b/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java index d77d37f..83fd9af 100644 --- a/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java +++ b/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java @@ -20,11 +20,15 @@ public class GpTeacherVo { public List groups; public String note ; public String degree; - public Long practiceTime ; public String gender ; + public Integer age ; + public Integer teachingAge ; + public String status ; public List grade; public String periodId ; + public Long joinTime ; public List identity; + public String title ; public Integer version = 1; @Data public static class IdNameCode{ diff --git a/src/main/java/cn/teammodel/test/AsyncTeacherService.java b/src/main/java/cn/teammodel/test/AsyncTeacherService.java index 5c9e427..637e482 100644 --- a/src/main/java/cn/teammodel/test/AsyncTeacherService.java +++ b/src/main/java/cn/teammodel/test/AsyncTeacherService.java @@ -5,9 +5,9 @@ import cn.teammodel.model.entity.teacher.PtTeacherInfo; import cn.teammodel.model.vo.admin.GpTeacherVo; import cn.teammodel.repository.PtTeacherRepository; import com.azure.cosmos.implementation.guava25.collect.Lists; -import com.itextpdf.text.log.Logger; -import com.itextpdf.text.log.LoggerFactory; import org.apache.commons.lang3.tuple.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; @@ -31,6 +31,10 @@ public class AsyncTeacherService { @Autowired private PtTeacherRepository ptTeacherRepository; + public void testLog() { + log.info("【TEST】This is a test log entry."); + } + @Transactional(rollbackFor = Exception.class) public void asyncSavePtTeacherInfos(List teachersList) { try { @@ -54,7 +58,7 @@ public class AsyncTeacherService { private Map loadExistingTeachers(List teachersList) { List idAndCode = teachersList.stream() .filter(t -> t.getId() != null) - .map(t -> new IdCodePair(t.getId(), t.getCode()+ "-" + t.getId())) + .map(t -> new IdCodePair(t.getId(), "PtTeacher-" + t.getCode())) .collect(Collectors.toList()); List existingList = ptTeacherRepository.findByIdCodePairs(idAndCode); @@ -68,22 +72,41 @@ public class AsyncTeacherService { private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map existingTeachers) { - String code = teacher.getCode() +"-"+ teacher.getId(); + String code = "PtTeacher-" + teacher.getCode(); PtTeacherInfo existing = existingTeachers.get(code); // 如果数据库无记录,直接创建新对象 if (existing == null) { return createNewPtTeacherInfo(teacher, code); } // 检查字段是否有变化 - boolean isChanged = !Objects.equals(existing.getId(), teacher.getId()); + boolean isChanged = !Objects.equals(existing.getName(), teacher.getName()) + || !Objects.equals(existing.getPicture(), teacher.getPicture()) || + !Objects.equals(existing.getEmail(), teacher.getEmail()) || + !Objects.equals(existing.getPhone(), teacher.getPhone()) || + !Objects.equals(existing.getSubjectIds(), teacher.getSubjectIds()) || + !Objects.equals(existing.getRoles(), teacher.getRoles()) || + !Objects.equals(existing.getStatus(), teacher.getStatus()) || + !Objects.equals(existing.getJob(), teacher.getJob()) || + !Objects.equals(existing.getPeriodId(), teacher.getPeriodId()) + ; // 无变化则返回null,表示无需更新 if (!isChanged) { + return null; } PtTeacherInfo updated = new PtTeacherInfo(); BeanUtils.copyProperties(existing, updated); + updated.setName(teacher.getName()); + updated.setPhone(teacher.getPhone()); + updated.setPicture(teacher.getPicture()); + updated.setEmail(teacher.getEmail()); + updated.setPeriodId(teacher.getPeriodId()); + updated.setSubjectIds(teacher.getSubjectIds()); + updated.setRoles(teacher.getRoles()); + updated.setStatus(teacher.getStatus()); + updated.setJob(teacher.getJob()); updated.setVersion(getNextVersion(updated.getId(), updated.getCode())); return updated; @@ -103,12 +126,43 @@ public class AsyncTeacherService { // 固定值 ptTeacherInfo.setPk("PtTeacher"); ptTeacherInfo.setTtl(-1); - ptTeacherInfo.setSchool(teacher.getCode()); // 基础信息映射 ptTeacherInfo.setId(teacher.getId()); ptTeacherInfo.setCode(code); - //ptTeacherInfo.setIdentity(teacher.getIdentity()); + ptTeacherInfo.setName(teacher.getName()); + ptTeacherInfo.setPhone(teacher.getPhone() != null ? teacher.getPhone() : ""); // 空值处理 + ptTeacherInfo.setEmail(teacher.getEmail() != null ? teacher.getEmail() : ""); + ptTeacherInfo.setPicture(teacher.getPicture()); + ptTeacherInfo.setJob(teacher.getJob()); + ptTeacherInfo.setSchool(teacher.getCode()); + ptTeacherInfo.setJoinTime(0L); + ptTeacherInfo.setState(1); + ptTeacherInfo.setVersion(1); + ptTeacherInfo.setAge(teacher.getAge() != null ? teacher.getAge() : 0); + ptTeacherInfo.setTeachingAge(teacher.getTeachingAge() != null ? teacher.getTeachingAge() : 0); + ptTeacherInfo.setStatus(teacher.getStatus() != null ? teacher.getStatus() : ""); + + + // 学科与角色信息 + ptTeacherInfo.setSubjectIds(teacher.getSubjectIds() != null ? teacher.getSubjectIds() : Collections.emptyList()); + ptTeacherInfo.setSubjectNames(teacher.getSubjectNames() != null ? teacher.getSubjectNames() : Collections.emptyList()); + ptTeacherInfo.setRoles(teacher.getRoles() != null ? teacher.getRoles() : Collections.emptyList()); + //只是针对管理员权限的内容 + if (teacher.getRoles() != null && teacher.getRoles().contains("admin")) { + ptTeacherInfo.setIdentity(Collections.singletonList("admin")); + } else { + ptTeacherInfo.setIdentity(Collections.singletonList("teacher")); + } + + + + // 其他业务字段 + ptTeacherInfo.setDegree(teacher.getDegree() != null ? teacher.getDegree() : ""); + ptTeacherInfo.setGender(teacher.getGender() != null ? teacher.getGender() : "U"); // 未知性别默认值 + ptTeacherInfo.setGrade(teacher.getGrade() != null ? teacher.getGrade() : Collections.emptyList()); + ptTeacherInfo.setPeriodId(teacher.getPeriodId() != null ? teacher.getPeriodId() : ""); + ptTeacherInfo.setTitle(teacher.getTitle() != null ? teacher.getTitle() : ""); // 版本号初始化 ptTeacherInfo.setVersion(1); diff --git a/src/main/java/cn/teammodel/utils/GroupUtil.java b/src/main/java/cn/teammodel/utils/GroupUtil.java index b08e927..164bdfe 100644 --- a/src/main/java/cn/teammodel/utils/GroupUtil.java +++ b/src/main/java/cn/teammodel/utils/GroupUtil.java @@ -2,6 +2,7 @@ package cn.teammodel.utils; import cn.teammodel.common.ErrorCode; import cn.teammodel.config.exception.ServiceException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import org.apache.http.HttpEntity; @@ -16,7 +17,9 @@ import org.springframework.core.env.Environment; import javax.servlet.http.HttpServletRequest; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class GroupUtil { @@ -77,6 +80,61 @@ public class GroupUtil { return mapper; } + + public static List> getUsers(Object obj, GroupUtil groupUtil, HttpServletRequest request, String url) { + List> mapper = new ArrayList<>(); + String evnStr = groupUtil.env.getProperty("spring.env"); + String apiUrl; + if (evnStr != null && evnStr.equalsIgnoreCase("dev")) { + apiUrl = "https://test.teammodel.cn" + url; + + }else { + + apiUrl = "https://www.teammodel.cn" + url; + } + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + // 创建HttpPost对象 + HttpPost httpPost = new HttpPost(apiUrl); + + //添加请求头 + httpPost.setHeader("Authorization", request.getHeader("Authorization")); + httpPost.setHeader("X-Auth-Authtoken", request.getHeader("X-Auth-Authtoken")); + httpPost.setHeader("Accept", "application/json"); + httpPost.setHeader("Content-Type", "application/json; charset=utf-8"); + + // 设置请求体 + String jsonContent = JsonUtil.convertToJson(obj); + //String requestBody = String.format("{\"school\":\"%s\"}","{\"name\":\"%s\"}","{\"periodId\":\"%s\"}", code,name,periodId); + httpPost.setEntity(new StringEntity(jsonContent, ContentType.create("application/json", "UTF-8"))); + + // 发送请求 + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + + if (entity != null) { + // 解析响应内容 + String jsonString = EntityUtils.toString(entity); + ObjectMapper objectMapper = new ObjectMapper(); + mapper = objectMapper.readValue( + jsonString, + new TypeReference>>(){} + ); + } + + // 检查响应状态码 + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) throw new RuntimeException("Failed : HTTP error code : " + statusCode); + } catch (IOException e) { + throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "数据解析异常"); + } + } catch (IOException e) { + throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "请求头异常"); + } + return mapper; + } + public static Map getTeacherInfo(Object obj, GroupUtil groupUtil, HttpServletRequest request,String url) { Map mapper = new HashMap<>(); String evnStr = groupUtil.env.getProperty("spring.env"); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d372cb5..55953db 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,11 +8,15 @@ spring: # abort_connection: false # write_timeout: 10240 - - mvc: pathmatch: matching-strategy: ant_path_matcher + #日志文件配置 + logging: + level: + root: info + file: + name: logs/teammodel.log # 文件上传 servlet: @@ -85,4 +89,5 @@ ies: server-url-find-simple-by-student: /common/exam/find-simple-by-student server-url-get-teacher-all: /school/teacher/get-teacher-all server-url-get-teacher-grade-count: /school/teacher/get-teacher-grade - server-url-get-channel-data: /sokrate/get-channel-data \ No newline at end of file + server-url-get-channel-data: /sokrate/get-channel-data + server-url-get-core-user-data: /school/teacher/get-coreuser \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..7d40ca6 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,31 @@ + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + logs/teammodel.log + false + + logs/teammodel.%d{yyyy-MM-dd}.%i.log + 100MB + 7 + 1GB + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index b3b201c..0000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - -