Browse Source

Merge remote-tracking branch 'origin/dev' into dev

大数据与最优化研究所 1 month ago
parent
commit
bc091cd603
91 changed files with 2928 additions and 359 deletions
  1. 7 0
      src/main/java/com/xjrsoft/module/assessment/mapper/AssessmentPlanAnswerStudentMapper.java
  2. 6 2
      src/main/java/com/xjrsoft/module/assessment/service/impl/AssessmentTemplatePlanServiceImpl.java
  3. 26 4
      src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java
  4. 53 0
      src/main/java/com/xjrsoft/module/base/vo/BaseClassCourseMobileListVo.java
  5. 12 12
      src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java
  6. 1 1
      src/main/java/com/xjrsoft/module/evaluate/service/impl/EvaluateResultServiceImpl.java
  7. 30 0
      src/main/java/com/xjrsoft/module/job/ClassGraduateTask.java
  8. 66 1
      src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java
  9. 34 16
      src/main/java/com/xjrsoft/module/job/StudentDropOutTask.java
  10. 13 0
      src/main/java/com/xjrsoft/module/ledger/controller/LedgerCustomController.java
  11. 10 79
      src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java
  12. 19 0
      src/main/java/com/xjrsoft/module/ledger/dto/LedgerStatisticsPageDto.java
  13. 4 0
      src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsLeaveExcelVo.java
  14. 3 0
      src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsLeaveVo.java
  15. 2 0
      src/main/java/com/xjrsoft/module/oa/controller/NewsController.java
  16. 22 0
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  17. 10 135
      src/main/java/com/xjrsoft/module/personnel/controller/BasePersonnelLabourCapitalController.java
  18. 7 0
      src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalDto.java
  19. 3 0
      src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalMonthPageDto.java
  20. 3 1
      src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalPageDto.java
  21. 3 0
      src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalYearPageDto.java
  22. 6 0
      src/main/java/com/xjrsoft/module/personnel/entity/BasePersonnelLabourCapital.java
  23. 8 0
      src/main/java/com/xjrsoft/module/personnel/service/IBasePersonnelLabourCapitalService.java
  24. 177 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/BasePersonnelLabourCapitalServiceImpl.java
  25. 9 5
      src/main/java/com/xjrsoft/module/room/controller/RoomBedAdjustController.java
  26. 6 3
      src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java
  27. 6 1
      src/main/java/com/xjrsoft/module/schedule/service/ICourseReceiveMsgService.java
  28. 84 0
      src/main/java/com/xjrsoft/module/schedule/service/impl/CourseReceiveMsgServiceImpl.java
  29. 5 2
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  30. 16 1
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentAssessmentInspectionController.java
  31. 3 2
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  32. 4 0
      src/main/java/com/xjrsoft/module/student/dto/BaseStudentUserPageDto.java
  33. 17 0
      src/main/java/com/xjrsoft/module/student/dto/MajorGradeClassDto.java
  34. 6 0
      src/main/java/com/xjrsoft/module/student/dto/QuantitativeAssessmentSingleScoreDto.java
  35. 6 0
      src/main/java/com/xjrsoft/module/student/entity/BaseStudentAssessmentStudentRelation.java
  36. 2 1
      src/main/java/com/xjrsoft/module/student/service/IStudentManagerService.java
  37. 30 16
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentAssessmentInspectionServiceImpl.java
  38. 3 0
      src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java
  39. 28 5
      src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java
  40. 10 2
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentAssessmentInspectionMobileVo.java
  41. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java
  42. 2 2
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  43. 8 0
      src/main/java/com/xjrsoft/module/system/vo/SystemUpdateMessageVo.java
  44. 7 0
      src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java
  45. 8 0
      src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java
  46. 3 2
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  47. 13 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java
  48. 35 0
      src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java
  49. 10 2
      src/main/java/com/xjrsoft/module/xycxedu/controller/ExamPlanController.java
  50. 119 2
      src/main/java/com/xjrsoft/module/xycxedu/controller/ExamSubjectScoreController.java
  51. 136 0
      src/main/java/com/xjrsoft/module/xycxedu/controller/ExamSubjectScoreEnterController.java
  52. 42 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/AddExamSubjectScoreEnterDto.java
  53. 40 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/ClassStudentScorePageDto.java
  54. 29 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/ExamSubjectScoreEnterDto.java
  55. 54 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/ExamSubjectScoreEnterImportDto.java
  56. 35 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/ExamSubjectScoreEnterPageDto.java
  57. 34 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/UpdateExamSubjectScoreDto.java
  58. 24 0
      src/main/java/com/xjrsoft/module/xycxedu/dto/UpdateExamSubjectScoreEnterDto.java
  59. 7 1
      src/main/java/com/xjrsoft/module/xycxedu/entity/ExamSubjectScore.java
  60. 98 0
      src/main/java/com/xjrsoft/module/xycxedu/entity/ExamSubjectScoreEnter.java
  61. 24 0
      src/main/java/com/xjrsoft/module/xycxedu/mapper/ExamSubjectScoreEnterMapper.java
  62. 8 0
      src/main/java/com/xjrsoft/module/xycxedu/mapper/ExamSubjectScoreMappper.java
  63. 33 0
      src/main/java/com/xjrsoft/module/xycxedu/service/IExamSubjectScoreEnterService.java
  64. 24 0
      src/main/java/com/xjrsoft/module/xycxedu/service/IExamSubjectScoreService.java
  65. 362 0
      src/main/java/com/xjrsoft/module/xycxedu/service/impl/ExamSubjectScoreEnterServiceImpl.java
  66. 339 0
      src/main/java/com/xjrsoft/module/xycxedu/service/impl/ExamSubjectScoreServiceImpl.java
  67. 1 1
      src/main/java/com/xjrsoft/module/xycxedu/util/DataUtil.java
  68. 21 0
      src/main/java/com/xjrsoft/module/xycxedu/vo/ClassStudentScorePageVo.java
  69. 24 0
      src/main/java/com/xjrsoft/module/xycxedu/vo/ClassStudentScoreTitleVo.java
  70. 57 0
      src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterImportVo.java
  71. 69 0
      src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterPageVo.java
  72. 69 0
      src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterStudentVo.java
  73. 79 0
      src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterVo.java
  74. 4 1
      src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScorePageVo.java
  75. 1 1
      src/main/resources/mapper/banding/BandingTaskMajorConditionMapper.xml
  76. 9 0
      src/main/resources/mapper/organization/UserMapper.xml
  77. 7 3
      src/main/resources/mapper/personnel/BasePersonnelLabourCapitalMapper.xml
  78. 6 10
      src/main/resources/mapper/room/RoomBedMapper.xml
  79. 1 1
      src/main/resources/mapper/student/BaseNewStudentMapper.xml
  80. 35 23
      src/main/resources/mapper/student/BaseStudentAssessmentInspectionMapper.xml
  81. 3 0
      src/main/resources/mapper/student/BaseStudentMapper.xml
  82. 1 1
      src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml
  83. 1 1
      src/main/resources/mapper/student/EnrollmentPlanMajorSetMapper.xml
  84. 76 0
      src/main/resources/mapper/teacher/WfTeacherleaveMapper.xml
  85. 44 0
      src/main/resources/mapper/xycxedu/ExamSubjectScoreEnterMappper.xml
  86. 44 3
      src/main/resources/mapper/xycxedu/ExamSubjectScoreMappper.xml
  87. 21 0
      src/main/resources/sqlScript/20241230_sql.sql
  88. 32 0
      src/main/resources/sqlScript/20250106_sql.sql
  89. 2 1
      src/main/resources/sqlScript/视图信息.sql
  90. 38 15
      src/test/java/com/xjrsoft/module/job/StudentDropOutTaskTest.java
  91. 26 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 7 - 0
src/main/java/com/xjrsoft/module/assessment/mapper/AssessmentPlanAnswerStudentMapper.java

@@ -40,4 +40,11 @@ public interface AssessmentPlanAnswerStudentMapper extends MPJBaseMapper<Assessm
 
     @Select("SELECT submit_status FROM assessment_plan_answer_student WHERE delete_mark = 0 AND assessment_template_plan_id = #{id} and student_user_id = #{loginId}")
     Integer getSubmitStatus(Long id, Long loginId);
+
+    @Select("SELECT COUNT(t1.id) FROM assessment_plan_answer_student t1" +
+            " INNER JOIN base_student_school_roll t2 ON t1.student_user_id = t2.user_id" +
+            " INNER JOIN assessment_template_plan t3 ON t1.assessment_template_plan_id = t3.id" +
+            " WHERE t1.delete_mark = 0 AND t1.assessment_template_plan_id = #{id}" +
+            " AND t3.stduy_status like concat('%', t2.stduy_status,'%') AND t2.archives_status = 'FB2901' and t1.submit_status = 1")
+    Integer getSubmitStudentCount(Long id);
 }

+ 6 - 2
src/main/java/com/xjrsoft/module/assessment/service/impl/AssessmentTemplatePlanServiceImpl.java

@@ -83,6 +83,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -166,6 +167,8 @@ public class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<Assess
             dto.setClassIds(classIds);
         }
 
+        String[] stduyStatus = assessmentTemplatePlan.getStduyStatus().split(",");
+
         //存入班级,并根据选人方式存入答题学生
         for (Long classId : dto.getClassIds()) {
             AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
@@ -175,6 +178,7 @@ public class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<Assess
 
             MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
             query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+            .in(BaseStudentSchoolRoll::getStduyStatus, Arrays.asList(stduyStatus))
             .eq(BaseStudentSchoolRoll::getClassId, classId);
             List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
             for (XjrUser xjrUser : studentList) {
@@ -457,7 +461,7 @@ public class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<Assess
     public AssessmentTemplatePlanResultVo getQuestionResult(Long id) {
         AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(id);
         AssessmentTemplatePlanResultVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplatePlanResultVo.class);
-        vo.setStudentCount(studentMapper.getStudentCount(id));
+        vo.setStudentCount(studentMapper.getSubmitStudentCount(id));
         List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
             new QueryWrapper<AssessmentPlanQuestion>().lambda()
             .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
@@ -819,7 +823,7 @@ public class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<Assess
                         .select(XjrUser::getId)
                         .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
                         .innerJoin(BaseClass.class, BaseClass::getTeacherId, XjrUser::getId)
-                        .innerJoin(AssessmentPlanAnswerClass.class, AssessmentPlanAnswerClass::getClassId, XjrUser::getId)
+                        .innerJoin(AssessmentPlanAnswerClass.class, AssessmentPlanAnswerClass::getClassId, BaseClass::getId)
                         .eq(AssessmentPlanAnswerClass::getAssessmentTemplatePlanId, templatePlan.getId())
                         .eq(AssessmentPlanAnswerClass::getDeleteMark, DeleteMark.NODELETE.getCode())
         );

+ 26 - 4
src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java

@@ -27,11 +27,9 @@ import com.xjrsoft.module.base.service.IBaseClassCourseService;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
 import com.xjrsoft.module.base.service.IBaseSemesterService;
-import com.xjrsoft.module.base.vo.BaseClassCourseExcelVo;
-import com.xjrsoft.module.base.vo.BaseClassCourseListVo;
-import com.xjrsoft.module.base.vo.BaseClassCoursePageVo;
-import com.xjrsoft.module.base.vo.BaseClassCourseVo;
+import com.xjrsoft.module.base.vo.*;
 import com.xjrsoft.module.base.dto.ClassCourseTextbookExportQueryDto;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.service.ITextbookService;
 import io.swagger.annotations.Api;
@@ -118,6 +116,30 @@ public class BaseClassCourseController {
         return RT.ok(baseClassCourseListVoList);
     }
 
+    @GetMapping(value = "/mobile-list")
+    @ApiOperation(value = "单个班级班级课程列表")
+    @SaCheckPermission("baseclasscourse:detail")
+    public RT<List<BaseClassCourseMobileListVo>> mobileList(@Valid BaseClassCourseListDto dto) {
+        MPJLambdaWrapper<BaseClassCourse> baseClassCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        baseClassCourseMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(BaseClassCourse::getId)
+                .selectAs(BaseCourseSubject::getName, BaseClassCourseMobileListVo::getCourseName)
+                .selectAs(Textbook::getBookName, BaseClassCourseMobileListVo::getBookName)
+                .selectAs(Textbook::getPrice, BaseClassCourseMobileListVo::getPrice)
+                .selectAs(DictionaryDetail::getName, BaseClassCourseMobileListVo::getTextbookTypeName)
+                .select(BaseClassCourse.class, x -> VoToColumnUtil.fieldsToColumns(BaseClassCourseMobileListVo.class).contains(x.getProperty()))
+                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, BaseClassCourse::getCourseId)
+                .leftJoin(Textbook.class, Textbook::getId, BaseClassCourse::getTextbookId)
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,Textbook::getTextbookType)
+                .eq(dto.getBaseSemesterId() != null && dto.getBaseSemesterId() > 0, BaseClassCourse::getBaseSemesterId, dto.getBaseSemesterId())
+                .eq(dto.getClassId() != null && dto.getClassId() > 0, BaseClassCourse::getClassId, dto.getClassId())
+                .eq(BaseClassCourse::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ;
+        List<BaseClassCourseMobileListVo> baseClassCourseListVoList = baseClassCourseService.selectJoinList(BaseClassCourseMobileListVo.class, baseClassCourseMPJLambdaWrapper);
+        return RT.ok(baseClassCourseListVoList);
+    }
+
     @GetMapping("/getSemesterTree")
     @ApiOperation("获取年级树结构")
     @SaCheckPermission("baseclasscourse:detail")

+ 53 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassCourseMobileListVo.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.base.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class BaseClassCourseMobileListVo {
+
+    /**
+     *
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("")
+    private String id;
+    /**
+     * 班级id(base_class)
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班级id(base_class)")
+    private Long classId;
+
+    /**
+     * 课程id(base_course_subject)
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("课程id(base_course_subject)")
+    private Long courseId;
+
+    @ApiModelProperty("课程")
+    private String courseName;
+
+    /**
+     * 教材id(textbook)
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("教材id(textbook)")
+    private Long textbookId;
+    /**
+     * 教材(textbook)
+     */
+    @ApiModelProperty("教材(textbook)")
+    private String bookName;
+
+    @ExcelProperty("价格")
+    private BigDecimal price;
+
+    @ExcelProperty("类型")
+    private String textbookTypeName;
+}

+ 12 - 12
src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java

