Quellcode durchsuchen

支付整体逻辑的梳理

yq vor 3 Jahren
Ursprung
Commit
b9c9db8ea3

+ 22 - 2
src/main/java/com/usky/dxtop/controller/web/TopNotifyController.java

@@ -1,14 +1,20 @@
 package com.usky.dxtop.controller.web;
 
+import com.alibaba.fastjson.JSONObject;
+import com.usky.dxtop.model.CallApiLog;
+import com.usky.dxtop.model.Order;
 import com.usky.dxtop.service.CallApiLogService;
 import com.usky.dxtop.service.OrderService;
+import com.usky.dxtop.service.impl.OrderServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.core.util.JsonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Optional;
 import java.util.TreeMap;
 
 /**
@@ -63,7 +69,21 @@ public class TopNotifyController {
         tMap.put("groupNo",groupNo);
         tMap.put("employee",employee);
         tMap.put("sign",sign);
-
-        //调用卡充值api
+        //填入回调信息
+        try {
+            CallApiLog callApiLog = callApiLogService.one(merchantOrderNo, OrderServiceImpl.SCAN_PAY);
+            Optional.ofNullable(callApiLog)
+                    .ifPresent(cal -> {
+                        cal.setApiResultData(JSONObject.toJSONString(tMap));
+                        callApiLogService.update(cal);
+                    });
+            Order order = orderService.one(merchantOrderNo);
+            orderService.paySuccess(order);
+            if (null == order){
+                log.error("---order---notify"+"订单编号不存在");
+            }
+        }catch (Exception e){
+            log.error("---order---notify"+e.getMessage());
+        }
     }
 }

+ 22 - 1
src/main/java/com/usky/dxtop/service/OrderService.java

@@ -26,6 +26,15 @@ public interface OrderService extends IService<Order> {
      */
     boolean add(Order order);
 
+    /**
+     * 删除订单
+     * @param orderNumber
+     * @return
+     */
+    boolean remove(String orderNumber);
+
+
+    Order one(String orderNumber);
 
     CommonPage<Order> list(OrderRequest orderRequest);
 
@@ -55,6 +64,18 @@ public interface OrderService extends IService<Order> {
      * @param order
      * @return
      */
-    String callCardTopApi(Order order);
+    boolean callCardTopApi(Order order);
 
+    /**
+     * 处理订单
+     * @param order
+     * @param result
+     */
+    void checkOrder(Order order,String result);
+
+    /**
+     * 处理支付成功的订单
+     * @param order
+     */
+    void paySuccess(Order order);
 }

+ 16 - 3
src/main/java/com/usky/dxtop/service/emun/OrderStatus.java

@@ -8,11 +8,13 @@ public enum OrderStatus {
 
     NO_PAYMENT(0,"未支付"),
 
-    PAYMENT_ERROR_NO_DEBIT(1,"支付失败未扣款"),
+    AWAIT_PAY(1,"等待中"),
 
-    PAYMENT_ERROR_DEBIT(2,"卡充值失败,联系管理员充值"),
+    PAYMENT_ERROR_NO_DEBIT(2,"支付失败"),
 
-    SUCCESS(3,"支付成功");
+    PAYMENT_ERROR_DEBIT(3,"卡充值失败"),
+
+    SUCCESS(4,"支付成功");
 
     private Integer code;
 
@@ -23,6 +25,17 @@ public enum OrderStatus {
         this.name = name;
     }
 
+    public static OrderStatus parse(Integer code){
+        OrderStatus orderStatus = null;
+        for (OrderStatus o:OrderStatus.values()) {
+            if (code.equals(o.getCode())){
+                orderStatus = o;
+                break;
+            }
+        }
+        return orderStatus;
+    }
+
 
     public Integer getCode(){
         return code;

+ 119 - 10
src/main/java/com/usky/dxtop/service/impl/OrderServiceImpl.java

@@ -17,19 +17,18 @@ import com.usky.dxtop.common.utils.spring.GlobalUtils;
 import com.usky.dxtop.mapper.OrderMapper;
 import com.usky.dxtop.model.CallApiLog;
 import com.usky.dxtop.model.Order;
-import com.usky.dxtop.model.TopRadio;
 import com.usky.dxtop.service.CallApiLogService;
 import com.usky.dxtop.service.OrderService;
 import com.usky.dxtop.service.api.TopApi;
-import com.usky.dxtop.service.emun.OrderPayType;
 import com.usky.dxtop.service.emun.OrderStatus;
 import com.usky.dxtop.service.vo.OrderRequest;
-import org.apache.logging.log4j.core.util.JsonUtils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.record.SSTRecord;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
 import java.util.TreeMap;
 
 /**
@@ -40,6 +39,7 @@ import java.util.TreeMap;
  * @author yq
  * @since 2021-08-26
  */
+@Slf4j
 @Service
 public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
 
@@ -59,6 +59,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return this.save(order);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean remove(String orderNumber) {
+        LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Order::getOrderNumber,orderNumber);
+        this.remove(queryWrapper);
+        LambdaQueryWrapper<CallApiLog> callApiQueryWrapper = Wrappers.lambdaQuery();
+        callApiQueryWrapper.eq(CallApiLog::getOrderNumber,orderNumber);
+        return callApiLogService.remove(callApiQueryWrapper);
+    }
+
+    @Override
+    public Order one(String orderNumber){
+        LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Order::getOrderNumber,orderNumber);
+        return this.getOne(queryWrapper);
+    }
+
     @Override
     public CommonPage<Order> list(OrderRequest orderRequest) {
         IPage<Order> page = new Page<>(orderRequest.getCurrent(), orderRequest.getSize());
@@ -116,23 +134,114 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return destPath;
     }
 
