FrontStudentController.java 19 KB

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