package com.alatus.mall.product.service.impl; import com.alatus.common.constant.ProductConstant; import com.alatus.common.to.SkuReductionTo; import com.alatus.common.to.SpuBoundTo; import com.alatus.common.to.es.SkuEsModel; import com.alatus.common.utils.R; import com.alatus.mall.product.entity.*; import com.alatus.mall.product.feign.CouponFeignService; import com.alatus.mall.product.feign.SearchFeignService; import com.alatus.mall.product.feign.WareFeignService; import com.alatus.mall.product.service.*; import com.alatus.mall.product.vo.*; import com.alibaba.fastjson.TypeReference; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.product.dao.SpuInfoDao; import org.springframework.transaction.annotation.Transactional; @Service("spuInfoService") public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService { @Autowired private SpuInfoDescService spuInfoDescService; @Autowired private SpuImagesService imagesService; @Autowired private AttrService attrService; @Autowired private ProductAttrValueService productAttrValueService; @Autowired private SkuInfoService skuInfoService; @Autowired private SkuImagesService skuImagesService; @Autowired private SkuSaleAttrValueService skuSaleAttrValueService; @Autowired private CouponFeignService couponFeignService; @Autowired private BrandService brandService; @Autowired private CategoryService categoryService; @Autowired private WareFeignService wareFeignService; @Autowired private SearchFeignService searchFeignService; @Override public PageUtils queryPage(Map<String, Object> params) { QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>(); // 处理 "key" 参数 String key = (String) params.get("key"); if (!StringUtils.isEmpty(key) && !"0".equalsIgnoreCase(key)) { wrapper.and((w) -> w.eq("id", key).or().like("spu_name", key)); } // 处理 "status" 参数 String status = (String) params.get("status"); if (!StringUtils.isEmpty(status) && !"0".equalsIgnoreCase(status)) { wrapper.eq("publish_status", status); } // 处理 "brandId" 参数 String brandId = (String) params.get("brandId"); if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) { wrapper.eq("brand_id", brandId); } // 处理 "catelogId" 参数 String catelogId = (String) params.get("catelogId"); if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) { wrapper.eq("catalog_id", catelogId); } // 执行分页查询 IPage<SpuInfoEntity> page = this.page( new Query<SpuInfoEntity>().getPage(params), wrapper ); return new PageUtils(page); } @Override @Transactional public void saveSpuInfo(SpuSaveVo spuSaveVo) { // 保存SPU基本信息 SpuInfoEntity spuInfoEntity = new SpuInfoEntity(); BeanUtils.copyProperties(spuSaveVo,spuInfoEntity); spuInfoEntity.setCreateTime(new Date()); spuInfoEntity.setUpdateTime(new Date()); this.saveBaseSpuInfo(spuInfoEntity); // 保存SPU的描述图片 List<String> decript = spuSaveVo.getDecript(); SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity(); spuInfoDescEntity.setSpuId(spuInfoEntity.getId()); spuInfoDescEntity.setDecript(String.join(",",decript)); spuInfoDescService.save(spuInfoDescEntity); // 保存spu的图片集 List<String> images = spuSaveVo.getImages(); imagesService.saveImages(spuInfoEntity.getId(),images); // 保存SPU的描述信息 List<BaseAttrs> baseAttrs = spuSaveVo.getBaseAttrs(); List<ProductAttrValueEntity> productAttrValueEntities = baseAttrs.stream().map(attr -> { ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity(); productAttrValueEntity.setAttrId(attr.getAttrId()); // 获取名字并赋值 productAttrValueEntity.setAttrName(attrService.getById(attr.getAttrId()).getAttrName()); productAttrValueEntity.setAttrValue(attr.getAttrValues()); productAttrValueEntity.setQuickShow(attr.getShowDesc()); productAttrValueEntity.setSpuId(spuInfoEntity.getId()); return productAttrValueEntity; }).collect(Collectors.toList()); productAttrValueService.saveProductAttr(productAttrValueEntities); // 保存积分信息 Bounds bounds = spuSaveVo.getBounds(); SpuBoundTo spuBoundTo = new SpuBoundTo(); BeanUtils.copyProperties(bounds,spuBoundTo); spuBoundTo.setSpuId(spuInfoEntity.getId()); R r = couponFeignService.saveSpuBounds(spuBoundTo); if(r.getCode() != 0){ log.error("远程保存spu积分信息失败"); } // 保存SPU的规格参数 // 保存当前spu对应的所有sku信息 List<Skus> skus = spuSaveVo.getSkus(); if(skus != null && skus.size() > 0){ skus.forEach(item -> { String defaultImg = ""; for (Images image : item.getImages()) { if(image.getDefaultImg() == 1){ defaultImg = image.getImgUrl(); } } SkuInfoEntity skuInfoEntity = new SkuInfoEntity(); BeanUtils.copyProperties(item,skuInfoEntity); skuInfoEntity.setBrandId(spuInfoEntity.getBrandId()); skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId()); skuInfoEntity.setSkuDesc(item.getSkuSubtitle()); skuInfoEntity.setSaleCount(0L); skuInfoEntity.setSpuId(spuInfoEntity.getId()); skuInfoEntity.setSkuDefaultImg(defaultImg); // sku的基本信息 skuInfoService.saveSkuInfo(skuInfoEntity); Long skuId = skuInfoEntity.getSkuId(); List<SkuImagesEntity> collect = item.getImages().stream().map(img -> { SkuImagesEntity skuImagesEntity = new SkuImagesEntity(); skuImagesEntity.setSkuId(skuId); skuImagesEntity.setImgUrl(img.getImgUrl()); skuImagesEntity.setDefaultImg(img.getDefaultImg()); return skuImagesEntity; }).filter(entity -> { // 返回true就是有值有图片的 return !StringUtils.isEmpty(entity.getImgUrl()); }).collect(Collectors.toList()); // sku的图片信息 skuImagesService.saveBatch(collect); // sku的销售属性信息 List<Attr> attrs = item.getAttr(); List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attrs.stream().map(attr -> { SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity(); BeanUtils.copyProperties(attr, skuSaleAttrValueEntity); skuSaleAttrValueEntity.setSkuId(skuId); return skuSaleAttrValueEntity; }).collect(Collectors.toList()); skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities); // sku的优惠满减信息 SkuReductionTo skuReductionTo = new SkuReductionTo(); BeanUtils.copyProperties(item,skuReductionTo); skuReductionTo.setSkuId(skuId); if(skuReductionTo.getFullCount() > 0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0")) == 1){ R result = couponFeignService.saveSkuReduction(skuReductionTo); if (result.getCode() != 0){ log.error("远程保存sku优惠信息失败"); } } }); } } @Override public void saveBaseSpuInfo(SpuInfoEntity spuInfoEntity) { this.baseMapper.insert(spuInfoEntity); } @Override public void up(Long spuId) { // 查出当前spuID所对应的所有sku信息,品牌的名字等 List<SkuInfoEntity> skuInfoEntities = skuInfoService.getSkusBySpuId(spuId); List<Long> skuIdList = skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList()); // TODO 查询当前spu所有可以被检索的规格参数 List<ProductAttrValueEntity> productAttrValueEntities = productAttrValueService.baseAttrListForSpu(spuId); List<Long> attrIds = productAttrValueEntities.stream().map(productAttrValueEntity -> { return productAttrValueEntity.getAttrId(); }).collect(Collectors.toList()); // 获取可检索的id集合 List<Long> searchAttrIds = attrService.selectSearchAttrs(attrIds); Set<Long> idSet = new HashSet<>(searchAttrIds); // 只取所有规格参数中符合可被检索这一条件,我们用filter拦截掉不符合的那部分 List<SkuEsModel.Attrs> attrs = productAttrValueEntities.stream().filter(productAttrValueEntity -> { return idSet.contains(productAttrValueEntity.getAttrId()); }).map(item -> { SkuEsModel.Attrs attr = new SkuEsModel.Attrs(); BeanUtils.copyProperties(item,attr); return attr; }).collect(Collectors.toList()); // 封装每个sku的信息 // TODO 去库存系统查库存 Map<Long, Boolean> stockMap = null; try{ R result = wareFeignService.getSkuHasStock(skuIdList); if(result.getCode() == 0){ // ArrayList<SkuHasStockVo> skuHasStockVos = new ArrayList<>(); // ArrayList skuHasStockData = (ArrayList) result.get("data"); // for (int i = 0; i < skuHasStockData.size(); i++) { // SkuHasStockVo skuHasStockVo = new SkuHasStockVo(); // Map map = (Map) skuHasStockData.get(i); // skuHasStockVo.setHasStock((Boolean) map.get("hasStock")); // skuHasStockVo.setSkuId(Long.parseLong(map.get("skuId").toString())); // skuHasStockVos.add(skuHasStockVo); // } // stockMap = skuHasStockVos.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock())); // 用了fastJSON以后,优雅,太优雅了!!! TypeReference<List<SkuHasStockVo>> typeReference = new TypeReference<List<SkuHasStockVo>>() { }; stockMap = result.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock())); } }catch (Exception e){ log.error("库存服务查询异常",e); } Map<Long, Boolean> finalStockMap = stockMap; List<SkuEsModel> skuEsModelList = skuInfoEntities.stream().map(skuInfoEntity -> { // 组装需要的数据 SkuEsModel skuEsModel = new SkuEsModel(); BeanUtils.copyProperties(skuInfoEntity,skuEsModel); skuEsModel.setSkuPrice(skuInfoEntity.getPrice()); skuEsModel.setSkuImg(skuInfoEntity.getSkuDefaultImg()); if(finalStockMap == null){ skuEsModel.setHasStock(true); }else{ skuEsModel.setHasStock(finalStockMap.get(skuInfoEntity.getSkuId())); } // TODO 热度评分 skuEsModel.setHotScore(0L); // TODO 查询品牌和分类的名字信息 BrandEntity brand = brandService.getById(skuEsModel.getBrandId()); skuEsModel.setBrandName(brand.getName()); skuEsModel.setBrandImg(brand.getLogo()); CategoryEntity category = categoryService.getById(skuEsModel.getCatalogId()); skuEsModel.setCatalogName(category.getName()); skuEsModel.setAttrs(attrs); return skuEsModel; }).collect(Collectors.toList()); // TODO 发给ES做保存处理,这一步需要让检索服务来操作 R r = searchFeignService.productStatusUp(skuEsModelList); if(r.getCode() == 0){ //远程调用成功 // TODO 修改当前spu的状态 baseMapper.updateSpuStatus(spuId, ProductConstant.SpuStatusEnum.SPU_UP.getCode()); } else{ //调用失败 // TODO 重复调用,接口幂等性.重试机制 } } }
package com.alatus.mall.product.service.impl; import com.alatus.common.constant.ProductConstant; import com.alatus.common.to.SkuReductionTo; import com.alatus.common.to.SpuBoundTo; import com.alatus.common.to.es.SkuEsModel; import com.alatus.common.utils.R; import com.alatus.mall.product.entity.*; import com.alatus.mall.product.feign.CouponFeignService; import com.alatus.mall.product.feign.SearchFeignService; import com.alatus.mall.product.feign.WareFeignService; import com.alatus.mall.product.service.*; import com.alatus.mall.product.vo.*; import com.alibaba.fastjson.TypeReference; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.product.dao.SpuInfoDao; import org.springframework.transaction.annotation.Transactional; @Service("spuInfoService") public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService { @Autowired private SpuInfoDescService spuInfoDescService; @Autowired private SpuImagesService imagesService; @Autowired private AttrService attrService; @Autowired private ProductAttrValueService productAttrValueService; @Autowired private SkuInfoService skuInfoService; @Autowired private SkuImagesService skuImagesService; @Autowired private SkuSaleAttrValueService skuSaleAttrValueService; @Autowired private CouponFeignService couponFeignService; @Autowired private BrandService brandService; @Autowired private CategoryService categoryService; @Autowired private WareFeignService wareFeignService; @Autowired private SearchFeignService searchFeignService; @Override public PageUtils queryPage(Map<String, Object> params) { QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>(); // 处理 "key" 参数 String key = (String) params.get("key"); if (!StringUtils.isEmpty(key) && !"0".equalsIgnoreCase(key)) { wrapper.and((w) -> w.eq("id", key).or().like("spu_name", key)); } // 处理 "status" 参数 String status = (String) params.get("status"); if (!StringUtils.isEmpty(status) && !"0".equalsIgnoreCase(status)) { wrapper.eq("publish_status", status); } // 处理 "brandId" 参数 String brandId = (String) params.get("brandId"); if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) { wrapper.eq("brand_id", brandId); } // 处理 "catelogId" 参数 String catelogId = (String) params.get("catelogId"); if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) { wrapper.eq("catalog_id", catelogId); } // 执行分页查询 IPage<SpuInfoEntity> page = this.page( new Query<SpuInfoEntity>().getPage(params), wrapper ); return new PageUtils(page); } @Override @Transactional public void saveSpuInfo(SpuSaveVo spuSaveVo) { // 保存SPU基本信息 SpuInfoEntity spuInfoEntity = new SpuInfoEntity(); BeanUtils.copyProperties(spuSaveVo,spuInfoEntity); spuInfoEntity.setCreateTime(new Date()); spuInfoEntity.setUpdateTime(new Date()); this.saveBaseSpuInfo(spuInfoEntity); // 保存SPU的描述图片 List<String> decript = spuSaveVo.getDecript(); SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity(); spuInfoDescEntity.setSpuId(spuInfoEntity.getId()); spuInfoDescEntity.setDecript(String.join(",",decript)); spuInfoDescService.save(spuInfoDescEntity); // 保存spu的图片集 List<String> images = spuSaveVo.getImages(); imagesService.saveImages(spuInfoEntity.getId(),images); // 保存SPU的描述信息 List<BaseAttrs> baseAttrs = spuSaveVo.getBaseAttrs(); List<ProductAttrValueEntity> productAttrValueEntities = baseAttrs.stream().map(attr -> { ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity(); productAttrValueEntity.setAttrId(attr.getAttrId()); // 获取名字并赋值 productAttrValueEntity.setAttrName(attrService.getById(attr.getAttrId()).getAttrName()); productAttrValueEntity.setAttrValue(attr.getAttrValues()); productAttrValueEntity.setQuickShow(attr.getShowDesc()); productAttrValueEntity.setSpuId(spuInfoEntity.getId()); return productAttrValueEntity; }).collect(Collectors.toList()); productAttrValueService.saveProductAttr(productAttrValueEntities); // 保存积分信息 Bounds bounds = spuSaveVo.getBounds(); SpuBoundTo spuBoundTo = new SpuBoundTo(); BeanUtils.copyProperties(bounds,spuBoundTo); spuBoundTo.setSpuId(spuInfoEntity.getId()); R r = couponFeignService.saveSpuBounds(spuBoundTo); if(r.getCode() != 0){ log.error("远程保存spu积分信息失败"); } // 保存SPU的规格参数 // 保存当前spu对应的所有sku信息 List<Skus> skus = spuSaveVo.getSkus(); if(skus != null && skus.size() > 0){ skus.forEach(item -> { String defaultImg = ""; for (Images image : item.getImages()) { if(image.getDefaultImg() == 1){ defaultImg = image.getImgUrl(); } } SkuInfoEntity skuInfoEntity = new SkuInfoEntity(); BeanUtils.copyProperties(item,skuInfoEntity); skuInfoEntity.setBrandId(spuInfoEntity.getBrandId()); skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId()); skuInfoEntity.setSkuDesc(item.getSkuSubtitle()); skuInfoEntity.setSaleCount(0L); skuInfoEntity.setSpuId(spuInfoEntity.getId()); skuInfoEntity.setSkuDefaultImg(defaultImg); // sku的基本信息 skuInfoService.saveSkuInfo(skuInfoEntity); Long skuId = skuInfoEntity.getSkuId(); List<SkuImagesEntity> collect = item.getImages().stream().map(img -> { SkuImagesEntity skuImagesEntity = new SkuImagesEntity(); skuImagesEntity.setSkuId(skuId); skuImagesEntity.setImgUrl(img.getImgUrl()); skuImagesEntity.setDefaultImg(img.getDefaultImg()); return skuImagesEntity; }).filter(entity -> { // 返回true就是有值有图片的 return !StringUtils.isEmpty(entity.getImgUrl()); }).collect(Collectors.toList()); // sku的图片信息 skuImagesService.saveBatch(collect); // sku的销售属性信息 List<Attr> attrs = item.getAttr(); List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attrs.stream().map(attr -> { SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity(); BeanUtils.copyProperties(attr, skuSaleAttrValueEntity); skuSaleAttrValueEntity.setSkuId(skuId); return skuSaleAttrValueEntity; }).collect(Collectors.toList()); skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities); // sku的优惠满减信息 SkuReductionTo skuReductionTo = new SkuReductionTo(); BeanUtils.copyProperties(item,skuReductionTo); skuReductionTo.setSkuId(skuId); if(skuReductionTo.getFullCount() > 0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0")) == 1){ R result = couponFeignService.saveSkuReduction(skuReductionTo); if (result.getCode() != 0){ log.error("远程保存sku优惠信息失败"); } } }); } } @Override public void saveBaseSpuInfo(SpuInfoEntity spuInfoEntity) { this.baseMapper.insert(spuInfoEntity); } @Override public void up(Long spuId) { // 查出当前spuID所对应的所有sku信息,品牌的名字等 List<SkuInfoEntity> skuInfoEntities = skuInfoService.getSkusBySpuId(spuId); List<Long> skuIdList = skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList()); // TODO 查询当前spu所有可以被检索的规格参数 List<ProductAttrValueEntity> productAttrValueEntities = productAttrValueService.baseAttrListForSpu(spuId); List<Long> attrIds = productAttrValueEntities.stream().map(productAttrValueEntity -> { return productAttrValueEntity.getAttrId(); }).collect(Collectors.toList()); // 获取可检索的id集合 List<Long> searchAttrIds = attrService.selectSearchAttrs(attrIds); Set<Long> idSet = new HashSet<>(searchAttrIds); // 只取所有规格参数中符合可被检索这一条件,我们用filter拦截掉不符合的那部分 List<SkuEsModel.Attrs> attrs = productAttrValueEntities.stream().filter(productAttrValueEntity -> { return idSet.contains(productAttrValueEntity.getAttrId()); }).map(item -> { SkuEsModel.Attrs attr = new SkuEsModel.Attrs(); BeanUtils.copyProperties(item,attr); return attr; }).collect(Collectors.toList()); // 封装每个sku的信息 // TODO 去库存系统查库存 Map<Long, Boolean> stockMap = null; try{ R result = wareFeignService.getSkuHasStock(skuIdList); if(result.getCode() == 0){ // ArrayList<SkuHasStockVo> skuHasStockVos = new ArrayList<>(); // ArrayList skuHasStockData = (ArrayList) result.get("data"); // for (int i = 0; i < skuHasStockData.size(); i++) { // SkuHasStockVo skuHasStockVo = new SkuHasStockVo(); // Map map = (Map) skuHasStockData.get(i); // skuHasStockVo.setHasStock((Boolean) map.get("hasStock")); // skuHasStockVo.setSkuId(Long.parseLong(map.get("skuId").toString())); // skuHasStockVos.add(skuHasStockVo); // } // stockMap = skuHasStockVos.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock())); // 用了fastJSON以后,优雅,太优雅了!!! TypeReference<List<SkuHasStockVo>> typeReference = new TypeReference<List<SkuHasStockVo>>() { }; stockMap = result.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock())); } }catch (Exception e){ log.error("库存服务查询异常",e); } Map<Long, Boolean> finalStockMap = stockMap; List<SkuEsModel> skuEsModelList = skuInfoEntities.stream().map(skuInfoEntity -> { // 组装需要的数据 SkuEsModel skuEsModel = new SkuEsModel(); BeanUtils.copyProperties(skuInfoEntity,skuEsModel); skuEsModel.setSkuPrice(skuInfoEntity.getPrice()); skuEsModel.setSkuImg(skuInfoEntity.getSkuDefaultImg()); if(finalStockMap == null){ skuEsModel.setHasStock(true); }else{ skuEsModel.setHasStock(finalStockMap.get(skuInfoEntity.getSkuId())); } // TODO 热度评分 skuEsModel.setHotScore(0L); // TODO 查询品牌和分类的名字信息 BrandEntity brand = brandService.getById(skuEsModel.getBrandId()); skuEsModel.setBrandName(brand.getName()); skuEsModel.setBrandImg(brand.getLogo()); CategoryEntity category = categoryService.getById(skuEsModel.getCatalogId()); skuEsModel.setCatalogName(category.getName()); skuEsModel.setAttrs(attrs); return skuEsModel; }).collect(Collectors.toList()); // TODO 发给ES做保存处理,这一步需要让检索服务来操作 R r = searchFeignService.productStatusUp(skuEsModelList); if(r.getCode() == 0){ //远程调用成功 // TODO 修改当前spu的状态 baseMapper.updateSpuStatus(spuId, ProductConstant.SpuStatusEnum.SPU_UP.getCode()); } else{ //调用失败 // TODO 重复调用,接口幂等性.重试机制 } } }