yangdamao 2 жил өмнө
parent
commit
fa8536ed95
26 өөрчлөгдсөн 766 нэмэгдсэн , 7 устгасан
  1. 20 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  2. 38 3
      zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  3. 2 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  4. 10 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  5. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/QuestionMapper.java
  6. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java
  7. 102 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  8. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/BankGoodsExamAddBo.java
  9. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/SpecialExamRecordAddBo.java
  10. 40 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/SpecialExamRecordQuery.java
  11. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsExamTime.java
  12. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsExamTimeMapper.java
  13. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsExamTimeService.java
  14. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  15. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsExamTimeServiceImpl.java
  16. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/BankGoodsExamVo.java
  17. 43 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsExamTimeVo.java
  18. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/SpecialExamRecordVo.java
  19. 50 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSpecialExamRecord.java
  20. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserExamRecordMapper.java
  21. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSpecialExamRecordMapper.java
  22. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSpecialExamRecordService.java
  23. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserExamRecordServiceImpl.java
  24. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSpecialExamRecordServiceImpl.java
  25. 46 0
      zhongzheng-system/src/main/resources/mapper/modules/bank/QuestionMapper.xml
  26. 1 1
      zhongzheng-system/src/main/resources/mapper/modules/user/UserExamRecordMapper.xml

+ 20 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -10,6 +10,7 @@ import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.bank.bo.ExamQuestionQueryBo;
 import com.zhongzheng.modules.bank.service.IQuestionService;
 import com.zhongzheng.modules.bank.vo.ExamQuestionVo;
+import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.*;
@@ -294,4 +295,23 @@ public class GoodsController extends BaseController {
         List<GoodsUserQuestionVo> list = iQuestionService.listBankGoodsList(bo);
         return getDataTable(list);
     }
+
+    /**
+     * 获取题库商品每日一练试卷列表
+     */
+    @ApiOperation("获取题库商品每日一练试卷列表")
+    @GetMapping("/getBankGoodsExamList/{goodsId}")
+    public AjaxResult<List<BankGoodsExamVo>> getBankGoodsExamList(@PathVariable("goodsId") Long goodsId) {
+        List<BankGoodsExamVo> list = iQuestionService.getBankGoodsExamList(goodsId);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 新增每日一练试卷时间
+     */
+    @ApiOperation("新增每日一练试卷时间")
+    @PostMapping("/addExamTime")
+    public AjaxResult<Void> addGoodsExamTime(@RequestBody List<BankGoodsExamAddBo> addBo) {
+        return toAjax(iQuestionService.addGoodsExamTime(addBo) ? 1 : 0);
+    }
 }

+ 38 - 3
zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -22,14 +22,15 @@ import com.zhongzheng.modules.bank.vo.QuestionImport;
 import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 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.service.IGoodsService;
-import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
-import com.zhongzheng.modules.goods.vo.GoodsUserVo;
-import com.zhongzheng.modules.goods.vo.GoodsVo;
+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.IUserSpecialExamRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -62,6 +63,8 @@ public class QuestionController extends BaseController {
 
     private final IUserExamRecordService iUserExamRecordService;
 
+    private final IUserSpecialExamRecordService iUserSpecialExamRecordService;
+
 
     /**
      * 查询商品列表
@@ -130,4 +133,36 @@ public class QuestionController extends BaseController {
         }
         return getDataTable(list);
     }
+
+    /**
+     * 获取每日一练当天的试卷信息
+     */
+    @ApiOperation("获取每日一练当天的试卷信息")
+    @GetMapping("/getToDayExam/{goodsId}")
+    public AjaxResult<GoodsExamTimeVo> getToDayExam(@PathVariable("goodsId") Long goodsId) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(iQuestionService.getToDayExam(goodsId,loginUser.getUser().getUserId()));
+    }
+
+    /**
+     * 每日一练试卷打卡
+     */
+    @ApiOperation("每日一练试卷打卡")
+    @PostMapping("/special/exam/record")
+    public AjaxResult<Void> specialExamRecord(@RequestBody SpecialExamRecordAddBo addBo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        addBo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserSpecialExamRecordService.specialExamRecord(addBo)? 1 : 0);
+    }
+
+    /**
+     * 获取每日一练试卷打卡记录
+     */
+    @ApiOperation("获取每日一练试卷打卡记录")
+    @GetMapping("/get/special/record")
+    public AjaxResult<List<SpecialExamRecordVo>> getSpecialRecord(SpecialExamRecordQuery query) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        query.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserSpecialExamRecordService.getSpecialRecord(query));
+    }
 }

