Ver código fonte

用户扫描商家码支付

lianghanqiang 4 anos atrás
pai
commit
e355033ac1

+ 68 - 0
src/main/java/org/springblade/gateway/client_gateway/controller/ClientTradeController.java

@@ -0,0 +1,68 @@
+package org.springblade.gateway.client_gateway.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.common.enums.ResCode;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.tool.api.R;
+import org.springblade.gateway.client_gateway.entity.dto.ClientTradeDto;
+import org.springblade.ldt.user.entity.LoginUser;
+import org.springblade.ldt.user.service.ILoginUserService;
+import org.springblade.payment.entity.SuccessParams;
+import org.springblade.payment.handle.Trade;
+import org.springblade.payment.handle.entity.Order;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author: lianghanqiang
+ * @description: 用户交易模块
+ * @since: 9/1/21 -- 11:16 AM
+ */
+
+@Api(tags = "用户交易模块")
+@RestController
+@RequestMapping("/client/trade")
+@AllArgsConstructor
+public class ClientTradeController {
+
+	private ILoginUserService loginUserService;
+	private Trade trade;
+
+	@ApiOperation("用户扫商家二维码下单")
+	@PostMapping("/scanPay")
+	public R scanPay(@RequestBody ClientTradeDto clientTradeDto){
+
+		LoginUser loginUser = loginUserService.getById(clientTradeDto.getUserId());
+		Assert.notNull(loginUser,() -> {throw  new ServiceException(ResCode.USER_NOT_FOUNT);});
+
+		//处理订单
+		Order order = Order.builder()
+			.appId(clientTradeDto.getAppId())
+			.billsTitle(clientTradeDto.getBillsTitle())
+			.loginUser(loginUser)
+			.money(clientTradeDto.getMoney())
+			.expireTime(clientTradeDto.getExpireTime())
+			.secret(clientTradeDto.getSecret())
+			.shopId(clientTradeDto.getShopId())
+			.openId(loginUser.getOpenid())
+			.build();
+
+		SuccessParams successParams =null;
+
+		try {
+		 successParams= trade.tradeForScanPay(order,clientTradeDto.getChannelId());
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw  new ServiceException(ResCode.TRADE_ERROR);
+		}
+
+		return R.data(successParams);
+
+	}
+
+}

+ 18 - 0
src/main/java/org/springblade/gateway/client_gateway/entity/dto/ClientTradeDto.java

@@ -0,0 +1,18 @@
+package org.springblade.gateway.client_gateway.entity.dto;
+
+import lombok.Builder;
+import lombok.Data;
+import org.springblade.gateway.shop_gateway.entity.dto.BaseOrder;
+
+/**
+ * @author: lianghanqiang
+ * @description: 用户扫码支付订单信息
+ * @since: 9/1/21 -- 11:30 AM
+ */
+@Data
+@Builder
+public class ClientTradeDto extends BaseOrder {
+
+	private Long userId;
+
+}

+ 1 - 1
src/main/java/org/springblade/gateway/shop_gateway/controller/ShopTradeController.java

