后台-系统设置-扩展变量-手机广告位-内容正文顶部 |
团购促销活动属于平台发布的促销活动,商家选择商品参与,平台来进行审核。详细的功能就不一一赘述了,可以参考功能说明,下面来说一下团购促销活动的代码设计,希望易族智汇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.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
//新建促销商品对象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
//循环团购商品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
//以团购活动ID为修改条件,修改参与团购商品数量+1
wrapper.setSql("goods_num=goods_num+1").eq("act_id", param.getActId());
//修改已参与团购活动的商品数量
groupbuyActiveMapper.update(new GroupbuyActiveDO(), wrapper);
//商品集合
List
//初始化促销活动商品数据
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
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
//如果参与团购促销活动的商品集合不为空并且集合长度不为0
if (goodsList != null && goodsList.size() != 0) {
//获取团购活动详细信息
GroupbuyActiveDO groupbuyActiveDO
= this.groupbuyActiveManager.getModel(promotionId);
//批量放入缓存的数据集合
Map
//循环参与团购活动的商品集合,将脚本放入缓存中
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
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
Map
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 技术文档栏目。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。