zhangf
2024-06-24 21362fd048558832cdcaca8ee957d2d7aa753be2
三方接口
已修改15个文件
已添加140个文件
已删除2个文件
6160 ■■■■■ 文件已修改
exam-system/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/InstitutionalManagerController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThBatchManagerController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThCourseManagerController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThExamRecordManagerController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThQuestionBankController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThStudentManagerController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThStudyRecordManagerController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThBatch.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThBatchCourse.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourse.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThExamRecord.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudent.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudentCourse.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyDetail.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyTrack.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/CourseHaveResourse.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/CourseResourceType.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/ExamIsPass.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/FaceType.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/FinishStatus.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/HaveExam.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/OpenStatus.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/StudentSex.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThBatchCourseMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThBatchMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCourseChapterMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCourseMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThExamRecordMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThQuestionBankMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudentCourseMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudentMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudyAuthMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudyDetailMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudyTrackMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThBatchQuery.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThCourseQuery.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThExamRecordQuery.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThQuestionBankQuery.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThStudentQuery.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThStudyDetailQuery.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/StudentCourseReqDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThBatchEndReqDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThBatchOpenReqDTO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThBatchReqDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCourseChapterReqDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCourseDeleteReqDTO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCourseReqDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThExamRecordReqDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudentReqDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudyDetailReqDTO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudyTrackReqDTO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThBatchCourseRespDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThCourseChapterRespDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThCourseRespDTO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThErrorDataRespDTO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThReturnRespDTO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThStudentCourseRespDTO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThStudentRespDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThStudentStudyRespDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThBatchCourseVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThBatchVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThCourseChapterVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThExamRecordVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStatisticStudentVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudentCourseVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyAuthVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyDetailVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyTrackVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThBatchCourseService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThBatchManagerService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThBatchService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCourseChapterService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCourseManagerService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCourseService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThExamRecordManagerService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThExamRecordService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThQuestionBankService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudentCourseService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudentManagerService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudentService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyAuthService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyDetailService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyRecordManagerService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyTrackService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThBatchCourseServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThBatchManagerServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThBatchServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCourseChapterServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCourseManagerServiceImpl.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCourseServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThExamRecordManagerServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThExamRecordServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThQuestionBankServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudentCourseServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudentManagerServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudentServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyAuthServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyDetailServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyRecordManagerServiceImpl.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyTrackServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java 1146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/utils/ConvertTimeUtils.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThBatchCourseMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThBatchMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThCourseChapterMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThCourseMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThExamRecordMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThQuestionBankMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThStudentCourseMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThStudentMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThStudyAuthMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThStudyDetailMapper.xml 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/institutionaccess/ThStudyTrackMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ThreeAccessController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/InstitutionUser.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/InstitutionStatus.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/coalmineEnums/DeleteStatusEnum.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/BusinessException.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/signature/AESUtils.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature11.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/RandomUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/ThreeInstitutionInterceptor.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/ThreeInContextHolder.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/threeAccess/req/AccessReqDTO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/threeAccess/resp/AccessRespDTO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/ThreeInstitutionService.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/InstitutionalManager.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/query/InstitutionManagerQuery.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/req/InstitutionModStatusReqDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/req/InstitutionalManagerAddReqDTO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/req/InstitutionalManagerModReqDTO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/InstitutionalManagerMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/InstitutionalManagerService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InstitutionalManagerServiceImpl.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/InstitutionManagerMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/pom.xml
@@ -17,7 +17,7 @@
    <dependencies>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <!--附件依赖-->
        <dependency>
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/InstitutionalManagerController.java
对比新文件
@@ -0,0 +1,61 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.ruoyi.system.domain.query.InstitutionManagerQuery;
import com.ruoyi.system.domain.req.InstitutionModStatusReqDTO;
import com.ruoyi.system.domain.req.InstitutionalManagerAddReqDTO;
import com.ruoyi.system.domain.req.InstitutionalManagerModReqDTO;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.service.InstitutionalManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * 机构平台管理
 */
