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