master:新增商品时,默认新增档口商品对应颜色的库存;

pull/1121/head
liujiang 2025-09-22 14:09:29 +08:00
parent 90f3fe37a9
commit b40ef4f06b
7 changed files with 123 additions and 35 deletions

View File

@ -4,7 +4,8 @@ import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.web.controller.xkt.shipMaster.vo.DoubleRunImportVO;
import com.ruoyi.web.controller.xkt.shipMaster.vo.DoubleRunAttrRQVO;
import com.ruoyi.web.controller.xkt.shipMaster.vo.DoubleRunRQVO;
import com.ruoyi.xkt.service.shipMaster.IShipMasterService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
@ -31,16 +32,16 @@ public class DoubleRunController extends BaseController {
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
@PostMapping("/cache")
public R<Integer> createCache(@Validated @RequestBody DoubleRunImportVO importVO) {
List<DoubleRunImportVO.DRIArtNoVO> artNoList = importVO.getData().getData();
final Integer userId = importVO.getData().getData().get(0).getUserId();
public R<Integer> createCache(@Validated @RequestBody DoubleRunRQVO importVO) {
List<DoubleRunRQVO.DRIArtNoVO> artNoList = importVO.getData().getData();
final Integer userId = importVO.getData().getData().get(0).getUser_id();
// 先从redis中获取列表数据
List<DoubleRunImportVO.DRIArtNoSkuVO> cacheList = ObjectUtils.defaultIfNull(redisCache
List<DoubleRunRQVO.DRIArtNoSkuVO> cacheList = ObjectUtils.defaultIfNull(redisCache
.getCacheObject(CacheConstants.DOUBLE_RUN_KEY + userId), new ArrayList<>());
// Map<String, Map<String, List<DoubleRunImportVO.DRIArtNoSkuVO>>> artNoMap = new LinkedHashMap<>();
artNoList.forEach(artNoInfo -> {
artNoInfo.getSkus().forEach(x -> x.setColor(this.decodeUnicode(x.getColor()))
.setArticle_number(artNoInfo.getArticle_number()));
.setArticle_number(artNoInfo.getArticle_number()).setProduct_id(artNoInfo.getId()));
cacheList.addAll(artNoInfo.getSkus());
// artNoMap.put(artNoInfo.getArticle_number(), artNoInfo.getSkus().stream().collect(Collectors
// .groupingBy(DoubleRunImportVO.DRIArtNoSkuVO::getColor)));
@ -61,33 +62,57 @@ public class DoubleRunController extends BaseController {
return R.ok();
}
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
@PostMapping("/attr/cache/{product_id}")
public R<Integer> createAttrCache(@PathVariable Integer product_id, @Validated @RequestBody DoubleRunAttrRQVO attrVO) {
Map<String, String> attrMap = new HashMap<>();
attrVO.getData().forEach((itemId, attr) -> {
// 不处理 multi=1 的属性
if (attr.getMulti() == 1) {
return;
}
// 有值
if (attr.getHas_value() == 1) {
attr.getAttr().stream().filter(x -> x.getChoosed() == 1).forEach(x -> attrMap.put(this.decodeUnicode(x.getProps_name()), this.decodeUnicode(x.getPropsvalue_name())));
}
});
Map<Integer, Map<String, String>> productIdAttrMap = new HashMap<>();
productIdAttrMap.put(product_id, attrMap);
return R.ok();
}
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
@GetMapping("/cache/{userId}")
public R<Integer> getCache(@PathVariable Integer userId) {
// 从redis中获取数据
List<DoubleRunImportVO.DRIArtNoSkuVO> cacheList = ObjectUtils.defaultIfNull(redisCache
List<DoubleRunRQVO.DRIArtNoSkuVO> cacheList = ObjectUtils.defaultIfNull(redisCache
.getCacheObject(CacheConstants.DOUBLE_RUN_KEY + userId), new ArrayList<>());
if (CollectionUtils.isEmpty(cacheList)) {
return R.fail();
}
Map<String, List<DoubleRunImportVO.DRIArtNoSkuVO>> artNoGroup = cacheList.stream()
.sorted(Comparator.comparing(DoubleRunImportVO.DRIArtNoSkuVO::getArticle_number)
.thenComparing(DoubleRunImportVO.DRIArtNoSkuVO::getColor))
Map<String, List<DoubleRunRQVO.DRIArtNoSkuVO>> artNoGroup = cacheList.stream()
.sorted(Comparator.comparing(DoubleRunRQVO.DRIArtNoSkuVO::getArticle_number)
.thenComparing(DoubleRunRQVO.DRIArtNoSkuVO::getColor))
.collect(Collectors
.groupingBy(DoubleRunImportVO.DRIArtNoSkuVO::getArticle_number, LinkedHashMap::new, Collectors.toList()));
.groupingBy(DoubleRunRQVO.DRIArtNoSkuVO::getArticle_number, LinkedHashMap::new, Collectors.toList()));
// 货号 颜色 map
Map<String, List<String>> artNoColorMap = new LinkedHashMap<>();
artNoGroup.forEach((artNo, colorList) -> {
artNoColorMap.put(artNo, colorList.stream().map(DoubleRunImportVO.DRIArtNoSkuVO::getColor).collect(Collectors.toList()));
artNoColorMap.put(artNo, colorList.stream().map(DoubleRunRQVO.DRIArtNoSkuVO::getColor).collect(Collectors.toList()));
});
artNoColorMap.forEach((k,v) -> {
System.err.println(k + ":" + v);
});
// TODO 如何对比??
return R.ok();
}
@ -102,6 +127,8 @@ public class DoubleRunController extends BaseController {
if (unicodeStr == null || unicodeStr.isEmpty()) {
return unicodeStr;
}
// 去除首尾的空格
unicodeStr = unicodeStr.trim();
StringBuilder result = new StringBuilder();
int i = 0;
while (i < unicodeStr.length()) {

View File

@ -4,7 +4,7 @@ import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.web.controller.xkt.shipMaster.vo.ShipMasterImportVO;
import com.ruoyi.web.controller.xkt.shipMaster.vo.ShipMasterRQVO;
import com.ruoyi.xkt.service.shipMaster.IShipMasterService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
@ -31,11 +31,11 @@ public class ShipMasterController extends BaseController {
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
@PostMapping("/cache")
public R<Integer> createCache(@Validated @RequestBody ShipMasterImportVO importVO) {
public R<Integer> createCache(@Validated @RequestBody ShipMasterRQVO importVO) {
// 供应商ID
final Integer supplierId = importVO.getData().getRecords().get(0).getSupplierId();
// 先从redis中获取列表数据
List<ShipMasterImportVO.SMIVO> cacheList = ObjectUtils.defaultIfNull(redisCache
List<ShipMasterRQVO.SMIVO> cacheList = ObjectUtils.defaultIfNull(redisCache
.getCacheObject(CacheConstants.SUPPLIER_KEY + supplierId), new ArrayList<>());
CollectionUtils.addAll(cacheList, importVO.getData().getRecords());
// 存到redis中
@ -47,23 +47,23 @@ public class ShipMasterController extends BaseController {
@GetMapping("/cache/{supplierId}")
public R<Integer> getCache(@PathVariable Integer supplierId) {
// 从redis中获取数据
List<ShipMasterImportVO.SMIVO> cacheList = ObjectUtils.defaultIfNull(redisCache
List<ShipMasterRQVO.SMIVO> cacheList = ObjectUtils.defaultIfNull(redisCache
.getCacheObject(CacheConstants.SUPPLIER_KEY + supplierId), new ArrayList<>());
if (CollectionUtils.isEmpty(cacheList)) {
return R.fail();
}
// 按照artNo分组
Map<String, List<ShipMasterImportVO.SMIVO>> artNoGroup = cacheList.stream()
.sorted(Comparator.comparing(ShipMasterImportVO.SMIVO::getArtNo)
.thenComparing(ShipMasterImportVO.SMIVO::getColor))
Map<String, List<ShipMasterRQVO.SMIVO>> artNoGroup = cacheList.stream()
.sorted(Comparator.comparing(ShipMasterRQVO.SMIVO::getArtNo)
.thenComparing(ShipMasterRQVO.SMIVO::getColor))
.collect(Collectors
.groupingBy(ShipMasterImportVO.SMIVO::getArtNo, LinkedHashMap::new, Collectors.toList()));
.groupingBy(ShipMasterRQVO.SMIVO::getArtNo, LinkedHashMap::new, Collectors.toList()));
// 货号 颜色 对应的条码前缀
Map<String, Map<String, String>> artSnPrefixMap = new LinkedHashMap<>();
// 货号 颜色 map
Map<String, List<String>> artNoColorMap = new LinkedHashMap<>();
artNoGroup.forEach((artNo, colorList) -> {
artNoColorMap.put(artNo, colorList.stream().map(ShipMasterImportVO.SMIVO::getColor).collect(Collectors.toList()));
artNoColorMap.put(artNo, colorList.stream().map(ShipMasterRQVO.SMIVO::getColor).collect(Collectors.toList()));
Map<String, String> snPrefixMap = new LinkedHashMap<>();
// 按照颜色设置条码前缀
colorList.forEach(color -> snPrefixMap

View File

@ -0,0 +1,40 @@
package com.ruoyi.web.controller.xkt.shipMaster.vo;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* @author liangyq
* @date 2025-05-11 23:46
*/
@Data
public class DoubleRunAttrRQVO {
private Map<String, DRAAttrVO> data;
@Data
public static class DRAAttrVO {
private Integer must;
private Integer multi;
private Integer has_value;
// eg: 帮面材质
private String name;
private Integer props_id;
private List<DRAAttrItemVO> attr;
@Data
public static class DRAAttrItemVO {
private Integer props_id;
// eg: 帮面材质
private String props_name;
private Integer propsvalue_id;
// eg: 头层牛皮
private String propsvalue_name;
private Integer choosed;
}
}
}

View File

@ -11,7 +11,7 @@ import java.util.List;
* @date 2025-05-11 23:46
*/
@Data
public class DoubleRunImportVO {
public class DoubleRunRQVO {
private DRIDataVO data;
@ -22,7 +22,8 @@ public class DoubleRunImportVO {
@Data
public static class DRIArtNoVO {
private Integer userId;
private Integer id;
private Integer user_id;
private String article_number;
private List<DRIArtNoSkuVO> skus;
}
@ -30,6 +31,7 @@ public class DoubleRunImportVO {
@Data
@Accessors(chain = true)
public static class DRIArtNoSkuVO {
private Integer product_id;
private String article_number;
private String color;
private Integer size;

View File

@ -9,7 +9,7 @@ import java.util.List;
* @date 2025-05-11 23:46
*/
@Data
public class ShipMasterImportVO {
public class ShipMasterRQVO {
private SMIDataVO data;

View File

@ -12,6 +12,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
/**
* store_product_stock
*
*
* @author ruoyi
* @date 2025-03-26

View File

@ -220,7 +220,7 @@ public class StoreProductServiceImpl implements IStoreProductService {
.setRecommendWeight(0L).setSaleWeight(0L).setPopularityWeight(0L);
int count = this.storeProdMapper.insert(storeProd);
// 新增档口商品颜色相关
this.createProdColor(createDTO, storeProd.getId(), storeProd.getStoreId());
this.createProdColor(createDTO, storeProd.getId(), storeProd.getStoreId(), storeProd.getProdArtNum());
// 新增档口商品其它属性
this.createOtherProperties(createDTO, storeProd);
// 立即发布 将商品同步到 ES 商品文档,并将商品主图同步到 以图搜款服务中
@ -279,7 +279,7 @@ public class StoreProductServiceImpl implements IStoreProductService {
// 档口工艺信息的del_flag置为2
this.storeProdProcMapper.updateDelFlagByStoreProdId(storeProdId);
// 更新档口商品颜色价格及尺码等
this.updateColorRelation(updateDTO, storeProd.getId(), storeProd.getStoreId());
this.updateColorRelation(updateDTO, storeProd.getId(), storeProd.getStoreId(), storeProd.getProdArtNum());
// 处理更新逻辑
this.updateOtherProperties(updateDTO, storeProd);
// 只有在售和尾货状态更新ES 信息 及 图搜
@ -337,12 +337,12 @@ public class StoreProductServiceImpl implements IStoreProductService {
/**
*
*
* @param updateDTO
* @param updateDTO
* @param storeProdId ID
* @param storeId ID
* @param prodArtNum
*/
private void updateColorRelation(StoreProdDTO updateDTO, Long storeProdId, Long storeId) {
private void updateColorRelation(StoreProdDTO updateDTO, Long storeProdId, Long storeId, String prodArtNum) {
// 处理档口所有颜色
Map<String, Long> storeColorMap = updateDTO.getAllColorList().stream().filter(x -> ObjectUtils.isNotEmpty(x.getStoreColorId()))
.collect(Collectors.toMap(StoreColorDTO::getColorName, StoreColorDTO::getStoreColorId));
@ -415,6 +415,20 @@ public class StoreProductServiceImpl implements IStoreProductService {
if (CollectionUtils.isNotEmpty(nullSnPrefixList)) {
this.storeProdColorSizeMapper.updateById(nullSnPrefixList);
}
// 正在生效的颜色
List<StoreProductColor> validColorList = dbProdColorList.stream().filter(x -> Objects.equals(x.getDelFlag(), UNDELETED)).collect(Collectors.toList());
final List<Long> validColorIdList = validColorList.stream().map(StoreProductColor::getId).collect(Collectors.toList());
// 如果数据库不存在该商品颜色的库存,则初始化
List<StoreProductStock> dbProdStockList = Optional.ofNullable(this.prodStockMapper.selectList(new LambdaQueryWrapper<StoreProductStock>()
.eq(StoreProductStock::getStoreProdId, storeProdId).eq(StoreProductStock::getDelFlag, Constants.UNDELETED))).orElse(new ArrayList<>());
final List<Long> dbExistStockColorIdList = dbProdStockList.stream().map(StoreProductStock::getStoreProdColorId).collect(Collectors.toList());
// 有哪些颜色是删除的
dbProdStockList.stream().filter(x -> !validColorIdList.contains(x.getStoreProdColorId())).forEach(x -> x.setDelFlag(Constants.DELETED));
// 有哪些是新增的颜色
validColorList.stream().filter(x -> !dbExistStockColorIdList.contains(x.getId()))
.forEach(x -> dbProdStockList.add(BeanUtil.toBean(x, StoreProductStock.class).setProdArtNum(prodArtNum).setStoreProdColorId(x.getId())));
this.prodStockMapper.insertOrUpdate(dbProdStockList);
}
/**
@ -456,12 +470,12 @@ public class StoreProductServiceImpl implements IStoreProductService {
/**
*
*
* @param createDTO
* @param createDTO
* @param storeProdId ID
* @param storeId ID
* @param prodArtNum
*/
private void createProdColor(StoreProdDTO createDTO, Long storeProdId, Long storeId) {
private void createProdColor(StoreProdDTO createDTO, Long storeProdId, Long storeId, String prodArtNum) {
// 处理档口所有颜色
Map<String, Long> storeColorMap = createDTO.getAllColorList().stream().filter(x -> ObjectUtils.isNotEmpty(x.getStoreColorId()))
.collect(Collectors.toMap(StoreColorDTO::getColorName, StoreColorDTO::getStoreColorId));
@ -488,6 +502,10 @@ public class StoreProductServiceImpl implements IStoreProductService {
// 设置档口商品价格尺码的barcode_prefix
prodColorSizeList.forEach(x -> x.setSnPrefix(storeId + String.format("%08d", x.getId())));
this.storeProdColorSizeMapper.updateById(prodColorSizeList);
// 新增档口库存初始化数据
List<StoreProductStock> prodStockList = prodColorList.stream().map(x -> BeanUtil.toBean(x, StoreProductStock.class)
.setProdArtNum(prodArtNum).setStoreProdColorId(x.getId())).collect(Collectors.toList());
this.prodStockMapper.insert(prodStockList);
// 设置了档口商品全部优惠的客户,新增商品优惠
this.createStoreCusDiscount(prodColorList, storeProdId);
}