zoujiajian 1 年間 前
コミット
a0a61fa8f7

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/request/GoodsWholesaleOrderPayReq.java

@@ -5,6 +5,7 @@ import lombok.Setter;
 
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
 
 /**
  * 项目名: yhlxj
@@ -26,4 +27,9 @@ public class GoodsWholesaleOrderPayReq {
 	@NotNull
 	@Min(value = 1)
 	private Integer num;
+
+	/**
+	 * 余额
+	 */
+	private BigDecimal balance;
 }

+ 55 - 6
netflix-service/src/main/java/com/cyksj/service/order/impl/GoodsWholesalePayServiceImpl.java

@@ -71,7 +71,9 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 
 	private final OrderRefundService orderRefundService;
 
-	private UserBenefitsService userBenefitsService;
+	private final UserBenefitsService userBenefitsService;
+
+	private final UserMapper userMapper;
 
 	@Override
 	public GoodsWholesaleOrderDon unifiedPay(GoodsWholesaleOrderPayReq payReq) throws Exception {
@@ -102,6 +104,7 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 		if (!sku.getStatus()) {
 			throw BusinessRuntimeException.getInstance("规格已下架");
 		}
+		User user = userMapper.selectById(userId);
 		//是否交过押金
 		GoodsWholesaleUserDeposit deposit = depositMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesaleUserDeposit.class)
 				.in(GoodsWholesaleUserDeposit::getUserId, userIdList)
@@ -110,6 +113,7 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 		if (deposit == null || (!deposit.getIsGoal() && deposit.getStatus() == GoodsWholesaleUserDeposit.Status.refund)) {
 			singlePrice = sku.getPrice();
 		}
+		BigDecimal balance = payReq.getBalance();
 		GoodsWholesaleOrderDon orderDon = new GoodsWholesaleOrderDon();
 		orderDon.setUserId(userId);
 		orderDon.setGoodsId(goodsWholesale.getGoodsId());
@@ -119,7 +123,20 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 		orderDon.setMoney(BigDecimal.valueOf(payReq.getNum()).multiply(singlePrice));
 		String orderNo = SEQUENCE.nextId().toString();
 		orderDon.setOrderNo(orderNo);
+		if (balance != null) {
+			deductBalancePayOrderMoney(orderDon, balance, user);
+		}
+		//余额支付
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
+			orderDon.setStatus(GoodsWholesaleOrderDon.Status.hasPayment);
+			orderDon.setPayTime(DateTime.now());
+		}
 		goodsWholesaleOrderDonMapper.insert(orderDon);
+		//已支付回调
+		if (orderDon.getStatus() == GoodsWholesaleOrderDon.Status.hasPayment) {
+			//处理批发订单回调
+			unifiedHandleGoodsWholesaleOrderDon(orderDon);
+		}
 		return orderDon;
 	}
 	@Override
@@ -172,11 +189,8 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 		orderDon.setType(GoodsWholesaleOrderDon.Type.ALI_PAY);
 		orderDon.setBuyerId(buyerId);
 		goodsWholesaleOrderDonMapper.updateById(orderDon);
-		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
-		//退还押金
-		returnDeposit(orderDon, userIdList);
-		//返批发余额差价
-		returnWholesaleBalanceDiffer(orderDon, userIdList);
+		//处理批发订单回调
+		unifiedHandleGoodsWholesaleOrderDon(orderDon);
 	}
 
 	private void returnWholesaleBalanceDiffer(GoodsWholesaleOrderDon orderDon, List<Long> userIdList) throws Exception {
@@ -415,4 +429,39 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 		return thisLevel.getSingle();
 	}
 
+	/**
+	 * 统一处理批发订单回调
+	 */
+	public void unifiedHandleGoodsWholesaleOrderDon(GoodsWholesaleOrderDon orderDon) throws Exception {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+		//退还押金
+		returnDeposit(orderDon, userIdList);
+		//返批发余额差价
+		returnWholesaleBalanceDiffer(orderDon, userIdList);
+	}
+
+	/**
+	 * 扣除余额
+	 */
+	public void deductBalancePayOrderMoney(GoodsWholesaleOrderDon orderDon, BigDecimal balance, User user) {
+		//存在余额
+		if (balance != null && balance.compareTo(BigDecimal.ZERO) > 0) {
+			BigDecimal money = orderDon.getMoney();
+			//去掉余额 多出的部分
+			BigDecimal subBalance = balance;
+			orderDon.setMoney(money.subtract(subBalance));
+			if (balance.compareTo(money) >= 0) {
+				orderDon.setMoney(BigDecimal.ZERO);
+				orderDon.setBalance(money);
+				subBalance = money;
+				orderDon.setType(GoodsWholesaleOrderDon.Type.BALANCE);
+			}
+			BigDecimal userBalance = user.getBalance();
+			//扣除余额 是否成功
+			Integer success = userMapper.deductBalance(user.getId(), subBalance, userBalance);
+			if (success != 1) throw BusinessRuntimeException.getInstance("您的余额不足!");
+			orderDon.setBalance(subBalance);
+		}
+	}
+
 }