Ver Fonte

Merge branch 'pre'

dzx há 7 meses atrás
pai
commit
20dc2142d2
100 ficheiros alterados com 4757 adições e 226 exclusões
  1. 56 0
      src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java
  2. 3 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatistics.java
  3. 51 41
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java
  4. 3 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsPageVo.java
  5. 3 0
      src/main/java/com/xjrsoft/module/attendance/vo/TeacherStatisticsVo.java
  6. 21 1
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassServiceImpl.java
  7. 26 0
      src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java
  8. 100 0
      src/main/java/com/xjrsoft/module/base/controller/BaseClassTeacherChangeController.java
  9. 37 0
      src/main/java/com/xjrsoft/module/base/dto/AddBaseClassTeacherChangeDto.java
  10. 46 0
      src/main/java/com/xjrsoft/module/base/dto/BaseClassTeacherChangePageDto.java
  11. 24 0
      src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassTeacherChangeDto.java
  12. 0 1
      src/main/java/com/xjrsoft/module/base/entity/BaseClassMerge.java
  13. 89 0
      src/main/java/com/xjrsoft/module/base/entity/BaseClassTeacherChange.java
  14. 21 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseClassTeacherChangeMapper.java
  15. 20 0
      src/main/java/com/xjrsoft/module/base/service/IBaseClassTeacherChangeService.java
  16. 9 1
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java
  17. 0 2
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassMergeServiceImpl.java
  18. 31 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java
  19. 26 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassTeacherChangeServiceImpl.java
  20. 42 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangePageVo.java
  21. 38 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangeVo.java
  22. 6 6
      src/main/java/com/xjrsoft/module/form/controller/FormExecuteController.java
  23. 0 2
      src/main/java/com/xjrsoft/module/job/BaseNewStudentTask.java
  24. 47 1
      src/main/java/com/xjrsoft/module/job/ClassGraduateTask.java
  25. 1 0
      src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java
  26. 42 1
      src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentController.java
  27. 2 2
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  28. 3 0
      src/main/java/com/xjrsoft/module/student/dto/AddBaseStudentSchoolRollDto.java
  29. 3 0
      src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentInfoDto.java
  30. 3 0
      src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentSchoolRollDto.java
  31. 3 0
      src/main/java/com/xjrsoft/module/student/entity/BaseStudentSchoolRoll.java
  32. 6 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseNewStudentMapper.java
  33. 2 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java
  34. 2 0
      src/main/java/com/xjrsoft/module/student/service/IBaseNewStudentService.java
  35. 10 1
      src/main/java/com/xjrsoft/module/student/service/impl/BaseNewStudentServiceImpl.java
  36. 21 3
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  37. 24 0
      src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java
  38. 129 0
      src/main/java/com/xjrsoft/module/student/vo/BaseNewStudentListExcelVo.java
  39. 1 1
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentDevelopmentVo.java
  40. 6 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java
  41. 8 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageDataVo.java
  42. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageVo.java
  43. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentSchoolRollVo.java
  44. 4 1
      src/main/java/com/xjrsoft/module/student/vo/EnrollmentStatisticsInfoVo.java
  45. 185 4
      src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java
  46. 27 0
      src/main/java/com/xjrsoft/module/teacher/dto/BaseTeacherPageDto.java
  47. 134 0
      src/main/java/com/xjrsoft/module/teacher/entity/CoreTeacher.java
  48. 134 0
      src/main/java/com/xjrsoft/module/teacher/entity/EvaluatorInformation.java
  49. 114 0
      src/main/java/com/xjrsoft/module/teacher/entity/FacultyContract.java
  50. 139 0
      src/main/java/com/xjrsoft/module/teacher/entity/JobInformation.java
  51. 129 0
      src/main/java/com/xjrsoft/module/teacher/entity/LanguageCompetence.java
  52. 124 0
      src/main/java/com/xjrsoft/module/teacher/entity/OutsideAssociations.java
  53. 154 0
      src/main/java/com/xjrsoft/module/teacher/entity/ProfessionalTitle.java
  54. 134 0
      src/main/java/com/xjrsoft/module/teacher/entity/ScientificResearch.java
  55. 129 0
      src/main/java/com/xjrsoft/module/teacher/entity/TeacherCertification.java
  56. 6 0
      src/main/java/com/xjrsoft/module/teacher/mapper/BaseTeacherMapper.java
  57. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/CoreTeacherMapper.java
  58. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/EvaluatorInformationMapper.java
  59. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/FacultyContractMapper.java
  60. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/JobInformationMapper.java
  61. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/LanguageCompetenceMapper.java
  62. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/OutsideAssociationsMapper.java
  63. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ProfessionalTitleMapper.java
  64. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/ScientificResearchMapper.java
  65. 17 0
      src/main/java/com/xjrsoft/module/teacher/mapper/TeacherCertificationMapper.java
  66. 25 1
      src/main/java/com/xjrsoft/module/teacher/service/ITeacherbaseManagerService.java
  67. 964 116
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  68. 89 0
      src/main/java/com/xjrsoft/module/teacher/vo/CoreTeacherImportVo.java
  69. 88 0
      src/main/java/com/xjrsoft/module/teacher/vo/EvaluatorInformationImportVo.java
  70. 60 0
      src/main/java/com/xjrsoft/module/teacher/vo/FacultyContractImportVo.java
  71. 94 0
      src/main/java/com/xjrsoft/module/teacher/vo/JobInformationImportVo.java
  72. 82 0
      src/main/java/com/xjrsoft/module/teacher/vo/LanguageCompetenceImportVo.java
  73. 73 0
      src/main/java/com/xjrsoft/module/teacher/vo/OutsideAssociationsImportVo.java
  74. 115 0
      src/main/java/com/xjrsoft/module/teacher/vo/ProfessionalTitleImportVo.java
  75. 86 0
      src/main/java/com/xjrsoft/module/teacher/vo/ScientificResearchImportVo.java
  76. 81 0
      src/main/java/com/xjrsoft/module/teacher/vo/TeacherCertificationImportVo.java
  77. 24 3
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookStudentClaimController.java
  78. 10 2
      src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookClaimController.java
  79. 3 0
      src/main/java/com/xjrsoft/module/textbook/dto/DistributePageDto.java
  80. 13 0
      src/main/java/com/xjrsoft/module/textbook/dto/NullifyWfTextbookClaimDto.java
  81. 1 1
      src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookClaim.java
  82. 3 4
      src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookClaimService.java
  83. 20 10
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java
  84. 40 12
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  85. 11 0
      src/main/java/com/xjrsoft/module/textbook/vo/DistributePageVo.java
  86. 14 1
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookStudentClaimPageVo.java
  87. 7 1
      src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java
  88. 1 1
      src/main/resources/mapper/attendance/AttendanceStatisticsMapper.xml
  89. 39 0
      src/main/resources/mapper/base/BaseClassTeacherChange.xml
  90. 0 1
      src/main/resources/mapper/oa/OfficialDocumentReceivedMapper.xml
  91. 128 1
      src/main/resources/mapper/student/BaseNewStudentMapper.xml
  92. 1 1
      src/main/resources/mapper/student/BaseStudentAssessmentInspectionMapper.xml
  93. 2 2
      src/main/resources/mapper/student/BaseStudentGraduateMapper.xml
  94. 40 1
      src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml
  95. 25 0
      src/main/resources/mapper/teacher/BaseTeacherMapper.xml
  96. 1 0
      src/main/resources/mapper/textbook/TextbookStudentClaimMapper.xml
  97. 40 0
      src/main/resources/sqlScript/20250421_sql.sql
  98. 34 0
      src/main/resources/sqlScript/教材费用视图.sql
  99. 5 0
      src/main/resources/sqlScript/鸿合课表视图.sql
  100. 1 0
      src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest.java

+ 56 - 0
src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java

@@ -2,15 +2,23 @@ package com.xjrsoft.module.attendance.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.dto.TeacherDetailsDto;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleCategory;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
 import com.xjrsoft.module.attendance.service.ITeacherAttendanceRecordService;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsPageVo;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsVo;
