后台-系统设置-扩展变量-手机广告位-内容正文顶部 |
代码设计
1、接口调用流程图
平台和商家发布积分商品
2、相关代码展示
添加和修改积分兑换信息
@Service
public class ExchangeGoodsManagerImpl implements ExchangeGoodsManager {
@Override
@Transactional(value = "tradeTransactionManager", propagation =
Propagation.REQUIRED, rollbackFor = {Exception.class})
public ExchangeDO add(ExchangeDO exchangeSetting, PromotionGoodsDTO goodsDTO) {
//设置商品ID
exchangeSetting.setGoodsId(goodsDTO.getGoodsId());
//设置商品名称
exchangeSetting.setGoodsName(goodsDTO.getGoodsName());
//设置商品价格
exchangeSetting.setGoodsPrice(goodsDTO.getPrice());
//设置商品图片
exchangeSetting.setGoodsImg(goodsDTO.getThumbnail());
//如果允许积分兑换 0:否,1:是
if (exchangeSetting.getEnableExchange() == 1) {
//如果积分兑换分类ID等于空,默认设置为0
if (exchangeSetting.getCategoryId() == null) {
exchangeSetting.setCategoryId(0L);
}
//积分兑换信息入库
exchangeMapper.insert(exchangeSetting);
//获取主键ID
Long settingId = exchangeSetting.getExchangeId();
//获取当前时间
long nowTime = DateUtil.getDateline();
//获取一年后的时间
long endTime = endOfSomeDay(365);
List
list.add(goodsDTO);
//新建促销活动详情对象
PromotionDetailDTO detailDTO = new PromotionDetailDTO();
//设置促销活动标题
detailDTO.setTitle("积分活动");
//设置促销活动类型为积分兑换
detailDTO.setPromotionType(PromotionTypeEnum.EXCHANGE.name());
//设置促销活动ID
detailDTO.setActivityId(settingId);
//设置活动开始时间
detailDTO.setStartTime(nowTime);
//设置活动结束时间
detailDTO.setEndTime(endTime);
//入库操作
this.promotionGoodsManager.add(list, detailDTO);
//将积分兑换信息放入缓存中
this.cache.put(PromotionCacheKeys.getExchangeKey(settingId),
exchangeSetting);
}
return exchangeSetting;
}
@Override
@Transactional(value = "tradeTransactionManager", propagation =
Propagation.REQUIRED, rollbackFor = {Exception.class})
public ExchangeDO edit(ExchangeDO exchangeSetting, PromotionGoodsDTO goodsDTO) {
//删除之前的相关信息
this.deleteByGoods(goodsDTO.getGoodsId());
//如果允许积分兑换 0:否,1:是
if (exchangeSetting != null && exchangeSetting.getEnableExchange() == 1) {
//新添加积分兑换信息
this.add(exchangeSetting, goodsDTO);
}
return exchangeSetting;
}
}
积分兑换活动脚本生成
@Service
public class ExchangeGoodsScriptConsumer implements GoodsChangeEvent {
@Override
public void goodsChange(GoodsChangeMsg goodsChangeMsg) {
//获取商品ID数组
Long[] goodsIds = goodsChangeMsg.getGoodsIds();
//获取商品信息集合
List
//获取操作类型
int operationType = goodsChangeMsg.getOperationType();
//如果商品集合不为空并且集合长度不为0
if (goodsList != null && goodsList.size() != 0) {
for (GoodsDO goodsDO : goodsList) {
//如果商品为积分兑换商品
if (GoodsType.POINT.name().equals(goodsDO.getGoodsType())) {
//获取商品ID
Long goodsId = goodsDO.getGoodsId();
//获取积分兑换商品信息
ExchangeDO exchangeDO =
this.exchangeGoodsClient.getModelByGoods(goodsId);
//获取商品的SKU信息
List
//如果为true 证明商品正在上架销售
boolean normal = goodsDO.getDisabled() == 1 &&
goodsDO.getMarketEnable() == 1 && goodsDO.getIsAuth() == 1;
//如果为true 证明商品已下架但是没有删除
boolean under = goodsDO.getDisabled() == 1 &&
goodsDO.getMarketEnable() == 0 && goodsDO.getIsAuth() == 1;
//新增脚本条件:(操作类型为添加或者审核成功操作) && 商品未删除
//&& 商品未下架 && 商品审核状态为审核通过
boolean add = (GoodsChangeMsg.ADD_OPERATION == operationType ||
GoodsChangeMsg.GOODS_VERIFY_SUCCESS ==
operationType) && normal;
//修改脚本条件:操作类型为修改 && 商品未删除 && 商品未下架
//&& 商品审核状态为审核通过
boolean edit = GoodsChangeMsg.UPDATE_OPERATION ==
operationType && normal;
//删除脚本条件:操作类型为修改 && 商品未删除 && 商品已下架
//&& 商品审核状态为审核通过
boolean delete = GoodsChangeMsg.UNDER_OPERATION ==
operationType && under;
if (add || edit) {
for (GoodsSkuVO goodsSkuVO : skuList) {
//先删除已有的脚本信息
this.goodsClient.deleteSkuExchangeScript(
goodsSkuVO.getSkuId());
//生成脚本信息
this.goodsClient.createSkuExchangeScript(
goodsSkuVO.getSkuId(), exchangeDO.getExchangeId(),
exchangeDO.getExchangeMoney(),
exchangeDO.getExchangePoint());
}
}
if (delete) {
for (GoodsSkuVO goodsSkuVO : skuList) {
//删除已有的脚本信息
this.goodsClient.deleteSkuExchangeScript(
goodsSkuVO.getSkuId());
}
}
}
}
}
}
}
@Service
public class GoodsSkuManagerImpl implements GoodsSkuManager {
@Override
public void createSkuExchangeScript(Long skuId, Long exchangeId,
Double price, Integer point) {
//缓存key
String cacheKey = CachePrefix.SKU_PROMOTION.getPrefix() + skuId;
//积分兑换商品脚本信息
PromotionScriptVO scriptVO = new PromotionScriptVO();
//渲染并读取积分兑换商品脚本信息
String script = renderScript(price, point);
scriptVO.setPromotionScript(script);
scriptVO.setPromotionId(exchangeId);
scriptVO.setPromotionType(PromotionTypeEnum.EXCHANGE.name());
scriptVO.setIsGrouped(false);
scriptVO.setPromotionName("积分兑换");
scriptVO.setSkuId(skuId);
//从缓存中读取脚本信息
List
cache.get(cacheKey);
if (scriptList == null) {
scriptList = new ArrayList<>();
}
scriptList.add(scriptVO);
cache.put(cacheKey, scriptList);
}
@Override
public void deleteSkuExchangeScript(Long skuId) {
//缓存key
String cacheKey = CachePrefix.SKU_PROMOTION.getPrefix() + skuId;
//从缓存中读取脚本信息
List
cache.get(cacheKey);
if (scriptList != null && scriptList.size() != 0) {
//循环促销脚本缓存数据集合
for (PromotionScriptVO script : scriptList) {
//如果脚本数据的促销活动信息与当前修改的促销活动信息一致,那么就将此信息删除
if (PromotionTypeEnum.EXCHANGE.name().equals(script.getPromotionType())
&& script.getSkuId().intValue() == skuId.intValue()) {
scriptList.remove(script);
break;
}
}
//如果经过上面的处理过后脚本集合长度为0,那么直接删除;如果不为0,
//那么把剩余的脚本信息重新放入缓存中。
if (scriptList.size() == 0) {
cache.remove(cacheKey);
} else {
cache.put(cacheKey, scriptList);
}
}
}
@Override
public void deleteSkuExchangeScript(Long goodsId, String oldType, String newType) {
//如果原商品类型为积分商品,先商品类型为普通商品
if (GoodsType.POINT.name().equals(oldType) &&
GoodsType.NORMAL.name().equals(newType)) {
//获取商品的SKU信息
List
for (GoodsSkuVO goodsSkuVO : skuList) {
this.deleteSkuExchangeScript(goodsSkuVO.getSkuId());
}
}
}
/**
* 渲染并读取积分兑换商品脚本信息
*
* @param price 兑换积分商品所需的价钱
* @param point 兑换积分商品所需的积分
* @return
*/
private String renderScript(Double price, Integer point) {
Map
Map
params.put("price", price);
params.put("point", point);
model.put("goods", params);
String path = "exchange.ftl";
String script = ScriptUtil.renderScript(path, model);
logger.debug("生成积分兑换商品脚本:" + script);
return script;
}
/**
* 清除缓存中的商品SKU促销信息脚本
*
* @param skuList 编辑后的商品SKU集合
* @param oldSkuList 编辑前的商品SKU集合
*/
private void cleanSkuPromotionScript(List
List
//将编辑后的商品skuID取出
List
for (GoodsSkuVO goodsSkuVO : skuList) {
if (goodsSkuVO.getSkuId() != null && goodsSkuVO.getSkuId() != 0) {
newSkuList.add(goodsSkuVO.getSkuId());
}
}
//如果编辑后的skuID集合长度为0,证明之前存在的SKU均已删除,
//那么编辑前的所有商品SKU的促销脚本信息均要删除
//长度不为0,证明之前存在的SKU还有部分存在,那么取出不存在的商品SKU删除促销脚本信息
if (newSkuList.size() == 0) {
for (GoodsSkuVO goodsSkuVO : oldSkuList) {
cache.remove(CachePrefix.SKU_PROMOTION.getPrefix()
+ goodsSkuVO.getSkuId());
}
} else {
for (GoodsSkuVO goodsSkuVO : oldSkuList) {
if (!newSkuList.contains(goodsSkuVO.getSkuId())) {
cache.remove(CachePrefix.SKU_PROMOTION.getPrefix()
+ goodsSkuVO.getSkuId());
}
}
}
}
/**
* 积分兑换商品修改商品规格更新缓存中的脚本信息
*
* @param goodsId 商品id
* @param goodsType 商品类型
* @param oldSkuList 原商品SKU信息集合
*/
private void updateSkuExchangeScript(Long goodsId, String goodsType,
List
//如果商品为积分兑换商品,需要更新缓存中的积分商品脚本信息
if (GoodsType.POINT.name().equals(goodsType)) {
//获取积分兑换商品信息
ExchangeDO exchangeDO = this.exchangeGoodsClient.getModelByGoods(goodsId);
//先删除规格修改前积分商品sku已有的脚本信息
for (GoodsSkuVO goodsSkuVO : oldSkuList) {
this.deleteSkuExchangeScript(goodsSkuVO.getSkuId());
}
//获取商品规格变化之后的sku信息集合
List
//重新生成脚本信息
for (GoodsSkuVO goodsSkuVO : newSkuList) {
this.createSkuExchangeScript(
goodsSkuVO.getSkuId(), exchangeDO.getExchangeId(),
exchangeDO.getExchangeMoney(), exchangeDO.getExchangePoint());
}
}
}
}
积分兑换脚本引擎模板文件—exchange.ftl
<#--此方法会直接返回true,积分兑换不涉及有效期,脚本中有此方法是为了脚本内容统一@returns {boolean}-->
function validTime(){
return true;
}
<#--计算兑换积分商品所需要的金额@param goods 积分商品对象(内置常量)
.price 兑换积分商品所需要的金额@param $sku 商品SKU信息对象(变量)
.$num 商品数量@returns {*}-->
function countPrice() {
var resultPrice = $sku.$num * ${goods.price};
return resultPrice < 0 ? 0 : resultPrice.toString();
}
<#--计算兑换积分商品所需要的金额@param goods 积分商品对象(内置常量)
.point 兑换积分商品所需要的积分@param $sku 商品SKU信息对象(变量)
.$num 商品数量@returns {*}-->
function countPoint() {
return ($sku.$num * ${goods.point}).toString();
}
以上就是关于积分兑换的代码设计所有内容,想了解更多详情,可以持续关注易族智汇javashop,有任何问题,欢迎咨询在线客户或给我们留言。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。