+ 2 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -13,6 +13,7 @@ import com.zhongzheng.modules.bank.bo.QuestionChapterExamQueryBo;
 import com.zhongzheng.modules.bank.bo.QuestionModuleChapterQueryBo;
 import com.zhongzheng.modules.bank.service.IQuestionChapterExamService;
 import com.zhongzheng.modules.bank.service.IQuestionModuleChapterService;
+import com.zhongzheng.modules.bank.service.IQuestionService;
 import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.bank.vo.QuestionChapterVo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
@@ -26,6 +27,7 @@ import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsSpecTemplateService;
 import com.zhongzheng.modules.goods.vo.GoodsAttachedVo;
+import com.zhongzheng.modules.goods.vo.GoodsExamTimeVo;
 import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.UserPeriodQueryBo;
@@ -253,5 +255,4 @@ public class GoodsController extends BaseController {
         return getDataTable(list);
     }
 
-
 }

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

@@ -222,6 +222,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return cal.getTimeInMillis() / 1000;  //今天凌晨
     }
 
+    /**
+     * 获取当月第一天的凌晨时间戳
+     */
+    public static Long getToMonthZeroTime()
+    {
+        Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1, 0, 0, 0);
+        return cal.getTime().getTime()/1000;
+    }
+
 
     /**
      * 获取日期格式订单号

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/QuestionMapper.java

@@ -7,7 +7,9 @@ import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.vo.CourseVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
+import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -29,4 +31,6 @@ public interface QuestionMapper extends BaseMapper<Question> {
     List<GoodsUserQuestionVo> listBankGoodsList(GoodsQueryBo bo);
 
     List<GoodsUserQuestionVo> listUserFreeUnionBuyGoodsList(GoodsQueryBo bo);
+
+    List<BankGoodsExamVo> getBankGoodsExamList(@Param("goodsId") Long goodsId);
 }

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java

@@ -8,10 +8,15 @@ import com.zhongzheng.modules.bank.bo.QuestionBatchDelBo;
 import com.zhongzheng.modules.bank.bo.QuestionEditBo;
 import com.zhongzheng.modules.bank.bo.QuestionQueryBo;
 import com.zhongzheng.modules.bank.domain.Question;
+import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.bank.vo.QuestionImport;
 import com.zhongzheng.modules.bank.vo.QuestionImportV2;
 import com.zhongzheng.modules.bank.vo.QuestionVo;
+import com.zhongzheng.modules.goods.bo.BankGoodsExamAddBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
+import com.zhongzheng.modules.goods.bo.SpecialExamRecordAddBo;
+import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
+import com.zhongzheng.modules.goods.vo.GoodsExamTimeVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -83,4 +88,11 @@ public interface IQuestionService extends IService<Question> {
 	Map<String,Object> importWordQuestionList(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId);
 
     boolean batchDelQuestion(QuestionBatchDelBo bo);
+
+    List<BankGoodsExamVo> getBankGoodsExamList(Long goodsId);
+
+	boolean addGoodsExamTime(List<BankGoodsExamAddBo> addBo);
+
+	GoodsExamTimeVo getToDayExam(Long goodsId,Long userId);
+
 }

+ 102 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.extra.tokenizer.Word;
 import com.alibaba.fastjson.JSON;
 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.constant.Constants;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
@@ -31,12 +32,21 @@ import com.zhongzheng.modules.exam.bo.ExamKnowledgeAddBo;
 import com.zhongzheng.modules.exam.bo.ExamKnowledgeBusinessAddBo;
 import com.zhongzheng.modules.exam.domain.ExamKnowledge;
 import com.zhongzheng.modules.exam.service.IExamKnowledgeService;
+import com.zhongzheng.modules.goods.bo.BankGoodsExamAddBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
+import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.domain.GoodsExamTime;
+import com.zhongzheng.modules.goods.service.IGoodsExamTimeService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
+import com.zhongzheng.modules.goods.vo.GoodsExamTimeVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
 
 import com.zhongzheng.modules.user.bo.CheckUserExamRecordBo;
+import com.zhongzheng.modules.user.bo.UserSpecialExamRecord;
+import com.zhongzheng.modules.user.domain.UserExamRecord;
 import com.zhongzheng.modules.user.service.IUserExamRecordService;
+import com.zhongzheng.modules.user.service.IUserSpecialExamRecordService;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
@@ -50,12 +60,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.unit.DataUnit;
 import org.springframework.web.multipart.MultipartFile;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 import java.io.*;
+import java.text.NumberFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -98,6 +110,12 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     @Autowired
     private IUserExamRecordService iUserExamRecordService;
 
+    @Autowired
+    private IGoodsExamTimeService goodsExamTimeService;
+
+    @Autowired
+    private IUserSpecialExamRecordService userSpecialExamRecordService;
+
     @Autowired
     private IGoodsService iGoodsService;
 
@@ -1741,6 +1759,90 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
                 .in(Question::getQuestionId,bo.getIds()));
     }
 
+    @Override
+    public List<BankGoodsExamVo> getBankGoodsExamList(Long goodsId) {
+        Goods goods = iGoodsService.getById(goodsId);
+        if (ObjectUtils.isNull(goods)){
+            throw new CustomException("商品信息获取失败!");
+        }
+        //获取题库商品的所有试卷
+        List<BankGoodsExamVo> examAllList = baseMapper.getBankGoodsExamList(goodsId);
+        //筛选每日一练试卷
+        List<BankGoodsExamVo> examList = examAllList.stream().filter(item -> item.getPaperName().equals("每日一练")).collect(Collectors.toList());
+        //获取试卷时间
+        examList.forEach(item -> {
+            GoodsExamTime examTime = goodsExamTimeService.getOne(new LambdaQueryWrapper<GoodsExamTime>()
+                    .eq(GoodsExamTime::getGoodsId, goodsId)
+                    .eq(GoodsExamTime::getModuleExamId, item.getModuleExamId())
+                    .eq(GoodsExamTime::getChapterExamId, item.getChapterExamId())
+                    .eq(GoodsExamTime::getExamId, item.getExamId())
+                    .eq(GoodsExamTime::getStatus, 1));
+            if (ObjectUtils.isNotNull(examTime)){
+                item.setExamTime(examTime.getExamTime());
+            }
+        });
+        return examList;
+    }
+
+    @Override
+    public boolean addGoodsExamTime(List<BankGoodsExamAddBo> addBo) {
+        Long goodsId = addBo.get(0).getGoodsId();
+        //先删除之前的时间
+        goodsExamTimeService.remove(new LambdaQueryWrapper<GoodsExamTime>()
+        .eq(GoodsExamTime::getGoodsId,goodsId));
+        //添加新时间
+        List<GoodsExamTime> entitys = addBo.stream().filter(x -> ObjectUtils.isNotNull(x.getExamTime())).map(item -> {
+            GoodsExamTime examTime = BeanUtil.toBean(item, GoodsExamTime.class);
+            examTime.setStatus(1);
+            examTime.setCreateTime(DateUtils.getNowTime());
+            examTime.setUpdateTime(DateUtils.getNowTime());
+            return examTime;
+        }).collect(Collectors.toList());
+
+        return goodsExamTimeService.saveBatch(entitys);
+    }
+
+    @Override
+    public GoodsExamTimeVo getToDayExam(Long goodsId,Long userId) {
+        Long todayZeroTime = DateUtils.getTodayZeroTime();
+        GoodsExamTime goodsExamTime = goodsExamTimeService.getOne(new LambdaQueryWrapper<GoodsExamTime>()
+                .eq(GoodsExamTime::getGoodsId, goodsId)
+                .eq(GoodsExamTime::getExamTime, todayZeroTime));
+        if (ObjectUtils.isNull(goodsExamTime)){
+            //当天没有设置试卷
+            return null;
+        }
+        GoodsExamTimeVo vo = BeanUtil.toBean(goodsExamTime, GoodsExamTimeVo.class);
+        //获取打卡记录
+        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();
+            vo.setRecordCount(recordCount.intValue());
+            //打卡百分比
+            Map<Long, List<UserSpecialExamRecord>> collect = list.stream().collect(Collectors.groupingBy(UserSpecialExamRecord::getUserId));
+            Long count = collect.values().stream().filter(item -> item.size() < recordCount).count();
+            Long countAll = collect.keySet().stream().filter(x -> !x.equals(userId)).count();
+            String percent = getPercent(count.intValue(), countAll.intValue());
+            vo.setRecordPercentage(percent);
+        }else {
+            vo.setRecordCount(0);
+            vo.setRecordPercentage("0.00%");
+        }
+        return vo;
+    }
+
+    private String getPercent(Integer x,Integer y){
+        Double d1 = x * 1.0;
+        Double d2 = y * 1.0;
+
+        NumberFormat format = NumberFormat.getPercentInstance();
+        format.setMinimumFractionDigits(2);
+        return format.format(d1 / d2);
+    }
+
+
 
     private String removeNo(String txt) {
         int intIndex = txt.indexOf("、");

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/BankGoodsExamAddBo.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月11日 14:25
+ */
+@Data
+@ApiModel("每日一练试卷时间新增对象")
+public class BankGoodsExamAddBo implements Serializable {
+    /**
+     * 商品id
+     */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+    /**
+     * 模块卷ID
+     */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /**
+     * 章卷ID
+     */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /**
+     * 试卷ID
+     */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    /**
+     * 每日一练时间
+     */
+    @ApiModelProperty("每日一练时间")
+    private Long examTime;
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/SpecialExamRecordAddBo.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月14日 9:24
+ */
+@Data
+public class SpecialExamRecordAddBo implements Serializable {
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /**
+     * 商品id
+     */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+    /**
+     * 模块卷ID
+     */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /**
+     * 章卷ID
+     */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /**
+     * 试卷ID
+     */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    /**
+     * 打卡时间
+     */
+    @ApiModelProperty("打卡时间")
+    private Long recordTime;
+}

+ 40 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/SpecialExamRecordQuery.java

@@ -0,0 +1,40 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月14日 9:24
+ */
+@Data
+public class SpecialExamRecordQuery implements Serializable {
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /**
+     * 商品id
+     */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+    /**
+     * 模块卷ID
+     */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /**
+     * 章卷ID
+     */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /**
+     * 试卷ID
+     */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsExamTime.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.goods.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;
+
+/**
+ * 商品试卷时间表 goods_exam_time
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("goods_exam_time")
+public class GoodsExamTime implements Serializable {
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 商品id */
+    private Long goodsId;
+    /** 模块卷ID */
+    private Long moduleExamId;
+    /** 章卷ID */
+    private Long chapterExamId;
+    /** 试卷ID */
+    private Long examId;
+    /** 每日一练时间 */
+    private Long examTime;
+    /** 1有效 0无效*/
+    private Integer status;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 1有效 0无效*/
+    private Long tenantId;
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsExamTimeMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.goods.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.goods.domain.GoodsExamTime;
+
+/**
+ * 商品附加产品Mapper接口
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+public interface GoodsExamTimeMapper extends BaseMapper<GoodsExamTime> {
+
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsExamTimeService.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.goods.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.domain.GoodsAttached;
+import com.zhongzheng.modules.goods.domain.GoodsExamTime;
+
+/**
+ * 商品附加产品Service接口
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+public interface IGoodsExamTimeService extends IService<GoodsExamTime> {
+}

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java

@@ -9,6 +9,7 @@ import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
 import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
 import com.zhongzheng.modules.goods.vo.GoodsJzsVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsExamTimeServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.goods.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.goods.domain.GoodsExamTime;
+import com.zhongzheng.modules.goods.mapper.GoodsExamTimeMapper;
+import com.zhongzheng.modules.goods.service.IGoodsExamTimeService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 商品附加产品Service业务层处理
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+@Service
+public class GoodsExamTimeServiceImpl extends ServiceImpl<GoodsExamTimeMapper, GoodsExamTime> implements IGoodsExamTimeService {
+
+}

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/BankGoodsExamVo.java

@@ -0,0 +1,69 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月11日 14:25
+ */
+@Data
+@ApiModel("每日一练试卷对象")
+public class BankGoodsExamVo implements Serializable {
+
+    @ApiModelProperty("id")
+    private Long id;
+    /**
+     * 商品id
+     */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+    /**
+     * 模块卷ID
+     */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /**
+     * 章卷ID
+     */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /**
+     * 试卷ID
+     */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    /**
+     * 试卷名称
+     */
+    @ApiModelProperty("试卷名称")
+    private String examName;
+    /**
+     * 试卷类型名称
+     */
+    @ApiModelProperty("试卷类型名称")
+    private String paperName;
+    /**
+     * 每日一练时间
+     */
+    @ApiModelProperty("每日一练时间")
+    private Long examTime;
+    /**
+     * 1有效 0无效
+     */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+    /**
+     * 添加时间
+     */
+    @ApiModelProperty("添加时间")
+    private Long createTime;
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+}

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

@@ -0,0 +1,43 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 商品试卷时间表Vo
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+@Data
+@ApiModel("商品试卷时间表Vo")
+public class GoodsExamTimeVo implements Serializable {
+    @ApiModelProperty("id")
+    private Long id;
+    /** 商品id */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+    /** 模块卷ID */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /** 章卷ID */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    /** 每日一练时间 */
+    @ApiModelProperty("每日一练时间")
+    private Long examTime;
+    /** 1有效 0无效*/
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+    @ApiModelProperty("打卡次数")
+    private Integer recordCount;
+    @ApiModelProperty("打卡次数百分比")
+    private String recordPercentage;
+
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/SpecialExamRecordVo.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月14日 9:24
+ */
+@Data
+public class SpecialExamRecordVo implements Serializable {
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /**
+     * 商品id
+     */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+    /**
+     * 模块卷ID
+     */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /**
+     * 章卷ID
+     */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /**
+     * 试卷ID
+     */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    /**
+     * 打卡时间
+     */
+    @ApiModelProperty("打卡时间")
+    private Long recordTime;
+}

+ 50 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSpecialExamRecord.java

@@ -0,0 +1,50 @@
+package com.zhongzheng.modules.user.bo;
+
+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_special_exam_record
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_special_exam_record")
+public class UserSpecialExamRecord implements Serializable {
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 商品id */
+    private Long userId;
+    /** 商品id */
+    private Long goodsId;
+    /** 模块卷ID */
+    private Long moduleExamId;
+    /** 章卷ID */
+    private Long chapterExamId;
+    /** 试卷ID */
+    private Long examId;
+    /** 打卡时间 */
+    private Long recordTime;
+    /** 1有效 0无效*/
+    private Integer status;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 1有效 0无效*/
+    private Long tenantId;
+}

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserExamRecordMapper.java

@@ -18,7 +18,7 @@ import java.util.List;
  * @date 2021-12-15
  */
 public interface UserExamRecordMapper extends BaseMapper<UserExamRecord> {
-    List<UserExamRecordVo> selectList(UserExamRecordQueryBo bo);
+    List<UserExamRecordVo> selectListAll(UserExamRecordQueryBo bo);
 
     Long selectDoNum(UserExamRecordQueryBo bo);
 

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserSpecialExamRecordMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.bo.UserSpecialExamRecord;
+
+/**
+ * 用户每日一练打卡记录Mapper接口
+ *
+ * @author
+ * @date
+ */
+public interface UserSpecialExamRecordMapper extends BaseMapper<UserSpecialExamRecord> {
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSpecialExamRecordService.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.bo.SpecialExamRecordAddBo;
+import com.zhongzheng.modules.goods.bo.SpecialExamRecordQuery;
+import com.zhongzheng.modules.goods.vo.SpecialExamRecordVo;
+import com.zhongzheng.modules.user.bo.UserSpecialExamRecord;
+
+import java.util.List;
+
+/**
+ * 用户每日一练打卡记录Service
+ *
+ * @author
+ * @date
+ */
+public interface IUserSpecialExamRecordService  extends IService<UserSpecialExamRecord> {
+
+    boolean specialExamRecord(SpecialExamRecordAddBo addBo);
+
+    List<SpecialExamRecordVo> getSpecialRecord(SpecialExamRecordQuery query);
+}

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserExamRecordServiceImpl.java

@@ -149,7 +149,7 @@ public class UserExamRecordServiceImpl extends ServiceImpl<UserExamRecordMapper,
 
     @Override
     public List<UserExamRecordVo> selectList(UserExamRecordQueryBo bo) {
-        return userExamRecordMapper.selectList(bo);
+        return userExamRecordMapper.selectListAll(bo);
     }
 
     /**

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSpecialExamRecordServiceImpl.java

@@ -0,0 +1,66 @@
+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.BeanUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.goods.bo.SpecialExamRecordAddBo;
+import com.zhongzheng.modules.goods.bo.SpecialExamRecordQuery;
+import com.zhongzheng.modules.goods.vo.SpecialExamRecordVo;
+import com.zhongzheng.modules.user.bo.UserSpecialExamRecord;
+import com.zhongzheng.modules.user.mapper.UserSpecialExamRecordMapper;
+import com.zhongzheng.modules.user.service.IUserSpecialExamRecordService;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月14日 9:11
+ */
+@Service
+public class UserSpecialExamRecordServiceImpl extends ServiceImpl<UserSpecialExamRecordMapper, UserSpecialExamRecord> implements IUserSpecialExamRecordService {
+
+    @Override
+    public boolean specialExamRecord(SpecialExamRecordAddBo bo) {
+        Integer count = count(new LambdaQueryWrapper<UserSpecialExamRecord>()
+                .eq(UserSpecialExamRecord::getUserId, bo.getUserId())
+                .eq(UserSpecialExamRecord::getGoodsId, bo.getGoodsId())
+                .eq(UserSpecialExamRecord::getModuleExamId, bo.getModuleExamId())
+                .eq(UserSpecialExamRecord::getChapterExamId, bo.getChapterExamId())
+                .eq(UserSpecialExamRecord::getExamId, bo.getExamId())
+                .eq(UserSpecialExamRecord::getRecordTime, bo.getRecordTime()));
+        if (count > 0){
+            //当天已有打卡记录
+            return true;
+        }
+        UserSpecialExamRecord entity = BeanUtil.toBean(bo, UserSpecialExamRecord.class);
+        entity.setStatus(1);
+        entity.setCreateTime(DateUtils.getNowTime());
+        entity.setUpdateTime(DateUtils.getNowTime());
+        return save(entity);
+    }
+
+    @Override
+    public List<SpecialExamRecordVo> getSpecialRecord(SpecialExamRecordQuery query) {
+        //获取本月的打卡记录
+        List<UserSpecialExamRecord> list = list(new LambdaQueryWrapper<UserSpecialExamRecord>()
+                .eq(UserSpecialExamRecord::getGoodsId, query.getGoodsId())
+                .eq(UserSpecialExamRecord::getModuleExamId, query.getModuleExamId())
+                .eq(UserSpecialExamRecord::getChapterExamId, query.getChapterExamId())
+                .eq(UserSpecialExamRecord::getExamId, query.getExamId())
+                .eq(UserSpecialExamRecord::getUserId, query.getUserId())
+                .ge(UserSpecialExamRecord::getRecordTime, DateUtils.getToMonthZeroTime()));
+        List<SpecialExamRecordVo> recordVos = list.stream().map(item -> {
+            SpecialExamRecordVo vo = BeanUtil.toBean(item, SpecialExamRecordVo.class);
+            return vo;
+        }).collect(Collectors.toList());
+        return recordVos;
+    }
+
+}

+ 46 - 0
zhongzheng-system/src/main/resources/mapper/modules/bank/QuestionMapper.xml

@@ -576,4 +576,50 @@
             )un   ORDER BY un.order_create_time DESC
 
     </select>
+    <select id="getBankGoodsExamList" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.goods.vo.BankGoodsExamVo">
+        SELECT
+            ga.goods_id AS goodsId,
+            qmc.module_exam_id AS moduleExamId,
+            qce.chapter_exam_id AS chapterExamId,
+            e.exam_id AS examId,
+            e.exam_name AS examName,
+            ep.paper_name AS paperName
+        FROM
+            goods_attached ga
+                LEFT JOIN question_module_chapter qmc ON ga.major_id = qmc.module_exam_id
+                LEFT JOIN question_chapter_exam qce ON qmc.chapter_exam_id = qce.chapter_exam_id
+                LEFT JOIN exam e ON qce.exam_id = e.exam_id
+                LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id
+        WHERE
+            ga.goods_id = #{goodsId} AND ga.type = 1
+        UNION ALL
+        SELECT
+            ga.goods_id AS goodsId,
+            0 AS moduleExamId,
+            qce.chapter_exam_id AS chapterExamId,
+            e.exam_id AS examId,
+            e.exam_name AS examName,
+            ep.paper_name AS paperName
+        FROM
+            goods_attached ga
+                LEFT JOIN question_chapter_exam qce ON ga.major_id = qce.chapter_exam_id
+                LEFT JOIN exam e ON qce.exam_id = e.exam_id
+                LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id
+        WHERE
+            ga.goods_id = #{goodsId} AND ga.type = 2
+        UNION ALL
+        SELECT
+            ga.goods_id AS goodsId,
+            0 AS moduleExamId,
+            0 AS chapterExamId,
+            e.exam_id AS examId,
+            e.exam_name AS examName,
+            ep.paper_name AS paperName
+        FROM
+            goods_attached ga
+                LEFT JOIN exam e ON ga.major_id = e.exam_id
+                LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id
+        WHERE
+            ga.goods_id = #{goodsId} AND ga.type = 3
+    </select>
 </mapper>

+ 1 - 1
zhongzheng-system/src/main/resources/mapper/modules/user/UserExamRecordMapper.xml

@@ -93,7 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     </resultMap>
 
-    <select id="selectList" parameterType="com.zhongzheng.modules.user.bo.UserExamRecordQueryBo" resultMap="UserExamRecordVoResult">
+    <select id="selectListAll" parameterType="com.zhongzheng.modules.user.bo.UserExamRecordQueryBo" resultMap="UserExamRecordVoResult">
         SELECT
             ue.*,
             e.exam_name,