@RestController
@RequestMapping("/th/institutional/manager")
public class InstitutionalManagerController extends BaseController {
    @Autowired
    private InstitutionalManagerService institutionalManagerService;
    @PostMapping("/add")
    private AjaxResult add(@Validated @RequestBody InstitutionalManagerAddReqDTO reqDTO) {
        return toAjax(institutionalManagerService.add(reqDTO));
    }
    @PostMapping("/mod")
    private AjaxResult mod(@Validated @RequestBody InstitutionalManagerModReqDTO reqDTO) {
        return toAjax(institutionalManagerService.mod(reqDTO));
    }
    @DeleteMapping("/del/{id}")
    private AjaxResult mod(@PathVariable Long id) {
        return toAjax(institutionalManagerService.del(id));
    }
    @GetMapping("/find/{id}")
    private AjaxResult findById(@PathVariable Long id) {
        return success(institutionalManagerService.findById(id));
    }
    @GetMapping("/list/page")
    public TableDataInfo listByPage(InstitutionManagerQuery query) {
        startPage();
        return getDataTable(this.institutionalManagerService.listByPage(query));
    }
    @GetMapping("/select")
    public AjaxResult select() {
        return success(this.institutionalManagerService.selectInstitutionInfo());
    }
    @PostMapping("/mod/status")
    private AjaxResult modStatus(@Validated @RequestBody InstitutionModStatusReqDTO reqDTO) {
        return toAjax(institutionalManagerService.modStatus(reqDTO));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThBatchManagerController.java
对比新文件
@@ -0,0 +1,34 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.gkhy.exam.institutionalaccess.model.query.ThBatchQuery;
import com.gkhy.exam.institutionalaccess.service.ThBatchManagerService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/th/batch")
public class ThBatchManagerController extends BaseController {
    @Autowired
    private ThBatchManagerService thBatchManagerService;
    @GetMapping("/list/page")
    public TableDataInfo listByPage(ThBatchQuery query) {
        startPage();
        return getDataTable(thBatchManagerService.listByPage(query));
    }
    @GetMapping("/period/{batchUuid}")
    public AjaxResult period(@PathVariable String batchUuid) {
        return AjaxResult.success(thBatchManagerService.period(batchUuid));
    }
    @GetMapping("/student/{batchUuid}")
    public AjaxResult getStudent(@PathVariable String batchUuid) {
        return AjaxResult.success(thBatchManagerService.getStudent(batchUuid));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThCourseManagerController.java
对比新文件
@@ -0,0 +1,32 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.gkhy.exam.institutionalaccess.model.query.ThCourseQuery;
import com.gkhy.exam.institutionalaccess.service.ThCourseManagerService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/th/course")
@RestController
public class ThCourseManagerController extends BaseController {
    @Autowired
    private ThCourseManagerService courseManagerService;
    /**
     * 分页
     */
    @GetMapping("/list/page")
    public TableDataInfo listByPage(ThCourseQuery query) {
        startPage();
        return getDataTable(courseManagerService.listByPage(query));
    }
    /**
     * 根据id查询
     */
    @GetMapping("/find/{id}")
    public AjaxResult findById(@PathVariable Long id) {
        return AjaxResult.success(courseManagerService.findById(id));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThExamRecordManagerController.java
对比新文件
@@ -0,0 +1,22 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.gkhy.exam.institutionalaccess.model.query.ThExamRecordQuery;
import com.gkhy.exam.institutionalaccess.service.ThExamRecordManagerService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/th/exam/record")
public class ThExamRecordManagerController extends BaseController {
    @Autowired
    private ThExamRecordManagerService thExamRecordManagerService;
    @GetMapping("/list/page")
    public TableDataInfo listByPage(ThExamRecordQuery query) {
        startPage();
        return getDataTable(thExamRecordManagerService.listByPage(query));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThQuestionBankController.java
对比新文件
@@ -0,0 +1,22 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.gkhy.exam.institutionalaccess.model.query.ThQuestionBankQuery;
import com.gkhy.exam.institutionalaccess.service.ThQuestionBankService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/th/question/bank")
public class ThQuestionBankController extends BaseController {
    @Autowired
    private ThQuestionBankService questionBankService;
    @GetMapping("/page")
    public TableDataInfo page(ThQuestionBankQuery query) {
        startPage();
        return getDataTable(this.questionBankService.listByPage(query));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThStudentManagerController.java
对比新文件
@@ -0,0 +1,23 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.gkhy.exam.institutionalaccess.model.query.ThStudentQuery;
import com.gkhy.exam.institutionalaccess.service.ThStudentManagerService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/th/student")
public class ThStudentManagerController extends BaseController {
    @Autowired
    private ThStudentManagerService thStudentManagerService;
    @GetMapping("/list/page")
    public TableDataInfo listByPage(ThStudentQuery query) {
        startPage();
        return getDataTable(thStudentManagerService.listByPage(query));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThStudyRecordManagerController.java
对比新文件
@@ -0,0 +1,25 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.gkhy.exam.institutionalaccess.model.query.ThStudyDetailQuery;
import com.gkhy.exam.institutionalaccess.service.ThStudyRecordManagerService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/th/study/record")
public class ThStudyRecordManagerController extends BaseController {
    @Autowired
    private ThStudyRecordManagerService thStudyRecordManagerService;
    @GetMapping("/list/page")
    public TableDataInfo listByPage(ThStudyDetailQuery query) {
        startPage();
        return getDataTable(thStudyRecordManagerService.listByPage(query));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java
对比新文件
@@ -0,0 +1,316 @@
package com.gkhy.exam.institutionalaccess.controller;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.gkhy.exam.institutionalaccess.enums.*;
import com.gkhy.exam.institutionalaccess.model.req.*;
import com.gkhy.exam.institutionalaccess.service.TripartiteInterfaceService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.signature.AESUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@RequestMapping("/gov-server/receive")
@RestController
public class TripartiteInterfaceController extends BaseController {
    @Autowired
    private TripartiteInterfaceService tripartiteInterfaceService;
    @PostMapping("/question/bank")
    public AjaxResult receiveQuestionBank(@RequestBody JSONObject jsonObject){
        return success(tripartiteInterfaceService.receiveQuestionBank(jsonObject));
    }
    @PostMapping("/course")
    public AjaxResult receiveCourse(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveCourse(jsonObject);
    }
    @PostMapping("/course/delete")
    public AjaxResult receiveCourseDelete(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveCourseDelete(jsonObject);
    }
    @PostMapping("/batch")
    public AjaxResult receiveBatch(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveBatch(jsonObject);
    }
    @PostMapping("/batch/open")
    public AjaxResult receiveBatchOpen(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveBatchOpen(jsonObject);
    }
    @PostMapping("/student")
    public AjaxResult receiveStudent(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveStudent(jsonObject);
    }
    @PostMapping("/study/detail")
    public AjaxResult receiveStudyDetail(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveStudyDetail(jsonObject);
    }
    @PostMapping("/exam/record")
    public AjaxResult receiveExamRecord(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveExamRecord(jsonObject);
    }
    @PostMapping("/batch/end")
    public AjaxResult receiveBarchEnd(@RequestBody JSONObject jsonObject){
        return tripartiteInterfaceService.receiveBarchEnd(jsonObject);
    }
    /**
     * 题库组卷
     * @param args
     */
    /*public static void main(String[] args) {
        ThQuestionBankReqDTO thQuestionBankReqDTO = new ThQuestionBankReqDTO();
        thQuestionBankReqDTO.setUuid(UUID.randomUUID().toString());
        thQuestionBankReqDTO.setMonth("2024年6月");
        thQuestionBankReqDTO.setDelFlag((byte)0);
        thQuestionBankReqDTO.setUrl("http://www.baidu.com");
        thQuestionBankReqDTO.setAddCount(2);
        thQuestionBankReqDTO.setAssemblyRate(new BigDecimal(80));
        thQuestionBankReqDTO.setBrushRate(new BigDecimal(89));
        thQuestionBankReqDTO.setReduceCount(4);
        thQuestionBankReqDTO.setLastMonthCount(450);
        String jsonString = JSONObject.toJSONString(thQuestionBankReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
        String decrypt = AESUtils.decrypt("PmvIbOPyVJ2pYqmGer1YBAij35Tfdk8lufUv+Y2CyqAds/iyh6PwS4dsnUzNO3El4kNaaSbqKO4dpSYLkHZiB41zB6OvNFcfSQr5uguBInWZHVGeWC7FljJkk/z8GB0ydvHSwsy+FGVkA6nMcOJGU31sf4JjO2hL10h6YeVEKtiEW2wOtuYWs067t4aP0q0zTnBWlnfO9i2WT3v0FjNhCXgPKR65HRAqrf+jrzRveLLFGL3be6qBOBwc8QqowMRS+6oUFMXTpzSfU6/QJrmbQw==");
        System.out.println(decrypt);
        ThQuestionBankReqDTO questionBankReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThQuestionBankReqDTO>() {});
        System.out.println(questionBankReqDTO);
    }*/
    /**
     * 课程
     * @param args
     */
    /*public static void main(String[] args) {
        ThCourseReqDTO thCourseReqDTO = new ThCourseReqDTO();
        thCourseReqDTO.setUuid("20bded7f-660c-4380-b7f9-00f3976e1875");
        thCourseReqDTO.setCourseCode("java001111");
        thCourseReqDTO.setCourseName("java课程");
        //thCourseReqDTO.setDelFlag((byte)0);
        thCourseReqDTO.setLessonNum(new BigDecimal(40));
        thCourseReqDTO.setTrainOrgName("机构111");
        List<ThCourseChapterReqDTO> chapterList = new ArrayList<>();
        //章
        ThCourseChapterReqDTO chapterReqDTO1 = new ThCourseChapterReqDTO();
        chapterReqDTO1.setUuid("9d470732-6233-4820-82f7-37c80fe8ae68");
        //chapterReqDTO1.setDelFlag((byte)0);
        chapterReqDTO1.setChapterCode("001");
        chapterReqDTO1.setChapterName("第一章节 基础理论");
        chapterReqDTO1.setHaveResource((byte)10);
        List<ThCourseChapterReqDTO> childList = new ArrayList<>();
        //节
        ThCourseChapterReqDTO child11 = new ThCourseChapterReqDTO();
        child11.setUuid("d5cd3b26-be11-4ffe-8a34-283c49c85253");
        child11.setUrl("https://www.baidu.com");
        //child11.setDelFlag((byte)2);
        child11.setChapterCode("1.1");
        child11.setChapterName("1.1类");
        child11.setHaveResource((byte)20);
        child11.setDuration(1800l);
        child11.setResourceType((byte)0);
        child11.setLessonNum(new BigDecimal(1));
        ThCourseChapterReqDTO child12= new ThCourseChapterReqDTO();
        child12.setUuid("eb7167be-5716-43d0-8e27-12bb43d1dded");
        child12.setUrl("https://www.baidu.com1213231");
        //child12.setDelFlag((byte)0);
        child12.setChapterCode("1.2");
        child12.setChapterName("1.2接口");
        child12.setHaveResource((byte)20);
        child12.setLessonNum(new BigDecimal(1.5));
        child12.setDuration(4500l);
        child12.setResourceType((byte)0);
        ThCourseChapterReqDTO child13= new ThCourseChapterReqDTO();
        child13.setUuid(UUID.randomUUID().toString());
        child13.setUrl("https://www.baidu.com3333");
        //child13.setDelFlag((byte)0);
        child13.setChapterCode("1.3");
        child13.setChapterName("1.3多态");
        child13.setHaveResource((byte)20);
        child13.setLessonNum(new BigDecimal(1.5));
        child13.setDuration(1800l);
        child13.setResourceType((byte)0);
        childList.add(child11);
        childList.add(child12);
        childList.add(child13);
        chapterReqDTO1.setChildren(childList);
        chapterList.add(chapterReqDTO1);
        thCourseReqDTO.setChapters(chapterList);
        String jsonString = JSONObject.toJSONString(thCourseReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
        String decrypt = AESUtils.decrypt("3G5/kr4d9CCjK6/q8LWZ1TZK6SF/GINWmeKzfmtvPZo0W/4Ydd7qti1VaOO4LQcKNNN67kvSfjCx3xUS1iAiUcWaVllWpVeNW8FWHt/1OQ+coFyslHVXDdCbQIVYpzF/0Q4jdBXpydtEmVsxifazo3l5/a2NBG319hhCXFNJmY5DgF2SUq7t6niKaEom6QbcFTENqV1KNZ87QeI7dl18UveADgxP91XpaRb+4M0JGIYpiXnr/LEDNAYM13eU6LSK+mBc38QQ+WcxijYGFvk1U6rlMYui3aLisyPLaFEwlhZ9Mscsrdw3t+XNJNp6SKiTG4HCOvSBYOGHp2PHhFQBNHzluOlcA5L8a4nogDpThwcl47O474VXnp0WG2+9DYVUTXW/UddZSc/aCCIhe/DTfA7WoZkOnMO8k8fHlXQ0exHnfPxBTxozG3UKyQ6hGHyjWqrfk/oVRcfOcPCQavIwwu9YLQeUpqL88VntE2+sBUPJtGOQrvq6A5No2RHgEGqptrUboMuL/OimEGjTAPdnRKQL+8JqqZf9HSPTCnoSYpTxKAfFf8hKEyMvW8SZzr3BS1MOL11HOTKeaD7kVuCYxEugfrdIzcAFsX9lxHSO2ubHadXektkdpLdMPd8WuLDzUknJqvYPDHBxcIzMea0XAQ==");
        System.out.println(decrypt);
        ThCourseReqDTO questionBankReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThCourseReqDTO>() {});
        System.out.println(questionBankReqDTO);
    }*/
    /**
     * 课程删除
     */
    /*public static void main(String[] args) {
        ThCourseDeleteReqDTO thQuestionBankReqDTO = new ThCourseDeleteReqDTO();
        thQuestionBankReqDTO.setCourseUuid("20bded7f-660c-4380-b7f9-00f3976e1875");
        String jsonString = JSONObject.toJSONString(thQuestionBankReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
        String decrypt = AESUtils.decrypt("PmvIbOPyVJ2pYqmGer1YBAij35Tfdk8lufUv+Y2CyqAds/iyh6PwS4dsnUzNO3El4kNaaSbqKO4dpSYLkHZiB41zB6OvNFcfSQr5uguBInWZHVGeWC7FljJkk/z8GB0ydvHSwsy+FGVkA6nMcOJGU31sf4JjO2hL10h6YeVEKtiEW2wOtuYWs067t4aP0q0zTnBWlnfO9i2WT3v0FjNhCXgPKR65HRAqrf+jrzRveLLFGL3be6qBOBwc8QqowMRS+6oUFMXTpzSfU6/QJrmbQw==");
        System.out.println(decrypt);
        ThQuestionBankReqDTO questionBankReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThQuestionBankReqDTO>() {});
        System.out.println(questionBankReqDTO);
    }*/
    /**
     * 批次上报
     * @param args
     */
    /*public static void main(String[] args) {
        ThBatchReqDTO thBatchReqDTO = new ThBatchReqDTO();
        thBatchReqDTO.setUuid(UUID.randomUUID().toString());
        thBatchReqDTO.setBatchName("第一期2024");
        thBatchReqDTO.setTrainOrgName("测试机构");
        thBatchReqDTO.setHaveExam(HaveExam.YES.getStatus());
        thBatchReqDTO.setOpenStatus(OpenStatus.NO.getStatus());
        List<String> courseList = new ArrayList<>();
        courseList.add(new String("20bded7f-660c-4380-b7f9-00f3976e1875"));
        thBatchReqDTO.setCourseUuidList(courseList);
        String jsonString = JSONObject.toJSONString(thBatchReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
        String decrypt = AESUtils.decrypt("PmvIbOPyVJ2pYqmGer1YBAij35Tfdk8lufUv+Y2CyqAds/iyh6PwS4dsnUzNO3El4kNaaSbqKO4dpSYLkHZiB41zB6OvNFcfSQr5uguBInWZHVGeWC7FljJkk/z8GB0ydvHSwsy+FGVkA6nMcOJGU31sf4JjO2hL10h6YeVEKtiEW2wOtuYWs067t4aP0q0zTnBWlnfO9i2WT3v0FjNhCXgPKR65HRAqrf+jrzRveLLFGL3be6qBOBwc8QqowMRS+6oUFMXTpzSfU6/QJrmbQw==");
        System.out.println(decrypt);
        ThQuestionBankReqDTO questionBankReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThQuestionBankReqDTO>() {});
        System.out.println(questionBankReqDTO);
    }*/
    /**
     * 学生信息上报
     */
   /* public static void main(String[] args) {
        ThStudentReqDTO thStudentReqDTO = new ThStudentReqDTO();
        thStudentReqDTO.setName("李四");
        thStudentReqDTO.setIdcard("11111");
        thStudentReqDTO.setIndustry("ceshj");
        thStudentReqDTO.setPost("post");
        thStudentReqDTO.setPhone("111111");
        thStudentReqDTO.setSex(StudentSex.BOY.getStatus());
        thStudentReqDTO.setTrainOrgName("测试机构");
        thStudentReqDTO.setAuthPhoto("http://baidu.om");
        thStudentReqDTO.setBatchUuid("cc90070e-8d30-4c55-b696-7af25fd98900");
        List<ThStudentReqDTO>  studentList = new ArrayList<>();
        studentList.add(thStudentReqDTO);
        String jsonString = JSONObject.toJSONString(studentList);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
        String decrypt = AESUtils.decrypt("PmvIbOPyVJ2pYqmGer1YBAij35Tfdk8lufUv+Y2CyqAds/iyh6PwS4dsnUzNO3El4kNaaSbqKO4dpSYLkHZiB41zB6OvNFcfSQr5uguBInWZHVGeWC7FljJkk/z8GB0ydvHSwsy+FGVkA6nMcOJGU31sf4JjO2hL10h6YeVEKtiEW2wOtuYWs067t4aP0q0zTnBWlnfO9i2WT3v0FjNhCXgPKR65HRAqrf+jrzRveLLFGL3be6qBOBwc8QqowMRS+6oUFMXTpzSfU6/QJrmbQw==");
        System.out.println(decrypt);
        ThQuestionBankReqDTO questionBankReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThQuestionBankReqDTO>() {});
        System.out.println(questionBankReqDTO);
    }*/
    /**
     * 开班
     * */
    /*public static void main(String[] args) {
        ThBatchOpenReqDTO thBatchOpenReqDTO = new ThBatchOpenReqDTO();
        thBatchOpenReqDTO.setBatchUuid("b1b70bce-06dc-40b0-a3a1-dd595572eaa1");
        String jsonString = JSONObject.toJSONString(thBatchOpenReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
    }*/
    /**
     * 结束培训
     * */
   /* public static void main(String[] args) {
        ThBatchEndReqDTO thBatchOpenReqDTO = new ThBatchEndReqDTO();
        thBatchOpenReqDTO.setBatchUuid("cc90070e-8d30-4c55-b696-7af25fd98900");
        thBatchOpenReqDTO.setIdcard("11111");
        String jsonString = JSONObject.toJSONString(thBatchOpenReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
    }*/
    /**
     * 考试记录
     */
    /*public static void main(String[] args) {
        ThExamRecordReqDTO thExamRecordReqDTO = new ThExamRecordReqDTO();
        thExamRecordReqDTO.setUuid(UUID.randomUUID().toString());
        thExamRecordReqDTO.setIdcard("1111");
        thExamRecordReqDTO.setExamName("考试1");
        thExamRecordReqDTO.setExamNum(1);
        thExamRecordReqDTO.setCourseUuid("20bded7f-660c-4380-b7f9-00f3976e1875");
        thExamRecordReqDTO.setBatchUuid("cc90070e-8d30-4c55-b696-7af25fd98900");
        thExamRecordReqDTO.setExamPassScore(new BigDecimal(80));
        thExamRecordReqDTO.setExamIsPass(ExamIsPass.YES.getStatus());
        thExamRecordReqDTO.setExamUserScore(new BigDecimal(90));
        thExamRecordReqDTO.setExamStartTime(LocalDateTime.now());
        thExamRecordReqDTO.setExamSubmitTime(LocalDateTime.now());
        thExamRecordReqDTO.setTrainOrgName("测试");
        thExamRecordReqDTO.setExamTotalScore(new BigDecimal(100));
        String jsonString = JSONObject.toJSONString(thExamRecordReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
    }*/
    /**
     *
     */
   /* public static void main(String[] args) {
        ThStudyDetailReqDTO thStudyDetailReqDTO = new ThStudyDetailReqDTO();
        thStudyDetailReqDTO.setUuid(UUID.randomUUID().toString());
        thStudyDetailReqDTO.setIdcard("11111");
        thStudyDetailReqDTO.setBatchUuid("cc90070e-8d30-4c55-b696-7af25fd98900");
        thStudyDetailReqDTO.setCourseUuid("20bded7f-660c-4380-b7f9-00f3976e1875");
        thStudyDetailReqDTO.setFinishStatus((byte)0);
        thStudyDetailReqDTO.setStartPosition(0l);
        thStudyDetailReqDTO.setFinishPosition(4567l);
        thStudyDetailReqDTO.setChapterUuid("d5cd3b26-be11-4ffe-8a34-283c49c85253");
        thStudyDetailReqDTO.setDuration(4567l);
        thStudyDetailReqDTO.setTrainOrgName("测试");
        thStudyDetailReqDTO.setStartTime(LocalDateTime.now());
        thStudyDetailReqDTO.setFinishTime(LocalDateTime.now());
        thStudyDetailReqDTO.setVideoUrl("hhtht");
        thStudyDetailReqDTO.setLessonReportUrl("hht");
        List<ThStudyTrackReqDTO> thStudyTrackReqDTOList = new ArrayList<>();
        ThStudyTrackReqDTO thStudyTrackReqDTO = new ThStudyTrackReqDTO();
        thStudyTrackReqDTO.setUuid(UUID.randomUUID().toString());
        thStudyTrackReqDTO.setStartTime(LocalDateTime.now());
        thStudyTrackReqDTO.setEndTime(LocalDateTime.now());
        thStudyTrackReqDTO.setTimeInterval(789878l);
        thStudyTrackReqDTOList.add(thStudyTrackReqDTO);
        List<ThStudytAuthReqDTO> thStudytAuthReqDTOList = new ArrayList<>();
        ThStudytAuthReqDTO thStudytAuthReqDTO = new ThStudytAuthReqDTO();
        thStudytAuthReqDTO.setUuid(UUID.randomUUID().toString());
        thStudytAuthReqDTO.setAuthPostion(0l);
        thStudytAuthReqDTO.setAuthTime(LocalDateTime.now());
        thStudytAuthReqDTO.setApprovePhoto("454l");
        thStudytAuthReqDTO.setFaceType(FaceType.AUTH.getType());
        thStudytAuthReqDTOList.add(thStudytAuthReqDTO);
        thStudyDetailReqDTO.setTrackList(thStudyTrackReqDTOList);
        thStudyDetailReqDTO.setStudentAuthList(thStudytAuthReqDTOList);
        String jsonString = JSONObject.toJSONString(thStudyDetailReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
    }*/
    public static void main(String[] args) {
        String decrypt = AESUtils.decrypt("PmvIbOPyVJ2pYqmGer1YBAij35Tfdk8lufUv+Y2CyqAds/iyh6PwS4dsnUzNO3El4Sk/WXXwbPGQ7UdaV8jznT/3YPqTeLdkxQ/1/6r9pvxuD2tyds8jo9DIBZYVxHpX3/9Z5Byp1UvszWeTWeaiDN+paKNO5v/TcXrosdce2dMGXLwY0i3GYA1JIbWWTTrvoWKJK+k5VW+5NnnDo+2Gj5CNSNv4c2wT7f3hTRy6B66RrRN3xkucCw4VRJZ+r+RK");
        System.out.println(decrypt);
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThBatch.java
对比新文件
@@ -0,0 +1,45 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.time.LocalDateTime;
/**
 * 班次
 */
@Data
@TableName("th_batch")
public class ThBatch {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String batchName;
    private String uuid;
    private Long institutionId;
    private String institutionName;
    private Byte haveExam;
    private Byte openStatus;
    private String trainOrgName;
   // private Byte finishStatus;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThBatchCourse.java
对比新文件
@@ -0,0 +1,20 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
@TableName("th_batch_course")
@Data
public class ThBatchCourse {
    private static final long serialVersionUID = 1L;
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String courseUuid;
    private String batchUuid;
    private Byte delFlag;
    private Long institutionId;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourse.java
对比新文件
@@ -0,0 +1,44 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@TableName("th_course")
@Data
public class ThCourse {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uuid;
    private String courseCode;
    private String courseName;
    private Long institutionId;
    private String institutionName;
    private BigDecimal lessonNum;
    private String trainOrgName;
    //是否有考试(0无,1有)
    //private Byte haveExam;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java
对比新文件
@@ -0,0 +1,50 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@TableName("th_course_chapter")
@Data
public class ThCourseChapter {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uuid;
    private String chapterCode;
    private String chapterName;
    //有无资源(10无,20有)
    private Byte haveResource;
    //资源类型(0视频,1音频)
    private Byte resourceType;
    private BigDecimal lessonNum;
    private Long duration;
    //视频路径
    private String url;
    private String parentUuid;
    private Long institutionId;
    private String courseUuid;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThExamRecord.java
对比新文件
@@ -0,0 +1,56 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("th_exam_record")
public class ThExamRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uuid;
    private String idcard;
    private String courseUuid;
    private String batchUuid;
    private Long institutionId;
    private String institutionName;
    private String trainOrgName;
    private String examName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examSubmitTime;
    private BigDecimal examUserScore;
    private BigDecimal examTotalScore;
    private BigDecimal examPassScore;
    private Byte examIsPass;
    private Integer examNum;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java
对比新文件
@@ -0,0 +1,46 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@TableName("th_question_bank")
@Data
public class ThQuestionBank {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uuid;
    private Long institutionId;;
    private String institutionName;
    private int lastMonthCount;
    private int addCount;
    private int reduceCount;
    private BigDecimal brushRate;
    private BigDecimal assemblyRate;
    private String url;
    private String month;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudent.java
对比新文件
@@ -0,0 +1,45 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.time.LocalDateTime;
@TableName("th_student")
@Data
public class ThStudent {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Byte sex;
    private String phone;
    private String idcard;
    private String authPhoto;
    private Long institutionId;
    private String institutionName;
    private String trainOrgName;
    private String industry;
    private String occupation;
    private String post;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudentCourse.java
对比新文件
@@ -0,0 +1,40 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.time.LocalDateTime;
@TableName("th_student_course")
@Data
public class ThStudentCourse {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String idcard;
    private String courseUuid;
    private String batchUuid;
    private String name;
    private Byte sex;
    private String phone;
    private String authPhoto;
    private Long institutionId;
    private String institutionName;
    private String trainOrgName;
    private String industry;
    private String occupation;
    private String post;
    private Byte finishStatus;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java
对比新文件
@@ -0,0 +1,28 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("th_study_auth")
@Data
public class ThStudyAuth implements Serializable {
    private static final long serialVersionUID = -142792747305486686L;
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uuid;
    private String approvePhoto;
    private Long authPosition;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime authTime;
    private Byte faceType;
    private String studyDetailUuid;
    private String authVideo;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyDetail.java
对比新文件
@@ -0,0 +1,57 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("th_study_detail")
@Data
public class ThStudyDetail implements Serializable {
    private static final long serialVersionUID = -7594385369742322457L;
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String idcard;
    private String uuid;
    private String serialNum;
    private String institutionName;
    private Long institutionId;
    private String courseUuid;
    private String trainOrgName;
    private String batchUuid;
    private String chapterUuid;
    private Byte finishStatus;
    private Long duration;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime finishTime;
    private Long startPosition;
    private Long finishPosition;
    private String videoUrl;
    private String lessonReportUrl;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyTrack.java
对比新文件
@@ -0,0 +1,25 @@
package com.gkhy.exam.institutionalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import java.time.LocalDateTime;
@TableName("th_study_track")
@Data
public class ThStudyTrack {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uuid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    private Long timeInterval;
    private String studyDetailUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/CourseHaveResourse.java
对比新文件
@@ -0,0 +1,44 @@
package com.gkhy.exam.institutionalaccess.enums;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
public enum CourseHaveResourse {
    //有无资源(0无,1有)
    NO((byte)0,"无资源"),
    YES((byte)1,"有资源"),
    ;
    private Byte status;
    private String desc;
    CourseHaveResourse(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static CourseHaveResourse get(Byte status) {
        for (CourseHaveResourse courseHaveResourse : CourseHaveResourse.values()) {
            if (courseHaveResourse.getStatus() == status) {
                return courseHaveResourse;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/CourseResourceType.java
对比新文件
@@ -0,0 +1,42 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum CourseResourceType {
    //资源类型(0视频,1音频)
    VIDEO((byte)0,"视频"),
    AUDIO((byte)1,"音频"),
    ;
    private Byte type;
    private String desc;
    CourseResourceType(Byte type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public Byte getType() {
        return type;
    }
    public void setType(Byte type) {
        this.type = type;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static CourseResourceType get(Byte status) {
        for (CourseResourceType courseResourceType : CourseResourceType.values()) {
            if (courseResourceType.getType() == status) {
                return courseResourceType;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/ExamIsPass.java
对比新文件
@@ -0,0 +1,42 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum ExamIsPass {
    NO((byte)0,"否"),
    YES((byte)1,"是"),
    ;
    private Byte status;
    private String desc;
    ExamIsPass(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static ExamIsPass get(Byte status) {
        for (ExamIsPass examIsPass : ExamIsPass.values()) {
            if (examIsPass.getStatus() == status) {
                return examIsPass;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/FaceType.java
对比新文件
@@ -0,0 +1,44 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum FaceType {
    //资源类型(0视频,1音频)
    SIGN((byte)10,"签到"),
    AUTH((byte)20,"认证"),
    ;
    private Byte type;
    private String desc;
    FaceType(Byte type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public Byte getType() {
        return type;
    }
    public void setType(Byte type) {
        this.type = type;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static FaceType get(Byte status) {
        for (FaceType faceType : FaceType.values()) {
            if (faceType.getType() == status) {
                return faceType;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/FinishStatus.java
对比新文件
@@ -0,0 +1,41 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum FinishStatus {
    //完成(0否,1是)
    NO((byte)0,"否"),
    YES((byte)1,"是"),
    ;
    private Byte status;
    private String desc;
    FinishStatus(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static FinishStatus get(Byte status) {
        for (FinishStatus finishStatus : FinishStatus.values()) {
            if (finishStatus.getStatus() == status) {
                return finishStatus;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/HaveExam.java
对比新文件
@@ -0,0 +1,41 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum HaveExam {
    //有无考试(0无,1有)
    NO((byte)0,"无"),
    YES((byte)1,"有"),
    ;
    private Byte status;
    private String desc;
    HaveExam(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static HaveExam get(Byte status) {
        for (HaveExam haveExam : HaveExam.values()) {
            if (haveExam.getStatus() == status) {
                return haveExam;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/OpenStatus.java
对比新文件
@@ -0,0 +1,42 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum OpenStatus {
    //开班(0否,1是)
    NO((byte)0,"否"),
    YES((byte)1,"是"),
    ;
    private Byte status;
    private String desc;
    OpenStatus(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static OpenStatus get(Byte status) {
        for (OpenStatus openStatus : OpenStatus.values()) {
            if (openStatus.getStatus() == status) {
                return openStatus;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/enums/StudentSex.java
对比新文件
@@ -0,0 +1,43 @@
package com.gkhy.exam.institutionalaccess.enums;
public enum StudentSex {
    BOY((byte)0,"男"),
    GIRL((byte)1,"女"),
    ;
    private Byte status;
    private String desc;
    StudentSex(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static StudentSex get(Byte status) {
        for (StudentSex courseHaveResourse : StudentSex.values()) {
            if (courseHaveResourse.getStatus() == status) {
                return courseHaveResourse;
            }
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThBatchCourseMapper.java
对比新文件
@@ -0,0 +1,20 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThBatchCourse;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchCourseVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThBatchCourseMapper extends BaseMapper<ThBatchCourse> {
    void deleteByBatchUuidAndCourseUuid(@Param("list") List<ThBatchCourse> deleteBatchCourseList);
    List<ThBatchCourseVO> getListByBatchUuids(@Param("batchUuids")List<String> batchUuids);
    List<ThBatchCourseVO> getListByBatchUuid(@Param("batchUuid")String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThBatchMapper.java
对比新文件
@@ -0,0 +1,17 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThBatch;
import com.gkhy.exam.institutionalaccess.model.query.ThBatchQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThBatchMapper extends BaseMapper<ThBatch> {
    List<ThBatchVO> listByPage(@Param("query") ThBatchQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCourseChapterMapper.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThCourseChapter;
import com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThCourseChapterMapper extends BaseMapper<ThCourseChapter> {
    List<ThCourseChapterVO> listByCourseUuids(@Param("courseUuids") List<String> courseUuids);
    List<ThCourseChapterVO> listByCourseUuid(@Param("courseUuid")String courseUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCourseMapper.java
对比新文件
@@ -0,0 +1,16 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThCourse;
import com.gkhy.exam.institutionalaccess.model.query.ThCourseQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThCourseMapper extends BaseMapper<ThCourse> {
    List<ThCourse> listByPage(@Param("query") ThCourseQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThExamRecordMapper.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThExamRecord;
import com.gkhy.exam.institutionalaccess.model.query.ThExamRecordQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThExamRecordVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThExamRecordMapper extends BaseMapper<ThExamRecord> {
    List<ThExamRecordVO> listByPage(@Param("query") ThExamRecordQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThQuestionBankMapper.java
对比新文件
@@ -0,0 +1,11 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThQuestionBank;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface ThQuestionBankMapper extends BaseMapper<ThQuestionBank> {
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudentCourseMapper.java
对比新文件
@@ -0,0 +1,24 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThStudentCourse;
import com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudentCourseVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface ThStudentCourseMapper extends BaseMapper<ThStudentCourse> {
    List<ThStatisticStudentVO> statisticByBatchUuid();
    List<ThStatisticStudentVO> statisticByCourseUuid();
    List<ThStudentCourseVO> getListByBatchUuid(@Param("batchUuid") String batchUuid);
    void updateByBatchUuid(@Param("batchUuid")String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudentMapper.java
对比新文件
@@ -0,0 +1,17 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThStudent;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@RequestMapping
@Mapper
public interface ThStudentMapper extends BaseMapper<ThStudent> {
    int updateByIdcard(@Param("list") List<ThStudent> list);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudyAuthMapper.java
对比新文件
@@ -0,0 +1,15 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThStudyAuth;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThStudyAuthMapper extends BaseMapper<ThStudyAuth> {
    List<String> getUuidByStudyDetaiId(@Param("studyDetaiId") String studyDetaiId);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudyDetailMapper.java
对比新文件
@@ -0,0 +1,23 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThStudyDetail;
import com.gkhy.exam.institutionalaccess.model.query.ThStudyDetailQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThStudyDetailMapper extends BaseMapper<ThStudyDetail> {
    List<ThStudyDetailVO> listByPage(@Param("query") ThStudyDetailQuery query);
    List<ThStudyVO> statisticDurationByIdcard(@Param("batchUuid") String batchUuid);
    List<ThStudyDetailVO> listByBatchUuid(@Param("batchUuid") String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThStudyTrackMapper.java
对比新文件
@@ -0,0 +1,16 @@
package com.gkhy.exam.institutionalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.institutionalaccess.entity.ThStudyTrack;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ThStudyTrackMapper extends BaseMapper<ThStudyTrack> {
    List<String> getUuidByStudyDetaiId(@Param("studyDetaiId") String studyDetaiId);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThBatchQuery.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.model.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDate;
import java.util.Date;
@Data
public class ThBatchQuery {
    private Long institutionId;
    private String batchName;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThCourseQuery.java
对比新文件
@@ -0,0 +1,9 @@
package com.gkhy.exam.institutionalaccess.model.query;
import lombok.Data;
@Data
public class ThCourseQuery {
    private Long institutionId;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThExamRecordQuery.java
对比新文件
@@ -0,0 +1,17 @@
package com.gkhy.exam.institutionalaccess.model.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDate;
import java.util.Date;
@Data
public class ThExamRecordQuery {
    private String name;
    private String idcard;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThQuestionBankQuery.java
对比新文件
@@ -0,0 +1,9 @@
package com.gkhy.exam.institutionalaccess.model.query;
import lombok.Data;
@Data
public class ThQuestionBankQuery {
    private String institutionName;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThStudentQuery.java
对比新文件
@@ -0,0 +1,9 @@
package com.gkhy.exam.institutionalaccess.model.query;
import lombok.Data;
@Data
public class ThStudentQuery {
    private String idcard;
    private String name;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThStudyDetailQuery.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.model.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDate;
import java.util.Date;
@Data
public class ThStudyDetailQuery {
    private String idcard;
    private String name;
    private String courseUuid;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/StudentCourseReqDTO.java
对比新文件
@@ -0,0 +1,9 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
@Data
public class StudentCourseReqDTO {
    private String courseUuid;
    private String batchUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThBatchEndReqDTO.java
对比新文件
@@ -0,0 +1,9 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
@Data
public class ThBatchEndReqDTO {
    private String batchUuid;
    private String idcard;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThBatchOpenReqDTO.java
对比新文件
@@ -0,0 +1,8 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
@Data
public class ThBatchOpenReqDTO {
    private String batchUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThBatchReqDTO.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
import java.util.List;
@Data
public class ThBatchReqDTO {
    private String uuid;
    private String batchName;
    private Long institutionId;
    private String institutionName;
    private String trainOrgName;
    private Byte haveExam;
    private Byte openStatus;
    //private Byte delFlag;
    private List<String> courseUuidList;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCourseChapterReqDTO.java
对比新文件
@@ -0,0 +1,29 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ThCourseChapterReqDTO implements Serializable {
    private static final long serialVersionUID = 2827204834981264000L;
    private String uuid;
    private String chapterCode;
    private String chapterName;
    //有无资源(0无,1有)
    private Byte haveResource;
    //资源类型(0视频,1音频)
    private Byte resourceType;
    private BigDecimal lessonNum;
    private Long duration;
    //视频路径
    private String url;
    //删除标志(0代表存在 2代表删除)
    //private Byte delFlag;
    //孩子
    private List<ThCourseChapterReqDTO> children;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCourseDeleteReqDTO.java
对比新文件
@@ -0,0 +1,8 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
@Data
public class ThCourseDeleteReqDTO {
    private String courseUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCourseReqDTO.java
对比新文件
@@ -0,0 +1,23 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ThCourseReqDTO implements Serializable {
    private static final long serialVersionUID = -2841710093351955259L;
    private String uuid;
    private String courseCode;
    private String courseName;
    private BigDecimal lessonNum;
    //是否有考试(0无,1有)
    //private Byte haveExam;
    //删除标志(0代表存在 2代表删除)
    //private Byte delFlag;
    private String trainOrgName;
    private List<ThCourseChapterReqDTO> chapters;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThExamRecordReqDTO.java
对比新文件
@@ -0,0 +1,28 @@
package com.gkhy.exam.institutionalaccess.model.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ThExamRecordReqDTO {
    private String uuid;
    private String idcard;
    private String courseUuid;
    private String batchUuid;
    private String institutionId;
    private String institutionName;
    private String trainOrgName;
    private String examName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examSubmitTime;
    private BigDecimal examUserScore;
    private BigDecimal examTotalScore;
    private BigDecimal examPassScore;
    private Byte examIsPass;
    private Integer examNum;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java
对比新文件
@@ -0,0 +1,20 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ThQuestionBankReqDTO {
    private String uuid;
    private Integer lastMonthCount;
    private Integer addCount;
    private Integer reduceCount;
    private BigDecimal brushRate;
    private BigDecimal assemblyRate;
    private String url;
    private String month;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudentReqDTO.java
对比新文件
@@ -0,0 +1,19 @@
package com.gkhy.exam.institutionalaccess.model.req;
import lombok.Data;
import java.util.List;
@Data
public class ThStudentReqDTO {
    private String name;
    private Byte sex;
    private String phone;
    private String idcard;
    private String authPhoto;
    private String industry;
    private String occupation;
    private String post;
    private String trainOrgName;
    private String batchUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudyDetailReqDTO.java
对比新文件
@@ -0,0 +1,35 @@
package com.gkhy.exam.institutionalaccess.model.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ThStudyDetailReqDTO implements Serializable {
    private static final long serialVersionUID = 615826232086452263L;
    private String uuid;
    private String idcard;
    private String courseUuid;
    private String trainOrgName;
    private String batchUuid;
    private String chapterUuid;
    private Byte finishStatus;
    private Long duration;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime finishTime;
    private Long startPosition;
    private Long finishPosition;
    private String videoUrl;
    private String lessonReportUrl;
    private List<ThStudyTrackReqDTO> trackList;
    private List<ThStudytAuthReqDTO> authList;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudyTrackReqDTO.java
对比新文件
@@ -0,0 +1,20 @@
package com.gkhy.exam.institutionalaccess.model.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ThStudyTrackReqDTO {
    private String uuid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    private Long timeInterval;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java
对比新文件
@@ -0,0 +1,17 @@
package com.gkhy.exam.institutionalaccess.model.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ThStudytAuthReqDTO {
    private String uuid;
    private String approvePhoto;
    private Long authPosition;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime authTime;
    private Byte faceType;
    private String authVideo;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThBatchCourseRespDTO.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.model.resp;
import lombok.Data;
import java.util.List;
@Data
public class ThBatchCourseRespDTO {
    private String courseUuid;
    private String batchUuid;
    private String courseName;
    private Long duration;
    private String durationDesc;
    private List<ThStudentCourseRespDTO> studentList;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThCourseChapterRespDTO.java
对比新文件
@@ -0,0 +1,25 @@
package com.gkhy.exam.institutionalaccess.model.resp;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ThCourseChapterRespDTO {
    private Long id;
    private String uuid;
    private String chapterCode;
    private String chapterName;
    //有无资源(0无,1有)
    private Byte haveResource;
    //资源类型(0视频,1音频)
    private Byte resourceType;
    private BigDecimal lessonNum;
    private Long duration;
    //视频路径
    private String url;
    private List<ThCourseChapterRespDTO> children;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThCourseRespDTO.java
对比新文件
@@ -0,0 +1,35 @@
package com.gkhy.exam.institutionalaccess.model.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.models.auth.In;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ThCourseRespDTO {
    private Long id;
    private String uuid;
    private String courseCode;
    private String courseName;
    private Long institutionId;
    private String institutionName;
    private BigDecimal lessonNum;
    private Integer studentCount;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    private String createBy;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    private String updateBy;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private List<ThCourseChapterRespDTO> outline;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThErrorDataRespDTO.java
对比新文件
@@ -0,0 +1,14 @@
package com.gkhy.exam.institutionalaccess.model.resp;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ThErrorDataRespDTO {
    private String uuid;
    private String msg;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThReturnRespDTO.java
对比新文件
@@ -0,0 +1,6 @@
package com.gkhy.exam.institutionalaccess.model.resp;
public class ThReturnRespDTO {
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThStudentCourseRespDTO.java
对比新文件
@@ -0,0 +1,15 @@
package com.gkhy.exam.institutionalaccess.model.resp;
import lombok.Data;
@Data
public class ThStudentCourseRespDTO {
    private String idcard;
    private String name;
    private String courseUuid;
    private String batchUuid;
    private Long institutionId;
    private Long duration;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThStudentRespDTO.java
对比新文件
@@ -0,0 +1,9 @@
package com.gkhy.exam.institutionalaccess.model.resp;
public class ThStudentRespDTO {
    private String name;
    private String idcard;
    private Long duration;
    private Long durationDesc;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/resp/ThStudentStudyRespDTO.java
对比新文件
@@ -0,0 +1,16 @@
package com.gkhy.exam.institutionalaccess.model.resp;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ThStudentStudyRespDTO {
    private String idcard;
    private String name;
    private BigDecimal lessonNum;
    private BigDecimal lessonTocal;
    private Byte finishStatus;
    private String url;
    private String courseName;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThBatchCourseVO.java
对比新文件
@@ -0,0 +1,20 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
@TableName("th_batch_course")
@Data
public class ThBatchCourseVO {
    private Long id;
    private String courseUuid;
    private String batchUuid;
    private String courseName;
    //视频时长
    private Long duration;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThBatchVO.java
对比新文件
@@ -0,0 +1,38 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ThBatchVO {
    private Long id;
    private String batchName;
    private String uuid;
    private Long institutionId;
    private String institutionName;
    private Byte haveExam;
    private Byte openStatus;
    private String trainOrgName;
    private Integer studentCount;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private List<ThBatchCourseVO> courseVOList;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThCourseChapterVO.java
对比新文件
@@ -0,0 +1,24 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ThCourseChapterVO {
    private Long id;
    private String uuid;
    private String chapterCode;
    private String chapterName;
    //有无资源(0无,1有)
    private Byte haveResource;
    //资源类型(0视频,1音频)
    private Byte resourceType;
    private BigDecimal lessonNum;
    private Long duration;
    //视频路径
    private String url;
    private String parentUuid;
    private Long institutionId;
    private String courseUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThExamRecordVO.java
对比新文件
@@ -0,0 +1,48 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ThExamRecordVO {
    private Long id;
    private String uuid;
    private String idcard;
    private String name;
    private String courseUuid;
    private String courseName;
    private String batchUuid;
    private String batchName;
    private Long institutionId;
    private String institutionName;
    private String trainOrgName;
    private String examName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examSubmitTime;
    private BigDecimal examUserScore;
    private BigDecimal examTotalScore;
    private BigDecimal examPassScore;
    private Byte examIsPass;
    private Integer examNum;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStatisticStudentVO.java
对比新文件
@@ -0,0 +1,10 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import lombok.Data;
@Data
public class ThStatisticStudentVO {
    private String courseUuid;
    private Integer count;
    private String batchUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudentCourseVO.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ThStudentCourseVO {
    private String idcard;
    private String name;
    private String courseUuid;
    private String courseName;
    private String batchUuid;
    private Long institutionId;
    private BigDecimal lessTotal;
    private Byte finishStatus;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyAuthVO.java
对比新文件
@@ -0,0 +1,20 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ThStudyAuthVO {
    private Long id;
    private String uuid;
    private String approvePhoto;
    private Long authPosition;
    private String authPostionDesc;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime authTime;
    private Byte faceType;
    private String studyDetailUuid;
    private String authVideo;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyDetailVO.java
对比新文件
@@ -0,0 +1,64 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ThStudyDetailVO {
    private Long id;
    private String uuid;
    private String serialNum;
    private String idcard;
    private String name;
    private String institutionName;
    private Long institutionId;
    private String courseUuid;
    private String courseName;
    private String trainOrgName;
    private String batchUuid;
    private String batchName;
    private String chapterUuid;
    private String catalogName;
    private Byte finishStatus;
    private Long duration;
    private String durationDesc;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime finishTime;
    private Long startPosition;
    private String startPositionDesc;
    private Long finishPosition;
    private String finishPositionDesc;
    private String videoUrl;
    private String lessonReportUrl;
    private BigDecimal lessonNum;
    //删除标志(0代表存在 2代表删除)
    private Byte delFlag;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private List<ThStudyAuthVO> authList;
    private List<ThStudyTrackVO> trackList;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyTrackVO.java
对比新文件
@@ -0,0 +1,19 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ThStudyTrackVO {
    private Long id;
    private String uuid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    private Long timeInterval;
    private String timeIntervalDesc;
    private String studyDetailUuid;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/vo/ThStudyVO.java
对比新文件
@@ -0,0 +1,10 @@
package com.gkhy.exam.institutionalaccess.model.vo;
import lombok.Data;
@Data
public class ThStudyVO {
    private String idcard;
    private String name;
    private Long duration;
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThBatchCourseService.java
对比新文件
@@ -0,0 +1,26 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThBatchCourse;
import com.gkhy.exam.institutionalaccess.entity.ThStudentCourse;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchCourseVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchVO;
import java.util.List;
public interface ThBatchCourseService extends IService<ThBatchCourse> {
    List<ThBatchCourse> getByBatchUuid(String uuid);
    List<String> getCourseUuisByBatchUuid(String batchUuid);
    void deleteByBatchUuidAndCourseUuid(List<ThBatchCourse> deleteBatchCourseList);
    List<ThBatchCourseVO> getListByBatchUuids(List<String> batchUuids);
    List<ThBatchCourseVO> getListByBatchUuid(String batchUuid);
    boolean isExsit(String courseUuid);
    List<ThBatchCourse> listByInstitutionId(Long InstitutionId);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThBatchManagerService.java
对比新文件
@@ -0,0 +1,17 @@
package com.gkhy.exam.institutionalaccess.service;
import com.gkhy.exam.institutionalaccess.entity.ThBatch;
import com.gkhy.exam.institutionalaccess.model.query.ThBatchQuery;
import com.gkhy.exam.institutionalaccess.model.resp.ThBatchCourseRespDTO;
import com.gkhy.exam.institutionalaccess.model.resp.ThStudentStudyRespDTO;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchVO;
import java.util.List;
public interface ThBatchManagerService {
    List<ThBatchVO> listByPage(ThBatchQuery query);
    List<ThBatchCourseRespDTO> period(String batchUuid);
    List<ThStudentStudyRespDTO> getStudent(String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThBatchService.java
对比新文件
@@ -0,0 +1,16 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThBatch;
import com.gkhy.exam.institutionalaccess.model.query.ThBatchQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchVO;
import java.util.List;
public interface ThBatchService extends IService<ThBatch> {
    ThBatch getByUuid(String uuid);
    List<ThBatch> listByInstitutionId(Long institutionId);
    List<ThBatchVO> listByPage(ThBatchQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCourseChapterService.java
对比新文件
@@ -0,0 +1,17 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThCourseChapter;
import com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO;
import java.util.List;
public interface ThCourseChapterService extends IService<ThCourseChapter> {
    List<ThCourseChapterVO> listByCourseUuids(List<String> courseIds);
    List<ThCourseChapterVO> listByCourseUuid(String courseUuid);
    List<ThCourseChapter> listByInstitutionId(Long institutionId);
    ThCourseChapter getByUuid(String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCourseManagerService.java
对比新文件
@@ -0,0 +1,12 @@
package com.gkhy.exam.institutionalaccess.service;
import com.gkhy.exam.institutionalaccess.model.query.ThCourseQuery;
import com.gkhy.exam.institutionalaccess.model.resp.ThCourseRespDTO;
import java.util.List;
public interface ThCourseManagerService {
    List<ThCourseRespDTO> listByPage(ThCourseQuery query);
    ThCourseRespDTO findById(Long id);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCourseService.java
对比新文件
@@ -0,0 +1,19 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThCourse;
import com.gkhy.exam.institutionalaccess.model.query.ThCourseQuery;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ThCourseService extends IService<ThCourse> {
    List<ThCourse> listByPage(@Param("query") ThCourseQuery query);
    ThCourse getByUuid(String uuid);
    List<ThCourse> selectByUuid(List<String> courseUuidList);
    List<ThCourse> listByInstitutionId(Long institutionId);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThExamRecordManagerService.java
对比新文件
@@ -0,0 +1,10 @@
package com.gkhy.exam.institutionalaccess.service;
import com.gkhy.exam.institutionalaccess.model.query.ThExamRecordQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThExamRecordVO;
import java.util.List;
public interface ThExamRecordManagerService {
    List<ThExamRecordVO> listByPage(ThExamRecordQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThExamRecordService.java
对比新文件
@@ -0,0 +1,14 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThExamRecord;
import com.gkhy.exam.institutionalaccess.model.query.ThExamRecordQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThExamRecordVO;
import java.util.List;
public interface ThExamRecordService extends IService<ThExamRecord> {
    List<ThExamRecord> listByInstitutionId(Long institutionId);
    List<ThExamRecordVO> listByPage(ThExamRecordQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThQuestionBankService.java
对比新文件
@@ -0,0 +1,14 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.model.query.ThQuestionBankQuery;
import com.gkhy.exam.institutionalaccess.entity.ThQuestionBank;
import java.util.List;
public interface ThQuestionBankService extends IService<ThQuestionBank> {
    List<ThQuestionBank> listByPage(ThQuestionBankQuery query);
    ThQuestionBank getQuestionInfoByUuid(String uuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudentCourseService.java
对比新文件
@@ -0,0 +1,24 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThCourse;
import com.gkhy.exam.institutionalaccess.entity.ThStudentCourse;
import com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudentCourseVO;
import java.util.List;
public interface ThStudentCourseService extends IService<ThStudentCourse> {
    List<ThStudentCourse> getByIdCards(List<String> idcards);
    List<ThStatisticStudentVO> statisticByBatchUuid();
    List<ThStudentCourse> listByInstitutionId(Long id);
    List<ThStatisticStudentVO> statisticByCourseUuid();
    List<ThStudentCourseVO> getListByBatchUuid(String batchUuid);
    void updateByBatchUuid(String batchUuid);
    List<ThStudentCourse> getByIdcardAndBatchUuid(String idcard, String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudentManagerService.java
对比新文件
@@ -0,0 +1,10 @@
package com.gkhy.exam.institutionalaccess.service;
import com.gkhy.exam.institutionalaccess.entity.ThStudent;
import com.gkhy.exam.institutionalaccess.model.query.ThStudentQuery;
import java.util.List;
public interface ThStudentManagerService {
    List<ThStudent> listByPage(ThStudentQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudentService.java
对比新文件
@@ -0,0 +1,18 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThStudent;
import com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO;
import java.util.List;
public interface ThStudentService extends IService<ThStudent> {
    ThStudent getByIdcard(String idcard);
    List<ThStudent> getByIdcards(List<String> idcards);
    int updateByIdcard(List<ThStudent> updateStudentList);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyAuthService.java
对比新文件
@@ -0,0 +1,14 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThStudyAuth;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyAuthVO;
import java.util.List;
public interface ThStudyAuthService extends IService<ThStudyAuth> {
    List<String> getUuidByStudyDetaiId(String studyDetaiId);
    List<ThStudyAuth> getListByStudyDetaiIds(List<String> detailUuids);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyDetailService.java
对比新文件
@@ -0,0 +1,21 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThStudyDetail;
import com.gkhy.exam.institutionalaccess.model.query.ThStudyDetailQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyVO;
import java.util.List;
public interface ThStudyDetailService extends IService<ThStudyDetail> {
    ThStudyDetail getByUuid(String uuid);
    Long getCount();
    List<ThStudyDetailVO> listByPage(ThStudyDetailQuery query);
    List<ThStudyVO> statisticDurationByIdcard(String batchUuid);
    List<ThStudyDetailVO> listByBatchUuid(String batchUuid);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyRecordManagerService.java
对比新文件
@@ -0,0 +1,10 @@
package com.gkhy.exam.institutionalaccess.service;
import com.gkhy.exam.institutionalaccess.model.query.ThStudyDetailQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO;
import java.util.List;
public interface ThStudyRecordManagerService {
    List<ThStudyDetailVO> listByPage(ThStudyDetailQuery query);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThStudyTrackService.java
对比新文件
@@ -0,0 +1,12 @@
package com.gkhy.exam.institutionalaccess.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.institutionalaccess.entity.ThStudyTrack;
import java.util.List;
public interface ThStudyTrackService extends IService<ThStudyTrack> {
    List<String> getUuidByStudyDetaiId(String studyDetaiId);
    List<ThStudyTrack> getListByStudyDetaiIds(List<String> detailUuids);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java
对比新文件
@@ -0,0 +1,25 @@
package com.gkhy.exam.institutionalaccess.service;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
public interface TripartiteInterfaceService {
    boolean receiveQuestionBank(JSONObject jsonObject);
    AjaxResult receiveCourse(JSONObject jsonObject);
    AjaxResult receiveStudent(JSONObject jsonObject);
    AjaxResult receiveBatch(JSONObject jsonObject);
    AjaxResult receiveStudyDetail(JSONObject jsonObject);
    AjaxResult receiveExamRecord(JSONObject jsonObject);
    AjaxResult receiveCourseDelete(JSONObject jsonObject);
    AjaxResult receiveBatchOpen(JSONObject jsonObject);
    AjaxResult receiveBarchEnd(JSONObject jsonObject);
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThBatchCourseServiceImpl.java
对比新文件
@@ -0,0 +1,69 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThBatchCourse;
import com.gkhy.exam.institutionalaccess.entity.ThStudentCourse;
import com.gkhy.exam.institutionalaccess.mapper.ThBatchCourseMapper;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchCourseVO;
import com.gkhy.exam.institutionalaccess.service.ThBatchCourseService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Service("ThBatchCourseService")
public class ThBatchCourseServiceImpl extends ServiceImpl<ThBatchCourseMapper, ThBatchCourse> implements ThBatchCourseService {
    @Autowired
    private ThBatchCourseMapper batchCourseMapper;
    @Override
    public List<ThBatchCourse> getByBatchUuid(String batchUuid) {
        List<ThBatchCourse> batchCourseList = batchCourseMapper.selectList(new LambdaQueryWrapper<ThBatchCourse>().eq(ThBatchCourse::getBatchUuid,batchUuid)
                .eq(ThBatchCourse::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        return batchCourseList;
    }
    public List<String> getCourseUuisByBatchUuid(String batchUuid){
        List<String> courseUuis = new ArrayList<String>();
        List<ThBatchCourse> list = this.getByBatchUuid(batchUuid);
        if(!CollectionUtils.isEmpty(list)){
           courseUuis = list.stream().map(ThBatchCourse::getCourseUuid).collect(Collectors.toList());
        }
        return courseUuis;
    }
    @Override
    public void deleteByBatchUuidAndCourseUuid(List<ThBatchCourse> deleteBatchCourseList) {
        batchCourseMapper.deleteByBatchUuidAndCourseUuid(deleteBatchCourseList);
    }
    @Override
    public List<ThBatchCourseVO> getListByBatchUuids(List<String> batchUuids) {
        return batchCourseMapper.getListByBatchUuids(batchUuids);
    }
    @Override
    public List<ThBatchCourseVO> getListByBatchUuid(String batchUuid) {
        List<ThBatchCourseVO> thBatchCourseVOS = batchCourseMapper.getListByBatchUuid(batchUuid);
        return thBatchCourseVOS;
    }
    @Override
    public boolean isExsit(String courseUuid) {
        Long count = batchCourseMapper.selectCount(new LambdaQueryWrapper<ThBatchCourse>().eq(ThBatchCourse::getCourseUuid,courseUuid).eq(ThBatchCourse::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        if(count > 0){
            return true;
        }
        return false;
    }
    @Override
    public List<ThBatchCourse> listByInstitutionId(Long institutionId) {
        return batchCourseMapper.selectList(new LambdaQueryWrapper<ThBatchCourse>()
                .eq(ThBatchCourse::getInstitutionId,institutionId).eq(ThBatchCourse::getDelFlag,DeleteStatusEnum.NO.getStatus()));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThBatchManagerServiceImpl.java
对比新文件
@@ -0,0 +1,142 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudyDetail;
import com.gkhy.exam.institutionalaccess.enums.FinishStatus;
import com.gkhy.exam.institutionalaccess.model.query.ThBatchQuery;
import com.gkhy.exam.institutionalaccess.model.resp.ThBatchCourseRespDTO;
import com.gkhy.exam.institutionalaccess.model.resp.ThStudentCourseRespDTO;
import com.gkhy.exam.institutionalaccess.model.resp.ThStudentStudyRespDTO;
import com.gkhy.exam.institutionalaccess.model.vo.*;
import com.gkhy.exam.institutionalaccess.service.*;
import com.gkhy.exam.institutionalaccess.utils.ConvertTimeUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@Service("ThBatchManagerService")
public class ThBatchManagerServiceImpl implements ThBatchManagerService {
    @Autowired
    private ThBatchService thBatchService;
    @Autowired
    private ThBatchCourseService thBatchCourseService;
    @Autowired
    private ThStudentCourseService thStudentCourseService;
    @Autowired
    private ThStudyDetailService thStudyDetailService;
    @Override
    public List<ThBatchVO> listByPage(ThBatchQuery query) {
        List<ThBatchVO> thBatchVOS = thBatchService.listByPage(query);
        //统计学员
        List<ThStatisticStudentVO> thStatisticStudentVOS = thStudentCourseService.statisticByBatchUuid();
        if (!CollectionUtils.isEmpty(thBatchVOS)) {
            List<String> batchUuids = thBatchVOS.stream().map(ThBatchVO::getUuid).collect(Collectors.toList());
            List<ThBatchCourseVO> batchCourseVOS = thBatchCourseService.getListByBatchUuids(batchUuids);
            for (ThBatchVO thBatchVO : thBatchVOS) {
                //课程
                List<ThBatchCourseVO> collect = batchCourseVOS.stream().filter(bc -> bc.getBatchUuid().equals(thBatchVO.getUuid())).collect(Collectors.toList());
                //学员
                List<ThStatisticStudentVO> ssList = thStatisticStudentVOS.stream().filter(ss -> ss.getBatchUuid().equals(thBatchVO.getUuid())).collect(Collectors.toList());
                if(ssList.size() > 0) {
                    thBatchVO.setStudentCount(ssList.get(0).getCount());
                }else {
                    thBatchVO.setStudentCount(0);
                }
                thBatchVO.setCourseVOList(collect);
            }
        }
        return thBatchVOS;
    }
    @Override
    public List<ThBatchCourseRespDTO> period(String batchUuid) {
        //获取批次关联课程
        List<ThBatchCourseVO> batchCourseVOS = thBatchCourseService.getListByBatchUuid(batchUuid);
        //获取关联学生
        List<ThStudentCourseVO> thStudentCourseVOS = thStudentCourseService.getListByBatchUuid(batchUuid);
        //根据批次获取学习记录
        List<ThStudyVO> studyVOS = thStudyDetailService.statisticDurationByIdcard(batchUuid);
        List<ThBatchCourseRespDTO> batchCourseRespDTOS = new ArrayList<>();
        if (!CollectionUtils.isEmpty(batchCourseVOS)) {
            for (ThBatchCourseVO VO : batchCourseVOS) {
                ThBatchCourseRespDTO thBatchCourseRespDTO = new ThBatchCourseRespDTO();
                BeanUtils.copyProperties(VO, thBatchCourseRespDTO);
                //视频时长
                thBatchCourseRespDTO.setDurationDesc(ConvertTimeUtils.convertTimeToString(VO.getDuration()));
                //过滤学生
                List<ThStudentCourseRespDTO> studentList = thStudentCourseVOS
                        .stream()
                        .filter(sc -> sc.getBatchUuid().equals(VO.getBatchUuid()))
                        .map(sc -> {
                            ThStudentCourseRespDTO thStudentCourseRespDTO = new ThStudentCourseRespDTO();
                            BeanUtils.copyProperties(sc, thStudentCourseRespDTO);
                            List<ThStudyVO> collect = studyVOS.stream().filter(s -> s.getIdcard().equals(sc.getIdcard())).collect(Collectors.toList());
                           if(collect.size() > 0) {
                               thStudentCourseRespDTO.setDuration(collect.get(0).getDuration());
                           }else {
                               thStudentCourseRespDTO.setDuration(0l);
                           }
                            return thStudentCourseRespDTO;
                        })
                        .collect(Collectors.toList());
                thBatchCourseRespDTO.setStudentList(studentList);
                batchCourseRespDTOS.add(thBatchCourseRespDTO);
            }
        }
        return batchCourseRespDTOS;
    }
    @Override
    public List<ThStudentStudyRespDTO> getStudent(String batchUuid) {
        //获取学生信息
        List<ThStudentCourseVO> thStudentCourseVOS = thStudentCourseService.getListByBatchUuid(batchUuid);
        //获取学生学习记录
        List<ThStudyDetailVO> studyDetails = thStudyDetailService.listByBatchUuid(batchUuid);
        List<ThStudentStudyRespDTO> respDTOS = new ArrayList<>();
        if (!CollectionUtils.isEmpty(thStudentCourseVOS)) {
            for (ThStudentCourseVO VO : thStudentCourseVOS) {
                ThStudentStudyRespDTO thStudentStudyRespDTO = new ThStudentStudyRespDTO();
                thStudentStudyRespDTO.setIdcard(VO.getIdcard());
                thStudentStudyRespDTO.setName(VO.getName());
                thStudentStudyRespDTO.setCourseName(VO.getCourseName());
                thStudentStudyRespDTO.setLessonTocal(VO.getLessTotal());
                BigDecimal lessNum = new BigDecimal(0);
                List<ThStudyDetailVO> collect = studyDetails
                        .stream()
                        .filter(sd -> sd.getIdcard().equals(VO.getIdcard()))
                        .collect(Collectors.toList());
                StringBuffer stringBuffer = new StringBuffer();
                for (ThStudyDetailVO studyDetail : collect) {
                    //是否完成
                    if(studyDetail.getFinishStatus().equals(FinishStatus.YES.getStatus())){
                        lessNum.add(studyDetail.getLessonNum());
                    }
                    //是否有学时报告
                    if(!StringUtils.isEmpty(studyDetail.getLessonReportUrl())){
                        stringBuffer.append(studyDetail.getLessonReportUrl()).append(",");
                    }
                }
                if(!StringUtils.isEmpty(stringBuffer.toString())){
                    stringBuffer.deleteCharAt(stringBuffer.length()-1);
                }
                thStudentStudyRespDTO.setUrl(stringBuffer.toString());
                thStudentStudyRespDTO.setFinishStatus(VO.getFinishStatus());
                thStudentStudyRespDTO.setLessonNum(lessNum);
                respDTOS.add(thStudentStudyRespDTO);
            }
        }
        return respDTOS;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThBatchServiceImpl.java
对比新文件
@@ -0,0 +1,35 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThBatch;
import com.gkhy.exam.institutionalaccess.mapper.ThBatchMapper;
import com.gkhy.exam.institutionalaccess.model.query.ThBatchQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThBatchVO;
import com.gkhy.exam.institutionalaccess.service.ThBatchService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThBatchService")
public class ThBatchServiceImpl extends ServiceImpl<ThBatchMapper, ThBatch> implements ThBatchService {
    @Autowired
    private ThBatchMapper batchMapper;
    @Override
    public ThBatch getByUuid(String uuid) {
        return batchMapper.selectOne(new LambdaQueryWrapper<ThBatch>().eq(ThBatch::getUuid, uuid).eq(ThBatch::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public List<ThBatch> listByInstitutionId(Long institutionId) {
        return batchMapper.selectList(new LambdaQueryWrapper<ThBatch>().eq(ThBatch::getInstitutionId, institutionId).eq(ThBatch::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public List<ThBatchVO> listByPage(ThBatchQuery query) {
        return batchMapper.listByPage(query);
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCourseChapterServiceImpl.java
对比新文件
@@ -0,0 +1,41 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThCourseChapter;
import com.gkhy.exam.institutionalaccess.mapper.ThCourseChapterMapper;
import com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO;
import com.gkhy.exam.institutionalaccess.service.ThCourseChapterService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThCourseChapterService")
public class ThCourseChapterServiceImpl extends ServiceImpl<ThCourseChapterMapper, ThCourseChapter> implements ThCourseChapterService {
    @Autowired
    private ThCourseChapterMapper courseChapterMapper;
    @Override
    public List<ThCourseChapterVO> listByCourseUuids(List<String> courseUuids) {
        return courseChapterMapper.listByCourseUuids(courseUuids);
    }
    @Override
    public List<ThCourseChapterVO> listByCourseUuid(String courseUuid) {
        return courseChapterMapper.listByCourseUuid(courseUuid);
    }
    @Override
    public List<ThCourseChapter> listByInstitutionId(Long institutionId) {
        return courseChapterMapper.selectList(new LambdaQueryWrapper<ThCourseChapter>().eq(ThCourseChapter::getInstitutionId, institutionId).eq(ThCourseChapter::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public ThCourseChapter getByUuid(String batchUuid) {
        return courseChapterMapper.selectOne(new LambdaQueryWrapper<ThCourseChapter>().eq(ThCourseChapter::getUuid, batchUuid).eq(ThCourseChapter::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCourseManagerServiceImpl.java
对比新文件
@@ -0,0 +1,109 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThCourse;
import com.gkhy.exam.institutionalaccess.entity.ThCourseChapter;
import com.gkhy.exam.institutionalaccess.model.query.ThCourseQuery;
import com.gkhy.exam.institutionalaccess.model.resp.ThCourseChapterRespDTO;
import com.gkhy.exam.institutionalaccess.model.resp.ThCourseRespDTO;
import com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO;
import com.gkhy.exam.institutionalaccess.service.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service("ThCourseManagerService")
public class ThCourseManagerServiceImpl implements ThCourseManagerService {
    @Autowired
    private ThCourseService courseService;
    @Autowired
    private ThCourseChapterService courseChapterService;
    @Autowired
    private ThStudentCourseService studentCourseService;
    @Override
    public List<ThCourseRespDTO> listByPage(ThCourseQuery query) {
        List<ThCourse> courseList = courseService.listByPage(query);
        //分许获取数据
        List<ThStatisticStudentVO> thStatisticStudentVOS = studentCourseService.statisticByCourseUuid();
        List<ThCourseRespDTO> courseRespDTOList = new ArrayList<>();
        if(!CollectionUtils.isEmpty(courseList)){
            //根据courseids获取所有章节
            List<ThCourseChapterVO> courseChapterVOS = new ArrayList<>();
            List<String> courseUuids = courseList.stream().map(ThCourse::getUuid).collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(courseUuids)){
                courseChapterVOS = courseChapterService.listByCourseUuids(courseUuids);
            }
            for (ThCourse course : courseList) {
                ThCourseRespDTO courseRespDTO = new ThCourseRespDTO();
                BeanUtils.copyProperties(course, courseRespDTO);
                //获取章
                List<ThCourseChapterVO> finalCourseChapterVOS = courseChapterVOS;
                List<ThCourseChapterRespDTO> chapterList = courseChapterVOS
                        .stream()
                        .filter(cc -> course.getUuid().equals(cc.getCourseUuid()) && cc.getParentUuid().equals("0"))
                        .map(cc -> {
                            ThCourseChapterRespDTO courseChapterRespDTO = new ThCourseChapterRespDTO();
                            BeanUtils.copyProperties(cc, courseChapterRespDTO);
                            courseChapterRespDTO.setChildren(getChildren(finalCourseChapterVOS,cc.getUuid()));
                            return courseChapterRespDTO;
                        })
                        .collect(Collectors.toList());
                courseRespDTO.setOutline(chapterList);
                //学员数量
                List<ThStatisticStudentVO> statisticList = thStatisticStudentVOS.stream().filter(s -> s.getCourseUuid().equals(course.getUuid())).collect(Collectors.toList());
                if(statisticList.size()>0){
                    ThStatisticStudentVO thStatisticStudentVO = statisticList.get(0);
                    courseRespDTO.setStudentCount(thStatisticStudentVO.getCount());
                }else {
                    courseRespDTO.setStudentCount(0);
                }
                courseRespDTOList.add(courseRespDTO);
            }
        }
        return courseRespDTOList;
    }
    //获取单条课程
    @Override
    public ThCourseRespDTO findById(Long id) {
        ThCourse thCourse = courseService.getById(id);
        ThCourseRespDTO thCourseRespDTO = new ThCourseRespDTO();
        BeanUtils.copyProperties(thCourse, thCourseRespDTO);
        List<ThCourseChapterVO> thCourseChapterVOS = courseChapterService.listByCourseUuid(thCourse.getUuid());
        List<ThCourseChapterRespDTO> chapterRespDTOS = thCourseChapterVOS.stream()
                .filter(c -> c.getParentUuid().equals("0"))
                .map(c -> {
                    ThCourseChapterRespDTO chapterRespDTO = new ThCourseChapterRespDTO();
                    BeanUtils.copyProperties(c, chapterRespDTO);
                    chapterRespDTO.setChildren(getChildren(thCourseChapterVOS,c.getUuid()));
                    return chapterRespDTO;
                }).collect(Collectors.toList());
        thCourseRespDTO.setOutline(chapterRespDTOS);
        return thCourseRespDTO;
    }
    //获取章节
    private List<ThCourseChapterRespDTO> getChildren(List<ThCourseChapterVO> courseChapterVOS, String parentUuid) {
        List<ThCourseChapterRespDTO> chapterList = courseChapterVOS
                .stream()
                .filter(cc -> cc.getParentUuid().equals(parentUuid))
                .map(cc -> {
                    ThCourseChapterRespDTO courseChapterRespDTO = new ThCourseChapterRespDTO();
                    BeanUtils.copyProperties(cc, courseChapterRespDTO);
                    return courseChapterRespDTO;
                })
                .collect(Collectors.toList());
        return chapterList;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCourseServiceImpl.java
对比新文件
@@ -0,0 +1,48 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThCourse;
import com.gkhy.exam.institutionalaccess.mapper.ThCourseMapper;
import com.gkhy.exam.institutionalaccess.model.query.ThCourseQuery;
import com.gkhy.exam.institutionalaccess.service.ThCourseService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("ThCourseService")
public class ThCourseServiceImpl extends ServiceImpl<ThCourseMapper, ThCourse> implements ThCourseService {
    @Autowired
    private ThCourseMapper courseMapper;
    @Override
    public List<ThCourse> listByPage(ThCourseQuery query) {
        return courseMapper.listByPage(query);
    }
    @Override
    public ThCourse getByUuid(String uuid) {
        ThCourse course = courseMapper.selectOne(new LambdaQueryWrapper<ThCourse>().eq(ThCourse::getUuid, uuid).eq(ThCourse::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        return course;
    }
    @Override
    public List<ThCourse> selectByUuid(List<String> courseUuidList) {
        List<ThCourse> courseList = courseMapper.selectList(new LambdaQueryWrapper<ThCourse>().in(ThCourse::getUuid, courseUuidList)
                .eq(ThCourse::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        return courseList;
    }
    @Override
    public List<ThCourse> listByInstitutionId(Long institutionId) {
        List<ThCourse> list = courseMapper.selectList(new LambdaQueryWrapper<ThCourse>()
                .eq(ThCourse::getInstitutionId, institutionId)
                .eq(ThCourse::getDelFlag, DeleteStatusEnum.NO.getStatus())
        );
        return list;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThExamRecordManagerServiceImpl.java
对比新文件
@@ -0,0 +1,19 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.gkhy.exam.institutionalaccess.model.query.ThExamRecordQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThExamRecordVO;
import com.gkhy.exam.institutionalaccess.service.ThExamRecordManagerService;
import com.gkhy.exam.institutionalaccess.service.ThExamRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("ThExamRecordManagerService")
public class ThExamRecordManagerServiceImpl implements ThExamRecordManagerService {
    @Autowired
    private ThExamRecordService thExamRecordService;
    @Override
    public List<ThExamRecordVO> listByPage(ThExamRecordQuery query) {
        return thExamRecordService.listByPage(query);
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThExamRecordServiceImpl.java
对比新文件
@@ -0,0 +1,28 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThExamRecord;
import com.gkhy.exam.institutionalaccess.mapper.ThExamRecordMapper;
import com.gkhy.exam.institutionalaccess.model.query.ThExamRecordQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThExamRecordVO;
import com.gkhy.exam.institutionalaccess.service.ThExamRecordService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("ThExamRecordService")
public class ThExamRecordServiceImpl extends ServiceImpl<ThExamRecordMapper, ThExamRecord> implements ThExamRecordService {
    @Autowired
    private ThExamRecordMapper thExamRecordMapper;
    @Override
    public List<ThExamRecord> listByInstitutionId(Long institutionId) {
        return thExamRecordMapper.selectList(new LambdaQueryWrapper<ThExamRecord>().eq(ThExamRecord::getInstitutionId, institutionId).eq(ThExamRecord::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public List<ThExamRecordVO> listByPage(ThExamRecordQuery query) {
        return thExamRecordMapper.listByPage(query);
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThQuestionBankServiceImpl.java
对比新文件
@@ -0,0 +1,32 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.model.query.ThQuestionBankQuery;
import com.gkhy.exam.institutionalaccess.entity.ThQuestionBank;
import com.gkhy.exam.institutionalaccess.mapper.ThQuestionBankMapper;
import com.gkhy.exam.institutionalaccess.service.ThQuestionBankService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("ThQuestionBankService")
public class ThQuestionBankServiceImpl extends ServiceImpl<ThQuestionBankMapper, ThQuestionBank> implements ThQuestionBankService {
    @Autowired
    private ThQuestionBankMapper questionBankMapper;
    @Override
    public List<ThQuestionBank> listByPage(ThQuestionBankQuery query) {
        List<ThQuestionBank> questionBanks = questionBankMapper.selectList(new LambdaQueryWrapper<ThQuestionBank>()
                .eq(ThQuestionBank::getDelFlag, DeleteStatusEnum.NO.getStatus())
                .orderByDesc(ThQuestionBank::getCreateTime));
        return questionBanks;
    }
    @Override
    public ThQuestionBank getQuestionInfoByUuid(String uuid) {
        ThQuestionBank questionBank = questionBankMapper.selectOne(new LambdaQueryWrapper<ThQuestionBank>().eq(ThQuestionBank::getUuid, uuid).eq(ThQuestionBank::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        return questionBank;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudentCourseServiceImpl.java
对比新文件
@@ -0,0 +1,60 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudentCourse;
import com.gkhy.exam.institutionalaccess.mapper.ThStudentCourseMapper;
import com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudentCourseVO;
import com.gkhy.exam.institutionalaccess.service.ThStudentCourseService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThStudentCourseService")
public class ThStudentCourseServiceImpl extends ServiceImpl<ThStudentCourseMapper, ThStudentCourse> implements ThStudentCourseService {
   @Autowired
   private ThStudentCourseMapper studentCourseMapper;
    @Override
    public List<ThStudentCourse> getByIdCards(List<String> idcards) {
        return studentCourseMapper.selectList(new LambdaQueryWrapper<ThStudentCourse>().in(ThStudentCourse::getIdcard, idcards));
    }
    @Override
    public List<ThStatisticStudentVO> statisticByBatchUuid() {
        return studentCourseMapper.statisticByBatchUuid();
    }
    @Override
    public List<ThStudentCourse> listByInstitutionId(Long institutionId) {
        return studentCourseMapper.selectList(new LambdaQueryWrapper<ThStudentCourse>().eq(ThStudentCourse::getInstitutionId, institutionId));
    }
    @Override
    public List<ThStatisticStudentVO> statisticByCourseUuid() {
        return studentCourseMapper.statisticByCourseUuid();
    }
    @Override
    public List<ThStudentCourseVO> getListByBatchUuid(String batchUuid) {
        return studentCourseMapper.getListByBatchUuid(batchUuid);
    }
    @Override
    public void updateByBatchUuid(String batchUuid) {
        studentCourseMapper.updateByBatchUuid(batchUuid);
    }
    @Override
    public List<ThStudentCourse> getByIdcardAndBatchUuid(String idcard, String batchUuid) {
        List<ThStudentCourse> thStudentCourse = studentCourseMapper.selectList(new LambdaQueryWrapper<ThStudentCourse>().eq(ThStudentCourse::getIdcard, idcard)
                .eq(ThStudentCourse::getBatchUuid, batchUuid).eq(ThStudentCourse::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    return thStudentCourse;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudentManagerServiceImpl.java
对比新文件
@@ -0,0 +1,27 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gkhy.exam.institutionalaccess.entity.ThStudent;
import com.gkhy.exam.institutionalaccess.model.query.ThStudentQuery;
import com.gkhy.exam.institutionalaccess.service.ThStudentManagerService;
import com.gkhy.exam.institutionalaccess.service.ThStudentService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("ThStudentManagerService")
public class ThStudentManagerServiceImpl implements ThStudentManagerService {
    @Autowired
    private ThStudentService thStudentService;
    @Override
    public List<ThStudent> listByPage(ThStudentQuery query) {
        return thStudentService.list(new LambdaQueryWrapper<ThStudent>()
                .eq(!StringUtils.isEmpty(query.getIdcard()),ThStudent::getIdcard,query.getIdcard())
                .like(!StringUtils.isEmpty(query.getName()),ThStudent::getName, query.getName())
                .eq(ThStudent::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudentServiceImpl.java
对比新文件
@@ -0,0 +1,40 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudent;
import com.gkhy.exam.institutionalaccess.mapper.ThStudentMapper;
import com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO;
import com.gkhy.exam.institutionalaccess.service.ThStudentService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThStudentService")
public class ThStudentServiceImpl extends ServiceImpl<ThStudentMapper, ThStudent> implements ThStudentService {
    @Autowired
    private ThStudentMapper studentMapper;
    @Override
    public ThStudent getByIdcard(String idcard) {
        return studentMapper.selectOne(new LambdaQueryWrapper<ThStudent>().eq(ThStudent::getIdcard, idcard)
                .eq(ThStudent::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public List<ThStudent> getByIdcards(List<String> idcards) {
        List<ThStudent> students = studentMapper.selectList(new LambdaQueryWrapper<ThStudent>().in(ThStudent::getIdcard, idcards).eq(ThStudent::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        return students;
    }
    @Override
    public int updateByIdcard(List<ThStudent> updateStudentList) {
        return studentMapper.updateByIdcard(updateStudentList);
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyAuthServiceImpl.java
对比新文件
@@ -0,0 +1,29 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudyAuth;
import com.gkhy.exam.institutionalaccess.mapper.ThStudyAuthMapper;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyAuthVO;
import com.gkhy.exam.institutionalaccess.service.ThStudyAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThStudyAuthService")
public class ThStudyAuthServiceImpl extends ServiceImpl<ThStudyAuthMapper,ThStudyAuth> implements ThStudyAuthService {
    @Autowired
    private ThStudyAuthMapper thStudyAuthMapper;
    @Override
    public List<String> getUuidByStudyDetaiId(String studyDetaiId) {
        return thStudyAuthMapper.getUuidByStudyDetaiId(studyDetaiId);
    }
    @Override
    public List<ThStudyAuth> getListByStudyDetaiIds(List<String> detailUuids) {
        return thStudyAuthMapper.selectList(new LambdaQueryWrapper<ThStudyAuth>().in(ThStudyAuth::getStudyDetailUuid, detailUuids));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyDetailServiceImpl.java
对比新文件
@@ -0,0 +1,48 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudyDetail;
import com.gkhy.exam.institutionalaccess.mapper.ThStudyDetailMapper;
import com.gkhy.exam.institutionalaccess.model.query.ThStudyDetailQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyVO;
import com.gkhy.exam.institutionalaccess.service.ThStudyDetailService;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThStudyDetailService")
public class ThStudyDetailServiceImpl extends ServiceImpl<ThStudyDetailMapper, ThStudyDetail> implements ThStudyDetailService {
    @Autowired
    private ThStudyDetailMapper thStudyDetailMapper;
    @Override
    public ThStudyDetail getByUuid(String uuid) {
        return thStudyDetailMapper.selectOne(new LambdaQueryWrapper<ThStudyDetail>().eq(ThStudyDetail::getUuid,uuid).eq(ThStudyDetail::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public Long getCount() {
        return thStudyDetailMapper.selectCount(new LambdaQueryWrapper<>());
    }
    @Override
    public List<ThStudyDetailVO> listByPage(ThStudyDetailQuery query) {
        return thStudyDetailMapper.listByPage(query);
    }
    @Override
    public List<ThStudyVO> statisticDurationByIdcard(String batchUuid) {
        return thStudyDetailMapper.statisticDurationByIdcard(batchUuid);
    }
    @Override
    public List<ThStudyDetailVO> listByBatchUuid(String batchUuid) {
        return thStudyDetailMapper.listByBatchUuid(batchUuid);
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyRecordManagerServiceImpl.java
对比新文件
@@ -0,0 +1,70 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudyAuth;
import com.gkhy.exam.institutionalaccess.entity.ThStudyTrack;
import com.gkhy.exam.institutionalaccess.model.query.ThStudyDetailQuery;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyAuthVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO;
import com.gkhy.exam.institutionalaccess.model.vo.ThStudyTrackVO;
import com.gkhy.exam.institutionalaccess.service.ThStudyAuthService;
import com.gkhy.exam.institutionalaccess.service.ThStudyDetailService;
import com.gkhy.exam.institutionalaccess.service.ThStudyRecordManagerService;
import com.gkhy.exam.institutionalaccess.service.ThStudyTrackService;
import com.gkhy.exam.institutionalaccess.utils.ConvertTimeUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service("ThStudyRecordManagerService")
public class ThStudyRecordManagerServiceImpl implements ThStudyRecordManagerService {
    @Autowired
    private ThStudyDetailService thStudyDetailService;
    @Autowired
    private ThStudyTrackService thStudyTrackService;
    @Autowired
    private ThStudyAuthService thStudyAuthService;
    @Override
    public List<ThStudyDetailVO> listByPage(ThStudyDetailQuery query) {
        List<ThStudyDetailVO> thStudyDetailVOS = thStudyDetailService.listByPage(query);
        if(!CollectionUtils.isEmpty(thStudyDetailVOS)){
            List<String> detailUuids = thStudyDetailVOS.stream().map(ThStudyDetailVO::getUuid).collect(Collectors.toList());
            //获取认证记录
            List<ThStudyAuth> authList = thStudyAuthService.getListByStudyDetaiIds(detailUuids);
            //获取轨迹
            List<ThStudyTrack> trackList = thStudyTrackService.getListByStudyDetaiIds(detailUuids);
            for(ThStudyDetailVO thStudyDetailVO : thStudyDetailVOS){
                thStudyDetailVO.setDurationDesc(ConvertTimeUtils.convertTimeToString(thStudyDetailVO.getDuration()));
                thStudyDetailVO.setStartPositionDesc(ConvertTimeUtils.convertTimeToString(thStudyDetailVO.getStartPosition()));
                thStudyDetailVO.setFinishPositionDesc(ConvertTimeUtils.convertTimeToString(thStudyDetailVO.getFinishPosition()));
                List<ThStudyAuthVO> thStudyAuthVOList = authList.stream().filter(a -> a.getStudyDetailUuid().equals(thStudyDetailVO.getUuid()))
                        .map(a -> {
                            ThStudyAuthVO thStudyAuthVO = new ThStudyAuthVO();
                            BeanUtils.copyProperties(a, thStudyAuthVO);
                            thStudyAuthVO.setAuthPostionDesc(ConvertTimeUtils.convertTimeToString(a.getAuthPosition()));
                            return thStudyAuthVO;
                        }).collect(Collectors.toList());
                List<ThStudyTrackVO> trackVOList = trackList.stream().filter(t -> t.getStudyDetailUuid().equals(thStudyDetailVO.getUuid()))
                        .map(t -> {
                            ThStudyTrackVO thStudyTrackVO = new ThStudyTrackVO();
                            BeanUtils.copyProperties(t, thStudyTrackVO);
                            thStudyTrackVO.setTimeIntervalDesc(ConvertTimeUtils.convertTimeToString(t.getTimeInterval()));
                            return thStudyTrackVO;
                        }).collect(Collectors.toList());
                thStudyDetailVO.setAuthList(thStudyAuthVOList);
                thStudyDetailVO.setTrackList(trackVOList);
            }
        }
        return thStudyDetailVOS;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThStudyTrackServiceImpl.java
对比新文件
@@ -0,0 +1,29 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.institutionalaccess.entity.ThStudyTrack;
import com.gkhy.exam.institutionalaccess.mapper.ThStudyTrackMapper;
import com.gkhy.exam.institutionalaccess.service.ThStudyTrackService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("ThStudyTrackService")
public class ThStudyTrackServiceImpl extends ServiceImpl<ThStudyTrackMapper, ThStudyTrack> implements ThStudyTrackService {
    @Autowired
    private ThStudyTrackMapper thStudyTrackMapper;
    @Override
    public List<String> getUuidByStudyDetaiId(String studyDetaiId) {
        return thStudyTrackMapper.getUuidByStudyDetaiId(studyDetaiId);
    }
    @Override
    public List<ThStudyTrack> getListByStudyDetaiIds(List<String> detailUuids) {
        return thStudyTrackMapper.selectList(new LambdaQueryWrapper<ThStudyTrack>().in(ThStudyTrack::getStudyDetailUuid, detailUuids));
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java
对比新文件
@@ -0,0 +1,1146 @@
package com.gkhy.exam.institutionalaccess.service.serviceImpl;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.gkhy.exam.institutionalaccess.entity.*;
import com.gkhy.exam.institutionalaccess.enums.*;
import com.gkhy.exam.institutionalaccess.model.req.*;
import com.gkhy.exam.institutionalaccess.model.resp.ThErrorDataRespDTO;
import com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO;
import com.gkhy.exam.institutionalaccess.service.*;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.InstitutionUser;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.signature.AESUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.security.context.ThreeInContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service("TripartiteInterfaceService")
public class TripartiteInterfaceServiceImpl implements TripartiteInterfaceService {
    @Autowired
    private ThQuestionBankService questionBankService;
    @Autowired
    private ThCourseService courseService;
    @Autowired
    private ThCourseChapterService courseChapterService;
    @Autowired
    private ThStudentService studentService;
    @Autowired
    private ThBatchService batchService;
    @Autowired
    private ThBatchCourseService batchCourseService;
    @Autowired
    private ThStudentCourseService studentCourseService;
    @Autowired
    private ThStudyAuthService studyAuthService;
    @Autowired
    private ThStudyTrackService studyTrackService;
    @Autowired
    private ThStudyDetailService studyDetailService;
    @Autowired
    private ThExamRecordService examRecordService;
    @Override
    public boolean receiveQuestionBank(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThQuestionBankReqDTO questionBankReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThQuestionBankReqDTO>() {});
        //参数校验
        validateQuestion(questionBankReqDTO);
        //根据uuid查询数据
        ThQuestionBank qb = questionBankService.getQuestionInfoByUuid(questionBankReqDTO.getUuid());
        boolean i = true;
        if(qb == null){
            //新增
            qb = new ThQuestionBank();
            BeanUtils.copyProperties(questionBankReqDTO, qb);
            qb.setUuid(questionBankReqDTO.getUuid());
            qb.setInstitutionId(institutionUser.getId());
            qb.setInstitutionName(institutionUser.getInstitutionalName());
            qb.setCreateTime(LocalDateTime.now());
            qb.setUpdateTime(LocalDateTime.now());
            qb.setCreateBy(institutionUser.getInstitutionalName());
            qb.setUpdateBy(institutionUser.getInstitutionalName());
            qb.setDelFlag(DeleteStatusEnum.NO.getStatus());
            i = questionBankService.save(qb);
        }else {
            //修改
            BeanUtils.copyProperties(questionBankReqDTO, qb);
            i = questionBankService.updateById(qb);
        }
        return i;
    }
    @Transactional
    @Override
    public AjaxResult receiveCourse(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThCourseReqDTO courseReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThCourseReqDTO>() {});
        //校验
        validateCourse(courseReqDTO);
        //获取数据
        ThCourse course= courseService.getByUuid(courseReqDTO.getUuid());
        if(course == null){
            //新增
            //课程
            course = new ThCourse();
            BeanUtils.copyProperties(courseReqDTO, course);
            course.setId(IdUtil.getSnowflake(0,0).nextId());
            course.setCreateTime(LocalDateTime.now());
            course.setUpdateTime(LocalDateTime.now());
            course.setCreateBy(institutionUser.getInstitutionalName());
            course.setUpdateBy(institutionUser.getInstitutionalName());
            course.setInstitutionId(institutionUser.getId());
            course.setDelFlag(DeleteStatusEnum.NO.getStatus());
            course.setInstitutionName(institutionUser.getInstitutionalName());
            //章节(章)
            List<ThCourseChapter> chapterList = new ArrayList<>();
            for (ThCourseChapterReqDTO chapterReqDTO : courseReqDTO.getChapters()) {
                ThCourseChapter chapter = new ThCourseChapter();
                BeanUtils.copyProperties(chapterReqDTO, chapter);
                chapter.setCourseUuid(course.getUuid());
                chapter.setId(IdUtil.getSnowflake(0,0).nextId());
                chapter.setParentUuid("0");
                chapter.setInstitutionId(institutionUser.getId());
                chapter.setCreateTime(LocalDateTime.now());
                chapter.setUpdateTime(LocalDateTime.now());
                chapter.setDelFlag(DeleteStatusEnum.NO.getStatus());
                chapter.setCreateBy(institutionUser.getInstitutionalName());
                chapter.setUpdateBy(institutionUser.getInstitutionalName());
                chapterList.add(chapter);
                //章节(节)
                for (ThCourseChapterReqDTO child : chapterReqDTO.getChildren()) {
                    ThCourseChapter section = new ThCourseChapter();
                    BeanUtils.copyProperties(child, section);
                    section.setCourseUuid(course.getUuid());
                    section.setId(IdUtil.getSnowflake(0,0).nextId());
                    section.setParentUuid(chapter.getUuid());
                    section.setInstitutionId(institutionUser.getId());
                    section.setCreateTime(LocalDateTime.now());
                    section.setUpdateTime(LocalDateTime.now());
                    section.setDelFlag(DeleteStatusEnum.NO.getStatus());
                    section.setCreateBy(institutionUser.getInstitutionalName());
                    section.setUpdateBy(institutionUser.getInstitutionalName());
                    chapterList.add(section);
                }
            }
            courseService.save(course);
            if(chapterList.size() > 0){
                courseChapterService.saveBatch(chapterList);
            }
        }else {
            //获取所有章节
            List<ThCourseChapterVO> courseChapterVOS = courseChapterService.listByCourseUuid(course.getUuid());
            //修改
            //章
            List<ThCourseChapter> saveChapterList = new ArrayList<>();
            List<ThCourseChapter> updateChapterList = new ArrayList<>();
            //章
            for (ThCourseChapterReqDTO chapterReqDTO : courseReqDTO.getChapters()) {
                List<ThCourseChapterVO> chapterSelectList = courseChapterVOS.stream().filter(cc -> cc.getUuid().equals(chapterReqDTO.getUuid())).collect(Collectors.toList());
                if(chapterSelectList.size() > 0){
                    ThCourseChapterVO courseChapterVO = chapterSelectList.get(0);
                    //修改
                    ThCourseChapter chapter = new ThCourseChapter();
                    BeanUtils.copyProperties(chapterReqDTO, chapter);
                    chapter.setId(courseChapterVO.getId());
                    chapter.setUpdateBy(institutionUser.getInstitutionalName());
                    chapter.setUpdateTime(LocalDateTime.now());
                    updateChapterList.add(chapter);
                    for (ThCourseChapterReqDTO child : chapterReqDTO.getChildren()) {
                        List<ThCourseChapterVO> sectionSelectList = courseChapterVOS.stream().filter(cc -> cc.getUuid().equals(child.getUuid()) && cc.getParentUuid().equals(courseChapterVO.getUuid())).collect(Collectors.toList());
                        if(sectionSelectList.size() > 0){
                            //修改
                            ThCourseChapterVO sectionChapterVO = sectionSelectList.get(0);
                            ThCourseChapter section = new ThCourseChapter();
                            BeanUtils.copyProperties(child, section);
                            section.setId(sectionChapterVO.getId());
                            section.setUpdateBy(institutionUser.getInstitutionalName());
                            section.setUpdateTime(LocalDateTime.now());
                            updateChapterList.add(section);
                        }else {
                            //新增
                            ThCourseChapter sectionChapter= new ThCourseChapter();
                            BeanUtils.copyProperties(child, sectionChapter);
                            sectionChapter.setId(IdUtil.getSnowflake(0,0).nextId());
                            sectionChapter.setCourseUuid(course.getUuid());
                            sectionChapter.setParentUuid(courseChapterVO.getUuid());
                            sectionChapter.setInstitutionId(institutionUser.getId());
                            sectionChapter.setDelFlag(DeleteStatusEnum.NO.getStatus());
                            sectionChapter.setUpdateBy(institutionUser.getInstitutionalName());
                            sectionChapter.setUpdateTime(LocalDateTime.now());
                            sectionChapter.setCreateBy(institutionUser.getInstitutionalName());
                            sectionChapter.setCreateTime(LocalDateTime.now());
                            saveChapterList.add(sectionChapter);
                        }
                    }
                }else {
                    //新增
                    ThCourseChapter chapter = new ThCourseChapter();
                    BeanUtils.copyProperties(chapterReqDTO, chapter);
                    chapter.setId(IdUtil.getSnowflake(0,0).nextId());
                    chapter.setParentUuid("0");
                    chapter.setCourseUuid(course.getUuid());
                    chapter.setInstitutionId(institutionUser.getId());
                    chapter.setDelFlag(DeleteStatusEnum.NO.getStatus());
                    chapter.setCreateTime(LocalDateTime.now());
                    chapter.setUpdateTime(LocalDateTime.now());
                    chapter.setCreateBy(institutionUser.getInstitutionalName());
                    chapter.setUpdateBy(institutionUser.getInstitutionalName());
                    saveChapterList.add(chapter);
                    //章节(节)
                    for (ThCourseChapterReqDTO child : chapterReqDTO.getChildren()) {
                        ThCourseChapter section = new ThCourseChapter();
                        BeanUtils.copyProperties(child, section);
                        section.setId(IdUtil.getSnowflake(0,0).nextId());
                        section.setParentUuid(chapter.getUuid());
                        section.setCourseUuid(course.getUuid());
                        section.setDelFlag(DeleteStatusEnum.NO.getStatus());
                        section.setInstitutionId(institutionUser.getId());
                        section.setCreateTime(LocalDateTime.now());
                        section.setUpdateTime(LocalDateTime.now());
                        section.setCreateBy(institutionUser.getInstitutionalName());
                        section.setUpdateBy(institutionUser.getInstitutionalName());
                        saveChapterList.add(section);
                    }
                }
            }
            //课程
            course.setCourseCode(courseReqDTO.getCourseCode());
            course.setCourseName(courseReqDTO.getCourseName());
            course.setLessonNum(courseReqDTO.getLessonNum());
            course.setDelFlag(DeleteStatusEnum.NO.getStatus());
            course.setUpdateBy(institutionUser.getInstitutionalName());
            course.setUpdateTime(LocalDateTime.now());
            courseService.updateById(course);
            //新增章节
            if(saveChapterList.size() > 0){
                courseChapterService.saveBatch(saveChapterList);
            }
            //修改章节
            if(updateChapterList.size() > 0){
                courseChapterService.updateBatchById(updateChapterList);
            }
        }
        return AjaxResult.success();
    }
    @Transactional
    @Override
    public AjaxResult receiveStudent(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        List<ThStudentReqDTO> studentReqDTOs = JSONObject.parseObject(decrypt, new TypeReference<List<ThStudentReqDTO>>() {});
        //获取批次课程
        List<ThBatchCourse> batchCourseList = batchCourseService.listByInstitutionId(institutionUser.getId());
        //获取批次学生
        List<ThStudentCourse> studentCourseList = studentCourseService.listByInstitutionId(institutionUser.getId());
        //参数校验
        if(CollectionUtils.isEmpty(studentReqDTOs)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学生信息不可为空");
        }
        //错误
        List<ThErrorDataRespDTO> errorDataRespDTOS = new ArrayList<>();
        List<ThStudentReqDTO> studentReqDTOList = new ArrayList<>();
        for (ThStudentReqDTO studentReqDTO : studentReqDTOs) {
            if(StringUtils.isEmpty(studentReqDTO.getIdcard())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"身份证不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(studentReqDTO.getName())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"姓名不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(studentReqDTO.getPhone())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"手机号不可为空"));
                continue;
            }
            if(studentReqDTO.getSex() == null || StudentSex.get(studentReqDTO.getSex()) == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"性别不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(studentReqDTO.getAuthPhoto())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"实名认证照不可为空"));
                continue;
            }
            if (StringUtils.isEmpty(studentReqDTO.getTrainOrgName())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"培训机构名称不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(studentReqDTO.getBatchUuid())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(),"关联批次(班级)不可为空"));
                continue;
            }
            List<ThBatchCourse> collect = batchCourseList.stream().filter(batchCourse -> batchCourse.getBatchUuid().equals(studentReqDTO.getBatchUuid())).collect(Collectors.toList());
            if (CollectionUtils.isEmpty(collect)) {
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(), "批次(班级)不存在,请先添加批次(班级)"));
                continue;
            }
            List<ThStudentCourse> collect1 = studentCourseList.stream().filter(student -> student.getBatchUuid().equals(studentReqDTO.getBatchUuid()) && student.getIdcard().equals(studentReqDTO.getIdcard())).collect(Collectors.toList());
            if (!CollectionUtils.isEmpty(collect1)) {
                errorDataRespDTOS.add(new ThErrorDataRespDTO(studentReqDTO.getIdcard(), "学生不可重复加入批次(班级)"));
                continue;
            }
            studentReqDTOList.add(studentReqDTO);
        }
        if(CollectionUtils.isEmpty(studentReqDTOList)){
            return AjaxResult.success(errorDataRespDTOS);
        }
        //根据idcards查询
        List<String> idcards = studentReqDTOList.stream().map(ThStudentReqDTO::getIdcard).collect(Collectors.toList());
        List<ThStudent> students = studentService.getByIdcards(idcards);
        //List<ThStudentCourse> thStudentCourseList = studentCourseService.getByIdCards(idcards);
        List<ThStudent> saveSudentList = new ArrayList<>();
        List<ThStudentCourse> saveThStudentCourseList = new ArrayList<>();
        List<ThStudent> updateStudentList = new ArrayList<>();
        for (ThStudentReqDTO studentReqDTO : studentReqDTOList) {
            List<ThStudent> collect = students.stream().filter(s -> s.getIdcard().equals(studentReqDTO.getIdcard())).collect(Collectors.toList());
            if(collect.size() > 0){
                //修改
                ThStudent student = collect.get(0);
                BeanUtils.copyProperties(studentReqDTO, student);
                student.setUpdateBy(institutionUser.getInstitutionalName());
                student.setUpdateTime(LocalDateTime.now());
                student.setInstitutionId(institutionUser.getId());
                student.setInstitutionName(institutionUser.getInstitutionalName());
                updateStudentList.add(student);
                List<ThBatchCourse> scSelectList = batchCourseList.stream().filter(batchCourse -> batchCourse.getBatchUuid().equals(studentReqDTO.getBatchUuid())).collect(Collectors.toList());
                for (ThBatchCourse thStudentCourse : scSelectList) {
                    //新增
                    ThStudentCourse sc = new ThStudentCourse();
                    BeanUtils.copyProperties(student, sc);
                    sc.setId(IdUtil.getSnowflake(0,0).nextId());
                    sc.setCourseUuid(thStudentCourse.getCourseUuid());
                    sc.setBatchUuid(thStudentCourse.getBatchUuid());
                    sc.setFinishStatus(FinishStatus.NO.getStatus());
                    saveThStudentCourseList.add(sc);
                }
            }else {
                //新增
                ThStudent student = new ThStudent();
                BeanUtils.copyProperties(studentReqDTO, student);
                student.setId(IdUtil.getSnowflake(0,0).nextId());
                student.setUpdateBy(institutionUser.getInstitutionalName());
                student.setUpdateTime(LocalDateTime.now());
                student.setCreateBy(institutionUser.getInstitutionalName());
                student.setCreateTime(LocalDateTime.now());
                student.setInstitutionId(institutionUser.getId());
                student.setInstitutionName(institutionUser.getInstitutionalName());
                student.setDelFlag(DeleteStatusEnum.NO.getStatus());
                saveSudentList.add(student);
                List<ThBatchCourse> scSelectList = batchCourseList.stream().filter(batchCourse -> batchCourse.getBatchUuid().equals(studentReqDTO.getBatchUuid())).collect(Collectors.toList());
                for (ThBatchCourse batchCourse : scSelectList) {
                    ThStudentCourse thStudentCourse = new ThStudentCourse();
                    BeanUtils.copyProperties(student, thStudentCourse);
                    thStudentCourse.setId(IdUtil.getSnowflake(0,0).nextId());
                    thStudentCourse.setCourseUuid(batchCourse.getCourseUuid());
                    thStudentCourse.setBatchUuid(batchCourse.getBatchUuid());
                    thStudentCourse.setFinishStatus(FinishStatus.NO.getStatus());
                    saveThStudentCourseList.add(thStudentCourse);
                }
            }
        }
        if(saveSudentList.size() > 0){
            studentService.saveBatch(saveSudentList);
        }
        if(updateStudentList.size() > 0){
            studentService.updateByIdcard(updateStudentList);
        }
        if(saveThStudentCourseList.size() > 0){
            studentCourseService.saveBatch(saveThStudentCourseList);
        }
        return AjaxResult.success(errorDataRespDTOS);
    }
    /**
     * 班次
     * @param jsonObject
     * @return
     */
    @Transactional
    @Override
    public AjaxResult receiveBatch(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThBatchReqDTO batchReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThBatchReqDTO>() {});
        //参数校验
        validateBatch(batchReqDTO);
        //获取数据
        ThBatch batch = batchService.getByUuid(batchReqDTO.getUuid());
        if(batch != null){
            //修改
            List<String> oldCourseUuids = batchCourseService.getCourseUuisByBatchUuid(batch.getUuid());
            BeanUtils.copyProperties(batchReqDTO, batch);
            batch.setUpdateBy(institutionUser.getInstitutionalName());
            batch.setUpdateTime(LocalDateTime.now());
            batch.setInstitutionId(institutionUser.getId());
            batch.setInstitutionName(institutionUser.getInstitutionalName());
            batchService.updateById(batch);
            //关联课程
            //差集(old-new)| 删除
            List<ThBatchCourse> deleteBatchCourseList = oldCourseUuids
                    .stream()
                    .filter(item -> !batchReqDTO.getCourseUuidList().contains(item))
                    .map(item -> {
                        ThBatchCourse batchCourse = new ThBatchCourse();
                        batchCourse.setBatchUuid(batchReqDTO.getUuid());
                        batchCourse.setCourseUuid(item);
                        batchCourse.setDelFlag(DeleteStatusEnum.YES.getStatus());
                        return batchCourse;
                    })
                    .collect(Collectors.toList());
            //差集(new-old) | 新增
            List<ThBatchCourse> saveBatchCourseList = batchReqDTO.getCourseUuidList().stream()
                    .filter(item -> !oldCourseUuids.contains(item))
                    .map(item -> {
                        ThBatchCourse batchCourse = new ThBatchCourse();
                        batchCourse.setBatchUuid(batchReqDTO.getUuid());
                        batchCourse.setCourseUuid(item);
                        batchCourse.setDelFlag(DeleteStatusEnum.NO.getStatus());
                        batchCourse.setInstitutionId(institutionUser.getId());
                        return batchCourse;
                    }).collect(Collectors.toList());
            if(saveBatchCourseList.size() > 0){
                batchCourseService.saveBatch(saveBatchCourseList);
            }
            if (deleteBatchCourseList.size() > 0){
                batchCourseService.deleteByBatchUuidAndCourseUuid(deleteBatchCourseList);
            }
        }else {
            //新增
            //班次新增
            batch = new ThBatch();
            BeanUtils.copyProperties(batchReqDTO, batch);
            batch.setUpdateBy(institutionUser.getInstitutionalName());
            batch.setUpdateTime(LocalDateTime.now());
            batch.setDelFlag(DeleteStatusEnum.NO.getStatus());
            batch.setCreateBy(institutionUser.getInstitutionalName());
            batch.setCreateTime(LocalDateTime.now());
            batch.setInstitutionId(institutionUser.getId());
            batch.setInstitutionName(institutionUser.getInstitutionalName());
            //batch.setFinishStatus(FinishStatus.NO.getStatus());
            batchService.save(batch);
            //关联课程
            List<ThBatchCourse> batchCourseList = new ArrayList<>();
            for (String uuid : batchReqDTO.getCourseUuidList()) {
                ThBatchCourse batchCourse = new ThBatchCourse();
                batchCourse.setBatchUuid(batch.getUuid());
                batchCourse.setCourseUuid(uuid);
                batchCourse.setDelFlag(DeleteStatusEnum.NO.getStatus());
                batchCourse.setInstitutionId(institutionUser.getId());
                batchCourseList.add(batchCourse);
            }
            if(batchCourseList.size() > 0){
                batchCourseService.saveBatch(batchCourseList);
            }
        }
        return AjaxResult.success();
    }
    @Transactional
    @Override
    public AjaxResult receiveStudyDetail(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThStudyDetailReqDTO studyDetailReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThStudyDetailReqDTO>() {});
        //参数校验
        validateStudyDetail(studyDetailReqDTO);
        ThStudyDetail thStudyDetail = studyDetailService.getByUuid(studyDetailReqDTO.getUuid());
        if(thStudyDetail == null){
            //新增学习清单
            thStudyDetail = new ThStudyDetail();
            BeanUtils.copyProperties(studyDetailReqDTO, thStudyDetail);
            thStudyDetail.setUpdateBy(institutionUser.getInstitutionalName());
            thStudyDetail.setUpdateTime(LocalDateTime.now());
            thStudyDetail.setCreateBy(institutionUser.getInstitutionalName());
            thStudyDetail.setCreateTime(LocalDateTime.now());
            thStudyDetail.setInstitutionId(institutionUser.getId());
            thStudyDetail.setInstitutionName(institutionUser.getInstitutionalName());
            thStudyDetail.setDelFlag(DeleteStatusEnum.NO.getStatus());
            thStudyDetail.setSerialNum(generateSerialNum());
            //新增认证记录
            List<ThStudyAuth> thStudyAuthList = studyDetailReqDTO.getAuthList().stream().map(sa -> {
                ThStudyAuth thStudyAuth = new ThStudyAuth();
                BeanUtils.copyProperties(sa, thStudyAuth);
                thStudyAuth.setStudyDetailUuid(studyDetailReqDTO.getUuid());
                return thStudyAuth;
            }).collect(Collectors.toList());
            //新增学习轨迹
            List<ThStudyTrack> thStudyTrackList = studyDetailReqDTO.getTrackList().stream().map(track -> {
                ThStudyTrack thStudyTrack = new ThStudyTrack();
                BeanUtils.copyProperties(track, thStudyTrack);
                thStudyTrack.setStudyDetailUuid(studyDetailReqDTO.getUuid());
                return thStudyTrack;
            }).collect(Collectors.toList());
            studyDetailService.save(thStudyDetail);
            if(thStudyAuthList.size() > 0){
                studyAuthService.saveBatch(thStudyAuthList);
            }
            if(thStudyTrackList.size() > 0){
                studyTrackService.saveBatch(thStudyTrackList);
            }
        }else {
            //获取轨迹数据
            //获取认证数据
            List<String> oldAuthIdList = studyAuthService.getUuidByStudyDetaiId(thStudyDetail.getUuid());
            List<String> oldTrackIdList = studyTrackService.getUuidByStudyDetaiId(thStudyDetail.getUuid());
            //修改
            BeanUtils.copyProperties(studyDetailReqDTO, thStudyDetail);
            thStudyDetail.setUpdateBy(institutionUser.getInstitutionalName());
            thStudyDetail.setUpdateTime(LocalDateTime.now());
            List<ThStudyAuth> saveAuthList = studyDetailReqDTO.getAuthList().stream()
                    .filter(a -> oldAuthIdList.contains(a.getUuid()))
                    .map(a -> {
                        ThStudyAuth thStudyAuth = new ThStudyAuth();
                        BeanUtils.copyProperties(a, thStudyAuth);
                        thStudyAuth.setStudyDetailUuid(studyDetailReqDTO.getUuid());
                        return thStudyAuth;
                    })
                    .collect(Collectors.toList());
            List<ThStudyTrack> saveTrackList = studyDetailReqDTO.getTrackList().stream()
                    .filter(t -> oldTrackIdList.contains(t.getUuid()))
                    .map(t -> {
                        ThStudyTrack thStudyTrack = new ThStudyTrack();
                        BeanUtils.copyProperties(t, thStudyTrack);
                        thStudyTrack.setStudyDetailUuid(studyDetailReqDTO.getUuid());
                        return thStudyTrack;
                    }).collect(Collectors.toList());
            studyDetailService.updateById(thStudyDetail);
            studyAuthService.saveBatch(saveAuthList);
            studyTrackService.saveBatch(saveTrackList);
        }
        return AjaxResult.success();
    }
    @Transactional
    @Override
    public AjaxResult receiveExamRecord(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        List<ThExamRecordReqDTO> examRecordReqDTOS = JSONObject.parseObject(decrypt, new TypeReference<List<ThExamRecordReqDTO>>() {});
        //参数校验
        //获取该平台课程
        List<ThStudentCourse> studentCourseList = studentCourseService.listByInstitutionId(institutionUser.getId());
        List<ThExamRecord> oldExamRecordList = examRecordService.listByInstitutionId(institutionUser.getId());
        List<ThErrorDataRespDTO> errorDataRespDTOS = new ArrayList<>();
        List<ThExamRecord> saveExamRecordList = new ArrayList<>();
        List<ThExamRecord> updateExamRecordList = new ArrayList<>();
        if (CollectionUtils.isEmpty(examRecordReqDTOS)) {
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"考试记录不可为空");
        }
        for (ThExamRecordReqDTO examRecordReqDTO : examRecordReqDTOS) {
            if(StringUtils.isEmpty(examRecordReqDTO.getUuid()) || !UUID.checkIsUuid(examRecordReqDTO.getUuid())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"考试记录uuid不符合规范"));
                continue;
            }
            if(StringUtils.isEmpty(examRecordReqDTO.getIdcard())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"身份证不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(examRecordReqDTO.getCourseUuid())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"课程不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(examRecordReqDTO.getBatchUuid())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"批次不可为空"));
                continue;
            }
            List<ThStudentCourse> thStudentCourses = studentCourseList.stream().filter(sc -> sc.getCourseUuid().equals(examRecordReqDTO.getCourseUuid())
                    && sc.getBatchUuid().equals(examRecordReqDTO.getBatchUuid())
                    && sc.getIdcard().equals(examRecordReqDTO.getIdcard())).collect(Collectors.toList());
            if(thStudentCourses.size() == 0){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"无该学生培训信息"));
                continue;
            }
            if(StringUtils.isEmpty(examRecordReqDTO.getTrainOrgName())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"培训机构名称不可为空"));
                continue;
            }
            if(StringUtils.isEmpty(examRecordReqDTO.getExamName())){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"考试名称不可为空"));
                continue;
            }
            if(examRecordReqDTO.getExamStartTime() == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"开考时间不可为空"));
                continue;
            }
            if(examRecordReqDTO.getExamSubmitTime() == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"结束时间不可为空"));
                continue;
            }
            if(examRecordReqDTO.getExamUserScore() == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"学习成绩不可为空"));
                continue;
            }
            if(examRecordReqDTO.getExamTotalScore() == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"试卷总分不可为空"));
                continue;
            }
            if(examRecordReqDTO.getExamPassScore() == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"合格分数不可为空"));
                continue;
            }
            if(examRecordReqDTO.getExamIsPass() == null || ExamIsPass.get(examRecordReqDTO.getExamIsPass()) == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"是否通过考试状态不规范"));
                continue;
            }
            if(examRecordReqDTO.getExamNum() == null){
                errorDataRespDTOS.add(new ThErrorDataRespDTO(examRecordReqDTO.getUuid(),"考试次数不可为空"));
                continue;
            }
            List<ThExamRecord> examRecordSelectList = oldExamRecordList.stream().filter(e -> e.getUuid().equals(examRecordReqDTO.getUuid())).collect(Collectors.toList());
            if(examRecordSelectList.size() > 0){
                ThExamRecord thExamRecord = examRecordSelectList.get(0);
                BeanUtils.copyProperties(examRecordReqDTO,thExamRecord);
                thExamRecord.setUpdateTime(LocalDateTime.now());
                thExamRecord.setUpdateBy(institutionUser.getInstitutionalName());
                updateExamRecordList.add(thExamRecord);
            }else {
                //新增
                ThExamRecord thExamRecord = new ThExamRecord();
                BeanUtils.copyProperties(examRecordReqDTO,thExamRecord);
                thExamRecord.setInstitutionId(institutionUser.getId());
                thExamRecord.setInstitutionName(institutionUser.getInstitutionalName());
                thExamRecord.setCreateTime(LocalDateTime.now());
                thExamRecord.setUpdateTime(LocalDateTime.now());
                thExamRecord.setCreateBy(institutionUser.getInstitutionalName());
                thExamRecord.setUpdateBy(institutionUser.getInstitutionalName());
                thExamRecord.setDelFlag(DeleteStatusEnum.NO.getStatus());
                saveExamRecordList.add(thExamRecord);
            }
        }
        if(saveExamRecordList.size() > 0){
            examRecordService.saveBatch(saveExamRecordList);
        }
        if(updateExamRecordList.size() > 0){
            examRecordService.updateBatchById(updateExamRecordList);
        }
        return AjaxResult.success(errorDataRespDTOS);
    }
    @Transactional
    @Override
    public AjaxResult receiveCourseDelete(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThCourseDeleteReqDTO thCourseDeleteReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThCourseDeleteReqDTO>() {});
        if(StringUtils.isEmpty(thCourseDeleteReqDTO.getCourseUuid())){
            throw new BusinessException(ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        ThCourse thCourse = courseService.getByUuid(thCourseDeleteReqDTO.getCourseUuid());
        List<ThCourseChapterVO> thCourseChapterVOS = courseChapterService.listByCourseUuid(thCourseDeleteReqDTO.getCourseUuid());
        if(thCourse == null){
            throw new BusinessException(ResultConstants.COURSE_IS_NOT_EXIST);
        }
        boolean exsit = batchCourseService.isExsit(thCourseDeleteReqDTO.getCourseUuid());
        if(exsit){
            throw new BusinessException(ResultConstants.BATCH_COURSE_EXIST);
        }
        thCourse.setDelFlag(DeleteStatusEnum.YES.getStatus());
        thCourse.setUpdateTime(LocalDateTime.now());
        thCourse.setUpdateBy(institutionUser.getInstitutionalName());
        List<ThCourseChapter> thCourseChapters = thCourseChapterVOS.stream().map(cc -> {
            ThCourseChapter thCourseChapter = new ThCourseChapter();
            BeanUtils.copyProperties(cc, thCourseChapter);
            thCourseChapter.setUpdateTime(LocalDateTime.now());
            thCourseChapter.setUpdateBy(institutionUser.getInstitutionalName());
            thCourseChapter.setDelFlag(DeleteStatusEnum.YES.getStatus());
            return thCourseChapter;
        }).collect(Collectors.toList());
        //删除章节
        if(thCourseChapters.size() > 0){
            courseChapterService.updateBatchById(thCourseChapters);
        }
        return AjaxResult.success();
    }
    @Override
    public AjaxResult receiveBatchOpen(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThBatchOpenReqDTO thBatchOpenReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThBatchOpenReqDTO>() {});
        if(StringUtils.isEmpty(thBatchOpenReqDTO.getBatchUuid())){
            throw new BusinessException(this.getClass(),ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"批次(班级)不可为空");
        }
        ThBatch thBatch = batchService.getByUuid(thBatchOpenReqDTO.getBatchUuid());
        if(thBatch == null){
            throw new BusinessException(ResultConstants.BATCH_IS_NOT_EXIST);
        }
        thBatch.setOpenStatus(OpenStatus.YES.getStatus());
        thBatch.setUpdateTime(LocalDateTime.now());
        thBatch.setUpdateBy(institutionUser.getInstitutionalName());
        batchService.updateById(thBatch);
        return AjaxResult.success();
    }
    @Transactional
    @Override
    public AjaxResult receiveBarchEnd(JSONObject jsonObject) {
        InstitutionUser institutionUser = ThreeInContextHolder.getContext();
        String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        ThBatchEndReqDTO thBatchEndReqDTO = JSONObject.parseObject(decrypt, new TypeReference<ThBatchEndReqDTO>() {});
        if(StringUtils.isEmpty(thBatchEndReqDTO.getBatchUuid())){
            throw new BusinessException(this.getClass(),ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"批次(班级)不可为空");
        }
        if(StringUtils.isEmpty(thBatchEndReqDTO.getIdcard())){
            throw new BusinessException(this.getClass(),ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学生身份证不可为空");
        }
        List<ThStudentCourse> thStudentCourses = studentCourseService.getByIdcardAndBatchUuid(thBatchEndReqDTO.getIdcard(), thBatchEndReqDTO.getBatchUuid());
        if(CollectionUtils.isEmpty(thStudentCourses)){
            throw new BusinessException(ResultConstants.BATCH_STUDENT_IS_NOT_EXIST);
        }
        thStudentCourses.stream().forEach(sc -> {
            sc.setFinishStatus(FinishStatus.YES.getStatus());
        });
        studentCourseService.updateBatchById(thStudentCourses);
        return AjaxResult.success();
    }
    private void validateStudyDetail(ThStudyDetailReqDTO studentDetailReqDTO) {
        //获取该平台课程
        ThCourse course = courseService.getByUuid(studentDetailReqDTO.getCourseUuid());
        ThBatch batch = batchService.getByUuid(studentDetailReqDTO.getBatchUuid());
        ThCourseChapter chapter = courseChapterService.getByUuid(studentDetailReqDTO.getChapterUuid());
        if (studentDetailReqDTO == null) {
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学习记录清单不可为空");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getUuid()) || !UUID.checkIsUuid(studentDetailReqDTO.getUuid())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学习记录uuid不符合规范");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getIdcard())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"身份证不可为空");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getCourseUuid())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"课程不可为空");
        }
        if(course == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"课程不存在");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getBatchUuid())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"批次不可为空");
        }
        if(batch == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"批次不存在");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getChapterUuid())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节不可为空");
        }
        if(chapter == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节不存在");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getTrainOrgName())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"培训机构名称不可为空");
        }
        if(studentDetailReqDTO.getFinishStatus() == null || FinishStatus.get(studentDetailReqDTO.getFinishStatus()) == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"完成状态不规范");
        }
        if(studentDetailReqDTO.getDuration() == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学习时长(秒)不可为空");
        }
        if(studentDetailReqDTO.getStartTime() == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"开始时间不可为空");
        }
        if(studentDetailReqDTO.getFinishTime() == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"结束时间不可为空");
        }
        if(studentDetailReqDTO.getStartPosition() == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"开始位置不可为空");
        }
        if(studentDetailReqDTO.getFinishPosition() == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"结束位置不可为空");
        }
        if(StringUtils.isEmpty(studentDetailReqDTO.getLessonReportUrl())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学时报告不可为空");
        }
        //认证记录集合
        if(CollectionUtils.isEmpty(studentDetailReqDTO.getAuthList())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"认证记录集合不可为空");
        }
        studentDetailReqDTO.getAuthList().forEach(item -> {
           if(StringUtils.isEmpty(item.getUuid()) || !UUID.checkIsUuid(item.getUuid())){
               throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",认证记录uuid不符合规范");
           }
           if(StringUtils.isEmpty(item.getApprovePhoto())){
               throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",认证照片不可为空");
           }
           if(item.getAuthPosition() == null){
               throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",认证位置不可为空");
           }
           if(item.getAuthTime() == null){
               throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",认证时间不可为空");
           }
           if(item.getFaceType() == null || FaceType.get(item.getFaceType()) == null){
               throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",认证类型不规范");
           }
        });
        //学习轨迹集合
        if(CollectionUtils.isEmpty(studentDetailReqDTO.getTrackList())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学习轨迹集合不可为空");
        }
        studentDetailReqDTO.getTrackList().forEach(item -> {
            if(StringUtils.isEmpty(item.getUuid()) || !UUID.checkIsUuid(item.getUuid())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",认证记录uuid不符合规范");
            }
            if(item.getStartTime() == null){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",轨迹开始时间不可为空");
            }
            if(item.getEndTime() == null){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",轨迹结束时间不可为空");
            }
            if(item.getTimeInterval() == null) {
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,item.getUuid() + ",时间间隔(秒)不可为空");
            }
        });
    }
    /**
     * 校验班次信息
     * @param batchReqDTO
     */
    private void validateBatch(ThBatchReqDTO batchReqDTO) {
        if(StringUtils.isEmpty(batchReqDTO.getUuid()) || !UUID.checkIsUuid(batchReqDTO.getUuid())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"uuid不符合规范");
        }
        if(StringUtils.isEmpty(batchReqDTO.getBatchName())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"班次名称不可为空");
        }
        if(StringUtils.isEmpty(batchReqDTO.getTrainOrgName())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"培训机构名称不可为空");
        }
        if(batchReqDTO.getHaveExam() == null || HaveExam.get(batchReqDTO.getHaveExam()) == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"有无考试不规范");
        }
        if(batchReqDTO.getOpenStatus() == null || OpenStatus.get(batchReqDTO.getOpenStatus()) == null ){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"开班标识不符合规范");
        }
//        if(batchReqDTO.getDelFlag() == null || DeleteStatusEnum.getDeleteStatusEnum(batchReqDTO.getDelFlag()) == null ){
//            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"删除标识不符合规范");
//        }
        if(CollectionUtils.isEmpty(batchReqDTO.getCourseUuidList())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"关联课程不可为空");
        }
        List<ThCourse> courseList = courseService.selectByUuid(batchReqDTO.getCourseUuidList());
        if(courseList.size() != batchReqDTO.getCourseUuidList().size()){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"关联课程不存在,请先上报课程");
        }
    }
    /**
     * 校验学生信息
     * @param studentReqDTOS
     */
    private void validateStudent(List<ThStudentReqDTO> studentReqDTOS, Long institutionId) {
        if(CollectionUtils.isEmpty(studentReqDTOS)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"学生信息不可为空");
        }
        //获取所有该机构所有课程
        List<ThCourse> courseList = courseService.listByInstitutionId(institutionId);
        for (ThStudentReqDTO studentReqDTO : studentReqDTOS) {
            if(StringUtils.isEmpty(studentReqDTO.getIdcard())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"身份证不可为空");
            }
            if(StringUtils.isEmpty(studentReqDTO.getName())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"姓名不可为空");
            }
            if(StringUtils.isEmpty(studentReqDTO.getPhone())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"手机号不可为空");
            }
            if(studentReqDTO.getSex() == null || StudentSex.get(studentReqDTO.getSex()) == null){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"性别不可为空");
            }
            if(StringUtils.isEmpty(studentReqDTO.getAuthPhoto())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"实名认证照不可为空");
            }
            if (StringUtils.isEmpty(studentReqDTO.getTrainOrgName())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"培训机构名称不可为空");
            }
            /*if(CollectionUtils.isEmpty(studentReqDTO.getBatchUuids())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"关联课程uuidd不可为空");
            }*/
            /*for (String batchaUuid : studentReqDTO.getBatchUuids()) {
                List<ThCourse> collect = courseList.stream().filter(course -> course.getUuid().equals(courseReqDTO.getCourseUuid())).collect(Collectors.toList());
                if(CollectionUtils.isEmpty(collect)){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"课程uuid不存在,请先添加课程");
                }
            }*/
        }
    }
    /**
     * 校验课程
     * @param courseReqDTO
     */
    private void validateCourse(ThCourseReqDTO courseReqDTO) {
        if(courseReqDTO == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_ERROR);
        }
        if(StringUtils.isEmpty(courseReqDTO.getUuid()) || !UUID.checkIsUuid(courseReqDTO.getUuid())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"uuid不符合规范");
        }
        if(StringUtils.isEmpty(courseReqDTO.getCourseCode())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"课程标识不可为空");
        }
        if(StringUtils.isEmpty(courseReqDTO.getCourseName())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"课程名称不可为空");
        }
        if(StringUtils.isEmpty(courseReqDTO.getTrainOrgName())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"培训机构名称不可为空");
        }
        if(courseReqDTO.getLessonNum() == null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"总课时不可为空");
        }
       /* if(courseReqDTO.getDelFlag() == null || DeleteStatusEnum.getDeleteStatusEnum(courseReqDTO.getDelFlag()) == null ){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"删除标识不符合规范");
        }*/
        if(CollectionUtils.isEmpty(courseReqDTO.getChapters())){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"课程大纲(大章)不可为空");
        }
        for (ThCourseChapterReqDTO chapter : courseReqDTO.getChapters()) {
            if(StringUtils.isEmpty(chapter.getChapterCode())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(大章)标识不可为空");
            }
            if(StringUtils.isEmpty(chapter.getChapterName())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(大章)名称不可为空");
            }
            /*if(chapter.getDelFlag() == null || DeleteStatusEnum.getDeleteStatusEnum(chapter.getDelFlag()) == null ){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(大章)删除标识不符合规范");
            }
            if (chapter.getLessonNum() == null){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(大章)课时(保留1位小数)不可为空");
            }*/
            if(chapter.getHaveResource() == null || CourseHaveResourse.get(chapter.getHaveResource()) == null){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"是否有资源不符合规范");
            }
            if(CollectionUtils.isEmpty(chapter.getChildren())){
                throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(小节)列表不可为空");
            }
            for (ThCourseChapterReqDTO child : chapter.getChildren()) {
                if(StringUtils.isEmpty(child.getChapterCode())){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(小节)标识不可为空");
                }
                if(StringUtils.isEmpty(child.getChapterName())){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(小节)名称不可为空");
                }
                if(child.getDuration() == null){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(小节)视频时长(秒)不可为空");
                }
                if (child.getLessonNum() == null){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(小节)课时(保留1位小数)不可为空");
                }
                if(child.getResourceType() == null || CourseResourceType.get(child.getResourceType()) == null){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"资源类型不规范");
                }
                /*if(child.getDelFlag() == null || DeleteStatusEnum.getDeleteStatusEnum(child.getDelFlag()) == null ){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"章节(小节)删除标识不符合规范");
                }*/
                if(child.getHaveResource() == null || CourseHaveResourse.get(child.getHaveResource()) == null){
                    throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"是否有资源不符合规范");
                }
            }
        }
    }
    /**
     * 校验题库组卷数据
     * @param questionBankReqDTO
     */
     private void validateQuestion(ThQuestionBankReqDTO questionBankReqDTO){
         if(questionBankReqDTO == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_ERROR);
         }
         if(StringUtils.isEmpty(questionBankReqDTO.getUuid()) || !UUID.checkIsUuid(questionBankReqDTO.getUuid())){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"题库组卷uuid不符合规范");
         }
         if(StringUtils.isEmpty(questionBankReqDTO.getUrl())){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"题库组卷预览路径不可为空");
         }
         if(questionBankReqDTO.getLastMonthCount() == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"上月题库总题目数不可为空");
         }
         if(questionBankReqDTO.getAddCount() == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"新增题目数不可为空");
         }
         if(questionBankReqDTO.getReduceCount() == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"减少题目数不可为空");
         }
         if(questionBankReqDTO.getBrushRate() == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"刷题应用率不可为空");
         }
         if(questionBankReqDTO.getAssemblyRate() == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"组卷应用率不可为空");
         }
         if(questionBankReqDTO.getMonth() == null){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"年月不可为空");
         }
        /* if(questionBankReqDTO.getDelFlag() == null || DeleteStatusEnum.getDeleteStatusEnum(questionBankReqDTO.getDelFlag()) == null ){
             throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"删除标识不符合规范");
         }*/
    }
    private String generateSerialNum() {
        Long count = studyDetailService.getCount();
        String strCount = count.toString();
        while (strCount.length() < 5){
            strCount = "0" + strCount;
        }
        return strCount;
    }
}
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/utils/ConvertTimeUtils.java
对比新文件
@@ -0,0 +1,38 @@
package com.gkhy.exam.institutionalaccess.utils;
public class ConvertTimeUtils {
    //1分钟
    private static final Long MINUTE = 60l;
    //1小时
    private static final Long HOUR = 60l * MINUTE;
    //一天
    private static final Long DAY = 24l * HOUR;
    /**
     *
     * @param time (秒)
     * @return
     */
    public static String convertTimeToString(Long time) {
        if(time < MINUTE){
            //小于1分钟
            return String.format("%02d", time) + "秒";
        }else if (time < HOUR){
            //小于1小时
            Long m = time / MINUTE;
            Long s = time % MINUTE;
            return String.format("%02d", m) + "分" + String.format("%02d", s) + "秒";
        }else {
            //大于1小时
            Long h = time / HOUR;
            Long m = time % HOUR/MINUTE;
            Long s = time % HOUR % MINUTE;
            return String.format("%02d", h) + "时" + String.format("%02d", m) + "分" + String.format("%02d", s) + "秒";
        }
    }
    public static void main(String[] args) {
        Long time = 3601l;
        System.out.println(convertTimeToString(time));
    }
}
exam-system/src/main/resources/mapper/institutionaccess/ThBatchCourseMapper.xml
对比新文件
@@ -0,0 +1,41 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThBatchCourseMapper">
    <update id="deleteByBatchUuidAndCourseUuid" parameterType="java.util.List" >
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE batch_course
            <set>
                <if test="item.delFlag != null" >
                    del_flag = #{item.delFlag}
                </if>
            </set>
            where batch_uuid = #{item.batchUuid}
            and course_uuid = #{item.courseUuid}
        </foreach>
    </update>
    <select id="getListByBatchUuids" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThBatchCourseVO">
        select bc.*,c.course_name from th_batch_course bc
        left join th_course c on c.uuid = bc.course_uuid
        where bc.del_flag = 0
        and bc.batch_uuid in
        <foreach collection="batchUuids" item="batchUuid" open="(" close=")" separator=",">
            #{batchUuid}
        </foreach>
    </select>
    <select id="getListByBatchUuid" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThBatchCourseVO">
        SELECT
            bc.*,
            c.course_name ,
            (SELECT sum(cc.duration) from th_course_chapter cc where cc.course_uuid = bc.course_uuid) duration
        FROM
            th_batch_course bc
            LEFT JOIN th_course c ON c.uuid = bc.course_uuid
        WHERE
            bc.del_flag = 0
          AND bc.batch_uuid = #{batchUuid}
    </select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThBatchMapper.xml
对比新文件
@@ -0,0 +1,22 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThBatchMapper">
    <select id="listByPage" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThBatchVO">
        select * from th_batch where del_flag = 0
        <if test="query.institutionId != null">
            and institution_id = #{query.institutionId}
        </if>
        <if test="query.batchName != null and query.batchName != ''">
            and batch_name like concat('%', #{query.batchaName}, '%')
        </if>
        <if test="query.startTime != null"><!-- 开始时间检索 -->
            and date_format(d.create_time,'%y-%m-%d') &gt;= date_format(#{query.startTime},'%y-%m-%d')
        </if>
        <if test="query.endTime != null"><!-- 结束时间检索 -->
            and date_format(d.create_time,'%y-%m-%d') &lt;= date_format(#{query.endTime},'%y-%m-%d')
        </if>
    </select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThCourseChapterMapper.xml
对比新文件
@@ -0,0 +1,42 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThCourseChapterMapper">
    <select id="listByCourseUuids" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO">
        select cc.id,
               cc.uuid,
               cc.chapter_code,
               cc.chapter_name,
               cc.lesson_num,
               cc.duration,
               cc.institution_id,
               cc.resource_type,
               cc.have_resource,
               cc.course_uuid,
               cc.parent_uuid,
               cc.url
               from th_course_chapter cc
               where cc.del_flag = 0 and cc.course_uuid in
        <foreach collection="courseUuids" item="courseUuid"  open="(" close=")" separator=",">
            #{courseUuid}
        </foreach>
    </select>
    <select id="listByCourseUuid" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO">
        select cc.id,
        cc.uuid,
        cc.chapter_code,
        cc.chapter_name,
        cc.lesson_num,
        cc.duration,
        cc.institution_id,
        cc.resource_type,
        cc.have_resource,
        cc.course_uuid,
        cc.parent_uuid,
        cc.url
        from th_course_chapter cc
        where  cc.del_flag = 0 and cc.course_uuid = #{courseUuid}
    </select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThCourseMapper.xml
对比新文件
@@ -0,0 +1,13 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThCourseMapper">
    <select id="listByPage" resultType="com.gkhy.exam.institutionalaccess.entity.ThCourse">
        select c.* from th_course c where c.del_flag = 0
        <if test="query.institutionId != null">
            and c.institution_id = #{query.institutionId}
        </if>
        order by c.create_time desc
    </select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThExamRecordMapper.xml
对比新文件
@@ -0,0 +1,32 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThExamRecordMapper">
<select id="listByPage" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThExamRecordVO">
    SELECT
        e.*,
        s.`name`,
        c.course_name,
        b.batch_name
    FROM
        th_exam_record e
            LEFT JOIN th_student s ON s.idcard = e.idcard
            LEFT JOIN th_course c ON c.uuid = e.course_uuid
            LEFT JOIN th_batch b ON b.uuid = e.batch_uuid
    WHERE e.del_flag = 0
    <if test="query.idcard != null and query.idcard != ''">
        and e.idcard = #{query.idcard}
    </if>
    <if test="query.name != null and query.name != ''">
        and s.name like concat('%', #{query.name}, '%')
    </if>
    <if test="query.startTime != null"><!-- 开始时间检索 -->
        and date_format(e.exam_start_time,'%y-%m-%d') &gt;= date_format(#{query.startTime},'%y-%m-%d')
    </if>
    <if test="query.endTime != null"><!-- 结束时间检索 -->
        and date_format(e.exam_start_time,'%y-%m-%d') &lt;= date_format(#{query.endTime},'%y-%m-%d')
    </if>
    order by e.create_time desc
</select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThQuestionBankMapper.xml
对比新文件
@@ -0,0 +1,8 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThQuestionBankMapper">
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThStudentCourseMapper.xml
对比新文件
@@ -0,0 +1,47 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThStudentCourseMapper">
   <select id="statisticByCourseUuid" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO">
       select course_uuid, count(id) as count from th_student_course where del_flag = 0 group by course_uuid
   </select>
    <select id="statisticByBatchUuid" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThStatisticStudentVO">
        SELECT
            sc.batch_uuid,
            count( sc.id ) AS count
        FROM
            ( SELECT DISTINCT id, create_by, course_uuid, create_time, batch_uuid, del_flag FROM th_student_course ) sc
        GROUP BY
            sc.batch_uuid
    </select>
    <select id="getListByBatchUuid" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThStudentCourseVO">
        SELECT
            sc.idcard,
            sc.course_uuid,
            sc.batch_uuid,
            sc.NAME,
            sc.finish_status,
            c.course_name,
            ((
                SELECT
                    sum( cc.lesson_num )
                FROM
                    th_course_chapter cc
                WHERE
                    cc.course_uuid = sc.course_uuid
            )) less_total
        FROM
            th_student_course sc
                LEFT JOIN th_course c ON c.uuid = sc.course_uuid
        WHERE
            sc.del_flag = 0
          AND sc.batch_uuid = #{batchUuid}
    </select>
    <update id="updateByBatchUuid">
        update th_student_course set finish_status = 1 where batch_uuid = #{batchUuid}
    </update>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThStudentMapper.xml
对比新文件
@@ -0,0 +1,52 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThStudentMapper">
    <update id="updateByIdcard" parameterType="java.util.List" >
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE th_student
            <set>
                <if test="item.name != null and item.name != ''" >
                    name = #{item.name},
                </if>
                <if test="item.idcard != null and item.idcard != ''" >
                    idcard = #{item.idcard},
                </if>
                <if test="item.sex != null" >
                    sex = #{item.sex},
                </if>
                <if test="item.phone != null and item.phone != ''" >
                    phone = #{item.phone},
                </if>
                <if test="item.authPhoto != null and item.authPhoto != ''" >
                    auth_photo = #{item.authPhoto},
                </if>
                <if test="item.trainOrgName != null and item.trainOrgName != ''" >
                    train_org_name = #{item.trainOrgName},
                </if>
                <if test="item.institutionId != null" >
                    institution_id = #{item.institutionId},
                </if>
                <if test="item.institutionName != null and item.institutionName != ''" >
                    institution_name = #{item.phone},
                </if>
                <if test="item.industry != null and item.industry != ''" >
                    industry = #{item.industry},
                </if>
                <if test="item.occupation != null and item.occupation != ''" >
                    occupation = #{item.occupation},
                </if>
                <if test="item.updateBy != null and item.updateBy != ''" >
                    update_by = #{item.updateBy},
                </if>
                <if test="item.updateTime != null" >
                    update_time = #{item.updateTime}
                </if>
            </set>
            where idcard = #{item.idcard}
        </foreach>
    </update>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThStudyAuthMapper.xml
对比新文件
@@ -0,0 +1,9 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThStudyAuthMapper">
    <select id="getUuidByStudyDetaiId" resultType="java.lang.String">
        select uuid from th_study_auth where study_detail_uuid = #{studyDetaiId}
    </select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThStudyDetailMapper.xml
对比新文件
@@ -0,0 +1,62 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThStudyDetailMapper">
    <select id="listByPage" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO">
        SELECT
            d.*,
            s.name,
            b.batch_name,
            c.course_name,
            cc.chapter_name
        FROM
            th_study_detail d
                LEFT JOIN th_student s ON s.idcard = d.idcard
                LEFT JOIN th_batch b ON b.uuid = d.batch_uuid
                LEFT JOIN th_course c ON c.uuid = d.course_uuid
                LEFT JOIN th_course_chapter cc ON cc.uuid = d.chapter_uuid
        where d.del_flag = 0
        <if test="query.idcard != null and query.idcard != ''">
            and d.idcard = #{query.idcard}
        </if>
        <if test="query.courseUuid != null and query.courseUuid != ''">
            and d.course_uuid = #{query.courseUuid}
        </if>
        <if test="query.name != null and query.name != ''">
            and s.name like concat('%', #{query.name}, '%')
        </if>
        <if test="query.startTime != null"><!-- 开始时间检索 -->
            and date_format(d.create_time,'%y-%m-%d') &gt;= date_format(#{query.startTime},'%y-%m-%d')
        </if>
        <if test="query.endTime != null"><!-- 结束时间检索 -->
            and date_format(d.create_time,'%y-%m-%d') &lt;= date_format(#{query.endTime},'%y-%m-%d')
        </if>
        order by d.create_time desc
    </select>
    <select id="statisticDurationByIdcard" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThStudyVO">
        SELECT
            d.idcard,
            sum( d.duration ) duration
        FROM
            th_study_detail d
        WHERE
            d.del_flag = 0
          AND d.batch_uuid = #{batchUuid}
        GROUP BY
            d.idcard
    </select>
    <select id="listByBatchUuid" resultType="com.gkhy.exam.institutionalaccess.model.vo.ThStudyDetailVO">
        SELECT
            d.*,
            cc.chapter_name,
            cc.lesson_num
        FROM
            th_study_detail d
                LEFT JOIN th_course_chapter cc ON cc.uuid = d.chapter_uuid
        where d.del_flag = 0
          AND d.batch_uuid = #{batchUuid}
    </select>
</mapper>
exam-system/src/main/resources/mapper/institutionaccess/ThStudyTrackMapper.xml
对比新文件
@@ -0,0 +1,9 @@
<?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.gkhy.exam.institutionalaccess.mapper.ThStudyTrackMapper">
<select id="getUuidByStudyDetaiId" resultType="java.lang.String">
    select uuid from th_study_track where study_detail_uuid = #{studyDetaiId}
</select>
</mapper>
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ThreeAccessController.java
对比新文件
@@ -0,0 +1,36 @@
package com.ruoyi.web.controller.system;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.signature.AESUtils;
import com.ruoyi.framework.web.domain.threeAccess.req.AccessReqDTO;
import com.ruoyi.framework.web.service.ThreeInstitutionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ThreeAccessController extends BaseController {
    @Autowired
    private ThreeInstitutionService threeInstitutionService;
    @PostMapping("/gov-server/token")
    public AjaxResult getToken(@RequestBody JSONObject jsonObject){
        return ok(threeInstitutionService.getToken(jsonObject));
    }
    public static void main(String[] args) {
        AccessReqDTO accessReqDTO = new AccessReqDTO();
        accessReqDTO.setAccessKey("Opq98lRKQ0NbBR59Ddi0");
        accessReqDTO.setSecretKey("AKKYCSZCYGCxCmxR7bsO");
        String jsonString = JSONObject.toJSONString(accessReqDTO);
        String encrypt = AESUtils.encrypt(jsonString);
        System.out.println(encrypt);
        String decrypt = AESUtils.decrypt("ASg/NElcGyKiKSUu334t5DXcYjgpxb11mFr5YSf6sHICkQCrZ++NSQ55ZoMw1p+hKgFiuNEPXsDLp2lOtR52zDGaFLFKSQIqEgSJ7IL6YBCExaF3fQSqIFZFX62KygHb");
        System.out.println(decrypt);
    }
}
ruoyi-admin/src/main/resources/application.yml
@@ -36,7 +36,7 @@
    # 国际化资源文件路径
    basename: i18n/messages
  profiles:
    active: dev
    active: pro
  # 文件上传
  servlet:
    multipart:
@@ -57,6 +57,14 @@
  secret: abcdefghijklmnopqrstuvwxyz
  # 令牌有效期(默认30分钟)
  expireTime: 30
threeToken:
  # 令牌自定义标识
  header: accessToken
  # 令牌密钥
  secret: Q5mn+yLZHyI7gp=+ffbPgjq2UL
  # 令牌有效期(默认7天)
  expireTime: 7
# MyBatis-plus配置
mybatis-plus:
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
@@ -12,6 +12,8 @@
     */
    public static final String LOGIN_TOKEN_KEY = "swspkmas:login_tokens:";
    public static final String THREE_INSTITUTION_TOKEN_KEY = "swspkmas:three_institution_tokens:";
    /**
     * 验证码 redis key
     */
@@ -50,4 +52,9 @@
     * 登录账户密码错误次数 redis key
     */
    public static final String PWD_ERR_CNT_KEY = "swspkmas:pwd_err_cnt:";
    /**
     * 七天内访问请求token次数
     */
    public static final String THREE_TOKEN_CNT_KEY = "swspkmas:three_token_cnt:";
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -85,6 +85,10 @@
    public static final String LOGIN_USER_KEY = "login_user_key";
    /**
     * 三方令牌前缀
     */
    public static final String INSTITUTION_USER_KEY = "three_institution_user_key";
    /**
     * 用户ID
     */
    public static final String JWT_USERID = "userid";
ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java
@@ -45,6 +45,24 @@
    FILE_UPLOAD_FAIL(603,"文件上传失败"),
    FILE_DOWNLOAD_FAIL(604,"文件下载失败"),
    FILE_DOWNLOAD_EXPERTION(605,"文件下载异常"),
    //三方对接
    THREE_INSTITUTION_PARAMM_NULL(1000,"参数为空或格式不合规"),
    THREE_INSTITUTION_PARAMM_ERROR(1001,"参数结构错误"),
    ACCESSkEY_ERROR_NULL(1002,"accessKey不能为空"),
    SECRETKEY_ERROR_NULL(1003,"sercetKey不能为空"),
    ACCESSkEY_INVALID(1004,"accessKey不存在"),
    SERIALIZE_ERROR(1005,"反序列化异常"),
    INSTITUTION_AUTHENTICATION(1006,"培训平台鉴权失败"),
    ACCESS_TOKEN_OVERDUE(1007,"accessToken过期"),
    ACCESS_TOKEN_LOSE(1008,"accessToken丢失"),
    COURSE_IS_EXIST(1009,"课程已存在"),
    COURSE_IS_NOT_EXIST(1010,"课程不存在"),
    BATCH_COURSE_EXIST(1011,"批次(班级)已关联,不可删除"),
    BATCH_IS_NOT_EXIST(1012,"批次(班级)不存在"),
    BATCH_IS_NOT_OPEN(1013,"批次(班级)未开班,不可结束培训"),
    BATCH_STUDENT_IS_NOT_EXIST(1014,"该学生培训信息不存在"),
    ;
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
@@ -113,6 +113,13 @@
    {
        return AjaxResult.success(message);
    }
    /**
     * 返回成功消息
     */
    public AjaxResult ok(Object data)
    {
        return AjaxResult.success(data);
    }
    
    /**
     * 返回成功消息
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java
@@ -3,6 +3,7 @@
import java.util.HashMap;
import java.util.Objects;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.utils.StringUtils;
/**
@@ -170,6 +171,11 @@
        return new AjaxResult(code, msg, null);
    }
    public static AjaxResult error(ResultConstants resultConstants)
    {
        return new AjaxResult(resultConstants.getCode(), resultConstants.getDesc(), null);
    }
    /**
     * 是否为成功消息
     *
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/InstitutionUser.java
对比新文件
@@ -0,0 +1,48 @@
package com.ruoyi.common.core.domain.model;
import lombok.Data;
import java.util.Map;
@Data
public class InstitutionUser {
    private Long id;
    //编号
    private Long institutionCode;
    //机构名称
    private String institutionalName;
    //key
    private String accessKey;
    //密钥
    private String secretKey;
    //联系人电话
    private String phone;
    //联系人
    private String contacts;
    //过期时间
    private Long expireTime;
    private String token;
    /**
     * 请求IP地址
     */
    private String ipaddr;
    /**
     * 访问地点
     */
    private String location;
    /**
     * 浏览器类型
     */
    private String browser;
    /**
     * 操作系统
     */
    private String os;
}
ruoyi-common/src/main/java/com/ruoyi/common/enums/InstitutionStatus.java
对比新文件
@@ -0,0 +1,32 @@
package com.ruoyi.common.enums;
public enum InstitutionStatus {
    YES((byte)0,"启用"),
    NO((byte)1,"禁止"),
    ;
    private Byte status;
    private String desc;
    InstitutionStatus(Byte status, String desc) {
        this.status = status;
        this.desc = desc;
    }
    public Byte getStatus() {
        return status;
    }
    public void setStatus(Byte status) {
        this.status = status;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/enums/coalmineEnums/DeleteStatusEnum.java
@@ -29,4 +29,13 @@
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static DeleteStatusEnum getDeleteStatusEnum(Byte status) {
        for (DeleteStatusEnum deleteStatusEnum : DeleteStatusEnum.values()) {
            if (deleteStatusEnum.getStatus() == status) {
                return deleteStatusEnum;
            }
        }
        return null;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/exception/BusinessException.java
@@ -10,11 +10,11 @@
    private String message;
//    public BusinessException(ResultCode error) {
//        super(error.getDesc());
//        this.code = error.getCode();
//        this.message = error.getDesc();
//    }
    public BusinessException(ResultConstants error) {
        super(error.getDesc());
        this.code = error.getCode();
        this.message = error.getDesc();
    }
    public BusinessException(Class causeClass, ResultConstants error) {
        super(error.getDesc());
ruoyi-common/src/main/java/com/ruoyi/common/signature/AESUtils.java
对比新文件
@@ -0,0 +1,94 @@
package com.ruoyi.common.signature;
import com.ruoyi.common.constant.Constants;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtils {
    private static final String key="Bd26jqDDJcdnBocn";
    private static final String iv ="oVKRQCjElggSbd8D";
    /**
     * @Description AES算法加密明文
     * @param data 明文
     * @param key 密钥,长度16
     * @param iv 偏移量,长度16
     * @return 密文
     */
    public static String encrypt(String data){
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            int blockSize = cipher.getBlockSize();
            byte[] dataBytes = data.getBytes(Constants.UTF8);
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }
            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());  // CBC模式,需要一个向量iv,可增加加密算法的强度
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);
            // BASE64做转码。
            String aseEncode = Base64.getEncoder().encodeToString(encrypted);
            return aseEncode.trim();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }
    /**
     * @Description AES算法解密密文
     * @param data 密文
     * @param key 密钥,长度16
     * @param iv 偏移量,长度16
     * @return 明文
     */
    public static String decrypt(String data){
        try
        {
            byte[] encryptCode = Base64.getDecoder().decode(data);//先用base64解密
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
            byte[] original = cipher.doFinal(encryptCode);
            String originalString = new String(original);
            return originalString.trim();
        }
        catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }
    public static void main(String[] args) throws Exception {
        String key="Bd26jqDDJcdnBocn";
        String iv ="oVKRQCjElggSbd8D";
       /* System.out.println("****************************************");
        String encode = AESUtils.encrypt("测试", key, iv);
        System.out.println(encode);
        System.out.println("****************************************");
        String decode = AESUtils.decrypt(encode, key, iv);
        System.out.println(decode);
        System.out.println("****************************************");*/
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java
文件已删除
ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature11.java
文件已删除
ruoyi-common/src/main/java/com/ruoyi/common/utils/RandomUtil.java
对比新文件
@@ -0,0 +1,40 @@
package com.ruoyi.common.utils;
import java.util.Random;
public class RandomUtil {
    /**
     * 字符串池
     */
    private static String[] STR_ARR = new String[] { "a", "b", "c", "d", "e",
            "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
            "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E",
            "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "0" };
    /**
     *
     * 根据指定的长度生成的含有大小写字母及数字的字符串
     *
     * @param length
     *            指定的长度
     * @return 按照指定的长度生成的含有大小写字母及数字的字符串
     */
    public static String generateRandomString(int length) {
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(STR_ARR[rand.nextInt(STR_ARR.length)]);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String s = generateRandomString(26);
        System.out.println(s);
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java
@@ -481,4 +481,21 @@
    {
        return ThreadLocalRandom.current();
    }
    /**
     * 检查字符串是否是合法的uuid,
     *
     * @param uuidStr
     * @return 是返回true,不是返回false
     */
    public static boolean checkIsUuid(String uuidStr) {
        try {
            UUID.fromString(uuidStr).toString();
        } catch (Exception e) {
            //e.printStackTrace();
            return false;
        }
        return true;
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -2,6 +2,8 @@
import java.io.File;
import java.util.concurrent.TimeUnit;
import com.ruoyi.framework.interceptor.ThreeInstitutionInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
@@ -31,6 +33,9 @@
    @Autowired
    private RepeatSubmitInterceptor repeatSubmitInterceptor;
    @Autowired
    private ThreeInstitutionInterceptor threeInstitutionInterceptor;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
@@ -56,6 +61,7 @@
    public void addInterceptors(InterceptorRegistry registry)
    {
        registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
        registry.addInterceptor(threeInstitutionInterceptor).addPathPatterns("/gov-server/receive/**");
    }
    /**
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@
                // 过滤请求
                .authorizeRequests()
                // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                .antMatchers("/login","/login/move", "/register", "/captchaImage","/uploadfile/**").permitAll()
                .antMatchers("/login","/login/move", "/register", "/captchaImage","/uploadfile/**","/gov-server/**").permitAll()
                // 静态资源,可匿名访问
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/ThreeInstitutionInterceptor.java
对比新文件
@@ -0,0 +1,71 @@
package com.ruoyi.framework.interceptor;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.InstitutionUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.security.context.ThreeInContextHolder;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * 自定义三方对接数据校验
 */
@Component
public class ThreeInstitutionInterceptor implements HandlerInterceptor {
    @Autowired
    private TokenService tokenService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
        InstitutionUser institutionUser = tokenService.getThreeInUser(request);
        if (StringUtils.isNotNull(institutionUser))
        {
            tokenService.verifyThreeInToken(institutionUser);
            ThreeInContextHolder.setContext(institutionUser);
        }else {
            toJson(response,ResultConstants.ACCESS_TOKEN_OVERDUE.getCode(),ResultConstants.ACCESS_TOKEN_OVERDUE.getDesc());
            return false;
        }
        return true;
    }
    private void toJson(HttpServletResponse response,int code, String msg) throws IOException {
        AjaxResult result = AjaxResult.error(code, msg);
        // 设置编码格式
        response.setContentType("text/json;charset=utf-8");
        // 处理跨域问题
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS");
        PrintWriter out = response.getWriter();
        out.write(JSON.toJSONString(result));
        out.flush();
        out.close();
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清除threadLocal
        ThreeInContextHolder.clearContext();
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/ThreeInContextHolder.java
对比新文件
@@ -0,0 +1,26 @@
package com.ruoyi.framework.security.context;
import com.ruoyi.common.core.domain.model.InstitutionUser;
/**
 * 三方身份信息
 */
public class ThreeInContextHolder {
    private static final ThreadLocal<InstitutionUser> contextHolder = new ThreadLocal<>();
    public static InstitutionUser getContext()
    {
        return contextHolder.get();
    }
    public static void setContext(InstitutionUser context)
    {
        contextHolder.set(context);
    }
    public static void clearContext()
    {
        contextHolder.remove();
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/threeAccess/req/AccessReqDTO.java
对比新文件
@@ -0,0 +1,11 @@
package com.ruoyi.framework.web.domain.threeAccess.req;
import lombok.Data;
@Data
public class AccessReqDTO {
    //key
    private String accessKey;
    //密钥
    private String secretKey;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/threeAccess/resp/AccessRespDTO.java
对比新文件
@@ -0,0 +1,10 @@
package com.ruoyi.framework.web.domain.threeAccess.resp;
import lombok.Data;
@Data
public class AccessRespDTO {
    private String accessToken;
    private Long expireTime;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
@@ -10,6 +10,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
@@ -40,6 +41,16 @@
    @Autowired
    private ObjectMapper objectMapper;
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public AjaxResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e, HttpServletRequest request)
    {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',参数异常'{}'", requestURI, e.getMessage());
        return AjaxResult.error(ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
    }
    /**
     * 通用异常
     */
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -3,6 +3,7 @@
import javax.annotation.Resource;
import com.ruoyi.framework.web.domain.login.LoginVo;
import com.ruoyi.system.service.InstitutionalManagerService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
@@ -54,6 +55,7 @@
    @Autowired
    private ISysConfigService configService;
    /**
     * 登录验证
@@ -220,4 +222,5 @@
        loginVo.setToken(tokenService.createToken(loginUser));
        return loginVo;
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/ThreeInstitutionService.java
对比新文件
@@ -0,0 +1,85 @@
package com.ruoyi.framework.web.service;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.core.domain.model.InstitutionUser;
import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.signature.AESUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.framework.web.domain.threeAccess.req.AccessReqDTO;
import com.ruoyi.framework.web.domain.threeAccess.resp.AccessRespDTO;
import com.ruoyi.system.domain.InstitutionalManager;
import com.ruoyi.system.service.InstitutionalManagerService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class ThreeInstitutionService{
    @Autowired
    private InstitutionalManagerService managerService;
    @Autowired
    private TokenService tokenService;
    public String getToken(JSONObject jsonObject){
         String data = jsonObject.getString("data");
        if(StringUtils.isEmpty(data)){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //解密
        String decrypt = "";
        try {
            decrypt = AESUtils.decrypt(data);
        }catch (Exception e){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
        }
        //反序列化
        AccessReqDTO accessReqDTO = JSONObject.parseObject(decrypt, AccessReqDTO.class);
        if(accessReqDTO==null){
            throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_ERROR);
        }
        if (StringUtils.isEmpty(accessReqDTO.getAccessKey())){
            throw new BusinessException(this.getClass(), ResultConstants.ACCESSkEY_ERROR_NULL);
        }
        if (StringUtils.isEmpty(accessReqDTO.getSecretKey())){
            throw new BusinessException(this.getClass(), ResultConstants.SECRETKEY_ERROR_NULL);
        }
        InstitutionalManager institutional = managerService.getInstitutionalByAccessKey(accessReqDTO.getAccessKey());
        if(institutional==null){
            throw new BusinessException(this.getClass(), ResultConstants.ACCESSkEY_INVALID);
        }
        //简单校验
        if(!institutional.getSecretKey().equals(accessReqDTO.getSecretKey())){
            throw new BusinessException(this.getClass(), ResultConstants.INSTITUTION_AUTHENTICATION);
        }
        //封装数据
        InstitutionUser institutionUser = new InstitutionUser();
        BeanUtils.copyProperties(institutional,institutionUser);
        String threeInToken = tokenService.createThreeInToken(institutionUser);
        //封装
        AccessRespDTO accessRespDTO = new AccessRespDTO();
        accessRespDTO.setExpireTime(institutionUser.getExpireTime());
        accessRespDTO.setAccessToken(threeInToken);
        String jsonString = JSONObject.toJSONString(accessRespDTO);
        //加密
        String encrypt = AESUtils.encrypt(jsonString);
        //记录访问请求token时间以及地址
        recordInstitution(institutional.getId());
        return encrypt;
    }
    private void recordInstitution(Long institutionId) {
        InstitutionalManager institutionalManager = new InstitutionalManager();
        institutionalManager.setId(institutionId);
        institutionalManager.setAccessIp(IpUtils.getIpAddr());
        institutionalManager.setAccessTime(LocalDateTime.now());
        managerService.updateById(institutionalManager);
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -4,6 +4,11 @@
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.core.domain.model.InstitutionUser;
import com.ruoyi.common.exception.BusinessException;
import io.swagger.models.auth.In;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -45,11 +50,31 @@
    @Value("${token.expireTime}")
    private int expireTime;
    //三方头自定义标识
    @Value("${threeToken.header}")
    private String threeInHeader;
    //三方密钥
    @Value("${threeToken.secret}")
    private String threeInsecret;
    //三方token过期时间
    @Value("${threeToken.expireTime}")
    private int threeInExpireTime;
    protected static final long MILLIS_SECOND = 1000;
    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
    protected static final long MILLIS_HOUR = 60 * MILLIS_MINUTE;
    protected static final long MILLIS_DAY = 24 * MILLIS_HOUR;
    private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
    @Autowired
    private RedisCache redisCache;
@@ -82,6 +107,7 @@
        return null;
    }
    /**
     * 设置用户身份信息
     */
@@ -92,6 +118,8 @@
            refreshToken(loginUser);
        }
    }
    /**
     * 删除用户身份信息
@@ -152,6 +180,8 @@
        String userKey = getTokenKey(loginUser.getToken());
        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
    }
    /**
     * 设置用户代理信息
@@ -228,4 +258,114 @@
    {
        return CacheConstants.LOGIN_TOKEN_KEY + uuid;
    }
    /**
     * 三方机构校验tokenKey
     * @param uuid
     * @return
     */
    private String getThreeInTokenKey(String uuid){
        return CacheConstants.THREE_INSTITUTION_TOKEN_KEY + uuid;
    }
    /**
     * 获取三方用户身份信息
     *
     * @return 用户信息
     */
    public InstitutionUser getThreeInUser(HttpServletRequest request)
    {
        // 获取请求携带的令牌
        String token = request.getHeader(threeInHeader);
        if (StringUtils.isNotEmpty(token))
        {
            try
            {
                // 解析对应的权限以及用户信息
                String userKey = getThreeInTokenKey(token);
                InstitutionUser institutionUser = redisCache.getCacheObject(userKey);
                return institutionUser;
            }
            catch (Exception e)
            {
                log.error("获取三方用户信息异常'{}'", e.getMessage());
            }
        } else {
            throw new BusinessException(ResultConstants.ACCESS_TOKEN_LOSE);
        }
        return null;
    }
    /**
     * 设置三方用户身份信息
     */
    public void setInstitutionUser(InstitutionUser institutionUser)
    {
        if (StringUtils.isNotNull(institutionUser) && StringUtils.isNotEmpty(institutionUser.getToken()))
        {
            refreshThreeInToken(institutionUser);
        }
    }
    /**
     * 刷新三方令牌有效期
     *
     * @param institutionUser 验证信息
     */
    public void refreshThreeInToken(InstitutionUser institutionUser)
    {
        // 根据uuid将机构缓存
        String userKey = getThreeInTokenKey(institutionUser.getToken());
        institutionUser.setExpireTime(System.currentTimeMillis() + threeInExpireTime * MILLIS_DAY);
        redisCache.setCacheObject(userKey, institutionUser, threeInExpireTime, TimeUnit.DAYS);
    }
    /**
     * 创建三方机构令牌
     *
     * @param institutionUser 用户信息
     * @return 令牌
     */
    public String createThreeInToken(InstitutionUser institutionUser)
    {
        String token = IdUtils.fastUUID();
        institutionUser.setToken(token);
        setThreeInAgent(institutionUser);
        refreshThreeInToken(institutionUser);
        return token;
    }
    /**
     * 设置用户代理信息
     *
     * @param institutionUser 登录信息
     */
    public void setThreeInAgent(InstitutionUser institutionUser)
    {
        UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
        String ip = IpUtils.getIpAddr();
        institutionUser.setIpaddr(ip);
        institutionUser.setLocation(AddressUtils.getRealAddressByIP(ip));
        institutionUser.setBrowser(userAgent.getBrowser().getName());
        institutionUser.setOs(userAgent.getOperatingSystem().getName());
    }
    /**
     * 验证令牌有效期,相差不足20分钟,自动刷新缓存
     *
     * @param institutionUser
     * @return
     */
    public void verifyThreeInToken(InstitutionUser institutionUser)
    {
        long expireTime = institutionUser.getExpireTime();
        long currentTime = System.currentTimeMillis();
        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
        {
            refreshThreeInToken(institutionUser);
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/InstitutionalManager.java
对比新文件
@@ -0,0 +1,53 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import java.time.LocalDateTime;
@TableName("institution_manager")
@Data
public class InstitutionalManager {
    @Id
    @TableId(type = IdType.AUTO)
    private Long id;
    //编号
    private Long institutionCode;
    //机构名称
    private String institutionalName;
    //key
    private String accessKey;
    //密钥
    private String secretKey;
    //联系人电话
    private String phone;
    //联系人
    private String contacts;
    private LocalDateTime accessTime;
    //访问ip
    private String accessIp;
    //0启用,1禁用
    private Byte status;
    //删除标识(0未删除,1删除)
    private Byte delFlag;
    /** 创建者 */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /** 更新者 */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/query/InstitutionManagerQuery.java
对比新文件
@@ -0,0 +1,9 @@
package com.ruoyi.system.domain.query;
import lombok.Data;
@Data
public class InstitutionManagerQuery {
    private String institutionManagerName;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/req/InstitutionModStatusReqDTO.java
对比新文件
@@ -0,0 +1,9 @@
package com.ruoyi.system.domain.req;
import lombok.Data;
@Data
public class InstitutionModStatusReqDTO {
    private Long id;
    private Byte status;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/req/InstitutionalManagerAddReqDTO.java
对比新文件
@@ -0,0 +1,15 @@
package com.ruoyi.system.domain.req;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Data
public class InstitutionalManagerAddReqDTO {
    @NotEmpty(message = "机构名称不可为空")
    private String institutionalName;
    @NotEmpty(message = "联系人电话不可为空")
    private String phone;
    @NotEmpty(message = "联系人不可为空")
    private String contacts;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/req/InstitutionalManagerModReqDTO.java
对比新文件
@@ -0,0 +1,20 @@
package com.ruoyi.system.domain.req;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class InstitutionalManagerModReqDTO {
    @NotNull(message = "主键不可为空")
    private Long id;
    @NotEmpty(message = "机构名称不可为空")
    private String institutionalName;
    @NotEmpty(message = "联系人电话不可为空")
    private String phone;
    @NotEmpty(message = "联系人不可为空")
    private String contacts;
   /* @NotNull(message = "状态")
    private Byte status;*/
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/InstitutionalManagerMapper.java
对比新文件
@@ -0,0 +1,20 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.InstitutionalManager;
import com.ruoyi.system.domain.query.InstitutionManagerQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface InstitutionalManagerMapper extends BaseMapper<InstitutionalManager> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/InstitutionalManagerService.java
对比新文件
@@ -0,0 +1,30 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.InstitutionalManager;
import com.ruoyi.system.domain.query.InstitutionManagerQuery;
import com.ruoyi.system.domain.req.InstitutionModStatusReqDTO;
import com.ruoyi.system.domain.req.InstitutionalManagerAddReqDTO;
import com.ruoyi.system.domain.req.InstitutionalManagerModReqDTO;
import java.util.List;
public interface InstitutionalManagerService extends IService<InstitutionalManager> {
    int add(InstitutionalManagerAddReqDTO reqDTO);
    int mod(InstitutionalManagerModReqDTO reqDTO);
    int del(Long id);
    InstitutionalManager findById(Long id);
    List<InstitutionalManager> listByPage(InstitutionManagerQuery query);
    InstitutionalManager getInstitutionalByAccessKey(String accessKey);
    int modStatus(InstitutionModStatusReqDTO reqDTO);
    List<InstitutionalManager> selectInstitutionInfo();
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InstitutionalManagerServiceImpl.java
对比新文件
@@ -0,0 +1,110 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.InstitutionStatus;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.InstitutionalManager;
import com.ruoyi.system.domain.query.InstitutionManagerQuery;
import com.ruoyi.system.domain.req.InstitutionModStatusReqDTO;
import com.ruoyi.system.service.InstitutionalManagerService;
import com.ruoyi.system.domain.req.InstitutionalManagerAddReqDTO;
import com.ruoyi.system.domain.req.InstitutionalManagerModReqDTO;
import com.ruoyi.system.mapper.InstitutionalManagerMapper;
import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("InstitutionalManagerService")
public class InstitutionalManagerServiceImpl extends ServiceImpl<InstitutionalManagerMapper, InstitutionalManager> implements InstitutionalManagerService {
    @Autowired
    private InstitutionalManagerMapper institutionalManagerMapper;
    @Override
    public int add(InstitutionalManagerAddReqDTO reqDTO) {
        String accessKey = RandomUtil.generateRandomString(20);
        String secretKey = RandomUtil.generateRandomString(20);
        InstitutionalManager institutionalManager = new InstitutionalManager();
        institutionalManager.setInstitutionalName(reqDTO.getInstitutionalName());
        institutionalManager.setDelFlag(DeleteStatusEnum.NO.getStatus());
        institutionalManager.setAccessKey(accessKey);
        institutionalManager.setSecretKey(secretKey);
        institutionalManager.setInstitutionCode(generateCode());
        institutionalManager.setPhone(reqDTO.getPhone());
        institutionalManager.setContacts(reqDTO.getContacts());
        institutionalManager.setStatus(InstitutionStatus.YES.getStatus());
        return institutionalManagerMapper.insert(institutionalManager);
    }
    @Override
    public int mod(InstitutionalManagerModReqDTO reqDTO) {
        InstitutionalManager institutionalManager = new InstitutionalManager();
        institutionalManager.setId(reqDTO.getId());
        institutionalManager.setInstitutionalName(reqDTO.getInstitutionalName());
        institutionalManager.setPhone(reqDTO.getPhone());
        institutionalManager.setContacts(reqDTO.getContacts());
        //institutionalManager.setStatus(reqDTO.getStatus());
        return institutionalManagerMapper.updateById(institutionalManager);
    }
    @Override
    public int del(Long id) {
        InstitutionalManager institutionalManager = this.findById(id);
        if(institutionalManager == null){
            throw new ServiceException("该数据不存在");
        }
        institutionalManager.setId(id);
        institutionalManager.setDelFlag(DeleteStatusEnum.YES.getStatus());
        return baseMapper.updateById(institutionalManager);
    }
    @Override
    public InstitutionalManager findById(Long id) {
        return institutionalManagerMapper.selectOne(new LambdaQueryWrapper<InstitutionalManager>().eq(InstitutionalManager::getId, id)
        .eq(InstitutionalManager::getDelFlag, DeleteStatusEnum.NO.getStatus()));
    }
    @Override
    public List<InstitutionalManager> listByPage(InstitutionManagerQuery query) {
        return institutionalManagerMapper.selectList(new LambdaQueryWrapper<InstitutionalManager>().eq(InstitutionalManager::getDelFlag,DeleteStatusEnum.NO.getStatus())
                .eq(!StringUtils.isEmpty(query.getInstitutionManagerName()),InstitutionalManager::getInstitutionalName,query.getInstitutionManagerName()));
    }
    @Override
    public InstitutionalManager getInstitutionalByAccessKey(String accessKey) {
        InstitutionalManager institutionalManager = institutionalManagerMapper.selectOne(new LambdaQueryWrapper<InstitutionalManager>()
                .eq(InstitutionalManager::getAccessKey, accessKey)
                .eq(InstitutionalManager::getDelFlag, DeleteStatusEnum.NO.getStatus()));
        return institutionalManager;
    }
    @Override
    public int modStatus(InstitutionModStatusReqDTO reqDTO) {
        InstitutionalManager institutionalManager = new InstitutionalManager();
        institutionalManager.setId(reqDTO.getId());
        institutionalManager.setStatus(reqDTO.getStatus());
        return institutionalManagerMapper.updateById(institutionalManager);
    }
    @Override
    public List<InstitutionalManager> selectInstitutionInfo() {
        return institutionalManagerMapper.selectList(new LambdaQueryWrapper<InstitutionalManager>().eq(InstitutionalManager::getDelFlag,DeleteStatusEnum.NO.getStatus()));
    }
    //生成编码
    private Long generateCode() {
        Long code = 1000l;
        Long count = institutionalManagerMapper.selectCount(new LambdaQueryWrapper<>());
        code += count;
        return code;
    }
}
ruoyi-system/src/main/resources/mapper/system/InstitutionManagerMapper.xml
对比新文件
@@ -0,0 +1,19 @@
<?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.ruoyi.system.mapper.InstitutionalManagerMapper">
    <select id="list" resultType="com.ruoyi.system.domain.InstitutionalManager">
        select
           *
        from institution_manager
        where del_flag = 0
        <if test="query.institutionalName != null and query.institutionalName != ''">
            and institutional_name like concat('%', #{query.institutionalName}, '%')
        </if>
        order by create_time desc
    </select>
</mapper>