From 4df21ca7d06a64afb35f8c8b07920435dd08daa2 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 23 Sep 2026 18:01:01 +0800
Subject: [PATCH] fix(gateApi): 解决枚举定义不完整导致的反序列化异常

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
index 6612d63..0d0b369 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -188,13 +188,19 @@
     }
 
     /**
-     * 构建容错的 JSON 序列化器,跳过 {@code finishAs} 字段的反序列化。
+     * 构建容错的 JSON 序列化器,跳过部分枚举不完整字段的反序列化。
      *
-     * <p>gate-api SDK 的 {@code FuturesOrder.FinishAsEnum} 枚举不完整,缺少
-     * {@code price_rate_proteced}(价格保护)等 Gate 实际会返回的值。反序列化未知
-     * 枚举值时 {@code fromValue} 会抛 {@link IllegalArgumentException},导致已成功
-     * 提交的订单被误判为失败(如日志 {@code Unexpected value 'price_rate_proteced'})。
-     * 业务不使用 finishAs 字段,因此通过 Gson 排除策略直接跳过其解析。
+     * <p>gate-api SDK 的枚举定义滞后于交易所实际返回值,反序列化未知枚举值时
+     * {@code fromValue} 会抛 {@link IllegalArgumentException},导致接口被误判为失败。
+     * 已确认业务不使用以下字段,因此通过 Gson 排除策略直接跳过其解析:
+     * <ul>
+     *   <li>{@code finishAs}:{@code FuturesOrder.FinishAsEnum} 缺少
+     *       {@code price_rate_protected}(价格保护)等值(如日志
+     *       {@code Unexpected value 'price_rate_proteced'});</li>
+     *   <li>{@code posMarginMode}:{@code FuturesPriceTriggeredOrder.PosMarginModeEnum}
+     *       只定义 {@code cross}/{@code dual},而 {@code cancelPriceTriggeredOrderList}
+     *       会返回组合值 {@code cross|dual}(如日志 {@code Unexpected value 'cross|dual'})。</li>
+     * </ul>
      */
     private static JSON buildLenientJson() {
         JSON json = new JSON();
@@ -202,7 +208,13 @@
                 .setExclusionStrategies(new ExclusionStrategy() {
                     @Override
                     public boolean shouldSkipField(FieldAttributes f) {
-                        return "finishAs".equals(f.getName());
+                        if ("finishAs".equals(f.getName())) {
+                            return true;
+                        }
+                        // 仅跳过 FuturesPriceTriggeredOrder 的 posMarginMode,避免误伤
+                        // FuturesOrder / Position 的同名字段(二者语义为 isolated/cross)
+                        return "posMarginMode".equals(f.getName())
+                                && FuturesPriceTriggeredOrder.class.equals(f.getDeclaringClass());
                     }
 
                     @Override

--
Gitblit v1.9.1