Bladeren bron

submit:每日一练需求接口

yangdamao 3 jaren geleden
bovenliggende
commit
69ddc0996b
19 gewijzigde bestanden met toevoegingen van 416 en 3 verwijderingen
  1. 8 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  2. 2 0
      zhongzheng-admin/src/main/resources/application.yml
  3. 15 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  4. 2 0
      zhongzheng-api/src/main/resources/application.yml
  5. 13 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  6. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/ExamQueryBo.java
  7. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamServiceImpl.java
  8. 9 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  9. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExamVo.java
  10. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamTodayRecordBo.java
  11. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/TodayExamSubscriptionBo.java
  12. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsExamTimeVo.java
  13. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  14. 187 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  15. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserExamSubscription.java
  16. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserExamSubscriptionMapper.java
  17. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserExamSubscriptionService.java
  18. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserExamSubscriptionServiceImpl.java
  19. 3 1
      zhongzheng-system/src/main/resources/mapper/modules/bank/ExamMapper.xml

+ 8 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -366,4 +366,12 @@ public class ScheduleController extends BaseController {
         iScheduleService.refreshToken(bo);
         return AjaxResult.success();
     }
+
+    @ApiOperation("每日一练未打卡提醒")
+    @GetMapping("/toDayExamNotRecordWarn")
+    public AjaxResult toDayExamNotRecordWarn(){
+        iScheduleService.toDayExamNotRecordWarn();
+        return AjaxResult.success();
+    }
+
 }

+ 2 - 0
zhongzheng-admin/src/main/resources/application.yml

@@ -299,3 +299,5 @@ aliyun:
     longNotStudyStudentRemind: SMS_247910221  #学生长时间未学习
     longNotStudyTeacherRemind: SMS_247765294  #学生长时间未学习老师
     signCommitmentRemind: SMS_250390195  #签署承诺书提醒
+    todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
+    todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)

+ 15 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -26,12 +26,14 @@ import com.zhongzheng.modules.exam.vo.ExamPaperVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.SpecialExamRecordAddBo;
 import com.zhongzheng.modules.goods.bo.SpecialExamRecordQuery;
+import com.zhongzheng.modules.goods.bo.TodayExamSubscriptionBo;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.user.bo.UserExamRecordQueryBo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserExamRecordService;
+import com.zhongzheng.modules.user.service.IUserExamSubscriptionService;
 import com.zhongzheng.modules.user.service.IUserSpecialExamRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -69,6 +71,8 @@ public class QuestionController extends BaseController {
 
     private final IExamPaperService iExamPaperService;
 
+    private final IUserExamSubscriptionService iUserExamSubscriptionService;
+
 
     /**
      * 查询商品列表
@@ -172,4 +176,15 @@ public class QuestionController extends BaseController {
         query.setUserId(loginUser.getUser().getUserId());
         return AjaxResult.success(iUserSpecialExamRecordService.getSpecialRecord(query));
     }
+
+    /**
+     * 每日一练消息提醒订阅
+     */
+    @ApiOperation("每日一练消息提醒订阅")
+    @GetMapping("/today/exam/subscription")
+    public AjaxResult<Void> todayExamSubscription(TodayExamSubscriptionBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserExamSubscriptionService.todayExamSubscription(bo)? 1 : 0);
+    }
 }

+ 2 - 0
zhongzheng-api/src/main/resources/application.yml

@@ -294,3 +294,5 @@ aliyun:
     longNotStudyStudentRemind: SMS_247910221  #学生长时间未学习
     longNotStudyTeacherRemind: SMS_247765294  #学生长时间未学习老师
     signCommitmentRemind: SMS_250390195  #签署承诺书提醒
+    todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
+    todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)

+ 13 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -222,6 +222,19 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return cal.getTimeInMillis() / 1000;  //今天凌晨
     }
 
+    /**
+     * 获取明天凌晨时间戳
+     */
+    public static Long getTomorrowZeroTime()
+    {
+        Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        Calendar cal1 = Calendar.getInstance();
+        cal1.setTime(cal.getTime());
+        cal1.add(Calendar.DAY_OF_MONTH , +1);
+        return cal1.getTimeInMillis() / 1000; //明天凌晨
+    }
+
     /**
      * 获取当月第一天的凌晨时间戳
      */

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/ExamQueryBo.java

