Ver código fonte

学生学习计划,定向选择接口

mingfu 1 mês atrás
pai
commit
817a1ce9d1

+ 186 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontStudentController.java

@@ -0,0 +1,186 @@
+package com.ruoyi.web.controller.front;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.content.VistorContextHolder;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.dz.domain.DzControl;
+import com.ruoyi.dz.service.IDzControlService;
+import com.ruoyi.ie.domain.AEnrollUniversity;
+import com.ruoyi.ie.service.IAEnrollUniversityService;
+import com.ruoyi.learn.domain.LearnPlan;
+import com.ruoyi.learn.domain.LearnPlanStudy;
+import com.ruoyi.learn.service.ILearnPlanService;
+import com.ruoyi.learn.service.ILearnPlanStudyService;
+import com.ruoyi.sy.service.ISyMajorService;
+import com.ruoyi.system.service.ISysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.ValidationException;
+import java.text.ParseException;
+import java.time.LocalDate;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/front/student")
+@Api(tags = "前台-学习-学生")
+public class FrontStudentController {
+    private final IDzControlService dzControlService;
+    private final IAEnrollUniversityService universityService;
+    private final ISyMajorService syMajorService;
+    private final ISysUserService sysUserService;
+    private final ILearnPlanService learnPlanService;
+    private final ILearnPlanStudyService learnPlanStudyService;
+
+    public FrontStudentController(IDzControlService dzControlService, IAEnrollUniversityService universityService, ISyMajorService syMajorService, ISysUserService sysUserService, ILearnPlanService learnPlanService, ILearnPlanStudyService learnPlanStudyService) {
+        this.dzControlService = dzControlService;
+        this.universityService = universityService;
+        this.syMajorService = syMajorService;
+        this.sysUserService = sysUserService;
+        this.learnPlanService = learnPlanService;
+        this.learnPlanStudyService = learnPlanStudyService;
+    }
+
+    @ApiOperation("01 计划院校列表")
+    @GetMapping(value = "getUniversityList")
+    public AjaxResult getUniversityList() {
+        DzControl dzControl = dzControlService.selectDzControl(VistorContextHolder.getContext());
+        AEnrollUniversity cond = new AEnrollUniversity();
+        cond.setYear(dzControl.getPlanYear());
+        return AjaxResult.success(universityService.selectAEnrollUniversityList(cond).stream().map(
+                t -> JSONObject.of("universityId", t.getUniversityId(), "universityName", t.getUniversityName())
+        ).collect(Collectors.toList()));
+    }
+
+    @ApiOperation("02 计划院校专业及专业组树")
+    @GetMapping(value = "getGroupMajors")
+    public AjaxResult getGroupMajors(@ApiParam("院校ID") Long universityId) {
+        return AjaxResult.success(syMajorService.selectPlanMajorList(VistorContextHolder.getContext(), universityId));
+    }
+
+    @ApiOperation("03 查询学生定向院校")
+    @GetMapping(value = "getDirectionSchools")
+    public AjaxResult getDirectionSchools() {
+        SysUser user = sysUserService.selectUserById(SecurityUtils.getLoginUser().getUserId());
+        return AjaxResult.success(JSONArray.parse(user.getDirectedStudy()));
+    }
+
+    @ApiOperation("04 保存学生定向院校")
+    @PostMapping(value = "saveDirectionSchools")
+    public AjaxResult saveDirectionSchools(@RequestBody JSONArray directionStudy) {
+        SysUser user = new SysUser();
+        user.setUserId(SecurityUtils.getLoginUser().getUserId());
+        user.setDirectedStudy(directionStudy.toJSONString());
+        return sysUserService.updateUserProfile(user) > 0 ? AjaxResult.success("更新成功") : AjaxResult.success("无更新");
+    }
+
+    @ApiOperation("10 查询学习计划")
+    @GetMapping("getLearnPlan")
+    public AjaxResult getLearnPlan()
+    {
+        return AjaxResult.success(getCurrLearnPlan());
+    }
+
+    @ApiOperation("11 保存学习计划")
+    @PostMapping("saveLearnPlan")
+    public AjaxResult saveLearnPlan(@RequestBody LearnPlan plan)
+    {
+        plan.setStudentId(SecurityUtils.getLoginUser().getUserId());
+
+        LearnPlan curr = getCurrLearnPlan();
+        Date today = DateUtils.truncate(new Date(), Calendar.DATE);
+        if(curr.getStatus().equals(1)) {
+            if(DateUtils.isSameDay(curr.getBeginTime(), today)) { // 当天的更新计划
+                curr.setVideoTime(plan.getVideoTime());
+                curr.setQuestionCnt(plan.getQuestionCnt());
+            } else {
+                curr.setStatus(0);
+            }
+            curr.setStudentId(null);
+            curr.setBeginTime(null);
+            curr.setStats(null);
+            learnPlanService.updateLearnPlan(plan);
+        }
+        if(curr.getStatus().equals(1)) {
+            return AjaxResult.success();
+        }
+        plan.setStudentId(SecurityUtils.getLoginUser().getUserId());
+        plan.setBeginTime(today);
+        plan.setStatus(1);
+        learnPlanService.insertLearnPlan(plan);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("10 查询学习计划统计")
+    @GetMapping("getLearnPlanStats")
+    public AjaxResult getLearnPlanStats(@ApiParam String reportMonth)
+    {
+        LearnPlan curr = getCurrLearnPlan();
+        // 统计每天的学习情况, 再汇总
+        LearnPlanStudy cond = new LearnPlanStudy();
+        cond.setStudentId(SecurityUtils.getLoginUser().getUserId());
+        try {
+            cond.setReportDate(DateUtils.parseDate(reportMonth, "yyyy-MM-dd"));
+        } catch (ParseException e) {
+            throw new ValidationException("日期格式错误");
+        }
+        List<LearnPlanStudy> studyList = learnPlanStudyService.selectLearnPlanStudyList(cond);
+        Integer doneDay = 0;
+        Long videoTimes = 0L;
+        Long questionCnt = 0L;
+        Date today = new Date();
+        LearnPlanStudy todayStudy = null;
+        for(LearnPlanStudy study : studyList) {
+            if(!study.getReportDate().before(today)) { // 今天
+                doneDay++;
+                videoTimes += study.getVideoTime();
+                questionCnt = study.getQuestionCount();
+            } else {
+                todayStudy = study;
+            }
+        }
+
+        Integer preDay = 0;
+        if(DateUtils.isSameDay(cond.getReportDate(), DateUtils.truncate(curr.getBeginTime(), Calendar.MONTH))) {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(curr.getBeginTime());
+            preDay = cal.get(Calendar.DAY_OF_MONTH) - 1;
+        }
+        JSONObject stats = new JSONObject();
+        stats.put("doneDay", doneDay);
+        stats.put("unDoneDay", LocalDate.now().getDayOfMonth() - doneDay - preDay);
+        stats.put("videoTimes", videoTimes);
+        stats.put("questionCnt", questionCnt);
+        stats.put("studyList", studyList);
+        stats.put("today", todayStudy);
+        stats.put("plan", curr);
+        return AjaxResult.success(stats);
+    }
+
+
+    private LearnPlan getCurrLearnPlan() {
+        LearnPlan cond = new LearnPlan();
+        cond.setStudentId(SecurityUtils.getLoginUser().getUserId());
+        cond.setStatus(1);
+        List<LearnPlan> planList = learnPlanService.selectLearnPlanList(cond);
+        if(CollectionUtils.isNotEmpty(planList)) {
+            return planList.get(0);
+        }
+        cond.setQuestionCnt(90);
+        cond.setVideoTime(5);
+        cond.setStatus(0);
+        cond.setBeginTime(DateUtils.truncate(new Date(), Calendar.DATE));
+        return cond;
+    }
+
+}

+ 1 - 3
ie-admin/src/main/java/com/ruoyi/web/controller/front/UserController.java

@@ -113,9 +113,7 @@ public class UserController {
         cond.setLocation(location);
         List<DzControl> list = dzControlService.selectDzControlList(cond);
         Integer year;
-        if(!CollectionUtils.isEmpty(list) && StringUtils.isNotBlank(list.get(0).getSubmitYear())) {
-            year = NumberUtils.toInt(list.get(0).getSubmitYear(), Calendar.getInstance().get(Calendar.YEAR));
-        } else {
+        if(CollectionUtils.isEmpty(list) || null == (year = list.get(0).getSubmitYear())) {
             year = Calendar.getInstance().get(Calendar.YEAR);
         }
         List<JSONObject> resultList = new ArrayList<>();

+ 6 - 6
ie-system/src/main/java/com/ruoyi/dz/domain/DzControl.java

@@ -36,11 +36,11 @@ public class DzControl extends BaseEntity
 
     /** 计划年度 */
     @Excel(name = "计划年度")
-    private String planYear;
+    private Integer planYear;
 
     /** 录取年度 */
     @Excel(name = "录取年度")
-    private String submitYear;
+    private Integer submitYear;
 
     /** 开启考生 */
     @Excel(name = "开启考生")
@@ -96,22 +96,22 @@ public class DzControl extends BaseEntity
         return isValid;
     }
 
-    public void setPlanYear(String planYear) 
+    public void setPlanYear(Integer planYear)
     {
         this.planYear = planYear;
     }
 
-    public String getPlanYear() 
+    public Integer getPlanYear()
     {
         return planYear;
     }
 
-    public void setSubmitYear(String submitYear) 
+    public void setSubmitYear(Integer submitYear)
     {
         this.submitYear = submitYear;
     }
 
-    public String getSubmitYear() 
+    public Integer getSubmitYear()
     {
         return submitYear;
     }

+ 6 - 0
ie-system/src/main/java/com/ruoyi/dz/service/IDzControlService.java

@@ -1,6 +1,9 @@
 package com.ruoyi.dz.service;
 
 import java.util.List;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.dz.domain.DzControl;
 
 /**
@@ -58,4 +61,7 @@ public interface IDzControlService
      * @return 结果
      */
     public int deleteDzControlById(Long id);
+
+
+    public DzControl selectDzControl(SysUser user);
 }

+ 19 - 0
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzControlServiceImpl.java

@@ -1,12 +1,19 @@
 package com.ruoyi.dz.service.impl;
 
 import java.util.List;
+import java.util.Optional;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.ExamType;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.dz.mapper.DzControlMapper;
 import com.ruoyi.dz.domain.DzControl;
 import com.ruoyi.dz.service.IDzControlService;
 
+import javax.validation.ValidationException;
+
 /**
  * 单招省份状态Service业务层处理
  * 
@@ -90,4 +97,16 @@ public class DzControlServiceImpl implements IDzControlService
     {
         return dzControlMapper.deleteDzControlById(id);
     }
+
+    @Override
+    public DzControl selectDzControl(SysUser user) {
+        DzControl cond = new DzControl();
+        cond.setLocation(user.getLocation());
+        String examType = user.getExamType().name();
+        Optional<DzControl> optional = dzControlMapper.selectDzControlList(cond).stream().filter(t -> StringUtils.isBlank(t.getExamTypes()) || t.getExamTypes().contains(examType)).findFirst();
+        if(optional.isPresent()) {
+            return optional.get();
+        }
+        throw new ValidationException("未初始化控制状态: " + user.getLocation() + "," + examType);
+    }
 }

+ 14 - 14
ie-system/src/main/java/com/ruoyi/learn/domain/LearnPlan.java

@@ -18,7 +18,7 @@ public class LearnPlan extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 计划id */
-    private String id;
+    private Long id;
 
     /** 学生id */
     @Excel(name = "学生id")
@@ -26,15 +26,15 @@ public class LearnPlan extends BaseEntity
 
     /** 视频课时间 */
     @Excel(name = "视频课时间")
-    private Long videoTime;
+    private Integer videoTime;
 
     /** 练题数 */
     @Excel(name = "练题数")
-    private Long questionCnt;
+    private Integer questionCnt;
 
     /** 是否有效 */
     @Excel(name = "是否有效")
-    private Long status;
+    private Integer status;
 
     /** 开始时间 */
     @JsonFormat(pattern = "yyyy-MM-dd")
@@ -45,52 +45,52 @@ public class LearnPlan extends BaseEntity
     @Excel(name = "统计情况")
     private String stats;
 
-    public void setId(String id) 
+    public void setId(Long id)
     {
         this.id = id;
     }
 
-    public String getId() 
+    public Long getId()
     {
         return id;
     }
 
-    public void setStudentId(Long studentId) 
+    public void setStudentId(Long studentId)
     {
         this.studentId = studentId;
     }
 
-    public Long getStudentId() 
+    public Long getStudentId()
     {
         return studentId;
     }
 
-    public void setVideoTime(Long videoTime) 
+    public void setVideoTime(Integer videoTime)
     {
         this.videoTime = videoTime;
     }
 
-    public Long getVideoTime() 
+    public Integer getVideoTime()
     {
         return videoTime;
     }
 
-    public void setQuestionCnt(Long questionCnt) 
+    public void setQuestionCnt(Integer questionCnt)
     {
         this.questionCnt = questionCnt;
     }
 
-    public Long getQuestionCnt() 
+    public Integer getQuestionCnt()
     {
         return questionCnt;
     }
 
-    public void setStatus(Long status) 
+    public void setStatus(Integer status)
     {
         this.status = status;
     }
 
-    public Long getStatus() 
+    public Integer getStatus()
     {
         return status;
     }

+ 2 - 0
ie-system/src/main/java/com/ruoyi/sy/mapper/SyMajorMapper.java

@@ -64,4 +64,6 @@ public interface SyMajorMapper
      * @return 结果
      */
     public int deleteSyMajorByIds(Long[] ids);
+
+    public List<SyMajor> selectSyMajorByPlan(@Param("year") Integer year, @Param("examType") String examType, @Param("universityId") Long universityId, @Param("location") String location);
 }

