From 2e26306ed035bf60e6789dc1bbdabd914f630df8 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sat, 06 Jun 2026 22:38:18 +0800
Subject: [PATCH] 1

---
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java |  108 ++++++++++++++++++------------------------------------
 1 files changed, 36 insertions(+), 72 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java
index 66aa96b..e91a20f 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java
@@ -9,7 +9,6 @@
 import com.yami.trading.common.lang.LangUtils;
 import com.yami.trading.common.util.DateTimeTools;
 import com.yami.trading.common.util.StringUtils;
-import com.yami.trading.common.util.ThreadUtils;
 import com.yami.trading.security.common.util.SecurityUtils;
 import com.yami.trading.service.contract.ContractLockService;
 import com.yami.trading.service.contract.ContractOrderService;
@@ -81,20 +80,33 @@
      */
     @RequestMapping(action + "close.action")
     public Result<String> close(@RequestParam String order_no) {
+        String partyId = SecurityUtils.getCurrentUserId();
         try {
             ContractOrder order = contractOrderService.findByOrderNo(order_no);
-            if (order != null && ContractOrder.ORDER_FOLLOW == order.getFollow()) {
+            if (order == null) {
+                return Result.failed("订单不存在");
+            }
+            if (!partyId.equals(order.getPartyId())) {
+                return Result.failed("无权限");
+            }
+            if (ContractOrder.ORDER_FOLLOW == order.getFollow()) {
                 return Result.failed("跟单订单不支持手动平仓,请先停止跟单");
             }
-            // 建议使用线程池 TODO
-            CloseDelayThread lockDelayThread = new CloseDelayThread(SecurityUtils.getCurrentUserId(), order_no, this.contractOrderService, false);
-            Thread t = new Thread(lockDelayThread);
-            t.start();
+            if (!contractLockService.getContractLock(order_no)) {
+                return Result.failed("请稍后再试");
+            }
+            try {
+                ContractOrder closed = contractOrderService.saveClose(partyId, order_no);
+                if (closed == null) {
+                    return Result.failed("平仓失败,请刷新持仓后重试");
+                }
+            } finally {
+                contractLockService.removeContractLock(order_no);
+            }
         } catch (Exception e) {
             log.error("平仓失败", e);
-            return Result.failed("平仓失败");
+            return Result.failed(e.getMessage() != null ? e.getMessage() : "平仓失败");
         }
-
         return Result.succeed("平仓成功");
     }
 
@@ -103,24 +115,29 @@
      */
     @RequestMapping(action + "closeAll.action")
     public Result<String> closeAll() {
+        String partyId = SecurityUtils.getCurrentUserId();
         try {
-            String partyId = SecurityUtils.getCurrentUserId();
             List<ContractOrder> submittedOrders = contractOrderService.findSubmitted(partyId);
-            if (submittedOrders != null) {
-                for (ContractOrder one : submittedOrders) {
-                    if (ContractOrder.ORDER_FOLLOW == one.getFollow()) {
-                        return Result.failed("包含跟单订单,不能手动一键平仓,请先停止跟单");
-                    }
+            if (submittedOrders == null || submittedOrders.isEmpty()) {
+                return Result.succeed("一键平仓成功");
+            }
+            for (ContractOrder one : submittedOrders) {
+                if (ContractOrder.ORDER_FOLLOW == one.getFollow()) {
+                    return Result.failed("包含跟单订单,不能手动一键平仓,请先停止跟单");
                 }
             }
-            CloseDelayThread lockDelayThread = new CloseDelayThread(SecurityUtils.getCurrentUserId(), "", this.contractOrderService, true);
-            Thread t = new Thread(lockDelayThread);
-            t.start();
+            if (!contractLockService.getContractLock("all")) {
+                return Result.failed("请稍后再试");
+            }
+            try {
+                contractOrderService.saveCloseRemoveAllByPartyId(partyId);
+            } finally {
+                contractLockService.removeContractLock("all");
+            }
         } catch (Exception e) {
             log.error("一键平仓失败", e);
-            return Result.failed("一键平仓失败");
+            return Result.failed(e.getMessage() != null ? e.getMessage() : "一键平仓失败");
         }
-
         return Result.succeed("一键平仓成功");
     }
 
@@ -435,59 +452,6 @@
         dateN.put("expectedProfitAndLoss", Double.valueOf(String.format("%.2f", expectedProfitAndLoss)));
         dateN.put("count", count);
         return Result.ok(dateN);
-    }
-
-    /**
-     * 新线程处理,直接拿到订单锁处理完成后退出
-     */
-    public class CloseDelayThread implements Runnable {
-        private String partyId;
-        private String order_no;
-        private ContractOrderService contractOrderService;
-        private boolean all = false;
-        @Override
-        public void run() {
-            try {
-                while (true) {
-                    if (true == all) {
-                        // 一键平仓
-                        // if (ContractLock.add("all")) {
-                        if (contractLockService.getContractLock("all")) {
-                            this.contractOrderService.saveCloseRemoveAllByPartyId(partyId);
-                            // 处理完退出
-                            break;
-                        }
-                        ThreadUtils.sleep(500);
-                    } else {
-                        // if (ContractLock.add(order_no)) {
-                        if (contractLockService.getContractLock(order_no)) {
-                            this.contractOrderService.saveClose(partyId, order_no);
-                            // 处理完退出
-                            break;
-                        }
-                        ThreadUtils.sleep(500);
-                    }
-                }
-
-            } catch (Throwable t) {
-                log.error("error:", t);
-            } finally {
-                if (true == all) {
-                    // ContractLock.remove("all");
-                    contractLockService.removeContractLock("all");
-                } else {
-                    // ContractLock.remove(order_no);
-                    contractLockService.removeContractLock(order_no);
-                }
-            }
-        }
-
-        public CloseDelayThread(String partyId, String order_no, ContractOrderService contractOrderService, boolean all) {
-            this.partyId = partyId;
-            this.order_no = order_no;
-            this.contractOrderService = contractOrderService;
-            this.all = all;
-        }
     }
 
 }

--
Gitblit v1.9.3