@@ -89,4 +89,6 @@ public class ExamQueryBo extends BaseEntity {
 	private List<Long> examIds;
 	@ApiModelProperty("试卷类型名称")
 	private String paperName;
+	@ApiModelProperty("是否排除随机练习和每日一练试卷类型:1是,0否")
+	private Integer exclude;
 }

+ 7 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
@@ -80,7 +81,12 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
 
     @Override
     public List<ExamVo> getList(ExamQueryBo bo) {
-        return examMapper.getList(bo);
+        List<ExamVo> list = examMapper.getList(bo);
+        if (ObjectUtils.isNull(bo.getExclude()) || bo.getExclude() == 0){
+            //默认排除随机练习和每日一练试卷类型
+            list = list.stream().filter(x -> !x.getPaperName().equals("每日一练") ||  !x.getPaperName().equals("随机练习")).collect(Collectors.toList());
+        }
+        return list;
     }
 
     @Override

+ 9 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -1820,12 +1820,20 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         GoodsExamTimeVo vo = BeanUtil.toBean(goodsExamTime, GoodsExamTimeVo.class);
         Exam exam = iExamService.getById(vo.getExamId());
         vo.setExamName(exam.getExamName());
+        //明日打卡试卷名称
+        GoodsExamTime goodsExamTimeTwo = goodsExamTimeService.getOne(new LambdaQueryWrapper<GoodsExamTime>()
+                .eq(GoodsExamTime::getGoodsId, goodsId)
+                .eq(GoodsExamTime::getExamTime, DateUtils.getTomorrowZeroTime()));
+        if (ObjectUtils.isNotNull(goodsExamTimeTwo)){
+            Exam examTwo = iExamService.getById(goodsExamTimeTwo.getExamId());
+            vo.setExamNameBelow(examTwo.getExamName());
+        }
         //获取打卡记录
         List<UserSpecialExamRecord> list = userSpecialExamRecordService.list(new LambdaQueryWrapper<UserSpecialExamRecord>()
                 .eq(UserSpecialExamRecord::getGoodsId, vo.getGoodsId()));
         if (CollectionUtils.isNotEmpty(list)){
             //我的累计打卡次数
-            Long recordCount = list.stream().filter(x -> x.getUserId().equals(userId)).count();
+                Long recordCount = list.stream().filter(x -> x.getUserId().equals(userId)).count();
             vo.setRecordCount(recordCount.intValue());
             //打卡百分比
             Map<Long, List<UserSpecialExamRecord>> collect = list.stream().collect(Collectors.groupingBy(UserSpecialExamRecord::getUserId));

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExamVo.java

@@ -144,5 +144,8 @@ public class ExamVo {
 	@ApiModelProperty("做的题目数")
 	private Long doQuestionNum;
 
+	@ApiModelProperty("试卷类型名称")
+	private String paperName;
+
 
 }

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamTodayRecordBo.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月15日 15:23
+ */
+@Data
+public class ExamTodayRecordBo implements Serializable {
+
+    @ApiModelProperty("")
+    private Long userId;
+
+    @ApiModelProperty("")
+    private Long goodsId;
+}

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/TodayExamSubscriptionBo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月15日 17:33
+ */
+@Data
+public class TodayExamSubscriptionBo implements Serializable {
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("是否订阅:1是 0否")
+    private Integer subscriptionStatus;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsExamTimeVo.java

@@ -43,5 +43,7 @@ public class GoodsExamTimeVo implements Serializable {
     private String recordPercentage;
     @ApiModelProperty("是否打卡:1是 0否")
     private Integer examRecord;
+    @ApiModelProperty("明日打卡试卷名称")
+    private String examNameBelow;
 
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java

@@ -95,4 +95,6 @@ public interface IScheduleService extends IService<PolyvVideo> {
     void wisdomSyncExamVideo(ExamApplyQueryBo bo);
 
     void signTimeSend(UserQueryBo bo);
+
+    void toDayExamNotRecordWarn();
 }

+ 187 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -23,6 +24,7 @@ import com.zhongzheng.common.utils.polyv.PolyvUtils;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 import com.zhongzheng.modules.bank.domain.Exam;
 import com.zhongzheng.modules.bank.domain.QuestionBusiness;
+import com.zhongzheng.modules.bank.mapper.QuestionMapper;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.vo.ProfileTpVo;
 import com.zhongzheng.modules.base.vo.UserProfileVo;
@@ -40,6 +42,7 @@ import com.zhongzheng.modules.course.vo.CourseModuleChapterVo;
 import com.zhongzheng.modules.course.vo.CourseSectionVo;
 import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
 import com.zhongzheng.modules.exam.bo.ExamBeforeQueryBo;
+import com.zhongzheng.modules.exam.bo.ExamTodayRecordBo;
 import com.zhongzheng.modules.exam.domain.ExamApply;
 import com.zhongzheng.modules.exam.domain.ExamBefore;
 import com.zhongzheng.modules.exam.domain.ExamNumber;
@@ -52,8 +55,10 @@ import com.zhongzheng.modules.exam.vo.ExamNumberVo;
 import com.zhongzheng.modules.exam.vo.ExamUserApplyVo;
 import com.zhongzheng.modules.goods.bo.GoodsCourseQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
+import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsCourseService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
 import com.zhongzheng.modules.goods.vo.GoodsCourseVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
@@ -114,6 +119,7 @@ import com.zhongzheng.modules.user.vo.*;
 import com.zhongzheng.modules.wisdom.service.IWisdomService;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
 import com.zhongzheng.modules.wx.service.IWxPayService;
+import net.polyv.common.v1.util.StringUtils;
 import net.polyv.live.v1.entity.channel.playback.LiveChannelVideoListResponse;
 import net.polyv.live.v1.entity.channel.playback.LiveListChannelSessionInfoResponse;
 import net.polyv.live.v1.entity.channel.playback.LiveListChannelVideoLibraryResponse;
@@ -265,6 +271,18 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     @Autowired
     private ICourseSubjectService iCourseSubjectService;
 
+    @Autowired
+    private IUserExamSubscriptionService iUserExamSubscriptionService;
+
+    @Autowired
+    private com.zhongzheng.modules.bank.mapper.QuestionMapper QuestionMapper;
+
+    @Autowired
+    private IUserSpecialExamRecordService iUserSpecialExamRecordService;
+
+    @Autowired
+    private IClassGradeGoodsService iClassGradeGoodsService;
+
     @Autowired
     private IWxLoginService iWxLoginService;
 
@@ -307,6 +325,12 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
     @Value("${aliyun.sms.longNotStudyTeacherRemind}")
     private String longNotStudyTeacherRemind;
 
+    @Value("${aliyun.sms.todayExamNotRecordWarn}")
+    private String todayExamNotRecordWarn;
+
+    @Value("${aliyun.sms.todayExamNotRecordTeachWarn}")
+    private String todayExamNotRecordTeachWarn;
+
     @Autowired
     private RedisCache redisCache;
 
@@ -791,6 +815,169 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         }
     }
 
+    @Override
+    public void toDayExamNotRecordWarn() {
+        //获取订阅每日一练消息提醒的用户和商品
+        List<UserExamSubscription> list = iUserExamSubscriptionService
+                .list(new LambdaQueryWrapper<UserExamSubscription>()
+                .eq(UserExamSubscription::getSubscriptionStatus, 1));
+        if (CollectionUtils.isEmpty(list)){
+            return;
+        }
+        InformRemindVo informRemindVo = informRemindService.queryById(41L);//学员提醒
+        //需要短信提醒的学员
+        Set<Long> userIds = new HashSet<>();
+        //需求提醒的商品集合
+        List<ExamTodayRecordBo> recordBos = new ArrayList<>();
+        for (UserExamSubscription subscription : list) {
+            //该商品下是否有每日一练试卷
+            List<BankGoodsExamVo> examVos = QuestionMapper.getBankGoodsExamList(subscription.getGoodsId());
+            if (examVos.stream().filter(x -> StringUtils.isNotBlank(x.getPaperName())).anyMatch(item -> item.getPaperName().equals("每日一练"))){
+                //查询学员当天是否打卡
+                int count = iUserSpecialExamRecordService.count(new LambdaQueryWrapper<UserSpecialExamRecord>()
+                        .eq(UserSpecialExamRecord::getGoodsId, subscription.getGoodsId())
+                        .eq(UserSpecialExamRecord::getUserId, subscription.getUserId())
+                        .eq(UserSpecialExamRecord::getRecordTime, DateUtils.getTodayZeroTime()));
+                if (count > 0){
+                    //已有打卡记录
+                    continue;
+                }
+                ExamTodayRecordBo bo = new ExamTodayRecordBo();
+                bo.setGoodsId(subscription.getGoodsId());
+                bo.setUserId(subscription.getUserId());
+                recordBos.add(bo);
+                Goods goods = iGoodsService.getById(subscription.getGoodsId());
+                if (informRemindVo.getWayStatus().equals(1)) {
+                    //站内信
+                    InformUserAddBo informUserAddBo = new InformUserAddBo();
+                    informUserAddBo.setUserId(subscription.getUserId());
+                    informUserAddBo.setSendStatus(1);
+                    informUserAddBo.setSendTime(DateUtils.getNowTime());
+                    informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                    informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                    informUserAddBo.setRemindId(41L);
+                    informUserAddBo.setSystemStatus(1);
+                    informUserAddBo.setRemind("您开通的课程今天每日一练没有打卡,请尽快去学习吧");
+                    informUserAddBo.setGoodsId(subscription.getGoodsId());
+                    informUserAddBo.setText("您开通《"+goods.getGoodsName()+"》今天每日一练还没有打卡,为了你的学习效果,请尽快去学习吧");
+                    iInformUserService.insertByAddBo(informUserAddBo);
+                }
+                if (informRemindVo.getNoteStatus().equals(1)) {
+                    userIds.add(subscription.getUserId());
+
+                }
+                if (informRemindVo.getGzhTpStatus().equals(1)) {
+                    //公众号
+                    InformUserAddBo informUserAddBo = new InformUserAddBo();
+                    informUserAddBo.setUserId(subscription.getUserId());
+                    informUserAddBo.setSendTime(DateUtils.getNowTime());
+                    informUserAddBo.setSendStatus(1);
+                    informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                    informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                    informUserAddBo.setRemindId(41L);
+                    informUserAddBo.setSystemStatus(4);
+                    informUserAddBo.setRemind("您开通的课程今天每日一练没有打卡,请尽快去学习吧");
+                    informUserAddBo.setGoodsId(subscription.getGoodsId());
+                    informUserAddBo.setText("今天每日一练还没有打卡,为了你的学习效果,请尽快去学习吧");
+                    UserVo userVo = iUserService.queryById(subscription.getUserId());
+                    iInformUserService.insertByAddBo(informUserAddBo);
+                    if(Validator.isNotEmpty(userVo.getOpenId())){
+                        Map<String,String> paramMap = new HashMap<>();
+                        paramMap.put("first","今天每日一练还没有打卡,为了你的学习效果,请尽快去学习吧");
+                        paramMap.put("keyword1",goods.getGoodsName());
+                        paramMap.put("keyword2","未打卡");
+                        paramMap.put("pagepath","");
+                        iWxLoginService.sendSmallTpMsg(userVo.getOpenId(),paramMap);
+                    }
+                }
+            }
+        }
+        //学员短信提醒
+        if (!CollectionUtils.isEmpty(userIds)){
+            userIds.forEach(item -> {
+                //短信
+                InformUserAddBo informUserAddBo = new InformUserAddBo();
+                informUserAddBo.setUserId(item);
+                informUserAddBo.setSendTime(DateUtils.getNowTime());
+                informUserAddBo.setSendStatus(1);
+                informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                informUserAddBo.setRemindId(41L);
+                informUserAddBo.setSystemStatus(3);
+                informUserAddBo.setRemind("您开通的课程今天每日一练没有打卡,请尽快去学习吧");
+                informUserAddBo.setText("今天每日一练还没有打卡,为了你的学习效果,请尽快去学习吧");
+                UserVo userVo = iUserService.queryById(item);
+                if (Validator.isNotEmpty(IAliSmsService.sendInformSms(userVo.getTelphone(),"", todayExamNotRecordWarn))) {
+                    iInformUserService.insertByAddBo(informUserAddBo);
+                }
+            });
+        }
+        //教务提醒
+        if (!CollectionUtils.isEmpty(recordBos)){
+            InformRemindVo informRemindTeachVo = informRemindService.queryById(43L);//老师提醒
+            Map<Long, List<ExamTodayRecordBo>> map = recordBos.stream().collect(Collectors.groupingBy(ExamTodayRecordBo::getGoodsId));
+            map.forEach((k,v) -> {
+                //获取班主任信息
+                List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService
+                        .list(new LambdaQueryWrapper<ClassGradeGoods>()
+                        .eq(ClassGradeGoods::getGoodsId, k));
+
+                if (CollectionUtils.isEmpty(gradeGoods)){
+                    return;
+                }
+                List<ClassGrade> grades = iClassGradeService.
+                        list(new LambdaQueryWrapper<ClassGrade>()
+                        .in(ClassGrade::getGradeId, gradeGoods.stream().map(ClassGradeGoods::getGradeId).collect(Collectors.toList()))
+                        .eq(ClassGrade::getStatus, 1));
+                List<ClassGrade> gradeList = grades.stream().filter(x -> ObjectUtils.isNotNull(x.getSysUserId())).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(gradeList)){
+                    return;
+                }
+                Goods goods = iGoodsService.getById(k);
+                for (ClassGrade classGrade : gradeList) {
+                    if (informRemindTeachVo.getWayStatus().equals(1)) {
+                        //站内信
+                        InformUserAddBo informUserAddBo = new InformUserAddBo();
+                        informUserAddBo.setUserId(classGrade.getSysUserId());
+                        informUserAddBo.setSendStatus(1);
+                        informUserAddBo.setSendTime(DateUtils.getNowTime());
+                        informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                        informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                        informUserAddBo.setRemindId(43L);
+                        informUserAddBo.setSystemStatus(2);
+                        informUserAddBo.setRemind("学员学习提醒,请尽快处理");
+                        informUserAddBo.setGoodsId(k);
+                        informUserAddBo.setText("有"+v.size()+"个学员,开通《"+goods.getGoodsName()+"》今天每日一练还没有打卡,请后台查看未打卡学员信息,尽快与学员沟通");
+                        iInformUserService.insertByAddBo(informUserAddBo);
+                    }
+                    if (informRemindTeachVo.getNoteStatus().equals(1)) {
+                        SysUser sysUser = iSysUserService.getById(classGrade.getSysUserId());
+                        if (StringUtils.isBlank(sysUser.getPhonenumber())){
+                            return;
+                        }
+                        //短信
+                        InformUserAddBo informUserAddBo = new InformUserAddBo();
+                        informUserAddBo.setUserId(classGrade.getSysUserId());
+                        informUserAddBo.setSendTime(DateUtils.getNowTime());
+                        informUserAddBo.setSendStatus(1);
+                        informUserAddBo.setCreateTime(DateUtils.getNowTime());
+                        informUserAddBo.setUpdateTime(DateUtils.getNowTime());
+                        informUserAddBo.setRemindId(43L);
+                        informUserAddBo.setSystemStatus(3);
+                        informUserAddBo.setRemind("学员学习提醒,请尽快处理");
+                        informUserAddBo.setText("有"+v.size()+"个学员,开通《"+goods.getGoodsName()+"》今天每日一练还没有打卡,请后台查看未打卡学员信息,尽快与学员沟通");
+                        Map<String, Object> param = new HashMap<>();
+                        param.put("num", v.size());
+                        param.put("goodsName", goods.getGoodsName());
+                        if (Validator.isNotEmpty(IAliSmsService.sendInformSms(sysUser.getPhonenumber(),JSON.toJSONString(param), todayExamNotRecordWarn))) {
+                            iInformUserService.insertByAddBo(informUserAddBo);
+                        }
+                    }
+                }
+            });
+        }
+    }
+
     @Override
     public void closeTimeOutOrder() {
         OrderQueryBo bo = new OrderQueryBo();

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserExamSubscription.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 用户每日一练消息订阅表 user_exam_subscription
+ *
+ * @author ruoyi
+ * @date 2021-06-24
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_exam_subscription")
+public class UserExamSubscription implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 用户ID */
+    private Long userId;
+    /** 商品ID */
+    private Long goodsId;
+    /** 是否订阅:1是 0否 */
+    private Integer subscriptionStatus;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 商户ID */
+    private Long tenantId;
+
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserExamSubscriptionMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.domain.UserExamSubscription;
+
+/**
+ * 用户每日一练消息订阅Mapper层
+ *
+ * @author ruoyi
+ * @date 2021-06-24
+ */
+public interface UserExamSubscriptionMapper extends BaseMapper<UserExamSubscription> {
+
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserExamSubscriptionService.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.bo.TodayExamSubscriptionBo;
+import com.zhongzheng.modules.user.domain.UserExamRecord;
+import com.zhongzheng.modules.user.domain.UserExamSubscription;
+
+/**
+ * 用户每日一练消息订阅Service接口
+ *
+ * @author hjl
+ * @date 2021-12-15
+ */
+public interface IUserExamSubscriptionService extends IService<UserExamSubscription> {
+
+    boolean todayExamSubscription(TodayExamSubscriptionBo bo);
+}

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserExamSubscriptionServiceImpl.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.goods.bo.TodayExamSubscriptionBo;
+import com.zhongzheng.modules.user.domain.UserExamSubscription;
+import com.zhongzheng.modules.user.mapper.UserExamSubscriptionMapper;
+import com.zhongzheng.modules.user.service.IUserExamSubscriptionService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月15日 11:39
+ */
+@Service
+public class UserExamSubscriptionServiceImpl extends ServiceImpl<UserExamSubscriptionMapper, UserExamSubscription> implements IUserExamSubscriptionService {
+
+    @Override
+    public boolean todayExamSubscription(TodayExamSubscriptionBo bo) {
+        if (ObjectUtils.isNull(bo.getGoodsId()) || ObjectUtils.isNull(bo.getSubscriptionStatus())){
+            throw new CustomException("参数错误!请检查");
+        }
+        UserExamSubscription subscription = getOne(new LambdaQueryWrapper<UserExamSubscription>()
+                .eq(UserExamSubscription::getGoodsId, bo.getGoodsId())
+                .eq(UserExamSubscription::getUserId, bo.getUserId()));
+        if (ObjectUtils.isNull(subscription)){
+            //新增
+            UserExamSubscription entity = BeanUtil.toBean(bo, UserExamSubscription.class);
+            entity.setCreateTime(DateUtils.getNowTime());
+            entity.setUpdateTime(DateUtils.getNowTime());
+            return save(entity);
+        }
+        subscription.setSubscriptionStatus(bo.getSubscriptionStatus());
+        subscription.setUpdateTime(DateUtils.getNowTime());
+        return updateById(subscription);
+    }
+}

+ 3 - 1
zhongzheng-system/src/main/resources/mapper/modules/bank/ExamMapper.xml

@@ -54,6 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="questionNum" column="question_num"/>
         <result property="recordStatus" column="record_status"/>
         <result property="doQuestionNum" column="do_question_num"/>
+        <result property="paperName" column="paper_name"/>
         <collection property="goodsList" column="exam_id" select="findGoodsList"/>
     </resultMap>
 
@@ -84,7 +85,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         cpt.project_name,
         cb.business_name,
         cs.subject_name,
-        eq.question_num
+        eq.question_num,
+        ep.paper_name
         FROM
             exam e
                 LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id