@@ -62,7 +62,7 @@ public class ShopTradeController {
 
 
 		try {
-			trade.trade(order,codeOrder.getChannelId());
+			trade.tradeForPayCode(order,codeOrder.getChannelId());
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw  new ServiceException(ResCode.TRADE_ERROR);

+ 3 - 0
src/main/java/org/springblade/gateway/shop_gateway/entity/dto/BaseOrder.java

@@ -46,4 +46,7 @@ public class BaseOrder {
 	@ApiModelProperty("secret")
 	private String secret;
 
+	@ApiModelProperty("积分渠道ID")
+	private long channelId;
+
 }

+ 1 - 2
src/main/java/org/springblade/gateway/shop_gateway/entity/dto/CodeOrder.java

@@ -22,6 +22,5 @@ public class CodeOrder extends BaseOrder {
 	@ApiModelProperty("授权码")
 	private String authCode;
 	
-	@ApiModelProperty("积分渠道ID")
-	private long channelId;
+
 }

+ 53 - 5
src/main/java/org/springblade/payment/handle/Trade.java

@@ -1,9 +1,7 @@
 package org.springblade.payment.handle;
 
 import cn.hutool.core.convert.Convert;
-import lombok.AllArgsConstructor;
 import org.springblade.common.enums.OrderType;
-import org.springblade.common.enums.PaymentScene;
 import org.springblade.common.enums.ResCode;
 import org.springblade.common.enums.SystemConstant;
 import org.springblade.core.log.exception.ServiceException;
@@ -25,7 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
-
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
@@ -60,7 +57,7 @@ public class Trade {
 
 
 	@Transactional
-	public boolean trade(Order order, long channelId) throws Exception {
+	public boolean tradeForPayCode(Order order, long channelId) throws Exception {
 		/**
 		 * 	交易处理链,每个handle处理负责一个业务节点
 		 * 	1、处理各种商家折扣,计算实际交易金额
@@ -103,10 +100,59 @@ public class Trade {
 				break;
 			}
 		}
-
 	 	return true;
 	}
 
+	@Transactional
+	public SuccessParams tradeForScanPay(Order order, long channelId) throws Exception {
+		/**
+		 * 	交易处理链,每个handle处理负责一个业务节点
+		 * 	1、处理各种商家折扣,计算实际交易金额
+		 * 	2、用户渠道积分用以抵消交易金额
+		 * 	3、用户账户余额抵消交易金额
+		 * 	4、保存订单信息
+		 * */
+		List<BaseHandle> chain = new ArrayList(){{
+			add(new DiscountHandle(shopService,activityService,joinRecordService));
+			add(new ChannelPointHandle(pointBillsService,userChannelPointService));
+			add(new BalanceHandle(balanceBillsService));
+		}} ;
+
+		BigDecimal remain = order.getMoney();
+
+		Bills bills = initBill(order,channelId);
+
+		//支付参数
+		SuccessParams successParams  = SuccessParams.builder()
+			.orderType(OrderType.USER_PAY.name())
+			.status(SystemConstant.BillPayStatus.待付款.name())
+			.userId(order.getLoginUser().getId())
+			.totalPrice(order.getMoney())
+			.bills(bills)
+			.shopId(order.getShopId())
+			.channelId(channelId)
+			.build();
+
+		//处理各个节点
+		for (BaseHandle node: chain) {
+			HandleData res = node.handle(remain, order,successParams);
+			Assert.isTrue(res.isSuccess(),()->{throw new ServiceException(ResCode.TRADE_ERROR);});
+			remain = res.getRemain();
+			successParams = res.getSuccessParams();
+
+			if(remain.compareTo(BigDecimal.ZERO)==0){
+				//处理积分余额数据变更
+				paymentService.success(successParams);
+				break;
+			}
+		}
+		if(remain.compareTo(BigDecimal.ZERO)>0){
+			Assert.isTrue(billsService.saveOrUpdate(successParams.getBills()),()->{throw new ServiceException(ResCode.TRADE_ERROR);});
+		}
+		return successParams;
+
+	}
+
 
 	/**
 	 * 初始化交易账单
@@ -126,4 +172,6 @@ public class Trade {
 		bills.setReceiveId(order.getShopId());
 		return bills;
 	}
+
+
 }

+ 1 - 0
src/main/java/org/springblade/payment/handle/handler/BalanceHandle.java

@@ -46,6 +46,7 @@ public class BalanceHandle implements BaseHandle {
 		remain = user.getBalance().subtract(remain);
 		if(remain.compareTo(BigDecimal.ZERO)>=0){
 			remain =BigDecimal.ZERO;
+			successParams.setStatus(SystemConstant.BillPayStatus.付款成功.name());
 		}else{
 			remain = remain.abs();
 			handlePrice =  user.getBalance();

+ 1 - 0
src/main/java/org/springblade/payment/handle/handler/ChannelPointHandle.java

@@ -51,6 +51,7 @@ public class ChannelPointHandle implements BaseHandle  {
 		remain = channelPoint.getAvailable().subtract(remain);
 		if(remain.compareTo(BigDecimal.ZERO)>=0){
 			remain =BigDecimal.ZERO;
+			successParams.setStatus(SystemConstant.BillPayStatus.付款成功.name());
 		}else{
 			remain = remain.abs();
 			handlePrice = user.getChannelPoint();

+ 1 - 1
src/main/java/org/springblade/payment/handle/handler/DataHandle.java

@@ -8,7 +8,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @author: lianghanqiang
- * @description: 执行非事务操作
+ * @description: 执行非事务插入操作
  * @since: 9/1/21 -- 10:33 AM
  */
 @Component