master:系统调优;
parent
06e1f49c6e
commit
08a31fcc74
|
|
@ -18,6 +18,7 @@ import com.ruoyi.web.controller.xkt.migartion.vo.fhb.FhbProdStockVO;
|
|||
import com.ruoyi.web.controller.xkt.migartion.vo.fhb.FhbProdVO;
|
||||
import com.ruoyi.web.controller.xkt.migartion.vo.gt.GtCateVO;
|
||||
import com.ruoyi.web.controller.xkt.migartion.vo.gt.GtProdSkuVO;
|
||||
import com.ruoyi.web.controller.xkt.migartion.vo.ty.TyProdStockVO;
|
||||
import com.ruoyi.xkt.domain.*;
|
||||
import com.ruoyi.xkt.enums.EProductStatus;
|
||||
import com.ruoyi.xkt.enums.ListingType;
|
||||
|
|
@ -37,6 +38,8 @@ import java.io.UnsupportedEncodingException;
|
|||
import java.net.URLEncoder;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
|
|
@ -318,7 +321,7 @@ public class GtAndFhbBizController extends BaseController {
|
|||
List<GtProdSkuVO> gtMatchSkuList = this.getGtFirstSku(multiSaleSameGoMap, gtSaleGroupMap, cleanArtNo);
|
||||
// 初始化档口商品
|
||||
StoreProduct storeProd = new StoreProduct().setStoreId(initVO.getStoreId()).setProdCateId(cateRelationMap.get(gtMatchSkuList.get(0).getCategory_nid()))
|
||||
.setProdArtNum(cleanArtNo).setProdTitle(gtMatchSkuList.get(0).getCharacters()).setListingWay(ListingType.RIGHT_NOW.getValue())
|
||||
.setProdArtNum(gtMatchSkuList.get(0).getArticle_number()).setProdTitle(gtMatchSkuList.get(0).getCharacters()).setListingWay(ListingType.RIGHT_NOW.getValue())
|
||||
.setVoucherDate(voucherDate).setProdStatus(EProductStatus.ON_SALE.getValue()).setRecommendWeight(0L).setSaleWeight(0L).setPopularityWeight(0L);
|
||||
// 提前设置档口商品的类目属性
|
||||
this.preMatchAttr(gtMatchSkuList.get(0).getProduct_id(), initVO.getUserId(), prodAttrMap);
|
||||
|
|
@ -332,19 +335,22 @@ public class GtAndFhbBizController extends BaseController {
|
|||
List<StoreProductService> prodSvcList = new ArrayList<>();
|
||||
List<StoreProductCategoryAttribute> prodAttrList = new ArrayList<>();
|
||||
storeProdList.forEach(storeProd -> {
|
||||
// 获取clearArtNo
|
||||
String clearArtNo = this.extractCoreArticleNumber(storeProd.getProdArtNum());
|
||||
// FHB匹配的货号
|
||||
List<String> fhbMatchArtNoList = multiSameFhbMap.get(storeProd.getProdArtNum());
|
||||
List<String> fhbMatchArtNoList = multiSameFhbMap.get(clearArtNo);
|
||||
// 获取GT匹配的商品sku列表
|
||||
List<GtProdSkuVO> gtMatchSkuList = this.getGtFirstSku(multiSaleSameGoMap, gtSaleGroupMap, storeProd.getProdArtNum());
|
||||
List<GtProdSkuVO> gtMatchSkuList = this.getGtFirstSku(multiSaleSameGoMap, gtSaleGroupMap, clearArtNo);
|
||||
// 当前货号在GT的所有尺码,作为标准尺码
|
||||
List<Integer> gtStandardSizeList = gtMatchSkuList.stream().map(sku -> (int) Math.floor(Double.parseDouble(sku.getSize()))).collect(Collectors.toList());
|
||||
AtomicInteger orderNum = new AtomicInteger();
|
||||
fhbMatchArtNoList.forEach(fhbArtNo -> {
|
||||
List<FhbProdVO.SMIVO> fhbMatchSkuList = fhbProdGroupMap.get(fhbArtNo);
|
||||
for (int i = 0; i < fhbMatchSkuList.size(); i++) {
|
||||
StoreColor storeColor = Optional.ofNullable(storeColorMap.get(fhbMatchSkuList.get(i).getColor()))
|
||||
.orElseThrow(() -> new ServiceException("没有FHB商品颜色!" + fhbArtNo, HttpStatus.ERROR));
|
||||
// 该商品的颜色
|
||||
prodColorList.add(new StoreProductColor().setStoreId(storeProd.getStoreId()).setStoreProdId(storeProd.getId()).setOrderNum(i + 1)
|
||||
prodColorList.add(new StoreProductColor().setStoreId(storeProd.getStoreId()).setStoreProdId(storeProd.getId()).setOrderNum(orderNum.addAndGet(1))
|
||||
.setColorName(storeColor.getColorName()).setStoreColorId(storeColor.getId()).setProdStatus(EProductStatus.ON_SALE.getValue()));
|
||||
// 该颜色所有的尺码
|
||||
for (int j = 0; j < Constants.SIZE_LIST.size(); j++) {
|
||||
|
|
@ -372,6 +378,7 @@ public class GtAndFhbBizController extends BaseController {
|
|||
});
|
||||
// 插入商品颜色及颜色对应的尺码,档口服务承诺
|
||||
this.prodColorMapper.insert(prodColorList);
|
||||
prodColorSizeList.sort(Comparator.comparing(StoreProductColorSize::getStoreProdId).thenComparing(StoreProductColorSize::getSize));
|
||||
this.prodColorSizeMapper.insert(prodColorSizeList);
|
||||
this.prodSvcMapper.insert(prodSvcList);
|
||||
this.prodCateAttrMapper.insert(prodAttrList);
|
||||
|
|
@ -427,10 +434,11 @@ public class GtAndFhbBizController extends BaseController {
|
|||
List<StoreProductStock> prodStockList = new ArrayList<>();
|
||||
// 依次遍历商品列表,找到货号和FHB货号对应关系,然后用颜色进行匹配,建立客户优惠关系
|
||||
storeProdList.forEach(storeProd -> {
|
||||
final String cleanArtNo = this.extractCoreArticleNumber(storeProd.getProdArtNum());
|
||||
// 当前商品颜色列表 key 颜色中文名称
|
||||
Map<String, StoreProductColor> buJuProdColorMap = Optional.ofNullable(prodColorGroupMap.get(storeProd.getId())).orElseThrow(() -> new ServiceException("没有商品颜色!" + storeProd.getProdArtNum(), HttpStatus.ERROR));
|
||||
// 根据步橘货号 找到FHB对应的货号,可能是列表
|
||||
List<String> fhbAtrNoList = Optional.ofNullable(multiSameFhbMap.get(storeProd.getProdArtNum())).orElseThrow(() -> new ServiceException("没有FHB货号!" + storeProd.getProdArtNum(), HttpStatus.ERROR));
|
||||
List<String> fhbAtrNoList = Optional.ofNullable(multiSameFhbMap.get(cleanArtNo)).orElseThrow(() -> new ServiceException("没有FHB货号!" + storeProd.getProdArtNum(), HttpStatus.ERROR));
|
||||
fhbAtrNoList.forEach(fhbAtrNo -> {
|
||||
// 处理档口客户商品优惠
|
||||
this.handleCusDisc(fhbAtrNo, fhbCusDiscGroupMap, buJuProdColorMap, buJuStoreCusMap, storeProd.getStoreId(), storeProd.getId(), prodCusDiscList);
|
||||
|
|
@ -458,7 +466,7 @@ public class GtAndFhbBizController extends BaseController {
|
|||
*/
|
||||
private void handleProdStock(String fhbAtrNo, Map<String, Map<String, FhbProdStockVO.SMPSRecordVO>> fhbStockGroupMap, Map<String, StoreProductColor> buJuProdColorMap,
|
||||
Long storeId, Long storeProdId, String prodArtNum, List<StoreProductStock> prodStockList) {
|
||||
Map<String, FhbProdStockVO.SMPSRecordVO> fhbColorStockMap = fhbStockGroupMap.get(fhbAtrNo);
|
||||
Map<String, FhbProdStockVO.SMPSRecordVO> fhbColorStockMap = fhbStockGroupMap.getOrDefault(fhbAtrNo, new HashMap<>());
|
||||
buJuProdColorMap.forEach((buJuColor, buJuProdColor) -> {
|
||||
StoreProductStock stock = new StoreProductStock().setStoreId(storeId).setStoreProdId(storeProdId).setProdArtNum(prodArtNum)
|
||||
.setColorName(buJuProdColorMap.get(buJuColor).getColorName()).setStoreProdColorId(buJuProdColorMap.get(buJuColor).getId())
|
||||
|
|
@ -649,9 +657,10 @@ public class GtAndFhbBizController extends BaseController {
|
|||
private List<GtProdSkuVO> getGtFirstSku(Map<String, List<String>> multiSaleSameGoMap, Map<String, List<GtProdSkuVO>> gtSaleGroupMap, String cleanArtNo) {
|
||||
// GT匹配的货号
|
||||
List<String> gtMatchArtNoList = multiSaleSameGoMap.get(cleanArtNo);
|
||||
// 逻辑:如果FHB有多个货号,则都要加到系统中来,因为要扫描条码;如果GT有多个,则只取第一个,匹配相关的属性
|
||||
List<GtProdSkuVO> gtMatchSkuList = gtSaleGroupMap.get(gtMatchArtNoList.get(0));
|
||||
return gtMatchSkuList;
|
||||
// GT 最短的货号
|
||||
String shortestArtNo = gtMatchArtNoList.stream().min(Comparator.comparingInt(String::length))
|
||||
.orElse(gtMatchArtNoList.get(0));
|
||||
return gtSaleGroupMap.get(shortestArtNo);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ import java.io.UnsupportedEncodingException;
|
|||
import java.net.URLEncoder;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
|
|
@ -63,6 +64,7 @@ public class GtAndTyBizController extends BaseController {
|
|||
final StoreProductCategoryAttributeMapper prodCateAttrMapper;
|
||||
final SysProductCategoryMapper prodCateMapper;
|
||||
|
||||
|
||||
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
|
||||
@PutMapping("/sync-es/{storeId}")
|
||||
public void syncToEs(@PathVariable("storeId") Long storeId) {
|
||||
|
|
@ -189,12 +191,311 @@ public class GtAndTyBizController extends BaseController {
|
|||
util.exportExcel(response, downloadList, "差异");
|
||||
}
|
||||
|
||||
/**
|
||||
* 颜色、客户、商品初始化(包含类目属性及服务等)
|
||||
*
|
||||
* @param initVO
|
||||
* @return
|
||||
*/
|
||||
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
|
||||
@PutMapping("/init-prod")
|
||||
@Transactional
|
||||
public R<Integer> initProd(@Validated @RequestBody GtAndTYInitVO initVO) {
|
||||
// 去掉可能的空格
|
||||
initVO.setExcludeArtNoList(initVO.getExcludeArtNoList().stream().map(String::trim).collect(Collectors.toList()));
|
||||
Optional.ofNullable(this.storeMapper.selectOne(new LambdaQueryWrapper<Store>()
|
||||
.eq(Store::getId, initVO.getStoreId()).eq(Store::getDelFlag, Constants.UNDELETED)))
|
||||
.orElseThrow(() -> new ServiceException("档口不存在!", HttpStatus.ERROR));
|
||||
// 步骤1: 颜色初始化
|
||||
this.initStoreColorList(initVO.getStoreId(), initVO.getUserId());
|
||||
// 步骤2: 客户初始化
|
||||
this.initStoreCusList(initVO);
|
||||
// 步骤3: 商品初始化
|
||||
Map<String, List<String>> multiSaleSameGoMap = new HashMap<>();
|
||||
Map<String, List<String>> multiOffSaleSameGoMap = new HashMap<>();
|
||||
Map<String, List<String>> multiSameTyMap = new HashMap<>();
|
||||
List<GtProdSkuVO> gtSaleBasicList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_SALE_BASIC_KEY + initVO.getUserId()), new ArrayList<>());
|
||||
// 查看gt 在售的商品 这边有多少相似的货号
|
||||
gtSaleBasicList.stream().map(GtProdSkuVO::getArticle_number).distinct()
|
||||
// 过滤掉需要特殊处理的货号
|
||||
.filter(article_number -> !initVO.getExcludeArtNoList().contains(article_number))
|
||||
.forEach(article_number -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(article_number);
|
||||
List<String> existList = multiSaleSameGoMap.containsKey(cleanArtNo) ? multiSaleSameGoMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(article_number);
|
||||
multiSaleSameGoMap.put(cleanArtNo, existList);
|
||||
});
|
||||
// 查看gt 下架的商品有多少相似的货号
|
||||
List<GtProdSkuVO> gtOffSaleBasicList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_OFF_SALE_BASIC_KEY + initVO.getUserId()), new ArrayList<>());
|
||||
gtOffSaleBasicList.stream().map(GtProdSkuVO::getArticle_number).distinct().forEach(article_number -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(article_number);
|
||||
List<String> existList = multiOffSaleSameGoMap.containsKey(cleanArtNo) ? multiOffSaleSameGoMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(article_number);
|
||||
multiOffSaleSameGoMap.put(cleanArtNo, existList);
|
||||
});
|
||||
// 查看TY 这边有多少相似的货号
|
||||
List<TyProdImportVO> tyProdList = redisCache.getCacheObject(CacheConstants.MIGRATION_TY_PROD_KEY + initVO.getUserId());
|
||||
tyProdList.stream().map(TyProdImportVO::getProdArtNum).distinct()
|
||||
// 过滤掉需要特殊处理的货号
|
||||
.filter(artNo -> !initVO.getExcludeArtNoList().contains(artNo))
|
||||
.forEach(artNo -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(artNo);
|
||||
List<String> existList = multiSameTyMap.containsKey(cleanArtNo) ? multiSameTyMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(artNo);
|
||||
multiSameTyMap.put(cleanArtNo, existList);
|
||||
});
|
||||
// gt按照货号分组
|
||||
Map<String, List<GtProdSkuVO>> gtSaleGroupMap = gtSaleBasicList.stream().collect(Collectors.groupingBy(GtProdSkuVO::getArticle_number));
|
||||
// GT分类
|
||||
List<GtCateVO.GCIDataVO> cacheList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_SALE_CATE_KEY + initVO.getUserId()), new ArrayList<>());
|
||||
List<SysProductCategory> prodCateList = this.prodCateMapper.selectList(new LambdaQueryWrapper<SysProductCategory>()
|
||||
.eq(SysProductCategory::getDelFlag, Constants.UNDELETED));
|
||||
Map<String, Long> dbCateNameMap = prodCateList.stream().collect(Collectors.toMap(SysProductCategory::getName, SysProductCategory::getId));
|
||||
// GT商品分类和步橘分类映射
|
||||
Map<Integer, Long> cateRelationMap = new HashMap<>();
|
||||
cacheList.forEach(gtCate -> {
|
||||
final Long cateId = Optional.ofNullable(dbCateNameMap.get(gtCate.getName())).orElseThrow(() -> new ServiceException("GT分类不存在!", HttpStatus.ERROR));
|
||||
cateRelationMap.put(gtCate.getId(), cateId);
|
||||
});
|
||||
|
||||
System.err.println("============ 两边系统“一致”的货号 ============");
|
||||
// 清洗后,相同货号映射
|
||||
Set<String> commonArtNos = new HashSet<>(multiSaleSameGoMap.keySet());
|
||||
commonArtNos.retainAll(multiSameTyMap.keySet());
|
||||
// 待导入的商品
|
||||
List<StoreProduct> storeProdList = new ArrayList<>();
|
||||
// 当天
|
||||
final Date voucherDate = java.sql.Date.valueOf(LocalDate.now());
|
||||
// 所有商品的类目属性map key gt的product_id value StoreProductCategoryAttribute
|
||||
Map<Integer, StoreProductCategoryAttribute> prodAttrMap = new HashMap<>();
|
||||
commonArtNos.forEach(cleanArtNo -> {
|
||||
// 获取GT匹配的商品中的第一个商品
|
||||
List<GtProdSkuVO> gtMatchSkuList = this.getGtFirstSku(multiSaleSameGoMap, gtSaleGroupMap, cleanArtNo);
|
||||
// 初始化档口商品
|
||||
StoreProduct storeProd = new StoreProduct().setStoreId(initVO.getStoreId()).setProdCateId(cateRelationMap.get(gtMatchSkuList.get(0).getCategory_nid()))
|
||||
.setProdArtNum(gtMatchSkuList.get(0).getArticle_number()).setProdTitle(gtMatchSkuList.get(0).getCharacters()).setListingWay(ListingType.RIGHT_NOW.getValue())
|
||||
.setVoucherDate(voucherDate).setProdStatus(EProductStatus.ON_SALE.getValue()).setRecommendWeight(0L).setSaleWeight(0L).setPopularityWeight(0L);
|
||||
// 提前设置档口商品的类目属性
|
||||
this.preMatchAttr(gtMatchSkuList.get(0).getProduct_id(), initVO.getUserId(), prodAttrMap);
|
||||
storeProdList.add(storeProd);
|
||||
});
|
||||
this.storeProdMapper.insert(storeProdList);
|
||||
|
||||
// 步骤4: 初始化商品属性
|
||||
List<StoreProductService> prodSvcList = new ArrayList<>();
|
||||
List<StoreProductCategoryAttribute> prodAttrList = new ArrayList<>();
|
||||
storeProdList.forEach(storeProd -> {
|
||||
// 获取clearArtNo
|
||||
String clearArtNo = this.extractCoreArticleNumber(storeProd.getProdArtNum());
|
||||
// 获取GT匹配的商品sku列表
|
||||
List<GtProdSkuVO> gtMatchSkuList = this.getGtFirstSku(multiSaleSameGoMap, gtSaleGroupMap, clearArtNo);
|
||||
// 初始化商品服务承诺
|
||||
prodSvcList.add(new StoreProductService().setStoreProdId(storeProd.getId()).setCustomRefund("0")
|
||||
.setThirtyDayRefund("0").setOneBatchSale("1").setRefundWithinThreeDay("0"));
|
||||
// 初始化商品的类目属性
|
||||
StoreProductCategoryAttribute cateAttr = Optional.ofNullable(prodAttrMap.get(gtMatchSkuList.get(0).getProduct_id()))
|
||||
.orElseThrow(() -> new ServiceException("没有GT商品类目属性!" + storeProd.getProdArtNum(), HttpStatus.ERROR));
|
||||
cateAttr.setStoreId(storeProd.getStoreId()).setStoreProdId(storeProd.getId());
|
||||
prodAttrList.add(cateAttr);
|
||||
});
|
||||
// 插入商品颜色及颜色对应的尺码,档口服务承诺
|
||||
this.prodSvcMapper.insert(prodSvcList);
|
||||
this.prodCateAttrMapper.insert(prodAttrList);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 商品颜色及商品颜色尺码
|
||||
*
|
||||
* @param initVO
|
||||
* @return
|
||||
*/
|
||||
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
|
||||
@PutMapping("/init-color")
|
||||
@Transactional
|
||||
public R<Integer> initColor(@Validated @RequestBody GtAndTYInitVO initVO) {
|
||||
// 从数据库查询最新数据
|
||||
List<StoreProduct> storeProdList = this.storeProdMapper.selectList(new LambdaQueryWrapper<StoreProduct>()
|
||||
.eq(StoreProduct::getStoreId, initVO.getStoreId()).eq(StoreProduct::getDelFlag, Constants.UNDELETED));
|
||||
List<StoreColor> storeColorList = this.storeColorMapper.selectList(new LambdaQueryWrapper<StoreColor>()
|
||||
.eq(StoreColor::getStoreId, initVO.getStoreId()).eq(StoreColor::getDelFlag, Constants.UNDELETED));
|
||||
Map<String, StoreColor> storeColorMap = storeColorList.stream().collect(Collectors.toMap(StoreColor::getColorName, x -> x, (v1, v2) -> v2));
|
||||
|
||||
Map<String, List<String>> multiSaleSameGoMap = new HashMap<>();
|
||||
Map<String, List<String>> multiOffSaleSameGoMap = new HashMap<>();
|
||||
Map<String, List<String>> multiSameTyMap = new HashMap<>();
|
||||
List<GtProdSkuVO> gtSaleBasicList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_SALE_BASIC_KEY + initVO.getUserId()), new ArrayList<>());
|
||||
// 查看gt 在售的商品 这边有多少相似的货号
|
||||
gtSaleBasicList.stream().map(GtProdSkuVO::getArticle_number).distinct()
|
||||
// 过滤掉需要特殊处理的货号
|
||||
.filter(article_number -> !initVO.getExcludeArtNoList().contains(article_number))
|
||||
.forEach(article_number -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(article_number);
|
||||
List<String> existList = multiSaleSameGoMap.containsKey(cleanArtNo) ? multiSaleSameGoMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(article_number);
|
||||
multiSaleSameGoMap.put(cleanArtNo, existList);
|
||||
});
|
||||
|
||||
// 查看gt 下架的商品有多少相似的货号
|
||||
List<GtProdSkuVO> gtOffSaleBasicList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_OFF_SALE_BASIC_KEY + initVO.getUserId()), new ArrayList<>());
|
||||
gtOffSaleBasicList.stream().map(GtProdSkuVO::getArticle_number).distinct().forEach(article_number -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(article_number);
|
||||
List<String> existList = multiOffSaleSameGoMap.containsKey(cleanArtNo) ? multiOffSaleSameGoMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(article_number);
|
||||
multiOffSaleSameGoMap.put(cleanArtNo, existList);
|
||||
});
|
||||
|
||||
// 查看TY 这边有多少相似的货号
|
||||
List<TyProdImportVO> tyProdList = redisCache.getCacheObject(CacheConstants.MIGRATION_TY_PROD_KEY + initVO.getUserId());
|
||||
// TY按照颜色分类
|
||||
Map<String, List<TyProdImportVO>> tyProdGroupMap = tyProdList.stream().collect(Collectors.groupingBy(TyProdImportVO::getProdArtNum));
|
||||
tyProdList.stream().map(TyProdImportVO::getProdArtNum).distinct()
|
||||
// 过滤掉需要特殊处理的货号
|
||||
.filter(artNo -> !initVO.getExcludeArtNoList().contains(artNo))
|
||||
.forEach(artNo -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(artNo);
|
||||
List<String> existList = multiSameTyMap.containsKey(cleanArtNo) ? multiSameTyMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(artNo);
|
||||
multiSameTyMap.put(cleanArtNo, existList);
|
||||
});
|
||||
// gt按照货号分组
|
||||
Map<String, List<GtProdSkuVO>> gtSaleGroupMap = gtSaleBasicList.stream().collect(Collectors.groupingBy(GtProdSkuVO::getArticle_number));
|
||||
|
||||
// 商品所有颜色 尺码 颜色库存初始化
|
||||
List<StoreProductColor> prodColorList = new ArrayList<>();
|
||||
List<StoreProductColorSize> prodColorSizeList = new ArrayList<>();
|
||||
storeProdList.forEach(storeProd -> {
|
||||
// 取clearArtNo
|
||||
String clearArtNo = this.extractCoreArticleNumber(storeProd.getProdArtNum());
|
||||
// TY匹配的货号
|
||||
List<String> tyMatchArtNoList = multiSameTyMap.get(clearArtNo);
|
||||
// 获取GT匹配的商品sku列表
|
||||
List<GtProdSkuVO> gtMatchSkuList = this.getGtFirstSku(multiSaleSameGoMap, gtSaleGroupMap, clearArtNo);
|
||||
// 当前货号在GT的所有尺码,作为标准尺码
|
||||
List<Integer> gtStandardSizeList = gtMatchSkuList.stream().map(sku -> (int) Math.floor(Double.parseDouble(sku.getSize()))).collect(Collectors.toList());
|
||||
AtomicInteger orderNum = new AtomicInteger();
|
||||
tyMatchArtNoList.forEach(tyArtNo -> {
|
||||
List<TyProdImportVO> tyMatchSkuList = tyProdGroupMap.get(tyArtNo);
|
||||
for (int i = 0; i < tyMatchSkuList.size(); i++) {
|
||||
StoreColor storeColor = Optional.ofNullable(storeColorMap.get(tyMatchSkuList.get(i).getColorName()))
|
||||
.orElseThrow(() -> new ServiceException("没有TY商品颜色!" + tyArtNo, HttpStatus.ERROR));
|
||||
// 该商品的颜色
|
||||
prodColorList.add(new StoreProductColor().setStoreId(storeProd.getStoreId()).setStoreProdId(storeProd.getId()).setOrderNum(orderNum.addAndGet(1))
|
||||
.setColorName(storeColor.getColorName()).setStoreColorId(storeColor.getId()).setProdStatus(EProductStatus.ON_SALE.getValue()));
|
||||
// 该颜色所有的尺码
|
||||
for (int j = 0; j < Constants.SIZE_LIST.size(); j++) {
|
||||
// TY系统条码前缀
|
||||
final String otherSnPrefix = tyMatchSkuList.get(i).getTySnPrefix() + Constants.SIZE_LIST.get(j);
|
||||
prodColorSizeList.add(new StoreProductColorSize().setSize(Constants.SIZE_LIST.get(j)).setStoreColorId(storeColor.getId())
|
||||
.setStoreProdId(storeProd.getId()).setPrice(tyMatchSkuList.get(i).getPrice()).setOtherSnPrefix(otherSnPrefix).setNextSn(0)
|
||||
.setStandard(gtStandardSizeList.contains(Constants.SIZE_LIST.get(j)) ? 1 : 0));
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
// 插入商品颜色及颜色对应的尺码,档口服务承诺
|
||||
this.prodColorMapper.insert(prodColorList);
|
||||
prodColorSizeList.sort(Comparator.comparing(StoreProductColorSize::getStoreProdId).thenComparing(StoreProductColorSize::getSize));
|
||||
this.prodColorSizeMapper.insert(prodColorSizeList);
|
||||
// 还要更新步橘系统的条码前缀
|
||||
prodColorSizeList.forEach(x -> x.setSnPrefix(initVO.getStoreId() + String.format("%08d", x.getId())));
|
||||
this.prodColorSizeMapper.updateById(prodColorSizeList);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
|
||||
@PutMapping("/init")
|
||||
|
||||
@PutMapping("/init-cus-disc")
|
||||
@Transactional
|
||||
public R<Integer> initCusDisc(@Validated @RequestBody GtAndTYInitVO initVO) {
|
||||
|
||||
List<StoreProduct> storeProdList = this.storeProdMapper.selectList(new LambdaQueryWrapper<StoreProduct>()
|
||||
.eq(StoreProduct::getStoreId, initVO.getStoreId()).eq(StoreProduct::getDelFlag, Constants.UNDELETED));
|
||||
|
||||
Date date = DateUtils.parseDate("2025-09-27 10:40:38");
|
||||
|
||||
storeProdList = storeProdList.stream().filter(x -> x.getCreateTime().after(date)).collect(Collectors.toList());
|
||||
|
||||
|
||||
|
||||
List<StoreProductColor> prodColorList = this.prodColorMapper.selectList(new LambdaQueryWrapper<StoreProductColor>()
|
||||
.eq(StoreProductColor::getStoreId, initVO.getStoreId()).eq(StoreProductColor::getDelFlag, Constants.UNDELETED));
|
||||
List<StoreCustomer> storeCusList = this.storeCusMapper.selectList(new LambdaQueryWrapper<StoreCustomer>()
|
||||
.eq(StoreCustomer::getStoreId, initVO.getStoreId()).eq(StoreCustomer::getDelFlag, Constants.UNDELETED));
|
||||
|
||||
Map<String, List<String>> multiSameTyMap = new HashMap<>();
|
||||
// 查看TY 这边有多少相似的货号
|
||||
List<TyProdImportVO> tyProdList = redisCache.getCacheObject(CacheConstants.MIGRATION_TY_PROD_KEY + initVO.getUserId());
|
||||
tyProdList.stream().map(TyProdImportVO::getProdArtNum).distinct()
|
||||
// 过滤掉需要特殊处理的货号
|
||||
.filter(artNo -> !initVO.getExcludeArtNoList().contains(artNo))
|
||||
.forEach(artNo -> {
|
||||
// 只保留核心连续的数字,去除其他所有符号
|
||||
String cleanArtNo = this.extractCoreArticleNumber(artNo);
|
||||
List<String> existList = multiSameTyMap.containsKey(cleanArtNo) ? multiSameTyMap.get(cleanArtNo) : new ArrayList<>();
|
||||
existList.add(artNo);
|
||||
multiSameTyMap.put(cleanArtNo, existList);
|
||||
});
|
||||
|
||||
// 从redis中获取已存在的客户优惠数据
|
||||
List<TyCusDiscImportVO> tyCusDiscCacheList = redisCache.getCacheObject(CacheConstants.MIGRATION_TY_CUS_DISCOUNT_KEY + initVO.getUserId());
|
||||
if (CollectionUtils.isEmpty(tyCusDiscCacheList)) {
|
||||
throw new ServiceException("ty供应商客户优惠列表为空!" + initVO.getUserId(), HttpStatus.ERROR);
|
||||
}
|
||||
// 从redis中获取已存在的商品库存数据
|
||||
List<TyProdStockVO> tyStockList = redisCache.getCacheObject(CacheConstants.MIGRATION_TY_PROD_STOCK_KEY + initVO.getUserId());
|
||||
if (CollectionUtils.isEmpty(tyStockList)) {
|
||||
throw new ServiceException("ty供应商商品库存列表为空!" + initVO.getUserId(), HttpStatus.ERROR);
|
||||
}
|
||||
// TY 货号颜色的库存对应关系
|
||||
Map<String, Map<String, TyProdStockVO>> tyProdStockMap = tyStockList.stream().collect(Collectors
|
||||
.groupingBy(TyProdStockVO::getProdArtNum, Collectors.toMap(TyProdStockVO::getColorName, x -> x)));
|
||||
// TY 货号颜色优惠对应关系
|
||||
Map<String, Map<String, List<TyCusDiscImportVO>>> tyCusDiscGroupMap = tyCusDiscCacheList.stream().collect(Collectors
|
||||
.groupingBy(TyCusDiscImportVO::getProdArtNum, Collectors.groupingBy(TyCusDiscImportVO::getColorName)));
|
||||
// 步橘系统商品所有颜色maps
|
||||
Map<Long, Map<String, StoreProductColor>> prodColorGroupMap = prodColorList.stream().collect(Collectors
|
||||
.groupingBy(StoreProductColor::getStoreProdId, Collectors.toMap(StoreProductColor::getColorName, x -> x, (v1, v2) -> v2)));
|
||||
// 步橘系统客户名称map
|
||||
Map<String, StoreCustomer> buJuStoreCusMap = storeCusList.stream().collect(Collectors.toMap(StoreCustomer::getCusName, x -> x));
|
||||
List<StoreCustomerProductDiscount> prodCusDiscList = new ArrayList<>();
|
||||
List<StoreProductStock> prodStockList = new ArrayList<>();
|
||||
// 依次遍历商品列表,找到货号和FHB货号对应关系,然后用颜色进行匹配,建立客户优惠关系
|
||||
storeProdList.forEach(storeProd -> {
|
||||
final String cleanArtNo = this.extractCoreArticleNumber(storeProd.getProdArtNum());
|
||||
// 当前商品颜色列表 key 颜色中文名称
|
||||
Map<String, StoreProductColor> buJuProdColorMap = Optional.ofNullable(prodColorGroupMap.get(storeProd.getId())).orElseThrow(() -> new ServiceException("没有商品颜色!" + storeProd.getProdArtNum(), HttpStatus.ERROR));
|
||||
// 根据步橘货号 找到TY对应的货号,可能是列表
|
||||
List<String> tyAtrNoList = Optional.ofNullable(multiSameTyMap.get(cleanArtNo)).orElseThrow(() -> new ServiceException("没有TY货号!" + storeProd.getProdArtNum(), HttpStatus.ERROR));
|
||||
tyAtrNoList.forEach(tyAtrNo -> {
|
||||
// 处理客户优惠
|
||||
this.handleCusDisc(tyAtrNo, tyCusDiscGroupMap, buJuProdColorMap, buJuStoreCusMap, prodCusDiscList, storeProd.getStoreId(), storeProd.getId());
|
||||
// 处理档口商品库存
|
||||
this.handleProdStock(tyAtrNo, tyProdStockMap, buJuProdColorMap, storeProd.getStoreId(), storeProd.getId(), storeProd.getProdArtNum(), prodStockList);
|
||||
});
|
||||
});
|
||||
// 档口客户优惠
|
||||
this.storeCusProdDiscMapper.insert(prodCusDiscList);
|
||||
// 档口客户库存
|
||||
this.prodStockMapper.insert(prodStockList);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
|
||||
/* @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')")
|
||||
@PutMapping("/init")
|
||||
@Transactional
|
||||
public R<Integer> initToDB(@Validated @RequestBody GtAndTYInitVO initVO) {
|
||||
// 去掉可能的空格
|
||||
initVO.setExcludeArtNoList(initVO.getExcludeArtNoList().stream().map(String::trim).collect(Collectors.toList()));
|
||||
|
|
@ -354,7 +655,7 @@ public class GtAndTyBizController extends BaseController {
|
|||
// 步骤4: 客户与货号的优惠关系 及 商品颜色的库存
|
||||
this.initStoreCusProdDiscAndProdStock(initVO, storeProdList, storeCusList, prodColorList, multiSameTyMap);
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -436,7 +737,7 @@ public class GtAndTyBizController extends BaseController {
|
|||
|
||||
private void handleProdStock(String tyAtrNo, Map<String, Map<String, TyProdStockVO>> tyProdStockMap, Map<String, StoreProductColor> buJuProdColorMap,
|
||||
Long storeId, Long storeProdId, String prodArtNum, List<StoreProductStock> prodStockList) {
|
||||
Map<String, TyProdStockVO> tyColorStockMap = tyProdStockMap.get(tyAtrNo);
|
||||
Map<String, TyProdStockVO> tyColorStockMap = tyProdStockMap.getOrDefault(tyAtrNo, new HashMap<>());
|
||||
buJuProdColorMap.forEach((buJuColor, buJuProdColor) -> {
|
||||
StoreProductStock stock = new StoreProductStock().setStoreId(storeId).setStoreProdId(storeProdId).setProdArtNum(prodArtNum)
|
||||
.setColorName(buJuProdColorMap.get(buJuColor).getColorName()).setStoreProdColorId(buJuProdColorMap.get(buJuColor).getId())
|
||||
|
|
@ -636,9 +937,10 @@ public class GtAndTyBizController extends BaseController {
|
|||
private List<GtProdSkuVO> getGtFirstSku(Map<String, List<String>> multiSaleSameGoMap, Map<String, List<GtProdSkuVO>> gtSaleGroupMap, String cleanArtNo) {
|
||||
// GT匹配的货号
|
||||
List<String> gtMatchArtNoList = multiSaleSameGoMap.get(cleanArtNo);
|
||||
// 逻辑:如果TY有多个货号,则都要加到系统中来,因为要扫描条码;如果GT有多个,则只取第一个,匹配相关的属性
|
||||
List<GtProdSkuVO> gtMatchSkuList = gtSaleGroupMap.get(gtMatchArtNoList.get(0));
|
||||
return gtMatchSkuList;
|
||||
// GT 最短的货号
|
||||
String shortestArtNo = gtMatchArtNoList.stream().min(Comparator.comparingInt(String::length))
|
||||
.orElse(gtMatchArtNoList.get(0));
|
||||
return gtSaleGroupMap.get(shortestArtNo);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ import lombok.RequiredArgsConstructor;
|
|||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.MapUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
|
@ -49,16 +50,23 @@ public class GtController extends BaseController {
|
|||
// 先从redis中获取列表数据
|
||||
List<GtProdSkuVO> cacheList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_SALE_BASIC_KEY + userId), new ArrayList<>());
|
||||
// 已存入的map,增加个校验 如果已导入则不重复导入 避免误操作
|
||||
Map<String, String> cacheMap = cacheList.stream().collect(Collectors.toMap(GtProdSkuVO::getArticle_number, GtProdSkuVO::getArticle_number));
|
||||
// 三年前的时间
|
||||
Date threeYearsBefore = java.sql.Date.valueOf(LocalDate.now().minusYears(3));
|
||||
artNoList
|
||||
artNoList.stream()
|
||||
// 只处理近3年商品
|
||||
.stream().filter(x -> x.getCreate_time().after(threeYearsBefore) || x.getUpdate_time().after(threeYearsBefore))
|
||||
.filter(x -> x.getCreate_time().after(threeYearsBefore) || x.getUpdate_time().after(threeYearsBefore))
|
||||
// 避免误操作
|
||||
.filter(x -> !cacheMap.containsKey(x.getArticle_number()))
|
||||
.forEach(artNoInfo -> {
|
||||
artNoInfo.getSkus().forEach(x -> x.setColor(this.decodeUnicode(x.getColor().trim())).setCharacters(artNoInfo.getCharacters().trim())
|
||||
.setSize(x.getSize().trim().replaceAll("[^0-9.]", "")).setArticle_number(artNoInfo.getArticle_number().trim())
|
||||
artNoInfo.getSkus().forEach(x -> x.setColor(StringUtils.isNotBlank(x.getColor()) ? this.decodeUnicode(x.getColor().trim()) : "")
|
||||
.setCharacters(StringUtils.isNotBlank(artNoInfo.getCharacters()) ? artNoInfo.getCharacters().trim() : "")
|
||||
.setArticle_number(StringUtils.isNotBlank(artNoInfo.getArticle_number()) ? artNoInfo.getArticle_number().trim() : "")
|
||||
.setSize(x.getSize().trim().replaceAll("[^0-9.]", ""))
|
||||
.setProduct_id(artNoInfo.getId()).setCategory_nid(artNoInfo.getCategory_nid()));
|
||||
cacheList.addAll(artNoInfo.getSkus());
|
||||
cacheMap.put(artNoInfo.getArticle_number(), artNoInfo.getArticle_number());
|
||||
});
|
||||
// 存到redis中
|
||||
redisCache.setCacheObject(CacheConstants.MIGRATION_GT_SALE_BASIC_KEY + userId, cacheList);
|
||||
|
|
@ -73,12 +81,18 @@ public class GtController extends BaseController {
|
|||
// 先从redis中获取列表数据
|
||||
List<GtProdSkuVO> cacheList = ObjectUtils.defaultIfNull(redisCache
|
||||
.getCacheObject(CacheConstants.MIGRATION_GT_OFF_SALE_BASIC_KEY + userId), new ArrayList<>());
|
||||
artNoList.forEach(artNoInfo -> {
|
||||
artNoInfo.getSkus().forEach(x -> x.setColor(this.decodeUnicode(x.getColor()))
|
||||
.setSize(x.getSize().trim().replaceAll("[^0-9.]", ""))
|
||||
.setArticle_number(artNoInfo.getArticle_number().trim()).setProduct_id(artNoInfo.getId()));
|
||||
cacheList.addAll(artNoInfo.getSkus());
|
||||
});
|
||||
// 已存入的map,增加个校验 如果已导入则不重复导入 避免误操作
|
||||
Map<String, String> cacheMap = cacheList.stream().collect(Collectors.toMap(GtProdSkuVO::getArticle_number, GtProdSkuVO::getArticle_number));
|
||||
artNoList.stream()
|
||||
// 避免误操作
|
||||
.filter(x -> !cacheMap.containsKey(x.getArticle_number()))
|
||||
.forEach(artNoInfo -> {
|
||||
artNoInfo.getSkus().forEach(x -> x.setColor(StringUtils.isNotBlank(x.getColor()) ? this.decodeUnicode(x.getColor().trim()) : "")
|
||||
.setSize(x.getSize().trim().replaceAll("[^0-9.]", "")).setProduct_id(artNoInfo.getId())
|
||||
.setArticle_number(StringUtils.isNotBlank(artNoInfo.getArticle_number()) ? artNoInfo.getArticle_number().trim() : ""));
|
||||
cacheList.addAll(artNoInfo.getSkus());
|
||||
cacheMap.put(artNoInfo.getArticle_number(), artNoInfo.getArticle_number());
|
||||
});
|
||||
// 存到redis中
|
||||
redisCache.setCacheObject(CacheConstants.MIGRATION_GT_OFF_SALE_BASIC_KEY + userId, cacheList);
|
||||
return R.ok();
|
||||
|
|
|
|||
|
|
@ -48,16 +48,20 @@ public class TyController extends BaseController {
|
|||
ExcelUtil<TyProdImportVO> util = new ExcelUtil<>(TyProdImportVO.class);
|
||||
List<TyProdImportVO> tyProdVOList = util.importExcel(file.getInputStream());
|
||||
// 去掉空格
|
||||
tyProdVOList.forEach(x -> {
|
||||
String prodArtNum = x.getProdArtNum().trim();
|
||||
String colorName = x.getColorName().trim();
|
||||
String tySnPrefix = x.getTySnPrefix().trim();
|
||||
// 如果货号包括-R 则表明是 货号为绒里,手动给颜色添加后缀“绒里”
|
||||
if (prodArtNum.contains("-R")) {
|
||||
colorName = colorName.contains("绒里") ? colorName : (colorName + "绒里");
|
||||
}
|
||||
x.setProdArtNum(prodArtNum).setColorName(colorName).setTySnPrefix(tySnPrefix);
|
||||
});
|
||||
tyProdVOList = tyProdVOList.stream()
|
||||
// 只导入价格不能为空的存货
|
||||
.filter(x -> ObjectUtils.isNotEmpty(x.getPrice()))
|
||||
.map(x -> {
|
||||
String prodArtNum = x.getProdArtNum().trim();
|
||||
String colorName = x.getColorName().trim();
|
||||
String tySnPrefix = x.getTySnPrefix().trim();
|
||||
// 如果货号包括-R 则表明是 货号为绒里,手动给颜色添加后缀“绒里”
|
||||
if (prodArtNum.contains("-R")) {
|
||||
colorName = colorName.contains("绒里") ? colorName : (colorName + "绒里");
|
||||
}
|
||||
return x.setProdArtNum(prodArtNum).setColorName(colorName).setTySnPrefix(tySnPrefix);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
Map<String, List<TyProdImportVO>> prodMap = tyProdVOList.stream().collect(Collectors.groupingBy(TyProdImportVO::getProdArtNum));
|
||||
prodMap.forEach((k, v) -> {
|
||||
System.err.println(k + ":" + v);
|
||||
|
|
@ -114,7 +118,7 @@ public class TyController extends BaseController {
|
|||
if (prodArtNum.contains("-R")) {
|
||||
colorName = colorName.contains("绒里") ? colorName : (colorName + "绒里");
|
||||
}
|
||||
x.setProdArtNum(prodArtNum).setColorName(colorName).setCusName(cusName);
|
||||
x.setProdArtNum(prodArtNum).setColorName(colorName).setCusName(cusName).setDiscount(discount);
|
||||
importCusDiscMap.put(x.getProdArtNum() + ":" + x.getColorName(), x);
|
||||
importList.add(x);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue