Browse Source

add package update and on sale goods relation add and update

huodongdong 7 years ago
parent
commit
466c98dfe4

+ 1 - 1
rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/PackageProductRelation.java

@@ -34,7 +34,7 @@ public class PackageProductRelation implements Serializable {
     private String id;
 
     @Column(name = "pkg_id")
-    private String packageId;
+    private String pkgId;
 
     private String pid;
 

+ 4 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/repository/GoodsRepository.java

@@ -24,5 +24,8 @@ public interface GoodsRepository extends BasicJpaRepository<Goods, String> {
     Integer deleteById(String id);
 
     @Query(value = "select g from Goods g where g.pkgId = ?1 and g.status = 0 and g.merchantId = ?2")
-    List<Goods> findGoodsByPkgIdAndMerchantId(String pkgId, String merchantId);
+    List<Goods> findByPkgIdAndMerchantId(String pkgId, String merchantId);
+
+    @Query(value = "select g from Goods g where g.pkgId = ?1 and g.merchantId in (?2)")
+    List<Goods> findByPkgIdAndMerchantIds(String pkgId, List<String> merchantIds);
 }

+ 4 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/repository/PackageProductRelationRepository.java

@@ -9,10 +9,10 @@ import java.util.List;
 
 public interface PackageProductRelationRepository extends BasicJpaRepository<PackageProductRelation, String> {
 
-    @Query(value = "select r from PackageProductRelation r where r.packageId = ?1 and r.status = 0 order by r.sort")
-    List<PackageProductRelation> findByPackageId(String packageId);
+    @Query(value = "select r from PackageProductRelation r where r.pkgId = ?1 and r.status = 0 order by r.sort")
+    List<PackageProductRelation> findByPkgId(String pkgId);
 
     @Modifying
-    @Query(value = "update PackageProductRelation r set r.status = 1 where r.packageId = ?1")
-    Integer deleteByPackageId(String pkgId);
+    @Query(value = "update PackageProductRelation r set r.status = 1 where r.pkgId = ?1")
+    Integer deleteByPkgId(String pkgId);
 }

+ 10 - 3
rankin-product-service/src/main/java/cn/rankin/productservice/service/MerchantProductService.java

@@ -42,6 +42,9 @@ public class MerchantProductService {
     @Autowired
     private PackageService packageService;
 
+    @Autowired
+    private PackageChangeService packageChangeService;
+
     public APIResult<Page<MerchantProduct>> search(MerchantProduct merchantProduct, Integer pageNo, Integer pageSize, LinkedHashMap<String, BaseOrderEnum> sort) {
         Long count = merchantProductRepository.count(merchantProduct);
         Page<MerchantProduct> page = new Page<>(count, pageNo, pageSize);
@@ -172,7 +175,7 @@ public class MerchantProductService {
             List<PackageProductVo> productVos = packageService.getPackageProducts(productId);
             merchantProduct.setProducts(productVos);
 
-            List<Goods> specials = goodsRepository.findGoodsByPkgIdAndMerchantId(productId, merchantId);
+            List<Goods> specials = goodsRepository.findByPkgIdAndMerchantId(productId, merchantId);
             merchantProduct.setSpecials(specials);
         }
 
@@ -182,8 +185,9 @@ public class MerchantProductService {
     @Transactional
     public APIResult change(String productId, String merchantId, BaseStatusEnum status) {
         MerchantProduct merchantProduct = merchantProductRepository.findByPidAndMerchantId(productId, merchantId);
+        Product product = productRepository.findByPid(productId);
+
         if (merchantProduct == null) {
-            Product product = productRepository.findByPid(productId);
             if (product == null) {
                 return APIResult.error(ProductServiceAPICode.NOT_EXISTS);
             }
@@ -195,9 +199,12 @@ public class MerchantProductService {
             merchantProduct.setMerchantId(merchantId);
         }
         merchantProduct.setStatus(status);
-
         merchantProductRepository.save(merchantProduct);
 
+        if (merchantProduct != null && product.getType().equals(ProductTypeEnum.PACKAGE)) {
+            packageChangeService.addPackageInsideGoods(productId, merchantId);
+        }
+
         return APIResult.ok();
     }
 

+ 139 - 2
rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageChangeService.java

@@ -1,17 +1,25 @@
 package cn.rankin.productservice.service;
 
+import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.data.api.product.dto.PackageProductDTO;
+import cn.rankin.data.api.product.entity.Goods;
 import cn.rankin.data.api.product.entity.MerchantProduct;
+import cn.rankin.data.api.product.entity.PackageProductRelation;
 import cn.rankin.data.api.product.entity.Product;
 import cn.rankin.productservice.repository.GoodsRepository;
 import cn.rankin.productservice.repository.MerchantProductRepository;
+import cn.rankin.productservice.repository.PackageProductRelationRepository;
 import cn.rankin.productservice.repository.ProductRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import javax.transaction.Transactional;
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class PackageChangeService {
@@ -25,12 +33,141 @@ public class PackageChangeService {
     @Autowired
     private ProductRepository productRepository;
 
+    @Autowired
+    private PackageProductRelationRepository packageProductRelationRepository;
+
+    // 课程包进行调整时需要将上架渠道的课程包内的商品进行增删修改
     @Transactional
-    public void updatePackageInsideGoods(String pkgId, List<PackageProductDTO> dtoList) {
+    public void updatePackageInsideGoods(String pkgId, List<PackageProductDTO> productDTOList) {
         List<String> productIdList = new ArrayList<>();
-        dtoList.forEach(dto -> productIdList.add(dto.getPid()));
+        productDTOList.forEach(dto -> productIdList.add(dto.getPid()));
 
         List<Product> productList = productRepository.findByPids(productIdList);
+        Map<String, Product> productMap = new HashMap<>();
+        productList.forEach(product -> productMap.put(product.getPid(), product));
+
         List<MerchantProduct> merchantProductList = merchantProductRepository.findByPid(pkgId);
+        if (CollectionUtils.isEmpty(merchantProductList)) {
+            return;
+        }
+
+        // 看哪些渠道上线了这款产品
+        List<String> merchantIdList = new ArrayList<>();
+        merchantProductList.forEach(merchantProduct -> merchantIdList.add(merchantProduct.getMerchantId()));
+
+        // 把goods拿出来
+        List<Goods> goodsList = goodsRepository.findByPkgIdAndMerchantIds(pkgId, merchantIdList);
+        Map<String, List<Goods>> merchantGoodsMap = new HashMap<>();
+        for (Goods goods : goodsList) {
+            String merchantId = goods.getMerchantId();
+            List<Goods> tmp = merchantGoodsMap.get(merchantId);
+            if (tmp == null) {
+                tmp = new ArrayList<>();
+                tmp.add(goods);
+                merchantGoodsMap.put(merchantId, tmp);
+            }else {
+                tmp.add(goods);
+            }
+        }
+
+        // 最后需要更新的处理之后的list
+        List<Goods> finalGoodsList = new ArrayList<>();
+        // 按渠道处理
+        for (String merchantId : merchantIdList) {
+            Map<String, Goods> productIdGoodsMap = new HashMap<>();
+
+            List<Goods> merchantGoodsList = merchantGoodsMap.get(merchantId) ;
+            if (merchantGoodsList == null) {
+                merchantGoodsList = new ArrayList<>();
+            }else {
+                for (Goods goods : merchantGoodsList) {
+                    String productId = goods.getId();
+                    productIdGoodsMap.put(productId, goods);
+                }
+            }
+
+            for (PackageProductDTO productDTO : productDTOList) {
+                String productId = productDTO.getPid();
+                Goods goods = productIdGoodsMap.get(productId);
+                if (goods == null) {
+                    goods = new Goods();
+                    Product product = productMap.get(productId);
+                    if (product == null) {
+                        continue;
+                    }
+                    // 初始化goods信息
+                    goods.setCpId(product.getCpId());
+                    goods.setPid(productId);
+                    goods.setCpPrice(productDTO.getCpPrice());
+                    goods.setTerminalPrice(BigDecimal.ZERO);
+                    goods.setTerminalPrice(BigDecimal.ZERO);
+                    goods.setDuration(0);
+                    goods.setMerchantId(merchantId);
+                    goods.setPkgId(pkgId);
+                    goods.setType(product.getType());
+                    merchantGoodsList.add(goods);
+                }else {
+                    goods.setCpPrice(productDTO.getCpPrice());
+                    goods.setStatus(BaseStatusEnum.NORMAL);
+                }
+            }
+
+            for (Goods goods : merchantGoodsList) {
+                String productId = goods.getPid();
+                if (!productIdList.contains(productId)) {
+                    goods.setStatus(BaseStatusEnum.DEL);
+                    continue;
+                }
+                Integer index = productIdList.indexOf(productId);
+                goods.setSort(index);
+            }
+
+            finalGoodsList.addAll(merchantGoodsList);
+        }
+
+        // 最后保存
+        goodsRepository.save(finalGoodsList);
+    }
+
+    // 课程包上架时需要将课程包内的商品进行相应的添加操作
+    @Transactional
+    public void addPackageInsideGoods(String pkgId, String merchantId) {
+        List<PackageProductRelation> productRelationList = packageProductRelationRepository.findByPkgId(pkgId);
+        if (CollectionUtils.isEmpty(productRelationList)) {
+            return;
+        }
+
+        List<String> productIdList = new ArrayList<>();
+        productRelationList.forEach(relation -> productIdList.add(relation.getPid()));
+        List<Product> productList = productRepository.findByPids(productIdList);
+
+        Map<String, Product> productMap = new HashMap<>();
+        productList.forEach(product -> productMap.put(product.getPid(), product));
+
+        List<Goods> goodsList = new ArrayList<>();
+        Integer sort = 0;
+        for (PackageProductRelation relation : productRelationList) {
+            String productId = relation.getPid();
+            Product product = productMap.get(productId);
+            if (product == null) {
+                continue;
+            }
+
+            Goods goods = new Goods();
+            goods.setCpId(product.getCpId());
+            goods.setPid(productId);
+            goods.setCpPrice(relation.getCpPrice());
+            goods.setTerminalPrice(BigDecimal.ZERO);
+            goods.setTerminalPrice(BigDecimal.ZERO);
+            goods.setDuration(0);
+            goods.setMerchantId(merchantId);
+            goods.setPkgId(pkgId);
+            goods.setType(product.getType());
+
+            goodsList.add(goods);
+            sort ++;
+        }
+
+        goodsRepository.save(goodsList);
     }
 }

+ 5 - 5
rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageProductRelationService.java

@@ -22,13 +22,13 @@ public class PackageProductRelationService {
     @Autowired
     private PackageProductRelationRepository packageProductRelationRepository;
 
-    public List<PackageProductRelation> findByPackageId(String packageId) {
-        return packageProductRelationRepository.findByPackageId(packageId);
+    public List<PackageProductRelation> findByPkgId(String pkgId) {
+        return packageProductRelationRepository.findByPkgId(pkgId);
     }
 
     @Transactional
-    public Integer deleteByPackageId(String pkgId) {
-        return packageProductRelationRepository.deleteByPackageId(pkgId);
+    public Integer deleteByPkgId(String pkgId) {
+        return packageProductRelationRepository.deleteByPkgId(pkgId);
     }
 
     @Transactional
@@ -46,7 +46,7 @@ public class PackageProductRelationService {
 
         // 更新现有的, 同时记录现有的关系
         List<String> currentIdList = new ArrayList<>();
-        List<PackageProductRelation> currentRelationList = packageProductRelationRepository.findByPackageId(pkgId);
+        List<PackageProductRelation> currentRelationList = packageProductRelationRepository.findByPkgId(pkgId);
         currentRelationList.forEach( relation -> {
             String productId = relation.getPid();
             if (!productIdList.contains(productId)) {

+ 12 - 6
rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageService.java

@@ -36,27 +36,30 @@ public class PackageService {
     @Autowired
     private PackageProductRelationService packageProductRelationService;
 
+    @Autowired
+    private PackageChangeService packageChangeService;
+
     public boolean exists(String code) {
         Long count = packageRepository.countByCode(code);
         return count > 0;
     }
 
-    public APIResult<Package> getPackage(String packageId) {
-        Package pkg = packageRepository.find(packageId);
+    public APIResult<Package> getPackage(String pkgId) {
+        Package pkg = packageRepository.find(pkgId);
         if (pkg == null) {
             return APIResult.error(ProductServiceAPICode.NOT_EXISTS);
         }
 
-        List<PackageProductVo> packageProductVoList = getPackageProducts(packageId);
+        List<PackageProductVo> packageProductVoList = getPackageProducts(pkgId);
         pkg.setProducts(packageProductVoList);
 
         return APIResult.ok(pkg);
     }
 
-    public List<PackageProductVo> getPackageProducts(String packageId) {
+    public List<PackageProductVo> getPackageProducts(String pkgId) {
         List<PackageProductVo> packageProductVoList = new ArrayList<>();
 
-        List<PackageProductRelation> relationList = packageProductRelationService.findByPackageId(packageId);
+        List<PackageProductRelation> relationList = packageProductRelationService.findByPkgId(pkgId);
         if (relationList.size() == 0) {
             return packageProductVoList;
         }
@@ -127,6 +130,9 @@ public class PackageService {
             return APIResult.error(ProductServiceAPICode.error("产品关系更新失败"));
         }
 
+        // 更新课程包内的商品信息
+        packageChangeService.updatePackageInsideGoods(pkgId, packageProductDTOList);
+
         List<PackageProductVo> packageProductVoList = getPackageProducts(pkgId);
         pkg.setProducts(packageProductVoList);
         return APIResult.ok(pkg);
@@ -137,7 +143,7 @@ public class PackageService {
         if (packageProductDTOList == null) {
             return true;
         }else if (packageProductDTOList.size() == 0) {
-            packageProductRelationService.deleteByPackageId(pkgId);
+            packageProductRelationService.deleteByPkgId(pkgId);
             return true;
         }
 

+ 1 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/utils/DTOConverter.java

@@ -64,7 +64,7 @@ public class DTOConverter {
 
     public static PackageProductRelation convert(String pkgId, PackageProductDTO productDTO) {
         PackageProductRelation relation = new PackageProductRelation();
-        relation.setPackageId(pkgId);
+        relation.setPkgId(pkgId);
         relation.setPid(productDTO.getPid());
         relation.setCpPrice(productDTO.getCpPrice());
         relation.setStatus(BaseStatusEnum.NORMAL);