hgw 3 年 前
コミット
be64fb8912

+ 99 - 70
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java

@@ -13,7 +13,6 @@ import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
-import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -23,6 +22,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -50,6 +50,20 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
 
+    //支付类型
+    private static final Map<String, Function<PaymentParam, Map<String, Object>>> checkOrderType = new HashMap<>();
+
+    {
+        //开通缴费/续费
+        checkOrderType.put("tenant", this::openOrRenew);
+        //云教练支付
+        checkOrderType.put("cloudTeacherOrder", this::cloudTeacherOrder);
+        //机构充值
+        checkOrderType.put("tenantRecharge", this::tenantRecharge);
+        //teacher
+        checkOrderType.put("teacher", this::teacher);
+    }
+
     @Override
     public Map<String, Object> executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
         PaymentParam payParam = new PaymentParam(amount, orderNo, payChannel, returnUrl,
@@ -63,63 +77,10 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
 
         Map<String, Object> payment = new HashMap<>();
         if (platform != null) {
-            if (WrapperUtil.checkStr(platform,"tenant")) {
-                //机构开通、续费付款
-                TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
-                        .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
-                payment = checkOrderAndGetParam(payParam,
-                        tenantOrderRecord,
-                        TenantOrderRecord::getEnumOrderState,
-                        TenantOrderRecord::getCreatedTime,
-                        tenantOrderRecord::setTransNo,
-                        tenantOrderRecordService::updateById
-                );
-                //机构开通付款 主动延迟检查订单
-                delayCheckTenant();
-            } else if (platform.equals("cloudTeacherOrder")) {
-                // 云教练支付
-                TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
-                                                                                              .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
-                if (tenantOrderRecord.getOrderState() == 1) {
-                    throw new Exception("订单已支付, 订单号:" + payParam.getOrderNo());
-                }
-                payment = checkOrderAndGetParam(payParam,
-                                                tenantOrderRecord,
-                                                TenantOrderRecord::getEnumOrderState,
-                                                TenantOrderRecord::getCreatedTime,
-                                                tenantOrderRecord::setTransNo,
-                                                tenantOrderRecordService::updateById
-                );
-                // 云教练支付 主动延迟检查订单
-                log.info("executePayment delayCheckCloudTeacherOrder >>>>> ");
-                delayCheckCloudTeacherOrder(tenantOrderRecord);
-            } else if (platform.equals("tenantRecharge")) {
-                // 机构充值
-                TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
-                                                                                              .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
-                if (tenantOrderRecord.getOrderState() == 1) {
-                    throw new Exception("订单已支付, 订单号:" + payParam.getOrderNo());
-                }
-                payment = checkOrderAndGetParam(payParam,
-                                                tenantOrderRecord,
-                                                TenantOrderRecord::getEnumOrderState,
-                                                TenantOrderRecord::getCreatedTime,
-                                                tenantOrderRecord::setTransNo,
-                                                tenantOrderRecordService::updateById
-                );
-                //主动延迟检查订单
-                log.info("executePayment delayCheckTenantRecharge >>>>> ");
-                delayCheckTenantRecharge(tenantOrderRecord);
-            } else if (platform.equals("teacher")) {
-                TenantPaymentOrder tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(payParam.getOrderNo());
-                payment = checkOrderAndGetParam(payParam,
-                        tenantPaymentOrder,
-                        TenantPaymentOrder::getStatus,
-                        TenantPaymentOrder::getCreateTime,
-                        tenantPaymentOrder::setTransNo,
-                        tenantPaymentOrderService::update
-                );
-            } else {
+            //根据传入platform 来判断执行哪个操作
+            Function<PaymentParam, Map<String, Object>> function = checkOrderType.get(platform);
+            //如果以上操作都没有 则应该是这一个,因为老代码就是这样写的。
+            if (Objects.isNull(function)) {
                 StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
                 payment = checkOrderAndGetParam(payParam,
                         studentPaymentOrder,
@@ -128,16 +89,88 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
                         studentPaymentOrder::setTransNo,
                         studentPaymentOrderService::update
                 );
+            } else {
+                payment = function.apply(payParam);
             }
         }
+        return payment;
+    }
+
+    //teacher
+    private Map<String, Object> teacher(PaymentParam payParam) {
+        Map<String, Object> payment;
+        TenantPaymentOrder tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(payParam.getOrderNo());
+        try {
+            payment = checkOrderAndGetParam(payParam,
+                    tenantPaymentOrder,
+                    TenantPaymentOrder::getStatus,
+                    TenantPaymentOrder::getCreateTime,
+                    tenantPaymentOrder::setTransNo,
+                    tenantPaymentOrderService::update
+            );
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        }
+        return payment;
+    }
+
+    // 机构充值
+    private Map<String, Object> tenantRecharge(PaymentParam payParam) {
+        Map<String, Object> payment;
+        TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
+        payment = checkOrderGetPayment(payParam, tenantOrderRecord);
+        //主动延迟检查订单
+        log.info("executePayment delayCheckTenantRecharge >>>>> ");
+        delayCheckTenantRecharge(tenantOrderRecord);
+        return payment;
+    }
+
+    // 云教练支付
+    private Map<String, Object> cloudTeacherOrder(PaymentParam payParam) {
+        TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
+        Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
+        // 云教练支付 主动延迟检查订单
+        log.info("executePayment delayCheckCloudTeacherOrder >>>>> ");
+        delayCheckCloudTeacherOrder(tenantOrderRecord);
+        return payment;
+    }
+
+    //机构开通、续费付款
+    private Map<String, Object> openOrRenew(PaymentParam payParam) {
+        TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
+        Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
+        //主动延迟检查订单
+        delayCheckTenant();
+        return payment;
+    }
+
+    //查询订单
+    private TenantOrderRecord getTenantOrderRecord(String orderNo) {
+        return tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
+                .hasEq("order_no_", orderNo).queryWrapper());
+    }
 
