From fc81530d1a7d4c52b47f18176cc0efc576c6d63e Mon Sep 17 00:00:00 2001 From: liujiang <569804566@qq.com> Date: Sun, 21 Sep 2025 23:00:04 +0800 Subject: [PATCH] =?UTF-8?q?master=EF=BC=9A=E5=BA=93=E5=AD=98=E7=9B=98?= =?UTF-8?q?=E7=82=B9=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE=E8=B0=83=E6=95=B4?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xkt/shipMaster/DoubleRunController.java | 133 ++++++++++++++++++ .../xkt/shipMaster/ShipMasterController.java | 76 ++++++++++ .../xkt/shipMaster/vo/DoubleRunImportVO.java | 37 +++++ .../xkt/shipMaster/vo/ShipMasterImportVO.java | 31 ++++ .../StoreProdStockTakeResVO.java | 6 + .../ruoyi/common/constant/CacheConstants.java | 4 + .../StoreProdStockTakeResDTO.java | 6 + .../impl/StoreProductStockServiceImpl.java | 30 ++-- .../shipMaster/IShipMasterService.java | 9 ++ .../impl/ShipMasterServiceImpl.java | 17 +++ 10 files changed, 339 insertions(+), 10 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/DoubleRunController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/ShipMasterController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/DoubleRunImportVO.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/ShipMasterImportVO.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/IShipMasterService.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/impl/ShipMasterServiceImpl.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/DoubleRunController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/DoubleRunController.java new file mode 100644 index 000000000..f1d21b83b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/DoubleRunController.java @@ -0,0 +1,133 @@ +package com.ruoyi.web.controller.xkt.shipMaster; + +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.ShipMasterImportVO; +import com.ruoyi.xkt.service.shipMaster.IShipMasterService; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * ShipMaster 相关 + * + * @author ruoyi + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/rest/v1/double-run") +public class DoubleRunController extends BaseController { + + final IShipMasterService shipMasterService; + final RedisCache redisCache; + + @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @PostMapping("/cache") + public R createCache(@Validated @RequestBody DoubleRunImportVO importVO) { + List artNoList = importVO.getData().getData(); + Map>> artNoMap = new LinkedHashMap<>(); + artNoList.forEach(artNoInfo -> { + artNoInfo.getSkus().forEach(x -> x.setColor(this.decodeUnicode(x.getColor()))); + artNoMap.put(artNoInfo.getArticle_number(), artNoInfo.getSkus().stream().collect(Collectors + .groupingBy(DoubleRunImportVO.DRIArtNoSkuVO::getColor))); + }); + + + artNoMap.forEach((artNo, colorSkuMap) -> { + colorSkuMap.forEach((color, skuList) -> { + skuList.sort(Comparator.comparing(DoubleRunImportVO.DRIArtNoSkuVO::getSize)); + System.err.println(artNo + ":" + color + ":" + skuList); + }); + }); + + + /* // 供应商ID + final Integer supplierId = importVO.getData().getRecords().get(0).getSupplierId(); + // 先从redis中获取列表数据 + List cacheList = ObjectUtils.defaultIfNull(redisCache + .getCacheObject(CacheConstants.SUPPLIER_KEY + supplierId), new ArrayList<>()); + CollectionUtils.addAll(cacheList, importVO.getData().getRecords()); + // 存到redis中 + redisCache.setCacheObject(CacheConstants.SUPPLIER_KEY + supplierId, cacheList);*/ + return R.ok(); + } + + + @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @GetMapping("/cache/{supplierId}") + public R getCache(@PathVariable Integer supplierId) { + /*// 从redis中获取数据 + List cacheList = ObjectUtils.defaultIfNull(redisCache + .getCacheObject(CacheConstants.SUPPLIER_KEY + supplierId), new ArrayList<>()); + if (CollectionUtils.isEmpty(cacheList)) { + return R.fail(); + } + // 按照artNo分组 + Map> artNoGroup = cacheList.stream() + .sorted(Comparator.comparing(ShipMasterImportVO.SMIVO::getArtNo) + .thenComparing(ShipMasterImportVO.SMIVO::getColor)) + .collect(Collectors + .groupingBy(ShipMasterImportVO.SMIVO::getArtNo, LinkedHashMap::new, Collectors.toList())); + Map> artSnPrefixMap = new LinkedHashMap<>(); + artNoGroup.forEach((artNo, colorList) -> { + Map snPrefixMap = new LinkedHashMap<>(); + // 按照颜色设置条码前缀 + colorList.forEach(color -> snPrefixMap + .put(color.getColor(), color.getSupplierId() + String.format("%05d", color.getSupplierSkuId()))); + artSnPrefixMap.put(artNo, snPrefixMap); + }); + artSnPrefixMap.forEach((k,v) -> { + System.err.println(k + ":" + v); + });*/ + return R.ok(); + } + + + + /** + * Unicode解码方法 + * @param unicodeStr 包含Unicode编码的字符串 + * @return 解码后的字符串 + */ + private String decodeUnicode(String unicodeStr) { + if (unicodeStr == null || unicodeStr.isEmpty()) { + return unicodeStr; + } + StringBuilder result = new StringBuilder(); + int i = 0; + while (i < unicodeStr.length()) { + if (unicodeStr.charAt(i) == '\\' && i + 1 < unicodeStr.length() && unicodeStr.charAt(i + 1) == 'u') { + // 处理Unicode编码 + if (i + 5 < unicodeStr.length()) { + try { + String hexCode = unicodeStr.substring(i + 2, i + 6); + char ch = (char) Integer.parseInt(hexCode, 16); + result.append(ch); + i += 6; + } catch (NumberFormatException e) { + result.append(unicodeStr.charAt(i)); + i++; + } + } else { + result.append(unicodeStr.charAt(i)); + i++; + } + } else { + result.append(unicodeStr.charAt(i)); + i++; + } + } + return result.toString(); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/ShipMasterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/ShipMasterController.java new file mode 100644 index 000000000..b125ec488 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/ShipMasterController.java @@ -0,0 +1,76 @@ +package com.ruoyi.web.controller.xkt.shipMaster; + +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.xkt.service.shipMaster.IShipMasterService; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * ShipMaster 相关 + * + * @author ruoyi + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/rest/v1/ship-master") +public class ShipMasterController extends BaseController { + + final IShipMasterService shipMasterService; + final RedisCache redisCache; + + @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @PostMapping("/cache") + public R createCache(@Validated @RequestBody ShipMasterImportVO importVO) { + // 供应商ID + final Integer supplierId = importVO.getData().getRecords().get(0).getSupplierId(); + // 先从redis中获取列表数据 + List cacheList = ObjectUtils.defaultIfNull(redisCache + .getCacheObject(CacheConstants.SUPPLIER_KEY + supplierId), new ArrayList<>()); + CollectionUtils.addAll(cacheList, importVO.getData().getRecords()); + // 存到redis中 + redisCache.setCacheObject(CacheConstants.SUPPLIER_KEY + supplierId, cacheList); + return R.ok(); + } + + @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @GetMapping("/cache/{supplierId}") + public R getCache(@PathVariable Integer supplierId) { + // 从redis中获取数据 + List cacheList = ObjectUtils.defaultIfNull(redisCache + .getCacheObject(CacheConstants.SUPPLIER_KEY + supplierId), new ArrayList<>()); + if (CollectionUtils.isEmpty(cacheList)) { + return R.fail(); + } + // 按照artNo分组 + Map> artNoGroup = cacheList.stream() + .sorted(Comparator.comparing(ShipMasterImportVO.SMIVO::getArtNo) + .thenComparing(ShipMasterImportVO.SMIVO::getColor)) + .collect(Collectors + .groupingBy(ShipMasterImportVO.SMIVO::getArtNo, LinkedHashMap::new, Collectors.toList())); + Map> artSnPrefixMap = new LinkedHashMap<>(); + artNoGroup.forEach((artNo, colorList) -> { + Map snPrefixMap = new LinkedHashMap<>(); + // 按照颜色设置条码前缀 + colorList.forEach(color -> snPrefixMap + .put(color.getColor(), color.getSupplierId() + String.format("%05d", color.getSupplierSkuId()))); + artSnPrefixMap.put(artNo, snPrefixMap); + }); + artSnPrefixMap.forEach((k,v) -> { + System.err.println(k + ":" + v); + }); + return R.ok(); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/DoubleRunImportVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/DoubleRunImportVO.java new file mode 100644 index 000000000..184ead389 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/DoubleRunImportVO.java @@ -0,0 +1,37 @@ +package com.ruoyi.web.controller.xkt.shipMaster.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author liangyq + * @date 2025-05-11 23:46 + */ +@Data +public class DoubleRunImportVO { + + private DRIDataVO data; + + @Data + public static class DRIDataVO { + private List data; + } + + @Data + public static class DRIArtNoVO { + private String article_number; + private List skus; + } + + @Data + public static class DRIArtNoSkuVO { + private String color; + private Integer size; + private BigDecimal weight; + private BigDecimal price; + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/ShipMasterImportVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/ShipMasterImportVO.java new file mode 100644 index 000000000..a23ec346d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/shipMaster/vo/ShipMasterImportVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.shipMaster.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @author liangyq + * @date 2025-05-11 23:46 + */ +@Data +public class ShipMasterImportVO { + + private SMIDataVO data; + + @Data + public static class SMIDataVO { + private List records; + } + + @Data + public static class SMIVO { + private Integer supplierId; + private Integer supplierSkuId; + private String artNo; + private String color; + private String size; + private String snPrefix; + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProdStock/StoreProdStockTakeResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProdStock/StoreProdStockTakeResVO.java index cde50108d..83af1235e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProdStock/StoreProdStockTakeResVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProdStock/StoreProdStockTakeResVO.java @@ -20,6 +20,8 @@ public class StoreProdStockTakeResVO { private Long storeProdId; @ApiModelProperty(value = "商品货号") private String prodArtNum; + @ApiModelProperty(value = "商品主图") + private String mainPicUrl; @ApiModelProperty(value = "颜色列表") private List colorList; @@ -27,6 +29,10 @@ public class StoreProdStockTakeResVO { @ApiModel @Accessors(chain = true) public static class SPSTColorSizeVO { + @ApiModelProperty(value = "档口商品库存ID") + private Long storeProdStockId; + @ApiModelProperty(value = "档口商品颜色ID") + private Long storeProdColorId; @ApiModelProperty(value = "颜色ID") private Long storeColorId; @ApiModelProperty(value = "颜色名称") diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index 60d989f28..7b1299118 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -312,5 +312,9 @@ public class CacheConstants { * 档口商品访问次数缓存 */ public static final String STORE_PROD_VIEW_COUNT_CACHE = "store_prod_view_count_cache"; + /** + * 供应商缓存 + */ + public static final String SUPPLIER_KEY = "supplier:"; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductStock/StoreProdStockTakeResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductStock/StoreProdStockTakeResDTO.java index d93c56f49..2b187736b 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductStock/StoreProdStockTakeResDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductStock/StoreProdStockTakeResDTO.java @@ -20,6 +20,8 @@ public class StoreProdStockTakeResDTO { private Long storeProdId; @ApiModelProperty(value = "商品货号") private String prodArtNum; + @ApiModelProperty(value = "商品主图") + private String mainPicUrl; @ApiModelProperty(value = "颜色列表") private List colorList; @@ -27,6 +29,10 @@ public class StoreProdStockTakeResDTO { @ApiModel @Accessors(chain = true) public static class SPSTColorSizeDTO { + @ApiModelProperty(value = "档口商品库存ID") + private Long storeProdStockId; + @ApiModelProperty(value = "档口商品颜色ID") + private Long storeProdColorId; @ApiModelProperty(value = "颜色ID") private Long storeColorId; @ApiModelProperty(value = "颜色名称") diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductStockServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductStockServiceImpl.java index 64ad84400..c348cb9b6 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductStockServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductStockServiceImpl.java @@ -9,8 +9,8 @@ import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.page.Page; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.xkt.domain.StoreColor; import com.ruoyi.xkt.domain.StoreProduct; +import com.ruoyi.xkt.domain.StoreProductColor; import com.ruoyi.xkt.domain.StoreProductColorSize; import com.ruoyi.xkt.domain.StoreProductStock; import com.ruoyi.xkt.dto.storeProductFile.StoreProdMainPicDTO; @@ -48,6 +48,7 @@ public class StoreProductStockServiceImpl implements IStoreProductStockService { final StoreProductMapper storeProdMapper; final StoreProductColorSizeMapper prodColorSizeMapper; final StoreColorMapper storeColorMapper; + final StoreProductColorMapper prodColorMapper; /** @@ -126,33 +127,42 @@ public class StoreProductStockServiceImpl implements IStoreProductStockService { @Transactional(readOnly = true) public StoreProdStockTakeResDTO getByStoreIdAndStoreProdId(Long storeId, Long storeProdId) { StoreProduct storeProd = Optional.ofNullable(this.storeProdMapper.selectById(storeProdId)).orElseThrow(() -> new ServiceException("该商品不存在", HttpStatus.ERROR)); + // 获取商品主图 + List mainPicList = this.storeProdFileMapper + .selectMainPicByStoreProdIdList(Collections.singletonList(storeProdId), FileType.MAIN_PIC.getValue(), ORDER_NUM_1); // 查询该商品所有颜色的库存 List stockList = this.storeProdStockMapper.selectList(new LambdaQueryWrapper() .eq(StoreProductStock::getStoreId, storeId).eq(StoreProductStock::getStoreProdId, storeProdId) .eq(StoreProductStock::getDelFlag, Constants.UNDELETED)); + Map storeProdColorStockMap = stockList.stream().collect(Collectors.toMap(StoreProductStock::getStoreColorId, x -> x)); // 商品颜色对应的库存map Map colorSizeStockMap = stockList.stream().collect(Collectors.toMap(StoreProductStock::getStoreColorId, x -> x)); - // 档口商品颜色map - List storeColorList = this.storeColorMapper.selectList(new LambdaQueryWrapper() - .eq(StoreColor::getDelFlag, Constants.UNDELETED).eq(StoreColor::getStoreId, storeId)); - Map storeColorMap = storeColorList.stream().collect(Collectors.toMap(StoreColor::getId, x -> x)); + // 档口商品颜色 + List storeProdColorList = this.prodColorMapper.selectList(new LambdaQueryWrapper() + .eq(StoreProductColor::getDelFlag, Constants.UNDELETED).eq(StoreProductColor::getStoreId, storeId) + .eq(StoreProductColor::getStoreProdId, storeProdId)); + Map storeProdColorMap = storeProdColorList.stream().collect(Collectors.toMap(StoreProductColor::getStoreColorId, x -> x)); // 获取商品所有颜色的基础信息 List prodColorSizeList = this.prodColorSizeMapper.selectList(new LambdaQueryWrapper() .eq(StoreProductColorSize::getDelFlag, Constants.UNDELETED).eq(StoreProductColorSize::getStoreProdId, storeProdId)); Map> colorSizeMap = prodColorSizeList.stream().collect(Collectors.groupingBy(StoreProductColorSize::getStoreColorId)); List colorResList = new ArrayList<>(); - colorSizeMap.forEach((colorId, colorSizeList) -> { + colorSizeMap.forEach((storeColorId, colorSizeList) -> { // 商品颜色数据 - StoreProdStockTakeResDTO.SPSTColorSizeDTO color = new StoreProdStockTakeResDTO.SPSTColorSizeDTO() - .setStoreColorId(colorId).setColorName(storeColorMap.containsKey(colorId) ? storeColorMap.get(colorId).getColorName() : "") + StoreProdStockTakeResDTO.SPSTColorSizeDTO color = new StoreProdStockTakeResDTO.SPSTColorSizeDTO().setStoreColorId(storeColorId) + .setStoreProdStockId(storeProdColorStockMap.containsKey(storeColorId) ? storeProdColorStockMap.get(storeColorId).getId() : null) + .setStoreProdColorId(storeProdColorMap.containsKey(storeColorId) ? storeProdColorMap.get(storeColorId).getId() : null) + .setColorName(storeProdColorMap.containsKey(storeColorId) ? storeProdColorMap.get(storeColorId).getColorName() : "") // 商品对应颜色的库存 .setSizeStockList(colorSizeList.stream().sorted(Comparator.comparing(StoreProductColorSize::getSize)) .map(x -> new StoreProdStockTakeResDTO.SPSTSizeStockDTO().setStoreProdColorSizeId(x.getId()).setSize(x.getSize()) - .setStock(this.getSizeStock(x.getSize(), colorSizeStockMap.get(colorId)))) + .setStock(this.getSizeStock(x.getSize(), colorSizeStockMap.get(storeColorId)))) .collect(Collectors.toList())); colorResList.add(color); }); - return new StoreProdStockTakeResDTO().setStoreProdId(storeProdId).setProdArtNum(storeProd.getProdArtNum()).setColorList(colorResList); + return new StoreProdStockTakeResDTO().setStoreProdId(storeProdId).setProdArtNum(storeProd.getProdArtNum()) + .setMainPicUrl(CollectionUtils.isNotEmpty(mainPicList) ? mainPicList.get(0).getFileUrl() : "") + .setColorList(colorResList); } /** diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/IShipMasterService.java b/xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/IShipMasterService.java new file mode 100644 index 000000000..3aea53599 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/IShipMasterService.java @@ -0,0 +1,9 @@ +package com.ruoyi.xkt.service.shipMaster; + +/** + * @author ruoyi + */ +public interface IShipMasterService { + + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/impl/ShipMasterServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/impl/ShipMasterServiceImpl.java new file mode 100644 index 000000000..fe0e1611a --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/service/shipMaster/impl/ShipMasterServiceImpl.java @@ -0,0 +1,17 @@ +package com.ruoyi.xkt.service.shipMaster.impl; + +import com.ruoyi.xkt.service.shipMaster.IShipMasterService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * 公告 + * + * @author ruoyi + */ +@Service +@RequiredArgsConstructor +public class ShipMasterServiceImpl implements IShipMasterService { + + +}