FrontStudentController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. package com.ruoyi.web.controller.front;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.date.LocalDateTimeUtil;
  4. import cn.hutool.core.lang.Dict;
  5. import com.alibaba.fastjson2.JSONArray;
  6. import com.alibaba.fastjson2.JSONObject;
  7. import com.google.common.collect.Lists;
  8. import com.ruoyi.common.core.content.VistorContextHolder;
  9. import com.ruoyi.common.core.controller.BaseController;
  10. import com.ruoyi.common.core.domain.AjaxResult;
  11. import com.ruoyi.common.core.domain.AjaxResult2;
  12. import com.ruoyi.common.core.domain.entity.SysUser;
  13. import com.ruoyi.common.core.page.TableDataInfo;
  14. import com.ruoyi.common.enums.ExamType;
  15. import com.ruoyi.common.utils.SecurityUtils;
  16. import com.ruoyi.dz.domain.DzControl;
  17. import com.ruoyi.dz.domain.DzSubject;
  18. import com.ruoyi.dz.service.IDzControlService;
  19. import com.ruoyi.dz.service.IDzSubjectService;
  20. import com.ruoyi.enums.PaperType;
  21. import com.ruoyi.ie.domain.AEnrollUniversity;
  22. import com.ruoyi.ie.domain.AMarjorPlan;
  23. import com.ruoyi.ie.service.IAEnrollUniversityService;
  24. import com.ruoyi.ie.service.IAMarjorPlanService;
  25. import com.ruoyi.learn.domain.*;
  26. import com.ruoyi.learn.service.*;
  27. import com.ruoyi.sy.domain.SyMajor;
  28. import com.ruoyi.sy.service.ISyMajorService;
  29. import com.ruoyi.system.service.ISysUserService;
  30. import com.ruoyi.web.service.ExamService;
  31. import com.ruoyi.web.service.LearnStatService;
  32. import com.ruoyi.web.service.LearnTeacherService;
  33. import com.ruoyi.web.service.StudentService;
  34. import io.swagger.annotations.Api;
  35. import io.swagger.annotations.ApiOperation;
  36. import io.swagger.annotations.ApiParam;
  37. import org.apache.commons.collections.CollectionUtils;
  38. import org.apache.commons.lang3.StringUtils;
  39. import org.apache.commons.lang3.time.DateUtils;
  40. import org.springframework.web.bind.annotation.*;
  41. import javax.validation.ValidationException;
  42. import java.text.ParseException;
  43. import java.util.Calendar;
  44. import java.util.Date;
  45. import java.util.List;
  46. import java.util.Map;
  47. import java.util.stream.Collectors;
  48. @RestController
  49. @RequestMapping("/front/student")
  50. @Api(tags = "前台-学习-学生")
  51. public class FrontStudentController extends BaseController {
  52. private final IDzControlService dzControlService;
  53. private final IAEnrollUniversityService universityService;
  54. private final ISyMajorService syMajorService;
  55. private final ISysUserService sysUserService;
  56. private final ILearnPlanService learnPlanService;
  57. private final ILearnPlanStudyService learnPlanStudyService;
  58. private final IAMarjorPlanService marjorPlanService;
  59. private final ILearnDirectedKnowledgeService learnDirectedKnowledgeService;
  60. private final StudentService studentService;
  61. private final IDzSubjectService dzSubjectService;
  62. private final LearnTeacherService learnTeacherService;
  63. private final LearnStatService learnStatService;
  64. private final ExamService examService;
  65. private final ILearnTestStudentService learnTestStudentService;
  66. public FrontStudentController(IDzControlService dzControlService, IAEnrollUniversityService universityService, ISyMajorService syMajorService, ISysUserService sysUserService,
  67. ILearnPlanService learnPlanService, ILearnPlanStudyService learnPlanStudyService, IAMarjorPlanService marjorPlanService, ILearnDirectedKnowledgeService learnDirectedKnowledgeService, StudentService studentService, IDzSubjectService dzSubjectService, LearnTeacherService learnTeacherService, LearnStatService learnStatService, ExamService examService, ILearnTestStudentService learnTestStudentService) {
  68. this.dzControlService = dzControlService;
  69. this.universityService = universityService;
  70. this.syMajorService = syMajorService;
  71. this.sysUserService = sysUserService;
  72. this.learnPlanService = learnPlanService;
  73. this.learnPlanStudyService = learnPlanStudyService;
  74. this.marjorPlanService = marjorPlanService;
  75. this.learnDirectedKnowledgeService = learnDirectedKnowledgeService;
  76. this.studentService = studentService;
  77. this.dzSubjectService = dzSubjectService;
  78. this.learnTeacherService = learnTeacherService;
  79. this.learnStatService = learnStatService;
  80. this.examService = examService;
  81. this.learnTestStudentService = learnTestStudentService;
  82. }
  83. @ApiOperation("02 全部科目")
  84. @GetMapping(value = "subject")
  85. public AjaxResult2<List<DzSubject>> getSubject(@ApiParam("定向") @RequestParam(defaultValue = "false") boolean directed) {
  86. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  87. DzSubject sCond = new DzSubject();
  88. sCond.setLocations(sysUser.getLocation());
  89. sCond.setExamTypes(sysUser.getExamType().name());
  90. List<DzSubject> list = dzSubjectService.selectDzSubjectList(sCond);
  91. if(ExamType.VHS.equals(sysUser.getExamType())) {
  92. Long validSubjectId = null != sysUser.getExamMajor() ? sysUser.getExamMajor().longValue() : 0L;
  93. return AjaxResult2.success(list.stream().filter(t -> t.getSubjectId() < 10 || t.getSubjectId().equals(validSubjectId)).collect(Collectors.toList()));
  94. }
  95. return AjaxResult2.success(list);
  96. }
  97. @ApiOperation("试卷作业统计")
  98. @GetMapping("paperStats")
  99. public AjaxResult paperStats()
  100. {
  101. return AjaxResult.success(studentService.selectStatsForStudent(SecurityUtils.getUserId()));
  102. }
  103. @ApiOperation("试卷作业列表")
  104. @GetMapping("papers")
  105. public TableDataInfo papers(@ApiParam("status=1未做3正做4完成") Integer status)
  106. {
  107. startPage();
  108. List<LearnPaper> list = studentService.selectLearnPaperForStudent(SecurityUtils.getUserId(), status);
  109. return getDataTable(list);
  110. }
  111. @ApiOperation("01 计划院校列表")
  112. @GetMapping(value = "university")
  113. public AjaxResult getUniversity() {
  114. DzControl dzControl = dzControlService.selectDzControl(VistorContextHolder.getContext());
  115. AEnrollUniversity cond = new AEnrollUniversity();
  116. cond.setYear(dzControl.getPlanYear());
  117. return AjaxResult.success(universityService.selectAEnrollUniversityList(cond).stream().map(
  118. t -> JSONObject.of("universityId", t.getUniversityId(), "universityName", t.getUniversityName())
  119. ).collect(Collectors.toList()));
  120. }
  121. @ApiOperation("02 计划院校专业及上级")
  122. @GetMapping(value = "university/major")
  123. public AjaxResult getUniversityMajor(@ApiParam("院校ID") Long universityId) {
  124. SysUser sysUser = VistorContextHolder.getContext();
  125. DzControl dzControl = dzControlService.selectDzControl(sysUser);
  126. List<SyMajor> syMajorList = syMajorService.selectPlanMajorList(dzControl.getPlanYear(), sysUser, universityId);
  127. LearnDirectedKnowledge dkCond = new LearnDirectedKnowledge();
  128. dkCond.setUniversityId(universityId);
  129. dkCond.setMatchYear(dzControl.getPlanYear());
  130. dkCond.setLocations(sysUser.getLocation());
  131. dkCond.setExamineeTypes(sysUser.getExamType().name());
  132. Map<String, LearnDirectedKnowledge> directedKnowledgeMap = learnDirectedKnowledgeService.selectLearnDirectedKnowledgeList(dkCond).stream().collect(Collectors.toMap(LearnDirectedKnowledge::getDirectKey, t -> t));
  133. return AjaxResult.success(syMajorList.stream().map(t -> {
  134. String majorGroup = t.getExamType();
  135. String majorName = t.getParentCode();
  136. t.setParentCode(null);
  137. t.setExamType(null);
  138. t.setParams(null);
  139. JSONObject o = JSONObject.from(t);
  140. LearnDirectedKnowledge learnDirectedKnowledge = learnTeacherService.getBestLearnDirectedKnowledge(majorGroup, majorName, directedKnowledgeMap);
  141. o.put("notice", null != learnDirectedKnowledge && "技能展示/实践操作".equals(learnDirectedKnowledge.getModules()) ? "该专业只考技能展示/实践操作" : "");
  142. o.put("majorGroup",majorGroup);
  143. return o;
  144. }).collect(Collectors.toList()));
  145. }
  146. @ApiOperation("30 计划院校专业信息")
  147. @GetMapping("university/plan")
  148. public AjaxResult getUniversityPlan(@ApiParam("专业") Long planId) {
  149. AMarjorPlan mp = marjorPlanService.selectAMarjorPlanById(planId);
  150. LearnDirectedKnowledge cond = new LearnDirectedKnowledge();
  151. String groupName = StringUtils.trimToEmpty(mp.getMajorGroup());
  152. List<LearnDirectedKnowledge> result = null;
  153. if(StringUtils.isNotBlank(mp.getMajorName())) {
  154. cond.setDirectKey(mp.getYear() + "_" + mp.getUniversityId() + "_" + groupName + "_" + mp.getMajorName()); // 三级键
  155. result = learnDirectedKnowledgeService.selectLearnDirectedKnowledgeList(cond);
  156. }
  157. if(CollectionUtils.isEmpty(result)) {
  158. cond.setDirectKey(mp.getYear() + "_" + mp.getUniversityId() + "_" + groupName); // 二级键
  159. result = learnDirectedKnowledgeService.selectLearnDirectedKnowledgeList(cond);
  160. }
  161. if(CollectionUtils.isEmpty(result) && StringUtils.isNotBlank(groupName)) {
  162. cond.setDirectKey(mp.getYear() + "_" + mp.getUniversityId().toString()); // 一级键
  163. result = learnDirectedKnowledgeService.selectLearnDirectedKnowledgeList(cond);
  164. }
  165. return CollectionUtils.isNotEmpty(result) ? AjaxResult.success(result.get(0)) : AjaxResult.error("无计划");
  166. }
  167. @ApiOperation("03 查询学生定向院校")
  168. @GetMapping(value = "simulated/info")
  169. public AjaxResult getSimulateInfo() {
  170. JSONObject result = new JSONObject();
  171. SysUser user = SecurityUtils.getLoginUser().getUser();
  172. if(ExamType.OHS.name().equals(user.getUserType())) {
  173. result.put("subjects", Lists.newArrayList("职业技能", "语数外"));
  174. } else {
  175. result.put("subjects", Lists.newArrayList("职业技能"));
  176. }
  177. SysUser sysUser = sysUserService.selectUserById(SecurityUtils.getUserId());
  178. result.put("evalCount", sysUser.getEvalCounts());
  179. return AjaxResult.success(result);
  180. }
  181. @ApiOperation("03 查询学生定向院校")
  182. @GetMapping(value = "directed/school")
  183. public AjaxResult getDirectionSchools() {
  184. SysUser user = sysUserService.selectUserById(SecurityUtils.getLoginUser().getUserId());
  185. return AjaxResult.success(JSONArray.parse(user.getDirectedStudy()));
  186. }
  187. @ApiOperation("04 保存学生定向院校")
  188. @PostMapping(value = "directed/school")
  189. public AjaxResult saveStudySchool(@RequestBody JSONArray directionStudy) {
  190. SysUser user = new SysUser();
  191. user.setUserId(SecurityUtils.getLoginUser().getUserId());
  192. if(!directionStudy.isEmpty()) {
  193. JSONObject directed = directionStudy.getJSONObject(0);
  194. Long planId = directed.getLongValue("majorId");
  195. Long universityId = directed.getLongValue("universityId");
  196. directed.put("notice", learnTeacherService.updateDirected(user.getUserId(), universityId, planId));
  197. directionStudy.set(0, directed);
  198. }
  199. user.setDirectedStudy(directionStudy.toJSONString());
  200. return sysUserService.updateUserProfile(user) > 0 ? AjaxResult.success("更新成功") : AjaxResult.success("无更新");
  201. }
  202. @ApiOperation("10 查询学习计划")
  203. @GetMapping("plan")
  204. public AjaxResult getPlan()
  205. {
  206. return AjaxResult.success(learnPlanService.getCurrLearnPlan());
  207. }
  208. @ApiOperation("11 保存学习计划")
  209. @PostMapping("plan")
  210. public AjaxResult savePlan(@RequestBody LearnPlan plan)
  211. {
  212. LearnPlan curr = learnPlanService.getCurrLearnPlan();
  213. Date today = DateUtils.truncate(new Date(), Calendar.DATE);
  214. if(null != curr) {
  215. if(curr.getStatus().equals(1)) {
  216. if(DateUtils.isSameDay(curr.getBeginTime(), today)) { // 当天的更新计划
  217. curr.setVideoTime(plan.getVideoTime());
  218. curr.setQuestionCnt(plan.getQuestionCnt());
  219. } else {
  220. curr.setStatus(0);
  221. }
  222. curr.setStudentId(null);
  223. curr.setBeginTime(null);
  224. curr.setStats(null);
  225. plan.setFirstTime(curr.getFirstTime());
  226. learnPlanService.updateLearnPlan(curr);
  227. }
  228. if(curr.getStatus().equals(1)) {
  229. return AjaxResult.success();
  230. }
  231. } else {
  232. plan.setFirstTime(today);
  233. }
  234. plan.setStudentId(SecurityUtils.getLoginUser().getUserId());
  235. plan.setBeginTime(today);
  236. plan.setStatus(1);
  237. learnPlanService.insertLearnPlan(plan);
  238. return AjaxResult.success();
  239. }
  240. @ApiOperation("10 查询学习计划统计")
  241. @GetMapping("plan/stats")
  242. public AjaxResult getPlanStats(@ApiParam String reportMonth)
  243. {
  244. LearnPlan curr = learnPlanService.getCurrLearnPlan();
  245. if(null == curr) {
  246. throw new RuntimeException("未配置学习计划");
  247. }
  248. // 统计每天的学习情况, 再汇总
  249. LearnPlanStudy cond = new LearnPlanStudy();
  250. cond.setStudentId(SecurityUtils.getLoginUser().getUserId());
  251. try {
  252. cond.setReportDate(DateUtils.parseDate(reportMonth, "yyyy-MM-dd"));
  253. } catch (ParseException e) {
  254. throw new ValidationException("日期格式错误");
  255. }
  256. List<LearnPlanStudy> studyList = learnPlanStudyService.selectPlanStudyStats(cond);
  257. Integer doneDay = 0;
  258. Long videoTimes = 0L;
  259. Long questionCnt = 0L;
  260. List<Dict> monthStudyList = Lists.newArrayList();
  261. Date firstDate = null;
  262. JSONObject today = null;
  263. for(LearnPlanStudy study : studyList) {
  264. JSONObject planStudy = toStudyStats(study);
  265. if(DateUtils.isSameDay(cond.getReportDate(), study.getReportDate())) {
  266. today = planStudy;
  267. }
  268. boolean videoCompleted;
  269. if(null != study.getVideoCount()) {
  270. videoCompleted = study.getVideoCount() >= study.getVideoPlan();
  271. } else {
  272. videoCompleted = study.getVideoPlan().equals(0);
  273. }
  274. if(null != study.getVideoTime()) {
  275. videoTimes += study.getVideoTime();
  276. }
  277. boolean questionCompleted;
  278. if(null != study.getQuestionCount()) {
  279. questionCnt += study.getQuestionCount();
  280. questionCompleted = study.getQuestionCount() >= study.getQuestionPlan();
  281. } else {
  282. questionCompleted = study.getQuestionPlan().equals(0);
  283. }
  284. if(videoCompleted && questionCompleted) {
  285. doneDay++;
  286. }
  287. if(null == firstDate) {
  288. firstDate = study.getReportDate();
  289. }
  290. monthStudyList.add(Dict.create().set("date", DateUtil.format(study.getReportDate(), "yyyy-MM-dd")).set("data", planStudy));
  291. }
  292. Integer preDay = 0; // 同月的排队计划开始之前的 历史月不好计算,待定 TODO MF
  293. Date month = DateUtils.truncate(cond.getReportDate(), Calendar.MONTH);
  294. if(DateUtils.isSameDay(month, DateUtils.truncate(curr.getFirstTime(), Calendar.MONTH))) {
  295. Calendar cal = Calendar.getInstance();
  296. cal.setTime(curr.getFirstTime());
  297. preDay = cal.get(Calendar.DAY_OF_MONTH) - 1;
  298. }
  299. JSONObject stats = new JSONObject();
  300. stats.put("firstDay", DateUtil.format(curr.getFirstTime(), "yyyy-MM-dd"));
  301. stats.put("preDay", preDay);
  302. stats.put("doneDay", doneDay);
  303. stats.put("undoneDay", LocalDateTimeUtil.of(DateUtils.addDays(DateUtils.addMonths(month, 1), -1)).getDayOfMonth() - doneDay - preDay);
  304. stats.put("videoTimes", videoTimes);
  305. stats.put("questionCnt", questionCnt);
  306. stats.put("studyList", monthStudyList);
  307. stats.put("today", today);
  308. return AjaxResult.success(stats);
  309. }
  310. private JSONObject toStudyStats(LearnPlanStudy todayStudy) {
  311. JSONObject study = new JSONObject();
  312. study.put("questionPlan", todayStudy.getQuestionPlan());
  313. study.put("videoPlan", todayStudy.getVideoPlan());
  314. study.put("questionCnt", todayStudy.getQuestionCount());
  315. study.put("videoTime", todayStudy.getVideoCount());
  316. study.put("videoTimes", todayStudy.getVideoTime());
  317. study.put("rightRate", Math.round((float)(todayStudy.getRightCount() * 100 / todayStudy.getQuestionCount())));
  318. return study;
  319. }
  320. @ApiOperation("50 记录-知识点统计")
  321. @GetMapping("record/knowledge")
  322. public TableDataInfo getRecordKnowledge()
  323. {
  324. List<JSONObject> list = learnStatService.getRecordKnowledge(SecurityUtils.getUserId());
  325. return getDataTable(list);
  326. }
  327. @ApiOperation("51 记录-模拟卷")
  328. @GetMapping("record/simulated")
  329. public AjaxResult getRecordSimulated()
  330. {
  331. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  332. return AjaxResult.success(studentService.getSimulateList(sysUser.getUserId()));
  333. }
  334. @ApiOperation("52 记录-模拟卷结果")
  335. @GetMapping("record/simulated/{recordId}")
  336. public AjaxResult getSimulatedDetail(@ApiParam("记录ID") @PathVariable("recordId") Long recordId)
  337. {
  338. return AjaxResult.success(examService.loadExaminee(recordId, false));
  339. }
  340. @ApiOperation("53 记录-测试卷")
  341. @GetMapping("record/test")
  342. public TableDataInfo getRecordTest(@ApiParam("状态") @RequestParam(required = false) Integer state)
  343. {
  344. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  345. startPage();
  346. return getDataTable(studentService.getTestList(sysUser.getUserId(), state));
  347. }
  348. @ApiOperation("54 记录-测试卷结果")
  349. @GetMapping("record/test/{recordId}")
  350. public AjaxResult getTestDetail(@ApiParam("记录ID") @PathVariable("recordId") Long recordId)
  351. {
  352. LearnTestStudent learnTestStudent = learnTestStudentService.selectLearnTestStudentById(recordId);
  353. if(null == learnTestStudent || null == learnTestStudent.getExamineeId()) {
  354. return AjaxResult.error("记录无效");
  355. }
  356. return AjaxResult.success(examService.loadExaminee(learnTestStudent.getExamineeId(), false));
  357. }
  358. @ApiOperation("55 记录-计划刷题")
  359. @GetMapping("record/planStudy")
  360. public AjaxResult getRecordPlanStudy(@ApiParam Integer year, @ApiParam @RequestParam(required = false) Long month)
  361. {
  362. return AjaxResult.success(learnStatService.getRecordPlanStudy(SecurityUtils.getUserId(), year, month));
  363. }
  364. @ApiOperation("练习列表")
  365. @GetMapping("record/practice")
  366. public TableDataInfo practice(@ApiParam @RequestParam(defaultValue = "0") Integer questionType)
  367. {
  368. startPage();
  369. return getDataTable(learnStatService.selectStudentPractices(SecurityUtils.getUserId(), PaperType.Practice, questionType));
  370. }
  371. @ApiOperation("同步练习列表")
  372. @GetMapping("record/coursePractice")
  373. public TableDataInfo coursePractice(@ApiParam @RequestParam(defaultValue = "0") Integer questionType)
  374. {
  375. return getDataTable(learnStatService.selectStudentPractices(SecurityUtils.getUserId(), PaperType.Course, questionType));
  376. }
  377. @ApiOperation("56 记录-视频学习")
  378. @GetMapping("record/video")
  379. public AjaxResult getRecordVideo()
  380. {
  381. return AjaxResult.success(learnStatService.getRecordVideo(SecurityUtils.getUserId()));
  382. }
  383. }