yangdamao 2 年之前
父節點
當前提交
e2c31b4630

+ 16 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/goods/TopGoodsController.java

@@ -2,7 +2,10 @@ package com.zhongzheng.controller.goods;
 
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopGoodsQueryBo;
 import com.zhongzheng.modules.top.goods.service.ITopGoodsService;
+import com.zhongzheng.modules.top.goods.vo.TopGoodsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -11,6 +14,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * 商品Controller
  *
@@ -43,4 +48,15 @@ public class TopGoodsController extends BaseController {
         return toAjax(iTopGoodsService.goodsBatchCopyDisposeTenant() ? 1 : 0);
     }
 
+    /**
+     * 查询商品列表
+     */
+    @ApiOperation("查询商品列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopGoodsVo> list(TopGoodsQueryBo bo) {
+        startPage();
+        List<TopGoodsVo> list = iTopGoodsService.selectList(bo);
+        return getDataTable(list);
+    }
+
 }

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

@@ -120,6 +120,5 @@ public interface IGoodsService extends IService<Goods> {
 
     boolean updateGoodsRepair(UpdateGoodsRepairBo bo);
 
-	List<Goods> getList(Long tenantId);
 
 }

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

@@ -84,7 +84,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
@@ -105,7 +104,6 @@ import static java.math.RoundingMode.HALF_UP;
  */
 @Service
 @DS("slave")
-@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
 public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements IGoodsService {
 
 
@@ -4154,10 +4152,6 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return true;
     }
 