+    /**
+     * 查询支付订单api
+     * @param orderNumber
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public String callTopFindOrderInfoApi(String orderNumber) {
         TreeMap<String, String> param = TopApi.generateDealSelectParam(orderNumber, null, null, null);
         String format = String.format("%s&sign=%s", TopApi.joinParam(param),
                 TopApi.signData(param));
         String result = HttpUtils.sendGet(TopApi.DEAL_SELECT_URL, format);
-        JSONObject obj= JSON.parseObject(result);
-//        obj.get("status")
         callApiLogService.add(orderNumber,FIND_ORDER_INFO,TopApi.DEAL_SELECT_URL,JSONObject.toJSONString(param),result);
-        //成功调用卡充值api,失败记录状态
-        return obj.toJSONString();
+        Order order = one(orderNumber);
+        //处理订单
+        checkOrder(order, result);
+        //再此获取订单的最新状态
+        order = one(orderNumber);
+        return OrderStatus.parse(order.getOrderFlag()).getName();
     }
 
     @Override
-    public String callCardTopApi(Order order) {
-        return "SUCCESS";
+    public boolean callCardTopApi(Order order) {
+        //TODO 等待测试接口,url,请求,响应需要替换
+        boolean b = false;
+        try {
+            String param = "";
+            String result = "";
+            callApiLogService.add(order.getOrderNumber(),CARD_TOP,TopApi.DEAL_SELECT_URL,JSONObject.toJSONString(param),result);
+            return false;
+        }catch (Exception e){
+            log.error("---order---卡充值api调用异常"+ e.getMessage());
+        }
+        return b;
+    }
+
+    /**
+     * 校验是否继续处理订单
+     * @param orderNumber
+     * @return
+     */
+    public boolean isCheckOrder(String orderNumber){
+        Order order = one(orderNumber);
+        //订单是未支付和支付中需要处理
+        return OrderStatus.NO_PAYMENT.getCode().equals(order.getOrderFlag()) || OrderStatus.AWAIT_PAY.getCode().equals(order.getOrderFlag());
     }
 
 
