package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.configure.FebsConfigure; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.enumerates.ActivityTypeEnum; import cc.mrbird.febs.common.enumerates.GoodsTypeEnum; import cc.mrbird.febs.common.enumerates.YesOrNoOrIngEnum; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IActivityService; import cc.mrbird.febs.mall.vo.AdminActivityAddDto; import cc.mrbird.febs.mall.vo.AdminDiscountVO; import cc.mrbird.febs.mall.vo.AdminMallActivityListVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor @Transactional public class ActivityServiceImpl extends ServiceImpl implements IActivityService { private final CouponGoodsMapper couponGoodsMapper; private final MallGoodsMapper mallGoodsMapper; private final MallGoodsSkuMapper mallGoodsSkuMapper; private final MallGoodsStyleMapper mallGoodsStyleMapper; private final FebsConfigure febsConfigure; @Override public IPage getAdminListInPage(MallActivity mallActivity, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); LambdaQueryWrapper mallActivityLambdaQueryWrapper = new LambdaQueryWrapper<>(); String name = mallActivity.getName(); if(StrUtil.isNotEmpty(name)){ mallActivityLambdaQueryWrapper.like(MallActivity::getName,name); } Integer state = mallActivity.getState(); if(ObjectUtil.isNotEmpty(state)){ mallActivityLambdaQueryWrapper.eq(MallActivity::getState,state); } mallActivityLambdaQueryWrapper.orderByDesc(MallActivity::getCreatedTime); Page mallActivityPage = this.baseMapper.selectPage(page, mallActivityLambdaQueryWrapper); return mallActivityPage; } @Override public FebsResponse addAdminActivity(AdminActivityAddDto adminActivityAddDto) { MallActivity mallActivity = new MallActivity(); mallActivity.setName(adminActivityAddDto.getName()); String hd = MallUtils.getOrderNum("HD"); mallActivity.setCode(hd); mallActivity.setStartTime(adminActivityAddDto.getStartTime()); mallActivity.setEndTime(adminActivityAddDto.getEndTime()); mallActivity.setMaxImage(adminActivityAddDto.getMaxImage()); mallActivity.setMinImage(adminActivityAddDto.getMinImage()); mallActivity.setState(YesOrNoOrIngEnum.NO.getValue()); mallActivity.setType(adminActivityAddDto.getType()); List activityGoodsIds = adminActivityAddDto.getActivityGoodsIds(); String collect = activityGoodsIds.stream() .map(String::valueOf) // 将 Long 转换为 String .collect(Collectors.joining(","));// 使用逗号连接 mallActivity.setActivityGoodsIds(collect); this.baseMapper.insert(mallActivity); if(ActivityTypeEnum.ZHE_KOU.getValue() == adminActivityAddDto.getType()){ BigDecimal discountSize = adminActivityAddDto.getDiscountSize(); mallActivity.setDiscountSize(discountSize); addDiscountGoods(mallActivity.getId(),discountSize,activityGoodsIds); } if(ActivityTypeEnum.YOU_HUI_JUAN.getValue() == adminActivityAddDto.getType()){ mallActivity.setCouponId(adminActivityAddDto.getCouponId()); // addCouponGoods(adminActivityAddDto.getCouponId(),activityGoodsIds); } this.baseMapper.updateById(mallActivity); return new FebsResponse().success().data("操作成功"); } private void addDiscountGoods(Long activityId,BigDecimal discountSize, List goodsIds){ MallActivity mallActivity = this.baseMapper.selectById(activityId); //将对应选中的商品按照这个折扣力度重新计算一遍 List mallGoods = mallGoodsMapper.selectList( new LambdaQueryWrapper() .eq(MallGoods::getIsNormal, GoodsTypeEnum.PU_TONG.getValue()) .in(MallGoods::getId, goodsIds) ); if(CollUtil.isNotEmpty(mallGoods)){ List> futures = new ArrayList<>(); //复制对应的商品的规则 for(MallGoods mallGoodsItem:mallGoods){ CompletableFuture uCompletableFuture = CompletableFuture.runAsync(() -> { Long goodsId = mallGoodsItem.getId(); //新增活动商品 Long goodsIdNew = addGoodsEntity(mallActivity, discountSize, mallGoodsItem); List mallGoodsStyles = mallGoodsStyleMapper.selectList( new LambdaQueryWrapper() .eq(MallGoodsStyle::getGoodsId, goodsId) ); if(CollUtil.isNotEmpty(mallGoodsStyles)){ for(MallGoodsStyle mallGoodsStyleItem:mallGoodsStyles){ Long styleItemId = mallGoodsStyleItem.getId(); Long styleItemIdNew = addGoodsStyleEntity(goodsIdNew, mallGoodsStyleItem); List mallGoodsSkus = mallGoodsSkuMapper.selectList( new LambdaQueryWrapper() .eq(MallGoodsSku::getStyleId, styleItemId) .eq(MallGoodsSku::getGoodsId, goodsId) ); if(CollUtil.isNotEmpty(mallGoodsSkus)){ for(MallGoodsSku mallGoodsSkuItem:mallGoodsSkus){ addGoodsSkuEntity(goodsIdNew,styleItemIdNew,discountSize,mallGoodsSkuItem); } } } } },febsConfigure.asyncThreadPoolTaskExecutor()); futures.add(uCompletableFuture); } // 等待所有任务完成 CompletableFuture allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); allOf.join(); } } private Long addGoodsEntity(MallActivity mallActivity,BigDecimal discountSize,MallGoods mallGoodsItem){ mallGoodsItem.setIsNormal(GoodsTypeEnum.HUO_DONG.getValue()); mallGoodsItem.setGoodsName(mallActivity.getName()+"-"+(StrUtil.isEmpty(mallGoodsItem.getGoodsName()) ? "":mallGoodsItem.getGoodsName())); mallGoodsItem.setGoodsNo("HD"+mallActivity.getId()+"-"+mallGoodsItem.getGoodsNo()); mallGoodsItem.setActivityId(mallActivity.getId()); BigDecimal presentPrice = new BigDecimal(mallGoodsItem.getPresentPrice()).multiply(discountSize).setScale(2, RoundingMode.DOWN); mallGoodsItem.setPresentPrice(presentPrice.toString()); mallGoodsMapper.insert(mallGoodsItem); return mallGoodsItem.getId(); } private Long addGoodsStyleEntity(Long goodsId,MallGoodsStyle mallGoodsStyleItem){ mallGoodsStyleItem.setGoodsId(goodsId); mallGoodsStyleMapper.insert(mallGoodsStyleItem); return mallGoodsStyleItem.getId(); } private Long addGoodsSkuEntity(Long goodsId,Long styleId,BigDecimal discountSize,MallGoodsSku sku){ sku.setGoodsId(goodsId); sku.setStyleId(styleId); BigDecimal presentPrice = sku.getPresentPrice().multiply(discountSize).setScale(2, RoundingMode.DOWN); sku.setPresentPrice(presentPrice); mallGoodsSkuMapper.insert(sku); return sku.getId(); } private void addCouponGoods(Long couponId,List goodsIds){ // 先判断是否存在关联商品,再进行查询和删除 if (CollUtil.isNotEmpty(couponGoodsMapper.selectList( new LambdaQueryWrapper() .select(CouponGoods::getId) .eq(CouponGoods::getCouponId, couponId)))) { couponGoodsMapper.delete(new LambdaQueryWrapper().eq(CouponGoods::getCouponId, couponId)); } // 处理 goodsIds 为 null 或空的情况 if (CollUtil.isNotEmpty(goodsIds)) { for (Long goodsId : goodsIds) { CouponGoods couponGoods = new CouponGoods(); couponGoods.setGoodsId(goodsId); couponGoods.setCouponId(couponId); couponGoodsMapper.insert(couponGoods); } } } @Override public FebsResponse discountUpdate(AdminDiscountVO adminDiscountVO) { return null; } @Override public List getAdminActivityList() { List mallActivityList = new ArrayList<>(); List mallActivities = this.baseMapper.selectList( new LambdaQueryWrapper() .select(MallActivity::getId, MallActivity::getName, MallActivity::getState, MallActivity::getType) ); if(CollUtil.isNotEmpty(mallActivities)){ for (MallActivity mallActivity : mallActivities) { AdminMallActivityListVo adminMallActivityListVo = new AdminMallActivityListVo(); adminMallActivityListVo.setId(mallActivity.getId()); String desc = YesOrNoOrIngEnum.YES.getActivityDesc(mallActivity.getState()); String desc1 = ActivityTypeEnum.ZHE_KOU.getActivityType(mallActivity.getType()); adminMallActivityListVo.setName(mallActivity.getName()+desc+desc1); mallActivityList.add(adminMallActivityListVo); } } return mallActivityList; } @Override public FebsResponse changeAdminState(Long id, Integer state) { MallActivity mallActivity = this.baseMapper.selectById(id); mallActivity.setState(state); this.baseMapper.updateById(mallActivity); if(YesOrNoOrIngEnum.NO.getValue() == state){ List mallGoods = mallGoodsMapper.selectList( new LambdaQueryWrapper() .eq(MallGoods::getActivityId, id) ); if(CollUtil.isNotEmpty(mallGoods)){ MallGoods goods = new MallGoods(); goods.setIsSale(MallGoods.ISSALE_STATUS_DISABLED); mallGoodsMapper.update(goods, new LambdaQueryWrapper() .eq(MallGoods::getIsSale, MallGoods.ISSALE_STATUS_ENABLE) .eq(MallGoods::getActivityId, id) ); } } return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse delAdminActivity(Long id) { this.baseMapper.deleteById(id); return new FebsResponse().success().message("操作成功"); } @Override public List getAdminActivityListByType(Integer type) { List mallActivityList = new ArrayList<>(); List mallActivities = this.baseMapper.selectList( new LambdaQueryWrapper() .select(MallActivity::getId, MallActivity::getName, MallActivity::getState) .eq(MallActivity::getType, type) ); if(CollUtil.isNotEmpty(mallActivities)){ for (MallActivity mallActivity : mallActivities) { AdminMallActivityListVo adminMallActivityListVo = new AdminMallActivityListVo(); adminMallActivityListVo.setId(mallActivity.getId()); String desc = YesOrNoOrIngEnum.YES.getActivityDesc(mallActivity.getState()); adminMallActivityListVo.setName(mallActivity.getName()+desc); mallActivityList.add(adminMallActivityListVo); } } return mallActivityList; } }