@@ -189,19 +189,19 @@ public class DataboardController {
     @ApiOperation(value="访客统计")
     @SaCheckPermission("databoard:detail")
     public RT<VisitorStatisticsVo> visitorStatistics(@Valid StatisticsDto dto){
-        List<VisitorOutInRecord> list = visitorService.list(
-                new QueryWrapper<VisitorOutInRecord>().lambda()
-                        .eq(VisitorOutInRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
-        );
         VisitorStatisticsVo result = new VisitorStatisticsVo();
-        result.setAllCount(list.size());
-        LocalDate today = LocalDate.now();
-        int todayCount = 0;
-        for (VisitorOutInRecord record : list) {
-            if(today.equals(record.getRecordTime().toLocalDate())){
-                todayCount ++;
-            }
-        }
+
+        String sql = "SELECT * FROM reservation_school_people t1" +
+                " INNER JOIN reservation_school t2 ON t1.reservation_schoo_id = t2.id" +
+                " INNER JOIN xjr_workflow_form_relation t3 ON CAST(t2.id AS CHAR) = t3.form_key_value" +
+                " WHERE t3.current_state = 'COMPLETED' AND t1.delete_mark = 0 AND t1.enabled_mark = 1" +
+                " AND t2.delete_mark = 0 AND t2.enabled_mark = 1";
+        int size = SqlRunnerAdapter.db().selectList(sql).size();
+        result.setAllCount(size);
+
+        sql += " AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN DATE_FORMAT(t2.start_time,'%Y-%m-%d') AND DATE_FORMAT(t2.end_time,'%Y-%m-%d')";
+
+        int todayCount = SqlRunnerAdapter.db().selectList(sql).size();
         result.setTodayCount(todayCount);
         return RT.ok(result);
     }

+ 1 - 1
src/main/java/com/xjrsoft/module/evaluate/service/impl/EvaluateResultServiceImpl.java

@@ -123,7 +123,7 @@ public class EvaluateResultServiceImpl extends MPJBaseServiceImpl<EvaluateResult
                 .eq(EvaluateObject::getEvaluateManageId, dto.getEvaluateManageId())
                 .eq((dto.getBaseGradeId() != null && dto.getBaseGradeId() > 0), BaseClass::getGradeId, dto.getBaseGradeId())
                 .eq((dto.getClassId() != null && dto.getClassId() > 0), BaseClass::getId, dto.getClassId())
-                .eq(!ObjectUtil.isNotNull(dto.getTeacherId()), EvaluateObject::getObjectId, dto.getTeacherId())
+                .eq(ObjectUtil.isNotNull(dto.getTeacherId()), EvaluateObject::getObjectId, dto.getTeacherId())
                 .like((dto.getName() != null && !("").equals(dto.getName())), XjrUser::getName, dto.getName())
                 .disableSubLogicDel();
         List<ResultViewingPageVo> list = evaluateObjectMapper.selectJoinList(ResultViewingPageVo.class, evaluateObjectMPJLambdaWrapper);

+ 30 - 0
src/main/java/com/xjrsoft/module/job/ClassGraduateTask.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.job;
+
+import com.xjrsoft.module.base.service.IBaseClassService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author dzx
+ * @date 2025/1/14
+ */
+@Component
+@Slf4j
+public class ClassGraduateTask {
+
+    @Autowired
+    private IBaseClassService classService;
+
+    @Scheduled(cron = "0 */15 23 30 6 ?")
+    public void execute() {
+        doExecute();
+    }
+
+    public void doExecute(){
+
+    }
+
+}
+

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

@@ -23,12 +23,18 @@ import com.xjrsoft.module.courseTable.dto.ClassTeacherDto;
 import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.service.ICourseTableService;
 import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.service.IDepartmentService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
 import com.xjrsoft.module.schedule.entity.CourseTableBak;
+import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
+import com.xjrsoft.module.schedule.service.ICourseReceiveMsgService;
 import com.xjrsoft.module.schedule.service.ICourseTableBakService;
+import com.xjrsoft.module.schedule.service.IJianyueDataService;
 import com.xjrsoft.module.schedule.service.IWfCourseAdjustService;
 import com.xjrsoft.module.schedule.util.DataUtil;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
@@ -55,6 +61,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -113,6 +120,7 @@ public class JianyuekbScheduleTask {
     private XjrWorkflowOperateRecordMapper xjrWorkflowOperateRecordMapper;
 
     private final static String wechatTemplate = "OO5Ryu9_6Hh5LQW0aKG7qu3g5uV8VxvBusq1i5UFesk";
+    private final static String noticeTeacherTemplate = "sHsmz7LRj7HLd7GSTS3r2jCLvK-4Wp19iGzEvYK8n_I";
 
     @Autowired
     private IWeChatService weChatService;
@@ -126,6 +134,15 @@ public class JianyuekbScheduleTask {
     @Autowired
     private IWorkflowExtraService workflowExtraService;
 
+    @Autowired
+    private IJianyueDataService jianyueDataService;
+
+    @Autowired
+    private IDepartmentService departmentService;
+
+    @Autowired
+    private ICourseReceiveMsgService receiveMsgService;
+
     @Scheduled(cron = "0 */10 * * * ?")
     public void execute(){
         doExecute();
@@ -266,10 +283,58 @@ public class JianyuekbScheduleTask {
         tableName = "base_classroom";
         Map<String, String> classroomMap = dataMap.get(tableName);
 
-        dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap, courseReceiveMsgId);
+        Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap, courseReceiveMsgId);
+        sendMsg(techerIds, courseReceiveMsgId);
         dataUtil.insertClassTime(scheduleInfo);
     }
 
+    void sendMsg(Set<String> techerIds, Long courseReceiveMsgId){
+        try {
+            CourseReceiveMsg receiveMsg = receiveMsgService.getById(courseReceiveMsgId);
+            JianyueData jianyueData = jianyueDataService.getOne(
+                    new QueryWrapper<JianyueData>().lambda()
+                            .eq(JianyueData::getSourceId, receiveMsg.getEduYearSerialNo())
+            );
+            String[] sourceId = jianyueData.getSourceId().split("_");
+            Department department = departmentService.getById(sourceId[0]);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            //通知对应教师
+            List<User> userList = userService.listByIds(new ArrayList<>(techerIds));
+            for (User user : userList) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setTemplateId(wechatTemplate);
+                JSONObject paramJson = new JSONObject();
+
+                JSONObject thing8 = new JSONObject();
+                thing8.put("value", "课表更新");
+                paramJson.put("thing8", thing8);
+
+                JSONObject thing2 = new JSONObject();
+                thing2.put("value", department.getName());
+                paramJson.put("thing2", thing2);
+
+                JSONObject thing6 = new JSONObject();
+                thing6.put("value", "教务处");
+                paramJson.put("thing6", thing6);
+
+                JSONObject time3 = new JSONObject();
+                time3.put("value", sdf.format(receiveMsg.getCreateDate()));
+                paramJson.put("time3", time3);
+
+                weChatSendMessageDto.setContent(paramJson);
+                weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
+
+                String openId = user.getOpenId();
+                if(openId != null && !"".equals(openId)){
+                    weChatSendMessageDto.setUserId(openId);
+                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+                }
+            }
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
+        }
+    }
+
     Map<String, Map<String, String>> initDataMap(){
         Map<String, Map<String, String>> dataMap = new HashMap<>();
         String sql = "SELECT distinct table_name FROM jianyue_data WHERE 1 = 1";

+ 34 - 16
src/main/java/com/xjrsoft/module/job/StudentDropOutTask.java

@@ -2,13 +2,15 @@ package com.xjrsoft.module.job;
 
 import cn.hutool.extra.spring.SpringUtil;
 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.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.hikvision.service.IHikvisionDataService;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
-import com.xjrsoft.module.personnel.service.IFaceManagementService;
 import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import lombok.extern.slf4j.Slf4j;
@@ -30,7 +32,7 @@ public class StudentDropOutTask {
     private IStundentFaceProcessService stundentFaceProcessService;
 
     @Autowired
-    private IFaceManagementService faceManagementService;
+    private IHikvisionDataService hikvisionDataService;
 
     @Scheduled(cron = "0 */30 * * * ?")
     public void execute() {
@@ -60,22 +62,38 @@ public class StudentDropOutTask {
             JsonParser parser = new JsonParser();
             for (StundentFaceProcess user : list) {
                 //删除海康人脸
-
-                JsonObject hikvisionResult = parser.parse(user.getHikvisionResult()).getAsJsonObject();
-                if(!hikvisionResult.get("msg").isJsonNull() && !"success".equals(hikvisionResult.get("msg").getAsString())){
-                    continue;
-                }
-                String faceId = hikvisionResult.get("data").getAsJsonObject().get("faceId").getAsString();
                 ApiUtil apiUtil = new ApiUtil();
-                String apiPath = "/api/resource/v1/face/single/delete";
-                JsonObject paramJson = new JsonObject();
-                paramJson.addProperty("faceId", faceId);
-                String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
+                String apiPath;
+                String faceId = null;
+                JsonObject paramJson;
+                if(user.getHikvisionResult() == null || !user.getHikvisionResult().startsWith("{\"code\":\"0\",\"msg\":\"success\"")){
+                    apiPath = "/api/resource/v1/person/condition/personInfo";
+                    paramJson = new JsonObject();
+                    paramJson.addProperty("paramName", "personId");
+                    JsonArray paramValue = new JsonArray();
+                    paramValue.add(hikvisionDataService.getHikvisionIdBySourceId(user.getUserId().toString()));
+                    paramJson.add("paramValue", paramValue);
+                    String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
+                    JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
+                    if(resultJson.get("code").getAsInt() == 0 && "success".equals(resultJson.get("msg").getAsString())){
+                        JsonElement data = resultJson.get("data").getAsJsonObject().get("list").getAsJsonArray().get(0);
+                        faceId = data.getAsJsonObject().get("personPhoto").getAsJsonArray().get(0).getAsJsonObject().get("personPhotoIndexCode").getAsString();
+                    }
+                }else{
+                    JsonObject hikvisionResult = parser.parse(user.getHikvisionResult()).getAsJsonObject();
+                    faceId = hikvisionResult.get("data").getAsJsonObject().get("faceId").getAsString();
+                }
+
+                if(faceId != null){
+                    apiPath = "/api/resource/v1/face/single/delete";
+                    paramJson = new JsonObject();
+                    paramJson.addProperty("faceId", faceId);
+                    String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
 
-                JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
-                if(resultJson.get("code").getAsInt() == 0){
-                    stundentFaceProcessService.removeById(user);
-                    faceManagementService.clearRegisterBase64ByUserId(user.getUserId());
+                    JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
+                    if(resultJson.get("code").getAsInt() == 0){
+                        stundentFaceProcessService.removeById(user);
+                    }
                 }
             }
 

+ 13 - 0
src/main/java/com/xjrsoft/module/ledger/controller/LedgerCustomController.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.ledger.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.db.Entity;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
@@ -16,6 +17,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.Map;
 
 /**
 * @title: 台账自定义接口
@@ -40,6 +45,14 @@ public class LedgerCustomController {
         Entity where = Entity.create(dto.getTableName());
         where.set("id", dto.getId());
 
+        Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(dto.getTableName(), where);
+        if(objectMap.containsKey("modify_user_id")){
+            params.set("modify_user_id", StpUtil.getLoginIdAsLong());
+        }
+        if(objectMap.containsKey("modify_date")){
+            params.set("modify_date", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        }
+
         return RT.ok(SqlRunnerAdapter.db().dynamicUpdate(dto.getTableName(), params, where));
     }
 

+ 10 - 79
src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
@@ -26,7 +27,6 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.vo.UserPageVo;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
-import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -41,7 +41,6 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.text.DecimalFormat;
-import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
@@ -82,47 +81,16 @@ public class LedgerStatisticsController {
             userIdList.addAll(userList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList()));
         }
 
-        LocalDateTime startTime = null;
-        LocalDateTime endTime = null;
         if(dto.getStartDate() != null && dto.getEndDate() != null){
-            startTime = dto.getStartDate().atTime(0,0,0);
-            endTime = dto.getEndDate().atTime(23,59,59);
+            dto.setStartTime(dto.getStartDate().atTime(0,0,0));
+            dto.setEndTime(dto.getEndDate().atTime(23,59,59));
         }
-        Map<String, List<WfTeacherleave>> userLeaveMap = teacherleaveService.getUserLeaveList(startTime, endTime, userIdList);
 
-        List<String> userIds = new ArrayList<>(userLeaveMap.keySet());
-        if(userIds.isEmpty()){
-            return RT.ok(new PageOutput<>());
-        }
-
-        IPage<LedgerStatisticsLeaveVo> userPage = userService.selectJoinListPage(ConventPage.getPage(dto), LedgerStatisticsLeaveVo.class,
-                new MPJLambdaWrapper<User>()
-                        .disableSubLogicDel()
-                        .select(User::getId)
-                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
-                        .select(" (SELECT GROUP_CONCAT(t1.name) FROM xjr_department t1" +
-                                " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
-                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id) as dept_name")
-                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
-                        .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
-                        .like(StrUtil.isNotEmpty(dto.getUserName()), User::getUserName, dto.getUserName())
-                        .in(User::getId, userIds)
-                        .orderByAsc(User::getId)
-        );
-
-        for (LedgerStatisticsLeaveVo record : userPage.getRecords()) {
-            List<WfTeacherleave> wfTeacherleaves = userLeaveMap.get(record.getId().toString());
-            if(wfTeacherleaves == null || wfTeacherleaves.isEmpty()){
-                continue;
-            }
-            double value = wfTeacherleaves.stream().mapToDouble(WfTeacherleave::getLeaveDays).sum();
-            boolean isInteger = (value % 1) == 0;
-            DecimalFormat df = new DecimalFormat(isInteger ? "0" : "#.##");
-            String formattedValue = df.format(value);
-            record.setLeaveDays(formattedValue);
+        if(!userIdList.isEmpty()){
+            dto.setUserIds(userIdList);
         }
-
-        PageOutput<LedgerStatisticsLeaveVo> pageOutput = ConventPage.getPageOutput(userPage, LedgerStatisticsLeaveVo.class);
+        Page<LedgerStatisticsLeaveVo> page = teacherleaveService.getStatisticsPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<LedgerStatisticsLeaveVo> pageOutput = ConventPage.getPageOutput(page, LedgerStatisticsLeaveVo.class);
         return RT.ok(pageOutput);
     }
 
@@ -143,50 +111,13 @@ public class LedgerStatisticsController {
             userIdList.addAll(userList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList()));
         }
 
-        LocalDateTime startTime = null;
-        LocalDateTime endTime = null;
-        if(dto.getStartDate() != null && dto.getEndDate() != null){
-            startTime = dto.getStartDate().atTime(0,0,0);
-            endTime = dto.getEndDate().atTime(23,59,59);
-        }
-        Map<String, List<WfTeacherleave>> userLeaveMap = teacherleaveService.getUserLeaveList(startTime, endTime, userIdList);
-
-        List<String> userIds = new ArrayList<>(userLeaveMap.keySet());
-        if(userIds.isEmpty()){
-            List<LedgerStatisticsLeaveExcelVo> list = new ArrayList<>();
-            ByteArrayOutputStream bot = new ByteArrayOutputStream();
-            EasyExcel.write(bot, LedgerStatisticsLeaveExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
-
-            return RT.fileStream(bot.toByteArray(), "teacher-leave" + ExcelTypeEnum.XLSX.getValue());
+        if(!userIdList.isEmpty()){
+            dto.setUserIds(userIdList);
         }
-
-        List<LedgerStatisticsLeaveVo> list = userService.selectJoinList(LedgerStatisticsLeaveVo.class,
-                new MPJLambdaWrapper<User>()
-                        .disableSubLogicDel()
-                        .select(User::getId)
-                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
-                        .select(" (SELECT GROUP_CONCAT(t1.name) FROM xjr_department t1" +
-                                " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
-                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id) as dept_name")
-                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
-                        .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
-                        .like(StrUtil.isNotEmpty(dto.getUserName()), User::getUserName, dto.getUserName())
-                        .in(User::getId, userIds)
-                        .orderByAsc(User::getId)
-        );
+        List<LedgerStatisticsLeaveVo> list = teacherleaveService.getStatisticsList(dto);
         List<LedgerStatisticsLeaveExcelVo> dataList = new ArrayList<>();
-
         int sortCode = 1;
         for (LedgerStatisticsLeaveVo record : list) {
-            List<WfTeacherleave> wfTeacherleaves = userLeaveMap.get(record.getId().toString());
-            if(wfTeacherleaves == null || wfTeacherleaves.isEmpty()){
-                continue;
-            }
-            double value = wfTeacherleaves.stream().mapToDouble(WfTeacherleave::getLeaveDays).sum();
-            boolean isInteger = (value % 1) == 0;
-            DecimalFormat df = new DecimalFormat(isInteger ? "0" : "#.##");
-            String formattedValue = df.format(value);
-            record.setLeaveDays(formattedValue);
             record.setSortCode(sortCode);
             LedgerStatisticsLeaveExcelVo bean = BeanUtil.toBean(record, LedgerStatisticsLeaveExcelVo.class);
             dataList.add(bean);

+ 19 - 0
src/main/java/com/xjrsoft/module/ledger/dto/LedgerStatisticsPageDto.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.ledger.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -7,6 +8,8 @@ import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
 
 
 /**
@@ -35,4 +38,20 @@ public class LedgerStatisticsPageDto extends PageInput {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("请假结束日期")
     private LocalDate endDate;
+
+    @JsonIgnore
+    @ApiModelProperty("请假开始日期")
+    private LocalDateTime startTime;
+
+    @JsonIgnore
+    @ApiModelProperty("请假结束日期")
+    private LocalDateTime endTime;
+
+    @JsonIgnore
+    @ApiModelProperty("用户ids")
+    private List<Long> userIds;
+
+
+    @ApiModelProperty("请假类型")
+    private String leaveType;
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsLeaveExcelVo.java

@@ -30,6 +30,10 @@ public class LedgerStatisticsLeaveExcelVo{
     @ApiModelProperty("所属部门")
     private String deptName;
 
+    @ExcelProperty("请假类型")
+    @ApiModelProperty("请假类型")
+    private String leaveType;
+
     @ExcelProperty("请假天数")
     @ApiModelProperty("请假天数")
     private String leaveDays;

+ 3 - 0
src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsLeaveVo.java

@@ -18,4 +18,7 @@ public class LedgerStatisticsLeaveVo extends LedgerStatisticsPageVo{
     @ApiModelProperty("请假天数")
     private String leaveDays;
 
+    @ExcelProperty("请假类型")
+    @ApiModelProperty("请假类型")
+    private String leaveType;
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/oa/controller/NewsController.java

@@ -357,6 +357,7 @@ public class NewsController {
                                 .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
                                 .eq(News::getTypeId, typeId)
                                 .eq(NewsRelation::getReadMark, 0)
+                                .gt(News::getSendEndDate, LocalDateTime.now())
                 );
                 newsCountTypeVo.setTypeId(typeId);
                 newsCountTypeVo.setTotal(notReadCount);
@@ -380,6 +381,7 @@ public class NewsController {
                                 .eq(News::getStatus, 2)
                                 .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
                                 .eq(News::getTypeId, typeId)
+                                .gt(News::getSendEndDate, LocalDateTime.now())
                                 .eq(NewsRelation::getReadMark, 0)
                 );
 

+ 22 - 0
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -85,6 +85,7 @@ import com.xjrsoft.module.organization.vo.UserStudentInfoVo;
 import com.xjrsoft.module.organization.vo.UserStudentVo;
 import com.xjrsoft.module.organization.vo.UserVo;
 import com.xjrsoft.module.oss.factory.OssFactory;
+import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
@@ -231,6 +232,16 @@ public class UserController {
                     .leftJoin(DictionaryDetail.class, "d1", DictionaryDetail::getCode, BaseTeacher::getEmployWay)
                     .leftJoin(DictionaryDetail.class, "d2", DictionaryDetail::getCode, BaseTeacher::getEmployType)
                     .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
+
+            if(ObjectUtil.isNotNull(dto.getUserType())) {
+                if (dto.getUserType() == 2) {
+                    queryUser.eq(BaseTeacher::getIsNormal, 1);
+                }
+                if (dto.getUserType() == 3) {
+                    queryUser.leftJoin(BaseStudent.class, BaseStudent::getUserId, User::getId)
+                            .eq(BaseStudent::getIsNormal, 1);
+                }
+            }
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class, queryUser);
             for (UserPageVo record : page.getRecords()) {
                 record.setGenderCn(GenderDictionaryEnum.getValue(record.getGender()));
@@ -283,6 +294,17 @@ public class UserController {
                             .leftJoin(DictionaryDetail.class, "d1", DictionaryDetail::getCode, BaseTeacher::getEmployWay)
                             .leftJoin(DictionaryDetail.class, "d2", DictionaryDetail::getCode, BaseTeacher::getEmployType)
                             .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
+
+            if(ObjectUtil.isNotNull(dto.getUserType())) {
+                if (dto.getUserType() == 2) {
+                    queryUser.eq(BaseTeacher::getIsNormal, 1);
+                }
+                if (dto.getUserType() == 3) {
+                    queryUser.leftJoin(BaseStudent.class, BaseStudent::getUserId, User::getId)
+                            .eq(BaseStudent::getIsNormal, 1);
+                }
+            }
+
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,queryUser);
             for (UserPageVo record : page.getRecords()) {
                 record.setGenderCn(GenderDictionaryEnum.getValue(record.getGender()));

+ 10 - 135
src/main/java/com/xjrsoft/module/personnel/controller/BasePersonnelLabourCapitalController.java

@@ -3,7 +3,6 @@ package com.xjrsoft.module.personnel.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.EasyExcel;
-import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -17,19 +16,14 @@ import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalPageDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto;
 import com.xjrsoft.module.personnel.dto.UpdateBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
-import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapitalData;
-import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapitalTitle;
 import com.xjrsoft.module.personnel.service.IBasePersonnelLabourCapitalService;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalMonthPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo;
-import com.xjrsoft.module.weekly.dto.WeeklyDutySchedulePageDto;
-import com.yomahub.liteflow.util.JsonUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -41,11 +35,8 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -71,7 +62,8 @@ public class BasePersonnelLabourCapitalController {
 
         LambdaQueryWrapper<BasePersonnelLabourCapital> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper
-                    .orderByDesc(BasePersonnelLabourCapital::getId)
+                .orderByDesc(BasePersonnelLabourCapital::getId)
+                .eq(BasePersonnelLabourCapital::getCategory, dto.getCategory())
                 .select(BasePersonnelLabourCapital.class,x -> VoToColumnUtil.fieldsToColumns(BasePersonnelLabourCapitalPageVo.class).contains(x.getProperty()));
         IPage<BasePersonnelLabourCapital> page = basePersonnelLabourCapitalService.page(ConventPage.getPage(dto), queryWrapper);
         PageOutput<BasePersonnelLabourCapitalPageVo> pageOutput = ConventPage.getPageOutput(page, BasePersonnelLabourCapitalPageVo.class);
@@ -136,135 +128,18 @@ public class BasePersonnelLabourCapitalController {
     @PostMapping("/import")
     @ApiOperation(value = "导入")
     public RT<Boolean> importData(@Valid AddBasePersonnelLabourCapitalDto dto, @RequestParam("file") MultipartFile file) throws IOException, ParseException {
+        if(dto.getCategory() == null){
+            return RT.error("类别不能为空");
+        }
         List<Map<Integer, Object>> excelDataList = EasyExcel.read(file.getInputStream()).sheet().headRowNumber(4 - 1).doReadSync();
         //验证数据
 
-        //构造数据
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        BasePersonnelLabourCapital basePersonnelLabourCapital = BeanUtil.toBean(dto, BasePersonnelLabourCapital.class);
-        basePersonnelLabourCapital.setDataRow(4);
-        basePersonnelLabourCapital.setPersonnelNameColumn(3);
-        basePersonnelLabourCapital.setAmountToColumn(4);
-        basePersonnelLabourCapital.setIdTypeColumn(0);
-        basePersonnelLabourCapital.setIdNumberColumn(1);
-        basePersonnelLabourCapital.setJobNumberColumn(2);
-        basePersonnelLabourCapital.setDateOfIssue(sdf.parse(dto.getDateOfIssue()));
-
-        //处理表头数据,目前只支持2行表头
-        List<BasePersonnelLabourCapitalTitle> titleList = initTitleList(excelDataList.get(0), excelDataList.get(1), basePersonnelLabourCapital);
-        //读取表内容数据
-        List<BasePersonnelLabourCapitalData> dataList = initDataList(dto, excelDataList);
-
-        //添加表头数据
-        basePersonnelLabourCapital.setBasePersonnelLabourCapitalTitleList(titleList);
-        basePersonnelLabourCapital.setBasePersonnelLabourCapitalDataList(dataList);
-
-        Boolean result = basePersonnelLabourCapitalService.add(basePersonnelLabourCapital);
-        return RT.ok(result);
-    }
-
-    /**
-     * 处理教师工资数据
-     * @param excelDataList 表格数据
-     * @return 返回集合
-     */
-    List<BasePersonnelLabourCapitalData> initDataList(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList){
-        List<BasePersonnelLabourCapitalData> resultList = new ArrayList<>();
-        for (int i = 0; i < excelDataList.size(); i ++){
-            //跳过表头
-            if(i < 2){
-                continue;
-            }
-            Map<Integer, Object> datatMap = excelDataList.get(i);
-            BasePersonnelLabourCapitalData data = new BasePersonnelLabourCapitalData();
-            data.setName(datatMap.get(3) == null?null:datatMap.get(3).toString());
-            data.setIdNumber(datatMap.get(1) == null?null:datatMap.get(1).toString());
-            data.setIdType(datatMap.get(0) == null?null:datatMap.get(0).toString());
-            data.setAmountTo(datatMap.get(4) == null?null:datatMap.get(4).toString());
-            data.setJobNumber(datatMap.get(2) == null?null:datatMap.get(2).toString());
-            for (Integer integer : datatMap.keySet()) {
-                Object o = datatMap.get(integer);
-                if(o != null && o.toString().startsWith("(") && o.toString().endsWith(")")){
-                    datatMap.put(integer, "-" + o.toString().replace("(", "").replace(")", ""));
-                }
-            }
-            String jsonString = JsonUtil.toJsonString(datatMap);
-            jsonString = jsonString.replaceAll("- 0", "-");
-            data.setExtendJson(jsonString);
-            resultList.add(data);
+        if(dto.getCategory() == 1){
+            basePersonnelLabourCapitalService.importLabourCapitalData(dto, excelDataList);
+        }else if(dto.getCategory() == 2){
+            basePersonnelLabourCapitalService.importSocialSecurityData(dto, excelDataList);
         }
-
-        return resultList;
-    }
-
-    /**
-     * 处理表头数据
-     * @param titleRow1 第一行数据
-     * @param titleRow2 第二行数据
-     * @return 返回集合
-     */
-    List<BasePersonnelLabourCapitalTitle> initTitleList(Map<Integer, Object> titleRow1, Map<Integer, Object> titleRow2, BasePersonnelLabourCapital capital){
-        List<BasePersonnelLabourCapitalTitle> resultList = new ArrayList<>();
-        //识别第一行
-        int mergeColumns = 0, mergeRows = 0;
-        for (Integer column : titleRow1.keySet()) {
-            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
-            Object value = titleRow1.get(column);
-            if(value == null){
-                mergeColumns = 0;
-                continue;
-            }
-            for (int i = column + 1; i < titleRow1.size(); i ++){
-                Object mergeValue = titleRow1.get(i);
-                if(mergeValue != null){
-                    break;
-                }
-                mergeColumns ++;
-            }
-
-            Object value2 = titleRow2.get(column);
-            if(value2 == null){
-                mergeRows = 2;
-            }
-
-            title.setName(value.toString());
-            title.setColumnNumber(column);
-            title.setRowsNumber(capital.getDataRow() - 1);
-            title.setMergeColumns(mergeColumns);
-            title.setMergeRows(mergeRows);
-            resultList.add(title);
-
-            mergeColumns = 0;
-            mergeRows = 0;
-        }
-
-        //识别第二行
-        for (Integer column : titleRow2.keySet()) {
-            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
-            Object value = titleRow2.get(column);
-            if(value == null){
-                continue;
-            }
-
-            title.setName(value.toString());
-            title.setColumnNumber(column);
-            title.setRowsNumber(capital.getDataRow());
-            title.setMergeColumns(mergeColumns);
-            title.setMergeRows(mergeRows);
-            resultList.add(title);
-        }
-
-        return resultList;
-    }
-
-    @GetMapping("/export")
-    @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid WeeklyDutySchedulePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
-        List<BasePersonnelLabourCapital> list = basePersonnelLabourCapitalService.list();
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, BasePersonnelLabourCapital.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
-
-        return RT.fileStream(bot.toByteArray(), "BasePersonnelLabourCapital" + ExcelTypeEnum.XLSX.getValue());
+        return RT.ok(true);
     }
 
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalDto.java

@@ -29,4 +29,11 @@ public class AddBasePersonnelLabourCapitalDto implements Serializable {
     @ApiModelProperty("发放年月")
     private String dateOfIssue;
 
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
+
+
+    @ApiModelProperty("年份")
+    private Integer year;
+
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalMonthPageDto.java

@@ -22,4 +22,7 @@ public class BasePersonnelLabourCapitalMonthPageDto extends PageInput {
 
     @ApiModelProperty("工号")
     public String jobNumber;
+
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
 }

+ 3 - 1
src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalPageDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.personnel.dto;
 
 import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -15,5 +16,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class BasePersonnelLabourCapitalPageDto extends PageInput {
 
-
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalYearPageDto.java

@@ -25,4 +25,7 @@ public class BasePersonnelLabourCapitalYearPageDto extends PageInput {
 
     @ApiModelProperty("姓名")
     public String name;
+
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/personnel/entity/BasePersonnelLabourCapital.java

@@ -132,4 +132,10 @@ public class BasePersonnelLabourCapital implements Serializable {
     @EntityMapping(thisField = "id", joinField = "labourCapitalId")
     private List<BasePersonnelLabourCapitalTitle> basePersonnelLabourCapitalTitleList;
 
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category;
+
+    @ApiModelProperty("年份")
+    private Integer year;
+
 }

+ 8 - 0
src/main/java/com/xjrsoft/module/personnel/service/IBasePersonnelLabourCapitalService.java

@@ -2,13 +2,16 @@ package com.xjrsoft.module.personnel.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.personnel.dto.AddBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalMonthPageDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalMonthPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo;
 
+import java.text.ParseException;
 import java.util.List;
+import java.util.Map;
 
 /**
 * @title: 工资发放
@@ -44,4 +47,9 @@ public interface IBasePersonnelLabourCapitalService extends MPJBaseService<BaseP
 
     Page<BasePersonnelLabourCapitalMonthPageVo> getMonthPage(Page<BasePersonnelLabourCapitalMonthPageDto> page, BasePersonnelLabourCapitalMonthPageDto dto);
     Page<BasePersonnelLabourCapitalYearPageVo> getYearPage(Page<BasePersonnelLabourCapitalYearPageDto> page, BasePersonnelLabourCapitalYearPageDto dto);
+
+
+    Boolean importLabourCapitalData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException;
+
+    Boolean importSocialSecurityData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException;
 }

+ 177 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/BasePersonnelLabourCapitalServiceImpl.java

@@ -1,13 +1,18 @@
 package com.xjrsoft.module.personnel.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.personnel.dto.AddBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalMonthPageDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
@@ -19,12 +24,24 @@ import com.xjrsoft.module.personnel.mapper.BasePersonnelLabourCapitalTitleMapper
 import com.xjrsoft.module.personnel.service.IBasePersonnelLabourCapitalService;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalMonthPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo;
+import com.xjrsoft.module.weekly.dto.WeeklyDutySchedulePageDto;
+import com.yomahub.liteflow.util.JsonUtil;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -75,6 +92,166 @@ public class BasePersonnelLabourCapitalServiceImpl extends MPJBaseServiceImpl<Ba
         return labourCapitalMapper.getYearPage(page, dto);
     }
 
+    /**
+     * 导入工资条数据
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean importLabourCapitalData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException {
+        //构造数据
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        BasePersonnelLabourCapital basePersonnelLabourCapital = BeanUtil.toBean(dto, BasePersonnelLabourCapital.class);
+        basePersonnelLabourCapital.setDataRow(4);
+        basePersonnelLabourCapital.setPersonnelNameColumn(3);
+        basePersonnelLabourCapital.setAmountToColumn(4);
+        basePersonnelLabourCapital.setIdTypeColumn(0);
+        basePersonnelLabourCapital.setIdNumberColumn(1);
+        basePersonnelLabourCapital.setJobNumberColumn(2);
+        basePersonnelLabourCapital.setDateOfIssue(sdf.parse(dto.getDateOfIssue()));
+
+        //处理表头数据,目前只支持2行表头
+        List<BasePersonnelLabourCapitalTitle> titleList = initTitleList(excelDataList.get(0), excelDataList.get(1), basePersonnelLabourCapital);
+        //读取表内容数据
+        List<BasePersonnelLabourCapitalData> dataList = initDataList(dto, excelDataList, 2);
+
+        //添加表头数据
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalTitleList(titleList);
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalDataList(dataList);
+
+        return this.add(basePersonnelLabourCapital);
+    }
+
+    @Override
+    public Boolean importSocialSecurityData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException {
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        BasePersonnelLabourCapital basePersonnelLabourCapital = BeanUtil.toBean(dto, BasePersonnelLabourCapital.class);
+        basePersonnelLabourCapital.setDataRow(4);
+        basePersonnelLabourCapital.setPersonnelNameColumn(3);
+        basePersonnelLabourCapital.setIdTypeColumn(0);
+        basePersonnelLabourCapital.setIdNumberColumn(1);
+        basePersonnelLabourCapital.setJobNumberColumn(2);
+        basePersonnelLabourCapital.setDateOfIssue(sdf.parse(dto.getDateOfIssue()));
+        basePersonnelLabourCapital.setYear(basePersonnelLabourCapital.getDateOfIssue().getYear());
+
+        List<BasePersonnelLabourCapitalTitle> titleList = initTitleList(excelDataList.get(0), new LinkedHashMap<>(), basePersonnelLabourCapital);
+        List<BasePersonnelLabourCapitalData> dataList = initDataList(dto, excelDataList, 1);
+
+        //添加表头数据
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalTitleList(titleList);
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalDataList(dataList);
+
+        return this.add(basePersonnelLabourCapital);
+    }
+
+
+    /**
+     * 处理教师工资数据
+     * @param excelDataList 表格数据
+     * @return 返回集合
+     */
+    List<BasePersonnelLabourCapitalData> initDataList(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList, int titleRowNumber){
+        List<BasePersonnelLabourCapitalData> resultList = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i ++){
+            //跳过表头
+            if(i < titleRowNumber){
+                continue;
+            }
+            Map<Integer, Object> datatMap = excelDataList.get(i);
+            BasePersonnelLabourCapitalData data = new BasePersonnelLabourCapitalData();
+            data.setName(datatMap.get(3) == null?null:datatMap.get(3).toString());
+            data.setIdNumber(datatMap.get(1) == null?null:datatMap.get(1).toString());
+            data.setIdType(datatMap.get(0) == null?null:datatMap.get(0).toString());
+            data.setAmountTo(datatMap.get(4) == null?null:datatMap.get(4).toString());
+            data.setJobNumber(datatMap.get(2) == null?null:datatMap.get(2).toString());
+            for (Integer integer : datatMap.keySet()) {
+                Object o = datatMap.get(integer);
+                if(o != null && o.toString().startsWith("(") && o.toString().endsWith(")")){
+                    datatMap.put(integer, "-" + o.toString().replace("(", "").replace(")", ""));
+                }
+            }
+            String jsonString = JsonUtil.toJsonString(datatMap);
+            jsonString = jsonString.replaceAll("- 0", "-");
+            data.setExtendJson(jsonString);
+            resultList.add(data);
+        }
+
+        return resultList;
+    }
+
+    /**
+     * 处理表头数据
+     * @param titleRow1 第一行数据
+     * @param titleRow2 第二行数据
+     * @return 返回集合
+     */
+    List<BasePersonnelLabourCapitalTitle> initTitleList(Map<Integer, Object> titleRow1, Map<Integer, Object> titleRow2, BasePersonnelLabourCapital capital){
+        List<BasePersonnelLabourCapitalTitle> resultList = new ArrayList<>();
+        //识别第一行
+        int mergeColumns = 0, mergeRows = 0;
+        for (Integer column : titleRow1.keySet()) {
+            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
+            Object value = titleRow1.get(column);
+            if(value == null){
+                mergeColumns = 0;
+                continue;
+            }
+            for (int i = column + 1; i < titleRow1.size(); i ++){
+                Object mergeValue = titleRow1.get(i);
+                if(mergeValue != null){
+                    break;
+                }
+                mergeColumns ++;
+            }
+
+            Object value2 = titleRow2.get(column);
+            if(value2 == null){
+                mergeRows = 2;
+            }
+
+            title.setName(value.toString());
+            title.setColumnNumber(column);
+            title.setRowsNumber(capital.getDataRow() - 1);
+            title.setMergeColumns(mergeColumns);
+            title.setMergeRows(mergeRows);
+            resultList.add(title);
+
+            mergeColumns = 0;
+            mergeRows = 0;
+        }
+
+        //识别第二行
+        for (Integer column : titleRow2.keySet()) {
+            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
+            Object value = titleRow2.get(column);
+            if(value == null){
+                continue;
+            }
+
+            title.setName(value.toString());
+            title.setColumnNumber(column);
+            title.setRowsNumber(capital.getDataRow());
+            title.setMergeColumns(mergeColumns);
+            title.setMergeRows(mergeRows);
+            resultList.add(title);
+        }
+
+        return resultList;
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid WeeklyDutySchedulePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<BasePersonnelLabourCapital> list = this.list();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, BasePersonnelLabourCapital.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "BasePersonnelLabourCapital" + ExcelTypeEnum.XLSX.getValue());
+    }
+
+
+
+
     private String getBpName(Long labourCapitalId, String columnNumber) {
         List<BasePersonnelLabourCapitalTitle> bpTitles = capitalTitleMapper.selectList(
                 Wrappers.<BasePersonnelLabourCapitalTitle>lambdaQuery()

+ 9 - 5
src/main/java/com/xjrsoft/module/room/controller/RoomBedAdjustController.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -85,9 +86,11 @@ public class RoomBedAdjustController {
 
         long teacherId = StpUtil.getLoginIdAsLong();
         List<BaseClass> classList = baseClassService.list(
-                new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getTeacherId, teacherId)
+                new QueryWrapper<BaseClass>().lambda()
+                        .eq(BaseClass::getTeacherId, teacherId)
+                        .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
         );
-        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getRoomId() != null){
+        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getRoomId() == null){
             if(classList != null && !classList.isEmpty()){
                 dto.setClassId(classList.get(0).getId());
             }
@@ -160,13 +163,14 @@ public class RoomBedAdjustController {
 
         long teacherId = StpUtil.getLoginIdAsLong();
         List<BaseClass> classList = baseClassService.list(
-                new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getTeacherId, teacherId)
+                new QueryWrapper<BaseClass>().lambda()
+                        .eq(BaseClass::getTeacherId, teacherId)
+                        .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
         );
-        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getRoomId() != null){
+        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
             if(classList != null && !classList.isEmpty()){
                 dto.setClassId(classList.get(0).getId());
             }
-            //dto.setIsTeacher(1);
         }
         List<TeacherRoomListVo> teacherRoomList = roomBedService.getTeacherRoomList(dto);
         return RT.ok(teacherRoomList);

+ 6 - 3
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -88,8 +88,9 @@ public class ScheduleController {
     @ApiOperation(value="接收消息")
     @SaCheckPermission("schedule:detail")
     public RT<CourseReceiveMsg> receiveMsg(@RequestParam String schoolId, @RequestParam String eduYearSerialNo, @RequestParam String startDate, @RequestParam String endDate) throws Exception {
+        Date date = new Date();
         CourseReceiveMsg courseReceiveMsg = new CourseReceiveMsg();
-        courseReceiveMsg.setCreateDate(new Date());
+        courseReceiveMsg.setCreateDate(date);
         courseReceiveMsg.setSchoolId(schoolId);
         courseReceiveMsg.setEduYearSerialNo(eduYearSerialNo);
         courseReceiveMsg.setStartDate(startDate);
@@ -98,6 +99,8 @@ public class ScheduleController {
         courseReceiveMsg.setEnabledMark(EnabledMark.ENABLED.getCode());
         courseReceiveMsgService.save(courseReceiveMsg);
 
+        courseReceiveMsgService.noticeOverseer(eduYearSerialNo, date);
+
         return RT.ok(courseReceiveMsg);
     }
 
@@ -158,7 +161,7 @@ public class ScheduleController {
     public RT<Integer> currentWeek(CourseTableDto dto){
         BaseSemester baseSemester = semesterService.getCurrentSemester();
         if(baseSemester == null){
-            return RT.error("未能查询到当前周次");
+            return RT.ok();
         }
         LocalDateTime now = LocalDateTime.now();
         if(dto.getScheduleDate() != null){
@@ -180,7 +183,7 @@ public class ScheduleController {
             }
         }
 
-        return RT.error("未能查询到当前周次");
+        return RT.ok();
     }
 
 

+ 6 - 1
src/main/java/com/xjrsoft/module/schedule/service/ICourseReceiveMsgService.java

@@ -3,6 +3,8 @@ package com.xjrsoft.module.schedule.service;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
 
+import java.util.Date;
+
 /**
 * @title: 班级荣誉
 * @Author szs
@@ -13,5 +15,8 @@ import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
 public interface ICourseReceiveMsgService extends MPJBaseService<CourseReceiveMsg> {
 
 
-
+    /**
+     * 通知督导室
+     */
+    Boolean noticeOverseer(String eduYearSerialNo, Date sendDate);
 }

+ 84 - 0
src/main/java/com/xjrsoft/module/schedule/service/impl/CourseReceiveMsgServiceImpl.java

@@ -1,12 +1,32 @@
 package com.xjrsoft.module.schedule.service.impl;
 
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.entity.Role;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.organization.service.IWeChatService;
 import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
+import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.schedule.mapper.CourseReceiveMsgMapper;
 import com.xjrsoft.module.schedule.service.ICourseReceiveMsgService;
+import com.xjrsoft.module.schedule.service.IJianyueDataService;
 import lombok.AllArgsConstructor;
+import me.zhyd.oauth.log.Log;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
 /**
 * @title: 干部部门
 * @Author szs
@@ -16,4 +36,68 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class CourseReceiveMsgServiceImpl extends MPJBaseServiceImpl<CourseReceiveMsgMapper, CourseReceiveMsg> implements ICourseReceiveMsgService {
+    private final IUserService userService;
+    private final IJianyueDataService jianyueDataService;
+    private final IDepartmentService departmentService;
+    private final IWeChatService weChatService;
+
+
+    @Override
+    public Boolean noticeOverseer(String eduYearSerialNo, Date sendDate) {
+        try {
+            JianyueData jianyueData = jianyueDataService.getOne(
+                    new QueryWrapper<JianyueData>().lambda()
+                            .eq(JianyueData::getSourceId, eduYearSerialNo)
+            );
+            String[] sourceId = jianyueData.getSourceId().split("_");
+            Department department = departmentService.getById(sourceId[0]);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+            String wechatTemplate = "sHsmz7LRj7HLd7GSTS3r2jCLvK-4Wp19iGzEvYK8n_I";
+
+            String roleCode = "KEBIAOGX";
+            List<User> userList = userService.list(
+                    new MPJLambdaWrapper<User>()
+                            .select(User::getId)
+                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                            .innerJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
+                            .innerJoin(Role.class, Role::getId, UserRoleRelation::getRoleId)
+                            .eq(Role::getCode, roleCode)
+            );
+
+            for (User user : userList) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setTemplateId(wechatTemplate);
+                JSONObject paramJson = new JSONObject();
+
+                JSONObject thing8 = new JSONObject();
+                thing8.put("value", "课表更新");
+                paramJson.put("thing8", thing8);
+
+                JSONObject thing2 = new JSONObject();
+                thing2.put("value", department.getName());
+                paramJson.put("thing2", thing2);
+
+                JSONObject thing6 = new JSONObject();
+                thing6.put("value", "教务处");
+                paramJson.put("thing6", thing6);
+
+                JSONObject time3 = new JSONObject();
+                time3.put("value", sdf.format(sendDate));
+                paramJson.put("time3", time3);
+
+                weChatSendMessageDto.setContent(paramJson);
+                weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
+
+                String openId = user.getOpenId();
+                if(openId != null && !"".equals(openId)){
+                    weChatSendMessageDto.setUserId(openId);
+                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+                }
+            }
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
+        }
+        return true;
+    }
 }

+ 5 - 2
src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java

@@ -618,7 +618,7 @@ public class DataUtil {
         }
     }
 
-    public void insertCourseTableEntiy(JsonArray data, Map<String, String> classroomMap, Map<String, String> coureseMap,
+    public Set<String> insertCourseTableEntiy(JsonArray data, Map<String, String> classroomMap, Map<String, String> coureseMap,
                                   Map<String, String> semesterMap, Map<String, String> teacherMap, Map<String, String> classMap
             , Long courseReceiveMsgId) {
 
@@ -641,7 +641,7 @@ public class DataUtil {
             }
             serialNos.add(objectMap.get("jianyue_id").toString());
         }
-
+        Set<String> teacherIdList = new HashSet<>();
         for (JsonElement jsonElement : data) {
             JsonObject asJsonObject = jsonElement.getAsJsonObject();
             JsonArray teachers = asJsonObject.get("teachers").getAsJsonArray();
@@ -665,6 +665,7 @@ public class DataUtil {
                 teacherIds.add(teacherMap.get(teacherJson.get("teacherSerialNo").getAsString())==null?"0":teacherMap.get(teacherJson.get("teacherSerialNo").getAsString()));
                 teacherNames.add(teacherJson.get("name").getAsString());
                 teacher_serial_nos.add(teacherJson.get("teacherSerialNo").getAsString());
+                teacherIdList.add(teacherMap.get(teacherJson.get("teacherSerialNo").getAsString()));
             }
             String teacherId = "0";
             if(!teacherIds.isEmpty()){
@@ -713,6 +714,8 @@ public class DataUtil {
                 SqlRunnerAdapter.db().update(updateSql);
             }
         }
+
+        return teacherIdList;
     }
 
     /**

+ 16 - 1
src/main/java/com/xjrsoft/module/student/controller/BaseStudentAssessmentInspectionController.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.enums.EnabledMark;
@@ -43,7 +44,6 @@ import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 
-import static com.alibaba.fastjson.JSONPatch.OperationType.remove;
 
 /**
  * @title: 学生班级巡查考核
@@ -155,7 +155,22 @@ public class BaseStudentAssessmentInspectionController {
     public RT<Boolean>  cancelStudent(@RequestBody CancelStudentDto dto){
         BaseStudentAssessmentStudentRelation relation = studentRelationService.getById(dto.getId());
         relation.setEnabledMark(EnabledMark.DISABLED.getCode());
+        relation.setModifyDate(new Date());
         boolean update = studentRelationService.updateById(relation);
+
+        long count = studentRelationService.count(
+                new QueryWrapper<BaseStudentAssessmentStudentRelation>().lambda()
+                        .eq(BaseStudentAssessmentStudentRelation::getBaseStudentAssessmentInspectionId, relation.getBaseStudentAssessmentInspectionId())
+                        .eq(BaseStudentAssessmentStudentRelation::getEnabledMark, EnabledMark.ENABLED.getCode())
+        );
+
+        BaseStudentAssessmentInspection inspection = inspectionService.getById(relation.getBaseStudentAssessmentInspectionId());
+        inspection.setModifyDate(new Date());
+        inspection.setModifyUserId(StpUtil.getLoginIdAsLong());
+        if(count == 0){
+            inspection.setEnabledMark(EnabledMark.DISABLED.getCode());
+        }
+        inspectionService.updateById(inspection);
         return RT.ok(update);
     }
 }

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

@@ -32,6 +32,7 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.room.service.IRoomBedService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.dto.MajorGradeClassDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
@@ -204,8 +205,8 @@ public class StudentManagerController {
     @GetMapping(value = "/major-grade-class-tree")
     @ApiOperation(value = "学生部门专业年级班级树")
     @SaCheckPermission("studentmanager:detail")
-    public RT<List<BaseDepMajorGradeClassStudenTreeVo>> tree2() {
-        return RT.ok(studentManagerService.deptMajorGradeClassTree());
+    public RT<List<BaseDepMajorGradeClassStudenTreeVo>> tree2(@Valid MajorGradeClassDto dto) {
+        return RT.ok(studentManagerService.deptMajorGradeClassTree(dto));
     }
 
 

+ 4 - 0
src/main/java/com/xjrsoft/module/student/dto/BaseStudentUserPageDto.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.student.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -56,4 +57,7 @@ public class BaseStudentUserPageDto extends PageInput {
     @ApiModelProperty("年级id")
     private Long gradeId;
 
+    @JsonIgnore
+    private Long teacherId;
+
 }

+ 17 - 0
src/main/java/com/xjrsoft/module/student/dto/MajorGradeClassDto.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.simpleframework.xml.Default;
+
+/**
+ * @author dzx
+ * @date 2024/7/9
+ */
+@Data
+public class MajorGradeClassDto {
+
+    @ApiModelProperty("在读状态(1: 在读 2: 毕业)")
+    private Integer isGraduate = 1;
+
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/student/dto/QuantitativeAssessmentSingleScoreDto.java

@@ -37,4 +37,10 @@ public class QuantitativeAssessmentSingleScoreDto implements Serializable {
 
     @ApiModelProperty(value = "考核类别code")
     private String categoryCode;
+
+    @ApiModelProperty("年份")
+    private Integer year;
+
+    @ApiModelProperty("月份")
+    private Integer month;
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/student/entity/BaseStudentAssessmentStudentRelation.java

@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 
 
 /**
@@ -96,4 +97,9 @@ public class BaseStudentAssessmentStudentRelation implements Serializable {
     @ApiModelProperty("有效标志")
     @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
+
+
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
 }

+ 2 - 1
src/main/java/com/xjrsoft/module/student/service/IStudentManagerService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.dto.MajorGradeClassDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
 import com.xjrsoft.module.student.vo.BaseDepMajorGradeClassStudenTreeVo;
@@ -65,6 +66,6 @@ public interface IStudentManagerService extends MPJBaseService<BaseStudentUser>
 
     Boolean uploadImage(Long userId, MultipartFile file) throws IOException;
 
-     List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree();
+     List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree(MajorGradeClassDto dto);
 
 }

+ 30 - 16
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentAssessmentInspectionServiceImpl.java

@@ -17,8 +17,11 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.AssessmentTypeEnum;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.EvaluateTypeEnum;
 import com.xjrsoft.common.enums.ScoreTypeEnum;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.common.utils.excel.ExcelMergeUtil;
@@ -146,6 +149,9 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
     @Override
     public BaseStudentAssessmentInspectionVo getInfo(Long id) {
         BaseStudentAssessmentInspectionVo result = assessmentInspectionMapper.getInfo(id);
+        if(result == null){
+           throw new MyException("该记录已被作废");
+        }
         // 获取班级信息
         List<BaseStudentAssessmentClassListVo> baseStudentAssessmentClassListVos = assessmentClassRelationMapper.selectJoinList(BaseStudentAssessmentClassListVo.class,
                 MPJWrappers.<BaseStudentAssessmentClassRelation>lambdaJoin()
@@ -202,6 +208,8 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                 .eq(BaseStudentAssessmentStudentRelation::getBaseStudentAssessmentInspectionId, result.getBaseStudentAssessmentInspectionId())
                 .eq(BaseStudentAssessmentStudentRelation::getClassId, result.getClassId())
                 .leftJoin(XjrUser.class, XjrUser::getId, BaseStudentAssessmentStudentRelation::getUserId)
+                .eq(BaseStudentAssessmentStudentRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .eq(BaseStudentAssessmentStudentRelation::getEnabledMark, EnabledMark.ENABLED.getCode())
         ;
         // 获取学生信息
         List<BaseStudentAssessmentStudentRelation> baseStudentAssessmentStudentRelations = assessmentStudentRelationMapper.selectList(baseStudentAssessmentStudentRelationWrapper);
@@ -232,7 +240,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
         List<BaseStudentAssessmentCategory> baseStudentAssessmentCategorieList = categoryMapper.selectList(baseStudentAssessmentCategoryLambdaQueryWrapper);
 
         //导出子表
-        if(baseStudentAssessmentCategorieList.size() > 0){
+        if(!baseStudentAssessmentCategorieList.isEmpty()){
             //需要合并的列
             int[] mergeColumeIndex = {0, 1, 2, 3, 4};
             ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(1, mergeColumeIndex);
@@ -268,7 +276,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                         .eq(dto.getGradeId() != null, BaseClass::getGradeId, dto.getGradeId())
                         .eq(dto.getClassId() != null, BaseClass::getId, dto.getClassId())
                         .eq(dto.getClassStatus() != null, BaseClass::getIsGraduate, dto.getClassStatus())
-                        .like(dto.getName() != null && !dto.getName().equals(""), XjrUser::getName, dto.getName());
+                        .like(dto.getName() != null && !dto.getName().isEmpty(), XjrUser::getName, dto.getName());
 
                 List<CalssQuantitativeAssessmentPageVo> resultList = baseClassMapper.selectJoinList(CalssQuantitativeAssessmentPageVo.class, baseClassMPJLambdaWrapper);
 
@@ -423,7 +431,6 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                             }
                         }
 
-
                         c.setAssessMoney(" ");
                         c.setAssessSumScore(" ");
                     }
@@ -475,7 +482,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                 .eq(dto.getGradeId() != null, BaseClass::getGradeId, dto.getGradeId())
                 .eq(dto.getClassId() != null, BaseClass::getId, dto.getClassId())
                 .eq(dto.getClassStatus() != null, BaseClass::getIsGraduate, dto.getClassStatus())
-                .like(dto.getName() != null && !dto.getName().equals(""), XjrUser::getName, dto.getName());
+                .like(dto.getName() != null && !dto.getName().isEmpty(), XjrUser::getName, dto.getName());
 
         IPage<CalssQuantitativeAssessmentPageVo> resultPage = baseClassMapper.selectJoinPage(page, CalssQuantitativeAssessmentPageVo.class, baseClassMPJLambdaWrapper);
 
@@ -542,7 +549,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
             for(CalssQuantitativeAssessmentPageVo c: resultPage.getRecords()){
                 Long classId = Long.parseLong(c.getClassId());
                 //学生个人行为
-                if(individualBehaviorMap.get(classId) != null){
+                if(individualBehaviorMap.get(classId) != null && individualBehaviorMap.get(classId) != null){
                     Double sumScore = individualBehaviorMap.get(classId).getSumScore();
                     c.setStuPersonalBehaviorSubScore(sumScore==null?"":sumScore.toString());
                     String replacedExpression = xsgrFormula.replace("xsgrKouFen", Double.toString(sumScore));
@@ -556,7 +563,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                     }
                 }
                 //常规管理
-                if(conventionalManagementMap.get(classId) != null){
+                if(conventionalManagementMap.get(classId) != null && conventionalManagementMap.get(classId) != null){
                     Double sumScore = conventionalManagementMap.get(classId).getSumScore();
                     if(sumScore != null){
                         String scoreStr = sumScore.toString();
@@ -574,7 +581,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                     }
                 }
                 //获奖和荣誉
-                if(awardsAndHonorableMap.get(classId) != null){
+                if(awardsAndHonorableMap.get(classId) != null && awardsAndHonorableMap.get(classId) != null){
                     Double sumScore = awardsAndHonorableMap.get(classId).getSumScore();
                     if(sumScore != null){
                         c.setHonorSumScore(sumScore.toString());
@@ -591,8 +598,8 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                     }
                 }
                 //军事化
-                if(paramilitaryMap.get(classId) != null){
-                    Double sumScore = awardsAndHonorableMap.get(classId).getSumScore();
+                if(paramilitaryMap.get(classId) != null && paramilitaryMap.get(classId) != null){
+                    Double sumScore = paramilitaryMap.get(classId).getSumScore();
                     if(sumScore != null){
                         c.setMilitaryManageComprehensiveIndex(sumScore.toString());
                         //此项得分
@@ -601,7 +608,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                         ScriptEngine engine = manager.getEngineByName("JavaScript");
                         try {
                             double result = ((Number) engine.eval(replacedExpression)).doubleValue();
-                            c.setMilitaryManageComprehensiveIndex(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
+                            c.setMilitaryManageScore(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
                         } catch (ScriptException e) {
                             Log.error(e.getMessage(), e);
                         }
@@ -633,7 +640,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
                     }
                 }
                 //班级文化建设
-                if(classCultureMap.containsKey(classId)){
+                if(classCultureMap.containsKey(classId) && classCultureMap.get(classId) != null){
                     Double sumScore = classCultureMap.get(classId).getSumScore();
                     if(sumScore != null){
                         c.setClassCultureScore(sumScore.toString());
@@ -670,6 +677,8 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
             if(dto.getEndTime() != null){
                 setStartTime(dto.getEndTime());
             }
+            setYear(dto.getYear());
+            setMonth(dto.getMonth());
         }});
         Map<Long , QuantitativeAssessmentSingleScoreVo> individualBehaviorMap = new HashMap<>();
         for (QuantitativeAssessmentSingleScoreVo q : individualBehaviorList) {
@@ -858,12 +867,17 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
 
             columnNumber ++;
             cell = dataRow.createCell(columnNumber);
-            cell.setCellValue(pageVo.getStudentNum().toString());
+            cell.setCellValue(pageVo.getStudentNum()==null?"":pageVo.getStudentNum().toString());
             cell.setCellStyle(cellStyle);
 
             columnNumber ++;
             cell = dataRow.createCell(columnNumber);
-            cell.setCellValue(pageVo.getClassStatusCn());
+            if(pageVo.getClassStatus() != null && pageVo.getClassStatus() == 1){
+                cell.setCellValue("在读");
+            }else{
+                cell.setCellValue("毕业");
+            }
+
             cell.setCellStyle(cellStyle);
 
             columnNumber ++;
@@ -1019,7 +1033,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
 
         columnNumber ++;
         cell = row.createCell(columnNumber);
-        cell.setCellValue("准军事化管理效果");
+        cell.setCellValue("国防教学特色");
         cell.setCellStyle(cellStyle);
         sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
         columnNumber ++;
@@ -1097,7 +1111,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
         columnNumber ++;
 
         cell = row.createCell(columnNumber);
-        cell.setCellValue("指数");
+        cell.setCellValue("扣分");
         cell.setCellStyle(cellStyle);
         columnNumber ++;
 
@@ -1114,7 +1128,7 @@ public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceIm
         cell = row.createCell(columnNumber);
         cell.setCellValue("此项得分");
         cell.setCellStyle(cellStyle);
-
+        columnNumber ++;
 
         cell = row.createCell(columnNumber);
         cell.setCellValue("扣分");

+ 3 - 0
src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
@@ -141,6 +142,8 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
                 .eq(dto.getSemesterId() != null && dto.getSemesterId() > 0, PbSemesterConfig::getBaseSemesterId, dto.getSemesterId())
                 .like(dto.getJfzt() != null && !"".equals(dto.getJfzt()), PbVXsxxsfytb::getJfzt, dto.getJfzt())
                 .eq(dto.getTeacherId() != null, BaseClass::getTeacherId, dto.getTeacherId())
+                .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
+                .eq("t1.delete_mark",0)
                 .leftJoin(XjrUser.class, XjrUser::getCredentialNumber, PbVXsxxsfytb::getPersonalid)
                 .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
                 .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)

+ 28 - 5
src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java

@@ -41,6 +41,7 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.dto.MajorGradeClassDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
 import com.xjrsoft.module.student.entity.BaseClassMajorSet;
 import com.xjrsoft.module.student.entity.BaseMajor;
@@ -162,7 +163,7 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
                         .eq(DictionaryDetail::getCode, baseStudentSchoolRoll.getArchivesStatus())
                         .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='archives_status'"));
                 if (dictionaryDetail != null) {
-                    if (dictionaryDetail.getExtendField1().equals("0")) {
+                    if ("0".equals(dictionaryDetail.getExtendField1())) {
                         baseStudent.setIsNormal(0);
                     } else {
                         baseStudent.setIsNormal(1);
@@ -1051,7 +1052,7 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
     }
 
     @Override
-    public List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree() {
+    public List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree(MajorGradeClassDto dto) {
         List<BaseDepMajorGradeClassStudenTreeVo> voList = new ArrayList<>();
         MPJLambdaWrapper<BaseClass> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
         baseClassMPJLambdaWrapper
@@ -1061,20 +1062,37 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
                 .selectAs(BaseClass::getGradeId, BaseClassMajorSetVo::getGradeId)
                 .leftJoin(BaseClassMajorSet.class, BaseClassMajorSet::getClassId, BaseClass::getId)
                 .leftJoin(BaseMajorSet.class, BaseMajorSet::getId, BaseClassMajorSet::getMajorSetId)
+                .eq(dto.getIsGraduate() != null, BaseClass::getIsGraduate, dto.getIsGraduate())
         ;
 
         List<BaseClassMajorSetVo> majorSetList = baseClassService.selectJoinList(BaseClassMajorSetVo.class, baseClassMPJLambdaWrapper);
+        if(majorSetList.isEmpty()){
+            return new ArrayList<>();
+        }
+        Set<Long> gradeIds = majorSetList.stream().map(BaseClassMajorSetVo::getGradeId).collect(Collectors.toSet());
+        Set<Long> majorSetIds = majorSetList.stream().map(BaseClassMajorSetVo::getMajorId).collect(Collectors.toSet());
 
+        Map<Long, Map<Long, List<BaseClassMajorSetVo>>> classMap = majorSetList.stream().collect(Collectors.groupingBy(BaseClassMajorSetVo::getMajorId, Collectors.groupingBy(BaseClassMajorSetVo::getGradeId)));
 
         List<BaseGrade> gradeList = baseGradeService.list(
-                new QueryWrapper<BaseGrade>().lambda().eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                new QueryWrapper<BaseGrade>().lambda()
+                        .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .in(!gradeIds.isEmpty(), BaseGrade::getId, gradeIds)
+                        .orderByDesc(BaseGrade::getTitle)
         );
         List<BaseMajor> majorList = baseMajorService.list(
-                new QueryWrapper<BaseMajor>().lambda().eq(BaseMajor::getDeleteMark, DeleteMark.NODELETE.getCode())
+                new QueryWrapper<BaseMajor>().lambda()
+                        .eq(BaseMajor::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .in(!majorSetIds.isEmpty(), BaseMajor::getId, majorSetIds)
         );
+
+        List<Long> deptIds = majorList.stream().map(BaseMajor::getDepartmentId).collect(Collectors.toList());
+
         List<Department> departmentList =baseDeparmentService.list(
-                new QueryWrapper<Department>().lambda().eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
+                new QueryWrapper<Department>().lambda()
+                        .eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
                         .eq(Department::getIsMajor,1)
+                        .in(!deptIds.isEmpty(), Department::getId, deptIds)
         );
         departmentList.forEach((node) -> {
             voList.add(new BaseDepMajorGradeClassStudenTreeVo(){{
@@ -1091,7 +1109,12 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
                 setTreeType(2);
                 setParentId(node.getDepartmentId().toString());
             }});
+            Map<Long, List<BaseClassMajorSetVo>> gradeMap = classMap.get(node.getId());
             gradeList.forEach((DDD)->{
+                List<BaseClassMajorSetVo> list = gradeMap.get(DDD.getId());
+                if(list == null|| list.isEmpty() || list.size() == 0){
+                    return;
+                }
                 voList.add(new BaseDepMajorGradeClassStudenTreeVo(){{
                     setId(node.getId().toString()+"_"+DDD.getId().toString());
                     setName(DDD.getName());

+ 10 - 2
src/main/java/com/xjrsoft/module/student/vo/BaseStudentAssessmentInspectionMobileVo.java

@@ -1,5 +1,7 @@
 package com.xjrsoft.module.student.vo;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.xjrsoft.module.student.entity.BaseStudentAssessmentStudentRelation;
 import com.xjrsoft.module.system.entity.File;
 import io.swagger.annotations.ApiModelProperty;
@@ -112,8 +114,14 @@ public class BaseStudentAssessmentInspectionMobileVo {
     private List<File> fileInfos;
 
     @ApiModelProperty("类型")
-    private  String assessmentType;
+    private String assessmentType;
 
     @ApiModelProperty("考核项目")
-    private  String assessmentItemName;
+    private String assessmentItemName;
+
+    @ApiModelProperty("修改人")
+    private String modifyUserName;
+
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
 }

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

@@ -123,4 +123,7 @@ public class BaseStudentInfoDetailVo {
 
     @ApiModelProperty("学籍号")
     private String rollNumber;
+
+    @ApiModelProperty("学生档案编号")
+    private String archivesNumber;
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java

@@ -168,7 +168,7 @@ public class DictionarydetailController {
         DictionaryDetail dictionaryDetail = BeanUtil.toBean(dto, DictionaryDetail.class);
         DictionaryItem dictionaryItem=   dictionaryitemService.getById(dictionaryDetail.getItemId());
         if(dictionaryItem!=null) {
-            if (dictionaryItem.getCode().equals("job_state")) {
+            if ("job_state".equals(dictionaryItem.getCode())) {
                 Integer isNormal = 1;
                 if (dictionaryDetail.getExtendField1().equals("0")) {
                     isNormal = 0;
@@ -176,7 +176,7 @@ public class DictionarydetailController {
                 teacherbaseManagerService.changeIsNormal(dictionaryDetail.getCode(), isNormal);
             }
 
-            if(dictionaryItem.getCode().equals("archives_status")){
+            if("archives_status".equals(dictionaryItem.getCode())){
                 Integer isNormal = 1;
                 if (dictionaryDetail.getExtendField1().equals("0")) {
                     isNormal = 0;

+ 8 - 0
src/main/java/com/xjrsoft/module/system/vo/SystemUpdateMessageVo.java

@@ -1,8 +1,12 @@
 package com.xjrsoft.module.system.vo;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
 * @title: 系统消息表单出参
 * @Author brealinxx
@@ -47,5 +51,9 @@ public class SystemUpdateMessageVo {
     private String createUserName;
 
 
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+
 
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java

@@ -1,6 +1,9 @@
 package com.xjrsoft.module.teacher.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -24,4 +27,8 @@ public interface WfTeacherleaveMapper extends MPJBaseMapper<WfTeacherleave> {
     WfTeacherleave getLeaveByUserId(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userId")Long userId);
 
     List<WfTeacherleave> getUserLeaveList(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userIds") List<Long> userIds);
+
+    Page<LedgerStatisticsLeaveVo> getStatisticsPage(Page<LedgerStatisticsLeaveVo> page, @Param("dto") LedgerStatisticsPageDto dto);
+
+    List<LedgerStatisticsLeaveVo> getStatisticsList(@Param("dto") LedgerStatisticsPageDto dto);
 }

+ 8 - 0
src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java

@@ -1,7 +1,11 @@
 package com.xjrsoft.module.teacher.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
+import org.apache.ibatis.annotations.Param;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -33,4 +37,8 @@ public interface IWfTeacherleaveService extends MPJBaseService<WfTeacherleave> {
     void updateAttendancestatus(Long id);
 
     Map<String, List<WfTeacherleave>> getUserLeaveList(LocalDateTime startTime, LocalDateTime endTime, List<Long> userIds);
+
+    Page<LedgerStatisticsLeaveVo> getStatisticsPage(Page<LedgerStatisticsLeaveVo> page, LedgerStatisticsPageDto dto);
+
+    List<LedgerStatisticsLeaveVo> getStatisticsList(LedgerStatisticsPageDto dto);
 }

+ 3 - 2
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java

@@ -118,7 +118,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                         .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='job_state'")
                 );
                 if (dictionaryDetail != null) {
-                    if (dictionaryDetail.getExtendField1().equals("0")) {
+                    if ("0".equals(dictionaryDetail.getExtendField1())) {
                         baseTeacher.setIsNormal(0);
                     } else {
                         baseTeacher.setIsNormal(1);
@@ -269,7 +269,8 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
                             .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='job_state'")
                     );
                     if (dictionaryDetail != null) {
-                        if (dictionaryDetail.getExtendField1().equals("0")) {
+                        if ("0".equals(dictionaryDetail.getExtendField1()))
+                        {
                             baseTeacher.setIsNormal(0);
                         } else {
                             baseTeacher.setIsNormal(1);

+ 13 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.teacher.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
@@ -14,6 +15,8 @@ import com.xjrsoft.module.attendance.mapper.TeacherAttendanceRecordMapper;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
 import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
@@ -328,4 +331,14 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
 
         return result;
     }
+
+    @Override
+    public Page<LedgerStatisticsLeaveVo> getStatisticsPage(Page<LedgerStatisticsLeaveVo> page, LedgerStatisticsPageDto dto) {
+        return this.baseMapper.getStatisticsPage(page, dto);
+    }
+
+    @Override
+    public List<LedgerStatisticsLeaveVo> getStatisticsList(LedgerStatisticsPageDto dto) {
+        return this.baseMapper.getStatisticsList(dto);
+    }
 }

+ 35 - 0
src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java

@@ -372,4 +372,39 @@ public class ImportExcelUtil {
         }
         return false; // 所有必需字段都不为空
     }
+
+
+    public static List<ImportConfig> getAllFieldCN(Class<?> clazz) {
+        List<ImportConfig> importConfigs = new ArrayList<>();
+
+        Field[] fields = clazz.getDeclaredFields();
+
+        int index = 0;
+        for (int i = 0; i < fields.length; i++) {
+            Field field = fields[i];
+            ImportConfig importConfig = new ImportConfig();
+            field.setAccessible(true); // 访问私有字段
+            if (field.isAnnotationPresent(Required.class)) {
+                Required required = field.getAnnotation(Required.class);
+                boolean value = required.value();
+                importConfig.setRequired(value);
+            }
+
+            if (field.isAnnotationPresent(ExcelProperty.class)) {
+                ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
+                String[] annotationValues = excelProperty.value();
+                importConfig.setLabel(annotationValues.length > 0 ? annotationValues[0] : "");
+            }
+
+            if (field.isAnnotationPresent(ExcelIgnore.class)) {
+                continue;
+            }
+            importConfig.setFieldName(field.getName());
+            importConfig.setSortCode(index++);
+            importConfig.setWidth(0);
+            importConfigs.add(importConfig);
+        }
+
+        return importConfigs;
+    }
 }

+ 10 - 2
src/main/java/com/xjrsoft/module/xycxedu/controller/ExamPlanController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -76,6 +77,9 @@ public class ExamPlanController {
         IPage<ExamPlanPageVo> page = examPlanService.selectJoinListPage(ConventPage.getPage(dto), ExamPlanPageVo.class, queryWrapper);
         PageOutput<ExamPlanPageVo> pageOutput = ConventPage.getPageOutput(page, ExamPlanPageVo.class);
         for (ExamPlanPageVo record : pageOutput.getList()) {
+            if(StrUtil.isEmpty(record.getMilexamids())){
+                continue;
+            }
             String[] split = record.getMilexamids().split(",");
             List<Long> milexamids = Arrays.asList(split).stream()
                     .map(Long::parseLong)
@@ -137,8 +141,12 @@ public class ExamPlanController {
     @GetMapping(value = "/plan-list")
     @ApiOperation(value="查询所有考试计划")
     @SaCheckPermission("examplan:detail")
-    public RT<List<ExamPlanListVo>> allPlan(){
-        List<ExamPlan> list = examPlanService.list();
+    public RT<List<ExamPlanListVo>> allPlan(@Valid ExamPlanPageDto dto){
+        List<ExamPlan> list = examPlanService.list(
+                new QueryWrapper<ExamPlan>().lambda()
+                        .eq(dto.getSemesterId() !=null, ExamPlan::getSemesterId, dto.getSemesterId())
+                        .eq(ExamPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
         List<ExamPlanListVo> listVos = BeanUtil.copyToList(list, ExamPlanListVo.class);
         return RT.ok(listVos);
     }

+ 119 - 2
src/main/java/com/xjrsoft/module/xycxedu/controller/ExamSubjectScoreController.java

@@ -1,21 +1,38 @@
 package com.xjrsoft.module.xycxedu.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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.xycxedu.dto.ClassStudentScorePageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.UpdateExamSubjectScoreDto;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScore;
 import com.xjrsoft.module.xycxedu.service.IExamSubjectScoreService;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScorePageVo;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScoreTitleVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterImportVo;
 import com.xjrsoft.module.xycxedu.vo.ExamSubjectScorePageVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
 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.RestController;
 
 import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
 
 /**
 * @title: 考试计划维护
@@ -29,12 +46,12 @@ import javax.validation.Valid;
 @AllArgsConstructor
 public class ExamSubjectScoreController {
 
-
     private final IExamSubjectScoreService scoreService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value="考试成绩查询(分页)")
-    @SaCheckPermission("examplan:detail")
+    @SaCheckPermission("examsubjectscore:detail")
+    @XjrLog("查询考试成绩")
     public RT<PageOutput<ExamSubjectScorePageVo>> page(@Valid ExamSubjectScoreDto dto){
         Page<ExamSubjectScorePageVo> page = scoreService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<ExamSubjectScorePageVo> pageOutput = ConventPage.getPageOutput(page, ExamSubjectScorePageVo.class);
@@ -42,4 +59,104 @@ public class ExamSubjectScoreController {
     }
 
 
+    @GetMapping(value = "/enter-list")
+    @ApiOperation(value="根据录入id考试成绩查询")
+    @SaCheckPermission("examsubjectscore:enter-list")
+    @XjrLog("根据录入id查询考试成绩")
+    public RT<List<ExamSubjectScoreEnterImportVo>> enterList(@Valid ExamSubjectScoreEnterDto dto){
+        List<ExamSubjectScoreEnterImportVo> result = scoreService.getEnterScoreStudentList(dto);
+        return RT.ok(result);
+    }
+
+    @GetMapping(value = "/enter-page")
+    @ApiOperation(value="根据录入id考试成绩查询(分页)")
+    @SaCheckPermission("examsubjectscore:enter-page")
+    @XjrLog("根据录入id查询考试成绩")
+    public RT<PageOutput<ExamSubjectScoreEnterImportVo>> enterPage(@Valid ExamSubjectScoreEnterDto dto){
+        PageOutput<ExamSubjectScoreEnterImportVo> result = scoreService.getEnterScoreStudentPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        return RT.ok(result);
+    }
+
+
+    @PutMapping
+    @ApiOperation(value = "修改学生成绩")
+    @SaCheckPermission("examsubjectscore:update")
+    @XjrLog("修改学生成绩")
+    public RT<Boolean> add(@Valid @RequestBody List<UpdateExamSubjectScoreDto> dtoList){
+        for (UpdateExamSubjectScoreDto dto : dtoList) {
+            ExamSubjectScore subjectScore = scoreService.getById(dto.getId());
+            subjectScore.setScore(dto.getScore());
+            subjectScore.setClassRanking(dto.getClassRanking());
+            subjectScore.setGradeRanking(dto.getGradeRanking());
+            scoreService.updateById(subjectScore);
+
+            if(dto.getScore() == null || dto.getGradeRanking() == null || dto.getClassRanking() == null){
+                UpdateWrapper<ExamSubjectScore> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.eq("id", dto.getId());
+                if(dto.getScore() == null){
+                    updateWrapper.setSql("score = null");
+                }
+                if(dto.getClassRanking() == null){
+                    updateWrapper.setSql("class_ranking = null");
+                }
+                if(dto.getGradeRanking() == null){
+                    updateWrapper.setSql("grade_ranking = null");
+                }
+                scoreService.update(subjectScore, updateWrapper);
+            }
+        }
+
+        return RT.ok(true);
+    }
+
+
+    @GetMapping(value = "/class-student-page")
+    @ApiOperation(value="班级成绩查询(分页)")
+    @SaCheckPermission("examsubjectscore:detail")
+    @XjrLog("班级成绩查询(分页)")
+    public RT<PageOutput<ClassStudentScorePageVo>> classStudentScorePage(@Valid ClassStudentScorePageDto dto){
+        List<String> roleList = StpUtil.getRoleList();
+        if(roleList.size() == 2 && roleList.contains("TEACHER") && roleList.contains("CLASSTE")){
+            dto.setTeacherId(StpUtil.getLoginIdAsLong());
+        }else{
+            if((dto.getTreeType() != null && dto.getTreeType() != 4) || dto.getTreeId() == null ){
+                return RT.ok(new PageOutput<>());
+            }
+        }
+
+        PageOutput<ClassStudentScorePageVo> pageOutput = scoreService.getClassStudentScorePage(dto);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/class-student-page-title")
+    @ApiOperation(value="班级成绩查询列头")
+    @SaCheckPermission("examsubjectscore:detail")
+    @XjrLog("班级成绩查询列头")
+    public RT<List<ClassStudentScoreTitleVo>> classStudentScorePageTitle(@Valid ClassStudentScorePageDto dto){
+        //查询列头
+        List<ClassStudentScoreTitleVo> list = scoreService.getClassStudentScoreCourse(dto);
+        return RT.ok(list);
+    }
+
+    @PostMapping(value = "/class-student-export-query")
+    @ApiOperation(value="班级成绩查询导出")
+    @SaCheckPermission("examsubjectscore:detail")
+    @XjrLog("导出考试成绩")
+    public ResponseEntity<byte[]> classStudentScoreExportQuery(@Valid @RequestBody ClassStudentScorePageDto dto) throws IOException {
+        String fileName = "class-student-export-query" + ExcelTypeEnum.XLSX.getValue();
+
+        List<String> roleList = StpUtil.getRoleList();
+        if(roleList.size() == 2 && roleList.contains("TEACHER") && roleList.contains("CLASSTE")){
+            dto.setTeacherId(StpUtil.getLoginIdAsLong());
+        }else{
+            if((dto.getTreeType() != null && dto.getTreeType() != 4) || dto.getTreeId() == null ){
+                return RT.fileStream(new byte[0], fileName);
+            }
+        }
+        //查询列头
+        byte[] bytes = scoreService.getClassStudentScoreExportQuery(dto);
+        return RT.fileStream(bytes, fileName);
+    }
+
+
 }

+ 136 - 0
src/main/java/com/xjrsoft/module/xycxedu/controller/ExamSubjectScoreEnterController.java

@@ -0,0 +1,136 @@
+package com.xjrsoft.module.xycxedu.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.xycxedu.dto.AddExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterPageDto;
+import com.xjrsoft.module.xycxedu.dto.UpdateExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScore;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScoreEnter;
+import com.xjrsoft.module.xycxedu.service.IExamSubjectScoreEnterService;
+import com.xjrsoft.module.xycxedu.service.IExamSubjectScoreService;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterImportVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterPageVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+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 org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/xycxedu" + "/examSubjectScoreEnter")
+@Api(value = "/xycxedu"  + "/examSubjectScoreEnter",tags = "成绩录入代码")
+@AllArgsConstructor
+public class ExamSubjectScoreEnterController {
+
+    private final IExamSubjectScoreEnterService enterService;
+    private final IExamSubjectScoreService scoreService;
+    private final IBaseClassService classService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="成绩录入列表(分页)")
+    @SaCheckPermission("examsubjectscoreenter:detail")
+    public RT<PageOutput<ExamSubjectScoreEnterPageVo>> page(@Valid ExamSubjectScoreEnterPageDto dto){
+        List<String> roleList = StpUtil.getRoleList();
+        if(!roleList.contains("soceManage")){
+            dto.setCreateUserId(StpUtil.getLoginIdAsLong());
+        }
+
+        Page<ExamSubjectScoreEnterPageVo> page = enterService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<ExamSubjectScoreEnterPageVo> pageOutput = ConventPage.getPageOutput(page, ExamSubjectScoreEnterPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询成绩录入信息")
+    @SaCheckPermission("examsubjectscoreenter:detail")
+    public RT<ExamSubjectScoreEnterVo> info(@RequestParam Long id){
+        ExamSubjectScoreEnterVo examSubjectScoreEnter = enterService.getInfo(id);
+        if (examSubjectScoreEnter == null) {
+           return RT.error("找不到此数据!");
+        }
+        List<String> classIds = Arrays.asList(examSubjectScoreEnter.getClassIds().split(","));
+        List<BaseClass> classList = classService.listByIds(classIds);
+
+        examSubjectScoreEnter.setClassList(classList);
+
+        return RT.ok(examSubjectScoreEnter);
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增成绩录入")
+    @SaCheckPermission("examsubjectscoreenter:add")
+    public RT<Boolean> add(@Valid @RequestBody AddExamSubjectScoreEnterDto dto){
+        Boolean isSuccess = enterService.save(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改成绩录入")
+    @SaCheckPermission("examsubjectscoreenter:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateExamSubjectScoreEnterDto dto){
+
+        ExamSubjectScoreEnter examSubjectScoreEnter = BeanUtil.toBean(dto, ExamSubjectScoreEnter.class);
+        examSubjectScoreEnter.setModifyDate(new Date());
+        return RT.ok(enterService.updateById(examSubjectScoreEnter));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除成绩录入")
+    @SaCheckPermission("examsubjectscoreenter:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        scoreService.remove(new QueryWrapper<ExamSubjectScore>().lambda().in(ExamSubjectScore::getExamSubjectScoreEnterId, ids));
+        return RT.ok(enterService.removeBatchByIds(ids));
+    }
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    public RT<Boolean> importData(@RequestParam Long id, @RequestParam MultipartFile file) throws IOException {
+        Boolean result = enterService.importData(id, file);
+        return RT.ok(result);
+    }
+
+    @PostMapping("/export-query")
+    @ApiOperation(value = "下载模板")
+    public ResponseEntity<byte[]> exportData(@Valid @RequestBody ExamSubjectScoreEnterDto dto) throws IOException {
+
+        byte[] bytes = enterService.downloadTemplate(dto);
+        return RT.fileStream(bytes, "ExamSubjectScoreEnter" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 42 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/AddExamSubjectScoreEnterDto.java

@@ -0,0 +1,42 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class AddExamSubjectScoreEnterDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 科目id
+    */
+    @ApiModelProperty("科目id")
+    private Long courseSubjectId;
+    /**
+    * 考试计划id
+    */
+    @ApiModelProperty("考试计划id")
+    private Long examPlanId;
+    /**
+    * 学期id
+    */
+    @ApiModelProperty("学期id")
+    private Long semesterId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private List<Long> classIds;
+
+}

+ 40 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/ClassStudentScorePageDto.java

@@ -0,0 +1,40 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ClassStudentScorePageDto extends PageInput {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("学生姓名")
+    private String name;
+
+    @ApiModelProperty("学期id")
+    private String credentialNumber;
+
+    @ApiModelProperty("考试计划id")
+    private Long examPlanId;
+
+    @ApiModelProperty("学期id")
+    private Long semesterId;
+
+    @ApiModelProperty("树id")
+    private String treeId;
+
+    @ApiModelProperty("树类型(1:部门  2:专业  3:年级  4:班级)")
+    private Integer treeType;
+
+    @JsonIgnore
+    private List<Long> userIdList;
+
+    @JsonIgnore
+    private Long teacherId;
+}

+ 29 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/ExamSubjectScoreEnterDto.java

@@ -0,0 +1,29 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ExamSubjectScoreEnterDto extends PageInput{
+    private static final long serialVersionUID = 1L;
+    /**
+     * 用户ID(xjr_user)
+     */
+    @ApiModelProperty("班级")
+    private Long classId;
+
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
+    @ApiModelProperty("是否已录入(1:是 0:否)")
+    private Integer isEnter;
+
+    @ApiModelProperty("录入id")
+    private Long examSubjectScoreEnterId;
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/ExamSubjectScoreEnterImportDto.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class ExamSubjectScoreEnterImportDto {
+
+
+    @ExcelProperty("班级")
+    @ApiModelProperty("班级")
+    @Required
+    private String className;
+
+    @ExcelProperty("学生姓名")
+    @ApiModelProperty("学生姓名")
+    @Required
+    private String studentName;
+
+    @ExcelProperty("学生身份证")
+    @ApiModelProperty("学生身份证")
+    @Required
+    private String credentialNumber;
+
+    @ExcelProperty("科目")
+    @ApiModelProperty("科目")
+    @Required
+    private String courseSubjectName;
+
+    @ExcelProperty("成绩")
+    @ApiModelProperty("成绩")
+    @Required
+    private String score;
+
+    @ExcelProperty("班级排名")
+    @ApiModelProperty("班级排名")
+    private Integer classRanking;
+
+    @ExcelProperty("年级排名")
+    @ApiModelProperty("年级排名")
+    private Integer gradeRanking;
+
+}

+ 35 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/ExamSubjectScoreEnterPageDto.java

@@ -0,0 +1,35 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 成绩录入分页查询入参
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ExamSubjectScoreEnterPageDto extends PageInput {
+
+    @ApiModelProperty("科目名称")
+    private String courseSubjectName;
+
+    @ApiModelProperty("学期")
+    private Long semesterId;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("考试计划")
+    private String examPlanName;
+
+    @JsonIgnore
+    @ApiModelProperty("学期")
+    private Long createUserId;
+}

+ 34 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/UpdateExamSubjectScoreDto.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+* @title: 考试计划维护
+* @Author dzx
+* @Date: 2024-07-18
+* @Version 1.0
+*/
+@Data
+public class UpdateExamSubjectScoreDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("主键id")
+    private Long id;
+
+    @ApiModelProperty("分数")
+    private Float score;
+
+    @ApiModelProperty("班级排名")
+    private Integer classRanking;
+
+    @ApiModelProperty("年级排名")
+    private Integer gradeRanking;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/xycxedu/dto/UpdateExamSubjectScoreEnterDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.xycxedu.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class UpdateExamSubjectScoreEnterDto extends AddExamSubjectScoreEnterDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 7 - 1
src/main/java/com/xjrsoft/module/xycxedu/entity/ExamSubjectScore.java

@@ -86,7 +86,7 @@ public class ExamSubjectScore implements Serializable {
     private Long userId;
 
     @ApiModelProperty("分数")
-    private Integer score;
+    private Float score;
 
     @ApiModelProperty("班级排名")
     private Integer classRanking;
@@ -94,4 +94,10 @@ public class ExamSubjectScore implements Serializable {
     @ApiModelProperty("年级排名")
     private Integer gradeRanking;
 
+    @ApiModelProperty("录入id")
+    private Long examSubjectScoreEnterId;
+
+    @ApiModelProperty("考试计划id")
+    private Long examPlanId;
+
 }

+ 98 - 0
src/main/java/com/xjrsoft/module/xycxedu/entity/ExamSubjectScoreEnter.java

@@ -0,0 +1,98 @@
+package com.xjrsoft.module.xycxedu.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.util.Date;
+
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+@TableName("exam_subject_score_enter")
+@ApiModel(value = "exam_subject_score_enter", description = "成绩录入")
+public class ExamSubjectScoreEnter 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 Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 科目id
+    */
+    @ApiModelProperty("科目id")
+    private Long courseSubjectId;
+    /**
+    * 科目名称
+    */
+    @ApiModelProperty("科目名称")
+    private String coursename;
+    /**
+    * 考试计划id
+    */
+    @ApiModelProperty("考试计划id")
+    private Long examPlanId;
+    /**
+    * 学期id
+    */
+    @ApiModelProperty("学期id")
+    private Long semesterId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private String classIds;
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/xycxedu/mapper/ExamSubjectScoreEnterMapper.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.xycxedu.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterPageDto;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScoreEnter;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterPageVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Mapper
+public interface ExamSubjectScoreEnterMapper extends MPJBaseMapper<ExamSubjectScoreEnter> {
+
+    Page<ExamSubjectScoreEnterPageVo> getPage(Page<ExamSubjectScoreEnterPageVo> page, @Param("dto")ExamSubjectScoreEnterPageDto dto);
+
+    ExamSubjectScoreEnterVo getInfo(@Param("id") Long id);
+}

+ 8 - 0
src/main/java/com/xjrsoft/module/xycxedu/mapper/ExamSubjectScoreMappper.java

@@ -2,14 +2,18 @@ package com.xjrsoft.module.xycxedu.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.xycxedu.dto.ClassStudentScorePageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamStatisticsPageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreDto;
 import com.xjrsoft.module.xycxedu.entity.ExamSubjectScore;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScoreTitleVo;
 import com.xjrsoft.module.xycxedu.vo.ExamStatisticsPageVo;
 import com.xjrsoft.module.xycxedu.vo.ExamSubjectScorePageVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
 * @title: 晓羊策学考试计划表
 * @Author dzx
@@ -24,4 +28,8 @@ public interface ExamSubjectScoreMappper extends MPJBaseMapper<ExamSubjectScore>
     Page<ExamSubjectScorePageVo> getPage(Page<ExamSubjectScorePageVo> page, @Param("dto") ExamSubjectScoreDto dto);
 
     Page<ExamStatisticsPageVo> getStatisticsPage(Page<ExamStatisticsPageVo> page, @Param("dto") ExamStatisticsPageDto dto);
+
+    List<ClassStudentScoreTitleVo> getClassStudentScoreCourse(@Param("dto") ClassStudentScorePageDto dto);
+
+    List<ExamSubjectScore> getClassStudentScoreList(@Param("dto") ClassStudentScorePageDto dto);
 }

+ 33 - 0
src/main/java/com/xjrsoft/module/xycxedu/service/IExamSubjectScoreEnterService.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.xycxedu.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.xycxedu.dto.AddExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterPageDto;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScoreEnter;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterPageVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterVo;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+
+public interface IExamSubjectScoreEnterService extends MPJBaseService<ExamSubjectScoreEnter> {
+
+    Boolean importData(Long id, MultipartFile file) throws IOException;
+
+    Boolean save(AddExamSubjectScoreEnterDto dto);
+
+    Page<ExamSubjectScoreEnterPageVo> getPage(Page<ExamSubjectScoreEnterPageVo> page, ExamSubjectScoreEnterPageDto dto);
+
+    ExamSubjectScoreEnterVo getInfo(Long id);
+
+    byte[] downloadTemplate(ExamSubjectScoreEnterDto dto) throws IOException;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/xycxedu/service/IExamSubjectScoreService.java

@@ -2,11 +2,21 @@ package com.xjrsoft.module.xycxedu.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.xycxedu.dto.ClassStudentScorePageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamStatisticsPageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterDto;
 import com.xjrsoft.module.xycxedu.entity.ExamSubjectScore;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScorePageVo;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScoreTitleVo;
 import com.xjrsoft.module.xycxedu.vo.ExamStatisticsPageVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterImportVo;
 import com.xjrsoft.module.xycxedu.vo.ExamSubjectScorePageVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.io.IOException;
+import java.util.List;
 
 /**
  * @title: 晓羊策学考试计划表
@@ -22,4 +32,18 @@ public interface IExamSubjectScoreService extends MPJBaseService<ExamSubjectScor
     Page<ExamSubjectScorePageVo> getPage(Page<ExamSubjectScorePageVo> page, ExamSubjectScoreDto dto);
 
     Page<ExamStatisticsPageVo> getStatisticsPage(Page<ExamStatisticsPageVo> page, ExamStatisticsPageDto dto);
+
+
+    List<ExamSubjectScoreEnterImportVo> getEnterScoreStudentList(ExamSubjectScoreEnterDto dto);
+
+    PageOutput<ExamSubjectScoreEnterImportVo> getEnterScoreStudentPage(Page<ExamSubjectScoreEnterImportVo> page, ExamSubjectScoreEnterDto dto);
+
+
+    List<ClassStudentScoreTitleVo> getClassStudentScoreCourse(ClassStudentScorePageDto dto);
+
+    List<ExamSubjectScore> getClassStudentScoreList(ClassStudentScorePageDto dto);
+
+    PageOutput<ClassStudentScorePageVo> getClassStudentScorePage(ClassStudentScorePageDto dto);
+
+    byte[] getClassStudentScoreExportQuery(ClassStudentScorePageDto dto) throws IOException;
 }

+ 362 - 0
src/main/java/com/xjrsoft/module/xycxedu/service/impl/ExamSubjectScoreEnterServiceImpl.java

@@ -0,0 +1,362 @@
+package com.xjrsoft.module.xycxedu.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.exception.ExcelDataConvertException;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
+import com.xjrsoft.module.generator.entity.ImportConfig;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.student.entity.BaseStudent;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.veb.util.ImportExcelUtil;
+import com.xjrsoft.module.xycxedu.dto.AddExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterImportDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterPageDto;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScore;
+import com.xjrsoft.module.xycxedu.entity.ExamSubjectScoreEnter;
+import com.xjrsoft.module.xycxedu.mapper.ExamSubjectScoreEnterMapper;
+import com.xjrsoft.module.xycxedu.service.IExamSubjectScoreEnterService;
+import com.xjrsoft.module.xycxedu.service.IExamSubjectScoreService;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterImportVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterPageVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterVo;
+import lombok.AllArgsConstructor;
+import me.zhyd.oauth.log.Log;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+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;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class ExamSubjectScoreEnterServiceImpl extends MPJBaseServiceImpl<ExamSubjectScoreEnterMapper, ExamSubjectScoreEnter> implements IExamSubjectScoreEnterService {
+
+    private final IBaseCourseSubjectService courseSubjectService;
+    private final IUserService userService;
+    private final IExamSubjectScoreService scoreService;
+
+    private final IBaseClassService classService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean importData(Long id, MultipartFile file) throws IOException {
+        try {
+            ExamSubjectScoreEnter enter = this.getById(id);
+            List<ExamSubjectScoreEnterImportDto> dataList = EasyExcel.read(file.getInputStream()).headRowNumber(3).head(ExamSubjectScoreEnterImportDto.class).sheet().doReadSync();
+            List<BaseCourseSubject> classList = courseSubjectService.list(
+                    new QueryWrapper<BaseCourseSubject>().lambda()
+                            .eq(BaseCourseSubject::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+            Map<Long, String> courseSubjectMaps = classList.stream().collect(Collectors.toMap(BaseCourseSubject::getId, BaseCourseSubject::getName));
+
+            List<String> credentialNumbers = dataList.stream().filter(x -> StrUtil.isNotEmpty(x.getCredentialNumber())).map(ExamSubjectScoreEnterImportDto::getCredentialNumber).collect(Collectors.toList());
+            if(credentialNumbers.isEmpty()){
+                return true;
+            }
+            List<User> userList = userService.list(
+                    new MPJLambdaWrapper<User>()
+                            .select(User::getId)
+                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                            .innerJoin(ExamSubjectScore.class, ExamSubjectScore::getUserId, User::getId)
+                            .eq(User::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(ExamSubjectScore::getExamSubjectScoreEnterId, id)
+                            .in(User::getCredentialNumber, credentialNumbers)
+            );
+            Map<String, Long> userMaps = userList.stream().collect(Collectors.toMap(User::getCredentialNumber, User::getId));
+
+            List<ExamSubjectScore> scoreList = scoreService.list(
+                    new QueryWrapper<ExamSubjectScore>().lambda()
+                            .eq(ExamSubjectScore::getExamSubjectScoreEnterId, enter.getId())
+                            .eq(ExamSubjectScore::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+
+            Map<Long, ExamSubjectScore> listMap = scoreList.stream().collect(Collectors.toMap(ExamSubjectScore::getUserId, x -> x));
+
+            List<ExamSubjectScore> updateList = new ArrayList<>();
+            for (ExamSubjectScoreEnterImportDto importVo : dataList) {
+                Long userId = userMaps.get(importVo.getCredentialNumber());
+                ExamSubjectScore examSubjectScores = listMap.get(userId);
+                examSubjectScores.setCourseSubjectId(enter.getCourseSubjectId());
+                examSubjectScores.setScore(importVo.getScore()==null?null:Float.parseFloat(importVo.getScore()));
+                examSubjectScores.setSemesterId(enter.getSemesterId());
+                examSubjectScores.setExamSubjectScoreEnterId(enter.getId());
+                examSubjectScores.setSemesterId(enter.getSemesterId());
+                examSubjectScores.setClassRanking(importVo.getClassRanking());
+                examSubjectScores.setGradeRanking(importVo.getGradeRanking());
+                examSubjectScores.setCoursename(courseSubjectMaps.get(enter.getCourseSubjectId()));
+                updateList.add(examSubjectScores);
+            }
+
+            if(!updateList.isEmpty()){
+                scoreService.updateBatchById(updateList);
+            }
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
+            if(e.getClass().equals(ExcelDataConvertException.class)){
+                throw new MyException("班级排名和年级排名只能填写数字,请检查");
+            }else{
+                throw new MyException("导入出错,请联系管理员");
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean save(AddExamSubjectScoreEnterDto dto) {
+        BaseCourseSubject courseSubject = courseSubjectService.getById(dto.getCourseSubjectId());
+
+
+        List<String> classNames = new ArrayList<>();
+        for (Long classId : dto.getClassIds()) {
+            List<ExamSubjectScoreEnter> list = this.list(
+                    new QueryWrapper<ExamSubjectScoreEnter>().lambda()
+                            .eq(ExamSubjectScoreEnter::getSemesterId, dto.getSemesterId())
+                            .eq(ExamSubjectScoreEnter::getExamPlanId, dto.getExamPlanId())
+                            .eq(ExamSubjectScoreEnter::getCourseSubjectId, dto.getCourseSubjectId())
+                            .like(ExamSubjectScoreEnter::getClassIds, classId)
+                            .eq(ExamSubjectScoreEnter::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+            if(!list.isEmpty()){
+                User user = userService.getById(list.get(0).getCreateUserId());
+                BaseClass aClass = classService.getById(classId);
+                classNames.add(aClass.getName() + "的" + courseSubject.getName() + "已被" + user.getName() + "添加");
+            }
+        }
+        if(!classNames.isEmpty()){
+            String messgae = classNames.toString().replace("[", "").replace("]", "").replace(", ", ";");
+            throw new MyException(messgae + ",不能重复添加");
+        }
+        ExamSubjectScoreEnter examSubjectScoreEnter = BeanUtil.toBean(dto, ExamSubjectScoreEnter.class);
+        examSubjectScoreEnter.setCreateDate(new Date());
+        String classIds = dto.getClassIds().toString().replace("[", "").replace("]", "").replace(" ", "");
+        examSubjectScoreEnter.setClassIds(classIds);
+        examSubjectScoreEnter.setCoursename(courseSubject.getName());
+        boolean isSuccess = this.save(examSubjectScoreEnter);
+        List<User> userList = userService.list(
+                new MPJLambdaWrapper<User>()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                        .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                        .innerJoin(BaseStudent.class, BaseStudent::getUserId, User::getId)
+                        .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
+                        .eq(BaseStudent::getIsNormal, 1)
+                        .in(BaseStudentSchoolRoll::getClassId, dto.getClassIds())
+        );
+        List<ExamSubjectScore> insertList = new ArrayList<>();
+        for (User importVo : userList) {
+            insertList.add(
+                    new ExamSubjectScore(){{
+                        setCreateDate(new Date());
+                        setExamSubjectScoreEnterId(examSubjectScoreEnter.getId());
+                        setUserId(importVo.getId());
+                        setSemesterId(examSubjectScoreEnter.getSemesterId());
+                        setCourseSubjectId(examSubjectScoreEnter.getCourseSubjectId());
+                        setCoursename(examSubjectScoreEnter.getCoursename());
+                        setExamPlanId(examSubjectScoreEnter.getExamPlanId());
+                    }}
+            );
+        }
+
+        if(!insertList.isEmpty()){
+            scoreService.remove(new QueryWrapper<ExamSubjectScore>().lambda().eq(ExamSubjectScore::getExamSubjectScoreEnterId, examSubjectScoreEnter.getId()));
+
+            scoreService.saveBatch(insertList);
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Page<ExamSubjectScoreEnterPageVo> getPage(Page<ExamSubjectScoreEnterPageVo> page, ExamSubjectScoreEnterPageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+
+    @Override
+    public ExamSubjectScoreEnterVo getInfo(Long id) {
+        return this.baseMapper.getInfo(id);
+    }
+
+    @Override
+    public byte[] downloadTemplate(ExamSubjectScoreEnterDto dto) throws IOException {
+        ExamSubjectScoreEnter scoreEnter = this.getById(dto.getExamSubjectScoreEnterId());
+        BaseCourseSubject courseSubject = courseSubjectService.getById(scoreEnter.getCourseSubjectId());
+
+        List<ExamSubjectScoreEnterImportVo> result = scoreService.getEnterScoreStudentList(new ExamSubjectScoreEnterDto(){{
+            setExamSubjectScoreEnterId(dto.getExamSubjectScoreEnterId());
+        }});
+        List<ArrayList<String>> dataList = new ArrayList<>();
+        for (ExamSubjectScoreEnterImportVo recordVo : result) {
+            ArrayList<String> data = new ArrayList<>();
+            data.add(recordVo.getClassName());
+            data.add(recordVo.getStudentName());
+            data.add(recordVo.getCredentialNumber());
+            data.add(courseSubject.getName());
+            data.add(recordVo.getScore());
+            data.add(recordVo.getClassRanking()==null?"":recordVo.getClassRanking() + "");
+            data.add(recordVo.getGradeRanking()==null?"":recordVo.getGradeRanking() + "");
+            dataList.add(data);
+        }
+
+        Workbook workbook = new XSSFWorkbook();
+        // 创建一个工作表(sheet)
+        String sheetName = "数据";
+        Sheet sheet = workbook.createSheet(sheetName);
+
+        createFirstTitle(workbook, sheet);
+        createSecondTitle(workbook, sheet);
+        createThirdTitle(workbook, sheet, ExamSubjectScoreEnterImportVo.class);
+
+        int dataRowNumber = 3;
+
+        for (ArrayList<String> rowData : dataList) {
+            Row dataRow = sheet.createRow(dataRowNumber);
+            for (int i = 0; i < rowData.size(); i ++){
+                String content = rowData.get(i);
+                Font font = workbook.createFont();
+                font.setBold(false);// 设置为粗体
+                font.setFontName("宋体");
+                font.setFontHeightInPoints((short)12);
+
+                CellStyle cellStyle = workbook.createCellStyle();
+                cellStyle.setFont(font); // 将字体应用到样式
+                cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+                Cell row1cell2 = dataRow.createCell(i);
+                row1cell2.setCellValue(content);
+                row1cell2.setCellStyle(cellStyle);
+            }
+
+            dataRowNumber ++;
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        workbook.write(bot);
+        return bot.toByteArray();
+    }
+
+    void createFirstTitle(Workbook workbook, Sheet sheet) {
+        int rowNumber = 0;
+        Font font = workbook.createFont();
+        font.setBold(true);// 设置为粗体
+        font.setFontName("宋体");
+//        font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        font.setFontHeightInPoints((short)24);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row = sheet.createRow(rowNumber);
+        //合并第一行的列
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 6));
+
+        //3、处理表头
+        String title1 = "学生成绩导入模板";
+        // 创建单元格并设置值
+        Cell cell = row.createCell(0);
+        cell.setCellValue(title1);
+        cell.setCellStyle(cellStyle);
+    }
+
+    void createSecondTitle(Workbook workbook, Sheet sheet) {
+        int rowNumber = 1;
+        Font font = workbook.createFont();
+        font.setBold(true);// 设置为粗体
+        font.setFontName("宋体");
+        font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        font.setFontHeightInPoints((short)12);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row = sheet.createRow(rowNumber);
+        //合并第一行的列
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 6));
+
+        //3、处理表头
+        String title1 = "说明:导入的学生信息必须保证与系统现有信息一致,导入时请将示例数据删除,避免导入失败!黄底红字为必填项,白底黑字为非必填项;";
+        // 创建单元格并设置值
+        Cell cell = row.createCell(0);
+        cell.setCellValue(title1);
+        cell.setCellStyle(cellStyle);
+    }
+
+    void createThirdTitle(Workbook workbook, Sheet sheet, Class<?> clazz) {
+        int rowNumber = 2;
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Font font2 = workbook.createFont();
+        font2.setFontName("宋体");
+        font2.setFontHeightInPoints((short)12);
+        font2.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        CellStyle cellStyle2 = workbook.createCellStyle();
+        cellStyle2.setFont(font2); // 将字体应用到样式
+        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle2.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle2.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
+        cellStyle2.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置填充模式
+
+        Row row1 = sheet.createRow(rowNumber);
+        List<ImportConfig> importConfigs = ImportExcelUtil.getAllFieldCN(clazz);
+        List<ImportConfig> list = importConfigs.stream().filter(x -> x.getLabel() != null).collect(Collectors.toList());
+        for(int i = 0; i < list.size(); i ++){
+            sheet.setColumnWidth(i, 24 * 256);
+            ImportConfig importConfig = list.get(i);
+            Cell rowcell = row1.createCell(i);
+            rowcell.setCellValue(importConfig.getLabel());
+            if(importConfig.getRequired() != null && importConfig.getRequired()){
+                rowcell.setCellStyle(cellStyle2);
+            }else{
+                rowcell.setCellStyle(cellStyle);
+            }
+        }
+    }
+}

+ 339 - 0
src/main/java/com/xjrsoft/module/xycxedu/service/impl/ExamSubjectScoreServiceImpl.java

@@ -1,17 +1,58 @@
 package com.xjrsoft.module.xycxedu.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.base.service.IBaseSemesterService;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.service.IStudentManagerService;
+import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
+import com.xjrsoft.module.xycxedu.dto.ClassStudentScorePageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamStatisticsPageDto;
 import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreDto;
+import com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterDto;
+import com.xjrsoft.module.xycxedu.entity.ExamPlan;
 import com.xjrsoft.module.xycxedu.entity.ExamSubjectScore;
 import com.xjrsoft.module.xycxedu.mapper.ExamSubjectScoreMappper;
+import com.xjrsoft.module.xycxedu.service.IExamPlanService;
 import com.xjrsoft.module.xycxedu.service.IExamSubjectScoreService;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScorePageVo;
+import com.xjrsoft.module.xycxedu.vo.ClassStudentScoreTitleVo;
 import com.xjrsoft.module.xycxedu.vo.ExamStatisticsPageVo;
+import com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterImportVo;
 import com.xjrsoft.module.xycxedu.vo.ExamSubjectScorePageVo;
 import lombok.AllArgsConstructor;
+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.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;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * @title: 晓羊策学考试计划表
  * @Author dzx
@@ -21,6 +62,11 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class ExamSubjectScoreServiceImpl extends MPJBaseServiceImpl<ExamSubjectScoreMappper, ExamSubjectScore> implements IExamSubjectScoreService {
+
+    private final IStudentManagerService studentManagerService;
+    private final IBaseSemesterService semesterService;
+    private final IExamPlanService examPlanService;
+
     @Override
     public Long getUserIdByIdNumber(String idNumber) {
         return this.baseMapper.getUserIdByIdNumber(idNumber);
@@ -35,4 +81,297 @@ public class ExamSubjectScoreServiceImpl extends MPJBaseServiceImpl<ExamSubjectS
     public Page<ExamStatisticsPageVo> getStatisticsPage(Page<ExamStatisticsPageVo> page, ExamStatisticsPageDto dto) {
         return this.baseMapper.getStatisticsPage(page, dto);
     }
+
+    @Override
+    public List<ExamSubjectScoreEnterImportVo> getEnterScoreStudentList(ExamSubjectScoreEnterDto dto) {
+        List<ExamSubjectScoreEnterImportVo> result = this.selectJoinList(ExamSubjectScoreEnterImportVo.class,
+                new MPJLambdaWrapper<ExamSubjectScore>()
+                        .select(ExamSubjectScore::getId)
+                        .selectAs(BaseClass::getName, ExamSubjectScoreEnterImportVo::getClassName)
+                        .selectAs(User::getName, ExamSubjectScoreEnterImportVo::getStudentName)
+                        .selectAs(User::getCredentialNumber, ExamSubjectScoreEnterImportVo::getCredentialNumber)
+                        .select(ExamSubjectScore::getScore)
+                        .select(ExamSubjectScore::getClassRanking)
+                        .select(ExamSubjectScore::getGradeRanking)
+                        .innerJoin(User.class, User::getId, ExamSubjectScore::getUserId)
+                        .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, ExamSubjectScore::getUserId)
+                        .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                        .eq(dto.getClassId() != null, BaseClass::getId, dto.getClassId())
+                        .like(StrUtil.isNotEmpty(dto.getStudentName()), User::getName, dto.getStudentName())
+                        .like(StrUtil.isNotEmpty(dto.getCredentialNumber()), User::getCredentialNumber, dto.getCredentialNumber())
+                        .isNotNull(dto.getIsEnter() != null && dto.getIsEnter() == 1, ExamSubjectScore::getScore)
+                        .isNull(dto.getIsEnter() != null && dto.getIsEnter() == 0, ExamSubjectScore::getScore)
+                        .eq(dto.getExamSubjectScoreEnterId() != null, ExamSubjectScore::getExamSubjectScoreEnterId, dto.getExamSubjectScoreEnterId())
+                        .orderByAsc(BaseClass::getName)
+        );
+        return result;
+    }
+
+    @Override
+    public PageOutput<ExamSubjectScoreEnterImportVo> getEnterScoreStudentPage(Page<ExamSubjectScoreEnterImportVo> page, ExamSubjectScoreEnterDto dto) {
+        IPage<ExamSubjectScoreEnterImportVo> voIPage = this.selectJoinListPage(page, ExamSubjectScoreEnterImportVo.class,
+                new MPJLambdaWrapper<ExamSubjectScore>()
+                        .select(ExamSubjectScore::getId)
+                        .selectAs(BaseClass::getName, ExamSubjectScoreEnterImportVo::getClassName)
+                        .selectAs(User::getName, ExamSubjectScoreEnterImportVo::getStudentName)
+                        .selectAs(User::getCredentialNumber, ExamSubjectScoreEnterImportVo::getCredentialNumber)
+                        .select(ExamSubjectScore::getScore)
+                        .select(ExamSubjectScore::getClassRanking)
+                        .select(ExamSubjectScore::getGradeRanking)
+                        .innerJoin(User.class, User::getId, ExamSubjectScore::getUserId)
+                        .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, ExamSubjectScore::getUserId)
+                        .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                        .eq(dto.getClassId() != null, BaseClass::getId, dto.getClassId())
+                        .like(StrUtil.isNotEmpty(dto.getStudentName()), User::getName, dto.getStudentName())
+                        .like(StrUtil.isNotEmpty(dto.getCredentialNumber()), User::getCredentialNumber, dto.getCredentialNumber())
+                        .isNotNull(dto.getIsEnter() != null && dto.getIsEnter() == 1, ExamSubjectScore::getScore)
+                        .isNull(dto.getIsEnter() != null && dto.getIsEnter() == 0, ExamSubjectScore::getScore)
+                        .eq(dto.getExamSubjectScoreEnterId() != null, ExamSubjectScore::getExamSubjectScoreEnterId, dto.getExamSubjectScoreEnterId())
+        );
+        PageOutput<ExamSubjectScoreEnterImportVo> pageOutput = ConventPage.getPageOutput(voIPage, ExamSubjectScoreEnterImportVo.class);
+        return pageOutput;
+    }
+
+    @Override
+    public List<ClassStudentScoreTitleVo> getClassStudentScoreCourse(ClassStudentScorePageDto dto) {
+        return this.baseMapper.getClassStudentScoreCourse(dto);
+    }
+
+    @Override
+    public List<ExamSubjectScore> getClassStudentScoreList(ClassStudentScorePageDto dto) {
+        return this.baseMapper.getClassStudentScoreList(dto);
+    }
+
+    @Override
+    public PageOutput<ClassStudentScorePageVo> getClassStudentScorePage(ClassStudentScorePageDto dto) {
+        BaseStudentUserPageDto studentDto = BeanUtil.toBean(dto, BaseStudentUserPageDto.class);
+        if(dto.getTreeType() != null && dto.getTreeType() == 4){
+            studentDto.setQueryId(dto.getTreeId());
+        }
+        Page<BaseStudentUserPageVo> studentPage = studentManagerService.getStudentPage(new Page<>(dto.getLimit(), dto.getSize()), studentDto);
+
+        Set<Long> userIdSet = studentPage.getRecords().stream().map(x -> Long.parseLong(x.getId())).collect(Collectors.toSet());
+        dto.setUserIdList(new ArrayList<>(userIdSet));
+        List<ExamSubjectScore> allScoreList = this.baseMapper.getClassStudentScoreList(dto);
+        Map<Long, List<ExamSubjectScore>> listMap = allScoreList.stream().collect(Collectors.groupingBy(ExamSubjectScore::getUserId));
+        PageOutput<ClassStudentScorePageVo> pageOutput = ConventPage.getPageOutput(studentPage, ClassStudentScorePageVo.class);
+
+        for (ClassStudentScorePageVo vo : pageOutput.getList()) {
+            long userId = Long.parseLong(vo.getId());
+            List<ClassStudentScoreTitleVo> scoreList = new ArrayList<>();
+
+            List<ExamSubjectScore> scores = listMap.get(userId);
+            if(scores == null){
+                continue;
+            }
+            for (ExamSubjectScore score : scores) {
+                scoreList.add(
+                        new ClassStudentScoreTitleVo(){{
+                            if(score.getScore() != null){
+                                setScore(Float.toString(score.getScore()));
+                            }
+                            if(score.getExamPlanId() == null){
+                                setCourseId(score.getMilexamid() + "" + score.getCourseSubjectId());
+                            }else{
+                                setCourseId(score.getExamPlanId() + "" + score.getCourseSubjectId());
+                            }
+                            setName(score.getCoursename());
+                        }}
+                );
+            }
+            vo.setScoreList(scoreList);
+        }
+        return pageOutput;
+    }
+
+    @Override
+    public byte[] getClassStudentScoreExportQuery(ClassStudentScorePageDto dto) throws IOException {
+        //查询表头
+        List<ClassStudentScoreTitleVo> titleList = this.getClassStudentScoreCourse(dto);
+
+        Workbook workbook = new XSSFWorkbook();
+        // 创建一个工作表(sheet)
+        String sheetName = "数据";
+        Sheet sheet = workbook.createSheet(sheetName);
+
+        createFirstTitle(workbook, sheet, semesterService.getById(dto.getSemesterId()), examPlanService.getById(dto.getExamPlanId()), titleList);
+
+        createTitle(workbook, sheet, titleList);
+
+        //查询数据
+        dto.setSize(1000);
+        dto.setLimit(1);
+        PageOutput<ClassStudentScorePageVo> studentScorePage = this.getClassStudentScorePage(dto);
+        List<ClassStudentScorePageVo> list = studentScorePage.getList();
+
+        ArrayList<ArrayList<String>> excelDataList = new ArrayList<>();
+        int sortCode = 1;
+        for (ClassStudentScorePageVo studentVo : list) {
+            ArrayList<String> rowData = new ArrayList<>();
+            rowData.add(sortCode + "");
+            rowData.add(studentVo.getClassName());
+            rowData.add(studentVo.getName());
+            rowData.add(studentVo.getGenderCn());
+            rowData.add(studentVo.getCredentialNumber());
+            rowData.add(studentVo.getMobile());
+            rowData.add(studentVo.getTeacherName());
+
+            List<ClassStudentScoreTitleVo> scoreList = studentVo.getScoreList();
+            if(scoreList == null){
+                for (ClassStudentScoreTitleVo scoreTitleVo : titleList) {
+                    rowData.add("");
+                }
+                excelDataList.add(rowData);
+                sortCode ++;
+                continue;
+            }
+            BigDecimal reduce = scoreList.stream().filter(x -> StrUtil.isNotEmpty(x.getScore())).map(x -> new BigDecimal(x.getScore())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal totalSocre = reduce
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            if(!totalSocre.equals(BigDecimal.ZERO)){
+                totalSocre = totalSocre.stripTrailingZeros();
+                if (totalSocre.scale() <= 0) { // 如果是整数
+                    rowData.add(totalSocre.toBigInteger().toString());
+                } else {
+                    rowData.add(totalSocre.toPlainString());
+                }
+            }else{
+                rowData.add("");
+            }
+
+            Map<String, String> scoreMap = scoreList.stream().filter(x -> StrUtil.isNotEmpty(x.getScore())).collect(Collectors.toMap(ClassStudentScoreTitleVo::getCourseId, ClassStudentScoreTitleVo::getScore));
+
+            for (ClassStudentScoreTitleVo scoreTitleVo : titleList) {
+                String score = scoreMap.get(scoreTitleVo.getCourseId());
+                if(StrUtil.isEmpty(score)){
+                    rowData.add("");
+                    continue;
+                }
+                BigDecimal scorebd = new BigDecimal(score);
+                scorebd = scorebd.stripTrailingZeros();
+                if (scorebd.scale() <= 0) { // 如果是整数
+                    rowData.add(scorebd.toBigInteger().toString());
+                } else {
+                    rowData.add(scorebd.toPlainString());
+                }
+            }
+            excelDataList.add(rowData);
+            sortCode ++;
+        }
+
+        createData(workbook, sheet, excelDataList);
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        workbook.write(bot);
+        return bot.toByteArray();
+    }
+
+    void createFirstTitle(Workbook workbook, Sheet sheet, BaseSemester semester, ExamPlan examPlan, List<ClassStudentScoreTitleVo> titleList) {
+        int rowNumber = 0;
+        Font font = workbook.createFont();
+        font.setBold(true);// 设置为粗体
+        font.setFontName("宋体");
+        //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        font.setFontHeightInPoints((short)14);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row = sheet.createRow(rowNumber);
+
+        int cellNumber = 0;
+        Cell cell = row.createCell(cellNumber);
+        cell.setCellValue(semester.getName() + "-" + examPlan.getName());
+        cell.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(0, 0, cellNumber, cellNumber + 8 + titleList.size() - 1));
+    }
+
+    void createTitle(Workbook workbook, Sheet sheet, List<ClassStudentScoreTitleVo> titleList) {
+        int rowNumber = 1;
+        Font font = workbook.createFont();
+        font.setBold(true);// 设置为粗体
+        font.setFontName("宋体");
+        //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        font.setFontHeightInPoints((short)14);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row = sheet.createRow(rowNumber);
+
+        int cellNumber = 0;
+        Cell cell = row.createCell(cellNumber);
+        cell.setCellValue("序号");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("班级");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("姓名");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("性别");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("身份证号");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("手机号");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("班主任");
+        cell.setCellStyle(cellStyle);
+
+        cellNumber ++;
+        cell = row.createCell(cellNumber);
+        cell.setCellValue("总分");
+        cell.setCellStyle(cellStyle);
+
+
+        cellNumber ++;
+        for(int i = 0; i < titleList.size(); i ++){
+            ClassStudentScoreTitleVo titleVo = titleList.get(i);
+            cell = row.createCell(cellNumber + i);
+            cell.setCellValue(titleVo.getName());
+            cell.setCellStyle(cellStyle);
+            sheet.setColumnWidth(cellNumber, 5 * 3 * 256);
+        }
+    }
+
+    void createData(Workbook workbook, Sheet sheet, ArrayList<ArrayList<String>> excelDataList) {
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        int rowNumber = 2;
+        for (ArrayList<String> rowData : excelDataList) {
+            Row row = sheet.createRow(rowNumber);
+            for (int i =0; i < rowData.size(); i ++) {
+                Cell cell = row.createCell(i);
+                cell.setCellValue(rowData.get(i));
+                cell.setCellStyle(cellStyle);
+            }
+            rowNumber ++;
+        }
+    }
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/xycxedu/util/DataUtil.java

@@ -110,7 +110,7 @@ public class DataUtil {
                 }
                 ExamSubjectScore score = new ExamSubjectScore() {{
                     setUserId(userId);
-                    setScore(scoreObj.get("score").getAsInt());
+                    setScore(scoreObj.get("score").getAsFloat());
                     setMilexamid(examidXMilexamidMap.get(examid).longValue());
                     setGradeRanking(scoreObj.get("gradeorder").getAsInt());
                     setClassRanking(scoreObj.get("classorder").getAsInt());

+ 21 - 0
src/main/java/com/xjrsoft/module/xycxedu/vo/ClassStudentScorePageVo.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.xycxedu.vo;
+
+import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+* @title: 考试计划维护表单出参
+* @Author dzx
+* @Date: 2024-07-18
+* @Version 1.0
+*/
+@Data
+public class ClassStudentScorePageVo extends BaseStudentUserPageVo {
+
+    @ApiModelProperty("学生姓名")
+    private List<ClassStudentScoreTitleVo> scoreList;
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/xycxedu/vo/ClassStudentScoreTitleVo.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.xycxedu.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 考试计划维护表单出参
+* @Author dzx
+* @Date: 2024-07-18
+* @Version 1.0
+*/
+@Data
+public class ClassStudentScoreTitleVo {
+
+    @ApiModelProperty("科目id")
+    private String courseId;
+
+    @ApiModelProperty("科目名称")
+    private String name;
+
+    @ApiModelProperty("科目分数")
+    private String score;
+
+}

+ 57 - 0
src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterImportVo.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.xycxedu.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+* @title: 成绩录入
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class ExamSubjectScoreEnterImportVo{
+
+
+    @ApiModelProperty("主键id")
+    private Long id;
+
+    @ExcelProperty("班级")
+    @ApiModelProperty("班级")
+    @Required
+    private String className;
+
+    @ExcelProperty("学生姓名")
+    @ApiModelProperty("学生姓名")
+    @Required
+    private String studentName;
+
+    @ExcelProperty("学生身份证")
+    @ApiModelProperty("学生身份证")
+    @Required
+    private String credentialNumber;
+
+    @ExcelProperty("科目")
+    @ApiModelProperty("科目")
+    @Required
+    private String courseSubjectName;
+
+    @ExcelProperty("成绩")
+    @ApiModelProperty("成绩")
+    @Required
+    private String score;
+
+    @ExcelProperty("班级排名")
+    @ApiModelProperty("班级排名")
+    private Integer classRanking;
+
+    @ExcelProperty("年级排名")
+    @ApiModelProperty("年级排名")
+    private Integer gradeRanking;
+
+}

+ 69 - 0
src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterPageVo.java

@@ -0,0 +1,69 @@
+package com.xjrsoft.module.xycxedu.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 成绩录入分页列表出参
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class ExamSubjectScoreEnterPageVo {
+
+    /**
+    * 主键
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键")
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建人")
+    @ApiModelProperty("创建人")
+    private String createUserName;
+    /**
+    * 创建时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 科目名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("科目名称")
+    @ApiModelProperty("科目名称")
+    private String courseSubjectName;
+    /**
+    * 考试计划id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("考试计划")
+    @ApiModelProperty("考试计划")
+    private String examPlanName;
+    /**
+    * 学期id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    private String semesterName;
+    /**
+    * 班级id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
+    private String className;
+
+}

+ 69 - 0
src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterStudentVo.java

@@ -0,0 +1,69 @@
+package com.xjrsoft.module.xycxedu.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 成绩录入分页列表出参
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class ExamSubjectScoreEnterStudentVo {
+
+    /**
+    * 主键
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键")
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建人")
+    @ApiModelProperty("创建人")
+    private String createUserName;
+    /**
+    * 创建时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 科目名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("科目名称")
+    @ApiModelProperty("科目名称")
+    private String courseSubjectName;
+    /**
+    * 考试计划id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("考试计划")
+    @ApiModelProperty("考试计划")
+    private String examPlanName;
+    /**
+    * 学期id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    private String semesterName;
+    /**
+    * 班级id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
+    private String className;
+
+}

+ 79 - 0
src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScoreEnterVo.java

@@ -0,0 +1,79 @@
+package com.xjrsoft.module.xycxedu.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.module.base.entity.BaseClass;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 成绩录入表单出参
+* @Author dzx
+* @Date: 2025-01-06
+* @Version 1.0
+*/
+@Data
+public class ExamSubjectScoreEnterVo {
+
+    /**
+     * 主键
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键")
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+     * 创建人
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("创建人")
+    private String createUserName;
+    /**
+     * 创建时间
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+     * 科目名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("科目名称")
+    private String courseSubjectName;
+    /**
+     * 考试计划id
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("考试计划")
+    private String examPlanName;
+    /**
+     * 学期id
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学期")
+    private String semesterName;
+    /**
+     * 班级id
+     */
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("所有学生数量")
+    private Integer allCount;
+
+
+    @ApiModelProperty("已录入学生数量")
+    private Integer handleCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班级名称")
+    private String classIds;
+
+    @ApiModelProperty("班级")
+    private List<BaseClass> classList;
+
+}

+ 4 - 1
src/main/java/com/xjrsoft/module/xycxedu/vo/ExamSubjectScorePageVo.java

@@ -27,10 +27,13 @@ public class ExamSubjectScorePageVo {
     private String coursename;
 
     @ApiModelProperty("成绩")
-    private Integer score;
+    private String score;
 
     @ApiModelProperty("年级排名")
     private Integer gradeRanking;
 
+    @ApiModelProperty("班级排名")
+    private Integer classRanking;
+
 
 }

+ 1 - 1
src/main/resources/mapper/banding/BandingTaskMajorConditionMapper.xml

@@ -7,7 +7,7 @@
             resultType="com.xjrsoft.module.banding.vo.BandingTaskMajorConditionListVo">
         SELECT t1.id, t.id AS major_set_id, t.name AS major_set_name,t1.banding_task_id,t1.height,t1.score, t1.sort_code FROM base_major_set t
         LEFT JOIN banding_task_major_condition t1 ON t1.major_set_id = t.id and t1.banding_task_id = #{dto.bandingTaskId} and t1.delete_mark = 0
-        WHERE t.delete_mark = 0
+        WHERE t.delete_mark = 0 and t.enabled_mark = 1
         <if test="dto.majorIds != null and !dto.majorIds.isEmpty()">
             and t.id in
             <foreach item="id" index="index" collection="dto.majorIds" open="(" close=")" separator=",">

+ 9 - 0
src/main/resources/mapper/organization/UserMapper.xml

@@ -7,6 +7,12 @@
         SELECT DISTINCT t1.*,t3.name AS gender_cn FROM xjr_user t1
         INNER JOIN xjr_user_role_relation t2 ON t2.user_id = t1.id
         LEFT JOIN xjr_dictionary_detail t3 ON t1.gender = t3.code
+        <if test="dto.roleId != null and dto.roleId=='2'">
+            INNER JOIN base_teacher t4 on t1.id=t4.user_id
+        </if>
+        <if test="dto.roleId != null and dto.roleId=='3'">
+            INNER JOIN base_student t4 on t1.id=t4.user_id
+        </if>
         WHERE t1.delete_mark = 0
         <if test="dto.keyword != null and dto.keyword !=''">
             and (t1.name like concat('%', #{dto.keyword}, '%') or t1.mobile like concat('%', #{dto.keyword}, '%'))
@@ -14,6 +20,9 @@
         <if test="dto.roleId != null">
             and t2.role_id = #{dto.roleId}
         </if>
+        <if test="dto.roleId != null and (dto.roleId=='2' or dto.roleId=='3')">
+            and t4.delete_mark = 0 AND t4.is_normal = 1
+        </if>
     </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, t4.name AS class_name,t1.mobile,

+ 7 - 3
src/main/resources/mapper/personnel/BasePersonnelLabourCapitalMapper.xml

@@ -19,12 +19,16 @@
                 LEFT JOIN xjr_user u ON t1.job_number = u.user_name
                 LEFT JOIN xjr_user_dept_relation w ON u.id = w.user_id
                 LEFT JOIN xjr_department d ON w.dept_id = d.id
-        WHERE t.delete_mark = 0
-        <if test="dto.year != null and dto.month != null">
+        WHERE t.delete_mark = 0 and t.category = #{dto.category}
+        <if test="dto.category == 1 and dto.year != null and dto.month != null">
             and YEAR(t.date_of_issue) = #{dto.year}
             and MONTH(t.date_of_issue) = #{dto.month}
             and t1.job_number = #{dto.jobNumber}
         </if>
+        <if test="dto.category == 2 and dto.year != null">
+            and year = #{dto.year}
+            and t1.job_number = #{dto.jobNumber}
+        </if>
     </select>
 
     <select id="getYearPage" parameterType="com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto" resultType="com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo">
@@ -44,7 +48,7 @@
                  LEFT JOIN xjr_department d ON w.dept_id = d.id
                  LEFT JOIN base_personnel_labour_capital_title bp ON bp.labour_capital_id = t.id
         WHERE
-            t.delete_mark = 0
+            t.delete_mark = 0 and t1.category = #{dto.category}
         and YEAR(t1.date_of_issue) = #{dto.year}
         and t.job_number = #{dto.jobNumber}
     </select>

+ 6 - 10
src/main/resources/mapper/room/RoomBedMapper.xml

@@ -358,16 +358,12 @@
         <if test="dto.floorNumber != null">
             and t2.floor_number = #{dto.floorNumber}
         </if>
-        <if test="dto.isTeacher != null">
-            <if test="dto.classId != null">
-                AND (t2.id IN (
-                SELECT DISTINCT c1.room_id FROM room_bed c1
-                INNER JOIN base_student_school_roll c2 ON c1.student_user_id = c2.user_id
-                WHERE c2.class_id = #{dto.classId}
-                ) or
-                t2.bed_count != (SELECT COUNT(*) FROM room_bed WHERE delete_mark = 0 AND student_user_id IS not NULL AND room_id = t2.id)
-                )
-            </if>
+        <if test="dto.classId != null">
+            AND t2.id IN (
+            SELECT DISTINCT c1.room_id FROM room_bed c1
+            INNER JOIN base_student_school_roll c2 ON c1.student_user_id = c2.user_id
+            WHERE c2.class_id = #{dto.classId}
+            )
         </if>
         <if test="dto.buildId != null">
             and t3.id = #{dto.buildId}

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

@@ -300,7 +300,7 @@
         ) AS female_count FROM base_major_set t1
         LEFT JOIN banding_task_major_condition t2 ON t1.id = t2.major_set_id AND t2.banding_task_id = #{id}
         AND t2.delete_mark = 0
-        WHERE t1.delete_mark = 0
+        WHERE t1.delete_mark = 0 and t1.enabled_mark = 1
     </select>
 
 </mapper>

+ 35 - 23
src/main/resources/mapper/student/BaseStudentAssessmentInspectionMapper.xml

@@ -4,14 +4,12 @@
         "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.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,(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 NAME FROM base_class
         WHERE id = t.class_ids
         ) AS assessment_class_names,
-        (
-        (LENGTH(personal_student_user_ids) - LENGTH(REPLACE(personal_student_user_ids, ',', '')))
-        ) + 1 AS student_count,t.enabled_mark,t.assessment_type
+        (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 student_count,t.enabled_mark,t.assessment_type
         FROM base_student_assessment_inspection t
         LEFT JOIN base_student_assessment_category t1 ON (t1.id = t.base_student_assessment_category_id)
         LEFT JOIN base_student_assessment_project t2 ON (t2.id = t.base_student_assessment_project_id)
@@ -20,7 +18,7 @@
         LEFT JOIN xjr_user t5 ON t.assessment_user_id = t5.id
         LEFT JOIN xjr_dictionary_detail t6 ON t6.code= t.score_type
         LEFT JOIN base_class t7 ON t7.id = CAST(t.class_ids AS SIGNED)
-        WHERE  t.delete_mark = 0 AND t.delete_mark = 0  AND t2.delete_mark = 0
+        WHERE  t.delete_mark = 0 AND t.delete_mark = 0  AND t2.delete_mark = 0 and t.enabled_mark = 1
         <if test="dto.projectIds != null">
             and t.base_student_assessment_category_id = #{dto.projectIds}
         </if>
@@ -45,12 +43,13 @@
         <if test="dto.teacherId != null">
             and t7.teacher_id = #{dto.teacherId}
         </if>
+        order by t.id desc
     </select>
 
     <select id="getInfo" resultType="com.xjrsoft.module.student.vo.BaseStudentAssessmentInspectionVo">
         select t.id,t.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,t.file_id,t7.name as create_user_name
-        ,t.total_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
         from base_student_assessment_inspection t
         left join base_student_assessment_category t1 on (t1.id = t.base_student_assessment_category_id)
         left join base_student_assessment_project t2 on (t2.id = t.base_student_assessment_project_id)
@@ -59,16 +58,12 @@
         left join xjr_user t5 on t.assessment_user_id=t5.id
         left join xjr_dictionary_detail t6 on t6.code=t.score_type
         left join xjr_user t7 on t.create_user_id=t7.id
-        where t.id = #{id} and t.delete_mark = 0 and t1.delete_mark = 0 and t2.delete_mark = 0
+        where t.id = #{id} and t.delete_mark = 0 and t1.delete_mark = 0 and t2.delete_mark = 0 and t.enabled_mark = 1
     </select>
 
     <select id="getMobilePage" parameterType="com.xjrsoft.module.student.dto.BaseStudentAssessmentInspectionMobilePageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentAssessmentInspectionMobilePageVo">
         SELECT t.id,t1.assessment_date,t2.name AS assessment_category_name,t3.name AS assessment_project_name,t5.name AS
-        assessment_class_name,t1.reason,t1.score,t1.score_type,t4.name AS score_type_cn,
-        (
-        SELECT COUNT(*) FROM base_student_assessment_student_relation WHERE
-        base_student_assessment_inspection_id = t1.id AND class_id = t.class_id AND delete_mark = 0 and enabled_mark = 1
-        ) AS student_count,t1.assessment_type,
+        assessment_class_name,t1.reason,(t1.score * IF(personal_student_user_ids IS NULL, 1, (SELECT COUNT(*) FROM base_student_assessment_student_relation WHERE base_student_assessment_inspection_id = t1.id AND delete_mark = 0 AND enabled_mark = 1))) as score,t1.score_type,t4.name AS score_type_cn,
         (
         SELECT COUNT(*) FROM base_student_assessment_student_relation WHERE base_student_assessment_inspection_id =
         t1.id AND class_id = t.class_id AND delete_mark = 0 and enabled_mark = 1
@@ -78,9 +73,9 @@
         LEFT JOIN base_student_assessment_category t2 ON (t2.id = t1.base_student_assessment_category_id)
         LEFT JOIN base_student_assessment_project t3 ON (t3.id = t1.base_student_assessment_project_id)
         LEFT JOIN base_student_assessment_item t6 ON (t6.id = t1.base_student_assessment_item_id)
-        LEFT JOIN xjr_dictionary_detail t4 ON t4.code=t1.score_type
+        LEFT JOIN xjr_dictionary_detail t4 ON t4.code = t1.score_type
         LEFT JOIN base_class t5 ON t5.id=t.class_id
-        WHERE t1.delete_mark = 0 and t.class_id in
+        WHERE t1.delete_mark = 0 and t1.enabled_mark = 1 and t.class_id in
         <foreach item="classId" index="index" collection="dto.classIds" open="(" close=")" separator=",">
             #{classId}
         </foreach>
@@ -96,11 +91,24 @@
         <if test="dto.endDate != null and dto.endDate != ''">
             and t1.assessment_date &lt;= #{dto.endDate}
         </if>
+        <if test="dto.keyword != null and dto.keyword != ''">
+            and (
+            t2.name like concat('%', #{dto.keyword}, '%')
+            or t3.name like concat('%', #{dto.keyword}, '%')
+            or t5.name like concat('%', #{dto.keyword}, '%')
+            or t6.name like concat('%', #{dto.keyword}, '%')
+            or t1.reason like concat('%', #{dto.keyword}, '%')
+            )
+        </if>
+        order by t1.id desc
     </select>
 
     <select id="getMobileInfo" resultType="com.xjrsoft.module.student.vo.BaseStudentAssessmentInspectionMobileVo">
-        select t.id,t.class_id,t.base_student_assessment_inspection_id,t1.score,t5.name as assessment_class_name,t2.name as assessment_category_name,t3.name as assessment_project_name,t1.assessment_date,t1.reason,
-        t6.name as assessment_user_name,t7.name as create_user_name,t1.create_date,t1.file_id,t1.score_type,t4.name as score_type_cn,t1.assessment_type,t8.name as assessment_item_name
+        select t.id,t.class_id,t.base_student_assessment_inspection_id,
+        (t1.score * IF(personal_student_user_ids IS NULL, 1, (SELECT COUNT(*) FROM base_student_assessment_student_relation WHERE base_student_assessment_inspection_id = t1.id AND delete_mark = 0 AND enabled_mark = 1))) as score
+        ,t5.name as assessment_class_name,t2.name as assessment_category_name,t3.name as assessment_project_name,t1.assessment_date,t1.reason,
+        t6.name as assessment_user_name,t7.name as create_user_name,t1.create_date,t1.file_id,t1.score_type,t4.name as score_type_cn,t1.assessment_type,
+        t8.name as assessment_item_name,t9.name as modify_user_name, t1.modify_date
         from base_student_assessment_class_relation t
         left join base_student_assessment_inspection t1 on t1.id=t.base_student_assessment_inspection_id
         left join base_student_assessment_category t2 on (t2.id = t1.base_student_assessment_category_id)
@@ -108,9 +116,10 @@
         left join base_student_assessment_item t8 on (t8.id = t1.base_student_assessment_item_id)
         left join xjr_dictionary_detail t4 on t4.code=t1.score_type
         left join base_class t5 on t5.id=t.class_id
-        left join xjr_user t6 on t1.assessment_user_id=t6.id
-        left join xjr_user t7 on t1.create_user_id=t7.id
-        where t.id = #{id};
+        left join xjr_user t6 on t1.assessment_user_id = t6.id
+        left join xjr_user t7 on t1.create_user_id = t7.id
+        left join xjr_user t9 on t1.modify_user_id = t9.id
+        where t.id = #{id} and t1.enabled_mark = 1;
     </select>
 
     <select id="getStudentIndividualBehaviorExcelVoList" parameterType="com.xjrsoft.module.student.dto.QuantitativeAssessmentExcelDto" resultType="com.xjrsoft.module.student.vo.QuantitativeAssessmentSubTableExcelVo">
@@ -229,10 +238,10 @@
     <select id="getAssessmentInspectionByClassIdList" parameterType="com.xjrsoft.module.student.dto.QuantitativeAssessmentSingleScoreDto" resultType="com.xjrsoft.module.student.vo.QuantitativeAssessmentSingleScoreVo">
         select
         t.class_ids as class_id,
-        SUM(t.score * (LENGTH(personal_student_user_ids) - LENGTH(REPLACE(personal_student_user_ids, ',', '')) + 1)) AS sumScore
+        SUM(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 sumScore
         from base_student_assessment_inspection t
         inner join base_student_assessment_category t1 on t1.id = t.base_student_assessment_category_id
-        where t.delete_mark = 0
+        where t.delete_mark = 0 and t.enabled_mark = 1
         <if test="dto.classIdList != null and !dto.classIdList.isEmpty()">
             and t.class_ids in
             <foreach item="classId" index="index" collection="dto.classIdList" open="(" close=")" separator=",">
@@ -254,6 +263,9 @@
         <if test="dto.endTime != null">
             and t.create_date &lt; #{dto.endTime}
         </if>
+        <if test="dto.year != null and dto.month != null">
+            and YEAR(t.assessment_date) = #{dto.year} and month(t.assessment_date) = #{dto.month}
+        </if>
         group by t.class_ids;
     </select>
 
@@ -264,7 +276,7 @@
         from base_student_assessment_class_relation t
                  left join base_student_assessment_inspection t1 on t1.id = t.base_student_assessment_inspection_id
                  left join base_student_assessment_category t2 on t2.id = t1.base_student_assessment_category_id
-        where t2.code = 'convention_manage'
+        where t2.code = 'convention_manage' and t1.enabled_mark = 1
           and t.class_id in
         <foreach item="classId" index="index" collection="dto.classIdList" open="(" close=")" separator=",">
             #{classId}
@@ -330,6 +342,6 @@
         INNER JOIN base_major_set t5 ON t4.major_set_id = t5.id
         LEFT JOIN xjr_dictionary_detail t6 ON t3.nation = t6.code
         LEFT JOIN xjr_dictionary_detail t7 ON t2.gender = t7.code
-        WHERE t1.base_student_assessment_inspection_id = #{id}
+        WHERE t1.base_student_assessment_inspection_id = #{id} and t1.enabled_mark = 1
     </select>
 </mapper>

+ 3 - 0
src/main/resources/mapper/student/BaseStudentMapper.xml

@@ -96,6 +96,9 @@
         <if test="dto.gradeId != null">
             and t4.grade_id = #{dto.gradeId}
         </if>
+        <if test="dto.teacherId != null">
+            and t4.teacher_id = #{dto.teacherId}
+        </if>
         <if test="dto.order == null">
             order by t1.id
         </if>

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

@@ -99,7 +99,7 @@
                t3.stduy_status                                                                                               as stduyStatusCode,
                t3.roll_modality                                                                                              as rollModalityCode,
                t3.roll_number AS rollNumber,
-                t12.name AS student_form,
+                t12.name AS student_form,t3.archives_number,
                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,

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

@@ -23,7 +23,7 @@
         from base_major_set t
         left join base_major_gradation t3 on t3.id = t.major_gradation_id
         left join xjr_department t4 on t4.id = t.department_id
-        where t.delete_mark = 0
+        where t.delete_mark = 0 and t.enabled_mark = 1
         <if test="dto.name != null and dto.name != ''">
             and t.name like concat('%', #{dto.name}, '%')
         </if>

+ 76 - 0
src/main/resources/mapper/teacher/WfTeacherleaveMapper.xml

@@ -62,4 +62,80 @@
             </foreach>
         </if>
     </select>
+
+    <select id="getStatisticsPage" parameterType="com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto" resultType="com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo">
+        SELECT t2.user_name, t2.name, t1.leave_type,SUM(t1.leave_days) as leave_days
+        ,(
+        SELECT GROUP_CONCAT(a1.name) FROM xjr_department a1
+        INNER JOIN xjr_user_dept_relation a2 ON a1.id = a2.dept_id
+        WHERE a1.delete_mark = 0 AND a2.user_id = t2.id
+        ) AS dept_name
+        FROM wf_teacherleave t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_workflow_form_relation t3 ON t3.form_key_value = t1.id
+        WHERE t3.current_state = 'COMPLETED' AND t2.delete_mark = 0
+        <if test="dto.startTime != null and dto.endTime != null">
+            AND (
+            (t1.leave_start_time BETWEEN #{dto.startTime} and #{dto.endTime})
+            OR (t1.leave_end_time BETWEEN #{dto.startTime} and #{dto.endTime})
+            OR (t1.leave_start_time > #{dto.startTime} and #{dto.endTime} > t1.leave_end_time)
+            OR (#{dto.startTime} > t1.leave_start_time and t1.leave_end_time > #{dto.endTime})
+            )
+        </if>
+        <if test="dto.userIds != null and dto.userIds.size() > 0">
+            AND t1.user_id in
+            <foreach item="userId" index="index" collection="dto.userIds" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="dto.leaveType != null and dto.leaveType != ''">
+            AND #{dto.leaveType} like concat('%', t1.leave_type, '%')
+        </if>
+        <if test="dto.name != null and dto.name != ''">
+            AND t2.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.userName != null and dto.userName != ''">
+            AND t2.user_name like concat('%', #{dto.userName}, '%')
+        </if>
+        GROUP BY t1.user_id,t1.leave_type
+        ORDER BY t2.user_name
+    </select>
+
+    <select id="getStatisticsList" parameterType="com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto" resultType="com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo">
+        SELECT t2.user_name, t2.name, t1.leave_type,SUM(t1.leave_days) as leave_days
+        ,(
+        SELECT GROUP_CONCAT(a1.name) FROM xjr_department a1
+        INNER JOIN xjr_user_dept_relation a2 ON a1.id = a2.dept_id
+        WHERE a1.delete_mark = 0 AND a2.user_id = t2.id
+        ) AS dept_name
+        FROM wf_teacherleave t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_workflow_form_relation t3 ON t3.form_key_value = t1.id
+        WHERE t3.current_state = 'COMPLETED' AND t2.delete_mark = 0
+        <if test="dto.startTime != null and dto.endTime != null">
+            AND (
+            (t1.leave_start_time BETWEEN #{dto.startTime} and #{dto.endTime})
+            OR (t1.leave_end_time BETWEEN #{dto.startTime} and #{dto.endTime})
+            OR (t1.leave_start_time > #{dto.startTime} and #{dto.endTime} > t1.leave_end_time)
+            OR (#{dto.startTime} > t1.leave_start_time and t1.leave_end_time > #{dto.endTime})
+            )
+        </if>
+        <if test="dto.userIds != null and dto.userIds.size() > 0">
+            AND t1.user_id in
+            <foreach item="userId" index="index" collection="dto.userIds" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="dto.leaveType != null and dto.leaveType != ''">
+            AND #{dto.leaveType} like concat('%', t1.leave_type, '%')
+        </if>
+        <if test="dto.name != null and dto.name != ''">
+            AND t2.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.userName != null and dto.userName != ''">
+            AND t2.user_name like concat('%', #{dto.userName}, '%')
+        </if>
+        GROUP BY t1.user_id,t1.leave_type
+        ORDER BY t2.user_name
+    </select>
 </mapper>

+ 44 - 0
src/main/resources/mapper/xycxedu/ExamSubjectScoreEnterMappper.xml

@@ -0,0 +1,44 @@
+<?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.xycxedu.mapper.ExamSubjectScoreEnterMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreEnterPageDto" resultType="com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterPageVo">
+        SELECT t1.id, t2.name AS semester_name,t3.name AS exam_plan_name,t4.name AS course_subject_name,t1.create_date,t5.name create_user_name,
+        (SELECT GROUP_CONCAT(NAME) FROM base_class WHERE t1.class_ids LIKE CONCAT('%', id, '%')) AS class_name FROM exam_subject_score_enter t1
+        LEFT JOIN base_semester t2 ON t1.semester_id = t2.id
+        LEFT JOIN exam_plan t3 ON t1.exam_plan_id = t3.id
+        LEFT JOIN base_course_subject t4 ON t1.course_subject_id = t4.id
+        LEFT JOIN xjr_user t5 ON t1.create_user_id = t5.id
+        WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
+        <if test="dto.semesterId != null">
+            and t2.id = #{dto.semesterId}
+        </if>
+        <if test="dto.createUserId != null">
+            and t1.create_user_id = #{dto.createUserId}
+        </if>
+        <if test="dto.examPlanName != null and dto.examPlanName != ''">
+            and t3.name like concat('%', #{dto.examPlanName}, '%')
+        </if>
+        <if test="dto.className != null and dto.className != ''">
+            AND (SELECT GROUP_CONCAT(NAME) FROM base_class WHERE t1.class_ids LIKE CONCAT('%', id, '%')) LIKE CONCAT('%', #{dto.className}, '%')
+        </if>
+        <if test="dto.courseSubjectName != null and dto.courseSubjectName != ''">
+            and t4.name like concat('%', #{dto.courseSubjectName}, '%')
+        </if>
+        order by t1.id desc
+    </select>
+    <select id="getInfo" resultType="com.xjrsoft.module.xycxedu.vo.ExamSubjectScoreEnterVo">
+        SELECT t1.id, t2.name AS semester_name,t3.name AS exam_plan_name,t4.name AS course_subject_name,t1.create_date,t5.name create_user_name,t1.class_ids
+        ,(SELECT GROUP_CONCAT(NAME) FROM base_class WHERE t1.class_ids LIKE CONCAT('%', id, '%')) AS class_name
+        ,(SELECT COUNT(*) FROM exam_subject_score WHERE delete_mark = 0 AND exam_subject_score_enter_id = t1.id AND enabled_mark = 1) AS all_count
+        ,(SELECT COUNT(*) FROM exam_subject_score WHERE delete_mark = 0 AND exam_subject_score_enter_id = t1.id AND enabled_mark = 1 AND score IS NOT NULL) AS handle_count
+        FROM exam_subject_score_enter t1
+        LEFT JOIN base_semester t2 ON t1.semester_id = t2.id
+        LEFT JOIN exam_plan t3 ON t1.exam_plan_id = t3.id
+        LEFT JOIN base_course_subject t4 ON t1.course_subject_id = t4.id
+        LEFT JOIN xjr_user t5 ON t1.create_user_id = t5.id
+        WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
+        and t1.id = #{id}
+    </select>
+</mapper>

+ 44 - 3
src/main/resources/mapper/xycxedu/ExamSubjectScoreMappper.xml

@@ -10,9 +10,9 @@
     </select>
 
     <select id="getPage" parameterType="com.xjrsoft.module.xycxedu.dto.ExamSubjectScoreDto" resultType="com.xjrsoft.module.xycxedu.vo.ExamSubjectScorePageVo">
-        SELECT t4.name AS semester_name,t2.milexamname,t1.coursename,t1.score,t1.grade_ranking FROM exam_subject_score t1
-        INNER JOIN xycxedu_exam_list t2 ON t1.milexamid = t2.milexamid
-        LEFT JOIN exam_plan t3 ON t3.milexamids LIKE CONCAT('%', t1.milexamid, '%')
+        SELECT t4.name AS semester_name,t3.name as milexamname,t1.coursename,t1.score,t1.grade_ranking,t1.class_ranking FROM exam_subject_score t1
+        LEFT JOIN xycxedu_exam_list t2 ON t1.milexamid = t2.milexamid
+        LEFT JOIN exam_plan t3 ON (t3.milexamids LIKE CONCAT('%', t1.milexamid, '%') or t1.exam_plan_id = t3.id)
         LEFT JOIN base_semester t4 ON t3.semester_id = t4.id
         WHERE t1.delete_mark = 0 AND t1.user_id = #{dto.userId}
         <if test="dto.semesterId != null">
@@ -42,4 +42,45 @@
             and t1.sdate between #{dto.startDate} and #{dto.endDate}
         </if>
     </select>
+
+    <select id="getClassStudentScoreCourse" parameterType="com.xjrsoft.module.xycxedu.dto.ClassStudentScorePageDto" resultType="com.xjrsoft.module.xycxedu.vo.ClassStudentScoreTitleVo">
+        SELECT DISTINCT CONCAT(IFNULL(t1.exam_plan_id, t1.milexamid), t1.course_subject_id) as course_id, t4.name FROM exam_subject_score t1
+        INNER JOIN exam_plan t2 ON (t1.exam_plan_id = t2.id OR t2.milexamids LIKE CONCAT('%', t1.milexamid, '%'))
+        INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
+        LEFT JOIN base_course_subject t4 ON t1.course_subject_id = t4.id
+        LEFT JOIN base_class t5 ON t3.class_id = t5.id
+        WHERE t1.delete_mark = 0
+        AND t1.semester_id = #{dto.semesterId}
+        AND t2.id = #{dto.examPlanId}
+        <if test="dto.treeId != null">
+            AND t3.class_id = #{dto.treeId}
+        </if>
+        <if test="dto.teacherId != null">
+            AND t5.teacher_id = #{dto.teacherId}
+        </if>
+        order by t4.name
+    </select>
+    <select id="getClassStudentScoreList" parameterType="com.xjrsoft.module.xycxedu.dto.ClassStudentScorePageDto" resultType="com.xjrsoft.module.xycxedu.entity.ExamSubjectScore">
+        SELECT t1.* FROM exam_subject_score t1
+        INNER JOIN exam_plan t2 ON (t1.exam_plan_id = t2.id OR t2.milexamids LIKE CONCAT('%', t1.milexamid, '%'))
+        INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
+        LEFT JOIN base_course_subject t4 ON t1.course_subject_id = t4.id
+        LEFT JOIN base_class t5 ON t3.class_id = t5.id
+        WHERE t1.delete_mark = 0
+        AND t1.semester_id = #{dto.semesterId}
+        AND t2.id = #{dto.examPlanId}
+        <if test="dto.treeId != null">
+            AND t3.class_id = #{dto.treeId}
+        </if>
+        <if test="dto.teacherId != null">
+            AND t5.teacher_id = #{dto.teacherId}
+        </if>
+        <if test="dto.userIdList != null and dto.userIdList.size() > 0">
+            AND t1.user_id in
+            <foreach item="userId" index="index" collection="dto.userIdList" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+        order by t4.name
+    </select>
 </mapper>

+ 21 - 0
src/main/resources/sqlScript/20241230_sql.sql

@@ -0,0 +1,21 @@
+ALTER TABLE `base_student_assessment_inspection`   
+  CHANGE `class_ids` `class_ids` VARCHAR(30) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL   COMMENT '班级Ids(多选)';
+
+-- 增加菜单地址字段长度
+ALTER TABLE `base_student_assessment_student_relation`   
+  ADD COLUMN `delete_mark` INT DEFAULT 0  NULL AFTER `score`,
+  ADD COLUMN `enabled_mark` INT DEFAULT 1  NULL AFTER `delete_mark`;
+
+-- 增加菜单地址字段长度
+ALTER TABLE `xjr_menu`   
+  CHANGE `path` `path` VARCHAR(500) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL   COMMENT '地址',
+  CHANGE `iframe_src` `iframe_src` VARCHAR(500) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL   COMMENT '外链地址';
+
+
+ALTER TABLE `wf_teacher_course_time`   
+  ADD COLUMN `file_id` BIGINT NULL   COMMENT '上传的文件(xjr_file[floder_id])' AFTER `create_date`;
+
+ALTER TABLE `base_student_assessment_student_relation`   
+  ADD COLUMN `modify_date` DATETIME DEFAULT NULL;
+  
+  

+ 32 - 0
src/main/resources/sqlScript/20250106_sql.sql

@@ -0,0 +1,32 @@
+
+DROP TABLE IF EXISTS exam_subject_score_enter;
+CREATE TABLE `exam_subject_score_enter`  (
+  `id` BIGINT NOT NULL COMMENT '主键',
+  `create_user_id` BIGINT NULL DEFAULT NULL COMMENT '创建人',
+  `create_date` DATETIME(3) NULL DEFAULT NULL COMMENT '创建时间',
+  `modify_user_id` BIGINT NULL DEFAULT NULL COMMENT '修改人id',
+  `modify_date` DATETIME(3) NULL DEFAULT NULL COMMENT '修改日期',
+  `delete_mark` INT NULL DEFAULT NULL COMMENT '删除标记',
+  `enabled_mark` INT NULL DEFAULT NULL COMMENT '有效标记',
+  `course_subject_id` BIGINT NULL DEFAULT NULL COMMENT '科目id',
+  `coursename` VARCHAR(50) NULL DEFAULT NULL COMMENT '科目名称',
+  `exam_plan_id` BIGINT NULL DEFAULT NULL COMMENT '考试计划id',
+  `semester_id` BIGINT NULL DEFAULT NULL COMMENT '学期id',
+  `class_ids` LONGTEXT NULL DEFAULT NULL COMMENT '班级id',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '成绩录入';
+
+
+ALTER TABLE `exam_subject_score`   
+  ADD COLUMN `exam_subject_score_enter_id` BIGINT NULL   COMMENT '成绩录入id';
+ALTER TABLE `exam_subject_score`   
+  CHANGE `score` `score` FLOAT(5,2) NULL   COMMENT '分数';
+
+ALTER TABLE `exam_subject_score`   
+  ADD INDEX (`exam_subject_score_enter_id`),
+  ADD INDEX (`course_subject_id`),
+  ADD INDEX (`user_id`),
+  ADD INDEX (`semester_id`),
+  ADD INDEX (`milexamid`);
+ALTER TABLE `exam_subject_score`   
+  ADD COLUMN `exam_plan_id` BIGINT NULL   COMMENT '考试计划id' AFTER `exam_subject_score_enter_id`;

+ 2 - 1
src/main/resources/sqlScript/视图信息.sql

@@ -67,7 +67,8 @@ LEFT JOIN room t45 ON t45.id = t44.room_id
 WHERE t1.delete_mark = 0 
 AND t1.delete_mark = 0 
 AND t2.delete_mark = 0 
-AND t3.delete_mark = 0 
+AND t3.delete_mark = 0
+AND t5.delete_mark = 0
 AND t3.archives_status = 'FB2901';
 
 

+ 38 - 15
src/test/java/com/xjrsoft/module/job/StudentDropOutTaskTest.java

@@ -1,11 +1,14 @@
 package com.xjrsoft.module.job;
 
 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.XjrSoftApplication;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.hikvision.service.IHikvisionDataService;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
 import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
@@ -29,36 +32,56 @@ class StudentDropOutTaskTest {
     @Autowired
     private IStundentFaceProcessService stundentFaceProcessService;
 
+    @Autowired
+    private IHikvisionDataService hikvisionDataService;
+
     @Test
     void test(){
-        Long id = 1783747887750492160L;
+        Long id = 1783747887754686465L;
         List<StundentFaceProcess> list = stundentFaceProcessService.list(
                 new MPJLambdaWrapper<StundentFaceProcess>()
                         .select(StundentFaceProcess::getId)
                         .select(StundentFaceProcess.class, x -> VoToColumnUtil.fieldsToColumns(StundentFaceProcess.class).contains(x.getProperty()))
                         .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, StundentFaceProcess::getUserId)
                         .ne(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901)
-                        .isNotNull(StundentFaceProcess::getHikvisionResult)
+                        //.isNotNull(StundentFaceProcess::getHikvisionResult)
                         .eq(StundentFaceProcess::getUserId, id)
         );
         JsonParser parser = new JsonParser();
         for (StundentFaceProcess user : list) {
             //删除海康人脸
-
-            JsonObject hikvisionResult = parser.parse(user.getHikvisionResult()).getAsJsonObject();
-            if(!hikvisionResult.get("msg").isJsonNull() && !"success".equals(hikvisionResult.get("msg").getAsString())){
-                continue;
-            }
-            String faceId = hikvisionResult.get("data").getAsJsonObject().get("faceId").getAsString();
             ApiUtil apiUtil = new ApiUtil();
-            String apiPath = "/api/resource/v1/face/single/delete";
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("faceId", faceId);
-            String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
+            String apiPath;
+            String faceId = null;
+            JsonObject paramJson;
+            if(user.getHikvisionResult() == null || !user.getHikvisionResult().startsWith("{\"code\":\"0\",\"msg\":\"success\"")){
+                apiPath = "/api/resource/v1/person/condition/personInfo";
+                paramJson = new JsonObject();
+                paramJson.addProperty("paramName", "personId");
+                JsonArray paramValue = new JsonArray();
+                paramValue.add(hikvisionDataService.getHikvisionIdBySourceId(user.getUserId().toString()));
+                paramJson.add("paramValue", paramValue);
+                String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
+                JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
+                if(resultJson.get("code").getAsInt() == 0 && "success".equals(resultJson.get("msg").getAsString())){
+                    JsonElement data = resultJson.get("data").getAsJsonObject().get("list").getAsJsonArray().get(0);
+                    faceId = data.getAsJsonObject().get("personPhoto").getAsJsonArray().get(0).getAsJsonObject().get("personPhotoIndexCode").getAsString();
+                }
+            }else{
+                JsonObject hikvisionResult = parser.parse(user.getHikvisionResult()).getAsJsonObject();
+                faceId = hikvisionResult.get("data").getAsJsonObject().get("faceId").getAsString();
+            }
+
+            if(faceId != null){
+                apiPath = "/api/resource/v1/face/single/delete";
+                paramJson = new JsonObject();
+                paramJson.addProperty("faceId", faceId);
+                String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
 
-            JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
-            if(resultJson.get("code").getAsInt() == 0){
-                stundentFaceProcessService.removeById(user);
+                JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
+                if(resultJson.get("code").getAsInt() == 0){
+                    stundentFaceProcessService.removeById(user);
+                }
             }
         }
     }

+ 26 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -4196,4 +4196,30 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+
+    @Test
+    public void gcExamSubjectScoreEnter() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("exam_subject_score_enter");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("xycxedu");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }