From f7d7da8cf5c3f310d2aac143523dae3000d2b395 Mon Sep 17 00:00:00 2001
From: 935090232@qq.com <ak473600000>
Date: Tue, 08 Mar 2022 00:27:56 +0800
Subject: [PATCH] refactor:重构商品限制销售检测

---
 zq-erp/src/main/java/com/matrix/system/hive/dto/OrderItemDto.java                     |   25 +++++
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java |   76 +++++++++++---
 zq-erp/src/main/java/com/matrix/system/hive/dto/GoodsSealLimitDto.java                |   25 +++++
 zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java         |   42 +++++---
 zq-erp/src/main/java/com/matrix/core/tools/ParamCheckUtil.java                        |   57 +++++++++++
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java      |   54 +++-------
 6 files changed, 211 insertions(+), 68 deletions(-)

diff --git a/zq-erp/src/main/java/com/matrix/core/tools/ParamCheckUtil.java b/zq-erp/src/main/java/com/matrix/core/tools/ParamCheckUtil.java
new file mode 100644
index 0000000..7e7ceab
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/core/tools/ParamCheckUtil.java
@@ -0,0 +1,57 @@
+package com.matrix.core.tools;
+
+import com.matrix.system.hive.dto.OrderItemDto;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+public class ParamCheckUtil {
+
+    /**
+     * 校验列表参数不能为空
+     *
+     * @param args
+     */
+    public static void requireNonNulls(Object... args) {
+        if (args == null || args.length < 0) {
+            throw new NullPointerException("参数校验列表为空");
+        }
+        for (int i = 0; i < args.length; i++) {
+            if (args[i] == null) {
+                throw new NullPointerException(String.format("参数校验列表第%s个参数为空", i + 1));
+            }
+        }
+    }
+
+    /**
+     * 校验集合中的参数不能为空
+     * requireListElementNonNull(objects, Arrays.asList(OrderItemDto::getCount, OrderItemDto::getGoodsId));
+     * @param
+     */
+    public static <T> void requireListElementNonNull(List<T> list, List<Function<? super T, ? extends Object>> getterFunctions) {
+
+        requireNonNulls(list,getterFunctions);
+
+        for (int i = 0; i < list.size(); i++) {
+            for (int j = 0; j < getterFunctions.size(); j++) {
+                if(getterFunctions.get(j).apply(list.get(i))==null){
+                    throw new NullPointerException(String.format("集合中第%s个对象第%s参数为空",i+1,j+1));
+                }
+            }
+
+        }
+
+    }
+
+
+
+    public static void main(String[] args) {
+        List<OrderItemDto> objects = new ArrayList<>();
+        OrderItemDto o1 = new OrderItemDto();
+        o1.setCount(1);
+        objects.add(o1);
+        requireListElementNonNull(objects, null);
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dto/GoodsSealLimitDto.java b/zq-erp/src/main/java/com/matrix/system/hive/dto/GoodsSealLimitDto.java
new file mode 100644
index 0000000..1926c1d
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dto/GoodsSealLimitDto.java
@@ -0,0 +1,25 @@
+package com.matrix.system.hive.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * 商品限消检测dto
+ */
+@Data
+@ToString
+public class GoodsSealLimitDto {
+
+    /**
+     * 会员id
+     */
+    private Long vipId;
+
+    /**
+     * 销售明细
+     */
+    private List<OrderItemDto> orderItemDtoList;
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dto/OrderItemDto.java b/zq-erp/src/main/java/com/matrix/system/hive/dto/OrderItemDto.java
new file mode 100644
index 0000000..bc927fa
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dto/OrderItemDto.java
@@ -0,0 +1,25 @@
+package com.matrix.system.hive.dto;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * 订单明细DTO
+ */
+@Data
+@ToString
+@Builder
+public class OrderItemDto {
+    /**
+     * 商城 商品id
+     */
+    private Long  goodsId;
+
+    /**
+     * 购买数量
+     */
+    private Integer count;
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
index 366dbf4..62a727d 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
@@ -5,6 +5,7 @@
 import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
 import com.matrix.system.app.vo.ShoppingGoodsListVo;
 import com.matrix.system.hive.bean.ShoppingGoods;
+import com.matrix.system.hive.dto.GoodsSealLimitDto;
 import com.matrix.system.hive.plugin.util.BaseServices;
 
 import java.util.Date;
@@ -14,61 +15,72 @@
  * @date 2016-07-30 09:54
  */
 public interface ShoppingGoodsService  extends BaseServices<ShoppingGoods>{
+
+
+	/**
+	 * 检测商品销售限制
+	 * 1、商品是否超出最大销售量
+	 * 2、商品是否限购
+	 */
+	void checkGoodsSealLimit(GoodsSealLimitDto goodsSealLimitDto);
+
+
+
 	
 	/**
 	 * 新增ShoppingGoods
 	 * 
 	 */
-	public int add(ShoppingGoods shoppingGoods);
+	int add(ShoppingGoods shoppingGoods);
    	
    	/**
 	 * 更新ShoppingGoods
 	 * 
 	 */
-	public int modify(ShoppingGoods shoppingGoods);
+	int modify(ShoppingGoods shoppingGoods);
 	
 	/**
 	 * 批量删除ShoppingGoods
 	 * 
 	 */
-	public int remove(List<Long> list);
+	int remove(List<Long> list);
 
 	/**
 	 * 根据id删除ShoppingGoods
 	 * 
 	 */
-	public int removeById(Long id);
+	int removeById(Long id);
 	
 	/**
 	 * 分页查询ShoppingGoods
 	 * 
 	 */
-	public List<ShoppingGoods> findInPage(ShoppingGoods shoppingGoods, PaginationVO pageVo);
+	List<ShoppingGoods> findInPage(ShoppingGoods shoppingGoods, PaginationVO pageVo);
 
 	/**
 	 * 根据对象查询ShoppingGoods
 	 * 
 	 */
-	public List<ShoppingGoods> findByModel(ShoppingGoods shoppingGoods);
+	List<ShoppingGoods> findByModel(ShoppingGoods shoppingGoods);
 	/**
 	 * 数据迁移专用
 	 * @param shoppingGoods
 	 * @return
 	 */
-	public List<ShoppingGoods> findByModelData(ShoppingGoods shoppingGoods);
+	List<ShoppingGoods> findByModelData(ShoppingGoods shoppingGoods);
 	/**
 	 * 统计记录数ShoppingGoods
 	 * 
 	 */
-	public int  findTotal(ShoppingGoods shoppingGoods);
+	int  findTotal(ShoppingGoods shoppingGoods);
 	
 	/**
 	 * 根据id查询ShoppingGoods
 	 * 
 	 */
-	public ShoppingGoods  findById(Long id);
+	ShoppingGoods  findById(Long id);
 	
-	public int update(Long id);
+	int update(Long id);
 	
 	
 	
@@ -77,20 +89,20 @@
 	 * 数据迁移用
 	 * 分页查询查询项目充值卡,去除套餐
 	 */
-	public List<ShoppingGoods> findInPageNoTaocan(ShoppingGoods shoppingGoods, PaginationVO pageVo);
+	List<ShoppingGoods> findInPageNoTaocan(ShoppingGoods shoppingGoods, PaginationVO pageVo);
 	
 	/**
 	 * 数据迁移用
 	 * 查询查询项目充值卡,去除套餐
 	 * 统计记录数ShoppingGoods
 	 */
-	public int  findTotalNoTaocan(ShoppingGoods shoppingGoods);
+	int  findTotalNoTaocan(ShoppingGoods shoppingGoods);
 	/**
 	 * 检测是否可以修改
 	 * @param id
 	 * @return
 	 */
-	public boolean checkIsUpdate(Long id);
+	boolean checkIsUpdate(Long id);
 	/**
 	 * 查询所有
 	 * @author xiaochonggao
@@ -99,9 +111,9 @@
 	 * @param shoppingGoods
 	 * @return
 	 */
-	public List<ShoppingGoods> findAll(ShoppingGoods shoppingGoods);
+	List<ShoppingGoods> findAll(ShoppingGoods shoppingGoods);
 
-	public  ShoppingGoods findByCode(String goodsCode);
+	ShoppingGoods findByCode(String goodsCode);
 
 	Date calInvalidTime(ShoppingGoods shoppingGoods, Integer type, Date buyDate);
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
index e13f1f9..7c8ddf9 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
@@ -3,9 +3,7 @@
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.PaginationVO;
-import com.matrix.core.tools.DateUtil;
-import com.matrix.core.tools.StringUtils;
-import com.matrix.core.tools.WebUtil;
+import com.matrix.core.tools.*;
 import com.matrix.system.app.dto.ShoppingGoodsListDto;
 import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
 import com.matrix.system.app.vo.ShoppingGoodsListVo;
@@ -18,10 +16,9 @@
 import com.matrix.system.hive.bean.ShoppingGoodsAssemble;
 import com.matrix.system.hive.bean.ShoppingGoodsCategory;
 import com.matrix.system.hive.bean.SysShopInfo;
-import com.matrix.system.hive.dao.MoneyCardAssembleDao;
-import com.matrix.system.hive.dao.ShoppingGoodsAssembleDao;
-import com.matrix.system.hive.dao.ShoppingGoodsDao;
-import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.hive.dto.GoodsSealLimitDto;
+import com.matrix.system.hive.dto.OrderItemDto;
 import com.matrix.system.hive.service.ShoppingGoodsService;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +28,7 @@
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
@@ -57,10 +55,55 @@
     @Autowired
     private SysShopInfoDao shopInfoDao;
 
+    @Autowired
+    private SysOrderItemDao orderItemDao;
+
+    @Override
+    public void checkGoodsSealLimit(GoodsSealLimitDto goodsSealLimitDto) {
+        LogUtil.info("开始检测商品销售限制:{}", goodsSealLimitDto.toString());
+        //校验参数不能为空
+        checkGoodsSelLimtParam(goodsSealLimitDto);
+
+        goodsSealLimitDto.getOrderItemDtoList().forEach(item -> {
+            ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId());
+            //最大销售次数检测
+            Integer maxNum = shopGoods.getCarMaxSaleCount();
+            if (maxNum != null && maxNum != 0) {
+                Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId(), null);
+                if ((buyNum + item.getCount()) == maxNum) {
+                    if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) {
+                        shopGoods.setStaus(Dictionary.BUSINESS_STATE_DOWN);
+                        shoppingGoodsDao.update(shopGoods);
+                        LogUtil.info("{}商品达到最大销售数量自动下架",shopGoods.getName());
+                    }
+                } else if ((buyNum + item.getCount()) > maxNum) {
+                    throw new GlobleException(shopGoods.getName() + "已超过最大销售数量");
+                }
+            }
+            //每人限购次数检测
+            Integer onceCount = shopGoods.getIsOnce();
+            if (onceCount != null && onceCount != 0) {
+                Integer buyOnceCount = orderItemDao.selectByGoodsId(shopGoods.getId(), goodsSealLimitDto.getVipId());
+                if ((buyOnceCount + item.getCount()) > onceCount) {
+                    throw new GlobleException(shopGoods.getName() + "每人限购" + onceCount + "次");
+                }
+            }
+        });
+    }
 
 
 
 
+
+    private void checkGoodsSelLimtParam(GoodsSealLimitDto goodsSealLimitDto) {
+        ParamCheckUtil.requireNonNulls(goodsSealLimitDto,
+                goodsSealLimitDto.getVipId(),
+                goodsSealLimitDto.getOrderItemDtoList());
+
+
+        ParamCheckUtil.requireListElementNonNull(goodsSealLimitDto.getOrderItemDtoList(),
+                Arrays.asList(OrderItemDto::getCount, OrderItemDto::getGoodsId));
+    }
 
 
     @Override
@@ -70,10 +113,9 @@
         SysShopInfo shopInfo = shopInfoDao.selectById(sysUsers.getShopId());
 
 
-
-        if(shopInfo.getShopType()==SysShopInfo.SHOP_TYPE_ZONGBU){
+        if (shopInfo.getShopType() == SysShopInfo.SHOP_TYPE_ZONGBU) {
             shoppingGoods.setHeadquarters(1);
-        }else{
+        } else {
             shoppingGoods.setHeadquarters(2);
         }
 
@@ -109,7 +151,7 @@
         if (shoppingGoods.getReferencePice() == null) {
             shoppingGoods.setReferencePice(0d);
         }
-        shoppingGoods.setZjm(StringUtils.toHanyuPinyin(shoppingGoods.getName())+","+StringUtils.toHeadWordHanyuPinyin(shoppingGoods.getName()));
+        shoppingGoods.setZjm(StringUtils.toHanyuPinyin(shoppingGoods.getName()) + "," + StringUtils.toHeadWordHanyuPinyin(shoppingGoods.getName()));
         shoppingGoods.setIsDel(ShoppingGoods.NORMAL);
         //新增销售产品
         int i = shoppingGoodsDao.insert(shoppingGoods);
@@ -119,7 +161,6 @@
         } else {
             setGoodsAssembles(shoppingGoods);
         }
-
 
 
         return i;
@@ -207,17 +248,17 @@
 
         if (ShoppingGoods.SHOPPING_GOODS_TYPE_CZK.equals(shoppingGoods.getGoodType())) {
             setCardAssemble(shoppingGoods);
-        }else{
+        } else {
 
             //清除原有绑定关系
             shoppingGoodsAssembleDao.deleteByGoodsId(shoppingGoods.getId());
             //合并绑定的产品和项目
             List<ShoppingGoodsAssemble> assembles = new ArrayList<>();
-            if(CollectionUtils.isNotEmpty(shoppingGoods.getAssembleGoods())){
+            if (CollectionUtils.isNotEmpty(shoppingGoods.getAssembleGoods())) {
                 assembles.addAll(shoppingGoods.getAssembleGoods());
             }
             //如果是套餐叠加套餐绑定的项目部分
-            if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())){
+            if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) {
                 assembles.addAll(shoppingGoods.getAssembleProj());
             }
 
@@ -375,7 +416,6 @@
     }
 
 
-
     /**
      * 检测是否能更新 @Title: checkIsUpdate  @author:jyy @return boolean
      * 返回类型 @date 2016年9月18日 上午10:06:23 @throws
@@ -428,8 +468,8 @@
      * 计算失效时间
      *
      * @param shoppingGoods
-     * @param type 1 - 购买时  2 - 消耗时
-     * @param buyDate 购买日期, 当计算消耗日期时,不能为空
+     * @param type          1 - 购买时  2 - 消耗时
+     * @param buyDate       购买日期, 当计算消耗日期时,不能为空
      * @return
      */
     @Override
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
index 8660274..2619287 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -1,6 +1,8 @@
 package com.matrix.system.hive.service.imp;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import com.google.common.collect.Lists;
 import com.matrix.component.asyncmessage.AsyncMessageManager;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
@@ -26,6 +28,8 @@
 import com.matrix.system.enums.OperationFunctionEnum;
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
+import com.matrix.system.hive.dto.GoodsSealLimitDto;
+import com.matrix.system.hive.dto.OrderItemDto;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
 import com.matrix.system.hive.plugin.util.MoneyUtil;
 import com.matrix.system.hive.pojo.CzXkVo;
@@ -553,6 +557,8 @@
         addVipScore(pageOrder);
 
 
+
+
     }
 
     /**
@@ -601,11 +607,22 @@
     }
 
     private void checkOrder(SysOrder pageOrder) {
-        //检查交易限制调整
-        checkSealLimit(pageOrder);
+        //检查交易限制调整 jyytodo 测试一下
+        GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto();
+        goodsSealLimitDto.setVipId(pageOrder.getVipId());
+        goodsSealLimitDto.setOrderItemDtoList(Lists.newArrayList());
+        pageOrder.getItems().forEach(e->{
+            goodsSealLimitDto.getOrderItemDtoList().add(BeanUtil.copyProperties(e, OrderItemDto.class));
+        });
+        shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto);
+
         //检查业绩设置
         checkOrderAchieve(pageOrder);
     }
+
+
+
+
 
     /**
      * 检查业绩设置是否合理
@@ -638,40 +655,7 @@
 
     }
 
-    /**
-     * 检查产品销售次数
-     */
-    private void checkSealLimit(SysOrder pageOrder) {
-        pageOrder.getItems().forEach(item -> {
-            ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId());
 
-            //最大销售次数检测
-            Integer maxNum = shopGoods.getCarMaxSaleCount();
-            if (maxNum != null && maxNum != 0) {
-                Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId(), null);
-                if ((buyNum + item.getCount()) > maxNum) {
-                    throw new GlobleException(shopGoods.getName() + "已超过最大销售数量");
-                }
-                if ((buyNum + item.getCount()) == maxNum) {
-                    if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) {
-                        shopGoods.setStaus(Dictionary.BUSINESS_STATE_DOWN);
-                        shoppingGoodsDao.update(shopGoods);
-                    }
-                }
-            }
-            //每人限购次数检测
-            Integer onceCount = shopGoods.getIsOnce();
-            if (onceCount != null && onceCount != 0) {
-                Integer buyOnceCount = orderItemDao.selectByGoodsId(shopGoods.getId(), pageOrder.getVipId());
-
-                if ((buyOnceCount + item.getCount()) > onceCount) {
-                    throw new GlobleException(shopGoods.getName() + "每人限购" + onceCount + "次");
-                }
-            }
-
-        });
-
-    }
 
 
     /**

--
Gitblit v1.9.1