+ 5 - 0
ie-system/src/main/java/com/ruoyi/sy/service/ISyMajorService.java

@@ -1,5 +1,7 @@
 package com.ruoyi.sy.service;
 
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.sy.domain.SyMajor;
 
 import java.util.List;
@@ -62,4 +64,7 @@ public interface ISyMajorService
      * @return 结果
      */
     public int deleteSyMajorById(Long id);
+
+
+    List<SyMajor> selectPlanMajorList(SysUser user, Long universityId);
 }

+ 13 - 0
ie-system/src/main/java/com/ruoyi/sy/service/impl/SyMajorServiceImpl.java

@@ -1,7 +1,11 @@
 package com.ruoyi.sy.service.impl;
 
 import com.ruoyi.common.core.content.VistorContextHolder;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.dz.domain.DzControl;
+import com.ruoyi.dz.service.IDzControlService;
 import com.ruoyi.sy.domain.SyMajor;
 import com.ruoyi.sy.mapper.SyMajorMapper;
 import com.ruoyi.sy.service.ISyMajorService;
@@ -9,6 +13,7 @@ import com.ruoyi.util.ConstantUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -22,6 +27,8 @@ public class SyMajorServiceImpl implements ISyMajorService
 {
     @Autowired
     private SyMajorMapper syMajorMapper;
+    @Autowired
+    private IDzControlService dzControlService;
 
     /**
      * 查询专业
@@ -110,4 +117,10 @@ public class SyMajorServiceImpl implements ISyMajorService
     {
         return syMajorMapper.deleteSyMajorById(id);
     }
+
+    @Override
+    public List<SyMajor> selectPlanMajorList(SysUser user, Long universityId) {
+        DzControl dzControl = dzControlService.selectDzControl(user);
+        return syMajorMapper.selectSyMajorByPlan(dzControl.getPlanYear(), user.getExamType().title(), universityId, user.getLocation());
+    }
 }

+ 11 - 0
ie-system/src/main/resources/mapper/sy/SyMajorMapper.xml

@@ -116,4 +116,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+
+    <select id="selectSyMajorByPlan" resultMap="SyMajorResult">
+        SELECT m.`type`, m.`code`, m.`name`, CONCAT(m2.`name`, '&gt;', m1.`name`) `ancestors`
+         FROM `a_marjor_plan` mp
+         JOIN `sy_major` m ON mp.`majorName` = m.`name` AND mp.`level` = m.`type`
+         LEFT JOIN `sy_major` m1 ON m1.`code` = m.`parent_code`
+         LEFT JOIN `sy_major` m2 ON m2.`code` = m1.`parent_code`
+        WHERE mp.`year` = #{year} AND mp.`examineeType` = #{examType} AND mp.`universityId` = #{universityId} AND mp.`location` = #{location}
+        order by m.`type`, m.`code`
+    </select>
+
 </mapper>