FrontStudentController.java 16 KB

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