Pārlūkot izejas kodu

首页订单和分类

wang 3 nedēļas atpakaļ
vecāks
revīzija
af1c70374c

+ 5 - 5
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java

@@ -84,13 +84,13 @@ public class OrderController {
             });
         }else {
             Sku byId = skuService.getById(orderParam.getOrderItem().getSkuId());
-            boolean skuStock = qnhService.getSkuStock(byId.getSkuCode(), byId.getProdId());
-            Product byId1 = productService.getById(byId.getProdId());
+            boolean skuStock = qnhService.getSkuStock(byId.getSkuCode(), byId.getProdId(),orderParam.getPlatform());
+            Product byId1 = productService.getById(byId.getProdId(),orderParam.getPlatform());
             byId1.setTotalStocks(byId.getStocks());
             productService.updateById(byId1);
-            if (skuStock && byId1.getTotalStocks() < orderParam.getOrderItem().getProdCount()) {
-                throw new GlobalException("当前选择的规格库存不足!");
-            }
+//            if (skuStock && byId1.getTotalStocks() < orderParam.getOrderItem().getProdCount()) {
+//                throw new GlobalException("当前选择的规格库存不足!");
+//            }
         }
         String userId = SecurityUtils.getUser().getUserId();
         orderParam.setDvyType(1);

+ 12 - 8
yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java