+    //获取支付数据
+    private Map<String, Object> checkOrderGetPayment(PaymentParam payParam, TenantOrderRecord tenantOrderRecord) {
+        Map<String, Object> payment;
+        try {
+            payment = checkOrderAndGetParam(payParam,
+                    tenantOrderRecord,
+                    TenantOrderRecord::getEnumOrderState,
+                    TenantOrderRecord::getCreatedTime,
+                    tenantOrderRecord::setTransNo,
+                    tenantOrderRecordService::updateById
+            );
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        }
         return payment;
     }
 
     private void checkSing(PaymentParam param) {
         Map<String, Object> signParams = new LinkedHashMap<>();
         signParams.put("appId", ConfigInit.appId);
-        signParams.put("amount", param.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP));
+        signParams.put("amount", param.getAmount().setScale(2, RoundingMode.HALF_UP));
         signParams.put("orderNo", param.getOrderNo());
         signParams.put("orderSubject", param.getOrderSubject());
         signParams.put("orderBody", param.getOrderBody());
@@ -156,7 +189,9 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         if (Objects.isNull(clazz)) {
             throw new BizException("订单不存在");
         }
+        //校验订单状态
         checkOrderState(clazz, enumFunc);
+        //获取订单创建时间
         Date createTime = dateFunc.apply(clazz);
         //校验订单是否超时
         String timeExpire = checkOrderTimeOut(createTime);
@@ -164,7 +199,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         Map<String, Object> paymentParams = getPaymentParam(payParam);
         paymentParams.put("time_expire", timeExpire);
         paymentParams.put("expend", getExpend(payParam));
-        //获取第三方的支付的信息
+        //向第三方发起支付,获取第三方的支付的信息
         Map<String, Object> payment = Payment.executePayment(paymentParams);
         log.info("executePayment create order param >>>>> {}", JSON.toJSONString(payment));
         String transNo = (String) payment.get("id");
@@ -195,15 +230,8 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     }
 
     private <T> void setTransNoByApply(String TransNo, T clazz, Consumer<String> setOption, Consumer<T> action) {
-        Optional.ofNullable(clazz)
-                .filter(c -> Objects.nonNull(setOption))
-                .filter(c -> Objects.nonNull(action))
-                .filter(c -> StringUtils.isNotBlank(TransNo))
-                .map(c -> {
-                    setOption.accept(TransNo);
-                    return c;
-                })
-                .ifPresent(action);
+        setOption.accept(TransNo);
+        action.accept(clazz);
     }
 
     private Map<String, Object> getExpend(PaymentParam payParam) throws Exception {
@@ -260,6 +288,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
                     tenantOrderRecordService.checkTenantOrder();
                     log.info("delayCheckTenant >>>>>  start {}", i);
                 } catch (InterruptedException e) {
+                    log.error("delayCheckTenant >>>>", e.getCause());
                     return;
                 }
             }
@@ -284,7 +313,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
                     Thread.sleep(3000);//每3秒触发一次
                     log.info("云教练 支付 重试>>>>>  start {}", i);
                 } catch (Exception e) {
-                    log.info("云教练 支付 异常  ", e.toString());
+                    log.info("云教练 支付 异常 : {}", e.toString());
                     e.printStackTrace();
                 }
             }