+    /**
+     * 查询交易后处理订单
+     * @param order
+     */
+    @Override
+    public void checkOrder(Order order,String result){
+        JSONObject obj= JSON.parseObject(result);
+        if ("成功".equals(obj.get("status"))){
+            paySuccess(order);
+        }else if ("等待中".equals(obj.get("status"))){
+            payWaiting(order);
+        }else if ("交易订单不存在".equals(obj.get("status"))){
+            remove(order.getOrderNumber());
+        }else {
+            payError(order);
+        }
+    }
+
+    /**
+     * 充值成功后处理
+     * @param order
+     */
+    @Override
+    public void paySuccess(Order order){
+        try {
+            //是否可以操作
+            boolean b = isCheckOrder(order.getOrderNumber());
+            if (b){
+                //调用卡充值api
+                b = callCardTopApi(order);
+                if (b){
+                    //成功修改状态成功
+                    order.setOrderFlag(OrderStatus.SUCCESS.getCode());
+                    this.updateById(order);
+                }else {
+                    //失败修改状态为卡充值失败
+                    order.setOrderFlag(OrderStatus.PAYMENT_ERROR_DEBIT.getCode());
+                    this.updateById(order);
+                }
+            }
+        }catch (Exception e){
+            log.error("---order---修改数据库失败"+e.getMessage());
+        }
+    }
+
+    /**
+     * 充值失败后处理
+     * @param order
+     */
+    public void payError(Order order){
+        order.setOrderFlag(OrderStatus.PAYMENT_ERROR_NO_DEBIT.getCode());
+        this.updateById(order);
+    }
+
+    /**
+     * 处理等待中的订单
+     * @param order
+     */
+    public void payWaiting(Order order){
+        order.setOrderFlag(OrderStatus.AWAIT_PAY.getCode());
+        this.updateById(order);
+    }
 }

+ 3 - 1
src/main/java/com/usky/dxtop/service/impl/QrCodeServiceImpl.java

@@ -13,6 +13,7 @@ import com.usky.dxtop.common.utils.StringUtils;
 import com.usky.dxtop.common.utils.file.FileUtils;
 import com.usky.dxtop.mapper.QrCodeMapper;
 import com.usky.dxtop.model.QrCode;
+import com.usky.dxtop.model.TopChannel;
 import com.usky.dxtop.model.TopRadio;
 import com.usky.dxtop.service.QrCodeService;
 import org.springframework.stereotype.Service;
@@ -35,7 +36,8 @@ public class QrCodeServiceImpl extends ServiceImpl<QrCodeMapper, QrCode> impleme
     public String checkNameUnique(QrCode qrCode) {
         Long configId = StringUtils.isNull(qrCode.getId()) ? -1L : qrCode.getId();
         LambdaQueryWrapper<QrCode> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(QrCode::getName,qrCode.getName());
+        queryWrapper.eq(QrCode::getName,qrCode.getName())
+                .eq(QrCode::isDelFlag,0);
         QrCode one = this.getOne(queryWrapper);
         if (StringUtils.isNotNull(one) && one.getId() != configId.longValue())
         {

+ 2 - 1
src/main/java/com/usky/dxtop/service/impl/TopChannelServiceImpl.java

@@ -38,7 +38,8 @@ public class TopChannelServiceImpl extends ServiceImpl<TopChannelMapper, TopChan
     public String checkNameUnique(TopChannel topChannel) {
         Long configId = StringUtils.isNull(topChannel.getId()) ? -1L : topChannel.getId();
         LambdaQueryWrapper<TopChannel> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(TopChannel::getName,topChannel.getName());
+        queryWrapper.eq(TopChannel::getName,topChannel.getName())
+                .eq(TopChannel::isDelFlag,0);
         TopChannel one = this.getOne(queryWrapper);
         if (StringUtils.isNotNull(one) && one.getId() != configId.longValue())
         {

+ 3 - 1
src/main/java/com/usky/dxtop/service/impl/TopRadioServiceImpl.java

@@ -12,6 +12,7 @@ import com.usky.dxtop.common.utils.StringUtils;
 import com.usky.dxtop.mapper.TopRadioMapper;
 import com.usky.dxtop.model.QrCode;
 import com.usky.dxtop.model.SysConfig;
+import com.usky.dxtop.model.TopChannel;
 import com.usky.dxtop.model.TopRadio;
 import com.usky.dxtop.service.TopRadioService;
 import org.springframework.stereotype.Service;
@@ -33,7 +34,8 @@ public class TopRadioServiceImpl extends ServiceImpl<TopRadioMapper, TopRadio> i
     public String checkIdentityUnique(TopRadio topRadio) {
         Long configId = StringUtils.isNull(topRadio.getId()) ? -1L : topRadio.getId();
         LambdaQueryWrapper<TopRadio> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(TopRadio::getIdentity,topRadio.getIdentity());
+        queryWrapper.eq(TopRadio::getIdentity,topRadio.getIdentity())
+                .eq(TopRadio::isDelFlag,0);
         TopRadio byIdentity = this.getOne(queryWrapper);
         if (StringUtils.isNotNull(byIdentity) && byIdentity.getId() != configId.longValue())
         {