From 992e35ab35df4556e374ac8817e751b8a39240c5 Mon Sep 17 00:00:00 2001 From: wangchen147 <30853657+wangchen147@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:17:27 +0800 Subject: [PATCH] =?UTF-8?q?ShopNewcomerSelectPageVo=E7=B1=BB=E5=90=8D?= =?UTF-8?q?=E4=B8=8D=E5=8C=B9=E9=85=8D=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/marketing/IShopNewcomerService.java | 26 + .../impl/ShopNewcomerServiceImpl.java | 468 ++++++++++++++++++ .../vo/ShopNewcomerSelectPageVo.java | 21 + 3 files changed, 515 insertions(+) create mode 100644 webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/IShopNewcomerService.java create mode 100644 webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/impl/ShopNewcomerServiceImpl.java create mode 100644 webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/vo/ShopNewcomerSelectPageVo.java diff --git a/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/IShopNewcomerService.java b/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/IShopNewcomerService.java new file mode 100644 index 00000000..b0193f59 --- /dev/null +++ b/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/IShopNewcomerService.java @@ -0,0 +1,26 @@ +package com.niu.shop.service.admin.marketing; + +import com.niu.core.common.domain.PageParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerSelectPageParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerSelectSkuParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerSetConfigParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerShopGoodsVo; +import com.niu.shop.service.admin.marketing.vo.ShopNewcomerSelectPageVo; +import com.niu.shop.service.admin.marketing.vo.ShopNewcomerConfigVo; +import com.niu.shop.service.admin.marketing.vo.ShopNewcomerSelectSkuVo; + +import java.util.List; + +/** + * 新人专享会员参与记录服务接口 + */ +public interface IShopNewcomerService { + + void setConfig(ShopNewcomerSetConfigParam param); + + ShopNewcomerConfigVo getConfig(); + + ShopNewcomerSelectPageVo getSelectPage(PageParam pageParam, ShopNewcomerSelectPageParam param); + + List getSelectSku(ShopNewcomerSelectSkuParam param); +} diff --git a/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/impl/ShopNewcomerServiceImpl.java b/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/impl/ShopNewcomerServiceImpl.java new file mode 100644 index 00000000..4ea056a9 --- /dev/null +++ b/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/impl/ShopNewcomerServiceImpl.java @@ -0,0 +1,468 @@ +package com.niu.shop.service.admin.marketing.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.niu.core.common.domain.PageParam; +import com.niu.core.common.utils.RequestUtils; +import com.niu.core.common.utils.date.DateUtils; +import com.niu.core.enums.upload.UploadThumbTypeEnum; +import com.niu.core.service.core.sys.ICoreUploadService; +import com.niu.shop.entity.active.ShopActive; +import com.niu.shop.entity.active.ShopActiveGoods; +import com.niu.shop.entity.goods.ShopGoods; +import com.niu.shop.entity.goods.ShopGoodsSku; +import com.niu.shop.enums.active.ActiveClassEnum; +import com.niu.shop.enums.active.ActiveGoodsTypeEnum; +import com.niu.shop.enums.active.ActiveStatusEnum; +import com.niu.shop.enums.active.ActiveTypeEnum; +import com.niu.shop.enums.goods.GoodsTypeEnum; +import com.niu.shop.mapper.active.ShopActiveGoodsMapper; +import com.niu.shop.mapper.active.ShopActiveMapper; +import com.niu.shop.mapper.goods.ShopGoodsMapper; +import com.niu.shop.mapper.goods.ShopGoodsSkuMapper; +import com.niu.shop.service.admin.marketing.IShopNewcomerService; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerSelectPageParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerSelectSkuParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerSetConfigParam; +import com.niu.shop.service.admin.marketing.param.ShopNewcomerShopGoodsVo; +import com.niu.shop.service.admin.marketing.vo.ShopNewcomerSelectPageVo; +import com.niu.shop.service.admin.marketing.vo.ShopNewcomerConfigVo; +import com.niu.shop.service.admin.marketing.vo.ShopNewcomerSelectSkuVo; +import com.niu.shop.service.core.marketing.ICoreActiveService; +import com.niu.shop.service.core.marketing.ICoreShopNewcomerService; +import com.niu.shop.service.core.marketing.model.ShopManjianGoodsData; +import com.niu.shop.service.core.marketing.model.ShopNewcomerActiveValue; +import com.niu.shop.service.core.marketing.vo.CoreShopNewcomerConfigVo; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 新人专享会员参与记录实现 + */ +@Service +@RequiredArgsConstructor +public class ShopNewcomerServiceImpl implements IShopNewcomerService { + private final ShopGoodsMapper shopGoodsMapper; + private final ShopActiveMapper shopActiveMapper; + private final ICoreActiveService coreActiveService; + private final ICoreUploadService coreUploadService; + private final ShopGoodsSkuMapper shopGoodsSkuMapper; + private final ShopActiveGoodsMapper shopActiveGoodsMapper; + private final ICoreShopNewcomerService coreShopNewcomerService; + + @Override + public ShopNewcomerConfigVo getConfig() { + CoreShopNewcomerConfigVo config = coreShopNewcomerService.getConfig(RequestUtils.siteId()); + ShopNewcomerConfigVo vo = new ShopNewcomerConfigVo(); + BeanUtils.copyProperties(config, vo); + if (ObjectUtil.isEmpty(config)) { + return vo; + } + + LambdaQueryWrapper shopActiveGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopActiveGoodsLambdaQueryWrapper.eq(ShopActiveGoods::getSiteId, RequestUtils.siteId()) + .eq(ShopActiveGoods::getActiveId, config.getActiveId()) + .eq(ShopActiveGoods::getActiveClass, ActiveClassEnum.NEWCOMER_DISCOUNT.getType()); + List shopActiveGoods = shopActiveGoodsMapper.selectList(shopActiveGoodsLambdaQueryWrapper); + + Set goodsIds = CollStreamUtil.toSet(shopActiveGoods, ShopActiveGoods::getGoodsId); + Map goodsMap = Collections.emptyMap(); + if (ObjectUtil.isNotEmpty(goodsIds)) { + goodsMap = shopGoodsMapper.selectBatchIds(goodsIds).stream().collect(Collectors.toMap(ShopGoods::getGoodsId, e -> e)); + } + + Set skuIds = CollStreamUtil.toSet(shopActiveGoods, ShopActiveGoods::getSkuId); + Map skuMap = Collections.emptyMap(); + if (ObjectUtil.isNotEmpty(skuIds)) { + skuMap = shopGoodsSkuMapper.selectBatchIds(skuIds).stream().collect(Collectors.toMap(ShopGoodsSku::getSkuId, e -> e)); + } + + List activeGoodsList = new ArrayList<>(shopActiveGoods.size()); + for (ShopActiveGoods shopActiveGood : shopActiveGoods) { + ShopGoods goods = goodsMap.getOrDefault(shopActiveGood.getGoodsId(), new ShopGoods()); + ShopGoodsSku sku = skuMap.getOrDefault(shopActiveGood.getSkuId(), new ShopGoodsSku()); + + ShopNewcomerConfigVo.ActiveGoods activeGoods = new ShopNewcomerConfigVo.ActiveGoods(); + activeGoods.setGoodsId(shopActiveGood.getGoodsId()); + activeGoods.setSkuId(shopActiveGood.getSkuId()); + activeGoods.setGoodsName(goods.getGoodsName()); + activeGoods.setGoodsType(goods.getGoodsType()); + activeGoods.setGoodsTypeName(GoodsTypeEnum.getNameByType(goods.getGoodsType())); + activeGoods.setSkuName(sku.getSkuName()); + activeGoods.setSkuImage(sku.getSkuImage()); + activeGoods.setPrice(sku.getPrice()); + activeGoods.setStock(sku.getStock()); + if (shopActiveGood.getActiveGoodsValue().startsWith("[")) { + activeGoods.setActiveGoodsValue(JSONUtil.parseArray(shopActiveGood.getActiveGoodsValue())); + } else { + activeGoods.setActiveGoodsValue(JSONUtil.parseObj(shopActiveGood.getActiveGoodsValue())); + } + + ShopNewcomerConfigVo.Goods goodsData = new ShopNewcomerConfigVo.Goods(); + BeanUtils.copyProperties(goods, goodsData); + goodsData.setGoodsTypeName(GoodsTypeEnum.getNameByType(goods.getGoodsType())); + activeGoods.setGoods(goodsData); + + ShopNewcomerConfigVo.GoodsSkuOne goodsSkuOne = new ShopNewcomerConfigVo.GoodsSkuOne(); + BeanUtils.copyProperties(sku, goodsSkuOne); + activeGoods.setGoodsSkuOne(goodsSkuOne); + + activeGoodsList.add(activeGoods); + } + + vo.setActiveGoods(activeGoodsList); + return vo; + } + + @Override + @Transactional + public void setConfig(ShopNewcomerSetConfigParam param) { + List goodsDataList = JSONArray.parseArray(param.getGoodsData(), ShopManjianGoodsData.class); + if (ActiveStatusEnum.ACTIVE.equals(ActiveStatusEnum.getEnumByStatus(param.getActiveStatus()))) { + checkGoods(goodsDataList); + } + + ShopNewcomerActiveValue activeValue = new ShopNewcomerActiveValue(); + activeValue.setValidityType(param.getValidityType()); + activeValue.setValidityDay(param.getValidityDay()); + activeValue.setValidityTime(ObjectUtil.isEmpty(param.getValidityTime()) ? 0 : DateUtils.StringToTimestamp(param.getValidityTime())); + activeValue.setParticipationWay(param.getParticipationWay()); + activeValue.setAppointTime(ObjectUtil.isEmpty(param.getAppointTime()) ? 0 : DateUtils.StringToTimestamp(param.getAppointTime())); + activeValue.setLimitNum(param.getLimitNum()); + activeValue.setBannerList(param.getBannerList()); + + List activeGoods = new ArrayList<>(CollectionUtil.size(goodsDataList)); + for (ShopManjianGoodsData goodsData : goodsDataList) { + ShopActiveGoods goods = new ShopActiveGoods(); + goods.setSiteId(RequestUtils.siteId()); + goods.setGoodsId(goodsData.getGoodsId()); + goods.setActiveGoodsType(ActiveGoodsTypeEnum.GOODS_SINGLE.getType()); + goods.setActiveClass(ActiveClassEnum.NEWCOMER_DISCOUNT.getType()); + goods.setActiveGoodsValue(JSON.toJSONString(goodsData)); + goods.setSkuId(goodsData.getSkuId()); + goods.setActiveGoodsStatus(param.getActiveStatus()); + goods.setActiveGoodsPrice(NumberUtil.toBigDecimal(goodsData.getNewcomerPrice())); + activeGoods.add(goods); + } + + LambdaQueryWrapper activeLambdaQueryWrapper = new LambdaQueryWrapper<>(); + activeLambdaQueryWrapper.eq(ShopActive::getSiteId, RequestUtils.siteId()) + .eq(ShopActive::getActiveClass, ActiveClassEnum.NEWCOMER_DISCOUNT.getType()); + ShopActive active = shopActiveMapper.selectOne(activeLambdaQueryWrapper); + if (ObjectUtil.isEmpty(active)) { + ShopActive shopActive = new ShopActive(); + shopActive.setActiveDesc(param.getActiveDesc()); + shopActive.setSiteId(RequestUtils.siteId()); + shopActive.setActiveGoodsInfo(param.getGoodsData()); + shopActive.setActiveType(ActiveTypeEnum.GOODS.getType()); + shopActive.setActiveGoodsType(ActiveGoodsTypeEnum.GOODS_SINGLE.getType()); + shopActive.setActiveClass(ActiveClassEnum.NEWCOMER_DISCOUNT.getType()); + shopActive.setActiveValue(JSON.toJSONString(activeValue)); + shopActive.setActiveStatus(param.getActiveStatus()); + coreActiveService.add(shopActive, activeGoods); + return; + } + + active.setSiteId(RequestUtils.siteId()); + active.setActiveStatus(param.getActiveStatus()); + active.setActiveDesc(param.getActiveDesc()); + active.setActiveGoodsInfo(param.getGoodsData()); + active.setActiveType(ActiveTypeEnum.GOODS.getType()); + active.setActiveGoodsType(ActiveGoodsTypeEnum.GOODS_SINGLE.getType()); + active.setActiveClass(ActiveClassEnum.NEWCOMER_DISCOUNT.getType()); + active.setActiveValue(JSON.toJSONString(activeValue)); + activeGoods.forEach(goods -> goods.setActiveId(active.getActiveId())); + coreActiveService.edit(active, activeGoods); + } + + @Override + public ShopNewcomerSelectPageVo getSelectPage(PageParam pageParam, ShopNewcomerSelectPageParam param) { + Integer page = pageParam.getPage(); + Integer limit = pageParam.getLimit(); + + LambdaQueryWrapper shopActiveGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopActiveGoodsLambdaQueryWrapper.eq(ShopActiveGoods::getSiteId, RequestUtils.siteId()) + .eq(ShopActiveGoods::getActiveClass, ActiveClassEnum.NEWCOMER_DISCOUNT.getType()); + List shopActiveGoods = shopActiveGoodsMapper.selectList(shopActiveGoodsLambdaQueryWrapper); + + Set activeGoodsIds = CollStreamUtil.toSet(shopActiveGoods, ShopActiveGoods::getGoodsId); + Set activeSkuIds = CollStreamUtil.toSet(shopActiveGoods, ShopActiveGoods::getSkuId); + + LambdaQueryWrapper shopGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopGoodsLambdaQueryWrapper.eq(ShopGoods::getSiteId, RequestUtils.siteId()) + .orderByDesc(ShopGoods::getSort) + .orderByDesc(ShopGoods::getCreateTime); + + if (ObjectUtil.isNotEmpty(param.getGoodsCategory())) { + shopGoodsLambdaQueryWrapper.eq(ShopGoods::getGoodsCategory, param.getGoodsCategory()); + } + if (ObjectUtil.isNotEmpty(param.getGoodsType())) { + shopGoodsLambdaQueryWrapper.eq(ShopGoods::getGoodsType, param.getGoodsType()); + } + if (ObjectUtil.isNotEmpty(param.getKeyword())) { + shopGoodsLambdaQueryWrapper.and(wrapper -> + wrapper.like(ShopGoods::getGoodsName, param.getKeyword()).or().like(ShopGoods::getSubTitle, param.getKeyword())); + } + + switch (param.getSelectType()) { + case "all": + shopGoodsLambdaQueryWrapper.gt(ShopGoods::getStock, 0) + .eq(ShopGoods::getStatus, 1); + if (ObjectUtil.isNotEmpty(activeGoodsIds)) { + shopGoodsLambdaQueryWrapper.in(ShopGoods::getGoodsId, activeGoodsIds); + } + break; + case "selected": + shopGoodsLambdaQueryWrapper.in(ShopGoods::getGoodsId, ObjectUtil.isEmpty(param.getGoodsIds()) ? List.of(-1) : param.getGoodsIds()); + break; + } + + Page iPage = shopGoodsMapper.selectPage(new Page<>(page, limit), shopGoodsLambdaQueryWrapper); + Set goodsIds = CollStreamUtil.toSet(iPage.getRecords(), ShopGoods::getGoodsId); + + LambdaQueryWrapper shopGoodsSkuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopGoodsSkuLambdaQueryWrapper.eq(ShopGoodsSku::getIsDefault, 1); + if (ObjectUtil.isNotEmpty(activeGoodsIds)) { + shopGoodsSkuLambdaQueryWrapper.in(ShopGoodsSku::getSkuId, activeSkuIds); + } + + if (ObjectUtil.isNotEmpty(goodsIds)) { + shopGoodsSkuLambdaQueryWrapper.in(ShopGoodsSku::getGoodsId, goodsIds); + } + + Map> skuMap = shopGoodsSkuMapper.selectList(shopGoodsSkuLambdaQueryWrapper) + .stream() + .collect(Collectors.groupingBy(ShopGoodsSku::getGoodsId)); + + Map activeGoodsMap = shopActiveGoods + .stream() + .collect(Collectors.toMap(ShopActiveGoods::getSkuId, e -> e)); + + List voList = new ArrayList<>(iPage.getRecords().size()); + for (ShopGoods record : iPage.getRecords()) { + ShopNewcomerShopGoodsVo vo = new ShopNewcomerShopGoodsVo(); + BeanUtils.copyProperties(record, vo); + List skus = skuMap.getOrDefault(record.getGoodsId(), new ArrayList<>()); + if (ObjectUtil.isEmpty(skus)) { + continue; + } + + List skuList = new ArrayList<>(skus.size()); + for (ShopGoodsSku sku : skus) { + ShopActiveGoods activeGoods = activeGoodsMap.get(sku.getSkuId()); + if (activeGoods == null) { + continue; + } + + ShopNewcomerShopGoodsVo.GoodsSku skuVo = new ShopNewcomerShopGoodsVo.GoodsSku(); + BeanUtils.copyProperties(sku, skuVo); + JSONObject activeGoodsValue = JSON.parseObject(activeGoods.getActiveGoodsValue()); + BigDecimal newcomerPrice = Optional.ofNullable(activeGoodsValue.getBigDecimal("newcomer_price")).orElse(BigDecimal.ZERO); + skuVo.setNewcomerPrice(newcomerPrice); + skuList.add(skuVo); + + if (sku.getIsDefault() == 1) { + if (!activeSkuIds.contains(sku.getSkuId())) { + skuVo.setNewcomerPrice(skuList.get(0).getNewcomerPrice()); + } + + vo.setGoodsSku(skuVo); + } + } + + vo.setSkuList(skuList); + + String small = coreUploadService.thumb(RequestUtils.siteId(), vo.getGoodsCover(), UploadThumbTypeEnum.SMALL.getType()).getDataMap().get(UploadThumbTypeEnum.SMALL.getType()); + String mid = coreUploadService.thumb(RequestUtils.siteId(), vo.getGoodsCover(), UploadThumbTypeEnum.MID.getType()).getDataMap().get(UploadThumbTypeEnum.MID.getType()); + vo.setGoodsCoverThumbSmall(small); + vo.setGoodsCoverThumbMid(mid); + + voList.add(vo); + } + + List verifyGoodsId = Collections.emptyList(); + if (ObjectUtil.isAllNotEmpty(param.getVerifyGoodsIds(), activeGoodsIds)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(ShopGoods::getGoodsId, param.getVerifyGoodsIds()) + .eq(ShopGoods::getStatus, 1); + verifyGoodsId = shopGoodsMapper.selectList(queryWrapper) + .stream() + .map(ShopGoods::getGoodsId) + .filter(activeGoodsIds::contains) + .collect(Collectors.toList()); + } + + List verifySkuIds = Collections.emptyList(); + if (ObjectUtil.isAllNotEmpty(param.getVerifySkuIds(), activeSkuIds)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(ShopGoodsSku::getSkuId, param.getVerifySkuIds()); + verifySkuIds = shopGoodsSkuMapper.selectList(queryWrapper) + .stream() + .map(ShopGoodsSku::getSkuId) + .filter(activeSkuIds::contains) + .collect(Collectors.toList()); + } + + ShopNewcomerSelectPageVo vo = new ShopNewcomerSelectPageVo<>(iPage, voList); + return vo.setVerifyGoodsIds(verifyGoodsId) + .setVerifySkuIds(verifySkuIds); + } + + @Override + public List getSelectSku(ShopNewcomerSelectSkuParam param) { + LambdaQueryWrapper shopActiveGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopActiveGoodsLambdaQueryWrapper.eq(ShopActiveGoods::getSiteId, RequestUtils.siteId()) + .eq(ShopActiveGoods::getActiveClass, ActiveClassEnum.NEWCOMER_DISCOUNT.getType()) + .eq(ShopActiveGoods::getActiveGoodsStatus, ActiveStatusEnum.ACTIVE.getStatus()); + List shopActiveGoods = shopActiveGoodsMapper.selectList(shopActiveGoodsLambdaQueryWrapper); + + Set activeGoodsIds = CollStreamUtil.toSet(shopActiveGoods, ShopActiveGoods::getGoodsId); + Set activeSkuIds = CollStreamUtil.toSet(shopActiveGoods, ShopActiveGoods::getSkuId); + + // 检测商品id集合是否存在,移除不存在的商品id,纠正数据准确性 + List list = new LinkedList<>(); + if (ObjectUtil.isAllNotEmpty(param.getVerifyGoodsIds(), activeGoodsIds)) { + LambdaQueryWrapper shopGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopGoodsLambdaQueryWrapper.in(ShopGoods::getGoodsId, param.getVerifyGoodsIds()) + .eq(ShopGoods::getStatus, 1); + List verifyGoodsIds = shopGoodsMapper.selectList(shopGoodsLambdaQueryWrapper) + .stream() + .map(ShopGoods::getGoodsId) + .filter(activeGoodsIds::contains) + .collect(Collectors.toList()); + + shopGoodsLambdaQueryWrapper.clear(); + shopGoodsLambdaQueryWrapper.in(ShopGoods::getGoodsId, verifyGoodsIds) + .orderByDesc(ShopGoods::getSort) + .orderByDesc(ShopGoods::getCreateTime); + List shopGoods = shopGoodsMapper.selectList(shopGoodsLambdaQueryWrapper); + Set goodsIds = CollStreamUtil.toSet(shopGoods, ShopGoods::getGoodsId); + + LambdaQueryWrapper shopGoodsSkuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopGoodsSkuLambdaQueryWrapper.in(ShopGoodsSku::getGoodsId, goodsIds); + + Map> skuMap = shopGoodsSkuMapper.selectList(shopGoodsSkuLambdaQueryWrapper) + .stream() + .collect(Collectors.groupingBy(ShopGoodsSku::getGoodsId)); + + for (ShopGoods shopGood : shopGoods) { + ShopNewcomerSelectSkuVo vo = new ShopNewcomerSelectSkuVo(); + BeanUtils.copyProperties(shopGood, vo); + vo.setGoodsTypeName(GoodsTypeEnum.getNameByType(shopGood.getGoodsType())); + vo.setGoodsCoverThumbSmall(coreUploadService.thumb(RequestUtils.siteId(), shopGood.getGoodsCover(), UploadThumbTypeEnum.SMALL.getType()).getDataMap().get(UploadThumbTypeEnum.SMALL.getType())); + vo.setGoodsCoverThumbMid(coreUploadService.thumb(RequestUtils.siteId(), shopGood.getGoodsCover(), UploadThumbTypeEnum.MID.getType()).getDataMap().get(UploadThumbTypeEnum.MID.getType())); + List shopGoodsSkuList = skuMap.getOrDefault(shopGood.getGoodsId(), new ArrayList<>()); + + List skuList = new ArrayList<>(shopGoodsSkuList.size()); + for (ShopGoodsSku sku : shopGoodsSkuList) { + ShopNewcomerSelectSkuVo.Sku skuVo = new ShopNewcomerSelectSkuVo.Sku(); + BeanUtils.copyProperties(sku, skuVo); + JSONObject activeGoodsValue = JSON.parseObject(shopActiveGoods.get(sku.getSkuId()).getActiveGoodsValue()); + skuVo.setNewcomerPrice(Optional.ofNullable(activeGoodsValue.getBigDecimal("newcomer_price")).orElse(BigDecimal.ZERO)); + + if (sku.getIsDefault() == 1) { + if (!activeSkuIds.contains(sku.getSkuId())) { + skuVo.setNewcomerPrice(skuList.get(0).getNewcomerPrice()); + } + + vo.setGoodsSku(skuVo); + } + + skuList.add(skuVo); + } + list.add(vo); + } + } + + // 检测商品id集合是否存在,移除不存在的商品id,纠正数据准确性 + if (ObjectUtil.isAllNotEmpty(param.getVerifySkuIds(), activeSkuIds)) { + LambdaQueryWrapper shopGoodsSkuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopGoodsSkuLambdaQueryWrapper.in(ShopGoodsSku::getSkuId, param.getVerifySkuIds()); + List skus = shopGoodsSkuMapper.selectList(shopGoodsSkuLambdaQueryWrapper) + .stream() + .filter(sku -> activeSkuIds.contains(sku.getSkuId())) + .collect(Collectors.toList()); + + Set skuIds = CollStreamUtil.toSet(skus, ShopGoodsSku::getSkuId); + + shopGoodsSkuLambdaQueryWrapper.clear(); + shopGoodsSkuLambdaQueryWrapper.in(ShopGoodsSku::getSkuId, skuIds); + Set goodsIds = shopGoodsSkuMapper.selectList(shopGoodsSkuLambdaQueryWrapper) + .stream() + .map(ShopGoodsSku::getGoodsId) + .collect(Collectors.toSet()); + + LambdaQueryWrapper shopGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + shopGoodsLambdaQueryWrapper.in(ShopGoods::getGoodsId, goodsIds) + .orderByDesc(ShopGoods::getSort) + .orderByDesc(ShopGoods::getCreateTime); + List shopGoods = shopGoodsMapper.selectList(shopGoodsLambdaQueryWrapper); + + shopGoodsSkuLambdaQueryWrapper.clear(); + shopGoodsSkuLambdaQueryWrapper.in(ShopGoodsSku::getSkuId, skuIds) + .in(ShopGoodsSku::getGoodsId, CollStreamUtil.toSet(shopGoods, ShopGoods::getGoodsId)); + Map> goodsSkuMap = shopGoodsSkuMapper.selectList(shopGoodsSkuLambdaQueryWrapper) + .stream() + .collect(Collectors.groupingBy(ShopGoodsSku::getGoodsId)); + + Map shopActiveGoodsMap = shopActiveGoods.stream().collect(Collectors.toMap(ShopActiveGoods::getSkuId, e -> e)); + + for (ShopGoods shopGood : shopGoods) { + ShopNewcomerSelectSkuVo vo = new ShopNewcomerSelectSkuVo(); + BeanUtils.copyProperties(shopGood, vo); + List skuList = goodsSkuMap.get(shopGood.getGoodsId()); + if (ObjectUtil.hasEmpty(skus, shopActiveGoods)) { + continue; + } + + List skuVoList = new ArrayList<>(skuList.size()); + for (ShopGoodsSku sku : skuList) { + ShopNewcomerSelectSkuVo.Sku skuVo = new ShopNewcomerSelectSkuVo.Sku(); + BeanUtils.copyProperties(sku, skuVo); + ShopActiveGoods activeGoods = shopActiveGoodsMap.get(sku.getSkuId()); + JSONObject activeGoodsValue = JSON.parseObject(activeGoods.getActiveGoodsValue()); + skuVo.setNewcomerPrice(Optional.ofNullable(activeGoodsValue.getBigDecimal("newcomer_price")).orElse(BigDecimal.ZERO)); + + if (sku.getIsDefault() == 1) { + skuVo.setNewcomerPrice(skuVoList.get(0).getNewcomerPrice()); + } + + skuVoList.add(skuVo); + } + + list.add(vo); + } + } + + return list; + } + + private void checkGoods(List goodsData) { + if (ObjectUtil.isEmpty(goodsData)) { + throw new RuntimeException("请选择参与活动商品"); + } + for (ShopManjianGoodsData goods : goodsData) { + if (ObjectUtil.isEmpty(goods)) { + throw new RuntimeException("商品规格不能为空"); + } + if (ObjectUtil.isEmpty(goods.getNewcomerPrice())) { + throw new RuntimeException("新人价不能为空"); + } + } + } +} diff --git a/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/vo/ShopNewcomerSelectPageVo.java b/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/vo/ShopNewcomerSelectPageVo.java new file mode 100644 index 00000000..b8399fb5 --- /dev/null +++ b/webroot/addon/shop/src/main/java/com/niu/shop/service/admin/marketing/vo/ShopNewcomerSelectPageVo.java @@ -0,0 +1,21 @@ +package com.niu.shop.service.admin.marketing.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.niu.core.common.domain.PageResult; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class ShopNewcomerSelectPageVo extends PageResult { + private List verifyGoodsIds; + private List verifySkuIds; + + public ShopNewcomerSelectPageVo(Page page, List list) { + super(page.getCurrent(), page.getSize(), page.getTotal(), list); + } +}