@@ -27,6 +27,7 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
@@ -59,19 +60,22 @@ public class ProdController {
     @ApiImplicitParam(name = "prodId", value = "商品ID", required = true, dataType = "Long")
     public ResponseEntity<ProductDto> prodInfo(Long prodId, Integer platform, Long shopId) {
 
-        Product product = prodService.getProductByProdId(prodId);
+        Product product = prodService.getProductByProdId(prodId, platform);
         if (product == null || product.getStatus() != 1) {
             throw new GlobalException("商品已下线");
         }
 
         List<Sku> skuList = skuService.listByProdId(prodId, platform, shopId);
-        // 启用的sku列表
-        List<Sku> useSkuList = skuList.stream().sorted(Comparator.comparing(
-                Sku::getPrice,
-                Comparator.nullsFirst(Comparator.naturalOrder())
-        )).peek((sku) -> product.setTotalStocks(product.getTotalStocks() + sku.getActualStocks())).collect(Collectors.toList());
-        product.setPrice(useSkuList.get(0).getPrice());
-        product.setSkuList(useSkuList);
+        if (ObjectUtils.isNotEmpty(skuList)) {
+            // 启用的sku列表
+            List<Sku> useSkuList = skuList.stream().sorted(Comparator.comparing(
+                    Sku::getPrice,
+                    Comparator.nullsFirst(Comparator.naturalOrder())
+            )).peek((sku) -> product.setTotalStocks(product.getTotalStocks() + sku.getActualStocks())).collect(Collectors.toList());
+            product.setPrice(useSkuList.get(0).getPrice());
+            product.setSkuList(useSkuList);
+        }
+
 //        ProductDto productDto = mapperFacade.map(product, ProductDto.class);
         ProductDto productDto = new ProductDto();
         BeanUtils.copyProperties(product, productDto);

+ 3 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderParam.java

@@ -51,6 +51,9 @@ public class OrderParam {
 	@ApiModelProperty(value = "用户是否自己选择使用多少积分,为空则为默认全部使用")
 	private Integer userUseScore;
 
+	@ApiModelProperty(value = "渠道标识")
+	private Integer platform=1;
+
 //	@ApiModelProperty(value = "每次订单提交时的uuid")
 //	private String uuid;
 //	@ApiModelProperty(value = "订单入口 SHOP_CART购物车,BUY_NOW立即购买")

+ 19 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/SearchProdDto.java

@@ -57,6 +57,25 @@ public class SearchProdDto {
 
     @ApiModelProperty("店铺id")
     private Long shopId;
+
+    @ApiModelProperty("自营id")
+    private Long selfLabelId;
+
+    @ApiModelProperty("回头客id")
+    private Long returnLabelId;
+
+    @ApiModelProperty("热卖榜id")
+    private Long hotLabelId;
+
+    @ApiModelProperty("自营标签")
+    private String selfLabel;
+
+    @ApiModelProperty("回头客标签")
+    private String returnLabel;
+
+    @ApiModelProperty("热卖榜标签")
+    private String hotLabel;
+
     @ApiModelProperty(value = "sku列表")
     private List<SkuDto> skuList;
 
@@ -64,5 +83,4 @@ public class SearchProdDto {
     private List<String> banners;
 
 
-
 }

+ 2 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Category.java

@@ -125,4 +125,6 @@ public class Category implements Serializable {
 
     @TableField(exist=false)
     private String shopName;
+
+    private String label;
 }

+ 1 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Product.java

@@ -150,6 +150,7 @@ public class Product implements Serializable {
     /**
      * 详细描述
      */
+    @TableField("`content`")
     private String content;
 
     /**

+ 8 - 5
yami-shop-service/src/main/java/com/yami/shop/dao/ProductMapper.java

@@ -39,13 +39,14 @@ public interface ProductMapper extends BaseMapper<Product> {
 
     Product getProductByProdNameAndShopId(@Param("prodName") String prodName, @Param("shopId") Long shopId);
 
+    Product doGetById(@Param("prodId") Long prodId, @Param("platform") Integer platform);
 
     void returnStock(@Param("prodCollect") Map<Long, Integer> prodCollect);
 
     IPage<ProductDto> pageByPutawayTime(IPage<ProductDto> page);
 
     IPage<ProductDto> pageByPutawayTimeNew(IPage<ProductDto> page,
-                                        @Param("list") List<Long> list);
+                                           @Param("list") List<Long> list);
 
     IPage<ProductDto> pageByScore(IPage<ProductDto> page);
 
@@ -154,19 +155,21 @@ public interface ProductMapper extends BaseMapper<Product> {
     Integer getSalesVolume(Long prodId);
 
     IPage<SearchProdDto> getSearchProdDtoPageByProdName2(@Param("page") Page page, @Param("searchParam") SearchParam searchParam);
+
     /**
      * 根据分类ID、商户ID查询归属的所有商品
-     * */
-    IPage<Product> listProdByCategoryIdAndShopId(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO")ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);
+     */
+    IPage<Product> listProdByCategoryIdAndShopId(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO") ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);
 
     /**
      * 根据分类ID、商户ID查询归属的所有商品
-     * */
-    IPage<Product> listProdByCategoryIdAndShopId2(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO")ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);
+     */
+    IPage<Product> listProdByCategoryIdAndShopId2(@Param("page") Page page, @Param("prodByCategoryIdAndShopIdDTO") ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);
 
 
     /**
      * 通过海博编码获取商品信息
+     *
      * @param hbSpuId 海博商品编码
      * @return 商品信息
      */

+ 1 - 0
yami-shop-service/src/main/java/com/yami/shop/service/IQnhService.java

@@ -38,6 +38,7 @@ public interface IQnhService {
     void synchronizedInfo();
 
     boolean getSkuStock(String skuCode,Long prodId);
+    boolean getSkuStock(String skuCode,Long prodId,Integer platform);
 
     void noticeProductInfo(Object object);
 }

+ 10 - 5
yami-shop-service/src/main/java/com/yami/shop/service/ProductService.java

@@ -32,6 +32,8 @@ import java.util.List;
  */
 public interface ProductService extends IService<Product> {
 
+    Product getById(Long prodId, Integer platform);
+
     /**
      * 保存商品
      *
@@ -53,6 +55,7 @@ public interface ProductService extends IService<Product> {
      * @return
      */
     Product getProductByProdId(Long prodId);
+    Product getProductByProdId(Long prodId,Integer platform);
 
 
     void removeProductByProdId(Long prodId);
@@ -119,24 +122,26 @@ public interface ProductService extends IService<Product> {
 
     /**
      * 根据分类ID查询关联商品
-     * */
+     */
     IPage<Product> listRelatedProducts(ListRelatedProductsDto listRelatedProductsDto);
 
     /**
      * 取消关联商品
-     * */
+     */
     boolean cancelRelatedProducts(long shopId, long productId);
+
     /**
      * 关联商品
-     * */
+     */
     boolean relatedProducts(long shopId, List<Long> productId, long shopCategoryId);
+
     /**
      * 根据商户ID查询未关联商品
-     * */
+     */
     IPage<Product> listUnRelatedProducts(ListUnRelatedProductsDTO listUnRelatedProductsDTO);
 
     /**
      * 根据分类ID、商户ID查询归属的所有商品
-     * */
+     */
     IPage<Product> listProdByCategoryIdAndShopId(ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO);
 }

+ 99 - 73
yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java

@@ -66,6 +66,7 @@ import java.util.stream.Collectors;
 public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
 
     private final ProductMapper productMapper;
+    private final LabelMapper labelMapper;
     private final BrandService brandService;
     private final CategoryService categoryService;
     private final ApplicationContext applicationContext;
@@ -73,6 +74,11 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     private final OfflineHandleEventService offlineHandleEventService;
 
 
+    @Override
+    public Product getById(Long prodId, Integer platform) {
+        return productMapper.doGetById(prodId, platform);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void saveProduct(Product product) {
@@ -137,11 +143,15 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
      * @return
      */
     @Override
-    @Cacheable(cacheNames = "product", key = "#prodId")
     public Product getProductByProdId(Long prodId) {
         return productMapper.selectById(prodId);
     }
 
+    @Override
+    public Product getProductByProdId(Long prodId, Integer platform) {
+        return productMapper.doGetById(prodId, platform);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Caching(evict = {
@@ -193,7 +203,6 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     }
 
 
-
     @Override
     public IPage<ProductDto> pageByTagId(Page<ProductDto> page, Long tagId) {
         return productMapper.pageByTagId(page, tagId);
@@ -219,6 +228,21 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             }
             IPage<SearchProdDto> searchProdDtoPage = productMapper.getSearchProdDtoPageByProdNameNew(page, searchParam, shopIds);
             for (SearchProdDto searchProdDto : searchProdDtoPage.getRecords()) {
+                Long hotLabelId = searchProdDto.getHotLabelId();
+                Long selfLabelId = searchProdDto.getSelfLabelId();
+                Long returnLabelId = searchProdDto.getReturnLabelId();
+                if (null != hotLabelId) {
+                    Label label = labelMapper.selectById(hotLabelId);
+                    searchProdDto.setHotLabel(label.getName());
+                }
+                if (null != selfLabelId) {
+                    Label label = labelMapper.selectById(selfLabelId);
+                    searchProdDto.setSelfLabel(label.getName());
+                }
+                if (null != returnLabelId) {
+                    Label label = labelMapper.selectById(returnLabelId);
+                    searchProdDto.setReturnLabel(label.getName());
+                }
                 List<SkuDto> skuList = skuMapper.listByProdId(searchProdDto.getProdId()).stream().map((sku) -> SkuDto.builder()
                         .skuName(sku.getSkuName()).pic(sku.getPic()).skuScore(sku.getSkuScore()).price(sku.getPrice())
                         .stocks(sku.getStocks()).properties(sku.getProperties()).skuId(sku.getSkuId())
@@ -341,24 +365,24 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
     @Override
     public IPage<Product> getPageAngShopName(PageParam<Product> page, ProductParam product) {
-        return productMapper.getPageAndShopName(page,product);
+        return productMapper.getPageAndShopName(page, product);
     }
 
 
     @Override
     public void exportProd(ProductExportParam productParam, HttpServletResponse response, Long shopId) {
         List<ProductExportParam> products = productMapper.listProdsByProdParam(productParam);
-        createExcel(products,response,shopId);
+        createExcel(products, response, shopId);
     }
 
-    private void createExcel(List<ProductExportParam> products, HttpServletResponse response,Long shopId) {
+    private void createExcel(List<ProductExportParam> products, HttpServletResponse response, Long shopId) {
 
         //通过工具类创建writer
         ExcelWriter writer = ExcelUtil.getBigWriter();
         // 待发货
-        String[] hearder = { "产品名称", "平台分类", "店铺分类", "所属品牌", "产品卖点", "配送方式","运费设置","产品状态",
-                            "规格名称","商品名称", "销售属性组合字符串 格式是p1:v1;p2:v2", "原价", "价格", "积分价格",
-                            "库存","商家编码","商品条形码" ,"商品重量", "商品体积"};
+        String[] hearder = {"产品名称", "平台分类", "店铺分类", "所属品牌", "产品卖点", "配送方式", "运费设置", "产品状态",
+                "规格名称", "商品名称", "销售属性组合字符串 格式是p1:v1;p2:v2", "原价", "价格", "积分价格",
+                "库存", "商家编码", "商品条形码", "商品重量", "商品体积"};
         Sheet sheet = writer.getSheet();
         sheet.setColumnWidth(0, 60 * 256);
         sheet.setColumnWidth(1, 20 * 256);
@@ -371,8 +395,8 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         writer.writeRow(Arrays.asList(hearder));
         // 限制商家分类和平台分类
         List<Category> categories = categoryService.list(new LambdaQueryWrapper<Category>()
-                .eq(Category::getShopId,0L).eq(Category::getGrade,2));
-        if(CollectionUtils.isNotEmpty(categories)) {
+                .eq(Category::getShopId, 0L).eq(Category::getGrade, 2));
+        if (CollectionUtils.isNotEmpty(categories)) {
             String[] categoryName = new String[categories.size()];
             for (int i = 0; i < categories.size(); i++) {
                 categoryName[i] = categories.get(i).getCategoryName();
@@ -380,7 +404,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             createDropDownList(sheet, categoryName, 2, 50000, 1, 1);
         }
         List<Category> shopCategories = categoryService.listByShopId(shopId);
-        if(CollectionUtils.isNotEmpty(shopCategories)) {
+        if (CollectionUtils.isNotEmpty(shopCategories)) {
             String[] categoryName = new String[shopCategories.size()];
             for (int i = 0; i < shopCategories.size(); i++) {
                 categoryName[i] = shopCategories.get(i).getCategoryName();
@@ -388,11 +412,11 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             createDropDownList(sheet, categoryName, 2, 50000, 2, 2);
         }
         // 限制物流方式
-        String[] dvyTypes = {"商家邮寄","用户自提","同城配送","商家邮寄,用户自提","商家邮寄,同城配送","同城配送,用户自提","商家邮寄,用户自提,同城配送"};
+        String[] dvyTypes = {"商家邮寄", "用户自提", "同城配送", "商家邮寄,用户自提", "商家邮寄,同城配送", "同城配送,用户自提", "商家邮寄,用户自提,同城配送"};
         createDropDownList(sheet, dvyTypes, 2, 50000, 5, 5);
         // 限制品牌选择
         List<Brand> brands = brandService.list(new LambdaQueryWrapper<Brand>().eq(Brand::getStatus, 1));
-        if(CollectionUtils.isNotEmpty(brands)) {
+        if (CollectionUtils.isNotEmpty(brands)) {
             String[] categoryName = new String[brands.size()];
             for (int i = 0; i < brands.size(); i++) {
                 categoryName[i] = brands.get(i).getBrandName();
@@ -400,17 +424,17 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             createDropDownList(sheet, categoryName, 2, 50000, 3, 3);
         }
         List<TransportParam> transportParams = new ArrayList<>();
-        applicationContext.publishEvent(new GetTransportNamesEvent(transportParams,shopId));
-        if(CollectionUtils.isNotEmpty(transportParams)) {
+        applicationContext.publishEvent(new GetTransportNamesEvent(transportParams, shopId));
+        if (CollectionUtils.isNotEmpty(transportParams)) {
             List<String> transportNameList = new ArrayList<>();
             transportParams.forEach(transportParam -> transportNameList.add(transportParam.getTransName()));
             String[] transportNames = transportNameList.toArray(new String[transportNameList.size()]);
-            createDropDownList(sheet,transportNames,2,50000,6,6);
+            createDropDownList(sheet, transportNames, 2, 50000, 6, 6);
         }
-        String[] statusStr = {"下架","上架"};
-        createDropDownList(sheet,statusStr,2,50000,7,7);
+        String[] statusStr = {"下架", "上架"};
+        createDropDownList(sheet, statusStr, 2, 50000, 7, 7);
         int row = 1;
-        if(CollectionUtils.isNotEmpty(products)) {
+        if (CollectionUtils.isNotEmpty(products)) {
             for (ProductExportParam prod : products) {
                 List<Sku> skuList = prod.getSkuList();
                 int firstRow = row + 1;
@@ -429,7 +453,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 mergeIfNeed(writer, firstRow, lastRow, ++col, col, prod.getBrief());
                 Product.DeliveryModeVO deliveryModeVO = Json.parseObject(prod.getDeliveryMode(), Product.DeliveryModeVO.class);
                 StringBuilder deliveryMode = new StringBuilder();
-                if(deliveryModeVO != null) {
+                if (deliveryModeVO != null) {
                     if (deliveryModeVO.getHasCityDelivery() != null && deliveryModeVO.getHasCityDelivery()) {
                         deliveryMode.append("同城配送,");
                     }
@@ -482,7 +506,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
     @Override
     public void downloadModel(HttpServletResponse response, Long shopId) {
-        createExcel(null,response,shopId);
+        createExcel(null, response, shopId);
     }
 
     @Override
@@ -500,29 +524,29 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         // * 2.1不是Excel文件,直接返回提示信息
         if (!(file.getOriginalFilename().contains("xls") || file.getOriginalFilename().contains("xlsx"))) {
             // 格式错误
-            throw  new YamiShopBindException("文件格式错误");
+            throw new YamiShopBindException("文件格式错误");
         }
 
         //TODO 如果三级分类需要获取最底层的分类
         // 获取平台分类map
         List<Category> categories = categoryService.list(new LambdaQueryWrapper<Category>()
-                .eq(Category::getShopId,0).eq(Category::getGrade,2));
+                .eq(Category::getShopId, 0).eq(Category::getGrade, 2));
         // 如果重复的key取最后一个的值
-        Map<String, Long> categoryMap = categories.stream().collect(Collectors.toMap(Category::getCategoryName, Category::getCategoryId,(key1 , key2)-> key2));
+        Map<String, Long> categoryMap = categories.stream().collect(Collectors.toMap(Category::getCategoryName, Category::getCategoryId, (key1, key2) -> key2));
 
         // 获取店铺分类map
         List<Category> shopCategories = categoryService.listByShopId(shopId);
         // 如果重复的key取最后一个的值
-        Map<String, Long> shopCategoryMap = shopCategories.stream().collect(Collectors.toMap(Category::getCategoryName, Category::getCategoryId,(key1 , key2)-> key2));
+        Map<String, Long> shopCategoryMap = shopCategories.stream().collect(Collectors.toMap(Category::getCategoryName, Category::getCategoryId, (key1, key2) -> key2));
 
         // 获取品牌map
         List<Brand> brands = brandService.list(new LambdaQueryWrapper<Brand>().eq(Brand::getStatus, 1));
-        Map<String, Long> brandMap = brands.stream().collect(Collectors.toMap(Brand::getBrandName, Brand::getBrandId,(key1 , key2)-> key2));
+        Map<String, Long> brandMap = brands.stream().collect(Collectors.toMap(Brand::getBrandName, Brand::getBrandId, (key1, key2) -> key2));
 
         // 获取运费模板map
         List<TransportParam> transportParams = new ArrayList<>();
-        applicationContext.publishEvent(new GetTransportNamesEvent(transportParams,shopId));
-        Map<String, Long> transportMap = transportParams.stream().collect(Collectors.toMap(TransportParam::getTransName, TransportParam::getTransportId,(key1 , key2)-> key2));
+        applicationContext.publishEvent(new GetTransportNamesEvent(transportParams, shopId));
+        Map<String, Long> transportMap = transportParams.stream().collect(Collectors.toMap(TransportParam::getTransName, TransportParam::getTransportId, (key1, key2) -> key2));
 
         List<Product> products = new ArrayList<>();
         List<Sku> skuList = new ArrayList<>();
@@ -541,15 +565,15 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 //                String[] hearder = { "产品名称", "平台分类", "店铺分类", "所属品牌", "产品卖点", "配送方式","运费设置",
 //                        "规格名称","商品名称", "销售属性组合字符串 格式是p1:v1;p2:v2", "原价", "价格", "积分价格",
 //                        "库存","商家编码","商品条形码" ,"商品重量", "商品体积","产品状态"};
-                String prodName = Objects.isNull(row.getCell(0))? "":row.getCell(0).getStringCellValue();
-                String category = Objects.isNull(row.getCell(1))? "":row.getCell(1).getStringCellValue();
-                String  shopCategory = Objects.isNull(row.getCell(2))? "":row.getCell(2).getStringCellValue();
-                String brandName = Objects.isNull(row.getCell(3))? "":row.getCell(3).getStringCellValue();
-                String brif = Objects.isNull(row.getCell(4))? "":row.getCell(4).getStringCellValue();
-                String dvyType = Objects.isNull(row.getCell(5))? "":row.getCell(5).getStringCellValue();
-                String transportName = Objects.isNull(row.getCell(6))? "":row.getCell(6).getStringCellValue();
-                String statusStr = Objects.isNull(row.getCell(7))? "":row.getCell(7).getStringCellValue();
-                if(StrUtil.isNotBlank(prodName) || !PoiExcelUtil.isMergedRegion(sheet,i,0)) {
+                String prodName = Objects.isNull(row.getCell(0)) ? "" : row.getCell(0).getStringCellValue();
+                String category = Objects.isNull(row.getCell(1)) ? "" : row.getCell(1).getStringCellValue();
+                String shopCategory = Objects.isNull(row.getCell(2)) ? "" : row.getCell(2).getStringCellValue();
+                String brandName = Objects.isNull(row.getCell(3)) ? "" : row.getCell(3).getStringCellValue();
+                String brif = Objects.isNull(row.getCell(4)) ? "" : row.getCell(4).getStringCellValue();
+                String dvyType = Objects.isNull(row.getCell(5)) ? "" : row.getCell(5).getStringCellValue();
+                String transportName = Objects.isNull(row.getCell(6)) ? "" : row.getCell(6).getStringCellValue();
+                String statusStr = Objects.isNull(row.getCell(7)) ? "" : row.getCell(7).getStringCellValue();
+                if (StrUtil.isNotBlank(prodName) || !PoiExcelUtil.isMergedRegion(sheet, i, 0)) {
                     skuList = new ArrayList<>();
                     product = new Product();
                     totalStocks = 0;
@@ -580,30 +604,30 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
                     products.add(product);
                 }
-                String[] hearder = { "产品名称", "平台分类", "店铺分类", "所属品牌", "产品卖点", "配送方式","运费设置","产品状态",
-                        "规格名称","商品名称", "销售属性组合字符串 格式是p1:v1;p2:v2", "原价", "价格", "积分价格",
-                        "库存","商家编码","商品条形码" ,"商品重量", "商品体积"};
-                String  skuName = Objects.isNull(row.getCell(8))? "":row.getCell(8).getStringCellValue();
-                String skuProdName = Objects.isNull(row.getCell(9))? "":row.getCell(9).getStringCellValue();
-                String  properties = Objects.isNull(row.getCell(10))? "":row.getCell(10).getStringCellValue();
-                double skuOriPrice = Objects.isNull(row.getCell(11))? 0.0:row.getCell(11).getNumericCellValue();
-                double skuPrice = Objects.isNull(row.getCell(12))? 0.0:row.getCell(12).getNumericCellValue();
-                Integer skuScorePrice = Integer.valueOf(StrUtil.isBlank(row.getCell(13).getStringCellValue())? "0":row.getCell(13).getStringCellValue());
-                Integer stocks = Objects.isNull(row.getCell(14))? 0:(int)(row.getCell(14).getNumericCellValue());
+                String[] hearder = {"产品名称", "平台分类", "店铺分类", "所属品牌", "产品卖点", "配送方式", "运费设置", "产品状态",
+                        "规格名称", "商品名称", "销售属性组合字符串 格式是p1:v1;p2:v2", "原价", "价格", "积分价格",
+                        "库存", "商家编码", "商品条形码", "商品重量", "商品体积"};
+                String skuName = Objects.isNull(row.getCell(8)) ? "" : row.getCell(8).getStringCellValue();
+                String skuProdName = Objects.isNull(row.getCell(9)) ? "" : row.getCell(9).getStringCellValue();
+                String properties = Objects.isNull(row.getCell(10)) ? "" : row.getCell(10).getStringCellValue();
+                double skuOriPrice = Objects.isNull(row.getCell(11)) ? 0.0 : row.getCell(11).getNumericCellValue();
+                double skuPrice = Objects.isNull(row.getCell(12)) ? 0.0 : row.getCell(12).getNumericCellValue();
+                Integer skuScorePrice = Integer.valueOf(StrUtil.isBlank(row.getCell(13).getStringCellValue()) ? "0" : row.getCell(13).getStringCellValue());
+                Integer stocks = Objects.isNull(row.getCell(14)) ? 0 : (int) (row.getCell(14).getNumericCellValue());
                 String partyCode = "";
-                if(Objects.nonNull(row.getCell(15))) {
+                if (Objects.nonNull(row.getCell(15))) {
                     row.getCell(15).setCellType(CellType.STRING);
-                    partyCode  = row.getCell(15).getStringCellValue();
+                    partyCode = row.getCell(15).getStringCellValue();
                 }
                 String modelId = "";
-                if(Objects.nonNull(row.getCell(15))) {
+                if (Objects.nonNull(row.getCell(15))) {
                     row.getCell(16).setCellType(CellType.STRING);
-                    modelId  = row.getCell(15).getStringCellValue();
+                    modelId = row.getCell(15).getStringCellValue();
                 }
-                double weight = Objects.isNull(row.getCell(17))? 0.0:row.getCell(17).getNumericCellValue();
-                double volume = Objects.isNull(row.getCell(18))? 0.0:row.getCell(18).getNumericCellValue();
-                oriPrice = Objects.equals(oriPrice ,0.0) ? skuOriPrice:oriPrice;
-                price = Objects.equals(price ,0.0) ? skuPrice:price;
+                double weight = Objects.isNull(row.getCell(17)) ? 0.0 : row.getCell(17).getNumericCellValue();
+                double volume = Objects.isNull(row.getCell(18)) ? 0.0 : row.getCell(18).getNumericCellValue();
+                oriPrice = Objects.equals(oriPrice, 0.0) ? skuOriPrice : oriPrice;
+                price = Objects.equals(price, 0.0) ? skuPrice : price;
 
                 Sku sku = new Sku();
                 sku.setSkuName(skuName);
@@ -624,7 +648,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 skuList.add(sku);
                 // 如果prodName为空并且为合并行则为一个prod
                 totalStocks += stocks;
-                if(price > skuPrice) {
+                if (price > skuPrice) {
                     oriPrice = skuOriPrice;
                     price = skuPrice;
                     scorePrice = skuScorePrice;
@@ -641,34 +665,34 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         }
         workBook.close();
         //不为空批量导入
-        if(CollectionUtils.isNotEmpty(products)){
+        if (CollectionUtils.isNotEmpty(products)) {
             saveBatch(products);
 //            List<Sku> skuDb = new ArrayList<>();
             for (Product productDb : products) {
                 List<Sku> skus = productDb.getSkuList();
-                skuMapper.insertBatch(productDb.getProdId(),skus);
+                skuMapper.insertBatch(productDb.getProdId(), skus);
 //                skus.forEach(sku -> sku.setProdId(product.getProdId()));
 //                skuDb.addAll(skus);
             }
 //            skuMapper.save(skuDb);
-                return "检查到" + insertRows + "条商品,成功导入" + products.size() + "条卡密!";
-            }
+            return "检查到" + insertRows + "条商品,成功导入" + products.size() + "条卡密!";
+        }
         return "数据错误!导入0条";
     }
 
     @Override
     public IPage<Product> pageProducts(PageParam<Product> page, ProductParam product) {
-        return productMapper.pageProducts(page,product);
+        return productMapper.pageProducts(page, product);
     }
 
     @Override
     public IPage<Product> listRelatedProducts(ListRelatedProductsDto listRelatedProductsDto) {
         IPage<Product> products = null;
-        if(null == listRelatedProductsDto.getProdName()){
+        if (null == listRelatedProductsDto.getProdName()) {
             products = page(new Page<>(listRelatedProductsDto.getCurrent(), listRelatedProductsDto.getSize()), new LambdaQueryWrapper<Product>()
                     .eq(Product::getShopCategoryId, listRelatedProductsDto.getShopCategoryId())
                     .orderByDesc(Product::getCreateTime));
-        }else {
+        } else {
             products = page(new Page<>(listRelatedProductsDto.getCurrent(), listRelatedProductsDto.getSize()), new LambdaQueryWrapper<Product>()
                     .eq(Product::getShopCategoryId, listRelatedProductsDto.getShopCategoryId())
                     .orderByDesc(Product::getCreateTime)
@@ -699,24 +723,25 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             if (product != null) {
                 product.setShopCategoryId(shopCategoryId);
                 productMapper.updateById(product);
-            }else {
+            } else {
                 throw new GlobalException("关联失败!");
-            }});
+            }
+        });
         return true;
     }
 
     @Override
     public IPage<Product> listUnRelatedProducts(ListUnRelatedProductsDTO listUnRelatedProductsDTO) {
         IPage<Product> products = null;
-        if(null == listUnRelatedProductsDTO.getProdName()){
+        if (null == listUnRelatedProductsDTO.getProdName()) {
             products = page(new Page<>(listUnRelatedProductsDTO.getCurrent(), listUnRelatedProductsDTO.getSize()), new LambdaQueryWrapper<Product>()
                     .eq(Product::getShopId, listUnRelatedProductsDTO.getShopId())
-                    .eq(Product::getShopCategoryId,0)
+                    .eq(Product::getShopCategoryId, 0)
                     .orderByDesc(Product::getCreateTime));
-        }else {
+        } else {
             products = page(new Page<>(listUnRelatedProductsDTO.getCurrent(), listUnRelatedProductsDTO.getSize()), new LambdaQueryWrapper<Product>()
                     .eq(Product::getShopId, listUnRelatedProductsDTO.getShopId())
-                    .eq(Product::getShopCategoryId,0)
+                    .eq(Product::getShopCategoryId, 0)
                     .orderByDesc(Product::getCreateTime)
                     .like(Product::getProdName, listUnRelatedProductsDTO.getProdName()));
         }
@@ -727,7 +752,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     public IPage<Product> listProdByCategoryIdAndShopId(ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO) {
         IPage<Product> productIPage = productMapper.listProdByCategoryIdAndShopId(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
                 prodByCategoryIdAndShopIdDTO);
-        if(productIPage.getRecords().isEmpty()){
+        if (productIPage.getRecords().isEmpty()) {
             productIPage = productMapper.listProdByCategoryIdAndShopId2(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
                     prodByCategoryIdAndShopIdDTO);
         }
@@ -746,13 +771,13 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         mode.setHasUserPickUp(false);
         mode.setHasCityDelivery(false);
         for (String str : split) {
-            if(StrUtil.equals(str,"商家邮寄")){
+            if (StrUtil.equals(str, "商家邮寄")) {
                 mode.setHasShopDelivery(true);
             }
-            if(StrUtil.equals(str,"用户自提")){
+            if (StrUtil.equals(str, "用户自提")) {
                 mode.setHasUserPickUp(true);
             }
-            if(StrUtil.equals(str,"同城配送")){
+            if (StrUtil.equals(str, "同城配送")) {
                 mode.setHasCityDelivery(true);
             }
         }
@@ -799,6 +824,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         }
 
     }
+
     private void writeExcel(HttpServletResponse response, ExcelWriter writer) {
         //response为HttpServletResponse对象
         response.setContentType("application/vnd.ms-excel;charset=utf-8");

+ 54 - 11
yami-shop-service/src/main/java/com/yami/shop/service/impl/QnhServiceImpl.java

@@ -1,4 +1,5 @@
 package com.yami.shop.service.impl;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yami.shop.bean.app.param.QnhPushParam;
@@ -110,12 +111,12 @@ public class QnhServiceImpl implements IQnhService {
                 .requestParam(JSON.toJSONString(body))
                 .result(result.toJSONString())
                 .createTime(LocalDateTime.now()).build());
-         if (result.getBoolean("result")) {
+        if (result.getBoolean("result")) {
             JSONArray resultList = result.getJSONArray("resultList");
             List<StoreListVo> storeListVos = JSONObject.parseArray(JSONArray.toJSONString(resultList), StoreListVo.class);
             return storeListVos;
         } else {
-             throw new GlobalException(result.getString("msg"));
+            throw new GlobalException(result.getString("msg"));
         }
     }
 
@@ -151,14 +152,15 @@ public class QnhServiceImpl implements IQnhService {
     }
 
     @Override
-    public boolean getSkuStock(String skuCode,Long prodId) {
+    public boolean getSkuStock(String skuCode, Long prodId) {
         Sku one1 = skuService.getOne(Wrappers.<Sku>lambdaQuery().eq(Sku::getSkuCode, skuCode).eq(Sku::getProdId, prodId));
         Map<String, Object> body = bulidMap();
-        if(null == one1) throw new GlobalException("请重新选择规格,该规格不存在!");
-        ShopDetail shopDetail = shopDetailMapper.selectById(productService.getById(prodId).getShopId());
+        if (null == one1) throw new GlobalException("请重新选择规格,该规格不存在!");
+        Product byId = productService.getById(prodId, 1);
+        ShopDetail shopDetail = shopDetailMapper.selectById(byId.getShopId());
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("page_no", 1);
-        if(ObjectUtils.isNotEmpty(shopDetail)){
+        if (ObjectUtils.isNotEmpty(shopDetail)) {
             jsonObject.put("poi_code", shopDetail.getThirdPartyCode());
         }
         jsonObject.put("sku_code", skuCode);
@@ -185,6 +187,46 @@ public class QnhServiceImpl implements IQnhService {
         }
     }
 
+    @Override
+    public boolean getSkuStock(String skuCode, Long prodId, Integer platform) {
+        Sku one1 = skuService.getOne(Wrappers.<Sku>lambdaQuery().eq(Sku::getSkuCode, skuCode).eq(Sku::getProdId, prodId));
+        Map<String, Object> body = bulidMap();
+        if (null == one1) throw new GlobalException("请重新选择规格,该规格不存在!");
+        Product byId = productService.getById(prodId, platform);
+        ShopDetail shopDetail = shopDetailMapper.selectById(byId.getShopId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("page_no", 1);
+        if (ObjectUtils.isNotEmpty(shopDetail)) {
+            jsonObject.put("poi_code", shopDetail.getThirdPartyCode());
+        }
+        jsonObject.put("sku_code", skuCode);
+        jsonObject.put("page_size", 50);
+        //TODO wangjian 原先查询牵牛花的库存,现在需要替换成海博的
+        one1.setStocks(99);
+        one1.setActualStocks(99);
+        return Boolean.TRUE;
+//        HttpResponse execute = getExecute(body, jsonObject, GET_SKU_STOCK);
+//        JSONObject result = JSONObject.parseObject(execute.body());
+//        requestLogService.addLog(RequestLog.builder()
+//                .resource("qnh")
+//                .requestMethod("getSkuStock")
+//                .requestParam(JSON.toJSONString(body))
+//                .result(result.toJSONString())
+//                .createTime(LocalDateTime.now()).build());
+//        if (result.get("data") != null) {
+//            JSONArray resultList = result.getJSONArray("data");
+//            resultList.forEach(rowData -> {
+//                JSONObject jsonObject1 = JSONObject.parseObject(rowData.toString());
+//                one1.setStocks(jsonObject1.getBigDecimal("available_stock").intValue());
+//                one1.setActualStocks(jsonObject1.getBigDecimal("available_stock").intValue());
+//                skuService.updateById(one1);
+//            });
+//            return true;
+//        } else {
+//            throw new GlobalException(result.getString("msg"));
+//        }
+    }
+
     private HttpResponse getExecute(Map<String, Object> body, JSONObject jsonObject, String url) {
         body.put("data", jsonObject);
         body.put("sign", generateSignature(body));
@@ -570,7 +612,7 @@ public class QnhServiceImpl implements IQnhService {
     public Map<String, Object> bulidMap() {
         Map<String, Object> body = new HashMap<>();
         body.put("appid", APP_ID);
-        body.put("timestamp", (System.currentTimeMillis() /1000));
+        body.put("timestamp", (System.currentTimeMillis() / 1000));
         body.put("qid", UUID.randomUUID().toString());
         body.put("version", "2.3");
         return body;
@@ -585,7 +627,7 @@ public class QnhServiceImpl implements IQnhService {
             if (Objects.isNull(data.get(item))) {
                 continue;
             }
-            if(!data.get(item).toString().trim().isEmpty()) {
+            if (!data.get(item).toString().trim().isEmpty()) {
                 sb.append(item).append("=").append(data.get(item).toString().trim()).append("&");
             }
         }
@@ -663,7 +705,7 @@ public class QnhServiceImpl implements IQnhService {
 
     /**
      * 从牵牛花同步商家信息-》商品信息-》sku信息
-     * */
+     */
     public void synchronizedInfo() {
         StoreDto dto = new StoreDto();
         Map<String, Object> body = bulidMap();
@@ -700,7 +742,7 @@ public class QnhServiceImpl implements IQnhService {
                             .setCity(storeListVo.getCity())
                             .setShopName(storeListVo.getName());
                     shopDetailMapper.insert(detail);
-                }else {
+                } else {
                     shopDetail.setShopAddress(storeListVo.getAddress())
                             .setCity(storeListVo.getCity())
                             .setShopName(storeListVo.getName());
@@ -721,6 +763,7 @@ public class QnhServiceImpl implements IQnhService {
                 .result(JSON.toJSONString(object))
                 .createTime(LocalDateTime.now()).build());
     }
+
     public void synchronizedInfo1(String code) {
         List<StoreListVo> storeListVoList = getStores(new StoreDto());
         if (CollectionUtil.isNotEmpty(storeListVoList)) {
@@ -920,7 +963,7 @@ public class QnhServiceImpl implements IQnhService {
                 return info;
             }
         }
-        if(channelItems.isEmpty()){
+        if (channelItems.isEmpty()) {
             return null;
         }
         return channelItems.get(0);

+ 1 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopCategoryServiceImpl.java

@@ -157,6 +157,7 @@ public class ShopCategoryServiceImpl extends ServiceImpl<ShopCategoryMapper, Sho
             category.setPic(sc.getPic());
             category.setSeq(sc.getNum());
             category.setGrade(sc.getLevel());
+            category.setLabel(sc.getLabel());
             return category;
         }).collect(Collectors.toList());
         res.setRecords(categories);

+ 0 - 2
yami-shop-service/src/main/java/com/yami/shop/service/impl/SkuServiceImpl.java

@@ -39,13 +39,11 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements SkuSe
     }
 
     @Override
-    @Cacheable(cacheNames = "listByProdIdAndPlatform", key = "#prodId")
     public List<Sku> listByProdId(Long prodId, Integer platform, Long shopId) {
         return skuMapper.listByProdIdAndPlatform(prodId, platform, shopId);
     }
 
     @Override
-    @Cacheable(cacheNames = "sku", key = "#skuId")
     public Sku getSkuBySkuId(Long skuId) {
         return skuMapper.selectById(skuId);
     }

+ 45 - 1
yami-shop-service/src/main/resources/mapper/ProductMapper.xml

@@ -128,6 +128,47 @@
         select * from tz_prod where prod_name = #{prodName} and shop_id = #{shopId}
     </select>
 
+    <select id="doGetById" resultType="com.yami.shop.bean.model.Product">
+        SELECT
+            tp.prod_id,
+            tp.prod_name,
+            tcs.shop_id AS shop_id,  -- 使用tcs.shop_id覆盖默认shop_id
+            tp.brand_id,
+            tp.brand_name,
+            tp.ori_price,
+            tp.price,
+            tp.score_price,
+            tp.brief,
+            tp.video,
+            tp.pic,
+            tp.content,
+            tp.imgs,
+            tp.status,
+            tp.is_delete,
+            tp.shop_category_id,
+            tp.category_id,
+            tp.hb_front_category_id,
+            tp.sold_num,
+            tp.total_stocks,
+            tp.delivery_mode,
+            tp.delivery_template_id,
+            tp.create_time,
+            tp.update_time,
+            tp.putaway_time,
+            tp.version,
+            tp.prod_type,
+            tp.activity_id,
+            tp.sup_id,
+            tp.hb_spu_id,
+            tp.hb_status
+        FROM tz_prod AS tp
+                 LEFT JOIN tz_shop_sku AS tss ON tp.prod_id = tss.spu_id
+                 LEFT JOIN tz_channel_shop AS tcs ON tss.shop_id = tcs.shop_id
+        WHERE tp.prod_id = #{prodId}
+          AND tcs.channel_id = #{platform}
+        GROUP BY tcs.shop_id;
+    </select>
+
 
     <update id="returnStock">
         <foreach collection="prodCollect" item="changeStocks" index="prodId" separator=";">
@@ -552,9 +593,12 @@
         any_value(p.prod_id) as prod_id,
         any_value(p.imgs) as pic,
         any_value(p.prod_name) as prod_name,
-        any_value(p.price) as price,
+        any_value(tss.shop_sku_price) as price,
         any_value(p.brief) as brief,
         any_value ( tss.shop_id ) AS shopId,
+        any_value ( tss.self_label_id ) AS selfLabelId,
+        any_value ( tss.return_label_id ) AS returnLabelId,
+        any_value ( tss.hot_label_id ) AS hotLabelId,
         count(pc.prod_comm_id) as prod_comm_number,
         count( CASE WHEN evaluate = 0 THEN prod_comm_id ELSE null END ) AS praise_number,
         (6371 * acos(cos(radians(#{searchParam.lat})) * cos(radians(shop_lat)) * cos(radians(shop_lng) -