-    @Override
-    public List<Goods> getList(Long tenantId) {
-       return list(new LambdaQueryWrapper<Goods>().eq(Goods::getTenantId,tenantId));
-    }
 
     private Long getNewId(Long oldId, Integer type){
         if (ObjectUtils.isNull(oldId) || oldId <= 0L){

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/mapper/TopGoodsMapper.java

@@ -1,7 +1,11 @@
 package com.zhongzheng.modules.top.goods.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.goods.bo.TopGoodsQueryBo;
 import com.zhongzheng.modules.top.goods.domain.TopGoods;
+import com.zhongzheng.modules.top.goods.vo.TopGoodsVo;
+
+import java.util.List;
 
 /**
  * 商品Mapper接口
@@ -11,4 +15,5 @@ import com.zhongzheng.modules.top.goods.domain.TopGoods;
  */
 public interface TopGoodsMapper extends BaseMapper<TopGoods> {
 
+    List<TopGoodsVo> selectAllList(TopGoodsQueryBo bo);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/ITopGoodsService.java

@@ -53,4 +53,6 @@ public interface ITopGoodsService extends IService<TopGoods> {
     boolean goodsBatchCopyTenant();
 
     boolean goodsBatchCopyDisposeTenant();
+
+	List<TopGoodsVo> selectList(TopGoodsQueryBo bo);
 }

+ 126 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopGoodsServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.top.goods.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -9,18 +10,28 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
+import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.bank.domain.*;
 import com.zhongzheng.modules.bank.service.*;
 import com.zhongzheng.modules.base.domain.*;
 import com.zhongzheng.modules.base.service.*;
+import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.domain.*;
 import com.zhongzheng.modules.course.service.*;
+import com.zhongzheng.modules.course.vo.CourseChapterSectionVo;
+import com.zhongzheng.modules.course.vo.CourseMenuVo;
+import com.zhongzheng.modules.course.vo.CourseModuleChapterVo;
+import com.zhongzheng.modules.course.vo.CourseVo;
 import com.zhongzheng.modules.exam.domain.ExamPaper;
 import com.zhongzheng.modules.exam.service.IExamPaperService;
+import com.zhongzheng.modules.goods.bo.GoodsCourseQueryBo;
+import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.domain.*;
 import com.zhongzheng.modules.goods.service.*;
+import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
+import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.pay.domain.PayServe;
 import com.zhongzheng.modules.pay.domain.PaySupply;
 import com.zhongzheng.modules.pay.service.IPayServeService;
@@ -30,6 +41,8 @@ import com.zhongzheng.modules.polyv.domain.PolyvVideo;
 import com.zhongzheng.modules.polyv.service.IPolyvCataService;
 import com.zhongzheng.modules.polyv.service.IPolyvVideoService;
 import com.zhongzheng.modules.system.bo.GoodsCopyEnum;
+import com.zhongzheng.modules.system.domain.SysGoodsCopyRecord;
+import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.top.goods.bo.TopGoodsAddBo;
 import com.zhongzheng.modules.top.goods.bo.TopGoodsEditBo;
 import com.zhongzheng.modules.top.goods.bo.TopGoodsQueryBo;
@@ -42,12 +55,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
+import static java.math.RoundingMode.HALF_UP;
+
 /**
  * 商品Service业务层处理
  *
@@ -385,14 +399,13 @@ public class TopGoodsServiceImpl extends ServiceImpl<TopGoodsMapper, TopGoods> i
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+//    @Transactional(rollbackFor = Exception.class)
     public boolean goodsBatchCopyTenant() {
         List<TopGoodsCopy> copyRecordList = new ArrayList<>();
         Long tenantId = 867735392558919680L;
         //全量同步
         // 1 goods
-//        List<Goods> goodsList = iGoodsService.list(new LambdaQueryWrapper<Goods>().eq(Goods::getTenantId,tenantId));
-        List<Goods> goodsList = iGoodsService.getList(tenantId);
+        List<Goods> goodsList = iGoodsService.list(new LambdaQueryWrapper<Goods>().eq(Goods::getTenantId,tenantId));
         if (CollectionUtils.isEmpty(goodsList)){
             return true;
         }
@@ -1318,7 +1331,9 @@ public class TopGoodsServiceImpl extends ServiceImpl<TopGoodsMapper, TopGoods> i
             //所属专业
             goods.setMajorId(getNewId(goods.getMajorId(), GoodsCopyEnum.MAJOR.getType()));
             //项目
-            goods.setProjectId(getNewId(goods.getProjectId().longValue(), GoodsCopyEnum.COURSE_PROJECT_TYPE.getType()));
+            if (ObjectUtils.isNotNull(goods.getProjectId())){
+                goods.setProjectId(getNewId(goods.getProjectId().longValue(), GoodsCopyEnum.COURSE_PROJECT_TYPE.getType()));
+            }
             //讲义
             goods.setHandoutsId(getNewId(goods.getHandoutsId(), GoodsCopyEnum.COURSE_HANDOUTS.getType()));
             //科目
@@ -1874,4 +1889,107 @@ public class TopGoodsServiceImpl extends ServiceImpl<TopGoodsMapper, TopGoods> i
         return records.stream().map(x -> x.getNewId().toString()).collect(Collectors.joining(","));
     }
 
+
+    @Override
+    @DataScope(businessAlias = "cb")
+    public List<TopGoodsVo> selectList(TopGoodsQueryBo bo) {
+        if (Validator.isNotEmpty(bo.getGoodsName())) {
+            bo.setGoodsName(bo.getGoodsName().trim());
+        }
+        List<TopGoodsVo> list = baseMapper.selectAllList(bo);
+        if (Validator.isNotEmpty(bo.getSectionNum()) && bo.getSectionNum().longValue() == 1) {
+            for (GoodsVo vo : list) {
+                Long sectionNum = baseMapper.getSectionNum(vo.getGoodsId());
+                vo.setSectionNum(sectionNum);
+            }
+        }
+        if (Validator.isNotEmpty(bo.getGoodsType()) && bo.getGoodsType() == 2) {
+            for (GoodsVo vo : list) {
+                Long totalNum = getExamNum(vo.getGoodsId());
+                vo.setTotalExamNum(totalNum);
+            }
+        }
+        list.forEach(goods -> {
+            //多规格下的价格区间
+            if (ObjectUtils.isNotNull(goods.getSpecTemplateId())) {
+                List<GoodsSpecAttributeRelation> specAttributeRelations = goodsSpecAttributeRelationService
+                        .list(new LambdaQueryWrapper<GoodsSpecAttributeRelation>()
+                                .eq(GoodsSpecAttributeRelation::getSpecTemplateId, goods.getSpecTemplateId()));
+                if (CollectionUtils.isNotEmpty(specAttributeRelations)) {
+                    List<Long> goodsIds = specAttributeRelations.stream().filter(x -> ObjectUtils.isNotNull(x.getGoodsId())).map(GoodsSpecAttributeRelation::getGoodsId).collect(Collectors.toList());
+                    List<Goods> goodsList = listByIds(goodsIds);
+                    //从小到大排序
+                    List<Goods> collect = goodsList.stream().filter(x -> ObjectUtils.isNotNull(x.getStandPrice())).sorted(Comparator.comparing(Goods::getStandPrice)).collect(Collectors.toList());
+                    goods.setMinPrice(collect.get(0).getStandPrice());
+                    goods.setMaxPrice(collect.get(collect.size() - 1).getStandPrice());
+                }
+            }
+            //是否包含每日一练试卷
+            if (goods.getGoodsType() == 2) {
+                //题库商品
+                List<BankGoodsExamVo> examVos = questionMapper.getBankGoodsExamList(goods.getGoodsId());
+                if (examVos.stream().filter(x -> StringUtils.isNotBlank(x.getPaperName())).anyMatch(x -> x.getPaperName().equals("每日一练"))) {
+                    goods.setExamRecord(1);
+                } else {
+                    goods.setExamRecord(0);
+                }
+            } else {
+                goods.setExamRecord(0);
+            }
+
+            //商品同步新机构时间
+            List<SysGoodsCopyRecord> copyRecords = iSysGoodsCopyRecordService.getGoodsCopy(goods.getGoodsId(),GoodsCopyEnum.GOODS.getType());
+            if (CollectionUtils.isNotEmpty(copyRecords)){
+                Map<Long, List<SysGoodsCopyRecord>> map = copyRecords.stream().collect(Collectors.groupingBy(SysGoodsCopyRecord::getTenantId));
+                List<String> msg = new ArrayList<>();
+                map.forEach((k,v) -> {
+                    SysGoodsCopyRecord record = v.stream().sorted(Comparator.comparing(SysGoodsCopyRecord::getCreateTime).reversed()).collect(Collectors.toList()).stream().findFirst().get();
+                    SysTenant tenant = iSysTenantService.getById(record.getTenantId());
+                    msg.add(String.format("%s【最新同步时间:%s】",tenant.getTenantName(),DateUtils.timestampToDateFormat(record.getCreateTime(),"yyyy-MM-dd HH:mm:ss")));
+                });
+                goods.setCopyTime(msg);
+            }
+        });
+        //继教二建统计学时
+        if (Validator.isNotEmpty(bo.getChapterNum())) {
+            list.forEach(goodsVo -> {
+                AtomicReference<Double> classHours = new AtomicReference<>(0.0);
+                //查询课程列表
+                GoodsCourseQueryBo courseQueryBo = new GoodsCourseQueryBo();
+                courseQueryBo.setGoodsId(goodsVo.getGoodsId());
+                List<CourseVo> courseVoList = iGoodsCourseService.selectList(courseQueryBo);
+                if (courseVoList != null && courseVoList.size() > 0) {
+                    courseVoList.forEach(courseVo -> {
+                        //获取模块信息
+                        CourseMenuQueryBo bo1 = new CourseMenuQueryBo();
+                        bo1.setCourseId(courseVo.getCourseId());
+                        List<CourseMenuVo> courseMenuVoList = iCourseMenuService.selectList(bo1);
+                        if (courseMenuVoList != null && courseMenuVoList.size() > 0) {
+                            courseMenuVoList.forEach(courseMenuVo -> {
+                                classHours.updateAndGet(v -> v + Math.round(courseMenuVo.getClassHours()));
+                                //获取章信息
+                                List<CourseModuleChapterVo> courseModuleChapterVoList = iCourseModuleChapterService.getListById(courseMenuVo.getMenuId());
+                                AtomicReference<Double> chapterHours = new AtomicReference<>(0.0);
+                                if (courseModuleChapterVoList != null && courseModuleChapterVoList.size() > 0) {
+                                    courseModuleChapterVoList.forEach(courseModuleChapterVo -> {
+                                        //获取节信息
+                                        List<CourseChapterSectionVo> courseChapterSectionVoList = iCourseChapterSectionService.getListById(courseModuleChapterVo.getChapterId());
+                                        if (courseChapterSectionVoList != null && courseChapterSectionVoList.size() > 0) {
+                                            courseChapterSectionVoList.forEach(courseChapterSectionVo -> {
+                                                chapterHours.updateAndGet(v -> v + courseChapterSectionVo.getClassHours());
+                                            });
+                                        }
+                                    });
+                                }
+                                classHours.updateAndGet(v -> v + Math.round(chapterHours.get()));
+                            });
+                        }
+                    });
+                }
+                goodsVo.setClassHours((new BigDecimal(String.valueOf(classHours))).setScale(0, HALF_UP));
+            });
+        }
+        return list;
+    }
+
 }

+ 143 - 32
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/vo/TopGoodsVo.java

@@ -1,20 +1,19 @@
-package com.zhongzheng.modules.top.goods.vo;
+package com.zhongzheng.modules.goods.vo;
 
 import com.zhongzheng.common.annotation.Excel;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import java.math.BigDecimal;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import java.util.Date;
 
+import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
  * 商品视图对象 mall_package
  *
- * @author ruoyi
- * @date 2023-03-15
+ * @author hjl
+ * @date 2021-10-12
  */
 @Data
 @ApiModel("商品视图对象")
@@ -29,13 +28,13 @@ public class TopGoodsVo {
 	@Excel(name = "年份")
 	@ApiModelProperty("年份")
 	private Long year;
-	/** 供应方id */
-	@Excel(name = "供应方id")
-	@ApiModelProperty("供应方id")
+	/** 供应方(服务) */
+	@Excel(name = "供应方" , readConverterExp = "服=务")
+	@ApiModelProperty("供应方(服务)")
 	private Long supplyId;
-	/** 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播 */
-	@Excel(name = "商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
-	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播")
+	/** $column.columnComment */
+	@Excel(name = "供应方" , readConverterExp = "商品类型 1视频2题库 3补考 4前培 ")
+	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 ")
 	private Integer goodsType;
 	/** 教育类型id */
 	@Excel(name = "教育类型id")
@@ -69,6 +68,11 @@ public class TopGoodsVo {
 	@Excel(name = "状态 1有效 0无效")
 	@ApiModelProperty("状态 1有效 0无效")
 	private Integer status;
+
+	/** 班级*/
+	@Excel(name = "班级")
+	@ApiModelProperty("班级")
+	private Long gradeId;
 	/** 有效期开始 */
 	@Excel(name = "有效期开始")
 	@ApiModelProperty("有效期开始")
@@ -129,10 +133,29 @@ public class TopGoodsVo {
 	@Excel(name = "编码")
 	@ApiModelProperty("编码")
 	private String code;
+	@ApiModelProperty("创建时间")
+	private Long createTime;
+	@ApiModelProperty("更新试卷")
+	private Long updateTime;
+	@ApiModelProperty("供应方名称")
+	private String supplyName;
 	/** 项目ID */
 	@Excel(name = "项目ID")
 	@ApiModelProperty("项目ID")
 	private Long projectId;
+
+
+	@ApiModelProperty("教育名称")
+	private String educationName;
+	@ApiModelProperty("项目名称")
+	private String projectName;
+	@ApiModelProperty("业务名称")
+	private String businessName;
+	@ApiModelProperty("学校名称")
+	private String schoolName;
+	@ApiModelProperty("专业名称")
+	private String categoryName;
+
 	/** 试听设置 */
 	@Excel(name = "试听设置")
 	@ApiModelProperty("试听设置")
@@ -141,18 +164,46 @@ public class TopGoodsVo {
 	@Excel(name = "拍照设置")
 	@ApiModelProperty("拍照设置")
 	private String goodsPhotographConfig;
+
+	/** 试卷拍照设置 */
+	@Excel(name = "试卷拍照设置")
+	@ApiModelProperty("试卷拍照设置")
+	private String goodsPhotoExamConfig;
 	/** 播放设置 */
 	@Excel(name = "播放设置")
 	@ApiModelProperty("播放设置")
 	private String goodsPlayConfig;
+
+	@ApiModelProperty("试听配置列表")
+	private List<GoodsAuditionConfigVo> auditionList;
+
+	@ApiModelProperty("播放设置")
+	private GoodsPlayConfigVo goodsPlayConfigVo;
+
+	@ApiModelProperty("拍照设置")
+	private GoodsPhotographConfigVo goodsPhotographConfigVo;
+
+	@ApiModelProperty("试卷拍照设置")
+	private GoodsPhotoExamConfigVo goodsPhotoExamConfigVo;
+
+	@ApiModelProperty("试卷试做配置列表")
+	private List<GoodsExamConfigVo> examConfigList;
+
 	/** 试卷试做设置 */
-	@Excel(name = "试卷试做设置")
 	@ApiModelProperty("试卷试做设置")
 	private String goodsExamConfig;
-	/** 讲义id */
-	@Excel(name = "讲义id")
+
 	@ApiModelProperty("讲义id")
 	private Long handoutsId;
+
+	/** 模板类型置 */
+	@ApiModelProperty("模板类型置")
+	private String templateType;
+
+	/** 学时 */
+	@Excel(name = "学时")
+	@ApiModelProperty("学时")
+	private Long period;
 	/** 补考或前培开始时间 */
 	@Excel(name = "补考或前培开始时间")
 	@ApiModelProperty("补考或前培开始时间")
@@ -163,16 +214,33 @@ public class TopGoodsVo {
 	private Long makeEndTime;
 	/** 学习次数 */
 	@Excel(name = "学习次数")
-	@ApiModelProperty("学习次数")
+	@ApiModelProperty("学习次数 前培次数,考培次数")
 	private Long studyCount;
-	/** 试卷拍照设置 */
-	@Excel(name = "试卷拍照设置")
-	@ApiModelProperty("试卷拍照设置")
-	private String goodsPhotoExamConfig;
+
 	/** 前培和补考商品关联 */
 	@Excel(name = "前培和补考商品关联")
 	@ApiModelProperty("前培和补考商品关联")
 	private Long makeGoodsId;
+
+	/** 前培和补考商品关联 */
+	@Excel(name = "前培和补考商品关联")
+	@ApiModelProperty("前培和补考商品关联商品名")
+	private String makeGoodsName;
+
+	/** 前培和补考商品关联 */
+	@Excel(name = "前培和补考商品关联")
+	@ApiModelProperty("前培和补考商品关联编码")
+	private String makeGoodsCode;
+
+	@ApiModelProperty("课程数量")
+	private Long courseNum;
+
+	@ApiModelProperty("章数量")
+	private Long chapterNum;
+
+	@ApiModelProperty("节数量")
+	private Long sectionNum;
+
 	/** 服务期类型 1年 2月 3日 4区间 */
 	@Excel(name = "服务期类型 1年 2月 3日 4区间")
 	@ApiModelProperty("服务期类型 1年 2月 3日 4区间")
@@ -181,10 +249,18 @@ public class TopGoodsVo {
 	@Excel(name = "服务期数值")
 	@ApiModelProperty("服务期数值")
 	private Long serviceTimeNum;
+
+	@ApiModelProperty("班级数量")
+	private Long gradeNum;
+
 	/** 每天最大节学习数量 */
 	@Excel(name = "每天最大节学习数量")
 	@ApiModelProperty("每天最大节学习数量")
 	private Long sectionMaxNum;
+
+	@ApiModelProperty("班级名称")
+	private String gradeName;
+
 	/** 考试次数 */
 	@Excel(name = "考试次数")
 	@ApiModelProperty("考试次数")
@@ -193,10 +269,16 @@ public class TopGoodsVo {
 	@Excel(name = "前培次数")
 	@ApiModelProperty("前培次数")
 	private Long doNumber;
+	@ApiModelProperty("总的试卷数量")
+	private Long totalExamNum;
+	@ApiModelProperty("订单")
+	private Long orderNum;
 	/** 讲师ID */
 	@Excel(name = "讲师ID")
 	@ApiModelProperty("讲师ID")
 	private Long teacherId;
+	@ApiModelProperty("直播商品数量")
+	private Integer goodsLiveNum;
 	/** 科目ID,拼接 */
 	@Excel(name = "科目ID,拼接")
 	@ApiModelProperty("科目ID,拼接")
@@ -213,28 +295,56 @@ public class TopGoodsVo {
 	@Excel(name = "证书模板ID")
 	@ApiModelProperty("证书模板ID")
 	private Long certificateTpId;
-	/** 商品划线价 */
-	@Excel(name = "商品划线价")
-	@ApiModelProperty("商品划线价")
+	@ApiModelProperty("科目名称拼接")
+	private String subjectNames;
+	@ApiModelProperty("购买用户数")
+	private Integer buyUserNum;
+	/** 学习进度 */
+	@ApiModelProperty("总节数")
+	private Long secAllNum;
+	/** 考试次数 */
+	@Excel(name = "商品章卷数量")
+	@ApiModelProperty("商品章卷数量")
+	private Long examNum;
+
+	/** 商品划线价格 */
+	@ApiModelProperty("商品划线价格")
 	private BigDecimal linePrice;
-	/** 默认规格模板ID */
-	@Excel(name = "默认规格模板ID")
+	/** 排序字段 */
+	@ApiModelProperty("排序字段")
+	private Integer sort;
+	@ApiModelProperty("商品规格模板数量")
+	private Integer specTemplateNumber;
 	@ApiModelProperty("默认规格模板ID")
 	private Long specTemplateId;
+
+	@ApiModelProperty("业务层次学习顺序:1限制章下做卷顺序 0不限制 2限制整个目录顺序")
+	private Integer goodsLearningOrder;
+
+	@ApiModelProperty("是否包含每日一练试卷:1是 0否")
+	private Integer examRecord;
+
+	@ApiModelProperty("最小价格")
+	private BigDecimal minPrice;
+
+	@ApiModelProperty("最大价格")
+	private BigDecimal maxPrice;
+
 	/** 是否显示:0否 1是 */
-	@Excel(name = "是否显示:0否 1是")
 	@ApiModelProperty("是否显示:0否 1是")
 	private Integer showStatus;
 	/** 显示排序字段 */
-	@Excel(name = "显示排序字段")
 	@ApiModelProperty("显示排序字段")
 	private Long showSort;
-	/** 外部跳转链接 */
-	@Excel(name = "外部跳转链接")
-	@ApiModelProperty("外部跳转链接")
+
+	@ApiModelProperty("是否二建商品:1是 0否")
+	private Integer specialGoods;
+
+	@ApiModelProperty("商品复制时间")
+	private List<String> copyTime;
+
+	@ApiModelProperty("外链")
 	private String externalLink;
-	/** 是否外链商品:0否 1是 */
-	@Excel(name = "是否外链商品:0否 1是")
 	@ApiModelProperty("是否外链商品:0否 1是")
 	private Integer externalLinkStatus;
 	/** 是否提交官方审核 0没有 1有 */
@@ -245,4 +355,5 @@ public class TopGoodsVo {
 	@Excel(name = "提交官方审核备注说明")
 	@ApiModelProperty("提交官方审核备注说明")
 	private String commitPeriodRemark;
+
 }

+ 274 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopGoodsMapper.xml

@@ -0,0 +1,274 @@
+<?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.top.goods.mapper.TopGoodsMapper">
+
+    <resultMap type="com.zhongzheng.modules.goods.vo.GoodsVo" id="TopGoodsResultVo">
+        <result property="goodsId" column="goods_id"/>
+        <result property="year" column="year"/>
+        <result property="supplyId" column="supply_id"/>
+        <result property="goodsType" column="goods_type"/>
+        <result property="gradeId" column="grade_id"/>
+        <result property="educationTypeId" column="education_type_id"/>
+        <result property="businessId" column="business_id"/>
+        <result property="schoolId" column="school_id"/>
+        <result property="majorId" column="major_id"/>
+        <result property="goodsName" column="goods_name"/>
+        <result property="standPrice" column="stand_price"/>
+        <result property="lowestPrice" column="lowest_price"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="status" column="status"/>
+        <result property="validityStartTime" column="validity_start_time"/>
+        <result property="validityEndTime" column="validity_end_time"/>
+        <result property="studyStartTime" column="study_start_time"/>
+        <result property="studyEndTime" column="study_end_time"/>
+        <result property="certificateIds" column="certificate_ids"/>
+        <result property="introduce" column="introduce"/>
+        <result property="suitableObject" column="suitable_object"/>
+        <result property="buyNote" column="buy_note"/>
+        <result property="pcDetailHtml" column="pc_detail_html"/>
+        <result property="mobileDetailHtml" column="mobile_detail_html"/>
+        <result property="goodsStatus" column="goods_status"/>
+        <result property="coverUrl" column="cover_url"/>
+        <result property="classHours" column="class_hours"/>
+        <result property="standPriceJson" column="stand_price_json"/>
+        <result property="code" column="code"/>
+        <result property="projectId" column="project_id"/>
+        <result property="goodsAuditionConfig" column="goods_audition_config"/>
+        <result property="goodsPhotographConfig" column="goods_photograph_config"/>
+        <result property="goodsPlayConfig" column="goods_play_config"/>
+        <result property="goodsExamConfig" column="goods_exam_config"/>
+        <result property="sectionMaxNum" column="section_max_num"/>
+        <result property="specTemplateId" column="spec_template_id"/>
+        <result property="showStatus" column="show_status"/>
+        <result property="showSort" column="show_sort"/>
+        <result property="specialGoods" column="special_goods"/>
+        <result property="externalLink" column="external_link"/>
+        <result property="externalLinkStatus" column="external_link_status"/>
+
+        <result property="supplyName" column="supply_name"/>
+        <result property="educationName" column="education_name"/>
+        <result property="projectName" column="project_name"/>
+        <result property="businessName" column="business_name"/>
+        <result property="schoolName" column="school_name"/>
+        <result property="categoryName" column="category_name"/>
+        <result property="handoutsId" column="handouts_id"/>
+        <result property="templateType" column="template_type"/>
+        <result property="period" column="period"/>
+        <result property="makeStartTime" column="make_start_time"/>
+        <result property="makeEndTime" column="make_end_time"/>
+        <result property="studyCount" column="study_count"/>
+        <result property="makeGoodsName" column="make_goods_name"/>
+        <result property="makeGoodsCode" column="make_goods_code"/>
+        <result property="courseNum" column="course_num"/>
+        <result property="sectionNum" column="section_num"/>
+        <result property="serviceTimeType" column="service_time_type"/>
+        <result property="serviceTimeNum" column="service_time_num"/>
+        <result property="gradeNum" column="grade_num"/>
+        <result property="gradeId" column="grade_id"/>
+        <result property="gradeName" column="grade_name"/>
+        <result property="examNumber" column="exam_number"/>
+        <result property="doNumber" column="do_number"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="teacherId" column="teacher_id"/>
+        <result property="goodsLiveNum" column="goods_live_num"/>
+        <result property="subjectIds" column="subject_ids"/>
+        <result property="certificateTypeId" column="certificate_type_id"/>
+        <result property="certificateId" column="certificate_id"/>
+        <result property="certificateTpId" column="certificate_tp_id"/>
+        <result property="subjectNames" column="subject_names"/>
+        <result property="buyUserNum" column="buy_user_num"/>
+        <result property="chapterNum" column="chapter_num"/>
+        <result property="examNum" column="exam_num"/>
+        <result property="linePrice" column="line_price"/>
+        <result property="specTemplateNumber" column="spec_template_number"/>
+        <result property="goodsLearningOrder" column="goods_learning_order"/>
+        <result property="commitPeriodStatus" column="commit_period_status"/>
+        <result property="commitPeriodRemark" column="commit_period_remark"/>
+    </resultMap>
+
+    <select id="selectAllList" parameterType="com.zhongzheng.modules.goods.bo.GoodsQueryBo" resultMap="TopGoodsResultVo">
+        SELECT
+        g.*,
+        ps.supply_name,
+        cet.education_name,
+        cpt.project_name,
+        cb.business_name,
+        cb.goods_learning_order,
+        s.school_name,
+        m.category_name,
+        (SELECT GROUP_CONCAT(subject_name) from top_course_subject where FIND_IN_SET(id,g.subject_ids)) subject_names,
+        (SELECT COUNT( DISTINCT gar.spec_template_id ) FROM top_goods_spec_attribute_relation gar WHERE gar.goods_id =
+        g.goods_id AND gar.`status` = 1 ) spec_template_number,
+        ot.type AS template_type,
+        (SELECT gs.goods_name FROM top_goods gs where 1=1 and g.make_goods_id = gs.goods_id) as make_goods_name,
+        (SELECT gs.code FROM top_goods gs where 1=1 and g.make_goods_id = gs.goods_id) as make_goods_code
+        <if test="chapterNum ==1">
+            ,(SELECT COUNT(m.id)+(SELECT COUNT(p.id) FROM top_course_module_chapter p LEFT JOIN course_menu m on m.menu_id =
+            p.module_id LEFT JOIN goods_course gc on gc.course_id = m.course_id where gc.goods_id = g.goods_id and
+            m.type in(1))+(SELECT COUNT(cmc.id) FROM top_course_module_chapter cmc LEFT JOIN course_menu m on m.menu_id =
+            cmc.module_id LEFT JOIN goods_course gc on gc.course_id = m.course_id where gc.goods_id = g.goods_id and
+            m.type in(2)) FROM course_menu m LEFT JOIN goods_course gc on gc.course_id = m.course_id where gc.goods_id =
+            g.goods_id and m.type in(3)) as chapter_num
+        </if>
+        ,(case WHEN g.goods_type =1 then (SELECT count(*) FROM goods_course gc LEFT JOIN course c on gc.course_id =
+        c.course_id where gc.goods_id =g.goods_id and c.course_show=1) ELSE 0 end) as course_num
+        <if test="goodsType ==1">
+            , (SELECT count(*) FROM class_grade cg LEFT JOIN class_grade_goods cgg on cg.grade_id = cgg.grade_id where
+            cgg.goods_id = g.goods_id and cg.`status` = 1 ) as grade_num
+        </if>
+        <if test="goodsType ==2">
+            , (SELECT count(*) from order_goods og where og.goods_id = g.goods_id and og.pay_status IN ( 2, 3, 4 )
+            AND og.refund_status IN (0,3,1) ) as order_num
+        </if>
+        <if test="getOrderNum != null and getOrderNum == 1">
+            ,ou.goods_live_num
+        </if>
+        <if test="getUserNum != null and getUserNum == 1">
+            ,(SELECT count(*) from order_goods og where og.goods_id = g.goods_id and og.`status` = 1
+            AND og.refund_status in (0,1,3)
+            AND og.pay_status in (2,3,4)) as buy_user_num
+        </if>
+        FROM
+        goods g
+        LEFT JOIN pay_supply ps ON g.supply_id = ps.supply_id
+        LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+        LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+        LEFT JOIN course_business cb ON g.business_id = cb.id
+        LEFT JOIN school s ON s.id = g.school_id
+        LEFT JOIN major m ON g.major_id = m.id
+        LEFT JOIN order_input_template ot ON cb.template_status = ot.id
+        <if test="getOrderNum != null and getOrderNum == 1">
+            LEFT JOIN (
+            SELECT
+            og.goods_id,
+            sum( CASE WHEN g.goods_type = 6 THEN 1 ELSE 0 END ) AS goods_live_num
+            FROM
+            `order` o
+            LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+            LEFT JOIN goods g ON og.goods_id = g.goods_id
+            WHERE o.`status` = 1
+            AND og.refund_status in (0,1,3)
+            AND og.pay_status in (2,3,4)
+            GROUP BY
+            og.goods_id
+            ) ou ON g.goods_id = ou.goods_id
+        </if>
+        WHERE
+        1 = 1
+        AND g.goods_type != 5
+        <if test="status != null and status.size()!=0 ">
+            AND g.status in
+            <foreach collection="status" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="goodsIds != null and goodsIds.size()!=0 ">
+            AND g.goods_id in
+            <foreach collection="goodsIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="goodsTypes != null and goodsTypes.size()!=0 ">
+            AND g.goods_type in
+            <foreach collection="goodsTypes" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="goodsType != null and goodsType != ''">
+            AND g.goods_type = #{goodsType}
+        </if>
+        <if test="showStatus != null and showStatus != ''">
+            AND g.show_status = #{showStatus}
+        </if>
+        <if test="code != null and code != ''">
+            AND g.code = #{code}
+        </if>
+        <if test="makeGoodsId != null and makeGoodsId != ''">
+            AND g.make_goods_id = #{makeGoodsId}
+        </if>
+        <if test="goodsName != null and goodsName != ''">
+            AND g.goods_name like concat('%', #{goodsName}, '%')
+        </if>
+        <if test="educationTypeId != null and educationTypeId != ''">
+            AND g.education_type_id = #{educationTypeId}
+        </if>
+        <if test="projectId != null and projectId != ''">
+            AND g.project_id = #{projectId}
+        </if>
+        <if test="businessIds != null and businessIds.size()!=0 ">
+            AND g.business_id in
+            <foreach collection="businessIds" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="businessId != null and businessId != ''">
+            AND g.business_id = #{businessId}
+        </if>
+        <if test="projectId != null and projectId != ''">
+            AND g.project_id = #{projectId}
+        </if>
+        <if test="schoolId != null and schoolId != ''">
+            AND g.school_id = #{schoolId}
+        </if>
+        <if test="majorId != null and majorId != ''">
+            AND g.major_id = #{majorId}
+        </if>
+        <if test="standPrice != null ">
+            AND g.stand_price = #{standPrice}
+        </if>
+        <if test="searchKey != null and searchKey != ''">
+            and (g.goods_name like concat('%', #{searchKey}, '%') or g.code like concat('%', #{searchKey}, '%'))
+        </if>
+        <if test="goodsStatus != null ">
+            AND g.goods_status = #{goodsStatus}
+        </if>
+        <if test="commitPeriodStatus != null ">
+            AND g.commit_period_status = #{commitPeriodStatus}
+        </if>
+        <if test="studyStartTime != null and studyStartTime != '' and studyEndTime != null and studyEndTime != ''">
+            and #{studyStartTime} BETWEEN g.validity_start_time and g.validity_end_time or #{studyEndTime} BETWEEN
+            g.validity_start_time and g.validity_end_time
+        </if>
+        <if test="validityStartTime != null or validityEndTime != null ">
+            AND (#{validityStartTime} BETWEEN g.validity_start_time and g.validity_end_time or #{validityEndTime}
+            BETWEEN g.validity_start_time and g.validity_end_time)
+        </if>
+        <if test="subjectId != null and subjectId >0">
+            AND FIND_IN_SET(#{subjectId},g.subject_ids)
+        </if>
+        <if test="subjectIdList != null and subjectIdList.size > 0 ">
+            AND (
+            <foreach collection="subjectIdList" item="item" index="index">
+                <if test=" index == 0 ">
+                    FIND_IN_SET(#{item},g.subject_ids)
+                </if>
+                <if test=" index != 0 ">
+                    OR FIND_IN_SET(#{item},g.subject_ids)
+                </if>
+            </foreach>
+            )
+        </if>
+        <if test="goodsType ==1 and haveCourse != null and haveCourse == 1">
+            AND (SELECT count(*) from goods_course gc LEFT JOIN course c ON gc.course_id = c.course_id where gc.goods_id
+            = g.goods_id and c.`status` = 1
+            ) >0
+        </if>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+        <if test="sortType != null and sortType == 2">
+            ORDER BY g.show_sort DESC,g.stand_price ASC
+        </if>
+        <if test="sortType != null and sortType == 3">
+            ORDER BY g.show_sort DESC,g.stand_price DESC
+        </if>
+        <if test="sortType != null and sortType == 1">
+            ORDER BY g.show_sort DESC,g.create_time DESC
+        </if>
+        <if test="sortType == null">
+            ORDER BY g.create_time DESC
+        </if>
+    </select>
+</mapper>