Selaa lähdekoodia

新增获取商品预计最大可购数量接口

yzc 2 vuotta sitten
vanhempi
commit
c2c64ea6bd

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

@@ -53,5 +53,10 @@ public class OrderCheckDTO {
      */
     private Long supplyTopEntId;
 
+    /**
+     * 订单来源 1采购下单2代客下单
+     */
+    private String orderSource;
+
 
 }

+ 0 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/GoodsInfo.java

@@ -64,7 +64,6 @@ public class GoodsInfo {
     /**
      * 价格段id
      */
-    @NotNull(message = "价格段id不能为空")
     private Long priceRangeId;
 
     /**

+ 12 - 5
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -227,9 +227,14 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addPurchaseOrderSubmit(PurchaseOrderParam param) {
+        GoodsInfo goodsInfo = param.getGoodsInfo();
+        if (Objects.isNull(goodsInfo.getPriceRangeId())) {
+            throw new BusinessException("采购下单价格梯度信息不能为空!");
+        }
         OrderCheckDTO orderCheckDTO = BeanUtils.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheckDTO, param.getUnitInfo());
-        orderCheckDTO.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice());
+        orderCheckDTO.setGoodsId(goodsInfo.getGoodsId()).setUnitPrice(goodsInfo.getUnitPrice())
+                .setOrderSource(DictEnum.TORDER_SOURCE_1.getValue());
         orderCheck(orderCheckDTO, false);
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
@@ -292,8 +297,8 @@ public class KwoTradeOrderService {
             throw new BusinessException("商品库存不足,请联系供应方!");
         }
         BigDecimal advancePrice = goods.getAdvancePrice().multiply(new BigDecimal("10000"));
-        //受理订单不校验预付款限额
-        if (!isAcceptanceOrder && trading.startsWith("0") && price.compareTo(advancePrice) < 0) {
+        //直接采购下单才校验预付款限额
+        if (Objects.equals(param.getOrderSource(), DictEnum.TORDER_SOURCE_1.getValue()) && trading.startsWith("0") && price.compareTo(advancePrice) < 0) {
             throw new BusinessException("您的订单总额未达到预付限额,请确认");
         }
         if (trading.startsWith("0")) {
@@ -323,7 +328,8 @@ public class KwoTradeOrderService {
     public void addValetOrderSubmit(ValetOrderParam param) {
         OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, param.getUnitInfo());
-        orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice());
+        orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice())
+                .setOrderSource(DictEnum.TORDER_SOURCE_2.getValue());
         orderCheck(orderCheck, false);
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
@@ -459,7 +465,8 @@ public class KwoTradeOrderService {
             }
             OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
             getTopEnt(orderCheck, param.getUnitInfo());
-            orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice());
+            orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice())
+                    .setOrderSource(source);
             orderCheck(orderCheck, false);
             //扣减库存
             HttpResult updateResult = goodsInfoService.updateGoodsAmount(param.getGoodsInfo().getGoodsId(), param.getAmount());

+ 4 - 0
sckw-modules/sckw-product/pom.xml

@@ -72,6 +72,10 @@
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-redis</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-payment-api</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 12 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java

@@ -182,9 +182,20 @@ public class KwpGoodsController {
      * @return: com.sckw.core.web.response.HttpResult
      */
     @PostMapping(value = "/dropList", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult dropList(@RequestBody GoodsDropListReq params) {
+    public HttpResult dropList(@RequestBody @Validated GoodsDropListReq params) {
         return HttpResult.ok(kwpGoodsService.dropList(params));
     }
 
+    /**
+     * @desc: 获取商品预计最大可购数量
+     * @author: yzc
+     * @date: 2023-07-31 17:42
+     * @Param param:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/maxPurchaseNum", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult maxPurchaseNum(@RequestBody @Validated MaxPurchaseNumParam param) {
+        return HttpResult.ok(kwpGoodsService.maxPurchaseNum(param));
+    }
 
 }

+ 43 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/MaxPurchaseNumParam.java

@@ -0,0 +1,43 @@
+package com.sckw.product.model.vo.req;
+
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+
+/**
+ * @desc: 最
+ * @author: yzc
+ * @date: 2023-07-31 17:38
+ */
+@Getter
+@Setter
+@ToString
+public class MaxPurchaseNumParam {
+
+    /**
+     * 商品id
+     */
+    @NotNull(message = "商品id不能为空")
+    private Long goodsId;
+
+    /**
+     * 成交单价
+     */
+    @NotNull(message = "成交单价不能为空")
+    @DecimalMin(value = "0.00", message = "成交单价最小为零")
+    private BigDecimal utilPrice;
+
+    /**
+     * 采购企业id
+     */
+    private Long procureEntId;
+
+    /**
+     * 供应企业id
+     */
+    private Long supplyEntId;
+}

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

@@ -18,6 +18,10 @@ import com.sckw.core.utils.NumberUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.excel.utils.DateUtil;
+import com.sckw.payment.api.dubbo.PayCenterDubboService;
+import com.sckw.payment.api.model.constant.ChannelEnum;
+import com.sckw.payment.api.model.dto.WalletDto;
+import com.sckw.payment.api.model.dto.common.R;
 import com.sckw.product.dao.KwpGoodsMapper;
 import com.sckw.product.enums.GoodsStatusEnum;
 import com.sckw.product.model.*;
@@ -34,6 +38,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -50,6 +55,9 @@ public class KwpGoodsService {
     @DubboReference(version = "2.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
 
+    @DubboReference(version = "2.0.0", group = "design", check = false)
+    private PayCenterDubboService payCenterDubboService;
+
     private final KwpGoodsMapper kwpGoodsMapper;
     private final KwpGoodsAddressService kwpGoodsAddressService;
     private final KwpGoodsAttributeService kwpGoodsAttributeService;
@@ -814,4 +822,51 @@ public class KwpGoodsService {
     public void updateById(KwpGoods goods) {
         kwpGoodsMapper.updateById(goods);
     }
+
+    /**
+     * @desc: 获取商品预计最大可购数量
+     * @author: yzc
+     * @date: 2023-07-31 17:41
+     * @Param param:
+     * @return: java.math.BigDecimal
+     */
+    public BigDecimal maxPurchaseNum(MaxPurchaseNumParam param) {
+        LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<KwpGoods> last = wrapper.eq(KwpGoods::getId, param.getGoodsId()).eq(KwpGoods::getDelFlag, Global.NO)
+                .eq(KwpGoods::getStatus, GoodsStatusEnum.PUT_ON_SHELVES.getCode()).last("LIMIT 1");
+        KwpGoods goods = kwpGoodsMapper.selectOne(last);
+        if (Objects.isNull(goods)) {
+            throw new BusinessException("商品不存在或已下架!");
+        }
+        BigDecimal amount = goods.getAmount();
+        if (!goods.getTrading().startsWith("0")) {
+            return amount;
+        }
+        if (Objects.isNull(param.getProcureEntId()) || Objects.isNull(param.getSupplyEntId())) {
+            throw new BusinessException("采购或供应单位信息不能为空!");
+        }
+        List<Long> entIds = Arrays.asList(param.getProcureEntId(), param.getSupplyEntId());
+        Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
+        EntCacheResDto procure = entMap.get(param.getProcureEntId());
+        if (Objects.isNull(procure) || Objects.isNull(procure.getId())) {
+            log.error("采购单位:{}找不到对应一级企业信息", param.getProcureEntId());
+            throw new BusinessException("采购单位一级企业信息不存在!");
+        }
+        EntCacheResDto supply = entMap.get(param.getSupplyEntId());
+        if (Objects.isNull(supply) || Objects.isNull(supply.getId())) {
+            log.error("供应单位:{}找不到对应一级企业信息", param.getSupplyEntId());
+            throw new BusinessException("供应单位一级企业信息不存在!");
+        }
+        R<List<WalletDto>> wallet = payCenterDubboService.wallet(procure.getId(), ChannelEnum.getByCode(goods.getTrading()), supply.getId());
+        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();
+        BigDecimal divide = new BigDecimal(money).divide(param.getUtilPrice().multiply(new BigDecimal("100")), 2, RoundingMode.HALF_UP);
+        return amount.compareTo(divide) < 0 ? amount : divide;
+    }
 }