促销活动团购:新增团购活动一些列代码设计详解

后台-系统设置-扩展变量-手机广告位-内容正文顶部

  团购促销活动属于平台发布的促销活动,商家选择商品参与,平台来进行审核。详细的功能就不一一赘述了,可以参考功能说明,下面来说一下团购促销活动的代码设计,希望易族智汇javashop整理的,可以帮助到您。

代码设计

1、接口调用流程图

  平台发布促销活动

  商家选择商品参与团购活动

  平台审核商家参与活动的商品

2、相关代码展示

  新增团购活动

  @RestController

  @RequestMapping("/admin/promotion/group-buy-actives")

  @Api(description = "团购活动表相关API")

  @Validated

  public class GroupbuyActiveManagerController {

  @ApiOperation(value = "添加团购活动表", response = GroupbuyActiveDO.class)

  @ApiImplicitParam(name = "activeDO", value = "团购信息", required = true,

  dataType = "GroupbuyActiveDO", paramType = "body")

  @PostMapping

  public GroupbuyActiveDO add(@ApiIgnore @Valid @RequestBody GroupbuyActiveDO activeDO) {

  this.verifyParam(activeDO.getStartTime(), activeDO.getEndTime(),

  activeDO.getJoinEndTime());

  this.groupbuyActiveManager.add(activeDO);

  return activeDO;

  }

  }

  @Service

  public class GroupbuyActiveManagerImpl extends AbstractPromotionRuleManagerImpl implements GroupbuyActiveManager {

  @Override

  @Transactional(propagation = Propagation.REQUIRED,

  rollbackFor = {RuntimeException.class})

  public GroupbuyActiveDO add(GroupbuyActiveDO groupbuyActive) {

  //参数验证 1、活动起始时间必须大于当前时间 2、活动开始时间是否大于活动结束时间

  PromotionValid.paramValid(groupbuyActive.getStartTime(),

  groupbuyActive.getEndTime(), 1, null);

  //验证活动时间 同一时间只能有一个活动生效

  this.verifyTime(groupbuyActive.getStartTime(),

  groupbuyActive.getEndTime(), PromotionTypeEnum.GROUPBUY, null);

  //验证活动名称是否重复

  this.verifyName(groupbuyActive.getActName(), false, 0L);

  //设置添加时间为当前时间

  groupbuyActive.setAddTime(DateUtil.getDateline());

  //设置删除状态为正常未删除

  groupbuyActive.setDeleteStatus(DeleteStatusEnum.NORMAL.value());

  //团购活动入库操作

  groupbuyActiveMapper.insert(groupbuyActive);

  //获取团购活动主键ID

  Long id = groupbuyActive.getActId();

  //启用延时任务创建促销活动脚本信息

  PromotionScriptMsg promotionScriptMsg = new PromotionScriptMsg();

  //设置活动ID

  promotionScriptMsg.setPromotionId(id);

  //设置活动名称

  promotionScriptMsg.setPromotionName(groupbuyActive.getActName());

  //设置活动类型

  promotionScriptMsg.setPromotionType(PromotionTypeEnum.GROUPBUY);

  //设置脚本操作类型为创建脚本

  promotionScriptMsg.setOperationType(ScriptOperationTypeEnum.CREATE);

  //设置活动结束时间

  promotionScriptMsg.setEndTime(groupbuyActive.getEndTime());

  //创建延时任务key值

  String uniqueKey = "{TIME_TRIGGER_" + PromotionTypeEnum.GROUPBUY.name()

  + "}_" + id;

  //发送消息创建延时任务

  timeTrigger.add(TimeExecute.GROUPBUY_SCRIPT_EXECUTER,

  promotionScriptMsg, groupbuyActive.getStartTime(), uniqueKey);

  return groupbuyActive;

  }

  }

  商家选择商品参与团购活动

  @RestController

  @RequestMapping("/seller/promotion/group-buy-goods")

  @Api(description = "团购商品相关API")

  @Validated

  public class GroupbuyGoodsSellerController {

  @ApiOperation(value = "添加团购商品", response = GroupbuyGoodsDO.class)

  @ApiImplicitParam(name = "groupbuyGoods", value = "团购商品信息",

  required = true, dataType = "GroupbuyGoodsDO", paramType = "body")

  @PostMapping

  public GroupbuyGoodsDO add(@Valid @RequestBody GroupbuyGoodsDO groupbuyGoods) {

  groupbuyGoods.setAddTime(DateUtil.getDateline());

  this.verifyParam(groupbuyGoods);

  Seller seller = UserContext.getSeller();

  groupbuyGoods.setSellerId(seller.getSellerId());

  groupbuyGoods.setSellerName(seller.getSellerName());

  groupbuyGoods.setBuyNum(0);

  groupbuyGoods.setViewNum(0);

  this.groupbuyGoodsManager.add(groupbuyGoods);

  return groupbuyGoods;

  }

  }

  @Service

  public class GroupbuyGoodsManagerImpl extends AbstractPromotionRuleManagerImpl implements GroupbuyGoodsManager {

  @Override

  @Transactional(propagation = Propagation.REQUIRED,

  rollbackFor = {Exception.class, RuntimeException.class})

  public GroupbuyGoodsDO add(GroupbuyGoodsDO goodsDO) {

  //获取团购活动信息并校验

  GroupbuyActiveDO activeDO = groupbuyActiveManager.getModel(goodsDO.getActId());

  if (activeDO == null) {

  throw new ServiceException(PromotionErrorCode.E400.code(), "参与的活动不存在");

  }

  //如果团购价格 大于等于商品原价,则抛出异常

  if (goodsDO.getPrice() >= goodsDO.getOriginalPrice()) {

  throw new ServiceException(PromotionErrorCode.E400.code(),

  "参与活动的商品促销价格不得大于或等于商品原价");

  }

  //校验限购数量是否超过商品总数

  if (goodsDO.getLimitNum() > goodsDO.getGoodsNum()) {

  throw new ServiceException(PromotionErrorCode.E400.code(),

  "商品限购数量不能大于商品总数");

  }

  //新建查询条件包装器

  QueryWrapper wrapper = new QueryWrapper<>();

  //以促销活动类型为限时抢购为条件查询

  wrapper.eq("promotion_type", PromotionTypeEnum.SECKILL.name());

  //以商品SKU为查询条件

  wrapper.eq("sku_id", goodsDO.getSkuId());

  //按(活动开始时间小于等于当前活动开始时间 并且 活动结束时间大于等于当前活动开始时间)或者(活动开始时间小于等于当前活动结束时间 并且 活动结束时间大于等于当前活动结束时间)

  //或者 (活动开始时间小于等于当前活动开始时间 并且 活动结束时间大于等于当前活动结束时间)或者 活动开始时间大于等于当前活动开始时间 并且 活动结束时间小于等于当前活动结束时间)

  wrapper.and(i -> i.le("start_time", activeDO.getStartTime())

  .ge("end_time", activeDO.getStartTime())

  .or().le("start_time", activeDO.getEndTime())

  .ge("end_time", activeDO.getEndTime())

  .or().le("start_time", activeDO.getStartTime())

  .ge("end_time", activeDO.getEndTime())

  .or().ge("start_time", activeDO.getStartTime())

  .le("end_time", activeDO.getEndTime()));

  //获取当前商品参与限时抢购活动的数量

  int count = promotionGoodsMapper.selectCount(wrapper);

  if (count > 0) {

  throw new ServiceException(PromotionErrorCode.E400.code(), "该商品已经在重叠的时间段参加了限时抢购活动,不能参加团购活动");

  }

  //新建促销商品集合

  List goodsDTOList = new ArrayList<>();

  //新建促销商品对象DTO

  PromotionGoodsDTO goodsDTO = new PromotionGoodsDTO();

  //设置商品ID

  goodsDTO.setGoodsId(goodsDO.getGoodsId());

  //设置商品图片

  goodsDTO.setThumbnail(goodsDO.getThumbnail());

  //设置商品名称

  goodsDTO.setGoodsName(goodsDO.getGoodsName());

  //将商品放入集合中

  goodsDTOList.add(goodsDTO);

  //检测活动商品规则

  this.verifyRule(goodsDTOList);

  //设置团购商品审核状态为待审核

  goodsDO.setGbStatus(GroupBuyGoodsStatusEnum.PENDING.status());

  //获取商品sku

  Long skuId = goodsDO.getSkuId();

  //查询存储相关的规格

  GoodsSkuVO sku = goodsClient.getSkuFromCache(skuId);

  //设置团购商品规格信息

  goodsDO.setSpecs(sku.getSpecs());

  //团购商品信息入库

  groupbuyGoodsMapper.insert(goodsDO);

  return goodsDO;

  }

  }

  平台审核参与团购活动的商品

  @RestController

  @RequestMapping("/admin/promotion/group-buy-actives")

  @Api(description = "团购活动表相关API")

  @Validated

  public class GroupbuyActiveManagerController {

  @ApiOperation(value = "批量审核商品")

  @PostMapping(value = "/batch/audit")

  public void batchAudit(@Valid @RequestBody GroupbuyAuditParam param) {

  this.groupbuyActiveManager.batchAuditGoods(param);

  }

  }

  @Service

  public class GroupbuyActiveManagerImpl extends AbstractPromotionRuleManagerImpl implements GroupbuyActiveManager {

  @Override

  @Transactional(propagation = Propagation.REQUIRED,

  rollbackFor = {RuntimeException.class, Exception.class})

  public void batchAuditGoods(GroupbuyAuditParam param) {

  //校验活动id

  if (param.getActId() == null || param.getActId() == 0) {

  throw new ServiceException(PromotionErrorCode.E400.code(), "参数活动ID不正确");

  }

  //校验活动商品

  if (param.getGbIds() == null || param.getGbIds().length == 0) {

  throw new ServiceException(GoodsErrorCode.E301.code(), "请选择要审核的商品");

  }

  //校验审核状态

  if (param.getStatus() == null) {

  throw new ServiceException(PromotionErrorCode.E400.code(),

  "参数审核状态值不能为空");

  }

  //校验参数审核状态值是否服务规范

  if (param.getStatus().intValue() != 1 && param.getStatus().intValue() != 2) {

  throw new ServiceException(PromotionErrorCode.E400.code(),

  "参数审核状态值不正确");

  }

  //获取团购活动信息

  GroupbuyActiveDO activeDO = this.getModel(param.getActId());

  //审核状态 true:审核通过,false:审核未通过

  boolean auditStatus = param.getStatus().intValue()

  == GroupBuyGoodsStatusEnum.APPROVED.status();

  //参与团购促销活动并且已被平台审核通过的商品集合

  List goodsList = new ArrayList<>();

  //循环团购商品ID集合

  for (Long gbId : param.getGbIds()) {

  //读取团购商品信息并校验

  GroupbuyGoodsDO goodsDO = this.groupbuyGoodsManager.getModel(gbId);

  if (goodsDO == null) {

  throw new ServiceException(PromotionErrorCode.E400.code(),

  "商品【" + goodsDO.getGoodsName() + "】不存在");

  }

  if (goodsDO.getGbStatus().intValue() != 0) {

  throw new ServiceException(PromotionErrorCode.E400.code(),

  "商品【" + goodsDO.getGoodsName()

  + "】不是可以审核的状态");

  }

  //修改状态

  this.groupbuyGoodsManager.updateStatus(gbId, param.getStatus());

  //如果通过审核

  if (auditStatus) {

  //新建修改条件包装器

  UpdateWrapper wrapper = new UpdateWrapper<>();

  //以团购活动ID为修改条件,修改参与团购商品数量+1

  wrapper.setSql("goods_num=goods_num+1").eq("act_id", param.getActId());

  //修改已参与团购活动的商品数量

  groupbuyActiveMapper.update(new GroupbuyActiveDO(), wrapper);

  //商品集合

  List goodsDTOList = new ArrayList<>();

  //初始化促销活动商品数据

  PromotionGoodsDO promotion = new PromotionGoodsDO();

  //设置活动名称

  promotion.setTitle(activeDO.getActName());

  //设置商品ID

  promotion.setGoodsId(goodsDO.getGoodsId());

  //设置商品sku

  promotion.setSkuId(goodsDO.getSkuId());

  //设置促销活动类型为团购活动

  promotion.setPromotionType(PromotionTypeEnum.GROUPBUY.name());

  //设置活动ID

  promotion.setActivityId(activeDO.getActId());

  //设置参与促销活动的商品数量

  promotion.setNum(activeDO.getGoodsNum());

  //设置商品价格

  promotion.setPrice(goodsDO.getPrice());

  //设置商家ID

  promotion.setSellerId(goodsDO.getSellerId());

  //设置活动开始时间

  promotion.setStartTime(activeDO.getStartTime());

  //设置活动结束时间

  promotion.setEndTime(activeDO.getEndTime());

  goodsDTOList.add(promotion);

  //初始化活动信息DTO

  PromotionDetailDTO detailDTO = new PromotionDetailDTO();

  //设置活动ID

  detailDTO.setActivityId(param.getActId());

  //设置活动开始时间

  detailDTO.setStartTime(activeDO.getStartTime());

  //设置活动结束时间

  detailDTO.setEndTime(activeDO.getEndTime());

  //设置促销活动类型为团购活动

  detailDTO.setPromotionType(PromotionTypeEnum.GROUPBUY.name());

  //设置活动名称

  detailDTO.setTitle(activeDO.getActName());

  //入库到活动商品对照表

  this.promotionGoodsManager.addAndCheck(goodsDTOList, detailDTO);

  //将此商品加入延迟加载队列,到指定的时间将索引价格变成最新的优惠价格

  PromotionPriceDTO promotionPriceDTO = new PromotionPriceDTO();

  promotionPriceDTO.setGoodsId(goodsDO.getGoodsId());

  promotionPriceDTO.setPrice(goodsDO.getPrice());

  //检测开始时间和结束时间

  PromotionValid.paramValid(detailDTO.getStartTime(),

  detailDTO.getEndTime(), 1, null);

  timeTrigger.add(TimeExecute.PROMOTION_EXECUTER,

  promotionPriceDTO, activeDO.getStartTime(), null);

  //此活动结束后将索引的优惠价格重置为0

  promotionPriceDTO.setPrice(0.0);

  timeTrigger.add(TimeExecute.PROMOTION_EXECUTER,

  promotionPriceDTO, activeDO.getEndTime(), null);

  //构建要生成脚本的促销商品数据集合

  PromotionGoodsDO promotionGoodsDO = new PromotionGoodsDO();

  promotionGoodsDO.setSkuId(promotion.getSkuId());

  promotionGoodsDO.setPrice(goodsDO.getPrice());

  goodsList.add(promotionGoodsDO);

  }

  }

  //获取当前时间

  long currTime = DateUtil.getDateline();

  //活动是否在进行中

  boolean activeStatus = activeDO.getStartTime().longValue()

  <= currTime && activeDO.getEndTime().longValue() >= currTime;

  //如果当前团购活动正在进行中并且是商品审核通过的操作

  if (activeStatus && auditStatus) {

  //先删除已存在的脚本信息

  this.groupbuyScriptManager.deleteCacheScript(param.getActId(), goodsList);

  //创建审核通过的商品团购促销活动脚本信息

  this.groupbuyScriptManager.createCacheScript(param.getActId(), goodsList);

  }

  }

  }

  团购促销活动脚本引擎生成

  @Component("groupBuyScriptTimeTriggerExecuter")

  public class GroupBuyScriptTimeTriggerExecuter implements TimeTriggerExecuter {

  @Override

  public void execute(Object object) {

  PromotionScriptMsg promotionScriptMsg = (PromotionScriptMsg) object;

  //获取促销活动ID

  Long promotionId = promotionScriptMsg.getPromotionId();

  //获取参与团购活动的所有商品信息集合

  List goodsList =

  this.promotionGoodsClient.getPromotionGoods(

  promotionId, PromotionTypeEnum.GROUPBUY.name());

  //如果是团购促销活动开始生效

  if (ScriptOperationTypeEnum.CREATE.equals(

  promotionScriptMsg.getOperationType())) {

  //创建脚本信息

  this.promotionScriptClient.createGroupBuyCacheScript(

  promotionId, goodsList);

  //开启活动后,立马设置一个关闭的流程

  promotionScriptMsg.setOperationType(ScriptOperationTypeEnum.DELETE);

  String uniqueKey = "{TIME_TRIGGER_"

  + promotionScriptMsg.getPromotionType().name() + "}_" + promotionId;

  timeTrigger.add(TimeExecute.GROUPBUY_SCRIPT_EXECUTER, promotionScriptMsg,

  promotionScriptMsg.getEndTime(), uniqueKey);

  this.logger.debug("促销活动[" + promotionScriptMsg.getPromotionName()

  + "]开始,id=[" + promotionId + "]");

  } else {

  //删除脚本信息

  this.promotionScriptClient.deleteGroupBuyCacheScript(

  promotionId, goodsList);

  this.logger.debug("促销活动[" + promotionScriptMsg.getPromotionName()

  + "]结束,id=[" + promotionId + "]");

  }

  }

  }

  @Service

  public class GroupbuyScriptManagerImpl implements GroupbuyScriptManager {

  @Override

  public void createCacheScript(Long promotionId, List goodsList) {

  //如果参与团购促销活动的商品集合不为空并且集合长度不为0

  if (goodsList != null && goodsList.size() != 0) {

  //获取团购活动详细信息

  GroupbuyActiveDO groupbuyActiveDO

  = this.groupbuyActiveManager.getModel(promotionId);

  //批量放入缓存的数据集合

  Map> cacheMap = new HashMap<>();

  //循环参与团购活动的商品集合,将脚本放入缓存中

  for (PromotionGoodsDO goods : goodsList) {

  //缓存key

  String cacheKey = CachePrefix.SKU_PROMOTION.getPrefix()

  + goods.getSkuId();

  //获取拼团活动脚本信息

  PromotionScriptVO scriptVO = new PromotionScriptVO();

  //渲染并读取团购促销活动脚本信息

  String script = renderScript(groupbuyActiveDO.getStartTime().toString(),

  groupbuyActiveDO.getEndTime().toString(),

  goods.getPrice());

  scriptVO.setPromotionScript(script);

  scriptVO.setPromotionId(promotionId);

  scriptVO.setPromotionType(PromotionTypeEnum.GROUPBUY.name());

  scriptVO.setIsGrouped(false);

  scriptVO.setPromotionName("团购");

  scriptVO.setSkuId(goods.getSkuId());

  //从缓存中读取脚本信息

  List scriptList = (List)

  cache.get(cacheKey);

  if (scriptList == null) {

  scriptList = new ArrayList<>();

  }

  scriptList.add(scriptVO);

  cacheMap.put(cacheKey, scriptList);

  }

  //将sku促销脚本数据批量放入缓存中

  cache.multiSet(cacheMap);

  }

  }

  /**

  * 渲染并读取团购促销活动脚本信息

  * @param startTime 活动开始时间

  * @param endTime 活动结束时间

  * @param price 限时抢购商品价格

  * @return

  */

  private String renderScript(String startTime, String endTime, Double price) {

  Map model = new HashMap<>();

  Map params = new HashMap<>();

  params.put("startTime", startTime);

  params.put("endTime", endTime);

  params.put("price", price);

  model.put("promotionActive", params);

  String path = "single_promotion.ftl";

  String script = ScriptUtil.renderScript(path, model);

  logger.debug("生成团购促销活动脚本:" + script);

  return script;

  }

  }

  团购促销活动脚本引擎模板文件—single_promotion.ftl

  <#--

  验证促销活动是否在有效期内

  @param promotionActive 活动信息对象(内置常量)

  .startTime 获取开始时间

  .endTime 活动结束时间

  @param $currentTime 当前时间(变量)

  @returns {boolean}

  -->

  function validTime(){

  if (${promotionActive.startTime} <= $currentTime && $currentTime <= ${promotionActive.endTime}) {

  return true;

  }

  return false;

  }

  <#--活动金额计算@param promotionActive 活动信息对象(内置常量)

  .price 商品促销活动价格@param $sku 商品SKU信息对象(变量)

  .$num 商品数量@returns {*}-->

  function countPrice() {

  var resultPrice = $sku.$num * ${promotionActive.price};

  return resultPrice < 0 ? 0 : resultPrice.toString();

  }

  以上就是关于团购促销活动代码设计的所有内容了,想要了解更多技术方面的内容,可以持续关注易族智汇javashop 技术文档栏目。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

后台-系统设置-扩展变量-手机广告位-内容正文底部
留言与评论(共有 0 条评论)
   
验证码: