Jelajahi Sumber

中电联协议订单对账接口

skyline 1 tahun lalu
induk
melakukan
935424ff7a

+ 109 - 0
entity/src/main/java/com/kym/entity/platform/PlatformCheckChargeOrders.java

@@ -0,0 +1,109 @@
+package com.kym.entity.platform;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.annotation.JSONCreator;
+import com.alibaba.fastjson2.annotation.JSONField;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 订单对账结果信息
+ */
+@Data
+public class PlatformCheckChargeOrders {
+
+    /**
+     * 订单对账流水号
+     */
+    private String CheckOrderSeq;
+
+    /**
+     * 账单开始时间
+     */
+    private String StartTime;
+
+    /**
+     * 账单结束时间
+     */
+    private String EndTime;
+
+    /**
+     * 订单数量N
+     */
+    private Integer OrderCount;
+
+    /**
+     * 总电量(小数点后4位)
+     */
+    private Double TotalOrderPower;
+
+    /**
+     * 总金额(小数点后2位)
+     */
+    private Double TotalOrderMoney;
+
+    /**
+     * 单项订单对账信息体
+     */
+    private List<PlatformCheckOrder> CheckOrders;
+
+
+    @JSONCreator
+    public void PlatformCheckOrder(@JSONField(name = "ChargeOrders") JSONArray array) {
+        this.CheckOrders = array.toJavaList(PlatformCheckOrder.class);
+    }
+
+    @Data
+    public static class PlatformCheckOrder {
+        /**
+         * 充电订单号
+         */
+        private String StartChargeSeq;
+
+        /**
+         * 总电量(小数点后4位)
+         */
+        private Double TotalOrderPower;
+
+        /**
+         * 总金额(小数点后2位)
+         */
+        private Double TotalOrderMoney;
+    }
+
+
+    /**
+     * 争议订单信息
+     */
+    @Data
+    @Accessors(chain = true)
+    public static class DisputeOrder {
+
+        public static final int DISPUTE_REASON_TRANSACTION_NOT_EXIST = 1;
+        public static final int DISPUTE_REASON_TRANSACTION_MONEY_ERROR = 2;
+        public static final int DISPUTE_REASON_TRANSACTION_POWER_ERROR = 3;
+
+        /**
+         * 充电订单号
+         */
+        private String StartChargeSeq;
+        /**
+         * 总电量(小数点后4位)
+         */
+        private double TotalPower;
+
+        /**
+         * 总金额(小数点后2位)
+         */
+        private double TotalMoney;
+
+        /**
+         * 争议原因(1:交易不存在 2:交易金额错误 3:交易电量错误)
+         */
+        private Integer DisputeReason;
+
+    }
+
+}

+ 2 - 1
miniapp/src/main/java/com/kym/miniapp/config/SaTokenConfigure.java

@@ -36,7 +36,8 @@ public class SaTokenConfigure implements WebMvcConfigurer {
                         "/charge/*/notification_start_charge_status",
                         "/charge/*/notification_equip_charge_status",
                         "/charge/*/notification_stop_charge_result",
-                        "/charge/*/notification_charge_order_info"
+                        "/charge/*/notification_charge_order_info",
+                        "/charge/*/check_charge_orders"
                 );
     }
 

+ 12 - 0
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -265,6 +265,18 @@ public class ChargerController {
         return new PlatformResponse(enNotifyService.handleNotificationChargeOrderInfo(platformName, json));
     }
 
+    /**
+     * 【互联互通平台】推送订单对账结果信息
+     *
+     * @param json
+     * @return
+     */
+    @ApiLog("推送订单对账结果信息")
+    @PostMapping("/{platformName}/check_charge_orders")
+    PlatformResponse checkChargeOrders(@PathVariable(value = "platformName", required = false) String platformName, @RequestBody JSONObject json) {
+        return new PlatformResponse(enNotifyService.handleCheckChargeOrders(platformName, json));
+    }
+
 
     //====================================================以下是手动同步数据接口==============================================================
 

+ 2 - 0
service/src/main/java/com/kym/service/platform/PlatformNotifyService.java

@@ -20,4 +20,6 @@ public interface PlatformNotifyService {
 
     String handleNotificationStationStatus(String platformName, JSONObject json);
     String queryToken(String platformName, JSONObject json);
+
+    String handleCheckChargeOrders(String platformName, JSONObject json);
 }

+ 63 - 0
service/src/main/java/com/kym/service/platform/impl/PlatformNotifyServiceImpl.java

@@ -2,6 +2,8 @@ package com.kym.service.platform.impl;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.extra.mail.MailUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
@@ -17,6 +19,7 @@ import com.kym.entity.common.RedisKeys;
 import com.kym.entity.miniapp.Account;
 import com.kym.entity.miniapp.ChargeOrder;
 import com.kym.entity.miniapp.WalletDetail;
+import com.kym.entity.platform.PlatformCheckChargeOrders;
 import com.kym.entity.platform.PlatformConnectorStatusInfo;
 import com.kym.service.admin.ConnectorInfoService;
 import com.kym.service.admin.EquipmentInfoService;
@@ -37,7 +40,10 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -340,6 +346,63 @@ public class PlatformNotifyServiceImpl implements PlatformNotifyService {
         return PlatformAesUtil.encrypt(platform.getUserDataSecret(), platform.getUserDataSecretIv(), params);
     }
 
+    /**
+     * 推送订单对账结果信息(订单对账)
+     *
+     * @param platformName
+     * @param json
+     */
+    @Override
+    public String handleCheckChargeOrders(String platformName, JSONObject json) {
+        var dataStr = PlatformAesUtil.signValidation(platformName, json);
+        var data = JSONObject.parseObject(dataStr, PlatformCheckChargeOrders.class);
+        LOGGER.info("【{}互联互通平台推送】收到订单对账结果信息推送:{},解密数据:{}", platformName, json, data);
+
+        var startChargeSeqs = data.getCheckOrders().stream().map(PlatformCheckChargeOrders.PlatformCheckOrder::getStartChargeSeq).toList();
+        AtomicInteger disputeCount = new AtomicInteger();
+        var chargeOrdersMap = chargeOrderService.lambdaQuery().in(ChargeOrder::getStartChargeSeq, startChargeSeqs).list().stream().collect(Collectors.toMap(ChargeOrder::getStartChargeSeq, Function.identity()));
+        // 循环和map中的chargeOrder进行对比,如果订单的totalPower或者totalMoney不一致,则记录该订单
+        var res = data.getCheckOrders().stream().map(platformCheckOrder -> {
+            var disputeOrder = new PlatformCheckChargeOrders.DisputeOrder()
+                    .setStartChargeSeq(platformCheckOrder.getStartChargeSeq());
+
+            var chargeOrder = chargeOrdersMap.get(platformCheckOrder.getStartChargeSeq());
+            if (chargeOrder == null) {
+                // 交易不存在
+                disputeCount.getAndIncrement();
+                disputeOrder.setDisputeReason(PlatformCheckChargeOrders.DisputeOrder.DISPUTE_REASON_TRANSACTION_NOT_EXIST);
+            } else {
+                if (!Objects.equals(chargeOrder.getTotalMoney(), platformCheckOrder.getTotalOrderMoney() * 100)) {
+                    // 交易金额错误
+                    disputeCount.getAndIncrement();
+                    disputeOrder.setTotalMoney(Math.round(chargeOrder.getTotalMoney() / 100.0));
+                    disputeOrder.setTotalPower(chargeOrder.getTotalPower());
+                    disputeOrder.setDisputeReason(PlatformCheckChargeOrders.DisputeOrder.DISPUTE_REASON_TRANSACTION_MONEY_ERROR);
+                }
+                if (!Objects.equals(chargeOrder.getTotalPower(), platformCheckOrder.getTotalOrderPower())) {
+                    // 交易电量错误
+                    disputeCount.getAndIncrement();
+                    disputeOrder.setTotalMoney(Math.round(chargeOrder.getTotalMoney() / 100.0));
+                    disputeOrder.setTotalPower(chargeOrder.getTotalPower());
+                    disputeOrder.setDisputeReason(PlatformCheckChargeOrders.DisputeOrder.DISPUTE_REASON_TRANSACTION_POWER_ERROR);
+                }
+            }
+            return disputeOrder;
+        }).toList();
+
+        var params = Map.of(
+                "CheckOrderSeq", data.getCheckOrderSeq(),
+                "StartTime", data.getStartTime(),
+                "EndTime", data.getEndTime(),
+                "TotalDisputeOrder", disputeCount.get(),
+                "TotalDisputePower", res.stream().collect(Collectors.summarizingDouble(PlatformCheckChargeOrders.DisputeOrder::getTotalPower)),
+                "TotalDisputeMoney", res.stream().collect(Collectors.summarizingDouble(PlatformCheckChargeOrders.DisputeOrder::getTotalMoney)),
+                "DisputeOrders", JSONArray.parseArray(JSON.toJSONString(res))
+        );
+        var platform = PlatformCache.INSTANCE.getPlatformByName(platformName);
+        return PlatformAesUtil.encrypt(platform.getUserDataSecret(), platform.getUserDataSecretIv(), JSON.toJSONString(params));
+    }
+
 
     /**
      * 扣费等资金操作