update 调整账号体系,五育等内容

develop
hhb@hotmail.com 3 weeks ago
parent 84a8c702a9
commit a0f789bd07

@ -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<Map<String, Object>> getMoralAnalysis(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getAnalysis(laborDto,request);
public R<Map<String, Object>> getMoralAnalysis(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getAnalysis(moralDto,request);
return R.success(res);
}
@PostMapping("getDetails")
@ -37,22 +38,22 @@ public class MoralEducationController {
}
@PostMapping("getStudentSemesterScores")
@ApiOperation("分学期比对分析")
public R<Map<String, Object>> getStudentSemesterScores(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getStudentSemesterScores(laborDto,request);
public R<Map<String, Object>> getStudentSemesterScores(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getStudentSemesterScores(moralDto,request);
return R.success(res);
}
@PostMapping("getStudentMonthlyScores")
@ApiOperation("按月比对分析")
public R<Map<String,List<Map<String, Object>>>> getStudentMonthlyScores(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) {
Map<String,List<Map<String, Object>>> res = moralEducationService.getStudentMonthlyScores(laborDto,request);
public R<Map<String,List<Map<String, Object>>>> getStudentMonthlyScores(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) {
Map<String,List<Map<String, Object>>> res = moralEducationService.getStudentMonthlyScores(moralDto,request);
return R.success(res);
}
@PostMapping("getExamDetails")
@ApiOperation("获取指定考试数据")
public R<Map<String, Object>> getExamDetails(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getExamDetails(laborDto,request);
public R<Map<String, Object>> getExamDetails(@Valid @RequestBody MoralDto moralDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getExamDetails(moralDto,request);
return R.success(res);
}
}

@ -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<List<String>> batchImportPtTeachers(@Valid @RequestBody List<GpTeacherVo> gpTeacherDtos, HttpServletRequest request) {
List<String> res = teacherService.batchImportPtTeachers(gpTeacherDtos,request);
return R.success(res);
}
}

@ -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<String, Object> getAnalysis(FiveDto fiveDto, HttpServletRequest request);
}

@ -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<String,Object> getAnalysis(LaborDto laborDto, HttpServletRequest request);
Map<String,Object> getAnalysis(MoralDto moralDto, HttpServletRequest request);
Map<String,Object> getDetails(FindDto findDto, HttpServletRequest request);
Map<String,Object> getStudentSemesterScores(LaborDto laborDto, HttpServletRequest request);
Map<String,List<Map<String, Object>>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request);
Map<String,Object> getExamDetails(LaborDto laborDto,HttpServletRequest request);
Map<String,Object> getStudentSemesterScores(MoralDto moralDto, HttpServletRequest request);
Map<String,List<Map<String, Object>>> getStudentMonthlyScores(MoralDto moralDto,HttpServletRequest request);
Map<String,Object> getExamDetails(MoralDto moralDto,HttpServletRequest request);
}

@ -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<String,Object> findIdentityByTmdId(TeacherDto teacherDto);
void delete(TeacherDto teacherDto);
List<String> batchImportPtTeachers(List<GpTeacherVo> gpTeachers, HttpServletRequest request);
}

@ -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<String, Object> getAnalysis(FiveDto dto, HttpServletRequest request) {
Map<String, Object> 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;
}
}

