Bladeren bron

add 赠送题卷

he2802 3 jaren geleden
bovenliggende
commit
cdb99e83b3
35 gewijzigde bestanden met toevoegingen van 1034 en 9 verwijderingen
  1. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  2. 26 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  3. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java
  4. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java
  5. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleFreeExamVo.java
  6. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankAddBo.java
  7. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFreeBankAddBo.java
  8. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFreeBankEditBo.java
  9. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFreeBankQueryBo.java
  10. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsFreeBank.java
  11. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsFreeBankMapper.java
  12. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsFreeBankService.java
  13. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  14. 103 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsFreeBankServiceImpl.java
  15. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  16. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsFreeBankVo.java
  17. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java
  18. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsEditBo.java
  19. 36 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsFreeAddBo.java
  20. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsFreeEditBo.java
  21. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsFreeQueryBo.java
  22. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  23. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoodsFree.java
  24. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsFreeMapper.java
  25. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsFreeService.java
  26. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  27. 102 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsFreeServiceImpl.java
  28. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  29. 126 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  30. 39 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsFreeVo.java
  31. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java
  32. 22 1
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseMenuMapper.xml
  33. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsCourseMapper.xml
  34. 17 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsFreeMapper.xml
  35. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml

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

@@ -136,7 +136,7 @@ public class GoodsController extends BaseController {
     @Log(title = "商品", businessType = BusinessType.INSERT)
     @PostMapping("/bank")
     public AjaxResult<Void> addBank(@RequestBody GoodsBankAddBo bo) {
-        return toAjax(iGoodsService.insertBankByAddBo(bo) ? 1 : 0);
+        return toAjax(iGoodsService.insertBankByAddBo(bo)>0 ? 1 : 0);
     }
 
     /**

+ 26 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java

@@ -7,6 +7,8 @@ import io.micrometer.core.lang.NonNull;
 
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.Iterator;
 import java.util.Random;
 
@@ -112,5 +114,29 @@ public class ToolsUtils {
         return stringBuffer.toString();
     }
 
+    public static String StringToMd5(String psw) {
+        {
+            try {
+                MessageDigest md5 = MessageDigest.getInstance("MD5");
+                md5.update(psw.getBytes("UTF-8"));
+                byte[] encryption = md5.digest();
+
+                StringBuffer strBuf = new StringBuffer();
+                for (int i = 0; i < encryption.length; i++) {
+                    if (Integer.toHexString(0xff & encryption[i]).length() == 1) {
+                        strBuf.append("0").append(Integer.toHexString(0xff & encryption[i]));
+                    } else {
+                        strBuf.append(Integer.toHexString(0xff & encryption[i]));
+                    }
+                }
+
+                return strBuf.toString();
+            } catch (NoSuchAlgorithmException e) {
+                return "";
+            } catch (UnsupportedEncodingException e) {
+                return "";
+            }
+        }
+    }
 
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseMenuServiceImpl.java

@@ -65,6 +65,7 @@ public class CourseMenuServiceImpl extends ServiceImpl<CourseMenuMapper, CourseM
         lqw.eq(bo.getType() != null, CourseMenu::getType, bo.getType());
         lqw.eq(bo.getParentId() != null, CourseMenu::getParentId, bo.getParentId());
         lqw.eq(bo.getStatus() != null, CourseMenu::getStatus, bo.getStatus());
+        lqw.orderByAsc(CourseMenu::getSort);
         return entity2Vo(this.list(lqw));
     }
 

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseMenuVo.java

@@ -66,6 +66,10 @@ public class CourseMenuVo {
 	/** 直播结束时间 */
 	@ApiModelProperty("直播结束时间")
 	private Long liveEndTime;
+	@ApiModelProperty("免费试卷ID")
+	private Long freeExamId;
+	@ApiModelProperty("免费试卷类型")
+	private Integer examType;
 
 	/** 章模块关系 */
 	@Excel(name = "章模块关系")

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleFreeExamVo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.course.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.zhongzheng.modules.course.domain.CourseChapterBusiness;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 课程模块视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2021-10-09
+ */
+@Data
+@ApiModel("课程模块视图对象")
+public class CourseModuleFreeExamVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 题卷类型 1试卷 2章卷 3模块卷 */
+	@Excel(name = "题卷类型 1试卷 2章卷 3模块卷")
+	@ApiModelProperty("题卷类型 1试卷 2章卷 3模块卷")
+	private Integer examType;
+	/** 赠送卷ID */
+	@Excel(name = "赠送卷ID")
+	@ApiModelProperty("赠送卷ID")
+	private Long freeExamId;
+
+}

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsBankAddBo.java

