|
@@ -1,8 +1,28 @@
|
|
|
package cn.rankin.productservice.service;
|
|
|
|
|
|
+import cn.rankin.common.utils.api.model.APIResult;
|
|
|
+import cn.rankin.common.utils.util.ListUtil;
|
|
|
+import cn.rankin.data.api.product.dto.PackageDTO;
|
|
|
+import cn.rankin.data.api.product.dto.PackageProductDTO;
|
|
|
+import cn.rankin.data.api.product.entity.Package;
|
|
|
+import cn.rankin.data.api.product.entity.PackageProductRelation;
|
|
|
+import cn.rankin.data.api.product.entity.Product;
|
|
|
+import cn.rankin.data.api.product.vo.PackageProductVo;
|
|
|
+import cn.rankin.productservice.code.ProductServiceAPICode;
|
|
|
import cn.rankin.productservice.repository.PackageRepository;
|
|
|
+import cn.rankin.productservice.repository.ProductRepository;
|
|
|
+import cn.rankin.productservice.utils.DTOConverter;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
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 PackageService {
|
|
@@ -10,4 +30,127 @@ public class PackageService {
|
|
|
@Autowired
|
|
|
private PackageRepository packageRepository;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ProductRepository productRepository;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PackageProductRelationService packageProductRelationService;
|
|
|
+
|
|
|
+ public boolean exists(String code) {
|
|
|
+ Long count = packageRepository.countByCode(code);
|
|
|
+ return count > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<Package> getPackage(String packageId) {
|
|
|
+ Package pkg = packageRepository.find(packageId);
|
|
|
+ if (pkg == null) {
|
|
|
+ return APIResult.error(ProductServiceAPICode.NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<PackageProductVo> packageProductVoList = getPackageProducts(packageId);
|
|
|
+ pkg.setProducts(packageProductVoList);
|
|
|
+
|
|
|
+ return APIResult.ok(pkg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<PackageProductVo> getPackageProducts(String packageId) {
|
|
|
+ List<PackageProductVo> packageProductVoList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<PackageProductRelation> relationList = packageProductRelationService.findByPackageId(packageId);
|
|
|
+ if (relationList.size() == 0) {
|
|
|
+ return packageProductVoList;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, BigDecimal> productPriceMap = new HashMap<>();
|
|
|
+ List<String> productIdList = new ArrayList<>();
|
|
|
+ relationList.forEach(relation -> {
|
|
|
+ String productId = relation.getPid();
|
|
|
+ BigDecimal price = relation.getCpPrice();
|
|
|
+ productIdList.add(productId);
|
|
|
+ productPriceMap.put(productId, price);
|
|
|
+ });
|
|
|
+
|
|
|
+ List<Product> productList = productRepository.findByPids(productIdList);
|
|
|
+ if (CollectionUtils.isEmpty(productList)) {
|
|
|
+ return packageProductVoList;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Product> productMap = ListUtil.convert(productList, "pid", Product.class);
|
|
|
+ for (String productId : productIdList) {
|
|
|
+ Product product = productMap.get(productId);
|
|
|
+ if (product == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ PackageProductVo packageProductVo = new PackageProductVo();
|
|
|
+ BeanUtils.copyProperties(product, packageProductVo);
|
|
|
+ packageProductVo.setCpPrice(productPriceMap.get(productId));
|
|
|
+ packageProductVoList.add(packageProductVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return packageProductVoList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ public APIResult<Package> create(PackageDTO packageDTO) {
|
|
|
+ String code = packageDTO.getCode();
|
|
|
+ if (exists(code)) {
|
|
|
+ return APIResult.error(ProductServiceAPICode.ALREADY_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ Package pkg = DTOConverter.convert(packageDTO);
|
|
|
+ Package result = packageRepository.save(pkg);
|
|
|
+
|
|
|
+ String pkgId = result.getId();
|
|
|
+ List<PackageProductDTO> packageProductDTOList = packageDTO.getProducts();
|
|
|
+
|
|
|
+ Boolean updateResult = updateRelation(pkgId, packageProductDTOList);
|
|
|
+ if (!updateResult) {
|
|
|
+ return APIResult.error(ProductServiceAPICode.error("产品关系更新失败"));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<PackageProductVo> packageProductVoList = getPackageProducts(pkgId);
|
|
|
+ pkg.setProducts(packageProductVoList);
|
|
|
+
|
|
|
+ return APIResult.ok(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ public APIResult<Package> update(PackageDTO packageDTO) {
|
|
|
+ Package pkg = DTOConverter.convert(packageDTO);
|
|
|
+ Package result = packageRepository.update(pkg);
|
|
|
+
|
|
|
+ String pkgId = result.getId();
|
|
|
+ List<PackageProductDTO> packageProductDTOList = packageDTO.getProducts();
|
|
|
+
|
|
|
+ Boolean updateResult = updateRelation(pkgId, packageProductDTOList);
|
|
|
+ if (!updateResult) {
|
|
|
+ return APIResult.error(ProductServiceAPICode.error("产品关系更新失败"));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<PackageProductVo> packageProductVoList = getPackageProducts(pkgId);
|
|
|
+ pkg.setProducts(packageProductVoList);
|
|
|
+ return APIResult.ok(pkg);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ public Boolean updateRelation(String pkgId, List<PackageProductDTO> packageProductDTOList) {
|
|
|
+ if (packageProductDTOList == null) {
|
|
|
+ return true;
|
|
|
+ }else if (packageProductDTOList.size() == 0) {
|
|
|
+ packageProductRelationService.deleteByPackageId(pkgId);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> productIdList = new ArrayList<>();
|
|
|
+ packageProductDTOList.forEach(packageProductDTO -> productIdList.add(packageProductDTO.getProductId()));
|
|
|
+
|
|
|
+ List<Product> productList = productRepository.findByPids(productIdList);
|
|
|
+ if (productIdList.size() != productList.size()) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ packageProductRelationService.updateRelation(pkgId, packageProductDTOList);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
}
|