@ -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<String, Object> getAnalysis(LaborDto laborDto, HttpServletRequest request) {
public Map<String, Object> getAnalysis(MoralDto moralDto, HttpServletRequest request) {
//根据具体参数查询相关课列内容
List<LessonRecord> 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<ClassInfo> classes = classRepository.findClassBySchoolIdAndPeriodId(laborDto.getPeriodId(), String.format(PK.CLASS, schoolId));
List<ClassInfo> 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<ExamVo> 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<ExamClassResult> 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<School.Period> period = schoolRepository.findPeriodById(schoolId,periodId);
@ -208,11 +207,11 @@ public class MoralEducationServiceImpl implements MoralEducationService {
Map<String, List<String>> knowledgeBlockToPointsMap = getKnowledgeBlockToPointsMap(appraise);
Map<String, Object> classScoreRate = new HashMap<>();
Map<String, Object> 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<String,Object> 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<String, Object> getExamDetails(LaborDto laborDto, HttpServletRequest request) {
public Map<String, Object> getExamDetails(MoralDto moralDto, HttpServletRequest request) {
Map<String, Object> resMap = new HashMap<>();
try {
List<ExamClassResult> examResults = new ArrayList<>();
if (!laborDto.getExamId().isEmpty()) {
if (!moralDto.getExamId().isEmpty()) {
Map<String, List<List<String>>> knowledgeMap = new HashMap<>();
Map<String, List<Double>> 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<String, Double> 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<String,List<Map<String, Object>>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request) {
public Map<String,List<Map<String, Object>>> getStudentMonthlyScores(MoralDto moralDto,HttpServletRequest request) {
// 1. 获取基础信息
String schoolId = SecurityUtil.getLoginUser().getSchoolId();
String studentId = laborDto.getStudentId();
String studentId = moralDto.getStudentId();
List<String> classStudentIds = Collections.emptyList();
// 2. 获取相关开课记录
List<LessonRecord> records = getLessonRecords(laborDto, schoolId);
List<LessonRecord> records = getLessonRecords(moralDto, schoolId);
List<RecordVo> 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<String> classIds = Collections.singletonList(laborDto.getClassId());
List<String> 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<String, Object> groupId = GroupUtil.getGroupId(groupDto, new GroupUtil(environment), request, url);
List<RGroupList> 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<String, List<List<String>>> examKnowledgeMap = new HashMap<>();
Map<String, List<Double>> points = new HashMap<>();
List<ExamVo> exams = getExamsWithKnowledge(laborDto, records, examKnowledgeMap, points);
List<ExamVo> exams = getExamsWithKnowledge(moralDto, records, examKnowledgeMap, points);
// 4. 获取考试结果并按月份分组
List<String> targetStudents = laborDto.getClassId() != null ?
List<String> targetStudents = moralDto.getClassId() != null ?
classStudentIds : Collections.singletonList(studentId);
Map<Integer, List<ExamResultWrapper>> 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<String, List<String>> knowledgeBlockMap = getKnowledgeBlockToPointsMap(appraise);
@ -1599,7 +1598,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
Map<String, Map<Integer, Integer>> 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<LessonRecord> getLessonRecords(LaborDto laborDto, String schoolId) {
private List<LessonRecord> 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<ExamVo> getExamsWithKnowledge(LaborDto laborDto, List<LessonRecord> records,
private List<ExamVo> getExamsWithKnowledge(MoralDto moralDto, List<LessonRecord> records,
Map<String, List<List<String>>> examKnowledgeMap,
Map<String, List<Double>> points) {
List<String> lessonRecordIds = records.stream().map(LessonRecord::getId).collect(Collectors.toList());
List<ExamVo> exams = examRepository.findExamsByIds(laborDto.getSource(), lessonRecordIds);
List<ExamVo> 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<String, Object> getStudentSemesterScores(LaborDto laborDto,HttpServletRequest request) {
public Map<String, Object> getStudentSemesterScores(MoralDto moralDto,HttpServletRequest request) {
// 1. 获取学期配置
List<School.Semester> semesters = schoolRepository.findSemestersById(laborDto.getCode(), laborDto.getPeriodId());
List<School.Semester> semesters = schoolRepository.findSemestersById(moralDto.getCode(), moralDto.getPeriodId());
List<SemesterConfig> 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<String, Object> 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<String, Object> 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<String, Object> combineAllResults(LaborDto dto,
private Map<String, Object> combineAllResults(MoralDto dto,
Map<String, Object> studentResult,
Map<String, Object> classResult) {
Map<String, Object> finalResult = new LinkedHashMap<>();
@ -2110,7 +2109,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
return finalResult;
}
private Map<String, Object> processIndividual(LaborDto dto,
private Map<String, Object> 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<String, Object> processClass(LaborDto dto,
private Map<String, Object> 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<String, Object> combineClassResults(LaborDto dto,
private Map<String, Object> combineClassResults(MoralDto dto,
Map<String, Object> current,
Map<String, Object> last) {
Map<String, Object> result = new LinkedHashMap<>();
@ -2160,7 +2159,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
return result;
}
private List<Map<String, Object>> buildClassScoreBlocks(LaborDto dto,
private List<Map<String, Object>> buildClassScoreBlocks(MoralDto dto,
Map<String, Object> current,
Map<String, Object> last) {
@ -2325,7 +2324,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
}
// 处理学期数据
private Map<String, Object> processSemesterData(LaborDto laborDto,
private Map<String, Object> processSemesterData(MoralDto moralDto,
SemesterPeriod semester,
HttpServletRequest request,
boolean isCurrent,
@ -2333,11 +2332,11 @@ public class MoralEducationServiceImpl implements MoralEducationService {
Map<String, Object> 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<String, Object> analysisData = getAnalysis(laborDto, request);
Map<String, Object> analysisData = getAnalysis(moralDto, request);
if (isClassMod) {
// 班级知识点统计
@ -2359,7 +2358,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
if (isCurrent) {
List<Map<String, Object>> scores = (List<Map<String, Object>>) analysisData.get("scores");
Map<String, Integer> knowledgeCounts = scores.stream()
.filter(s -> laborDto.getStudentId().equals(s.get("studentId")))
.filter(s -> moralDto.getStudentId().equals(s.get("studentId")))
.findFirst()
.map(s -> (List<Map<String, Object>>) s.get("appraises"))
.map(appraises -> appraises.stream()
@ -2373,7 +2372,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
}
// 4. 提取综合得分
Map<String, Double> blockScores = extractBlockScores(analysisData, laborDto.getStudentId());
Map<String, Double> blockScores = extractBlockScores(analysisData, moralDto.getStudentId());
result.put("blockScores", blockScores);
// 5. 提取班级均分
@ -2426,14 +2425,14 @@ public class MoralEducationServiceImpl implements MoralEducationService {
}
// 结果合并方法
private Map<String, Object> combineResults(LaborDto laborDto,
private Map<String, Object> combineResults(MoralDto moralDto,
Map<String, Object> currentData,
Map<String, Object> lastData) {
Map<String, Object> 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<String> knowledgeBlocks = loadKnowledgeBlocks(appraise);

@ -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<String, PtTeacherInfo> 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<GpTeacherVo> teachersList = convertToGpTeacherVoList(teachers, teacherDto.getCode());
List<String> phones = teachersList.stream().map(GpTeacherVo::getPhone).collect(Collectors.toList());
//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);
//gpTeacherDto.setMobiles(phones);
//Map<String, Object> tBase = getTeacherBase(gpTeacherDto, request);
//List<GpTeacher> gpTeachers = convertToGpTeacherList(tBase);
// 优化1使用Map加速查找
Map<String, GpTeacher> phoneToGpTeacher = gpTeachers.stream()
/*Map<String, GpTeacher> 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<String, Long> genderCount = gpTeachers.stream()
.collect(Collectors.groupingBy(gpTeacher -> gpTeacher.getBasic().getGender(), Collectors.counting()));
Map<String, Long> degreeCount = gpTeachers.stream()
});*/
Map<String, Long> genderCount = teachersList.stream()
.filter(gpTeacher -> gpTeacher.getGender() != null)
.collect(Collectors.groupingBy(GpTeacherVo::getGender, Collectors.counting()));
Map<String, Long> degreeCount = teachersList.stream()
.filter(gpTeacher -> gpTeacher.getDegree() != null)
.collect(Collectors.groupingBy(GpTeacher::getDegree, Collectors.counting()));
.collect(Collectors.groupingBy(GpTeacherVo::getDegree, Collectors.counting()));
//Map<String, Integer> 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<PtTeacherInfo> ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, teacherDto.getCode());
String code = String.format(PK.PTTEACHER, teacherDto.getCode());
List<PtTeacherInfo> ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, code);
Map<String, PtTeacherInfo> 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<GpTeacherVo> convertToGpTeacherVoList(Map<String, Object> teachers,String code) {
List<GpTeacherVo> teachersList = new ArrayList<>();
for (Map.Entry<String, Object> 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<String>) map.get("roles"));
//teacher.setGroups((List<GpTeacherVo.IdNameCode>) map.get("groups"));
List<Map<String, Object>> groupList = (List<Map<String, Object>>) 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<String>) map.get("subjectIds"));
teacher.setSubjectNames((List<String>) 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<String> batchImportPtTeachers(List<GpTeacherVo> 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<String> 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<String> phoneNumbers = gpTeachers.stream()
.map(GpTeacherVo::getPhone)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
//校验这些手机号码是否正常
validatePhoneNumbers(phoneNumbers);
//同理检查邮箱是否正确
List<String> 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<Map<String, Object>> userData = GroupUtil.getUsers(phoneNumbers, new GroupUtil(env), request, url);
//从userData中获取手机号 key 为 mobile
// 提取所有已存在的 mobile 字段值
Set<String> existingMobiles = userData.stream()
.map(user -> (String) user.get("mobile"))
.collect(Collectors.toSet());
// 找出未返回的手机号
List<String> 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<String, String> mobileToIdMap = new HashMap<>();
for (Map<String, Object> 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<Pair<String, String>> idCodePairs = gpTeachers.stream()
.filter(t -> t.getId() != null)
.map(t -> Pair.of(t.getId(), "PtTeacher-" + schoolCode))
.collect(Collectors.toList());
List<IdCodePair> idAndCode = idCodePairs.stream()
.map(pair -> new IdCodePair(pair.getLeft(), pair.getRight()))
.collect(Collectors.toList());
List<PtTeacherInfo> existingList = ptTeacherRepository.findByIdCodePairs(idAndCode);
Map<String, PtTeacherInfo> codeToTeacherMap = existingList.stream()
.collect(Collectors.toMap(PtTeacherInfo::getCode, Function.identity()));
List<PtTeacherInfo> 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<String> phoneNumbers) {
List<String> 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<String> emails) {
List<String> 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<String, Map<String, Object>> REQUEST_CACHE = CacheBuilder.newBuilder()

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

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

@ -19,9 +19,30 @@ public class PtTeacherInfo extends BaseItem {
public String pk ;
public Integer ttl ;
public String school;
//新增身份信息
public List<String> 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<String> subjectIds ;
public List<String> subjectNames ;
public List<String> roles;
public String degree;
public String gender ;
public List<String> grade;
public String periodId ;
public List<String> 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;
}

@ -20,11 +20,15 @@ public class GpTeacherVo {
public List<IdNameCode> groups;
public String note ;
public String degree;
public Long practiceTime ;
public String gender ;
public Integer age ;
public Integer teachingAge ;
public String status ;
public List<String> grade;
public String periodId ;
public Long joinTime ;
public List<String> identity;
public String title ;
public Integer version = 1;
@Data
public static class IdNameCode{

@ -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<GpTeacherVo> teachersList) {
try {
@ -54,7 +58,7 @@ public class AsyncTeacherService {
private Map<String, PtTeacherInfo> loadExistingTeachers(List<GpTeacherVo> teachersList) {
List<IdCodePair> 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<PtTeacherInfo> existingList = ptTeacherRepository.findByIdCodePairs(idAndCode);
@ -68,22 +72,41 @@ public class AsyncTeacherService {
private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map<String, PtTeacherInfo> 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);

@ -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<Map<String, Object>> getUsers(Object obj, GroupUtil groupUtil, HttpServletRequest request, String url) {
List<Map<String, Object>> 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<List<Map<String, Object>>>(){}
);
}
// 检查响应状态码
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<String, Object> getTeacherInfo(Object obj, GroupUtil groupUtil, HttpServletRequest request,String url) {
Map<String, Object> mapper = new HashMap<>();
String evnStr = groupUtil.env.getProperty("spring.env");

@ -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:
@ -86,3 +90,4 @@ ies:
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
server-url-get-core-user-data: /school/teacher/get-coreuser

@ -0,0 +1,31 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/teammodel.log</file>
<immediateFlush>false</immediateFlush>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/teammodel.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
<!-- 生产环境建议关闭DEBUG日志 -->
<logger name="com.azure.cosmos" level="error"/>
<logger name="org.springframework" level="warn"/>
<logger name="io.netty" level="warn"/>
</configuration>

@ -1,17 +0,0 @@
<configuration>
<include resource="/org/springframework/boot/logging/logback/base.xml"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
<logger name="com.azure.cosmos" level="error"/>
<logger name="org.springframework" level="error"/>
<logger name="io.netty" level="error"/>
<!-- This will enable query logging, to include query parameter logging, set this logger to TRACE -->
<logger name="com.azure.cosmos.implementation.SqlQuerySpecLogger" level="DEBUG"/>
</configuration>
Loading…
Cancel
Save