@@ -24,7 +24,7 @@ public class GoodsBankAddBo {
     @ApiModelProperty("供应方(服务)")
     private Long supplyId;
     /**商品类型 1视频2题库 3补考 4前培 */
-    @ApiModelProperty("商品类型 1视频2题库 3补考 4前培")
+    @ApiModelProperty("商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库")
     private Integer goodsType;
     /** 教育类型id */
     @ApiModelProperty("教育类型id")

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFreeBankAddBo.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 课程赠送的题库商品添加对象 goods_free_bank
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@ApiModel("课程赠送的题库商品添加对象")
+public class GoodsFreeBankAddBo {
+
+    /** 来源的课程商品ID */
+    @ApiModelProperty("来源的课程商品ID")
+    private Long fromGoodsId;
+    /** 虚拟赠送题库 */
+    @ApiModelProperty("虚拟赠送题库")
+    private Long goodsId;
+    /** 添加时间 */
+    @ApiModelProperty("添加时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 状态 1正常 0关闭 */
+    @ApiModelProperty("状态 1正常 0关闭")
+    private Integer status;
+    /** 试卷结构 */
+    @ApiModelProperty("试卷结构")
+    private String examJson;
+    /** 商品md5值 */
+    @ApiModelProperty("商品md5值")
+    private String md5;
+}

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFreeBankEditBo.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 课程赠送的题库商品编辑对象 goods_free_bank
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@ApiModel("课程赠送的题库商品编辑对象")
+public class GoodsFreeBankEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 来源的课程商品ID */
+    @ApiModelProperty("来源的课程商品ID")
+    private Long fromGoodsId;
+
+    /** 虚拟赠送题库 */
+    @ApiModelProperty("虚拟赠送题库")
+    private Long goodsId;
+
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+
+
+    /** 状态 1正常 0关闭 */
+    @ApiModelProperty("状态 1正常 0关闭")
+    private Integer status;
+
+    /** 试卷结构 */
+    @ApiModelProperty("试卷结构")
+    private String examJson;
+
+    /** 商品md5值 */
+    @ApiModelProperty("商品md5值")
+    private String md5;
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFreeBankQueryBo.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 课程赠送的题库商品分页查询对象 goods_free_bank
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("课程赠送的题库商品分页查询对象")
+public class GoodsFreeBankQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 来源的课程商品ID */
+	@ApiModelProperty("来源的课程商品ID")
+	private Long fromGoodsId;
+	/** 虚拟赠送题库 */
+	@ApiModelProperty("虚拟赠送题库")
+	private Long goodsId;
+	/** 状态 1正常 0关闭 */
+	@ApiModelProperty("状态 1正常 0关闭")
+	private Integer status;
+	/** 试卷结构 */
+	@ApiModelProperty("试卷结构")
+	private String examJson;
+	/** 商品md5值 */
+	@ApiModelProperty("商品md5值")
+	private String md5;
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsFreeBank.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.goods.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 课程赠送的题库商品对象 goods_free_bank
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("goods_free_bank")
+public class GoodsFreeBank implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 来源的课程商品ID */
+    private Long fromGoodsId;
+    /** 虚拟赠送题库 */
+    private Long goodsId;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 状态 1正常 0关闭 */
+    private Integer status;
+    /** 试卷结构 */
+    private String examJson;
+    /** 商品md5值 */
+    private String md5;
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsFreeBankMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.goods.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.goods.domain.GoodsFreeBank;
+
+/**
+ * 课程赠送的题库商品Mapper接口
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+public interface GoodsFreeBankMapper extends BaseMapper<GoodsFreeBank> {
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsFreeBankService.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.goods.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankEditBo;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankQueryBo;
+import com.zhongzheng.modules.goods.domain.GoodsFreeBank;
+import com.zhongzheng.modules.goods.vo.GoodsFreeBankVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 课程赠送的题库商品Service接口
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+public interface IGoodsFreeBankService extends IService<GoodsFreeBank> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	GoodsFreeBankVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<GoodsFreeBankVo> queryList(GoodsFreeBankQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入课程赠送的题库商品
+	 * @param bo 课程赠送的题库商品新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(GoodsFreeBankAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改课程赠送的题库商品
+	 * @param bo 课程赠送的题库商品编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(GoodsFreeBankEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -44,7 +44,7 @@ public interface IGoodsService extends IService<Goods> {
 	 */
 	Boolean insertByAddBo(GoodsAddBo bo);
 
-	Boolean insertBankByAddBo(GoodsBankAddBo bo);
+	Long insertBankByAddBo(GoodsBankAddBo bo);
 
 	/**
 	 * 根据编辑业务对象修改商品

+ 103 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsFreeBankServiceImpl.java

@@ -0,0 +1,103 @@
+package com.zhongzheng.modules.goods.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankEditBo;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankQueryBo;
+import com.zhongzheng.modules.goods.domain.GoodsFreeBank;
+import com.zhongzheng.modules.goods.mapper.GoodsFreeBankMapper;
+import com.zhongzheng.modules.goods.service.IGoodsFreeBankService;
+import com.zhongzheng.modules.goods.vo.GoodsFreeBankVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 课程赠送的题库商品Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Service
+public class GoodsFreeBankServiceImpl extends ServiceImpl<GoodsFreeBankMapper, GoodsFreeBank> implements IGoodsFreeBankService {
+
+    @Override
+    public GoodsFreeBankVo queryById(Long id){
+        GoodsFreeBank db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, GoodsFreeBankVo.class);
+    }
+
+    @Override
+    public List<GoodsFreeBankVo> queryList(GoodsFreeBankQueryBo bo) {
+        LambdaQueryWrapper<GoodsFreeBank> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getFromGoodsId() != null, GoodsFreeBank::getFromGoodsId, bo.getFromGoodsId());
+        lqw.eq(bo.getGoodsId() != null, GoodsFreeBank::getGoodsId, bo.getGoodsId());
+        lqw.eq(bo.getStatus() != null, GoodsFreeBank::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getExamJson()), GoodsFreeBank::getExamJson, bo.getExamJson());
+        lqw.eq(StrUtil.isNotBlank(bo.getMd5()), GoodsFreeBank::getMd5, bo.getMd5());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<GoodsFreeBankVo> entity2Vo(Collection<GoodsFreeBank> collection) {
+        List<GoodsFreeBankVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, GoodsFreeBankVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<GoodsFreeBank> page = (Page<GoodsFreeBank>)collection;
+            Page<GoodsFreeBankVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(GoodsFreeBankAddBo bo) {
+        GoodsFreeBank add = BeanUtil.toBean(bo, GoodsFreeBank.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(GoodsFreeBankEditBo bo) {
+        GoodsFreeBank update = BeanUtil.toBean(bo, GoodsFreeBank.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(GoodsFreeBank entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -216,7 +216,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean insertBankByAddBo(GoodsBankAddBo bo) {
+    public Long insertBankByAddBo(GoodsBankAddBo bo) {
         Goods add = BeanUtil.toBean(bo, Goods.class);
         add.setCode(ServletUtils.getEncoded("SP"));
         validEntityBeforeSave(add);
@@ -239,7 +239,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             }
             iGoodsAttachedService.saveBatch(coll);
         }
-        return result;
+        return add.getGoodsId();
     }
 
     @Override
@@ -334,7 +334,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             if (entity.getStatus() == 0 && entity.getGoodsStatus() == 1) {
                 throw new CustomException("无效商品不允许上架");
             }
-            if ((entity.getValidityEndTime() < DateUtils.getNowTime()) && entity.getGoodsStatus() == 1) {
+            if (Validator.isNotEmpty(entity.getValidityEndTime())&&entity.getValidityEndTime() < DateUtils.getNowTime() && entity.getGoodsStatus() == 1) {
                 throw new CustomException("过期商品不允许上架");
             }
         }

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsFreeBankVo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.goods.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 课程赠送的题库商品视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@ApiModel("课程赠送的题库商品视图对象")
+public class GoodsFreeBankVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 来源的课程商品ID */
+	@Excel(name = "来源的课程商品ID")
+	@ApiModelProperty("来源的课程商品ID")
+	private Long fromGoodsId;
+	/** 虚拟赠送题库 */
+	@Excel(name = "虚拟赠送题库")
+	@ApiModelProperty("虚拟赠送题库")
+	private Long goodsId;
+	/** 状态 1正常 0关闭 */
+	@Excel(name = "状态 1正常 0关闭")
+	@ApiModelProperty("状态 1正常 0关闭")
+	private Integer status;
+	/** 试卷结构 */
+	@Excel(name = "试卷结构")
+	@ApiModelProperty("试卷结构")
+	private String examJson;
+	/** 商品md5值 */
+	@Excel(name = "商品md5值")
+	@ApiModelProperty("商品md5值")
+	private String md5;
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsAddBo.java

@@ -83,4 +83,7 @@ public class OrderGoodsAddBo {
     /** 服务有效期结束 */
     @ApiModelProperty("服务有效期结束")
     private Long serviceEndTime;
+    /** 关闭原因 */
+    @ApiModelProperty("关闭原因")
+    private String closeReason;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsEditBo.java

@@ -104,4 +104,7 @@ public class OrderGoodsEditBo {
     /** 服务有效期结束 */
     @ApiModelProperty("服务有效期结束")
     private Long serviceEndTime;
+    /** 关闭原因 */
+    @ApiModelProperty("关闭原因")
+    private String closeReason;
 }

+ 36 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsFreeAddBo.java

@@ -0,0 +1,36 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 订单商品赠送题库商品添加对象 order_goods_free
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@ApiModel("订单商品赠送题库商品添加对象")
+public class OrderGoodsFreeAddBo {
+
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+    /** 赠送题库商品ID */
+    @ApiModelProperty("赠送题库商品ID")
+    private Long freeGoodsId;
+    /** 添加时间 */
+    @ApiModelProperty("添加时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 状态 1正常 0关闭 */
+    @ApiModelProperty("状态 1正常 0关闭")
+    private Integer status;
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsFreeEditBo.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 订单商品赠送题库商品编辑对象 order_goods_free
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@ApiModel("订单商品赠送题库商品编辑对象")
+public class OrderGoodsFreeEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    /** 赠送题库商品ID */
+    @ApiModelProperty("赠送题库商品ID")
+    private Long freeGoodsId;
+
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+
+
+    /** 状态 1正常 0关闭 */
+    @ApiModelProperty("状态 1正常 0关闭")
+    private Integer status;
+
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderGoodsFreeQueryBo.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 订单商品赠送题库商品分页查询对象 order_goods_free
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("订单商品赠送题库商品分页查询对象")
+public class OrderGoodsFreeQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 订单商品ID */
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
+	/** 赠送题库商品ID */
+	@ApiModelProperty("赠送题库商品ID")
+	private Long freeGoodsId;
+	/** 状态 1正常 0关闭 */
+	@ApiModelProperty("状态 1正常 0关闭")
+	private Integer status;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java

@@ -82,4 +82,6 @@ private static final long serialVersionUID=1L;
     private Long serviceStartTime;
     /** 服务有效期结束 */
     private Long serviceEndTime;
+    /** 关闭原因 */
+    private String closeReason;
 }

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoodsFree.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.order.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 订单商品赠送题库商品对象 order_goods_free
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("order_goods_free")
+public class OrderGoodsFree implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 订单商品ID */
+    private Long orderGoodsId;
+    /** 赠送题库商品ID */
+    private Long freeGoodsId;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 状态 1正常 0关闭 */
+    private Integer status;
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderGoodsFreeMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.order.domain.OrderGoodsFree;
+
+/**
+ * 订单商品赠送题库商品Mapper接口
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+public interface OrderGoodsFreeMapper extends BaseMapper<OrderGoodsFree> {
+
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderGoodsFreeService.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.order.bo.OrderGoodsFreeAddBo;
+import com.zhongzheng.modules.order.bo.OrderGoodsFreeEditBo;
+import com.zhongzheng.modules.order.bo.OrderGoodsFreeQueryBo;
+import com.zhongzheng.modules.order.domain.OrderGoodsFree;
+import com.zhongzheng.modules.order.vo.OrderGoodsFreeVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 订单商品赠送题库商品Service接口
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+public interface IOrderGoodsFreeService extends IService<OrderGoodsFree> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	OrderGoodsFreeVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<OrderGoodsFreeVo> queryList(OrderGoodsFreeQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入订单商品赠送题库商品
+	 * @param bo 订单商品赠送题库商品新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(OrderGoodsFreeAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改订单商品赠送题库商品
+	 * @param bo 订单商品赠送题库商品编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(OrderGoodsFreeEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java

@@ -94,4 +94,6 @@ public interface IOrderService extends IService<Order> {
 	List<OrderListVo> getConsoleOrder(ConsoleQueryBo bo);
 
 	Integer getConsoleRebuyNum(ConsoleQueryBo bo);
+
+	Long newFreeBankGoods(Long goodsId,Long orderGoodsId);
 }

+ 102 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsFreeServiceImpl.java

@@ -0,0 +1,102 @@
+package com.zhongzheng.modules.order.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.order.bo.OrderGoodsFreeAddBo;
+import com.zhongzheng.modules.order.bo.OrderGoodsFreeEditBo;
+import com.zhongzheng.modules.order.bo.OrderGoodsFreeQueryBo;
+import com.zhongzheng.modules.order.domain.OrderGoodsFree;
+import com.zhongzheng.modules.order.mapper.OrderGoodsFreeMapper;
+import com.zhongzheng.modules.order.service.IOrderGoodsFreeService;
+import com.zhongzheng.modules.order.vo.OrderGoodsFreeVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 订单商品赠送题库商品Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Service
+public class OrderGoodsFreeServiceImpl extends ServiceImpl<OrderGoodsFreeMapper, OrderGoodsFree> implements IOrderGoodsFreeService {
+
+    @Override
+    public OrderGoodsFreeVo queryById(Long id){
+        OrderGoodsFree db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, OrderGoodsFreeVo.class);
+    }
+
+    @Override
+    public List<OrderGoodsFreeVo> queryList(OrderGoodsFreeQueryBo bo) {
+        LambdaQueryWrapper<OrderGoodsFree> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getOrderGoodsId() != null, OrderGoodsFree::getOrderGoodsId, bo.getOrderGoodsId());
+        lqw.eq(bo.getFreeGoodsId() != null, OrderGoodsFree::getFreeGoodsId, bo.getFreeGoodsId());
+        lqw.eq(bo.getStatus() != null, OrderGoodsFree::getStatus, bo.getStatus());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<OrderGoodsFreeVo> entity2Vo(Collection<OrderGoodsFree> collection) {
+        List<OrderGoodsFreeVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, OrderGoodsFreeVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<OrderGoodsFree> page = (Page<OrderGoodsFree>)collection;
+            Page<OrderGoodsFreeVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(OrderGoodsFreeAddBo bo) {
+        OrderGoodsFree add = BeanUtil.toBean(bo, OrderGoodsFree.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(OrderGoodsFreeEditBo bo) {
+        OrderGoodsFree update = BeanUtil.toBean(bo, OrderGoodsFree.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(OrderGoodsFree entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java

@@ -167,6 +167,7 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                     throw new CustomException("补考次数/前培次数已经被使用,不符号关闭条件");
                 }
             }
+            orderGoods.setCloseReason(bo.getCloseReason());
             orderGoods.setStatus(bo.getStatus());
             orderGoods.setUpdateTime(DateUtils.getNowTime());
             updateById(orderGoods);

+ 126 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -10,13 +10,25 @@ import com.zhongzheng.common.core.redis.RedisLockEntity;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.modules.bank.domain.QuestionChapterExam;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.service.IShoppingCartService;
+import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.service.ICourseBusinessService;
+import com.zhongzheng.modules.course.service.ICourseMenuService;
 import com.zhongzheng.modules.course.vo.CourseBusinessVo;
+import com.zhongzheng.modules.course.vo.CourseMenuVo;
+import com.zhongzheng.modules.course.vo.CourseModuleFreeExamVo;
+import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.goods.bo.GoodsAttachedAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsBankAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsFreeBankAddBo;
 import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.domain.GoodsFreeBank;
+import com.zhongzheng.modules.goods.service.IGoodsCourseService;
+import com.zhongzheng.modules.goods.service.IGoodsFreeBankService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserTempQueryBo;
@@ -81,10 +93,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private IClassGradeUserService iClassGradeUserService;
     @Autowired
     private IClassGradeGoodsService iClassGradeGoodsService;
-
+    @Autowired
+    private IGoodsCourseService iGoodsCourseService;
     @Autowired
     private IOrderBillSheetService iOrderBillSheetService;
-
+    @Autowired
+    private ICourseMenuService iCourseMenuService;
     @Autowired
     private IProfileTpService iProfileTpService;
 
@@ -112,6 +126,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private IUserExamGoodsService userExamGoodsService;
 
+    @Autowired
+    private IGoodsFreeBankService iGoodsFreeBankService;
+
+    @Autowired
+    private IOrderGoodsFreeService iOrderGoodsFreeService;
+
     @Autowired
     private RedisCache redisCache;
 
@@ -349,6 +369,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     throw new CustomException("分班错误");
                 }
                 iOrderGoodsService.updateById(orderGoods);
+                newFreeBankGoods(goods.getGoodsId(), orderGoods.getOrderGoodsId());
             }
 
             if (!canRepeatBuy && goods.getGoodsType() != 3 && goods.getGoodsType() != 4) {
@@ -481,6 +502,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     throw new CustomException("分班错误",510);
                 }
                 iOrderGoodsService.updateById(orderGoods);
+                newFreeBankGoods(goods.getGoodsId(), orderGoods.getOrderGoodsId());
             }
 
             if (!canRepeatBuy && goods.getGoodsType() != 3 && goods.getGoodsType() != 4) {
@@ -653,6 +675,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     redisCache.unlockLua(redisLockEntity);
                 }
                 iOrderGoodsService.updateById(orderGoods);
+                newFreeBankGoods(goods.getGoodsId(), orderGoods.getOrderGoodsId());
             }
 
             if (!canRepeatBuy && goods.getGoodsType() != 3 && goods.getGoodsType() != 4) {
@@ -796,6 +819,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     redisCache.unlockLua(redisLockEntity);
                 }
                 iOrderGoodsService.updateById(orderGoods);
+                newFreeBankGoods(goods.getGoodsId(), orderGoods.getOrderGoodsId());
             }
 
             if (!canRepeatBuy && goods.getGoodsType() != 3 && goods.getGoodsType() != 4) {
@@ -1053,6 +1077,106 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return baseMapper.getConsoleRebuyNum(bo);
     }
 
+    /**
+     * 课程商品ID产生免费的题库商品
+     * @param goodsId
+     * @return
+     */
+    @Override
+    public Long newFreeBankGoods(Long goodsId, Long orderGoodsId) {
+        Long freeBankGoodsId = null;
+        String key = "FREEBANK-" + "-" + goodsId;
+        Long value = redisCache.getCacheObject(key);
+        if (Validator.isNotEmpty(value)) {
+            freeBankGoodsId = value;
+            if(freeBankGoodsId.longValue()<0){
+                freeBankGoodsId = null;
+            }
+        }
+        List<CourseModuleFreeExamVo> moduleExamList = new ArrayList<>();
+        if(Validator.isEmpty(freeBankGoodsId)){
+            List<CourseVo> courseVoList = iGoodsCourseService.selectList(goodsId);
+            for(CourseVo vo : courseVoList){
+                CourseMenuQueryBo bo = new CourseMenuQueryBo();
+                bo.setCourseId(vo.getCourseId());
+                bo.setType(1);//过滤模块
+                List<CourseMenuVo> moduleList = iCourseMenuService.selectList(bo);
+                for(CourseMenuVo menuVo : moduleList){
+                    if(Validator.isNotEmpty(menuVo.getExamType())&&Validator.isNotEmpty(menuVo.getFreeExamId())){
+                        //获取模块绑定的免费卷ID
+                        CourseModuleFreeExamVo freeExamVo = BeanUtil.toBean(menuVo, CourseModuleFreeExamVo.class);
+                        boolean hasExit = false;
+                        for(int i=0;i<moduleExamList.size();i++){
+                            if(moduleExamList.get(i).getExamType()==freeExamVo.getExamType()&&moduleExamList.get(i).getFreeExamId().longValue()==freeExamVo.getFreeExamId().longValue()){
+                                hasExit = true;
+                                break;
+                            }
+                        }
+                        if(!hasExit){
+                            moduleExamList.add(freeExamVo);
+                        }
+                    }
+                }
+            }
+            //课程模块有赠送的试卷
+            if(moduleExamList.size()>0){
+                String jsonList = JSON.toJSONString(moduleExamList);
+                String examListMd5 = ToolsUtils.StringToMd5(jsonList);
+                //判断该课程商品是否已经存在相同结构的赠送卷商品
+                GoodsFreeBank freeBank = iGoodsFreeBankService.getOne(new LambdaQueryWrapper<GoodsFreeBank>().eq(GoodsFreeBank::getFromGoodsId, goodsId)
+                        .eq(GoodsFreeBank::getMd5, examListMd5));
+                if(Validator.isNotEmpty(freeBank)){
+                    freeBankGoodsId = freeBank.getGoodsId();//赠送的商品ID
+                }else{
+                    Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId, goodsId));//获取课程商品
+                    String code = ServletUtils.getEncoded("ZS");
+                    //创建赠送卷商品
+                    GoodsBankAddBo addBo = new GoodsBankAddBo();
+                    addBo.setGoodsType(5);
+                    String goodsName = goods.getGoodsName()+"-"+code;
+                    addBo.setGoodsName(goodsName);
+                    addBo.setEducationTypeId(goods.getEducationTypeId());
+                    addBo.setProjectId(goods.getProjectId());
+                    addBo.setBusinessId(goods.getBusinessId());
+                    addBo.setMajorId(goods.getMajorId());
+                    addBo.setCoverUrl("oss/images/avatar/20211013/1634097664410_1397766697");
+                    List<GoodsAttachedAddBo> bankList = new ArrayList<>();
+                    int sort = 1;
+                    for(CourseModuleFreeExamVo menuVo :moduleExamList){
+                        GoodsAttachedAddBo attachedAddBo = new GoodsAttachedAddBo();
+                        attachedAddBo.setType(menuVo.getExamType());
+                        attachedAddBo.setMajorId(menuVo.getFreeExamId());
+                        attachedAddBo.setSort(sort);
+                        sort++;
+                        bankList.add(attachedAddBo);
+                    }
+                    addBo.setBankList(bankList);
+                    addBo.setStatus(1);
+                    addBo.setGoodsStatus(1);
+                    addBo.setStandPrice(new BigDecimal(0));
+                    freeBankGoodsId = iGoodsService.insertBankByAddBo(addBo);
+                    GoodsFreeBankAddBo bankAddBo = new GoodsFreeBankAddBo();
+                    bankAddBo.setGoodsId(freeBankGoodsId);
+                    bankAddBo.setFromGoodsId(goodsId);
+                    bankAddBo.setExamJson(jsonList);
+                    bankAddBo.setMd5(examListMd5);
+                    iGoodsFreeBankService.insertByAddBo(bankAddBo);
+                }
+            }
+        }
+        if(Validator.isNotEmpty(freeBankGoodsId)){
+            OrderGoodsFreeAddBo goodsFreeAddBo = new OrderGoodsFreeAddBo();
+            goodsFreeAddBo.setFreeGoodsId(freeBankGoodsId);
+            goodsFreeAddBo.setOrderGoodsId(orderGoodsId);
+            iOrderGoodsFreeService.insertByAddBo(goodsFreeAddBo);
+        }else{
+            freeBankGoodsId = -1L; //课程商品不存在免费题库商品
+        }
+        redisCache.setCacheObject(key, freeBankGoodsId, 10, TimeUnit.SECONDS);
+
+        return freeBankGoodsId;
+    }
+
     //判断视频商品是否购买过且服务期是否过期
     public Long getHaveBuyGoods(Long goodsId, Long userId) {
         OrderGoodsQueryBo orderGoodsQueryBo = new OrderGoodsQueryBo();

+ 39 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsFreeVo.java

@@ -0,0 +1,39 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 订单商品赠送题库商品视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2022-05-24
+ */
+@Data
+@ApiModel("订单商品赠送题库商品视图对象")
+public class OrderGoodsFreeVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 订单商品ID */
+	@Excel(name = "订单商品ID")
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
+	/** 赠送题库商品ID */
+	@Excel(name = "赠送题库商品ID")
+	@ApiModelProperty("赠送题库商品ID")
+	private Long freeGoodsId;
+	/** 状态 1正常 0关闭 */
+	@Excel(name = "状态 1正常 0关闭")
+	@ApiModelProperty("状态 1正常 0关闭")
+	private Integer status;
+}

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/OrderGoodsVo.java

@@ -204,4 +204,10 @@ public class OrderGoodsVo {
 	@ApiModelProperty("开班状态 0未开班(预报名) 1开班")
 	private Integer classStatus;
 
+	/** 关闭原因 */
+	@Excel(name = "关闭原因")
+	@ApiModelProperty("关闭原因")
+	private String closeReason;
+
+
 }

+ 22 - 1
zhongzheng-system/src/main/resources/mapper/modules/course/CourseMenuMapper.xml

@@ -31,6 +31,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="liveEndTime" column="live_end_time"/>
         <result property="recordingUrl" column="recording_url"/>
         <result property="liveUrl" column="live_url"/>
+        <result property="examType" column="exam_type"/>
+        <result property="freeExamId" column="free_exam_id"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.course.vo.CourseUserMenuVo" id="CourseUserMenuVo">
@@ -83,7 +85,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     ''
                 WHEN m.type = 3 THEN
                     cs.recording_url
-                END recording_url
+                END recording_url,
+            CASE
+            WHEN m.type = 1 THEN
+            cm.exam_type
+            WHEN m.type = 2 THEN
+            NULL
+            WHEN m.type = 3 THEN
+                NULL
+            END exam_type,
+            CASE
+            WHEN m.type = 1 THEN
+            cm.free_exam_id
+            WHEN m.type = 2 THEN
+            NULL
+            WHEN m.type = 3 THEN
+            NULL
+            END free_exam_id
 
         FROM
             course_menu m
@@ -95,6 +113,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND m.type = 3
         WHERE
             m.course_id = #{courseId}
+        <if test="type != null and type != ''">
+            AND m.type = #{type}
+        </if>
         ORDER BY m.sort asc
     </select>
 

+ 1 - 0
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsCourseMapper.xml

@@ -69,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN course_subject cs ON cs.id = c.subject_id
         WHERE
         gc.goods_id = #{goodsId} AND c.`status` = 1
+        order by gc.sort
     </select>
 
     <select id="selectListMore" parameterType="com.zhongzheng.modules.goods.bo.GoodsCourseQueryBo" resultMap="CourseMoreResultVo">

+ 17 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsFreeMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhongzheng.modules.order.mapper.OrderGoodsFreeMapper">
+
+    <resultMap type="com.zhongzheng.modules.order.domain.OrderGoodsFree" id="OrderGoodsFreeResult">
+        <result property="id" column="id"/>
+        <result property="orderGoodsId" column="order_goods_id"/>
+        <result property="freeGoodsId" column="free_goods_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="status" column="status"/>
+    </resultMap>
+
+
+</mapper>

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml

@@ -29,6 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="studyCount" column="study_count"/>
         <result property="serviceStartTime" column="service_start_time"/>
         <result property="serviceEndTime" column="service_end_time"/>
+        <result property="closeReason" column="close_reason"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.order.vo.OrderGoodsVo" id="OrderGoodsResultVo">
@@ -80,6 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="learnStatus" column="learn_status"/>
         <result property="officialStatus" column="official_status"/>
         <result property="classStatus" column="class_status"/>
+        <result property="closeReason" column="close_reason"/>
     </resultMap>
 
     <select id="selectList" parameterType="com.zhongzheng.modules.order.bo.OrderGoodsQueryBo" resultMap="OrderGoodsResultVo">