package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONUtil; import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.promotion.entity.dos.PointsGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.mapper.PointsGoodsMapper; import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.search.utils.EsIndexUtil; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.GoodsTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * 积分商品业务层实现 * * @author paulG * @since 2020/8/21 **/ @Service @Slf4j public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl implements PointsGoodsService { /** * 促销商品 */ @Autowired private PromotionGoodsService promotionGoodsService; /** * 规格商品 */ @Autowired private GoodsSkuService goodsSkuService; /** * rocketMq配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; /** * rocketMq */ @Autowired private RocketMQTemplate rocketMQTemplate; @Override @Transactional(rollbackFor = Exception.class) public boolean savePointsGoodsBatch(List promotionsList) { List promotionGoodsList = new ArrayList<>(); for (PointsGoods pointsGoods : promotionsList) { this.initPromotion(pointsGoods); this.checkPromotions(pointsGoods); if (this.checkSkuDuplicate(pointsGoods.getSkuId(), null) == null) { pointsGoods.setPromotionName("积分商品活动"); } else { throw new ServiceException(ResultCode.PROMOTION_LOG_EXIST, "商品id为" + pointsGoods.getSkuId() + "的商品已参加积分商品活动!"); } GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); pointsGoods.setStoreId(goodsSku.getStoreId()); pointsGoods.setStoreName(goodsSku.getStoreName()); } boolean saveBatch = this.saveBatch(promotionsList); if (saveBatch) { for (PointsGoods pointsGoods : promotionsList) { GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); PromotionGoods promotionGoods = new PromotionGoods(pointsGoods, goodsSku); promotionGoods.setPromotionType(PromotionTypeEnum.POINTS_GOODS.name()); promotionGoods.setScopeId(pointsGoods.getSkuId()); promotionGoodsList.add(promotionGoods); } boolean saveOrUpdateBatch = this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList); if (saveOrUpdateBatch) { for (PointsGoods pointsGoods : promotionsList) { this.updateEsGoodsIndex(pointsGoods); } } } return saveBatch; } /** * 积分商品更新 * * @param promotions 促销信息 * @return 是否更新成功 */ @Override @Transactional(rollbackFor = Exception.class) public boolean updatePromotions(PointsGoods promotions) { boolean result = false; this.checkStatus(promotions); this.checkPromotions(promotions); if (this.checkSkuDuplicate(promotions.getSkuId(), promotions.getId()) == null) { result = this.updateById(promotions); if (this.updatePromotionsGoods(promotions)) { this.updateEsGoodsIndex(promotions); } } return result; } /** * 移除促销活动 * * @param ids 促销活动id集合 * @return 是否移除成功 */ @Override @Transactional(rollbackFor = Exception.class) public boolean removePromotions(List ids) { for (String id : ids) { PointsGoods pointsGoods = this.getById(id); if (pointsGoods == null) { log.error(ResultCode.POINT_GOODS_NOT_EXIST.message()); ids.remove(id); } } this.promotionGoodsService.deletePromotionGoods(ids); return this.removeByIds(ids); } /** * 根据ID获取积分详情 * * @param id 积分商品id * @return 积分详情 */ @Override public PointsGoodsVO getPointsGoodsDetail(String id) { PointsGoods pointsGoods = this.checkExist(id); PointsGoodsVO pointsGoodsVO = new PointsGoodsVO(); BeanUtils.copyProperties(pointsGoods, pointsGoodsVO); pointsGoodsVO.setGoodsSku(this.checkSkuExist(pointsGoods.getSkuId())); return pointsGoodsVO; } /** * 根据ID获取积分详情 * * @param skuId 商品SkuId * @return 积分详情 */ @Override public PointsGoodsVO getPointsGoodsDetailBySkuId(String skuId) { QueryWrapper queryWrapper = new QueryWrapper().eq("sku_id", skuId); queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)); PointsGoods pointsGoods = this.getOne(queryWrapper, false); if (pointsGoods == null) { log.error("skuId为" + skuId + "的积分商品不存在!"); throw new ServiceException(); } PointsGoodsVO pointsGoodsVO = new PointsGoodsVO(); BeanUtils.copyProperties(pointsGoods, pointsGoodsVO); pointsGoodsVO.setGoodsSku(this.checkSkuExist(pointsGoods.getSkuId())); return pointsGoodsVO; } /** * 检查促销参数 * * @param promotions 促销实体 */ @Override public void checkPromotions(PointsGoods promotions) { super.checkPromotions(promotions); GoodsSku goodsSku = this.checkSkuExist(promotions.getSkuId()); if (promotions.getActiveStock() > goodsSku.getQuantity()) { throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR); } } /** * 检查促销状态 * * @param promotions 促销实体 */ @Override public void checkStatus(PointsGoods promotions) { super.checkStatus(promotions); } /** * 更新促销商品信息 * * @param promotions 促销实体 * @return 是否更新成功 */ @Override @Transactional(rollbackFor = Exception.class) public boolean updatePromotionsGoods(PointsGoods promotions) { this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId())); return this.promotionGoodsService.save(new PromotionGoods(promotions, this.checkSkuExist(promotions.getSkuId()))); } /** * 更新促销信息到商品索引 * * @param promotions 促销实体 */ @Override public void updateEsGoodsIndex(PointsGoods promotions) { super.updateEsGoodsIndex(promotions); Map query = MapUtil.builder(new HashMap()).put("id", promotions.getSkuId()).build(); Map update = MapUtil.builder(new HashMap()).put("points", promotions.getPoints()).build(); //修改规格索引,发送mq消息 Map updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(query, update); String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name(); rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback()); } @Override public PromotionTypeEnum getPromotionType() { return PromotionTypeEnum.POINTS_GOODS; } /** * 检查积分商品存在 * * @param id 积分商品id * @return 积分商品信息 */ private PointsGoods checkExist(String id) { PointsGoods pointsGoods = this.getById(id); if (pointsGoods == null) { log.error("id为" + id + "的积分商品不存在!"); throw new ServiceException(); } return pointsGoods; } /** * 检查积分商品是否重复存在 * * @param skuId 商品SkuId * @param id 积分商品I(可选) * @return 积分商品信息 */ private PointsGoods checkSkuDuplicate(String skuId, String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("sku_id", skuId); if (CharSequenceUtil.isNotEmpty(id)) { queryWrapper.ne("id", id); } queryWrapper.and(i -> i .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)) .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW))); return this.getOne(queryWrapper, false); } /** * 检查商品Sku是否存 * * @param skuId skuId * @return 商品sku */ private GoodsSku checkSkuExist(String skuId) { GoodsSku goodsSku = this.goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(skuId); if (goodsSku == null) { log.error("商品ID为" + skuId + "的商品不存在!"); throw new ServiceException(); } return goodsSku; } }