Explorar el Código

订单提交钱包校验

yzc hace 2 años
padre
commit
c1149a3fb4

+ 3 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java

@@ -29,7 +29,9 @@ public enum DictEnum {
     TAX_RATE_0("tax_rate","13", "13%"),
     TAX_RATE_1("tax_rate","11", "11%"),
     TAX_RATE_2("tax_rate","10", "10%"),
-    TRADE_TYPE_0("trade_type", "0", "预付款"),
+    TRADE_TYPE_01("trade_type", "01", "预付款-汇付"),
+    TRADE_TYPE_02("trade_type", "02", "预付款-新生"),
+    TRADE_TYPE_03("trade_type", "03", "预付款-中信"),
     TRADE_TYPE_1("trade_type", "1", "货到付款"),
     TRADE_TYPE_2("trade_type", "2", "线下付款"),
     TRADE_TYPE_3("trade_type", "3", "第三方支付"),

+ 5 - 0
sckw-modules/sckw-order/pom.xml

@@ -82,6 +82,11 @@
             <artifactId>sckw-contract-api</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-payment-api</artifactId>
+            <version>1.0.0</version>
+        </dependency>
 
     </dependencies>
 

+ 57 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/OrderCheckDTO.java

@@ -0,0 +1,57 @@
+package com.sckw.order.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * @desc: 订单校验参数dto
+ * @author: yzc
+ * @date: 2023-07-25 8:35
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class OrderCheckDTO {
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 交易方式
+     */
+    private String trading;
+
+    /**
+     * 订单金额
+     */
+    private BigDecimal price;
+
+    /**
+     * 订单总量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 成交价格
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 采购一级企业id
+     */
+    private Long procureTopEntId;
+
+    /**
+     * 供应一级企业id
+     */
+    private Long supplyTopEntId;
+
+
+}

+ 78 - 22
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -19,11 +19,16 @@ import com.sckw.core.web.response.HttpResult;
 import com.sckw.mongo.model.SckwTradeOrder;
 import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.model.*;
+import com.sckw.order.model.dto.OrderCheckDTO;
 import com.sckw.order.model.vo.req.*;
 import com.sckw.order.model.vo.res.AddressInfoDetailRes;
 import com.sckw.order.model.vo.res.GoodsInfoDetailRes;
 import com.sckw.order.model.vo.res.OrderDetailRes;
 import com.sckw.order.model.vo.res.UnitInfoDetailRes;
+import com.sckw.payment.api.dubbo.PayCenterDubboService;
+import com.sckw.payment.api.model.constant.ChannelEnum;
+import com.sckw.payment.api.model.dto.R;
+import com.sckw.payment.api.model.dto.WalletDto;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.stream.model.SckwBusSum;
@@ -58,6 +63,9 @@ public class KwoTradeOrderService {
     @DubboReference(version = "2.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
 
+    @DubboReference(version = "2.0.0", group = "design", check = false)
+    private PayCenterDubboService payCenterDubboService;
+
     private final KwoTradeOrderMapper kwoTradeOrderMapper;
     private final StreamBridge streamBridge;
     private final KwoTradeOrderAddressService kwoTradeOrderAddressService;
@@ -100,7 +108,6 @@ public class KwoTradeOrderService {
         Long id = tradeOrder.getId();
         String tOrderNo = tradeOrder.getTOrderNo();
         SckwTradeOrder order = new SckwTradeOrder();
-        //提前填充这些参数防止初始创建mongodb集合没有这些字段
         order.setFirmName(LoginUserHolder.getEntName()).setTOrderId(id).setCreateByName(LoginUserHolder.getUserName())
                 .setUpdateByName(LoginUserHolder.getUserName());
         BeanUtils.copyProperties(tradeOrder, order);
@@ -122,16 +129,14 @@ public class KwoTradeOrderService {
             Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
             unitInfos.forEach(e -> {
                 KwoTradeOrderUnit unit = BeanUtils.copyProperties(e, KwoTradeOrderUnit.class);
-                //todo:目前获取顶级企业dubbo接口有bug,暂时取自身企业id
-//                unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(entMap.get(e.getEntId()).getId());
-                unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(e.getEntId());
+                unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(entMap.get(e.getEntId()).getId());
                 list.add(unit);
                 if (Objects.equals(e.getUnitType(), DictEnum.TORDER_UNIT_TYPE_1.getValue())) {
-                    order.setSupplyEntId(e.getEntId()).setSupplyTopEntId(e.getEntId()).setSupplyFirmName(e.getFirmName())
-                            .setSupplyContacts(e.getContacts()).setSupplyPhone(e.getPhone());
-                } else {
-                    order.setProcureEntId(e.getEntId()).setProcureTopEntId(e.getEntId()).setProcureFirmName(e.getFirmName())
+                    order.setProcureEntId(e.getEntId()).setProcureTopEntId(unit.getTopEntId()).setProcureFirmName(e.getFirmName())
                             .setProcureContacts(e.getContacts()).setProcurePhone(e.getPhone());
+                } else {
+                    order.setSupplyEntId(e.getEntId()).setSupplyTopEntId(unit.getTopEntId()).setSupplyFirmName(e.getFirmName())
+                            .setSupplyContacts(e.getContacts()).setSupplyPhone(e.getPhone());
                 }
             });
             kwoTradeOrderUnitService.insertBatch(list);
@@ -218,7 +223,10 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addPurchaseOrderSubmit(PurchaseOrderParam param) {
-        orderCheck(param.getGoodsInfo().getGoodsId(), param.getTrading(), param.getPrice(), param.getAmount(), param.getGoodsInfo().getUnitPrice(), false);
+        OrderCheckDTO orderCheckDTO = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        getTopEnt(orderCheckDTO, param.getUnitInfo());
+        orderCheckDTO.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice());
+        orderCheck(orderCheckDTO, false);
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
                 .setUnit(param.getGoodsInfo().getUnit()).setSource(DictEnum.TORDER_SOURCE_1.getValue())
@@ -232,33 +240,67 @@ public class KwoTradeOrderService {
         addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
     }
 
+    /**
+     * @desc: 获取采购销售顶级企业id
+     * @author: yzc
+     * @date: 2023-07-25 10:03
+     * @Param orderCheckDTO:
+     * @Param unitInfo:
+     * @return: void
+     */
+    private void getTopEnt(OrderCheckDTO orderCheckDTO, List<UnitInfo> unitInfo) {
+        List<Long> entIds = unitInfo.stream().map(UnitInfo::getEntId).toList();
+        Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
+        unitInfo.forEach(e -> {
+            if (Objects.equals(e.getUnitType(), DictEnum.TORDER_UNIT_TYPE_1.getValue())) {
+                orderCheckDTO.setProcureTopEntId(entMap.get(e.getEntId()).getId());
+            } else {
+                orderCheckDTO.setSupplyTopEntId(entMap.get(e.getEntId()).getId());
+            }
+        });
+    }
+
     /**
      * @desc: 订单提交校验
      * @author: yzc
      * @date: 2023-07-14 14:46
-     * @Param goodId:  商品id
-     * @Param trading:  交易方式
-     * @Param price:  订单金额
-     * @Param amount: 订单总量
-     * @Param unitPrice: 成交价格
+     * @Param param: 订单校验参数
+     * @Param isAcceptanceOrder: 是否受理订单
      * @return: void
      */
-    private void orderCheck(Long goodId, String trading, BigDecimal price, BigDecimal amount, BigDecimal unitPrice, Boolean isAcceptanceOrder) {
-        if (!isAcceptanceOrder && price.compareTo(amount.multiply(unitPrice)) != 0) {
+    private void orderCheck(OrderCheckDTO param, Boolean isAcceptanceOrder) {
+        BigDecimal amount = param.getAmount();
+        String trading = param.getTrading();
+        BigDecimal price = param.getPrice();
+        if (!isAcceptanceOrder && price.compareTo(amount.multiply(param.getUnitPrice())) != 0) {
             throw new BusinessException("订单总金额不等于商品单价*订单总量!");
         }
-        //todo: 则先校验是否存在对供应企业的预付钱包 ;【预计采购金额】是否大于预付清单的【可用预付】金额
-        KwpGoods goods = goodsInfoService.getGoodsById(goodId);
+        KwpGoods goods = goodsInfoService.getGoodsById(param.getGoodsId());
         if (Objects.isNull(goods) || Objects.equals(goods.getDelFlag(), Global.YES) || !Objects.equals(goods.getStatus(), 1)) {
             throw new BusinessException("商品不存在或已下架!");
         }
         if (goods.getAmount().compareTo(amount) < 0) {
             throw new BusinessException("商品库存不足,请联系供应方!");
         }
+        BigDecimal advancePrice = goods.getAdvancePrice().multiply(new BigDecimal(10000));
         //受理订单不校验预付款限额
-        if (!isAcceptanceOrder && Objects.equals(trading, DictEnum.TRADE_TYPE_0.getValue()) && price.compareTo(goods.getAdvancePrice()) < 0) {
+        if (!isAcceptanceOrder && trading.startsWith("0") && price.compareTo(advancePrice) < 0) {
             throw new BusinessException("您的订单总额未达到预付限额,请确认");
         }
+        if (trading.startsWith("0")) {
+            R<List<WalletDto>> wallet = payCenterDubboService.wallet(param.getProcureTopEntId(), ChannelEnum.getByCode(trading), param.getSupplyTopEntId());
+            if (Objects.isNull(wallet) || Objects.equals(wallet.getCode(), 0)) {
+                throw new BusinessException("校验预付钱包异常,请联系管理员!");
+            }
+            List<WalletDto> data = wallet.getData();
+            if (CollectionUtils.isEmpty(data)) {
+                throw new BusinessException("检测尚未创建对应预付款清单,请先创建!");
+            }
+            long money = data.get(0).getMoney();
+            if (money < advancePrice.multiply(new BigDecimal(100)).longValueExact()) {
+                throw new BusinessException("您的预付清单可用余额不足,请先充值!");
+            }
+        }
     }
 
     /**
@@ -270,7 +312,10 @@ public class KwoTradeOrderService {
      */
     @Transactional(rollbackFor = Exception.class)
     public void addValetOrderSubmit(ValetOrderParam param) {
-        orderCheck(param.getGoodsInfo().getGoodsId(), param.getTrading(), param.getPrice(), param.getAmount(), param.getGoodsInfo().getUnitPrice(), false);
+        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        getTopEnt(orderCheck, param.getUnitInfo());
+        orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice());
+        orderCheck(orderCheck, false);
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
                 .setUnit(param.getGoodsInfo().getUnit()).setSource(DictEnum.TORDER_SOURCE_2.getValue());
@@ -403,7 +448,10 @@ public class KwoTradeOrderService {
                     throw new BusinessException("Invalid contract status");
                 }
             }
-            orderCheck(param.getGoodsInfo().getGoodsId(), param.getTrading(), param.getPrice(), param.getAmount(), param.getGoodsInfo().getUnitPrice(), false);
+            OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+            getTopEnt(orderCheck, param.getUnitInfo());
+            orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice());
+            orderCheck(orderCheck, false);
             //扣减库存
             HttpResult updateResult = goodsInfoService.updateGoodsAmount(param.getGoodsInfo().getGoodsId(), param.getAmount());
             if (!Objects.equals(HttpStatus.SUCCESS_CODE, updateResult.getCode())) {
@@ -588,8 +636,16 @@ public class KwoTradeOrderService {
             throw new BusinessException("订单商品信息异常!");
         }
         //受理订单总量-原订单总量=订单变化量
+        List<KwoTradeOrderUnit> units = kwoTradeOrderUnitService.getByOrderId(order.getId());
+        List<UnitInfo> unitInfos = BeanUtils.copyToList(units, UnitInfo.class);
+        if (CollectionUtils.isEmpty(unitInfos)) {
+            throw new BusinessException("订单企业信息异常!");
+        }
         BigDecimal amount = param.getAmount().subtract(order.getAmount());
-        orderCheck(goods.getGoodsId(), param.getTrading(), param.getPrice(), amount, param.getUnitPrice(), true);
+        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        getTopEnt(orderCheck, unitInfos);
+        orderCheck.setGoodsId(goods.getGoodsId()).setAmount(amount);
+        orderCheck(orderCheck, true);
         //更新订单信息
         BeanUtils.copyProperties(param, order);
         String contractStatus = param.getContractInfo().getContractStatus();

+ 2 - 2
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -87,7 +87,7 @@ public class KwpGoodsService {
      */
     @Transactional(rollbackFor = Exception.class)
     public void addShelves(AddGoodsParam addGoodsParam) {
-        if (Objects.equals(addGoodsParam.getTrading(), DictEnum.TRADE_TYPE_0.getValue()) && Objects.isNull(addGoodsParam.getAdvancePrice())) {
+        if (addGoodsParam.getTrading().startsWith("0") && Objects.isNull(addGoodsParam.getAdvancePrice())) {
             throw new BusinessException("交易方式为预付款时,预付款最低限额不能为空!");
         }
         Long entId = LoginUserHolder.getEntId();
@@ -311,7 +311,7 @@ public class KwpGoodsService {
         if (StringUtils.isBlank(param.getTrading())) {
             throw new BusinessException("交易方式不能为空!");
         }
-        if (Objects.equals(param.getTrading(), DictEnum.TRADE_TYPE_0.getValue()) && Objects.isNull(param.getAdvancePrice())) {
+        if (param.getTrading().startsWith("0") && Objects.isNull(param.getAdvancePrice())) {
             throw new BusinessException("交易方式为预付款时,预付款最低限额不能为空!");
         }