@@ -24,8 +32,11 @@ import com.xjrsoft.module.personnel.service.IReservationSchoolService;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.service.IStudentLeaveService;
+import com.xjrsoft.module.teacher.dto.BaseTeacherPageDto;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
+import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -39,6 +50,8 @@ import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -61,6 +74,8 @@ public class StatisticsController {
     private final IStudentLeaveService studentLeaveService;
     private final IReservationSchoolService reservationSchoolService;
     private final ITeacherAttendanceRecordService attendanceRecordService;
+    private final ITeacherbaseManagerService teacherbaseManagerService;
+    private final IAttendanceRuleCategoryService ruleCategoryService;
 
     @GetMapping(value = "/teacher-statistics")
     @ApiOperation(value = "教职工考勤统计")
@@ -88,7 +103,9 @@ public class StatisticsController {
         Long leaveCount = 0L;
         Long absenteeismCount = 0L;
         Integer dividendCount = 0;
+        Set<Long> teacherIds = new HashSet<>();
         for (TeacherStatisticsPageVo recordVo : list) {
+            teacherIds.add(recordVo.getUserId());
             if ("迟到".equals(recordVo.getStatus())) {
                 lateCount++;
                 dividendCount++;
@@ -109,6 +126,45 @@ public class StatisticsController {
         statisticsVo.setLeaveCount(leaveCount);
         statisticsVo.setAbsenteeismCount(absenteeismCount);
 
+        //查询不需要考勤的人
+        List<AttendanceRuleCategory> ruleCategories = ruleCategoryService.list(
+                new QueryWrapper<AttendanceRuleCategory>().lambda()
+                        .eq(AttendanceRuleCategory::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(AttendanceRuleCategory::getRoleId, 2)
+                        .le(AttendanceRuleCategory::getStartDate, LocalDate.now())
+                        .ge(AttendanceRuleCategory::getEndDate, LocalDate.now())
+        );
+        if(!ruleCategories.isEmpty()){
+            BaseTeacherPageDto teacherPageDto = new BaseTeacherPageDto();
+            List<Long> userIds = new ArrayList<>();
+            List<Long> deptIds = new ArrayList<>();
+            for (AttendanceRuleCategory ruleCategory : ruleCategories) {
+                JsonArray userRelation = new JsonParser().parse(ruleCategory.getUserRelation()).getAsJsonArray();
+
+                for (JsonElement jsonElement : userRelation) {
+                    JsonObject jsonObject = jsonElement.getAsJsonObject();
+                    if(jsonObject.get("deptId") != null && !jsonObject.get("deptId").isJsonNull()){
+                        deptIds.add(jsonObject.get("deptId").getAsLong());
+                    }
+                    if(jsonObject.get("userId") != null && !jsonObject.get("userId").isJsonNull()){
+                        userIds.add(jsonObject.get("userId").getAsLong());
+                    }
+                }
+            }
+
+            teacherPageDto.setDeptIds(deptIds);
+            List<XjrUserPageVo> attendanceTeacherList = teacherbaseManagerService.getList(teacherPageDto);
+
+            teacherPageDto = new BaseTeacherPageDto();
+            teacherPageDto.setUserIds(userIds);
+            attendanceTeacherList.addAll(teacherbaseManagerService.getList(teacherPageDto));
+
+            List<XjrUserPageVo> allTeacherList = teacherbaseManagerService.getList(new BaseTeacherPageDto());
+
+            statisticsVo.setNotAttendanceCount(allTeacherList.size() - attendanceTeacherList.size());
+        }
+
+
         //计算出勤率
         BigDecimal divide = BigDecimal.ZERO;
         if (dividendCount != 0) {

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatistics.java

@@ -132,4 +132,7 @@ public class AttendanceStatistics implements Serializable {
     @EntityMapping(thisField = "id", joinField = "attendanceStatisticsId")
     private List<AttendanceStatisticsRecord> attendanceStatisticsRecordList;
 
+    @ApiModelProperty("备注")
+    private String remarks;
+
 }

+ 51 - 41
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -17,7 +17,11 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticsRecordDto;
-import com.xjrsoft.module.attendance.entity.*;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import com.xjrsoft.module.attendance.entity.AttendanceStatistics;
+import com.xjrsoft.module.attendance.entity.AttendanceStatisticsRecord;
+import com.xjrsoft.module.attendance.entity.AttendanceUserRelation;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
 import com.xjrsoft.module.attendance.mapper.AttendanceStatisticsMapper;
 import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
 import com.xjrsoft.module.attendance.service.IAttendanceStatisticsRecordService;
@@ -40,7 +44,15 @@ import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import lombok.AllArgsConstructor;
 import me.zhyd.oauth.log.Log;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
@@ -53,7 +65,13 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -89,24 +107,15 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(AddAttendanceStatisticsDto dto) {
-        try {
-            AttendanceStatistics statistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
-            statistics.setCreateDate(new Date());
-            statistics.setStatus(0);
-            statisticsMapper.insert(statistics);
-
-            //1、同步出入记录的数据
-            //2、固化考勤数据
-            refreshRecord(statistics.getId());
-            return true;
-        } catch (Exception e) {
-            Log.error(e.getMessage(), e);
-            if(e.getClass().equals(MyException.class)){
-                throw new MyException(e.getMessage());
-            }else{
-                throw new MyException("添加报错,请联系管理员");
-            }
-        }
+        AttendanceStatistics statistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
+        statistics.setCreateDate(new Date());
+        statistics.setStatus(0);
+        statisticsMapper.insert(statistics);
+
+        //1、同步出入记录的数据
+        //2、固化考勤数据
+        refreshRecord(statistics.getId());
+        return true;
     }
 
     @Override
@@ -173,6 +182,9 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean refreshRecord(Long id) {
+        String remarks = null;
+        int personCount = 0;
+        int attendanceDays = 0;
         try {
             //1、修改状态为统计中
             AttendanceStatistics statistics = this.getById(id);
@@ -194,14 +206,10 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
                 Map<Long, AttendanceRuleDetailsUserVo> teacherRules = ruleCategoryService.getAllTeacherTodyRule(now.getDayOfWeek().name());
 
-                try {
-                    //教师
-                    outInRecordUtil.getTeacherRecords(faceImportMapper, startDateTime, endDateTime, teacherRules);
-                    //拉取车辆数据
-                    outInRecordUtil.GetVehicleRecord(faceImportMapper, startDateTime, endDateTime);
-                } catch (ParseException e) {
-                    Log.error(e.getMessage(), e);
-                }
+                //教师
+                outInRecordUtil.getTeacherRecords(faceImportMapper, startDateTime, endDateTime, teacherRules);
+                //拉取车辆数据
+                outInRecordUtil.GetVehicleRecord(faceImportMapper, startDateTime, endDateTime);
 
                 AttendanceRecordTask recordTask = new AttendanceRecordTask();
                 recordTask.teacherAttendanceRecord(startDateTime, statistics.getTimePeriod(),
@@ -215,7 +223,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
                 );
             }
 
-
             //2、删除以前的数据
             statisticsRecordService.remove(
                     new QueryWrapper<AttendanceStatisticsRecord>().lambda()
@@ -263,6 +270,7 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
             //3.4、计算出所有的天数
             List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate(), ruleMap, weekEnMap);
+            attendanceDays = dateList.size();
 
             //3.5、循环计算,并存入insertList,方便后续批量入库
             List<AttendanceStatisticsRecord> insertList = new ArrayList<>();
@@ -274,9 +282,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
             for (User user : userList) {
                 AttendanceStatisticsRecord record = new AttendanceStatisticsRecord();
                 record.setUserId(user.getId());
-                if (14954799879750L == user.getId()) {
-                    System.out.println(user.getName());
-                }
                 record.setAttendanceStatisticsId(statistics.getId());
                 Long normalCount = 0L;
                 Long leaveCount = 0L;
@@ -336,24 +341,29 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
             //3.6、插入数据
             if (!insertList.isEmpty()) {
                 statisticsRecordService.saveBatch(insertList);
+                personCount = insertList.size();
             }
 
-            //4、将状态改为统计完成
-            statistics = this.getById(id);
-            statistics.setStatus(1);
-            statistics.setModifyDate(new Date());
-            statistics.setPersonCount(insertList.size());
-            statistics.setAttendanceDays(dateList.size());
-            this.updateById(statistics);
-
             return true;
         } catch (Exception e) {
             Log.error(e.getMessage(), e);
             if (e.getClass().equals(MyException.class)) {
                 throw new MyException(e.getMessage());
+            }else if(e.getClass().equals(ParseException.class) || e.getClass().equals(ClassCastException.class)){
+                remarks = "未能拉取海康数据,统计可能不准确";
             } else {
                 throw new MyException("刷新出错,请联系管理员");
             }
+        }finally {
+            //4、将状态改为统计完成
+            AttendanceStatistics statistics = this.getById(id);
+            statistics.setStatus(1);
+            statistics.setModifyDate(new Date());
+            statistics.setPersonCount(personCount);
+            statistics.setAttendanceDays(attendanceDays);
+            statistics.setRemarks(remarks);
+            this.updateById(statistics);
+            return true;
         }
     }
 

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceStatisticsPageVo.java

@@ -76,4 +76,7 @@ public class AttendanceStatisticsPageVo {
     @ApiModelProperty("应出勤天数")
     private Integer attendanceDays;
 
+    @ApiModelProperty("备注")
+    private String remarks;
+
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/vo/TeacherStatisticsVo.java

@@ -40,4 +40,7 @@ public class TeacherStatisticsVo {
 
     @ApiModelProperty("旷课人数")
     private Integer playTruantCount;
+
+    @ApiModelProperty("不考勤人数")
+    private Integer notAttendanceCount;
 }

+ 21 - 1
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassServiceImpl.java

@@ -32,10 +32,12 @@ import com.xjrsoft.module.banding.vo.BandingTaskClassReportStatisticsVo;
 import com.xjrsoft.module.banding.vo.BandingTaskClassStudentListVo;
 import com.xjrsoft.module.banding.vo.BandingTaskClassSureListVo;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
 import com.xjrsoft.module.base.entity.BaseClassroom;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.entity.BaseMajorSet;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.base.mapper.BaseClassTeacherChangeMapper;
 import com.xjrsoft.module.base.mapper.BaseGradeMapper;
 import com.xjrsoft.module.base.service.IBaseClassroomService;
 import com.xjrsoft.module.base.service.IBaseMajorSetService;
@@ -60,6 +62,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -93,7 +96,7 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
     private final BaseGradeMapper gradeMapper;
     private final IUserRoleRelationService roleRelationService;
     private final RedisUtil redisUtil;
-
+    private final BaseClassTeacherChangeMapper teacherChangeMapper;
 
     @Override
     public Boolean add(BandingTaskClass bandingTaskClass) {
@@ -315,6 +318,15 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
                     }
                     classMapper.updateById(baseClass);
 
+                    teacherChangeMapper.insert(new BaseClassTeacherChange(){{
+                        setClassId(baseClass.getId());
+                        setBeforeTeacherId(baseClass.getTeacherId());
+                        setAfterTeacherId(sourceObj.getTeacherId());
+                        setDeleteMark(DeleteMark.NODELETE.getCode());
+                        setEnabledMark(EnabledMark.ENABLED.getCode());
+                        setCreateDate(LocalDateTime.now());
+                    }});
+
                     //给该老师添加班主任角色
                     if (baseClass.getTeacherId() != null) {
                         long count = roleRelationService.count(
@@ -350,6 +362,14 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
                     classMapper.insert(baseClass);
                     sourceObj.setBaseClassId(baseClass.getId());
 
+                    teacherChangeMapper.insert(new BaseClassTeacherChange(){{
+                        setClassId(baseClass.getId());
+                        setAfterTeacherId(sourceObj.getTeacherId());
+                        setDeleteMark(DeleteMark.NODELETE.getCode());
+                        setEnabledMark(EnabledMark.ENABLED.getCode());
+                        setCreateDate(LocalDateTime.now());
+                    }});
+
                     if (baseClass.getTeacherId() != null) {
                         long count = roleRelationService.count(
                                 new QueryWrapper<UserRoleRelation>().lambda()

+ 26 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java

@@ -1,9 +1,13 @@
 package com.xjrsoft.module.base.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -11,7 +15,9 @@ import com.xjrsoft.module.base.dto.AddBaseClassPageDto;
 import com.xjrsoft.module.base.dto.BaseClassPageDto;
 import com.xjrsoft.module.base.dto.UpdateBaseClassPageDto;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
 import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.base.service.IBaseClassTeacherChangeService;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
 import com.xjrsoft.module.base.vo.BaseClassVo;
 import io.swagger.annotations.Api;
@@ -27,6 +33,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -41,6 +49,7 @@ import java.util.List;
 @AllArgsConstructor
 public class BaseClassController {
     private final IBaseClassService baseClassService;
+    private final IBaseClassTeacherChangeService classTeacherChangeService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value = "班级列表(分页)")
@@ -57,6 +66,23 @@ public class BaseClassController {
     @SaCheckPermission("baseclass:delete")
     @XjrLog(value = "删除", saveResponseData = true)
     public RT<Boolean> delete(@Valid @RequestBody List<Long> ids) {
+        List<BaseClass> classList = baseClassService.listByIds(ids);
+        List<BaseClassTeacherChange> classTeacherChangeList = new ArrayList<>();
+        for (BaseClass baseClass : classList) {
+            classTeacherChangeList.add(
+                    new BaseClassTeacherChange(){{
+                        setClassId(baseClass.getId());
+                        setBeforeTeacherId(baseClass.getTeacherId());
+                        setCreateDate(LocalDateTime.now());
+                        setCreateUserId(StpUtil.getLoginIdAsLong());
+                        setDeleteMark(DeleteMark.NODELETE.getCode());
+                        setEnabledMark(EnabledMark.ENABLED.getCode());
+                    }}
+            );
+        }
+        if(!classTeacherChangeList.isEmpty()){
+            classTeacherChangeService.saveBatch(classTeacherChangeList);
+        }
         return RT.ok(baseClassService.removeByIds(ids));
     }
 

+ 100 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseClassTeacherChangeController.java

@@ -0,0 +1,100 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.base.dto.AddBaseClassTeacherChangeDto;
+import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
+import com.xjrsoft.module.base.dto.UpdateBaseClassTeacherChangeDto;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
+import com.xjrsoft.module.base.service.IBaseClassTeacherChangeService;
+import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
+import com.xjrsoft.module.base.vo.BaseClassTeacherChangeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/base" + "/baseClassTeacherChange")
+@Api(value = "/base"  + "/baseClassTeacherChange",tags = "班主任异动记录表代码")
+@AllArgsConstructor
+public class BaseClassTeacherChangeController {
+
+
+    private final IBaseClassTeacherChangeService baseClassTeacherChangeService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="班主任异动记录表列表(分页)")
+    @SaCheckPermission("baseclassteacherchange:detail")
+    @XjrLog(value = "班主任异动记录表列表(分页)")
+    public RT<PageOutput<BaseClassTeacherChangePageVo>> page(@Valid BaseClassTeacherChangePageDto dto){
+
+        Page<BaseClassTeacherChangePageVo> page = baseClassTeacherChangeService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<BaseClassTeacherChangePageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassTeacherChangePageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询班主任异动记录表信息")
+    @SaCheckPermission("baseclassteacherchange:detail")
+    @XjrLog(value = "根据id查询班主任异动记录表信息")
+    public RT<BaseClassTeacherChangeVo> info(@RequestParam Long id){
+        BaseClassTeacherChange baseClassTeacherChange = baseClassTeacherChangeService.getById(id);
+        if (baseClassTeacherChange == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(baseClassTeacherChange, BaseClassTeacherChangeVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增班主任异动记录表")
+    @SaCheckPermission("baseclassteacherchange:add")
+    @XjrLog(value = "新增班主任异动记录表")
+    public RT<Boolean> add(@Valid @RequestBody AddBaseClassTeacherChangeDto dto){
+        BaseClassTeacherChange baseClassTeacherChange = BeanUtil.toBean(dto, BaseClassTeacherChange.class);
+        boolean isSuccess = baseClassTeacherChangeService.save(baseClassTeacherChange);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改班主任异动记录表")
+    @SaCheckPermission("baseclassteacherchange:edit")
+    @XjrLog(value = "修改班主任异动记录表")
+    public RT<Boolean> update(@Valid @RequestBody UpdateBaseClassTeacherChangeDto dto){
+
+        BaseClassTeacherChange baseClassTeacherChange = BeanUtil.toBean(dto, BaseClassTeacherChange.class);
+        return RT.ok(baseClassTeacherChangeService.updateById(baseClassTeacherChange));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除班主任异动记录表")
+    @SaCheckPermission("baseclassteacherchange:delete")
+    @XjrLog(value = "删除班主任异动记录表")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(baseClassTeacherChangeService.removeBatchByIds(ids));
+    }
+
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/base/dto/AddBaseClassTeacherChangeDto.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.base.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class AddBaseClassTeacherChangeDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 班级id(base_class)
+    */
+    @ApiModelProperty("班级id(base_class)")
+    private Long classId;
+    /**
+    * 异动前班主任(xjr_user)
+    */
+    @ApiModelProperty("异动前班主任(xjr_user)")
+    private Long beforeTeacherId;
+    /**
+    * 异动后班主任(xjr_user)
+    */
+    @ApiModelProperty("异动后班主任(xjr_user)")
+    private Long afterTeacherId;
+
+}

+ 46 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseClassTeacherChangePageDto.java

@@ -0,0 +1,46 @@
+package com.xjrsoft.module.base.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+
+/**
+* @title: 班主任异动记录表分页查询入参
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseClassTeacherChangePageDto extends PageInput {
+
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("班级代码")
+    private String classCode;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("异动时间-开始")
+    private LocalDate createDateStart;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("异动时间-结束")
+    private LocalDate createDateEnd;
+
+    @ApiModelProperty("异动前班主任")
+    private String beforeTeacherName;
+
+    @ApiModelProperty("异动后班主任")
+    private String afterTeacherName;
+
+    @ApiModelProperty("年级")
+    private Long gradeId;
+
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/base/dto/UpdateBaseClassTeacherChangeDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.base.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class UpdateBaseClassTeacherChangeDto extends AddBaseClassTeacherChangeDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/base/entity/BaseClassMerge.java

@@ -12,7 +12,6 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import java.util.Date;
 import java.util.List;
 
 

+ 89 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseClassTeacherChange.java

@@ -0,0 +1,89 @@
+package com.xjrsoft.module.base.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("base_class_teacher_change")
+@ApiModel(value = "base_class_teacher_change", description = "班主任异动记录表")
+public class BaseClassTeacherChange implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 班级id(base_class)
+    */
+    @ApiModelProperty("班级id(base_class)")
+    private Long classId;
+    /**
+    * 异动前班主任(xjr_user)
+    */
+    @ApiModelProperty("异动前班主任(xjr_user)")
+    private Long beforeTeacherId;
+    /**
+    * 异动后班主任(xjr_user)
+    */
+    @ApiModelProperty("异动后班主任(xjr_user)")
+    private Long afterTeacherId;
+
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseClassTeacherChangeMapper.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
+import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface BaseClassTeacherChangeMapper extends MPJBaseMapper<BaseClassTeacherChange> {
+
+    Page<BaseClassTeacherChangePageVo> getPage(Page<BaseClassTeacherChangePageVo> page, @Param("dto") BaseClassTeacherChangePageDto dto);
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseClassTeacherChangeService.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.base.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
+import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+
+public interface IBaseClassTeacherChangeService extends MPJBaseService<BaseClassTeacherChange> {
+
+    Page<BaseClassTeacherChangePageVo> getPage(Page<BaseClassTeacherChangePageVo> page, @Param("dto") BaseClassTeacherChangePageDto dto);
+}

+ 9 - 1
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java

@@ -41,7 +41,15 @@ import com.xjrsoft.module.textbook.mapper.TextbookStudentClaimMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;

+ 0 - 2
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassMergeServiceImpl.java

@@ -20,10 +20,8 @@ import com.xjrsoft.module.base.mapper.BaseClassMergeStudentMapper;
 import com.xjrsoft.module.base.service.IBaseClassMergeService;
 import com.xjrsoft.module.base.vo.BaseClassMergeStudentVo;
 import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.student.entity.StudentChangeRecord;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
 import com.xjrsoft.module.student.service.IStudentChangeRecordService;
-import com.xjrsoft.module.system.entity.DictionaryDetail;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 31 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java

@@ -20,8 +20,10 @@ import com.xjrsoft.module.base.dto.AddBaseClassPageDto;
 import com.xjrsoft.module.base.dto.BaseClassPageDto;
 import com.xjrsoft.module.base.dto.UpdateBaseClassPageDto;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.base.mapper.BaseClassTeacherChangeMapper;
 import com.xjrsoft.module.base.mapper.BaseGradeMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
@@ -40,6 +42,7 @@ import com.xjrsoft.module.teacher.entity.XjrUser;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
@@ -63,6 +66,8 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
 
     private final BaseGradeMapper gradeMapper;
 
+    private final BaseClassTeacherChangeMapper teacherChangeMapper;
+
     /**
      * 获取家长关联的学生 id 是家长的ID
      *
@@ -211,6 +216,14 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
                     });
                 }
             }
+
+            teacherChangeMapper.insert(new BaseClassTeacherChange(){{
+                setClassId(baseClass.getId());
+                setAfterTeacherId(baseClass.getTeacherId());
+                setDeleteMark(DeleteMark.NODELETE.getCode());
+                setEnabledMark(EnabledMark.ENABLED.getCode());
+                setCreateDate(LocalDateTime.now());
+            }});
         }
         return isSuccess;
     }
@@ -231,6 +244,16 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
             if (count > 0) {
                 throw new MyException("该老师已是其他在读班级班主任,无法修改");
             }
+
+            //增加异动记录
+            teacherChangeMapper.insert(new BaseClassTeacherChange(){{
+                setClassId(aClass.getId());
+                setBeforeTeacherId(aClass.getTeacherId());
+                setAfterTeacherId(dto.getTeacherId());
+                setDeleteMark(DeleteMark.NODELETE.getCode());
+                setEnabledMark(EnabledMark.ENABLED.getCode());
+                setCreateDate(LocalDateTime.now());
+            }});
         }
         if(!aClass.getCode().equals(dto.getCode())){
             List<BaseClass> list = this.list(
@@ -298,6 +321,14 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
                                     .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
                     );
                 }
+
+                teacherChangeMapper.insert(new BaseClassTeacherChange(){{
+                    setClassId(aClass.getId());
+                    setAfterTeacherId(aClass.getTeacherId());
+                    setDeleteMark(DeleteMark.NODELETE.getCode());
+                    setEnabledMark(EnabledMark.ENABLED.getCode());
+                    setCreateDate(LocalDateTime.now());
+                }});
             }
             CompletableFuture.runAsync(() -> {
                 List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));

+ 26 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassTeacherChangeServiceImpl.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.base.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
+import com.xjrsoft.module.base.mapper.BaseClassTeacherChangeMapper;
+import com.xjrsoft.module.base.service.IBaseClassTeacherChangeService;
+import com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 班主任异动记录表
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class BaseClassTeacherChangeServiceImpl extends MPJBaseServiceImpl<BaseClassTeacherChangeMapper, BaseClassTeacherChange> implements IBaseClassTeacherChangeService {
+    @Override
+    public Page<BaseClassTeacherChangePageVo> getPage(Page<BaseClassTeacherChangePageVo> page, BaseClassTeacherChangePageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+}

+ 42 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangePageVo.java

@@ -0,0 +1,42 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+* @title: 班主任异动记录表分页列表出参
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class BaseClassTeacherChangePageVo {
+
+
+    @ApiModelProperty("主键编号")
+    private String id;
+
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("班级代码")
+    private String classCode;
+
+    @ApiModelProperty("异动时间")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty("操作人")
+    private String createUserName;
+
+    @ApiModelProperty("异动前班主任")
+    private String beforeTeacherName;
+
+    @ApiModelProperty("异动后班主任")
+    private String afterTeacherName;
+
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassTeacherChangeVo.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 班主任异动记录表表单出参
+* @Author dzx
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class BaseClassTeacherChangeVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 班级id(base_class)
+    */
+    @ApiModelProperty("班级id(base_class)")
+    private Long classId;
+    /**
+    * 异动前班主任(xjr_user)
+    */
+    @ApiModelProperty("异动前班主任(xjr_user)")
+    private Long beforeTeacherId;
+    /**
+    * 异动后班主任(xjr_user)
+    */
+    @ApiModelProperty("异动后班主任(xjr_user)")
+    private Long afterTeacherId;
+
+
+
+}

+ 6 - 6
src/main/java/com/xjrsoft/module/form/controller/FormExecuteController.java

@@ -222,14 +222,14 @@ public class FormExecuteController {
         return R.ok(formExecuteService.workFlowInfo(dto));
     }
 
-    //    @GetMapping(value = "/export")
-//    @ApiOperation(value = "导出")
-//    @XjrLog(value = "导出表单数据")
-//    public ResponseEntity<byte[]> export(@Valid FormExecuteListDto dto) throws IOException {
-    @PostMapping(value = "/export")
+    @GetMapping(value = "/export")
     @ApiOperation(value = "导出")
     @XjrLog(value = "导出表单数据")
-    public ResponseEntity<byte[]> export(@Valid @RequestBody FormExecuteListDto dto) throws IOException {
+    public ResponseEntity<byte[]> export(@Valid FormExecuteListDto dto) throws IOException {
+//    @PostMapping(value = "/export")
+//    @ApiOperation(value = "导出")
+//    @XjrLog(value = "导出表单数据")
+//    public ResponseEntity<byte[]> export(@Valid @RequestBody FormExecuteListDto dto) throws IOException {
         FormRelease formRelease = formReleaseService.getById(dto.getReleaseId());
         FormReleaseConfig formReleaseConfig = JSONUtil.toBean(formRelease.getConfigJson(), FormReleaseConfig.class);
         // 配置excel第一行字段名

+ 0 - 2
src/main/java/com/xjrsoft/module/job/BaseNewStudentTask.java

@@ -153,8 +153,6 @@ public class BaseNewStudentTask {
                 existsNewStudent.setSecondAmbitionId(majorSetNameMap.get(feeobjupdate.getZytjspec()));
                 existsNewStudent.setGender(GenderDictionaryEnum.getCode(feeobjupdate.getSex()));
                 existsNewStudent.setModifyDate(new Date());
-                existsNewStudent.setStatus(0);
-                existsNewStudent.setIsCanBanding(1);
                 existsNewStudent.setEnrollmentPlanId(planId);
 
                 updateList.add(existsNewStudent);

+ 47 - 1
src/main/java/com/xjrsoft/module/job/ClassGraduateTask.java

@@ -1,12 +1,25 @@
 package com.xjrsoft.module.job;
 
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
+import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.base.service.IBaseClassTeacherChangeService;
 import com.xjrsoft.module.base.service.IBaseGradeService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * 自动别业班级
  * @author dzx
@@ -22,6 +35,9 @@ public class ClassGraduateTask {
     @Autowired
     private IBaseGradeService gradeService;
 
+    @Autowired
+    private IBaseClassTeacherChangeService classTeacherChangeService;
+
     @Scheduled(cron = "0 */15 23 30 6 ?")
     public void execute() {
         doExecute();
@@ -31,7 +47,37 @@ public class ClassGraduateTask {
      * 根据年级自动毕业班级和学生
      */
     public void doExecute() {
-
+        LocalDateTime now = LocalDateTime.now();
+        List<BaseGrade> gradeList = gradeService.list(
+                new QueryWrapper<BaseGrade>().lambda()
+                        .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseGrade::getStatus, 1)
+                        .last("limit 4")
+        );
+        List<Long> gradeIds = gradeList.stream().map(BaseGrade::getId).collect(Collectors.toList());
+        List<BaseClass> classList = classService.list(
+                new QueryWrapper<BaseClass>().lambda()
+                        .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseClass::getIsGraduate, 1)
+                        .notIn(!gradeIds.isEmpty(), BaseClass::getGradeId, gradeIds)
+        );
+        //毕业后,记录班主任异动记录
+        List<BaseClassTeacherChange> classTeacherChangeList = new ArrayList<>();
+        for (BaseClass baseClass : classList) {
+            classTeacherChangeList.add(
+                    new BaseClassTeacherChange(){{
+                        setClassId(baseClass.getId());
+                        setBeforeTeacherId(baseClass.getTeacherId());
+                        setCreateDate(LocalDateTime.now());
+                        setCreateUserId(StpUtil.getLoginIdAsLong());
+                        setDeleteMark(DeleteMark.NODELETE.getCode());
+                        setEnabledMark(EnabledMark.ENABLED.getCode());
+                    }}
+            );
+        }
+        if(!classTeacherChangeList.isEmpty()){
+            classTeacherChangeService.saveBatch(classTeacherChangeList);
+        }
     }
 
 }

+ 1 - 0
src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java

@@ -387,6 +387,7 @@ public class JianyuekbScheduleTask {
                         .in(!courseAdjustIds.isEmpty(), WfCourseAdjust::getId, courseAdjustIds)
                         .and(wq -> wq.between(WfCourseAdjust::getAdjustDate, startDate, endDate).or().between(WfCourseAdjust::getExchangeDate, startDate, endDate))
                         .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                        .eq(WfCourseAdjust::getEnabledMark, EnabledMark.ENABLED.getCode())
         );
         List<WfCourseAdjust> cancelList = new ArrayList<>();//需要作废的申请
 

+ 42 - 1
src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentController.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.model.result.RT;
@@ -30,7 +31,6 @@ import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.service.IUserRoleRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
-import com.xjrsoft.module.room.entity.RoomBed;
 import com.xjrsoft.module.student.dto.ActiveAccountDto;
 import com.xjrsoft.module.student.dto.AddBaseNewStudentDto;
 import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
@@ -42,6 +42,7 @@ import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
 import com.xjrsoft.module.student.service.IBaseNewStudentService;
 import com.xjrsoft.module.student.service.IBaseStudentFamilyMemberService;
 import com.xjrsoft.module.student.vo.BaseNewStudentExportVo;
+import com.xjrsoft.module.student.vo.BaseNewStudentListExcelVo;
 import com.xjrsoft.module.student.vo.BaseNewStudentPageVo;
 import com.xjrsoft.module.student.vo.BaseNewStudentScoreExcelVo;
 import com.xjrsoft.module.student.vo.BaseNewStudentTreeVo;
@@ -425,4 +426,44 @@ public class BaseNewStudentController {
         return RT.ok(true);
     }
 
+
+    @PostMapping(value = "/export-query")
+    @ApiOperation(value="新生信息导出")
+    @SaCheckPermission("basenewstudent:detail")
+    @XjrLog(value = "新生信息导出")
+    public ResponseEntity<byte[]> exportQuerty(@Valid @RequestBody BaseNewStudentPageDto dto){
+        List<BaseNewStudentListExcelVo> dataList = new ArrayList<>();
+
+        List<BaseNewStudentPageVo> list = baseNewStudentService.getList(dto);
+
+        int sortCode = 1;
+        for (BaseNewStudentPageVo pageVo : list) {
+            BaseNewStudentListExcelVo excelVo = BeanUtil.toBean(pageVo, BaseNewStudentListExcelVo.class);
+            excelVo.setSortCode(sortCode);
+            if(pageVo.getStatus() != null && pageVo.getStatus() == 1){
+                excelVo.setClassState("是");
+            }else{
+                excelVo.setClassState("否");
+            }
+            if(pageVo.getIsCanBanding() != null && pageVo.getIsCanBanding() == 1){
+                excelVo.setCanBandingState("是");
+            }else{
+                excelVo.setCanBandingState("否");
+            }
+            if(pageVo.getOperateMode() != null && pageVo.getOperateMode() == 1){
+                excelVo.setOperateMode("自动分班");
+            }else if(pageVo.getOperateMode() != null && pageVo.getOperateMode() == 0){
+                excelVo.setCanBandingState("手动分班");
+            }
+
+            dataList.add(excelVo);
+
+            sortCode ++;
+        }
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, BaseNewStudentListExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+        String fileName = "exportQuerty" + ExcelTypeEnum.XLSX.getValue();
+        return RT.fileStream(bot.toByteArray(), fileName);
+    }
+
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java

@@ -27,6 +27,7 @@ import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseGradeService;
 import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.feedback.entity.FeedbackItem;
 import com.xjrsoft.module.hikvision.util.DataUtil;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.service.IUserDeptRelationService;
@@ -158,7 +159,7 @@ public class StudentManagerController {
         });
 
         List<BaseStudentTreeVo> treeVoList = TreeUtil.build(voList);
-
+        treeVoList.sort(Comparator.comparing(BaseStudentTreeVo::getName).reversed());
         return RT.ok(treeVoList);
     }
 
@@ -204,7 +205,6 @@ public class StudentManagerController {
         return RT.ok(studentManagerService.deptMajorGradeClassTree(dto));
     }
 
-
     @PostMapping
     @ApiOperation(value = "新增学生")
     @SaCheckPermission("studentmanager:add")

+ 3 - 0
src/main/java/com/xjrsoft/module/student/dto/AddBaseStudentSchoolRollDto.java

@@ -139,4 +139,7 @@ public class AddBaseStudentSchoolRollDto {
      */
     @ApiModelProperty("备注")
     private String remark;
+
+    @ApiModelProperty("实习状态")
+    private String internshipState;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentInfoDto.java

@@ -36,4 +36,7 @@ public class UpdateBaseStudentInfoDto implements Serializable {
 
     @ApiModelProperty("学生userIds")
     private List<Long> userIds;
+
+    @ApiModelProperty("实习状态(xjr_dictionary_item[internship_state])")
+    private String internshipState;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentSchoolRollDto.java

@@ -144,4 +144,7 @@ public class UpdateBaseStudentSchoolRollDto {
      */
     @ApiModelProperty("备注")
     private String remark;
+
+    @ApiModelProperty("实习状态")
+    private String internshipState;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/entity/BaseStudentSchoolRoll.java

@@ -203,4 +203,7 @@ public class BaseStudentSchoolRoll implements Serializable {
     @ApiModelProperty("学习形式")
     private String rollModality;
 
+    @ApiModelProperty("实习状态(xjr_dictionary_item[internship_state])")
+    private String internshipState;
+
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseNewStudentMapper.java

@@ -5,8 +5,10 @@ import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.banding.vo.IdManyCountVo;
 import com.xjrsoft.module.outint.vo.IdCountVo;
 import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
+import com.xjrsoft.module.student.dto.BaseStudentSimpleInfoDto;
 import com.xjrsoft.module.student.entity.BaseNewStudent;
 import com.xjrsoft.module.student.vo.BaseNewStudentPageVo;
+import com.xjrsoft.module.student.vo.BaseStudentSompleInfoVo;
 import com.xjrsoft.module.student.vo.EnrollmentPlanGradeVo;
 import com.xjrsoft.module.student.vo.EnrollmentPlanTreeVo;
 import org.apache.ibatis.annotations.Mapper;
@@ -25,6 +27,8 @@ public interface BaseNewStudentMapper extends MPJBaseMapper<BaseNewStudent> {
 
     Page<BaseNewStudentPageVo> getPage(Page<BaseNewStudentPageVo> page, BaseNewStudentPageDto dto);
 
+    List<BaseNewStudentPageVo> getList(@Param("dto") BaseNewStudentPageDto dto);
+
     Page<BaseNewStudentPageVo> getReportPage(Page<BaseNewStudentPageVo> page, BaseNewStudentPageDto dto);
 
     List<BaseNewStudentPageVo> getReportList(@Param("dto") BaseNewStudentPageDto dto);
@@ -38,4 +42,6 @@ public interface BaseNewStudentMapper extends MPJBaseMapper<BaseNewStudent> {
     List<IdCountVo> getSecondAmbitionStudentCount(@Param("gradeId") Long gradeId, @Param("enrollType") String enrollType);
 
     List<IdManyCountVo> getMajorStudentCount(@Param("id") Long bandingTaskId);
+
+    List<BaseStudentSompleInfoVo> getInfosByParam(@Param("dto") BaseStudentSimpleInfoDto dto);
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java

@@ -46,6 +46,8 @@ public interface BaseStudentSchoolRollMapper extends MPJBaseMapper<BaseStudentSc
      */
     List<BaseStudentInfoCategoryVo> getStudyStatusCount(@Param("dto") BaseStudentInfoPageDto dto);
 
+    List<BaseStudentInfoCategoryVo> getInternshipStateCount(@Param("dto") BaseStudentInfoPageDto dto);
+
 
     @Update("UPDATE base_student_school_roll SET class_id = #{classId},major_set_id=#{majorSetId} where user_id = #{userId}")
     Boolean updateStudentClass1(Long classId, Long majorSetId, Long userId);

+ 2 - 0
src/main/java/com/xjrsoft/module/student/service/IBaseNewStudentService.java

@@ -28,6 +28,8 @@ public interface IBaseNewStudentService extends MPJBaseService<BaseNewStudent> {
 
     Page<BaseNewStudentPageVo> getPage(Page<BaseNewStudentPageVo> page, BaseNewStudentPageDto dto);
 
+    List<BaseNewStudentPageVo> getList(BaseNewStudentPageDto dto);
+
     Page<BaseNewStudentPageVo> getReportPage(Page<BaseNewStudentPageVo> page, BaseNewStudentPageDto dto);
 
     List<BaseNewStudentPageVo> getReportList(BaseNewStudentPageDto dto);

+ 10 - 1
src/main/java/com/xjrsoft/module/student/service/impl/BaseNewStudentServiceImpl.java

@@ -40,7 +40,11 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -66,6 +70,11 @@ public class BaseNewStudentServiceImpl extends MPJBaseServiceImpl<BaseNewStudent
         return this.baseMapper.getPage(page, dto);
     }
 
+    @Override
+    public List<BaseNewStudentPageVo> getList(BaseNewStudentPageDto dto) {
+        return this.baseMapper.getList(dto);
+    }
+
     @Override
     public Page<BaseNewStudentPageVo> getReportPage(Page<BaseNewStudentPageVo> page, BaseNewStudentPageDto dto) {
         return this.baseMapper.getReportPage(page, dto);

+ 21 - 3
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java

@@ -18,6 +18,7 @@ import com.xjrsoft.module.room.vo.RoomBedInfoVo;
 import com.xjrsoft.module.student.dto.*;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.mapper.BaseNewStudentMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
 import com.xjrsoft.module.student.mapper.PbSemesterConfigMapper;
@@ -53,6 +54,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     private final UserMapper userMapper;
     private final IStudentChangeRecordService recordService;
     private final BaseStudentMapper baseStudentMapper;
+    private final BaseNewStudentMapper newStudentMapper;
 
 
     @Override
@@ -102,7 +104,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     public Boolean updateInfo(UpdateBaseStudentInfoDto dto) {
         for (Long id : dto.getUserIds()) {
             BaseStudentSchoolRoll schoolRoll = this.getOne(new QueryWrapper<BaseStudentSchoolRoll>().lambda().eq(BaseStudentSchoolRoll::getUserId, id));
-            if (!dto.getStduyStatus().equals(schoolRoll.getStduyStatus())) {
+            if (dto.getStduyStatus() !=null && !dto.getStduyStatus().equals(schoolRoll.getStduyStatus())) {
                 recordService.insertData(
                         StudyStatusEnum.fromCode(schoolRoll.getStduyStatus()),
                         schoolRoll.getStduyStatus(),
@@ -114,7 +116,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
                         2
                 );
             }
-            if (!dto.getRollModality().equals(schoolRoll.getLearnStatus())) {
+            if (dto.getRollModality() !=null && !dto.getRollModality().equals(schoolRoll.getLearnStatus())) {
                 recordService.insertData(
                         RollModalityEnum.fromCode(schoolRoll.getLearnStatus()),
                         schoolRoll.getLearnStatus(),
@@ -126,7 +128,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
                         2
                 );
             }
-            if (schoolRoll.getArchivesStatus() != null && !schoolRoll.getArchivesStatus().equals(dto.getArchivesStatus())) {
+            if (dto.getArchivesStatus() !=null && schoolRoll.getArchivesStatus() != null && !schoolRoll.getArchivesStatus().equals(dto.getArchivesStatus())) {
                 recordService.insertData(
                         ArchivesStatusEnum.fromCode(schoolRoll.getArchivesStatus()),
                         schoolRoll.getArchivesStatus(),
@@ -219,6 +221,19 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
         result.setStayCount(stayCount);
         result.setNotStayCount(notStayCount);
 
+        List<BaseStudentInfoCategoryVo> internshipStateCount = baseStudentSchoolRollMapper.getInternshipStateCount(dto);
+        int internshipCount = 0;
+        int atSchoolCount = 0;
+        for (BaseStudentInfoCategoryVo categoryVo : internshipStateCount) {
+            if ("IT_0001".equals(categoryVo.getCategory())) {
+                atSchoolCount = atSchoolCount + categoryVo.getNumber();
+            } else if ("IT_0002".equals(categoryVo.getCategory())) {
+                internshipCount = internshipCount + categoryVo.getNumber();
+            }
+        }
+        result.setAtSchoolCount(atSchoolCount);
+        result.setInternshipCount(internshipCount);
+
         return result;
     }
 
@@ -260,6 +275,9 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     @Override
     public List<BaseStudentSompleInfoVo> getInfosByParam(BaseStudentSimpleInfoDto dto) {
         List<BaseStudentSompleInfoVo> userList = userMapper.getInfosByParam(dto);
+        if(userList.isEmpty()){
+            userList = newStudentMapper.getInfosByParam(dto);
+        }
         return userList;
     }
 

+ 24 - 0
src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java

@@ -149,6 +149,12 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
             graduationsRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
         }
 
+        Map<String, Long> graduationPays = pbCseFeeobjupdateList.stream().filter(x -> x.getGraduations() != null).filter(x -> "已缴费".equals(x.getPaymnystate())).collect(Collectors.groupingBy(PbCseFeeobjupdate::getGraduations, Collectors.counting()));
+        List<EnrollmentStatisticsInfoKeyValue> graduationsPayRes = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : graduationPays.entrySet()) {
+            graduationsPayRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
+        }
+
         //住宿类型
         Map<String, Long> accommodationType = pbCseFeeobjupdateList.stream().filter(x -> x.getQuartername() != null).collect(Collectors.groupingBy(PbCseFeeobjupdate::getQuartername, Collectors.counting()));
         List<EnrollmentStatisticsInfoKeyValue> accommodationTypeRes = new ArrayList<>();
@@ -156,6 +162,23 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
             accommodationTypeRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
         }
 
+        Map<String, List<PbCseFeeobjupdate>> quarternameList = pbCseFeeobjupdateList.stream().filter(x -> x.getQuartername() != null).collect(Collectors.groupingBy(PbCseFeeobjupdate::getQuartername));
+        for (String quartername : quarternameList.keySet()) {
+            Map<String, Long> collect = quarternameList.get(quartername).stream().filter(x -> x.getQuartername() != null).collect(Collectors.groupingBy(PbCseFeeobjupdate::getSex, Collectors.counting()));
+            for (Map.Entry<String, Long> entry : collect.entrySet()) {
+                accommodationTypeRes.add(new EnrollmentStatisticsInfoKeyValue(quartername + entry.getKey(), entry.getValue()));
+            }
+        }
+
+        Map<String, List<PbCseFeeobjupdate>> payquarternameList = pbCseFeeobjupdateList.stream().filter(x -> x.getQuartername() != null && "已缴费".equals(x.getPaymnystate())).collect(Collectors.groupingBy(PbCseFeeobjupdate::getQuartername));
+        for (String quartername : payquarternameList.keySet()) {
+            Map<String, Long> collect = payquarternameList.get(quartername).stream().filter(x -> x.getQuartername() != null).collect(Collectors.groupingBy(PbCseFeeobjupdate::getSex, Collectors.counting()));
+            accommodationTypeRes.add(new EnrollmentStatisticsInfoKeyValue("缴费" + quartername, payquarternameList.get(quartername).stream().count()));
+            for (Map.Entry<String, Long> entry : collect.entrySet()) {
+                accommodationTypeRes.add(new EnrollmentStatisticsInfoKeyValue("缴费" + quartername + entry.getKey(), entry.getValue()));
+            }
+        }
+
         //性别
         Map<String, Long> gender = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getSex, Collectors.counting()));
         List<EnrollmentStatisticsInfoKeyValue> genderRes = new ArrayList<>();
@@ -168,6 +191,7 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
         result.setStudentSource(graduationsRes);
         result.setAccommodationType(accommodationTypeRes);
         result.setGender(genderRes);
+        result.setStudentSourcePay(graduationsPayRes);
 
         //获取所有学生的收费明细
         MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateXssfdetailMPJLambdaWrapper = new MPJLambdaWrapper<>();

+ 129 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseNewStudentListExcelVo.java

@@ -0,0 +1,129 @@
+package com.xjrsoft.module.student.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @title: 新生维护信息分页列表出参
+ * @Author dzx
+ * @Date: 2024-06-27
+ * @Version 1.0
+ */
+@Data
+public class BaseNewStudentListExcelVo {
+
+    @ExcelProperty("序号")
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+
+    @ExcelProperty("状态")
+    @ApiModelProperty("状态")
+    private String canBandingState;
+
+    @ExcelProperty("学生姓名")
+    @ApiModelProperty("学生姓名")
+    private String name;
+
+    @ExcelProperty("性别")
+    @ApiModelProperty("性别")
+    private String genderCn;
+
+    @ExcelProperty("身份证号")
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
+    @ExcelProperty("班级状态")
+    @ApiModelProperty("班级状态")
+    private String classState;
+
+    @ExcelProperty("在读班级班名称")
+    @ApiModelProperty("在读班级班名称")
+    private String className;
+
+    @ExcelProperty("在读班级班主任")
+    @ApiModelProperty("在读班级班主任")
+    private String teacherName;
+
+    @ExcelProperty("分班类型")
+    @ApiModelProperty("分班类型")
+    private String operateMode;
+
+    @ExcelProperty("分班班级")
+    @ApiModelProperty("分班班级")
+    private String bandingClassName;
+
+    @ExcelProperty("分班班主任")
+    @ApiModelProperty("分班班主任")
+    private String bandingTeacherName;
+
+    @ExcelProperty("毕业学校")
+    @ApiModelProperty("毕业学校")
+    private String graduateSchool;
+
+    @ExcelProperty("身高")
+    @ApiModelProperty("身高")
+    private String height;
+
+    @ExcelProperty("体重")
+    @ApiModelProperty("体重")
+    private String weight;
+
+    @ExcelProperty("成绩")
+    @ApiModelProperty("成绩")
+    private String score;
+
+    @ExcelProperty("毕业班级")
+    @ApiModelProperty("毕业班级")
+    private String graduateClass;
+
+    @ExcelProperty("学生来源")
+    @ApiModelProperty("学生来源")
+    private String sourceCn;
+
+    @ExcelProperty("住宿类型")
+    @ApiModelProperty("住宿类型")
+    private String stduyStatusCn;
+
+    @ExcelProperty("手机号")
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ExcelProperty("第一志愿")
+    @ApiModelProperty("第一志愿")
+    private String firstAmbition;
+
+    @ExcelProperty("第二志愿")
+    @ApiModelProperty("第二志愿")
+    private String secondAmbition;
+
+    @ExcelProperty("缴费状态")
+    @ApiModelProperty("缴费状态")
+    private String paymnystate;
+
+    @ExcelProperty("是否往届生")
+    @ApiModelProperty("是否往届生")
+    private String previous;
+
+    @ExcelProperty("户籍所属省")
+    @ApiModelProperty("户籍所属省")
+    private String province;
+
+    @ExcelProperty("户籍所属市")
+    @ApiModelProperty("户籍所属市")
+    private String city;
+
+    @ExcelProperty("户籍所属区")
+    @ApiModelProperty("户籍所属区")
+    private String myarea;
+
+    @ExcelProperty("家庭电话")
+    @ApiModelProperty("家庭电话")
+    private String familyMobile;
+
+    @ExcelProperty("家庭地址")
+    @ApiModelProperty("家庭地址")
+    private String familyAddress;
+
+
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/student/vo/BaseStudentDevelopmentVo.java

@@ -48,7 +48,7 @@ public class BaseStudentDevelopmentVo {
      * 是否灵活就业(1:是 0:否)
      */
     @ApiModelProperty("工作内容")
-    private Integer workContent;
+    private String workContent;
     /**
      * 是否校企合作单位(1:是 0:否)
      */

+ 6 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java

@@ -129,4 +129,10 @@ public class BaseStudentInfoDetailVo {
 
     @ApiModelProperty("身份证号")
     private String credentialNumber;
+
+    @ApiModelProperty("实习状态-中文")
+    private String internshipStateCn;
+
+    @ApiModelProperty("实习状态")
+    private String internshipState;
 }

+ 8 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageDataVo.java

@@ -49,4 +49,12 @@ public class BaseStudentInfoPageDataVo {
     @ApiModelProperty("走读女生人数")
     private Integer femaleNotStayCount;
 
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("在校学习人数")
+    private Integer atSchoolCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("外出实习人数")
+    private Integer internshipCount;
+
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageVo.java

@@ -123,4 +123,7 @@ public class BaseStudentInfoPageVo {
 
     @ApiModelProperty("身份证号")
     private String credentialNumber;
+
+    @ApiModelProperty("实习状态")
+    private String internshipStateCn;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentSchoolRollVo.java

@@ -151,5 +151,8 @@ public class BaseStudentSchoolRollVo {
     @ApiModelProperty("寝室号")
     private String roomName;
 
+    @ApiModelProperty("实习状态")
+    private String internshipState;
+
 
 }

+ 4 - 1
src/main/java/com/xjrsoft/module/student/vo/EnrollmentStatisticsInfoVo.java

@@ -32,9 +32,12 @@ public class EnrollmentStatisticsInfoVo {
     /**
      * 学生来源
      */
-    @ApiModelProperty("学生来源")
+    @ApiModelProperty("学生来源(报名人数)")
     private List<EnrollmentStatisticsInfoKeyValue> studentSource;
 
+    @ApiModelProperty("学生来源(缴费人数)")
+    private List<EnrollmentStatisticsInfoKeyValue> studentSourcePay;
+
     /**
      * 住宿类型
      */

+ 185 - 4
src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -13,6 +14,7 @@ import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -33,20 +35,21 @@ import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.teacher.entity.BaseTeacherRegular;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
-import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
-import com.xjrsoft.module.teacher.vo.XjrUserVo;
+import com.xjrsoft.module.teacher.vo.*;
+import com.xjrsoft.module.veb.util.ImportExcelUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.text.ParseException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -186,7 +189,6 @@ public class TeacherbaseManagerController {
         return R.ok(userVo);
     }
 
-
     @PostMapping
     @ApiOperation(value = "新增XjrUser")
     @SaCheckPermission("teacherbasemanager:add")
@@ -224,4 +226,183 @@ public class TeacherbaseManagerController {
         return RT.ok(teacherbaseManagerService.importData(excelDataList));
     }
 
+    @PostMapping("/professional-title-import")
+    @ApiOperation(value = "教职工职称信息导入")
+    @XjrLog(value = "教职工职称信息导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> professionalTitle(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.professionalTitle(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/professional-title-template")
+    @ApiOperation(value = "教职工职称信息模板下载")
+    @XjrLog(value = "教职工职称信息模板下载")
+    public ResponseEntity<byte[]> professionalTitleTemplate() throws IOException {
+        ProfessionalTitleImportVo obj = new ProfessionalTitleImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/teacher-certification-import")
+    @ApiOperation(value = "教师资格证信息息导入")
+    @XjrLog(value = "教师资格证信息导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> teacherCertification(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.teacherCertification(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/teacher-certification-template")
+    @ApiOperation(value = "教师资格证信息模板下载")
+    @XjrLog(value = "教师资格证信息模板下载")
+    public ResponseEntity<byte[]> teacherCertificationTemplate() throws IOException {
+        TeacherCertificationImportVo obj = new TeacherCertificationImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/evaluator-information-import")
+    @ApiOperation(value = "考评员信息导入")
+    @XjrLog(value = "考评员信息导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> evaluatorInformation(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.evaluatorInformation(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/evaluator-information-template")
+    @ApiOperation(value = "考评员信息模板下载")
+    @XjrLog(value = "考评员信息模板下载")
+    public ResponseEntity<byte[]> evaluatorInformationTemplate() throws IOException {
+        EvaluatorInformationImportVo obj = new EvaluatorInformationImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/language-competence-import")
+    @ApiOperation(value = "语言能力信息导入")
+    @XjrLog(value = "语言能力信息导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> languageCompetence(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.languageCompetence(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/language-competence-template")
+    @ApiOperation(value = "语言能力信息模板下载")
+    @XjrLog(value = "语言能力信息模板下载")
+    public ResponseEntity<byte[]> languageCompetenceTemplate() throws IOException {
+        LanguageCompetenceImportVo obj = new LanguageCompetenceImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/faculty-contract-import")
+    @ApiOperation(value = "教职工合同记录导入")
+    @XjrLog(value = "教职工合同记录导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> facultyContract(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.facultyContract(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/faculty-contract-template")
+    @ApiOperation(value = "教职工合同记录模板下载")
+    @XjrLog(value = "教职工合同记录模板下载")
+    public ResponseEntity<byte[]> facultyContractTemplate() throws IOException {
+        FacultyContractImportVo obj = new FacultyContractImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/outside-associations-import")
+    @ApiOperation(value = "校外其他协会记录导入")
+    @XjrLog(value = "校外其他协会记录导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> outsideAssociations(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.outsideAssociations(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/outside-associations-template")
+    @ApiOperation(value = "校外其他协会记录模板下载")
+    @XjrLog(value = "校外其他协会记录模板下载")
+    public ResponseEntity<byte[]> outsideAssociationsTemplate() throws IOException {
+        OutsideAssociationsImportVo obj = new OutsideAssociationsImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/core-teacher-import")
+    @ApiOperation(value = "骨干教师记录导入")
+    @XjrLog(value = "骨干教师记录导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> coreTeacher(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.coreTeacher(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/core-teacher-template")
+    @ApiOperation(value = "骨干教师记录模板下载")
+    @XjrLog(value = "骨干教师记录模板下载")
+    public ResponseEntity<byte[]> coreTeacherTemplate() throws IOException {
+        CoreTeacherImportVo obj = new CoreTeacherImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/scientific-research-import")
+    @ApiOperation(value = "科研信息记录导入")
+    @XjrLog(value = "科研信息记录导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> scientificResearch(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.scientificResearch(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/scientific-research-template")
+    @ApiOperation(value = "科研信息记录模板下载")
+    @XjrLog(value = "科研信息记录模板下载")
+    public ResponseEntity<byte[]> scientificResearchTemplate() throws IOException {
+        ScientificResearchImportVo obj = new ScientificResearchImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/job-information-import")
+    @ApiOperation(value = "岗位信息记录导入")
+    @XjrLog(value = "岗位信息记录导入", saveRequestData = false, saveResponseData = true)
+    public RT<Boolean> jobInformation(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = teacherbaseManagerService.jobInformation(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/job-information-template")
+    @ApiOperation(value = "岗位信息记录模板下载")
+    @XjrLog(value = "岗位信息记录模板下载")
+    public ResponseEntity<byte[]> jobInformationTemplate() throws IOException {
+        JobInformationImportVo obj = new JobInformationImportVo();
+        ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
 }

+ 27 - 0
src/main/java/com/xjrsoft/module/teacher/dto/BaseTeacherPageDto.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.util.List;
+
+
+/**
+ * @title: 教师奖项分页查询入参
+ * @Author dzx
+ * @Date: 2024-06-04
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseTeacherPageDto extends PageInput {
+
+    private List<Long> userIds;
+
+    private List<Long> deptIds;
+
+}

+ 134 - 0
src/main/java/com/xjrsoft/module/teacher/entity/CoreTeacher.java

@@ -0,0 +1,134 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 骨干教师记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("core_teacher")
+@ApiModel(value = "core_teacher", description = "骨干教师记录")
+public class CoreTeacher implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 级别
+    */
+    @ApiModelProperty("级别")
+    private String level;
+    /**
+    * 任教学科
+    */
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificationNo;
+    /**
+    * 专业部
+    */
+    @ApiModelProperty("专业部")
+    private String specialtyDept;
+    /**
+    * 文号
+    */
+    @ApiModelProperty("文号")
+    private String referenceNumber;
+    /**
+    * 认证时间
+    */
+    @ApiModelProperty("认证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 134 - 0
src/main/java/com/xjrsoft/module/teacher/entity/EvaluatorInformation.java

@@ -0,0 +1,134 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 考评员信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("evaluator_information")
+@ApiModel(value = "evaluator_information", description = "考评员信息")
+public class EvaluatorInformation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 证书名称
+    */
+    @ApiModelProperty("证书名称")
+    private String name;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificationNo;
+    /**
+    * 任教学科
+    */
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 级别
+    */
+    @ApiModelProperty("级别")
+    private String level;
+    /**
+    * 发证机构
+    */
+    @ApiModelProperty("发证机构")
+    private String certifyingAuthority;
+    /**
+    * 发证时间
+    */
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 有效期
+    */
+    @ApiModelProperty("有效期")
+    private LocalDate validity;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 114 - 0
src/main/java/com/xjrsoft/module/teacher/entity/FacultyContract.java

@@ -0,0 +1,114 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 教职工合同记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("faculty_contract")
+@ApiModel(value = "faculty_contract", description = "教职工合同记录")
+public class FacultyContract implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 起始日期
+    */
+    @ApiModelProperty("起始日期")
+    private LocalDate startDate;
+    /**
+    * 结束日期
+    */
+    @ApiModelProperty("结束日期")
+    private LocalDate endDate;
+    /**
+    * 合同岗位
+    */
+    @ApiModelProperty("合同岗位")
+    private String contractPosition;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 139 - 0
src/main/java/com/xjrsoft/module/teacher/entity/JobInformation.java

@@ -0,0 +1,139 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 岗位信息记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("job_information")
+@ApiModel(value = "job_information", description = "岗位信息记录")
+public class JobInformation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 岗位类型
+    */
+    @ApiModelProperty("岗位类型")
+    private String jobCategory;
+    /**
+    * 岗位名称
+    */
+    @ApiModelProperty("岗位名称")
+    private String jobName;
+    /**
+    * 聘用时间
+    */
+    @ApiModelProperty("聘用时间")
+    private LocalDate employDate;
+    /**
+    * 聘用文号
+    */
+    @ApiModelProperty("聘用文号")
+    private String employNo;
+    /**
+    * 是否领导岗位
+    */
+    @ApiModelProperty("是否领导岗位")
+    private String leaderStatus;
+    /**
+    * 行政岗位部门
+    */
+    @ApiModelProperty("行政岗位部门")
+    private String jobDept;
+    /**
+    * 兼课学院
+    */
+    @ApiModelProperty("兼课学院")
+    private String concurrentCollege;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 129 - 0
src/main/java/com/xjrsoft/module/teacher/entity/LanguageCompetence.java

@@ -0,0 +1,129 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 语言能力信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("language_competence")
+@ApiModel(value = "language_competence", description = "语言能力信息")
+public class LanguageCompetence implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 语言种类
+    */
+    @ApiModelProperty("语言种类")
+    private String name;
+    /**
+    * 等级
+    */
+    @ApiModelProperty("等级")
+    private String level;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificationNo;
+    /**
+    * 测试机构
+    */
+    @ApiModelProperty("测试机构")
+    private String examAuthority;
+    /**
+    * 发证单位
+    */
+    @ApiModelProperty("发证单位")
+    private String issuanceUnit;
+    /**
+    * 发证时间
+    */
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 124 - 0
src/main/java/com/xjrsoft/module/teacher/entity/OutsideAssociations.java

@@ -0,0 +1,124 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 校外其他协会记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("outside_associations")
+@ApiModel(value = "outside_associations", description = "校外其他协会记录")
+public class OutsideAssociations implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 协会名称
+    */
+    @ApiModelProperty("协会名称")
+    private String name;
+    /**
+    * 加入时间
+    */
+    @ApiModelProperty("加入时间")
+    private LocalDate joinDate;
+    /**
+    * 退出时间
+    */
+    @ApiModelProperty("退出时间")
+    private LocalDate exitDate;
+    /**
+    * 职务
+    */
+    @ApiModelProperty("职务")
+    private String duty;
+    /**
+    * 说明
+    */
+    @ApiModelProperty("说明")
+    private String remark;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 154 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ProfessionalTitle.java

@@ -0,0 +1,154 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 教职工职称信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("professional_title")
+@ApiModel(value = "professional_title", description = "教职工职称信息")
+public class ProfessionalTitle implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 职称名称
+    */
+    @ApiModelProperty("职称名称")
+    private String name;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String professionalTitleNo;
+    /**
+    * 取得时间
+    */
+    @ApiModelProperty("取得时间")
+    private LocalDate getDate;
+    /**
+    * 学科类别
+    */
+    @ApiModelProperty("学科类别")
+    private String subjectCategory;
+    /**
+    * 授予时间
+    */
+    @ApiModelProperty("授予时间")
+    private LocalDate beHonoredDate;
+    /**
+    * 发证时间
+    */
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 任职资格开始时间
+    */
+    @ApiModelProperty("任职资格开始时间")
+    private LocalDate qualificationStartDate;
+    /**
+    * 任职资格结束时间
+    */
+    @ApiModelProperty("任职资格结束时间")
+    private LocalDate qualificationEndDate;
+    /**
+    * 发文时间
+    */
+    @ApiModelProperty("发文时间")
+    private LocalDate noticeDate;
+    /**
+    * 职称类别
+    */
+    @ApiModelProperty("职称类别")
+    private String professionalTitleCategory;
+    /**
+    * 是否现任(0:否;1:是)
+    */
+    @ApiModelProperty("是否现任(0:否;1:是)")
+    private String jobStatus;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 134 - 0
src/main/java/com/xjrsoft/module/teacher/entity/ScientificResearch.java

@@ -0,0 +1,134 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 科研信息记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("scientific_research")
+@ApiModel(value = "scientific_research", description = "科研信息记录")
+public class ScientificResearch implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 科研名称
+    */
+    @ApiModelProperty("科研名称")
+    private String name;
+    /**
+    * 科研编号
+    */
+    @ApiModelProperty("科研编号")
+    private String scientificNo;
+    /**
+    * 任教学科
+    */
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 等级
+    */
+    @ApiModelProperty("等级")
+    private String level;
+    /**
+    * 发证机构
+    */
+    @ApiModelProperty("发证机构")
+    private String certifyingAuthority;
+    /**
+    * 发证时间
+    */
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 129 - 0
src/main/java/com/xjrsoft/module/teacher/entity/TeacherCertification.java

@@ -0,0 +1,129 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 教师资格证信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+@TableName("teacher_certification")
+@ApiModel(value = "teacher_certification", description = "教师资格证信息")
+public class TeacherCertification implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教职工主键id(xjr_user)
+    */
+    @ApiModelProperty("教职工主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 工号
+    */
+    @ApiModelProperty("工号")
+    private String userName;
+    /**
+    * 部门主键id(xjr_dept)
+    */
+    @ApiModelProperty("部门主键id(xjr_dept)")
+    private String deptId;
+    /**
+    * 证书名称
+    */
+    @ApiModelProperty("证书名称")
+    private String name;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificationNo;
+    /**
+    * 任教学科
+    */
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 资格种类
+    */
+    @ApiModelProperty("资格种类")
+    private String category;
+    /**
+    * 发证机构
+    */
+    @ApiModelProperty("发证机构")
+    private String certifyingAuthority;
+    /**
+    * 发证时间
+    */
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 依据附件id
+    */
+    @ApiModelProperty("依据附件id")
+    private Long accordFileId;
+
+
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/BaseTeacherMapper.java

@@ -1,8 +1,13 @@
 package com.xjrsoft.module.teacher.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.dto.BaseTeacherPageDto;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @title: mapper
@@ -13,4 +18,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface BaseTeacherMapper extends MPJBaseMapper<BaseTeacher> {
 
+    List<XjrUserPageVo> getList(@Param("dto") BaseTeacherPageDto dto);
 }

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/CoreTeacherMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.CoreTeacher;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 骨干教师记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface CoreTeacherMapper extends MPJBaseMapper<CoreTeacher> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/EvaluatorInformationMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.EvaluatorInformation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考评员信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface EvaluatorInformationMapper extends MPJBaseMapper<EvaluatorInformation> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/FacultyContractMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.FacultyContract;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教职工合同记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface FacultyContractMapper extends MPJBaseMapper<FacultyContract> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/JobInformationMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.JobInformation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 岗位信息记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface JobInformationMapper extends MPJBaseMapper<JobInformation> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/LanguageCompetenceMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.LanguageCompetence;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 语言能力信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface LanguageCompetenceMapper extends MPJBaseMapper<LanguageCompetence> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/OutsideAssociationsMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.OutsideAssociations;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 校外其他协会记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface OutsideAssociationsMapper extends MPJBaseMapper<OutsideAssociations> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ProfessionalTitleMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ProfessionalTitle;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教职工职称信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface ProfessionalTitleMapper extends MPJBaseMapper<ProfessionalTitle> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/ScientificResearchMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.ScientificResearch;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 科研信息记录
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface ScientificResearchMapper extends MPJBaseMapper<ScientificResearch> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/TeacherCertificationMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.TeacherCertification;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教师资格证信息
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Mapper
+public interface TeacherCertificationMapper extends MPJBaseMapper<TeacherCertification> {
+
+}

+ 25 - 1
src/main/java/com/xjrsoft/module/teacher/service/ITeacherbaseManagerService.java

@@ -2,9 +2,14 @@ package com.xjrsoft.module.teacher.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.teacher.dto.AddXjrUserDto;
+import com.xjrsoft.module.teacher.dto.BaseTeacherPageDto;
 import com.xjrsoft.module.teacher.dto.UpdateXjrUserDto;
 import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.text.ParseException;
 import java.util.List;
 import java.util.Map;
 
@@ -40,7 +45,7 @@ public interface ITeacherbaseManagerService extends MPJBaseService<XjrUser> {
      */
     Boolean delete(List<Long> ids);
 
-    Boolean importData(List<Map<Integer, Object>> excelDataList);
+    Boolean importData(List<Map<Integer, Object>> excelDataList) throws ParseException;
 
     void changeIsNormal(String jobState, Integer isNormal);
 
@@ -48,4 +53,23 @@ public interface ITeacherbaseManagerService extends MPJBaseService<XjrUser> {
 
     void disabledUser(Long userId);
 
+    List<XjrUserPageVo> getList(BaseTeacherPageDto dto);
+
+    String professionalTitle(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String teacherCertification(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String evaluatorInformation(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String languageCompetence(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String facultyContract(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String outsideAssociations(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String coreTeacher(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String scientificResearch(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String jobInformation(MultipartFile file) throws IOException, IllegalAccessException;
 }

+ 964 - 116
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java

@@ -6,36 +6,24 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.DeleteMark;
-import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.enums.GenderDictionaryEnum;
-import com.xjrsoft.common.enums.JobStateEnum;
-import com.xjrsoft.common.enums.RoleEnum;
-import com.xjrsoft.common.enums.TeaChangeTypeEnum;
+import com.xjrsoft.common.enums.*;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.hikvision.util.DataUtil;
-import com.xjrsoft.module.organization.entity.Department;
-import com.xjrsoft.module.organization.entity.Post;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.entity.UserDeptRelation;
-import com.xjrsoft.module.organization.entity.UserPostRelation;
-import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.entity.*;
 import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
-import com.xjrsoft.module.organization.service.IDepartmentService;
-import com.xjrsoft.module.organization.service.IPostService;
-import com.xjrsoft.module.organization.service.IUserDeptRelationService;
-import com.xjrsoft.module.organization.service.IUserPostRelationService;
-import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.organization.service.*;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.mapper.CarMessageApplyMapper;
 import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
@@ -43,47 +31,36 @@ import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.entity.DictionaryItem;
 import com.xjrsoft.module.system.service.IDictionarydetailService;
 import com.xjrsoft.module.teacher.dto.AddXjrUserDto;
+import com.xjrsoft.module.teacher.dto.BaseTeacherPageDto;
 import com.xjrsoft.module.teacher.dto.UpdateXjrUserDto;
-import com.xjrsoft.module.teacher.entity.BaseTeacher;
-import com.xjrsoft.module.teacher.entity.BaseTeacherChangeRecord;
-import com.xjrsoft.module.teacher.entity.BaseTeacherContact;
-import com.xjrsoft.module.teacher.entity.BaseTeacherEducation;
-import com.xjrsoft.module.teacher.entity.BaseTeacherEmploy;
-import com.xjrsoft.module.teacher.entity.BaseTeacherFamily;
-import com.xjrsoft.module.teacher.entity.BaseTeacherFamilyMember;
-import com.xjrsoft.module.teacher.entity.BaseTeacherRegular;
-import com.xjrsoft.module.teacher.entity.WfTeacherDepart;
-import com.xjrsoft.module.teacher.entity.XjrUser;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherChangeRecordMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherContactMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherEducationMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherEmployMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherFamilyMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherFamilyMemberMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherMapper;
-import com.xjrsoft.module.teacher.mapper.BaseTeacherRegularMapper;
-import com.xjrsoft.module.teacher.mapper.WfTeacherDepartMapper;
-import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import com.xjrsoft.module.teacher.entity.*;
+import com.xjrsoft.module.teacher.mapper.*;
 import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
+import com.xjrsoft.module.teacher.vo.*;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.camunda.bpm.engine.history.HistoricProcessInstance;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static com.xjrsoft.module.veb.util.ImportExcelUtil.isRequiredFieldsFilled;
+
 /**
  * @title: service
  * @Author 管理员
@@ -95,13 +72,13 @@ import java.util.stream.Collectors;
 public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMapper, XjrUser> implements ITeacherbaseManagerService {
     private final XjrUserMapper teacherbaseManagerXjrUserMapper;
 
-    private final BaseTeacherMapper teacherbaseManagerBaseTeacherMapper;
-    private final BaseTeacherContactMapper teacherbaseManagerBaseTeacherContactMapper;
-    private final BaseTeacherEducationMapper teacherbaseManagerBaseTeacherEducationMapper;
-    private final BaseTeacherEmployMapper teacherbaseManagerBaseTeacherEmployMapper;
-    private final BaseTeacherFamilyMapper teacherbaseManagerBaseTeacherFamilyMapper;
-    private final BaseTeacherFamilyMemberMapper teacherbaseManagerBaseTeacherFamilyMemberMapper;
-    private final BaseTeacherRegularMapper teacherbaseManagerBaseTeacherRegularMapper;
+    private final BaseTeacherMapper teacherMapper;
+    private final BaseTeacherContactMapper teacherContactMapper;
+    private final BaseTeacherEducationMapper teacherEducationMapper;
+    private final BaseTeacherEmployMapper teacherEmployMapper;
+    private final BaseTeacherFamilyMapper baseTeacherFamilyMapper;
+    private final BaseTeacherFamilyMemberMapper familyMemberMapper;
+    private final BaseTeacherRegularMapper teacherRegularMapper;
 
     private final UserRoleRelationMapper userRoleRelationMapper;
     private final IUserDeptRelationService userDeptRelationService;
@@ -113,18 +90,22 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
     private final IDictionarydetailService dictionaryService;
     private final IDepartmentService departmentService;
     private final IPostService postService;
-    private final BaseTeacherMapper baseTeacherMapper;
+    private final ITeacherFaceProcessService teacherFaceProcessService;
+    private final CarMessageApplyMapper carMessageApplyMapper;
     private IDictionarydetailService dictionarydetailService;
-
     private WfTeacherDepartMapper wfTeacherDepartMapper;
-
     private BaseTeacherChangeRecordMapper baseTeacherChangeRecordMapper;
-
     private WorkflowFormRelationMapper workflowFormRelationMapper;
 
-    private final ITeacherFaceProcessService teacherFaceProcessService;
-    private final CarMessageApplyMapper carMessageApplyMapper;
-
+    private ProfessionalTitleMapper professionalTitleMapper;
+    private TeacherCertificationMapper teacherCertificationMapper;
+    private EvaluatorInformationMapper evaluatorInformationMapper;
+    private LanguageCompetenceMapper languageCompetenceMapper;
+    private FacultyContractMapper facultyContractMapper;
+    private OutsideAssociationsMapper outsideAssociationsMapper;
+    private CoreTeacherMapper coreTeacherMapper;
+    private ScientificResearchMapper scientificResearchMapper;
+    private JobInformationMapper jobInformationMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -157,31 +138,31 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                 }
             }
 
-            teacherbaseManagerBaseTeacherMapper.insert(baseTeacher);
+            teacherMapper.insert(baseTeacher);
         }
         for (BaseTeacherContact baseTeacherContact : xjrUser.getBaseTeacherContactList()) {
             baseTeacherContact.setUserId(xjrUser.getId());
-            teacherbaseManagerBaseTeacherContactMapper.insert(baseTeacherContact);
+            teacherContactMapper.insert(baseTeacherContact);
         }
         for (BaseTeacherEducation baseTeacherEducation : xjrUser.getBaseTeacherEducationList()) {
             baseTeacherEducation.setUserId(xjrUser.getId());
-            teacherbaseManagerBaseTeacherEducationMapper.insert(baseTeacherEducation);
+            teacherEducationMapper.insert(baseTeacherEducation);
         }
         for (BaseTeacherEmploy baseTeacherEmploy : xjrUser.getBaseTeacherEmployList()) {
             baseTeacherEmploy.setUserId(xjrUser.getId());
-            teacherbaseManagerBaseTeacherEmployMapper.insert(baseTeacherEmploy);
+            teacherEmployMapper.insert(baseTeacherEmploy);
         }
         for (BaseTeacherFamily baseTeacherFamily : xjrUser.getBaseTeacherFamilyList()) {
             baseTeacherFamily.setUserId(xjrUser.getId());
-            teacherbaseManagerBaseTeacherFamilyMapper.insert(baseTeacherFamily);
+            baseTeacherFamilyMapper.insert(baseTeacherFamily);
         }
         for (BaseTeacherFamilyMember baseTeacherFamilyMember : xjrUser.getBaseTeacherFamilyMemberList()) {
             baseTeacherFamilyMember.setUserId(xjrUser.getId());
-            teacherbaseManagerBaseTeacherFamilyMemberMapper.insert(baseTeacherFamilyMember);
+            familyMemberMapper.insert(baseTeacherFamilyMember);
         }
         for (BaseTeacherRegular baseTeacherRegular : xjrUser.getBaseTeacherRegularList()) {
             baseTeacherRegular.setUserId(xjrUser.getId());
-            teacherbaseManagerBaseTeacherRegularMapper.insert(baseTeacherRegular);
+            teacherRegularMapper.insert(baseTeacherRegular);
         }
 
         List<UserDeptRelation> userDeptRelationList = new ArrayList<>();
@@ -240,7 +221,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
     @Transactional(rollbackFor = Exception.class)
     public Boolean update(UpdateXjrUserDto dto) {
         XjrUser old = this.getByIdDeep(dto.getId());
-        if(ObjectUtils.isEmpty(old)){
+        if (ObjectUtils.isEmpty(old)) {
             throw new MyException("教职工信息不存在");
         }
 
@@ -298,7 +279,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             baseTeacherChangeRecordMapper.insert(insetBaseTeacherChangeRecord);
 
             //如果在职状态改为了非在职,禁用账号,并清空海康相关信息
-            if(!JobStateEnum.isBeOnTheJobByCode(oldJobState)){
+            if (!JobStateEnum.isBeOnTheJobByCode(oldJobState)) {
                 disabledUser(dto.getId());
             }
         }
@@ -345,7 +326,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacher  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacher> baseTeacherList = teacherbaseManagerBaseTeacherMapper.selectList(Wrappers.lambdaQuery(BaseTeacher.class).eq(BaseTeacher::getUserId, xjrUser.getId()).select(BaseTeacher::getId));
+            List<BaseTeacher> baseTeacherList = teacherMapper.selectList(Wrappers.lambdaQuery(BaseTeacher.class).eq(BaseTeacher::getUserId, xjrUser.getId()).select(BaseTeacher::getId));
             List<Long> baseTeacherIds = baseTeacherList.stream().map(BaseTeacher::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherOldIds = xjrUser.getBaseTeacherList().stream().map(BaseTeacher::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -373,18 +354,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
 
                 //如果不等于空则修改
                 if (baseTeacher.getId() != null) {
-                    teacherbaseManagerBaseTeacherMapper.updateById(baseTeacher);
+                    teacherMapper.updateById(baseTeacher);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacher.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherMapper.insert(baseTeacher);
+                    teacherMapper.insert(baseTeacher);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherMapper.deleteBatchIds(baseTeacherRemoveIds);
+                teacherMapper.deleteBatchIds(baseTeacherRemoveIds);
             }
         }
         //********************************* BaseTeacher  增删改  结束 *******************************************/
@@ -392,7 +373,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacherContact  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacherContact> baseTeacherContactList = teacherbaseManagerBaseTeacherContactMapper.selectList(Wrappers.lambdaQuery(BaseTeacherContact.class).eq(BaseTeacherContact::getUserId, xjrUser.getId()).select(BaseTeacherContact::getId));
+            List<BaseTeacherContact> baseTeacherContactList = teacherContactMapper.selectList(Wrappers.lambdaQuery(BaseTeacherContact.class).eq(BaseTeacherContact::getUserId, xjrUser.getId()).select(BaseTeacherContact::getId));
             List<Long> baseTeacherContactIds = baseTeacherContactList.stream().map(BaseTeacherContact::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherContactOldIds = xjrUser.getBaseTeacherContactList().stream().map(BaseTeacherContact::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -402,18 +383,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             for (BaseTeacherContact baseTeacherContact : xjrUser.getBaseTeacherContactList()) {
                 //如果不等于空则修改
                 if (baseTeacherContact.getId() != null) {
-                    teacherbaseManagerBaseTeacherContactMapper.updateById(baseTeacherContact);
+                    teacherContactMapper.updateById(baseTeacherContact);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacherContact.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherContactMapper.insert(baseTeacherContact);
+                    teacherContactMapper.insert(baseTeacherContact);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherContactRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherContactMapper.deleteBatchIds(baseTeacherContactRemoveIds);
+                teacherContactMapper.deleteBatchIds(baseTeacherContactRemoveIds);
             }
         }
         //********************************* BaseTeacherContact  增删改  结束 *******************************************/
@@ -421,7 +402,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacherEducation  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacherEducation> baseTeacherEducationList = teacherbaseManagerBaseTeacherEducationMapper.selectList(Wrappers.lambdaQuery(BaseTeacherEducation.class).eq(BaseTeacherEducation::getUserId, xjrUser.getId()).select(BaseTeacherEducation::getId));
+            List<BaseTeacherEducation> baseTeacherEducationList = teacherEducationMapper.selectList(Wrappers.lambdaQuery(BaseTeacherEducation.class).eq(BaseTeacherEducation::getUserId, xjrUser.getId()).select(BaseTeacherEducation::getId));
             List<Long> baseTeacherEducationIds = baseTeacherEducationList.stream().map(BaseTeacherEducation::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherEducationOldIds = xjrUser.getBaseTeacherEducationList().stream().map(BaseTeacherEducation::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -431,18 +412,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             for (BaseTeacherEducation baseTeacherEducation : xjrUser.getBaseTeacherEducationList()) {
                 //如果不等于空则修改
                 if (baseTeacherEducation.getId() != null) {
-                    teacherbaseManagerBaseTeacherEducationMapper.updateById(baseTeacherEducation);
+                    teacherEducationMapper.updateById(baseTeacherEducation);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacherEducation.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherEducationMapper.insert(baseTeacherEducation);
+                    teacherEducationMapper.insert(baseTeacherEducation);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherEducationRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherEducationMapper.deleteBatchIds(baseTeacherEducationRemoveIds);
+                teacherEducationMapper.deleteBatchIds(baseTeacherEducationRemoveIds);
             }
         }
         //********************************* BaseTeacherEducation  增删改  结束 *******************************************/
@@ -450,7 +431,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacherEmploy  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacherEmploy> baseTeacherEmployList = teacherbaseManagerBaseTeacherEmployMapper.selectList(Wrappers.lambdaQuery(BaseTeacherEmploy.class).eq(BaseTeacherEmploy::getUserId, xjrUser.getId()).select(BaseTeacherEmploy::getId));
+            List<BaseTeacherEmploy> baseTeacherEmployList = teacherEmployMapper.selectList(Wrappers.lambdaQuery(BaseTeacherEmploy.class).eq(BaseTeacherEmploy::getUserId, xjrUser.getId()).select(BaseTeacherEmploy::getId));
             List<Long> baseTeacherEmployIds = baseTeacherEmployList.stream().map(BaseTeacherEmploy::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherEmployOldIds = xjrUser.getBaseTeacherEmployList().stream().map(BaseTeacherEmploy::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -460,18 +441,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             for (BaseTeacherEmploy baseTeacherEmploy : xjrUser.getBaseTeacherEmployList()) {
                 //如果不等于空则修改
                 if (baseTeacherEmploy.getId() != null) {
-                    teacherbaseManagerBaseTeacherEmployMapper.updateById(baseTeacherEmploy);
+                    teacherEmployMapper.updateById(baseTeacherEmploy);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacherEmploy.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherEmployMapper.insert(baseTeacherEmploy);
+                    teacherEmployMapper.insert(baseTeacherEmploy);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherEmployRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherEmployMapper.deleteBatchIds(baseTeacherEmployRemoveIds);
+                teacherEmployMapper.deleteBatchIds(baseTeacherEmployRemoveIds);
             }
         }
         //********************************* BaseTeacherEmploy  增删改  结束 *******************************************/
@@ -479,7 +460,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacherFamily  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacherFamily> baseTeacherFamilyList = teacherbaseManagerBaseTeacherFamilyMapper.selectList(Wrappers.lambdaQuery(BaseTeacherFamily.class).eq(BaseTeacherFamily::getUserId, xjrUser.getId()).select(BaseTeacherFamily::getId));
+            List<BaseTeacherFamily> baseTeacherFamilyList = baseTeacherFamilyMapper.selectList(Wrappers.lambdaQuery(BaseTeacherFamily.class).eq(BaseTeacherFamily::getUserId, xjrUser.getId()).select(BaseTeacherFamily::getId));
             List<Long> baseTeacherFamilyIds = baseTeacherFamilyList.stream().map(BaseTeacherFamily::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherFamilyOldIds = xjrUser.getBaseTeacherFamilyList().stream().map(BaseTeacherFamily::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -489,18 +470,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             for (BaseTeacherFamily baseTeacherFamily : xjrUser.getBaseTeacherFamilyList()) {
                 //如果不等于空则修改
                 if (baseTeacherFamily.getId() != null) {
-                    teacherbaseManagerBaseTeacherFamilyMapper.updateById(baseTeacherFamily);
+                    baseTeacherFamilyMapper.updateById(baseTeacherFamily);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacherFamily.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherFamilyMapper.insert(baseTeacherFamily);
+                    baseTeacherFamilyMapper.insert(baseTeacherFamily);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherFamilyRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherFamilyMapper.deleteBatchIds(baseTeacherFamilyRemoveIds);
+                baseTeacherFamilyMapper.deleteBatchIds(baseTeacherFamilyRemoveIds);
             }
         }
         //********************************* BaseTeacherFamily  增删改  结束 *******************************************/
@@ -508,7 +489,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacherFamilyMember  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacherFamilyMember> baseTeacherFamilyMemberList = teacherbaseManagerBaseTeacherFamilyMemberMapper.selectList(Wrappers.lambdaQuery(BaseTeacherFamilyMember.class).eq(BaseTeacherFamilyMember::getUserId, xjrUser.getId()).select(BaseTeacherFamilyMember::getId));
+            List<BaseTeacherFamilyMember> baseTeacherFamilyMemberList = familyMemberMapper.selectList(Wrappers.lambdaQuery(BaseTeacherFamilyMember.class).eq(BaseTeacherFamilyMember::getUserId, xjrUser.getId()).select(BaseTeacherFamilyMember::getId));
             List<Long> baseTeacherFamilyMemberIds = baseTeacherFamilyMemberList.stream().map(BaseTeacherFamilyMember::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherFamilyMemberOldIds = xjrUser.getBaseTeacherFamilyMemberList().stream().map(BaseTeacherFamilyMember::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -518,18 +499,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             for (BaseTeacherFamilyMember baseTeacherFamilyMember : xjrUser.getBaseTeacherFamilyMemberList()) {
                 //如果不等于空则修改
                 if (baseTeacherFamilyMember.getId() != null) {
-                    teacherbaseManagerBaseTeacherFamilyMemberMapper.updateById(baseTeacherFamilyMember);
+                    familyMemberMapper.updateById(baseTeacherFamilyMember);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacherFamilyMember.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherFamilyMemberMapper.insert(baseTeacherFamilyMember);
+                    familyMemberMapper.insert(baseTeacherFamilyMember);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherFamilyMemberRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherFamilyMemberMapper.deleteBatchIds(baseTeacherFamilyMemberRemoveIds);
+                familyMemberMapper.deleteBatchIds(baseTeacherFamilyMemberRemoveIds);
             }
         }
         //********************************* BaseTeacherFamilyMember  增删改  结束 *******************************************/
@@ -537,7 +518,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         //********************************* BaseTeacherRegular  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseTeacherRegular> baseTeacherRegularList = teacherbaseManagerBaseTeacherRegularMapper.selectList(Wrappers.lambdaQuery(BaseTeacherRegular.class).eq(BaseTeacherRegular::getUserId, xjrUser.getId()).select(BaseTeacherRegular::getId));
+            List<BaseTeacherRegular> baseTeacherRegularList = teacherRegularMapper.selectList(Wrappers.lambdaQuery(BaseTeacherRegular.class).eq(BaseTeacherRegular::getUserId, xjrUser.getId()).select(BaseTeacherRegular::getId));
             List<Long> baseTeacherRegularIds = baseTeacherRegularList.stream().map(BaseTeacherRegular::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseTeacherRegularOldIds = xjrUser.getBaseTeacherRegularList().stream().map(BaseTeacherRegular::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -547,18 +528,18 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             for (BaseTeacherRegular baseTeacherRegular : xjrUser.getBaseTeacherRegularList()) {
                 //如果不等于空则修改
                 if (baseTeacherRegular.getId() != null) {
-                    teacherbaseManagerBaseTeacherRegularMapper.updateById(baseTeacherRegular);
+                    teacherRegularMapper.updateById(baseTeacherRegular);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseTeacherRegular.setUserId(xjrUser.getId());
-                    teacherbaseManagerBaseTeacherRegularMapper.insert(baseTeacherRegular);
+                    teacherRegularMapper.insert(baseTeacherRegular);
                 }
             }
             //已经不存在的id 删除
             if (baseTeacherRegularRemoveIds.size() > 0) {
-                teacherbaseManagerBaseTeacherRegularMapper.deleteBatchIds(baseTeacherRegularRemoveIds);
+                teacherRegularMapper.deleteBatchIds(baseTeacherRegularRemoveIds);
             }
         }
         //********************************* BaseTeacherRegular  增删改  结束 *******************************************/
@@ -570,13 +551,13 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
     @Transactional(rollbackFor = Exception.class)
     public Boolean delete(List<Long> ids) {
         teacherbaseManagerXjrUserMapper.deleteBatchIds(ids);
-        teacherbaseManagerBaseTeacherMapper.delete(Wrappers.lambdaQuery(BaseTeacher.class).in(BaseTeacher::getUserId, ids));
-        teacherbaseManagerBaseTeacherContactMapper.delete(Wrappers.lambdaQuery(BaseTeacherContact.class).in(BaseTeacherContact::getUserId, ids));
-        teacherbaseManagerBaseTeacherEducationMapper.delete(Wrappers.lambdaQuery(BaseTeacherEducation.class).in(BaseTeacherEducation::getUserId, ids));
-        teacherbaseManagerBaseTeacherEmployMapper.delete(Wrappers.lambdaQuery(BaseTeacherEmploy.class).in(BaseTeacherEmploy::getUserId, ids));
-        teacherbaseManagerBaseTeacherFamilyMapper.delete(Wrappers.lambdaQuery(BaseTeacherFamily.class).in(BaseTeacherFamily::getUserId, ids));
-        teacherbaseManagerBaseTeacherFamilyMemberMapper.delete(Wrappers.lambdaQuery(BaseTeacherFamilyMember.class).in(BaseTeacherFamilyMember::getUserId, ids));
-        teacherbaseManagerBaseTeacherRegularMapper.delete(Wrappers.lambdaQuery(BaseTeacherRegular.class).in(BaseTeacherRegular::getUserId, ids));
+        teacherMapper.delete(Wrappers.lambdaQuery(BaseTeacher.class).in(BaseTeacher::getUserId, ids));
+        teacherContactMapper.delete(Wrappers.lambdaQuery(BaseTeacherContact.class).in(BaseTeacherContact::getUserId, ids));
+        teacherEducationMapper.delete(Wrappers.lambdaQuery(BaseTeacherEducation.class).in(BaseTeacherEducation::getUserId, ids));
+        teacherEmployMapper.delete(Wrappers.lambdaQuery(BaseTeacherEmploy.class).in(BaseTeacherEmploy::getUserId, ids));
+        baseTeacherFamilyMapper.delete(Wrappers.lambdaQuery(BaseTeacherFamily.class).in(BaseTeacherFamily::getUserId, ids));
+        familyMemberMapper.delete(Wrappers.lambdaQuery(BaseTeacherFamilyMember.class).in(BaseTeacherFamilyMember::getUserId, ids));
+        teacherRegularMapper.delete(Wrappers.lambdaQuery(BaseTeacherRegular.class).in(BaseTeacherRegular::getUserId, ids));
 
         return true;
     }
@@ -591,16 +572,16 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean importData(List<Map<Integer, Object>> excelDataList) {
+    public Boolean importData(List<Map<Integer, Object>> excelDataList) throws ParseException {
         List<User> userList = userService.list(
                 new MPJLambdaWrapper<User>()
                         .select(User::getId)
                         .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
                         .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
         );
-        Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getUserName, x -> x));
+        Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getCredentialNumber, x -> x));
 
-        List<BaseTeacher> teacherList = teacherbaseManagerBaseTeacherMapper.selectJoinList(BaseTeacher.class,
+        List<BaseTeacher> teacherList = teacherMapper.selectJoinList(BaseTeacher.class,
                 new MPJLambdaWrapper<BaseTeacher>()
                         .select(BaseTeacher::getId)
                         .select(BaseTeacher.class, x -> VoToColumnUtil.fieldsToColumns(BaseTeacher.class).contains(x.getProperty()))
@@ -611,6 +592,8 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         List<Long> itemList = new ArrayList<>();
         itemList.add(2023000000000000016L);
         itemList.add(2023000000000000006L);
+        itemList.add(2023000000000000005L);
+        itemList.add(2023000000000000020L);
 
         List<DictionaryDetail> dictionaryList = dictionaryService.list(
                 new QueryWrapper<DictionaryDetail>().lambda()
@@ -648,18 +631,30 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                         .innerJoin(User.class, User::getId, UserDeptRelation::getUserId)
                         .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
         );
-        Map<Long, List<Long>> userDeptMap = postRelations.stream()
-                .collect(Collectors.groupingBy(UserPostRelation::getUserId, Collectors.mapping(UserPostRelation::getPostId, Collectors.toList())));
+        Map<Long, List<Long>> userDeptMap = deptRelations.stream()
+                .collect(Collectors.groupingBy(UserDeptRelation::getUserId, Collectors.mapping(UserDeptRelation::getDeptId, Collectors.toList())));
+
+        List<BaseTeacherRegular> regularList = teacherRegularMapper.selectList(
+                new MPJLambdaWrapper<BaseTeacherRegular>()
+                        .select(BaseTeacherRegular::getId)
+                        .select(BaseTeacherRegular.class, x -> VoToColumnUtil.fieldsToColumns(BaseTeacherRegular.class).contains(x.getProperty()))
+                        .innerJoin(User.class, User::getId, BaseTeacherRegular::getUserId)
+        );
+        Map<Long, BaseTeacherRegular> regularMap = regularList.stream()
+                .collect(Collectors.toMap(BaseTeacherRegular::getUserId, x -> x));
 
         List<User> updateUserList = new ArrayList<>();
         List<BaseTeacher> updateTeacherList = new ArrayList<>();
         List<UserDeptRelation> updateDeptList = new ArrayList<>();
         List<UserPostRelation> updatePostList = new ArrayList<>();
+        List<BaseTeacherRegular> updateBaseTeacherRegularList = new ArrayList<>();
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
         for (Map<Integer, Object> rowData : excelDataList) {
-            String jobCode = rowData.get(0).toString();
-            if (userMap.containsKey(jobCode)) {
-                User user = userMap.get(jobCode);
+            String credentialNumber = rowData.get(4).toString();
+            if (userMap.containsKey(credentialNumber)) {
+                User user = userMap.get(credentialNumber);
                 user.setName(rowData.get(1).toString());
                 user.setGender(GenderDictionaryEnum.getCode(rowData.get(2).toString()));
                 user.setCredentialType(dictionaryMap.get(rowData.get(3).toString()));
@@ -669,8 +664,24 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
 
                 BaseTeacher teacher = teacherMap.get(user.getId());
                 teacher.setEmployType(dictionaryMap.get(rowData.get(6).toString()));
+                if(rowData.get(9) != null && StrUtil.isNotEmpty(rowData.get(9).toString())){
+                    teacher.setJobState(dictionaryMap.get(rowData.get(9).toString()));
+                }
+                if(rowData.get(10) != null && StrUtil.isNotEmpty(rowData.get(10).toString())){
+                    teacher.setJoinTime(sdf.parse(rowData.get(10).toString()));
+                }
+
                 updateTeacherList.add(teacher);
 
+                if(rowData.get(11) != null && StrUtil.isNotEmpty(rowData.get(11).toString())){
+                    BaseTeacherRegular teacherRegular = regularMap.get(user.getId());
+                    JSONArray teachingStatus = teacherRegular.getTeachingStatus();
+                    teachingStatus.add(dictionaryMap.get(rowData.get(11).toString()));
+                    teacherRegular.setTeachingStatus(teachingStatus);
+                    updateBaseTeacherRegularList.add(teacherRegular);
+                }
+
+
                 List<Long> deptIds = userDeptMap.get(user.getId());
                 if (deptIds == null || !deptIds.contains(departmentMap.get(rowData.get(7).toString()))) {
                     UserDeptRelation userDeptRelation = new UserDeptRelation();
@@ -705,7 +716,28 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             teacher.setEmployType(dictionaryMap.get(rowData.get(6).toString()));
             teacher.setUserId(user.getId());
             teacher.setCreateDate(LocalDateTime.now());
-            teacherbaseManagerBaseTeacherMapper.insert(teacher);
+            if(rowData.get(9) != null && StrUtil.isNotEmpty(rowData.get(9).toString())){
+                teacher.setJobState(dictionaryMap.get(rowData.get(9).toString()));
+            }
+
+            if(rowData.get(10) != null && StrUtil.isNotEmpty(rowData.get(10).toString())){
+                teacher.setJoinTime(sdf.parse(rowData.get(10).toString()));
+            }
+
+            teacherMapper.insert(teacher);
+
+            if(rowData.get(11) != null && StrUtil.isNotEmpty(rowData.get(11).toString())){
+                BaseTeacherRegular teacherRegular = new BaseTeacherRegular();
+                JSONArray teachingStatus = new JSONArray();
+                teachingStatus.add(dictionaryMap.get(rowData.get(11).toString()));
+                teacherRegular.setTeachingStatus(teachingStatus);
+                teacherRegular.setCreateDate(LocalDateTime.now());
+                teacherRegular.setCreateUserId(StpUtil.getLoginIdAsLong());
+                teacherRegular.setUserId(user.getId());
+                teacherRegular.setDeleteMark(DeleteMark.NODELETE.getCode());
+                teacherRegular.setEnabledMark(EnabledMark.ENABLED.getCode());
+                teacherRegularMapper.insert(teacherRegular);
+            }
 
             UserDeptRelation userDeptRelation = new UserDeptRelation();
             userDeptRelation.setDeptId(departmentMap.get(rowData.get(7).toString()));
@@ -736,7 +768,13 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         }
         if (!updateTeacherList.isEmpty()) {
             for (BaseTeacher teacher : updateTeacherList) {
-                teacherbaseManagerBaseTeacherMapper.updateById(teacher);
+                teacherMapper.updateById(teacher);
+            }
+        }
+
+        if (!updateBaseTeacherRegularList.isEmpty()) {
+            for (BaseTeacherRegular teacherRegular : updateBaseTeacherRegularList) {
+                teacherRegularMapper.updateById(teacherRegular);
             }
         }
 
@@ -758,11 +796,11 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void changeIsNormal(String jobState, Integer isNormal) {
-        List<BaseTeacher> baseTeacherList = teacherbaseManagerBaseTeacherMapper.selectList(Wrappers.lambdaQuery(BaseTeacher.class)
+        List<BaseTeacher> baseTeacherList = teacherMapper.selectList(Wrappers.lambdaQuery(BaseTeacher.class)
                 .eq(BaseTeacher::getJobState, jobState));
         for (BaseTeacher baseTeacher : baseTeacherList) {
             baseTeacher.setIsNormal(isNormal);
-            teacherbaseManagerBaseTeacherMapper.updateById(baseTeacher);
+            teacherMapper.updateById(baseTeacher);
         }
 
     }
@@ -785,7 +823,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                 && HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
         ) {
             XjrUser old = this.getByIdDeep(wfTextbookRecede.getApplicantUserId());
-            if(ObjectUtils.isEmpty(old)){
+            if (ObjectUtils.isEmpty(old)) {
                 throw new MyException("教职工信息不存在");
             }
 
@@ -793,11 +831,11 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             // 更新教职工在职状态
             List<BaseTeacher> baseTeacherList = old.getBaseTeacherList();
             BaseTeacher updateBaseTeacher;
-            for (BaseTeacher baseTeacher : baseTeacherList){
+            for (BaseTeacher baseTeacher : baseTeacherList) {
                 updateBaseTeacher = new BaseTeacher();
                 updateBaseTeacher.setId(baseTeacher.getId());
                 updateBaseTeacher.setJobState("JOB_LZ");
-                baseTeacherMapper.updateById(updateBaseTeacher);
+                teacherMapper.updateById(updateBaseTeacher);
             }
 
             // 处理变更记录
@@ -878,4 +916,814 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         );
         dataUtil.deleteCar(carList);
     }
+
+    @Override
+    public List<XjrUserPageVo> getList(BaseTeacherPageDto dto) {
+        return teacherMapper.getList(dto);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String professionalTitle(MultipartFile file) throws IOException, IllegalAccessException {
+        // 读取 Excel 数据
+        List<ProfessionalTitleImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(ProfessionalTitleImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        // 获取现有职称数据
+        List<ProfessionalTitle> oldList = professionalTitleMapper.selectList(
+                Wrappers.lambdaQuery(ProfessionalTitle.class)
+                        .eq(ProfessionalTitle::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, ProfessionalTitle>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                ProfessionalTitle::getUserId,
+                ProfessionalTitle::getProfessionalTitleNo
+        );
+
+        // 新增和更新列表
+        List<ProfessionalTitle> inserts = new ArrayList<>();
+        List<ProfessionalTitle> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            ProfessionalTitleImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            // 查找对应的教职工
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 转换在职状态
+            String jobStatus = StringUtils.isNotEmpty(vo.getJobStatus()) && "是".equals(vo.getJobStatus()) ? "1" : "0";
+
+            // 判断是否需要新增或更新
+            Map<String, ProfessionalTitle> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            ProfessionalTitle existing = existingMap.get(vo.getProfessionalTitleNo());
+
+            ProfessionalTitle insertOrUpdate = new ProfessionalTitle();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+            insertOrUpdate.setJobStatus(jobStatus);
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (ProfessionalTitle insert : inserts) {
+                professionalTitleMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (ProfessionalTitle update : updates) {
+                professionalTitleMapper.updateById(update);
+            }
+        }
+
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String teacherCertification(MultipartFile file) throws IOException, IllegalAccessException {
+        List<TeacherCertificationImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(TeacherCertificationImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<TeacherCertification> oldList = teacherCertificationMapper.selectList(Wrappers.lambdaQuery(TeacherCertification.class)
+                .eq(TeacherCertification::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, TeacherCertification>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                TeacherCertification::getUserId,
+                TeacherCertification::getCertificationNo
+        );
+
+        List<TeacherCertification> inserts = new ArrayList<>();
+        List<TeacherCertification> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            TeacherCertificationImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, TeacherCertification> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            TeacherCertification existing = existingMap.get(vo.getCertificationNo());
+
+            TeacherCertification insertOrUpdate = new TeacherCertification();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (TeacherCertification insert : inserts) {
+                teacherCertificationMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (TeacherCertification update : updates) {
+                teacherCertificationMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String evaluatorInformation(MultipartFile file) throws IOException, IllegalAccessException {
+        List<EvaluatorInformationImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(EvaluatorInformationImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<EvaluatorInformation> oldList = evaluatorInformationMapper.selectList(Wrappers.lambdaQuery(EvaluatorInformation.class)
+                .eq(EvaluatorInformation::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, EvaluatorInformation>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                EvaluatorInformation::getUserId,
+                EvaluatorInformation::getCertificationNo
+        );
+
+        List<EvaluatorInformation> inserts = new ArrayList<>();
+        List<EvaluatorInformation> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            EvaluatorInformationImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, EvaluatorInformation> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            EvaluatorInformation existing = existingMap.get(vo.getCertificationNo());
+
+            EvaluatorInformation insertOrUpdate = new EvaluatorInformation();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (EvaluatorInformation insert : inserts) {
+                evaluatorInformationMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (EvaluatorInformation update : updates) {
+                evaluatorInformationMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String languageCompetence(MultipartFile file) throws IOException, IllegalAccessException {
+        List<LanguageCompetenceImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(EvaluatorInformationImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<LanguageCompetence> oldList = languageCompetenceMapper.selectList(Wrappers.lambdaQuery(LanguageCompetence.class)
+                .eq(LanguageCompetence::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, LanguageCompetence>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                LanguageCompetence::getUserId,
+                LanguageCompetence::getCertificationNo
+        );
+
+        List<LanguageCompetence> inserts = new ArrayList<>();
+        List<LanguageCompetence> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            LanguageCompetenceImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, LanguageCompetence> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            LanguageCompetence existing = existingMap.get(vo.getCertificationNo());
+
+            LanguageCompetence insertOrUpdate = new LanguageCompetence();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (LanguageCompetence insert : inserts) {
+                languageCompetenceMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (LanguageCompetence update : updates) {
+                languageCompetenceMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String facultyContract(MultipartFile file) throws IOException, IllegalAccessException {
+        List<FacultyContractImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(FacultyContractImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<FacultyContract> oldList = facultyContractMapper.selectList(Wrappers.lambdaQuery(FacultyContract.class)
+                .eq(FacultyContract::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<LocalDate, FacultyContract>> mapByUserIdThenNo = oldList.stream()
+                .collect(Collectors.groupingBy(
+                        FacultyContract::getUserId,
+                        Collectors.toMap(
+                                FacultyContract::getStartDate,
+                                record -> record,
+                                (existing, replacement) -> existing // 如果有重复键,保留第一个值
+                        )
+                ));
+
+        List<FacultyContract> inserts = new ArrayList<>();
+        List<FacultyContract> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            FacultyContractImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<LocalDate, FacultyContract> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            FacultyContract existing = existingMap.get(vo.getStartDate());
+
+            FacultyContract insertOrUpdate = new FacultyContract();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (FacultyContract insert : inserts) {
+                facultyContractMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (FacultyContract update : updates) {
+                facultyContractMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String outsideAssociations(MultipartFile file) throws IOException, IllegalAccessException {
+        List<OutsideAssociationsImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(OutsideAssociationsImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<OutsideAssociations> oldList = outsideAssociationsMapper.selectList(Wrappers.lambdaQuery(OutsideAssociations.class)
+                .eq(OutsideAssociations::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, OutsideAssociations>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                OutsideAssociations::getUserId,
+                OutsideAssociations::getName
+        );
+
+        List<OutsideAssociations> inserts = new ArrayList<>();
+        List<OutsideAssociations> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            OutsideAssociationsImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, OutsideAssociations> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            OutsideAssociations existing = existingMap.get(vo.getName());
+
+            OutsideAssociations insertOrUpdate = new OutsideAssociations();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (OutsideAssociations insert : inserts) {
+                outsideAssociationsMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (OutsideAssociations update : updates) {
+                outsideAssociationsMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String coreTeacher(MultipartFile file) throws IOException, IllegalAccessException {
+        List<CoreTeacherImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(CoreTeacherImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<CoreTeacher> oldList = coreTeacherMapper.selectList(Wrappers.lambdaQuery(CoreTeacher.class)
+                .eq(CoreTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, CoreTeacher>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                CoreTeacher::getUserId,
+                CoreTeacher::getCertificationNo
+        );
+
+        List<CoreTeacher> inserts = new ArrayList<>();
+        List<CoreTeacher> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            CoreTeacherImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, CoreTeacher> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            CoreTeacher existing = existingMap.get(vo.getCertificationNo());
+
+            CoreTeacher insertOrUpdate = new CoreTeacher();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (CoreTeacher insert : inserts) {
+                coreTeacherMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (CoreTeacher update : updates) {
+                coreTeacherMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String scientificResearch(MultipartFile file) throws IOException, IllegalAccessException {
+        List<ScientificResearchImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(ScientificResearchImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<ScientificResearch> oldList = scientificResearchMapper.selectList(Wrappers.lambdaQuery(ScientificResearch.class)
+                .eq(ScientificResearch::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, ScientificResearch>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                ScientificResearch::getUserId,
+                ScientificResearch::getName
+        );
+
+        List<ScientificResearch> inserts = new ArrayList<>();
+        List<ScientificResearch> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            ScientificResearchImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            XjrUser user = mapByUsernameAndName.get(vo.getUserName() + "&" + vo.getUserIdCn());
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, ScientificResearch> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            ScientificResearch existing = existingMap.get(vo.getName());
+
+            ScientificResearch insertOrUpdate = new ScientificResearch();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (ScientificResearch insert : inserts) {
+                scientificResearchMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (ScientificResearch update : updates) {
+                scientificResearchMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String jobInformation(MultipartFile file) throws IOException, IllegalAccessException {
+        List<JobInformationImportVo> excelDataList = EasyExcel.read(file.getInputStream())
+                .headRowNumber(1)
+                .head(JobInformationImportVo.class)
+                .sheet()
+                .doReadSync();
+
+        StringBuilder sb = new StringBuilder();
+
+        Map<String, XjrUser> mapByUsernameAndName = getUserMap();
+
+        if (MapUtils.isEmpty(mapByUsernameAndName)) {
+            sb.append("系统教职工数据有误,请联系管理员");
+            return sb.toString();
+        }
+
+        List<JobInformation> oldList = jobInformationMapper.selectList(Wrappers.lambdaQuery(JobInformation.class)
+                .eq(JobInformation::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        // 分组处理现有数据
+        Map<Long, Map<String, JobInformation>> mapByUserIdThenNo = groupByUserIdAndKey(
+                oldList,
+                JobInformation::getUserId,
+                JobInformation::getJobName
+        );
+
+        List<JobInformation> inserts = new ArrayList<>();
+        List<JobInformation> updates = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            JobInformationImportVo vo = excelDataList.get(i);
+
+            // 检查必填字段是否为空
+            if (isRequiredFieldsFilled(vo, sb, i + 2)) {
+                return sb.toString();
+            }
+
+            String key = vo.getUserName() + "&" + vo.getUserIdCn();
+            XjrUser user = mapByUsernameAndName.get(key);
+
+            if (user == null) {
+                sb.append("第").append(i + 2).append("行工号和姓名对应的教职工不存在,请核实");
+                return sb.toString();
+            }
+
+            // 判断是否需要新增或更新
+            Map<String, JobInformation> existingMap = mapByUserIdThenNo.getOrDefault(user.getId(), Collections.emptyMap());
+            JobInformation existing = existingMap.get(vo.getJobName());
+
+            JobInformation insertOrUpdate = new JobInformation();
+            BeanUtils.copyProperties(vo, insertOrUpdate);
+            insertOrUpdate.setUserId(user.getId());
+            insertOrUpdate.setDeptId(user.getCode());
+
+            if (existing != null) {
+                // 更新已有记录
+                insertOrUpdate.setId(existing.getId());
+                insertOrUpdate.setModifyDate(LocalDateTime.now());
+                insertOrUpdate.setModifyUserId(StpUtil.getLoginIdAsLong());
+                updates.add(insertOrUpdate);
+            } else {
+                // 新增记录
+                insertOrUpdate.setCreateDate(LocalDateTime.now());
+                insertOrUpdate.setCreateUserId(StpUtil.getLoginIdAsLong());
+                inserts.add(insertOrUpdate);
+            }
+        }
+
+        //批量新增
+        if (!inserts.isEmpty()) {
+            for (JobInformation insert : inserts) {
+                jobInformationMapper.insert(insert);
+            }
+        }
+        if (!updates.isEmpty()) {
+            for (JobInformation update : updates) {
+                jobInformationMapper.updateById(update);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 获取教职工数据并映射为 Map
+     */
+    private Map<String, XjrUser> getUserMap() {
+        // 获取所有教职工数据
+        MPJLambdaWrapper<XjrUser> userQueryWrapper = new MPJLambdaWrapper<>();
+        userQueryWrapper
+                .select(XjrUser::getId, XjrUser::getUserName, XjrUser::getName)
+                .select(" (SELECT GROUP_CONCAT(a.name) FROM xjr_department a" +
+                        " INNER JOIN xjr_user_dept_relation b ON a.id = b.dept_id" +
+                        " WHERE a.delete_mark = 0 AND b.user_id = t.id) as code")
+                .innerJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+                .eq(UserRoleRelation::getRoleId, 2);
+
+        List<XjrUser> xjrUsers = this.selectJoinList(XjrUser.class, userQueryWrapper);
+
+        // 如果有重复键,保留第一个值
+        return xjrUsers.stream()
+                .collect(Collectors.toMap(
+                        u -> u.getUserName() + "&" + u.getName(),
+                        u -> u,
+                        (u1, u2) -> u1 // 如果有重复键,保留第一个值
+                ));
+    }
+
+    /**
+     * 分组现有记录
+     */
+    private <T> Map<Long, Map<String, T>> groupByUserIdAndKey(
+            List<T> records,
+            Function<T, Long> userIdGetter,
+            Function<T, String> keyGetter
+    ) {
+        return records.stream()
+                .collect(Collectors.groupingBy(
+                        userIdGetter,
+                        Collectors.toMap(
+                                keyGetter,
+                                record -> record,
+                                (existing, replacement) -> existing // 如果有重复键,保留第一个值
+                        )
+                ));
+    }
 }

+ 89 - 0
src/main/java/com/xjrsoft/module/teacher/vo/CoreTeacherImportVo.java

@@ -0,0 +1,89 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 骨干教师记录分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class CoreTeacherImportVo {
+
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 级别
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("级别")
+    @ApiModelProperty("级别")
+    @Required
+    private String level;
+    /**
+    * 任教学科
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("任教学科")
+    @ApiModelProperty("任教学科")
+    @Required
+    private String subjectCategory;
+    /**
+    * 证书编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书编号")
+    @ApiModelProperty("证书编号")
+    @Required
+    private String certificationNo;
+    /**
+    * 专业部
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("专业部")
+    @ApiModelProperty("专业部")
+    private String specialtyDept;
+    /**
+    * 文号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("文号")
+    @ApiModelProperty("文号")
+    private String referenceNumber;
+    /**
+    * 认证时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("认证时间")
+    @ApiModelProperty("认证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 备注
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("备注")
+    @ApiModelProperty("备注")
+    private String remark;
+}

+ 88 - 0
src/main/java/com/xjrsoft/module/teacher/vo/EvaluatorInformationImportVo.java

@@ -0,0 +1,88 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 考评员信息分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class EvaluatorInformationImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 证书名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书名称")
+    @ApiModelProperty("证书名称")
+    @Required
+    private String name;
+    /**
+    * 证书编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书编号")
+    @ApiModelProperty("证书编号")
+    @Required
+    private String certificationNo;
+    /**
+    * 任教学科
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("任教学科")
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 级别
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("级别")
+    @ApiModelProperty("级别")
+    private String level;
+    /**
+    * 发证机构
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证机构")
+    @ApiModelProperty("发证机构")
+    private String certifyingAuthority;
+    /**
+    * 发证时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证时间")
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 有效期
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("有效期")
+    @ApiModelProperty("有效期")
+    private LocalDate validity;
+
+}

+ 60 - 0
src/main/java/com/xjrsoft/module/teacher/vo/FacultyContractImportVo.java

@@ -0,0 +1,60 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 教职工合同记录分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class FacultyContractImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 起始日期
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("起始日期")
+    @ApiModelProperty("起始日期")
+    @Required
+    private LocalDate startDate;
+    /**
+    * 结束日期
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("结束日期")
+    @ApiModelProperty("结束日期")
+    @Required
+    private LocalDate endDate;
+    /**
+    * 合同岗位
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("合同岗位")
+    @ApiModelProperty("合同岗位")
+    private String contractPosition;
+
+}

+ 94 - 0
src/main/java/com/xjrsoft/module/teacher/vo/JobInformationImportVo.java

@@ -0,0 +1,94 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 岗位信息记录分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class JobInformationImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 岗位类型
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("岗位类型")
+    @ApiModelProperty("岗位类型")
+    private String jobCategory;
+    /**
+    * 岗位名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("岗位名称")
+    @ApiModelProperty("岗位名称")
+    @Required
+    private String jobName;
+    /**
+    * 聘用时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("聘用时间")
+    @ApiModelProperty("聘用时间")
+    private LocalDate employDate;
+    /**
+    * 聘用文号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("聘用文号")
+    @ApiModelProperty("聘用文号")
+    private String employNo;
+    /**
+    * 是否领导岗位
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否领导岗位")
+    @ApiModelProperty("是否领导岗位")
+    private String leaderStatus;
+    /**
+    * 行政岗位部门
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("行政岗位部门")
+    @ApiModelProperty("行政岗位部门")
+    private String jobDept;
+    /**
+    * 兼课学院
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("兼课学院")
+    @ApiModelProperty("兼课学院")
+    private String concurrentCollege;
+    /**
+    * 备注
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("备注")
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 82 - 0
src/main/java/com/xjrsoft/module/teacher/vo/LanguageCompetenceImportVo.java

@@ -0,0 +1,82 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 语言能力信息分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class LanguageCompetenceImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 语言种类
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("语言种类")
+    @ApiModelProperty("语言种类")
+    @Required
+    private String name;
+    /**
+    * 等级
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("等级")
+    @ApiModelProperty("等级")
+    @Required
+    private String level;
+    /**
+    * 证书编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书编号")
+    @ApiModelProperty("证书编号")
+    @Required
+    private String certificationNo;
+    /**
+    * 测试机构
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("测试机构")
+    @ApiModelProperty("测试机构")
+    private String examAuthority;
+    /**
+    * 发证单位
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证单位")
+    @ApiModelProperty("发证单位")
+    private String issuanceUnit;
+    /**
+    * 发证时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证时间")
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+
+}

+ 73 - 0
src/main/java/com/xjrsoft/module/teacher/vo/OutsideAssociationsImportVo.java

@@ -0,0 +1,73 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 校外其他协会记录分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class OutsideAssociationsImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 协会名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("协会名称")
+    @ApiModelProperty("协会名称")
+    @Required
+    private String name;
+    /**
+    * 加入时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("加入时间")
+    @ApiModelProperty("加入时间")
+    @Required
+    private LocalDate joinDate;
+    /**
+    * 退出时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("退出时间")
+    @ApiModelProperty("退出时间")
+    private LocalDate exitDate;
+    /**
+    * 职务
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("职务")
+    @ApiModelProperty("职务")
+    private String duty;
+    /**
+    * 说明
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("说明")
+    @ApiModelProperty("说明")
+    private String remark;
+}

+ 115 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ProfessionalTitleImportVo.java

@@ -0,0 +1,115 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 教职工职称信息分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class ProfessionalTitleImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+    * 工号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 职称名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("职称名称")
+    @ApiModelProperty("职称名称")
+    @Required
+    private String name;
+    /**
+    * 证书编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书编号")
+    @ApiModelProperty("证书编号")
+    @Required
+    private String professionalTitleNo;
+    /**
+    * 取得时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("取得时间")
+    @ApiModelProperty("取得时间")
+    private LocalDate getDate;
+    /**
+    * 学科类别
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学科类别")
+    @ApiModelProperty("学科类别")
+    private String subjectCategory;
+    /**
+    * 授予时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("授予时间")
+    @ApiModelProperty("授予时间")
+    private LocalDate beHonoredDate;
+    /**
+    * 发证时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证时间")
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 任职资格开始时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("任职资格开始时间")
+    @ApiModelProperty("任职资格开始时间")
+    private LocalDate qualificationStartDate;
+    /**
+    * 任职资格结束时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("任职资格结束时间")
+    @ApiModelProperty("任职资格结束时间")
+    private LocalDate qualificationEndDate;
+    /**
+    * 发文时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发文时间")
+    @ApiModelProperty("发文时间")
+    private LocalDate noticeDate;
+    /**
+    * 职称类别
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("职称类别")
+    @ApiModelProperty("职称类别")
+    private String professionalTitleCategory;
+    /**
+    * 是否现任(0:否;1:是)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否现任(否/是)")
+    @ApiModelProperty("是否现任(否/是)")
+    private String jobStatus;
+}

+ 86 - 0
src/main/java/com/xjrsoft/module/teacher/vo/ScientificResearchImportVo.java

@@ -0,0 +1,86 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 科研信息记录分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class ScientificResearchImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 科研名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("科研名称")
+    @ApiModelProperty("科研名称")
+    @Required
+    private String name;
+    /**
+    * 科研编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("科研编号")
+    @ApiModelProperty("科研编号")
+    private String scientificNo;
+    /**
+    * 任教学科
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("任教学科")
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 等级
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("等级")
+    @ApiModelProperty("等级")
+    private String level;
+    /**
+    * 发证机构
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证机构")
+    @ApiModelProperty("发证机构")
+    private String certifyingAuthority;
+    /**
+    * 发证时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证时间")
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+    /**
+    * 备注
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("备注")
+    @ApiModelProperty("备注")
+    private String remark;
+}

+ 81 - 0
src/main/java/com/xjrsoft/module/teacher/vo/TeacherCertificationImportVo.java

@@ -0,0 +1,81 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+* @title: 教师资格证信息分页列表出参
+* @Author szs
+* @Date: 2025-04-24
+* @Version 1.0
+*/
+@Data
+public class TeacherCertificationImportVo {
+    /**
+     * 教职工姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教师")
+    @ApiModelProperty("教师")
+    @Required
+    private String userIdCn;
+    /**
+     * 工号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    @Required
+    private String userName;
+    /**
+    * 证书名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书名称")
+    @ApiModelProperty("证书名称")
+    @Required
+    private String name;
+    /**
+    * 证书编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书编号")
+    @ApiModelProperty("证书编号")
+    @Required
+    private String certificationNo;
+    /**
+    * 任教学科
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("任教学科")
+    @ApiModelProperty("任教学科")
+    private String subjectCategory;
+    /**
+    * 资格种类
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("资格种类")
+    @ApiModelProperty("资格种类")
+    private String category;
+    /**
+    * 发证机构
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证机构")
+    @ApiModelProperty("发证机构")
+    private String certifyingAuthority;
+    /**
+    * 发证时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证时间")
+    @ApiModelProperty("发证时间")
+    private LocalDate issuanceDate;
+
+}

+ 24 - 3
src/main/java/com/xjrsoft/module/textbook/controller/TextbookStudentClaimController.java

@@ -4,12 +4,17 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.CourseSubjectDetail;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.textbook.dto.*;
+import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.entity.TextbookStudentClaim;
 import com.xjrsoft.module.textbook.service.ITextbookStudentClaimService;
 import com.xjrsoft.module.textbook.vo.*;
@@ -56,14 +61,30 @@ public class TextbookStudentClaimController {
     @SaCheckPermission("textbookstudentclaim:detail")
     @XjrLog(value = "学生确认教材领取记录列表(分页)")
     public RT<PageOutput<TextbookStudentClaimPageVo>> page(@Valid TextbookStudentClaimPageDto dto) {
-        LambdaQueryWrapper<TextbookStudentClaim> queryWrapper = new LambdaQueryWrapper<>();
+        MPJLambdaWrapper<TextbookStudentClaim> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
-                .orderByDesc(TextbookStudentClaim::getId)
+                .disableSubLogicDel()
+                .select(TextbookStudentClaim::getId)
                 .select(TextbookStudentClaim.class, x -> VoToColumnUtil.fieldsToColumns(TextbookStudentClaimPageVo.class).contains(x.getProperty()))
+                .innerJoin(Textbook.class, Textbook::getId, TextbookStudentClaim::getTextbookId,
+                        wrapper -> wrapper
+                                .selectAs(Textbook::getBookName, TextbookStudentClaimPageVo::getBookName)
+                                .selectAs(Textbook::getPublishingHouse, TextbookStudentClaimPageVo::getPublishingHouse)
+                                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                                        wrap -> wrap
+                                                .selectAs(BaseCourseSubject::getName, TextbookStudentClaimPageVo::getCourseSubjectIdCn)
+                                        )
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+                                        wrap -> wrap
+                                                .selectAs(DictionaryDetail::getName, TextbookStudentClaimPageVo::getTextbookTypeCn)
+                                )
+                        )
+                .eq(dto.getBaseSemesterId() != null, TextbookStudentClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(dto.getStudentUserId() != null, TextbookStudentClaim::getStudentUserId, dto.getStudentUserId())
                 .eq(TextbookStudentClaim::getIsClaim, 1)
+                .orderByDesc(TextbookStudentClaim::getId)
         ;
-        IPage<TextbookStudentClaim> page = textbookStudentClaimService.page(ConventPage.getPage(dto), queryWrapper);
+        IPage<TextbookStudentClaimPageVo> page = textbookStudentClaimService.selectJoinListPage(ConventPage.getPage(dto), TextbookStudentClaimPageVo.class, queryWrapper);
         PageOutput<TextbookStudentClaimPageVo> pageOutput = ConventPage.getPageOutput(page, TextbookStudentClaimPageVo.class);
         return RT.ok(pageOutput);
     }

+ 10 - 2
src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookClaimController.java

@@ -30,6 +30,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -58,9 +59,8 @@ public class WfTextbookClaimController {
                 .distinct()
                 .selectAs(WfTextbookClaim::getBaseSemesterId, DistributeSemesterVo::getBaseSemesterId)
                 .selectAs(BaseSemester::getName, DistributeSemesterVo::getBaseSemesterIdCn)
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, WfTextbookClaim::getBaseSemesterId)
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
 
         List<DistributeSemesterVo> distributeSemesterVoList = wfTextbookClaimService.selectJoinList(DistributeSemesterVo.class, wfTextbookClaimMPJLambdaWrapper);
@@ -150,6 +150,14 @@ public class WfTextbookClaimController {
 
     }
 
+    @PostMapping("/nullify")
+    @ApiOperation(value = "作废教材申领")
+    @SaCheckPermission("wftextbookclaim:edit")
+    @XjrLog(value = "作废教材申领", saveResponseData = true)
+    public RT<Boolean> nullify(@Valid @RequestBody NullifyWfTextbookClaimDto dto) {
+        return RT.ok(wfTextbookClaimService.nullify(dto));
+    }
+
     @DeleteMapping
     @ApiOperation(value = "删除教材申领")
     @SaCheckPermission("wftextbookclaim:delete")

+ 3 - 0
src/main/java/com/xjrsoft/module/textbook/dto/DistributePageDto.java

@@ -24,6 +24,9 @@ public class DistributePageDto extends PageInput {
     @ApiModelProperty("是否有过发放(1:未发放,2:部分发放,3:全部发放,4:有发放)")
     private Integer distributeStatus;
 
+    @ApiModelProperty("流程状态(0:未结束,1:已结束,正常通过,2:已结束,未通过),3:作废")
+    private Integer workflowStatus;
+
     @ApiModelProperty("姓名")
     private String name;
 }

+ 13 - 0
src/main/java/com/xjrsoft/module/textbook/dto/NullifyWfTextbookClaimDto.java

@@ -0,0 +1,13 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class NullifyWfTextbookClaimDto {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("教材申领记录主键id")
+    private Long id;
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookClaim.java

@@ -125,7 +125,7 @@ public class WfTextbookClaim implements Serializable {
     /**
      * 流程状态(0:未结束,1:已结束,正常通过,2:已结束,未通过)
      */
-    @ApiModelProperty("流程状态(0:未结束,1:已结束,正常通过,2:已结束,未通过)")
+    @ApiModelProperty("流程状态(0:未结束,1:已结束,正常通过,2:已结束,未通过),3:作废")
     private Integer workflowStatus;
     /**
      * 当前申领项发放次数

+ 3 - 4
src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookClaimService.java

@@ -2,10 +2,7 @@ package com.xjrsoft.module.textbook.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseService;
-import com.xjrsoft.module.textbook.dto.ClaimRecordsExportQueryDto;
-import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto;
-import com.xjrsoft.module.textbook.dto.DistributePageDto;
-import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto;
+import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.WfTextbookClaim;
 import com.xjrsoft.module.textbook.vo.DistributePageVo;
 import com.xjrsoft.module.textbook.vo.DistributeRecordVo;
@@ -76,6 +73,8 @@ public interface IWfTextbookClaimService extends MPJBaseService<WfTextbookClaim>
      */
     Boolean confirmDistribute(ConfirmDistributeDto dto);
 
+    Boolean nullify(NullifyWfTextbookClaimDto dto);
+
     Boolean dataHandleAddClaimUserNode(Long id);
 
     ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto);

+ 20 - 10
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java

@@ -106,6 +106,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(WfTextbookClaim::getClassId, dto.getBaseClassId())
                 .eq(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimClass.getCode())
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
         List<HeadTeaLookClassBookCategoryDetailVo> claimResultList = wfTextbookClaimItemMapper.selectJoinList(HeadTeaLookClassBookCategoryDetailVo.class, wfTextbookClaimItemMPJLambdaWrapper);
 
@@ -257,8 +258,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .select("1 as claim_num")
                 .select("if(t.issue_number > 0, 1, 0) as is_issue")
                 .innerJoin(WfTextbookClaim.class, WfTextbookClaim::getId, WfTextbookClaimItem::getWfTextbookClaimId)
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
                 .innerJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId)
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
                         wrapper -> wrapper
@@ -287,8 +287,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .select("1 as claim_num")
                 .select("if(t.issue_number > 0, 1, 0) as is_issue")
                 .innerJoin(WfTextbookClaim.class, WfTextbookClaim::getId, WfTextbookClaimItem::getWfTextbookClaimId)
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
                 .innerJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId)
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
                         wrapper -> wrapper
@@ -441,9 +440,8 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .selectAs(BaseSemester::getName, StudentSemesterTextbookVo::getBaseSemesterIdCN)
                 .selectAs(WfTextbookClaimItem::getTextbookId, StudentSemesterTextbookVo::getTextbookId)
                 .innerJoin(WfTextbookClaimItem.class, WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaim::getId)
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, WfTextbookClaim::getBaseSemesterId)
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
                 .eq(WfTextbookClaim::getClassId, baseStudentSchoolRoll.getClassId())
                 .eq(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimClass.getCode())
         ;
@@ -466,9 +464,8 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .selectAs(BaseSemester::getName, StudentSemesterTextbookVo::getBaseSemesterIdCN)
                 .selectAs(WfTextbookClaimItem::getTextbookId, StudentSemesterTextbookVo::getTextbookId)
                 .innerJoin(WfTextbookClaimItem.class, WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaim::getId)
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, WfTextbookClaim::getBaseSemesterId)
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
                 .eq(WfTextbookClaim::getApplicantUserId, loginId)
                 .eq(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimStudent.getCode())
         ;
@@ -541,7 +538,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .values()); // 转换回 List
 
         // 根据 baseSemesterIdCN 排序
-        lastMergedDistinctList.sort(Comparator.comparing(TextbookStudentSemesterVo::getBaseSemesterIdCN));
+        lastMergedDistinctList.sort(Comparator.comparing(TextbookStudentSemesterVo::getBaseSemesterIdCN).reversed());
 
         return lastMergedDistinctList;
     }
@@ -594,6 +591,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .eq(WfTextbookClaim::getClassId, dto.getClassId())
                 .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimClass.getCode())
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
         List<TextbookClaimVO> textbookClaimVOList = wfTextbookClaimItemMapper.selectJoinList(TextbookClaimVO.class, wfTextbookClaimItemMPJLambdaWrapper);
 
@@ -806,13 +804,21 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
     @Override
     public List<TextbookClaimVO> getTeacherGetStuNoClaimList(Long studentUserId) {
         MPJLambdaWrapper<TextbookStudentClaim> queryTextbookClaimVOList = new MPJLambdaWrapper<>();
-        queryTextbookClaimVOList.selectAs(TextbookStudentClaim::getId, TextbookClaimVO::getTextbookStudentClaimId).selectAs(Textbook::getBookName, TextbookClaimVO::getBookName).select(TextbookStudentClaim.class, x -> VoToColumnUtil.fieldsToColumns(TextbookClaimVO.class).contains(x.getProperty())).leftJoin(Textbook.class, Textbook::getId, TextbookStudentClaim::getTextbookId).eq(TextbookStudentClaim::getStudentUserId, studentUserId).disableSubLogicDel();
+        queryTextbookClaimVOList
+                .disableSubLogicDel()
+                .selectAs(TextbookStudentClaim::getId, TextbookClaimVO::getTextbookStudentClaimId)
+                .selectAs(Textbook::getBookName, TextbookClaimVO::getBookName)
+                .select(TextbookStudentClaim.class, x -> VoToColumnUtil.fieldsToColumns(TextbookClaimVO.class).contains(x.getProperty()))
+                .leftJoin(Textbook.class, Textbook::getId, TextbookStudentClaim::getTextbookId)
+                .eq(TextbookStudentClaim::getStudentUserId, studentUserId)
+                ;
         return this.selectJoinList(TextbookClaimVO.class, queryTextbookClaimVOList);
     }
 
     @Override
     @Transactional
     public Boolean teacherConfirmBatchBytTextbook(TeacherConfirmBatchByTextbookDto dto) {
+
         // 根据学期,班级,学生,教材信息获取记录
         LambdaQueryWrapper<TextbookStudentClaim> textbookStudentClaimLambdaQueryWrapper = new LambdaQueryWrapper<>();
         textbookStudentClaimLambdaQueryWrapper
@@ -841,6 +847,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .innerJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getId, TextbookIssueRecord::getTextbookWarehouseRecordId)
                 .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(WfTextbookClaim::getClassId, dto.getClassId())
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
         List<ClassClaimTextbookIssuePrice> classClaimTextbookIssuePrices = wfTextbookClaimMapper.selectJoinList(ClassClaimTextbookIssuePrice.class, wfTextbookClaimLambdaQueryWrapper);
 
@@ -966,6 +973,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .innerJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getId, TextbookIssueRecord::getTextbookWarehouseRecordId)
                 .in(WfTextbookClaim::getBaseSemesterId, baseSemesterIds)
                 .in(WfTextbookClaim::getClassId, classIds)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
 
         List<ClassClaimTextbookIssuePrice> classClaimTextbookIssuePrices = wfTextbookClaimMapper.selectJoinList(ClassClaimTextbookIssuePrice.class, wfTextbookClaimLambdaQueryWrapper);
@@ -1112,6 +1120,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .innerJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getId, TextbookIssueRecord::getTextbookWarehouseRecordId)
                 .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(WfTextbookClaim::getClassId, baseStudentSchoolRoll.getClassId())
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
         List<ClassClaimTextbookIssuePrice> classClaimTextbookIssuePrices = wfTextbookClaimMapper.selectJoinList(ClassClaimTextbookIssuePrice.class, wfTextbookClaimLambdaQueryWrapper);
 
@@ -1215,6 +1224,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .leftJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId)
                 .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(WfTextbookClaim::getClassId, dto.getClassId())
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
         ;
         return wfTextbookClaimItemMapper.selectJoinList(TeacherConfirmBatchTextbookListVo.class, wfTextbookClaimItemMPJLambdaWrapper);
     }

+ 40 - 12
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
@@ -12,6 +13,7 @@ import com.xjrsoft.common.enums.ClaimTypeEnum;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.IssueModeEnum;
 import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
@@ -20,10 +22,7 @@ import com.xjrsoft.module.oa.entity.WfMeetingApply;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
-import com.xjrsoft.module.textbook.dto.ClaimRecordsExportQueryDto;
-import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto;
-import com.xjrsoft.module.textbook.dto.DistributePageDto;
-import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto;
+import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
@@ -77,7 +76,6 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 .disableSubLogicDel()
                 .select(WfTextbookClaim::getId)
                 .select(WfTextbookClaim.class, x -> VoToColumnUtil.fieldsToColumns(DistributePageVo.class).contains(x.getProperty()))
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfTextbookClaim::getClaimType,
                         wrapper -> wrapper
                                 .selectAs(DictionaryDetail::getName, DistributePageVo::getClaimTypeCn)
@@ -98,7 +96,6 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                         wrapper -> wrapper
                                 .selectAs(XjrUser::getName, DistributePageVo::getStudentUserIdCn)
                 )
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
                 .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
                 .eq(StringUtils.isNotEmpty(dto.getClaimType()), WfTextbookClaim::getClaimType, dto.getClaimType())
                 .and(StringUtils.isNotEmpty(dto.getName()),
@@ -108,18 +105,31 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                                 .like(BaseClass::getName, dto.getName())
                 )
         ;
-        if(ObjectUtils.isNotEmpty(dto.getDistributeStatus())){
-            if(dto.getDistributeStatus() == 4){
+        if (ObjectUtils.isNotEmpty(dto.getDistributeStatus())) {
+            if (dto.getDistributeStatus() == 4) {
                 wfTextbookClaimMPJLambdaWrapper
                         .ne(WfTextbookClaim::getStatus, 1)
                 ;
-            }else {
+            } else {
                 wfTextbookClaimMPJLambdaWrapper
                         .eq(WfTextbookClaim::getStatus, dto.getDistributeStatus())
                 ;
             }
 
         }
+        if (ObjectUtils.isNotEmpty(dto.getWorkflowStatus())) {
+            wfTextbookClaimMPJLambdaWrapper
+                    .eq(WfTextbookClaim::getWorkflowStatus, dto.getWorkflowStatus())
+            ;
+        } else {
+            wfTextbookClaimMPJLambdaWrapper
+                    .and(wrapper -> wrapper
+                            .eq(WfTextbookClaim::getWorkflowStatus, 1)
+                            .or()
+                            .eq(WfTextbookClaim::getWorkflowStatus, 3)
+                    )
+            ;
+        }
         IPage<DistributePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), DistributePageVo.class, wfTextbookClaimMPJLambdaWrapper);
 
         List<DistributePageVo> distributePageVos = page.getRecords();
@@ -499,7 +509,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 textbookIssueRecordMapper.insert(textbookIssueRecord);
 
                 // 如果申领项是个人申领,发放的时候应该直接帮助学生确认领取
-                if(ClaimTypeEnum.ClaimStudent.getCode().equals(wfTextbookClaim.getClaimType())){
+                if (ClaimTypeEnum.ClaimStudent.getCode().equals(wfTextbookClaim.getClaimType())) {
                     oldTextbookStudentClaim = byUserIdAndTextbookId.get("" + wfTextbookClaim.getApplicantUserId() + wfTextbookClaimItem.getTextbookId());
                     if (ObjectUtils.isNotEmpty(oldTextbookStudentClaim) && (ObjectUtils.isEmpty(oldTextbookStudentClaim.getClaimSource()) || oldTextbookStudentClaim.getClaimSource() != 1)) {
                         updateTextbookStudentClaim = new TextbookStudentClaim();
@@ -573,6 +583,25 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         return true;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean nullify(NullifyWfTextbookClaimDto dto) {
+        // 作废申领流程数据,应该移除领取人记录
+        LambdaUpdateWrapper<TextbookClaimUser> textbookClaimUserLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        textbookClaimUserLambdaUpdateWrapper
+                .eq(TextbookClaimUser::getWfTextbookClaimId, dto.getId())
+        ;
+        textbookClaimUserMapper.delete(textbookClaimUserLambdaUpdateWrapper);
+
+        WfTextbookClaim wfTextbookClaim = new WfTextbookClaim();
+        wfTextbookClaim.setId(dto.getId());
+        wfTextbookClaim.setWorkflowStatus(3);
+        wfTextbookClaim.setModifyDate(new Date());
+        wfTextbookClaim.setModifyUserId(StpUtil.getLoginIdAsLong());
+        this.updateById(wfTextbookClaim);
+        return true;
+    }
+
     @Override
     @Transactional
     public Boolean dataHandleAddClaimUserNode(Long id) {
@@ -668,7 +697,6 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 .disableSubLogicDel()
                 .select(WfTextbookClaim::getId)
                 .select(WfTextbookClaim.class, x -> VoToColumnUtil.fieldsToColumns(ClaimRecordsExportQueryVo.class).contains(x.getProperty()))
-                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfTextbookClaim::getClaimType,
                         wrapper -> wrapper
                                 .selectAs(DictionaryDetail::getName, ClaimRecordsExportQueryVo::getClaimTypeCn)
@@ -685,7 +713,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                         wrapper -> wrapper
                                 .selectAs(BaseSemester::getName, ClaimRecordsExportQueryVo::getBaseSemesterIdCn)
                 )
-                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getWorkflowStatus, 1)
                 .eq(ObjectUtils.isNotEmpty(dto.getBaseSemesterId()), WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
         ;
         List<ClaimRecordsExportQueryVo> dataList = this.selectJoinList(ClaimRecordsExportQueryVo.class, wfTextbookClaimMPJLambdaWrapper);

+ 11 - 0
src/main/java/com/xjrsoft/module/textbook/vo/DistributePageVo.java

@@ -1,8 +1,13 @@
 package com.xjrsoft.module.textbook.vo;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+import java.util.Date;
+
 @Data
 public class DistributePageVo {
 
@@ -50,4 +55,10 @@ public class DistributePageVo {
 
     @ApiModelProperty("状态()")
     private Integer status;
+
+    @ApiModelProperty("流程状态(0:未结束,1:已结束,正常通过,2:已结束,未通过),3:作废")
+    private Integer workflowStatus;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createDate;
 }

+ 14 - 1
src/main/java/com/xjrsoft/module/textbook/vo/TextbookStudentClaimPageVo.java

@@ -28,12 +28,25 @@ public class TextbookStudentClaimPageVo {
      * 教材管理编号
      */
     @ApiModelProperty("教材管理编号")
-    private Long textbookId;
+    private String textbookId;
     /**
      * 书名
      */
     @ApiModelProperty("书名")
     private String bookName;
+
+    @ApiModelProperty("课程编号(base_course_subject)")
+    private String courseSubjectIdCn;
+
+    /**
+     * 出版社
+     */
+    @ApiModelProperty("出版社")
+    private String publishingHouse;
+
+    @ApiModelProperty("教材分类(xjr_dictionary_item[textbook_type])")
+    private String textbookTypeCn;
+
     /**
      * 定价(元)
      */

+ 7 - 1
src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java

@@ -56,9 +56,14 @@ public class ImportExcelUtil {
         createHead(workbook, sheet, importConfigs, IndexedColors.YELLOW.getIndex(), IndexedColors.RED.getIndex(), 0);
 
         // 提示必填
-        String content = "红色背景为必填项,导入时请删除本行。";
+        String content = "黄底红字为必填项,导入时请删除本行。";
         createCautionHead(workbook, sheet, 1, content, importConfigs.size() - 1, 12, IndexedColors.RED.getIndex());
 
+        // 自动列宽
+        for (int i = 0; i < importConfigs.size(); i++) {
+            sheet.autoSizeColumn(i);
+        }
+
         //写入文件
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
         workbook.write(bot);
@@ -192,6 +197,7 @@ public class ImportExcelUtil {
         Font requiredFont = workbook.createFont();
         requiredFont.setFontName("宋体");
         requiredFont.setFontHeightInPoints((short) 12);
+        requiredFont.setColor(requiredFieldFontColor);
 
         CellStyle requiredCellStyle = workbook.createCellStyle();
         requiredCellStyle.setFont(requiredFont); // 将字体应用到样式

+ 1 - 1
src/main/resources/mapper/attendance/AttendanceStatisticsMapper.xml

@@ -5,7 +5,7 @@
 <mapper namespace="com.xjrsoft.module.attendance.mapper.AttendanceStatisticsMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto" resultType="com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo">
         SELECT t1.id,t1.year,t1.month,t1.name,t1.start_date,t1.end_date,t2.name AS rule_name,
-        t1.person_count,t1.attendance_days, t1.status,t1.is_need_refresh,t1.time_period FROM attendance_statistics t1
+        t1.person_count,t1.attendance_days, t1.status,t1.is_need_refresh,t1.time_period,t1.remarks FROM attendance_statistics t1
         LEFT JOIN attendance_rule_category t2 ON t1.attendance_rule_category_id = t2.id
         WHERE t1.delete_mark = 0
         <if test="dto.name != null and dto.name != ''">

+ 39 - 0
src/main/resources/mapper/base/BaseClassTeacherChange.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.base.mapper.BaseClassTeacherChangeMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.base.dto.BaseClassTeacherChangePageDto" resultType="com.xjrsoft.module.base.vo.BaseClassTeacherChangePageVo">
+        SELECT t1.id,t3.name AS grade_name,t2.name AS class_name,t2.code AS class_code,t1.create_date,
+        t6.name AS create_user_name,t4.name AS before_teacher_name,t5.name AS after_teacher_name FROM base_class_teacher_change t1
+        INNER JOIN base_class t2 ON t1.class_id = t2.id
+        INNER JOIN base_grade t3 ON t2.grade_id = t3.id
+        LEFT JOIN xjr_user t4 ON t1.before_teacher_id = t4.id
+        LEFT JOIN xjr_user t5 ON t1.after_teacher_id = t5.id
+        LEFT JOIN xjr_user t6 ON t1.create_user_id = t6.id
+        WHERE t1.delete_mark = 0
+        <if test="dto.className != null and dto.className != ''">
+            and t2.name like concat('%', #{dto.className}, '%')
+        </if>
+        <if test="dto.classCode != null and dto.classCode != ''">
+            and t2.code like concat('%', #{dto.classCode}, '%')
+        </if>
+        <if test="dto.afterTeacherName != null and dto.afterTeacherName != ''">
+            and t5.name like concat('%', #{dto.afterTeacherName}, '%')
+        </if>
+        <if test="dto.beforeTeacherName != null and dto.beforeTeacherName != ''">
+            and t4.name like concat('%', #{dto.beforeTeacherName}, '%')
+        </if>
+        <if test="dto.gradeId != null">
+            and t3.id = #{dto.gradeId}
+        </if>
+        <if test="dto.gradeId != null">
+            and t3.id = #{dto.gradeId}
+        </if>
+        <if test="dto.createDateStart != null and dto.createDateEnd != null">
+            and t1.create_date between #{dto.createDateStart} and #{dto.createDateEnd}
+        </if>
+        order by t1.create_date desc
+    </select>
+
+</mapper>

+ 0 - 1
src/main/resources/mapper/oa/OfficialDocumentReceivedMapper.xml

@@ -13,7 +13,6 @@
         SELECT IFNULL(MAX(SUBSTR(received_number, 6, 3)), 0) + 1
         FROM official_document_received
         WHERE YEAR(received_date) = YEAR(NOW())
-          and received_type = 'rt_meeting'
     </select>
 
 </mapper>

+ 128 - 1
src/main/resources/mapper/student/BaseNewStudentMapper.xml

@@ -4,7 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xjrsoft.module.student.mapper.BaseNewStudentMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.student.dto.BaseNewStudentPageDto" resultType="com.xjrsoft.module.student.vo.BaseNewStudentPageVo">
-        SELECT t1.id,t1.graduate_school,t1.name,t1.gender,t2.name AS gender_cn,t1.credential_number,t1.height,t1.weight,
+        SELECT t1.id,t1.graduate_school,t1.name,t1.gender,t2.name AS gender_cn,t1.credential_number,t1.height,t1.weight,t1.family_mobile,t1.family_address,
         t1.score,t1.graduate_class,t1.source,t5.name AS source_cn,t1.stduy_status,t3.name AS stduy_status_cn,t1.mobile,t7.name AS first_ambition,
         t8.name AS second_ambition,t1.is_adjust,t1.status,IFNULL(t11.name,t1.delete_reason) AS class_name,t12.name AS teacher_name,
         t1.paymnystate,t1.userdef6,t1.previous,t1.province,t1.city,t1.myarea,t1.remarks,t1.is_can_banding,t1.operate_mode,
@@ -106,6 +106,109 @@
             </if>
         </if>
     </select>
+    <select id="getList" parameterType="com.xjrsoft.module.student.dto.BaseNewStudentPageDto" resultType="com.xjrsoft.module.student.vo.BaseNewStudentPageVo">
+        SELECT t1.id,t1.graduate_school,t1.name,t1.gender,t2.name AS gender_cn,t1.credential_number,t1.height,t1.weight,t1.family_mobile,t1.family_address,
+        t1.score,t1.graduate_class,t1.source,t5.name AS source_cn,t1.stduy_status,t3.name AS stduy_status_cn,t1.mobile,t7.name AS first_ambition,
+        t8.name AS second_ambition,t1.is_adjust,t1.status,IFNULL(t11.name,t1.delete_reason) AS class_name,t12.name AS teacher_name,
+        t1.paymnystate,t1.userdef6,t1.previous,t1.province,t1.city,t1.myarea,t1.remarks,t1.is_can_banding,t1.operate_mode,
+        t14.name AS banding_class_name,t15.name AS banding_teacher_name FROM base_new_student t1
+        LEFT JOIN xjr_dictionary_detail t2 ON t1.gender = t2.code AND t2.item_id = 2023000000000000004
+        LEFT JOIN xjr_dictionary_detail t3 ON t1.stduy_status = t3.code AND t3.item_id = 2023000000000000030
+        LEFT JOIN xjr_dictionary_detail t5 ON t1.source = t5.code AND t5.item_id = 2023000000000000028
+        LEFT JOIN enrollment_plan t4 ON t1.enrollment_plan_id = t4.id
+        LEFT JOIN base_major_set t7 ON t1.first_ambition = t7.id
+        LEFT JOIN base_major_set t8 ON t1.second_ambition = t8.id
+        LEFT JOIN xjr_user t9 ON t1.credential_number = t9.credential_number AND t9.delete_mark = 0
+        LEFT JOIN base_student_school_roll t10 ON t9.id = t10.user_id AND t10.delete_mark = 0
+        LEFT JOIN base_class t11 ON t10.class_id = t11.id
+        LEFT JOIN xjr_user t12 ON t11.teacher_id = t12.id
+        LEFT JOIN banding_task_class_student t13 ON t1.id = t13.new_student_id AND t13.delete_mark = 0 AND t13.status = 1
+        LEFT JOIN banding_task_class t14 ON t13.banding_task_class_id = t14.id AND t14.delete_mark = 0
+        LEFT JOIN xjr_user t15 ON t14.teacher_id = t15.id
+        WHERE t1.delete_mark = 0
+        <if test="dto.name != null and dto.name != ''">
+            and t1.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.credentialNumber != null and dto.credentialNumber != ''">
+            and t1.credential_number like concat('%', #{dto.credentialNumber}, '%')
+        </if>
+        <if test="dto.graduateSchool != null and dto.graduateSchool != ''">
+            and t1.graduate_school like concat('%', #{dto.graduateSchool}, '%')
+        </if>
+        <if test="dto.isImportScore != null">
+            <if test="dto.isImportScore == 1">
+                and t1.score is not null
+            </if>
+            <if test="dto.isImportScore == 0">
+                and t1.score is null
+            </if>
+        </if>
+        <if test="dto.firstAmbition != null and dto.firstAmbition != ''">
+            and t1.first_ambition = #{dto.firstAmbition}
+        </if>
+        <if test="dto.secondAmbition != null and dto.secondAmbition != ''">
+            and t1.second_ambition = #{dto.secondAmbition}
+        </if>
+
+        <if test="dto.startDate != null and dto.endDate != null">
+            AND t1.create_date between #{dto.startDate} and #{dto.endDate}
+        </if>
+        <if test="dto.gender != null and dto.gender != ''">
+            AND t1.gender = #{dto.gender}
+        </if>
+        <if test="dto.teacherName != null and dto.teacherName != ''">
+            AND t12.name like concat('%', #{dto.teacherName}, '%')
+        </if>
+        <if test="dto.gender != null and dto.gender != ''">
+            AND t1.gender = #{dto.gender}
+        </if>
+        <if test="dto.status != null">
+            AND t1.status = #{dto.status}
+        </if>
+        <if test="dto.isAdjust != null">
+            AND t1.is_adjust = #{dto.isAdjust}
+        </if>
+        <if test="dto.enrollmentPlanId != null">
+            AND t1.enrollment_plan_id = #{dto.enrollmentPlanId}
+        </if>
+
+        <if test="dto.isCanBanding != null">
+            and t1.is_can_banding = #{dto.isCanBanding}
+        </if>
+        <if test="dto.operateMode != null">
+            and t1.operate_mode = #{dto.operateMode}
+        </if>
+        <if test="dto.paymnystate != null and dto.paymnystate != ''">
+            AND t1.paymnystate = #{dto.paymnystate}
+        </if>
+        <if test="dto.previous != null and dto.previous != ''">
+            AND t1.previous = #{dto.previous}
+        </if>
+        <if test="dto.city != null and dto.city != ''">
+            AND (
+            t1.province like concat('%', #{dto.city}, '%')
+            or t1.city like concat('%', #{dto.city}, '%')
+            or t1.myarea like concat('%', #{dto.city}, '%')
+            )
+        </if>
+
+        <if test="dto.treeId != null and dto.treeType != null">
+            <if test="dto.treeType == 1">
+                AND t4.grade_id = #{dto.treeId}
+            </if>
+            <if test="dto.treeType == 2">
+                AND t4.enroll_type = #{dto.treeId}
+            </if>
+        </if>
+        <if test="dto.field != null and dto.field != '' and dto.field == 'score'">
+            <if test="dto.order == 'descend'">
+                order by t1.score desc
+            </if>
+            <if test="dto.order == 'ascend'">
+                order by t1.score asc
+            </if>
+        </if>
+    </select>
     <select id="getReportPage" parameterType="com.xjrsoft.module.student.dto.BaseNewStudentPageDto" resultType="com.xjrsoft.module.student.vo.BaseNewStudentPageVo">
         SELECT t1.id,t1.graduate_school,t1.name,t1.gender,t2.name AS gender_cn,t1.credential_number,t1.height,t1.weight,t1.family_mobile,
         t1.score,t1.graduate_class,t1.source,t5.name as source_cn,t1.stduy_status,t3.name AS stduy_status_cn,t1.mobile,t7.name as first_ambition,
@@ -336,4 +439,28 @@
         WHERE t1.delete_mark = 0 and t1.enabled_mark = 1
     </select>
 
+    <select id="getInfosByParam" parameterType="com.xjrsoft.module.student.dto.BaseStudentSimpleInfoDto" resultType="com.xjrsoft.module.student.vo.BaseStudentSompleInfoVo">
+        SELECT t1.id, t1.name AS student_name, t1.enabled_mark, t1.credential_number, t3.name AS class_name,t1.mobile,
+        t1.family_mobile AS parent_mobile,
+        t1.gender,t3.id AS class_id, t3.teacher_id,t6.name AS teacher_name,t6.user_name AS teacher_user_name,t6.mobile AS teacher_mobile,t5.name AS classroom_name,
+        t8.id AS grade_id,t8.name AS grade_name
+        FROM base_new_student t1
+        INNER JOIN banding_task_class_student t2 ON t1.id = t2.new_student_id AND t2.delete_mark = 0
+        INNER JOIN banding_task_class t3 ON t2.banding_task_class_id = t3.id AND t3.delete_mark = 0
+        LEFT JOIN base_classroom t5 ON t3.classroom_id = t5.id
+        LEFT JOIN xjr_user t6 ON t3.teacher_id = t6.id
+        LEFT JOIN banding_task t7 ON t3.banding_task_id = t7.id
+        LEFT JOIN base_grade t8 ON t7.grade_id = t8.id
+        WHERE t1.delete_mark = 0 AND t1.delete_reason IS NULL
+        <if test="dto.keyword != null and dto.keyword != ''">
+            AND (t1.name like concat('%', #{dto.keyword}, '%') OR t1.credential_number like concat('%', #{dto.keyword}, '%'))
+        </if>
+        <if test="dto.name != null and dto.name != '' and dto.idNumber != null and dto.idNumber != ''">
+            AND t1.name = #{dto.name} and t1.credential_number = #{dto.idNumber}
+        </if>
+        <if test="dto.userId != null">
+            AND t1.id = #{dto.userId}
+        </if>
+    </select>
+
 </mapper>

+ 1 - 1
src/main/resources/mapper/student/BaseStudentAssessmentInspectionMapper.xml

@@ -4,7 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xjrsoft.module.student.mapper.BaseStudentAssessmentInspectionMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.student.dto.BaseStudentAssessmentInspectionPageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentAssessmentInspectionPageVo">
-        SELECT t.id,t.score,(t.score * IF(personal_student_user_ids IS NULL, 1, (SELECT COUNT(*) FROM base_student_assessment_student_relation WHERE base_student_assessment_inspection_id = t.id AND delete_mark = 0 AND enabled_mark = 1))) as total_score,t.score_type,t.assessment_date,t.reason,t1.name AS assessment_category_name,t2.name AS assessment_project_name,t3.name AS semester_name,t4.name AS grade_name,t5.name AS assessment_user_name,t6.name AS score_type_cn,
+        SELECT t.id,t.score,IF(t.base_student_assessment_category_id = 1782327704603373570, (t.score * IF(personal_student_user_ids IS NULL, 1, (SELECT COUNT(*) FROM base_student_assessment_student_relation WHERE base_student_assessment_inspection_id = t.id AND delete_mark = 0 AND enabled_mark = 1))),t.total_score) as total_score,t.score_type,t.assessment_date,t.reason,t1.name AS assessment_category_name,t2.name AS assessment_project_name,t3.name AS semester_name,t4.name AS grade_name,t5.name AS assessment_user_name,t6.name AS score_type_cn,
         (
         SELECT NAME FROM base_class
         WHERE id = t.class_ids

+ 2 - 2
src/main/resources/mapper/student/BaseStudentGraduateMapper.xml

@@ -60,7 +60,7 @@
     </select>
 
     <select id="getInfoById" resultType="com.xjrsoft.module.student.vo.BaseStudentGraduateVo">
-        SELECT t5.id,t1.user_id,t1.student_id,t2.name,t4.name AS major_name,t6.name AS stduy_status_cn,
+        SELECT t5.id,t1.user_id,t1.student_id,t2.name,t4.name AS major_name,t6.name AS stduy_status_cn,t5.leaving_bed_date,
         IFNULL(t5.status,0) AS status,t5.certificate_number,t5.certificate_date,t7.name AS class_name,t8.name AS grade_name,t5.appendix_id FROM base_student t1
         LEFT JOIN xjr_user t2 ON t1.user_id = t2.id
         LEFT JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
@@ -71,6 +71,6 @@
         LEFT JOIN base_grade t8 ON t8.id = t3.grade_id
         WHERE t1.delete_mark = 0 AND t2.delete_mark = 0
         AND t3.delete_mark = 0
-        AND t1.user_id = #{id}
+        AND t5.id = #{id}
     </select>
 </mapper>

+ 40 - 1
src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml

@@ -32,6 +32,7 @@
             t13.name AS roll_modality,
             t11.name AS student_form,
             t2.credential_number,
+            t17.name as internship_state_cn,
         CONCAT(t16.name, ' ', t15.room_name, ' ', t14.bed_number) AS bed_info
         FROM base_student t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
@@ -48,6 +49,7 @@
         LEFT JOIN room_bed t14 ON t14.student_user_id = t2.id
         LEFT JOIN room t15 ON t14.room_id = t15.id
         LEFT JOIN base_office_build t16 ON t15.office_build_id = t16.id
+        LEFT JOIN xjr_dictionary_detail t17 ON t3.internship_state = t17.code
         WHERE t2.delete_mark = 0
         AND t1.delete_mark = 0 and t1.is_normal = 1
         AND t3.archives_status = 'FB2901'
@@ -105,7 +107,8 @@
                REPLACE(IFNULL((SELECT jfzt FROM pb_v_xsxxsfytb WHERE Studentcode = t2.credential_number AND feeitemcode LIKE '999010604%' AND jfzt = '未缴费' LIMIT 1),'已缴费'),'未缴费','欠费') AS jxf,
                REPLACE(IFNULL((SELECT jfzt FROM pb_v_xsxxsfytb WHERE Studentcode = t2.credential_number AND feeitemcode = 103042766003001 AND jfzt = '未缴费' LIMIT 1),'已缴费'),'未缴费','欠费') AS ssf,
                REPLACE(IFNULL((SELECT jfzt FROM pb_v_xsxxsfytb WHERE Studentcode = t2.credential_number AND feeitemcode LIKE '999010603%' AND jfzt = '未缴费' LIMIT 1),'已缴费'),'未缴费','欠费') AS jcf,
-               CONCAT(t17.name, ' ', t16.room_name, ' ', t15.bed_number) AS bed_info
+               CONCAT(t17.name, ' ', t16.room_name, ' ', t15.bed_number) AS bed_info,
+               t18.name as internship_state_cn,t3.internship_state
         FROM base_student t1
                  INNER JOIN xjr_user t2 ON t1.user_id = t2.id
                  INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
@@ -121,6 +124,7 @@
                  left join room_bed t15 on t15.student_user_id = t1.user_id
                  left join room t16 on t16.id = t15.room_id
                  left join base_office_build t17 on t17.id = t16.office_build_id
+                 LEFT JOIN xjr_dictionary_detail t18 ON t3.internship_state = t18.code
         WHERE t2.id = #{dto.id}
     </select>
     <update id="updateInfoByUserId" parameterType="com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto">
@@ -128,6 +132,7 @@
         <if test="dto.rollModality != null and dto.rollModality != ''">,roll_modality = #{dto.rollModality},learn_status = #{dto.rollModality} </if>
         <if test="dto.archivesStatus != null and dto.archivesStatus != ''">,archives_status = #{dto.archivesStatus} </if>
         <if test="dto.stduyStatus != null and dto.stduyStatus != ''">,stduy_status = #{dto.stduyStatus} </if>
+        <if test="dto.internshipState != null and dto.internshipState != ''">,internship_state = #{dto.internshipState} </if>
         where user_id = #{id}
     </update>
 
@@ -198,6 +203,40 @@
         group by t3.stduy_status,t2.gender
     </select>
 
+    <select id="getInternshipStateCount" parameterType="com.xjrsoft.module.student.dto.BaseStudentInfoPageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentInfoCategoryVo">
+        SELECT t3.internship_state as category,COUNT(*) as number FROM base_student t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
+        LEFT JOIN base_class t4 ON t3.class_id = t4.id
+        LEFT JOIN xjr_user t5 ON t4.teacher_id = t5.id
+        LEFT JOIN base_student_family_member t6 ON t6.user_id = t2.id AND t6.delete_mark = 0 AND t6.is_guardian = 1
+        WHERE t2.delete_mark = 0
+        AND t1.delete_mark = 0 and t1.is_normal = 1
+        and t3.archives_status = 'FB2901'
+        <if test="dto.gradeId != null">
+            and t4.grade_id = #{dto.gradeId}
+        </if>
+        <if test="dto.majorSetId != null">
+            and t3.major_set_id = #{dto.majorSetId}
+        </if>
+        <if test="dto.classId != null">
+            and t4.id = #{dto.classId}
+        </if>
+        <if test="dto.teacherId != null">
+            and t4.teacher_id = #{dto.teacherId}
+        </if>
+        <if test="dto.keyWord != null and dto.keyWord != ''">
+            and (t4.name like concat('%', #{dto.keyWord}, '%')
+            or t2.name like concat('%', #{dto.keyWord}, '%')
+            or t5.name like concat('%', #{dto.keyWord}, '%')
+            or t1.student_id like concat('%', #{dto.keyWord}, '%')
+            or t2.mobile like concat('%', #{dto.keyWord}, '%')
+            or t6.mobile LIKE concat('%', #{dto.keyWord}, '%')
+            )
+        </if>
+        group by t3.internship_state
+    </select>
+
     <select id="getClassNameByUserId" resultType="java.lang.String">
         SELECT t1.name FROM base_class t1
         INNER JOIN base_student_school_roll t2 ON t1.id = t2.class_id

+ 25 - 0
src/main/resources/mapper/teacher/BaseTeacherMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.teacher.mapper.BaseTeacherMapper">
+    <select id="getList" parameterType="com.xjrsoft.module.teacher.dto.BaseTeacherPageDto" resultType="com.xjrsoft.module.teacher.vo.XjrUserPageVo">
+        SELECT DISTINCT t2.* FROM base_teacher t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        LEFT JOIN xjr_user_dept_relation t3 ON t2.id = t3.user_id
+        LEFT JOIN xjr_user_role_relation t4 ON t2.id = t4.user_id
+        WHERE t2.delete_mark = 0 AND t1.delete_mark = 0
+        <if test="dto.deptIds != null and dto.deptIds.size() > 0">
+            AND t3.dept_id IN
+            <foreach item="deptId" index="index" collection="dto.deptIds" open="(" separator="," close=")">
+                #{deptId}
+            </foreach>
+        </if>
+        <if test="dto.userIds != null and dto.userIds.size() > 0">
+            AND t2.id IN
+            <foreach item="userId" index="index" collection="dto.userIds" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+    </select>
+</mapper>

+ 1 - 0
src/main/resources/mapper/textbook/TextbookStudentClaimMapper.xml

@@ -42,6 +42,7 @@
             </foreach>
         </if>
         AND t.claim_type = 'claim_class'
+        and t.workflow_status = 1
         GROUP BY t.base_semester_id, t.class_id, t1.textbook_id),
         actual_claim_counts AS
         (SELECT base_semester_id, class_id, textbook_id, count(is_claim) AS claim_num

+ 40 - 0
src/main/resources/sqlScript/20250421_sql.sql

@@ -0,0 +1,40 @@
+ALTER TABLE professional_title ADD UNIQUE (professional_title_no);
+
+CREATE INDEX user_id_semester_id_index
+    ON textbook_student_claim (student_user_id, base_semester_id)
+    COMMENT '用户学期复合索引';
+
+CREATE INDEX class_id_semester_id_index
+    ON textbook_student_claim (class_id, base_semester_id)
+    COMMENT '班级学期复合索引';
+
+CREATE INDEX user_id_textbook_id_index
+    ON textbook_student_claim (student_user_id, textbook_id)
+    COMMENT '用户教材复合索引';
+
+ALTER TABLE base_student_school_roll
+  ADD COLUMN internship_state VARCHAR (20) NULL COMMENT '实习状态(xjr_dictionary_item[internship_state])' AFTER candidate_number;
+
+UPDATE base_student_school_roll SET internship_state = 'IT_0001' WHERE archives_status = 'FB2901';
+# 上面已经在正式服运行-------------------------------------------------------------
+
+ALTER TABLE attendance_statistics
+  ADD COLUMN remarks VARCHAR (500) NULL COMMENT '备注' AFTER attendance_days;
+  
+-- --------------------------------------------------------------------------------------------
+-- 班主任异动记录
+-- --------------------------------------------------------------------------------------------  
+DROP TABLE IF EXISTS base_class_teacher_change;   
+CREATE TABLE `base_class_teacher_change` (
+  `id` BIGINT NOT NULL,
+  `create_user_id` BIGINT DEFAULT NULL COMMENT '创建人',
+  `create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
+  `modify_user_id` BIGINT DEFAULT NULL COMMENT '修改人',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改日期',
+  `delete_mark` INT DEFAULT NULL COMMENT '删除标记',
+  `enabled_mark` INT DEFAULT NULL COMMENT '有效标记',
+  `class_id` BIGINT DEFAULT NULL COMMENT '班级id(base_class)',
+  before_teacher_id BIGINT DEFAULT NULL COMMENT '异动前班主任(xjr_user)',
+  after_teacher_id BIGINT DEFAULT NULL COMMENT '异动后班主任(xjr_user)',
+  PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='班主任异动记录表';

+ 34 - 0
src/main/resources/sqlScript/教材费用视图.sql

@@ -0,0 +1,34 @@
+DROP VIEW IF EXISTS v_cse_book1;
+create view v_cse_book1 as
+(
+with all_stu as (select t.base_semester_id,
+                        t.student_user_id
+                 from textbook_student_claim t
+                 group by t.base_semester_id,
+                          t.student_user_id)
+select t1.beltcode                                              AS `beltcode`,
+       t1.beltname                                              AS `beltname`,
+       t4.code                                              AS `speccode`,
+       t4.name                                              AS `specname`,
+       t3.code                                              AS `classcode`,
+       t3.name                                              AS `classname`,
+       '教材费'                                                 AS `feeitemname`,
+       ifnull((select sum(a.price)
+               from textbook_student_claim a
+               where a.is_claim = 1
+                 and a.base_semester_id = t.base_semester_id
+                 and a.student_user_id = t.student_user_id), 0) AS `totalmoney`,
+       t7.credential_number                                     AS `Personalid`,
+       t7.name                                                  AS `Feeobjname`,
+       ''                                                       AS `Remarks`
+from all_stu t
+         left join pb_semester_config t1 on t1.base_semester_id = t.base_semester_id
+         left join base_student_school_roll t2 on t2.user_id = t.student_user_id
+         left join base_class t3 on t3.id = t2.class_id
+         left join base_major_set t4 on t4.id = t3.major_set_id
+         left join xjr_user t7 on t7.id = t.student_user_id
+where t2.delete_mark = 0
+  and t3.delete_mark = 0
+  and t4.delete_mark = 0
+  and t7.delete_mark = 0
+    )

+ 5 - 0
src/main/resources/sqlScript/鸿合课表视图.sql

@@ -0,0 +1,5 @@
+CREATE VIEW course_table_view AS
+SELECT t1.class_id,t1.class_name,t1.teacher_name,t1.course_name, t2.short_name,t1.weeks_cn,t1.schedule_date,t1.start_time,t1.end_time FROM course_table t1
+LEFT JOIN class_time t2 ON t1.time_number = t2.number
+LEFT JOIN base_semester t3 ON t1.base_semester_id = t3.id
+WHERE t1.schedule_date >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY);

+ 1 - 0
src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest.java

@@ -386,6 +386,7 @@ class JianyuekbScheduleTaskTest {
                         .in(!courseAdjustIds.isEmpty(), WfCourseAdjust::getId, courseAdjustIds)
                         .and(wq -> wq.between(WfCourseAdjust::getAdjustDate, startDate, endDate).or().between(WfCourseAdjust::getExchangeDate, startDate, endDate))
                         .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                        .eq(WfCourseAdjust::getEnabledMark, EnabledMark.ENABLED.getCode())
         );
         List<WfCourseAdjust> cancelList = new ArrayList<>();//需要作废的申请
 

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff