From fc68aa452e2fd56441128d1d5a4b32f254c6191d Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sun, 05 Oct 2025 00:45:32 +0800
Subject: [PATCH] 修改地址

---
 src/main/java/project/project/web/api/ContractOrderController.java |  115 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 88 insertions(+), 27 deletions(-)

diff --git a/src/main/java/project/project/web/api/ContractOrderController.java b/src/main/java/project/project/web/api/ContractOrderController.java
index da02779..bfdd291 100644
--- a/src/main/java/project/project/web/api/ContractOrderController.java
+++ b/src/main/java/project/project/web/api/ContractOrderController.java
@@ -1,6 +1,7 @@
-package project.project.web.api;
+package project.web.api;
 
 import java.io.IOException;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -10,6 +11,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import kernel.util.Arith;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +29,8 @@
 import project.contract.ContractOrderService;
 import project.data.DataService;
 import project.data.model.Realtime;
+import project.wallet.Wallet;
+import project.wallet.WalletService;
 
 /**
  * 永续合约持仓单
@@ -37,20 +41,23 @@
 
 	@Autowired
 	private DataService dataService;
-	
+
 	@Autowired
 	private ContractLockService contractLockService;
-	
+
 	@Autowired
 	private ContractOrderService contractOrderService;
 
+	@Autowired
+	private WalletService walletService;
+
 	private final String action = "/api/contractOrder!";
-	
+
 	private static final Logger logger = LoggerFactory.getLogger(ContractOrderController.class);
 
 	/**
 	 * 平仓
-	 * 
+	 *
 	 * order_no 订单号
 	 */
 	@RequestMapping(action + "close.action")
@@ -62,7 +69,7 @@
 		if (!"0".equals(resultObject.getCode())) {
 			return resultObject;
 		}
-		
+
 		try {
 
 			CloseDelayThread lockDelayThread = new CloseDelayThread(this.getLoginPartyId(), order_no, this.contractOrderService, false);
@@ -72,7 +79,8 @@
 		} catch (BusinessException e) {
 			resultObject.setCode("1");
 			resultObject.setMsg(e.getMessage());
-		} catch (Throwable t) {
+		} catch (Exception t) {
+			t.printStackTrace();
 			resultObject.setCode("1");
 			resultObject.setMsg("程序错误");
 			logger.error("error:", t);
@@ -92,7 +100,7 @@
 		if (!"0".equals(resultObject.getCode())) {
 			return resultObject;
 		}
-		
+
 		try {
 
 			CloseDelayThread lockDelayThread = new CloseDelayThread(this.getLoginPartyId(), "", this.contractOrderService, true);
@@ -113,7 +121,7 @@
 
 	/**
 	 * 订单列表
-	 * 
+	 *
 	 * page_no 页码
 	 * symbol 币种
 	 * type 查询类型:orders 当前持仓单;hisorders 历史持仓单;
@@ -146,7 +154,7 @@
 			}
 
 			int page_no_int = Integer.valueOf(page_no).intValue();
-			
+
 			if ("orders".equals(type)) {
 //				// 页条数配成1000达到不分页的效果
 //				data = this.contractOrderService.getPaged(page_no_int, 1000, this.getLoginPartyId(), symbol, type);
@@ -154,7 +162,7 @@
 			} else if ("hisorders".equals(type)) {
 				data = this.contractOrderService.getPaged(page_no_int, 10, this.getLoginPartyId(), symbol, type,startTime,endTime);
 			}
-			
+
 			String symbolsStr = "";
 			Set<String> symbols = new HashSet<String>();
 			for (int i = 0; i < data.size(); i++) {
@@ -166,23 +174,76 @@
 					} else {
 						symbolsStr = sym;
 					}
-				}			
+				}
 			}
-			
+
 			List<Realtime> realtime_all = this.dataService.realtime(symbolsStr);
 			if (realtime_all.size() <= 0) {
 				realtime_all = new ArrayList<Realtime>();
 //				throw new BusinessException("系统错误,请稍后重试");
 			}
-			
+
 			Map<String, Realtime> realtimeMap = new HashMap<String, Realtime>();
 			for (int i = 0; i < realtime_all.size(); i++) {
 				realtimeMap.put(realtime_all.get(i).getSymbol(), realtime_all.get(i));
 			}
-			
+
 			for (int i = 0; i < data.size(); i++) {
 				Map<String, Object> map = data.get(i);
 
+				double depositOpen =  Double.parseDouble(map.get("deposit_open").toString());
+				double leverRate = Double.parseDouble(map.get("lever_rate").toString());
+				double tradeAvgPrice =  Double.parseDouble(map.get("trade_avg_price").toString());
+
+				double mul = Arith.mul(depositOpen, leverRate);//仓位
+				double div = Arith.div(mul, tradeAvgPrice);//持有币的数量
+				/**
+				 * 计算全仓收益 保证金
+				 */
+				double profit = 0;
+				List<ContractOrder> list = contractOrderService.findSubmitted(this.getLoginPartyId(), null, null);
+				for (int f = 0; f < list.size(); f++) {
+					ContractOrder close_line = list.get(f);
+					if(close_line.getProfit() > 0){
+						profit = Arith.add(profit, Arith.add(close_line.getProfit(), close_line.getDeposit()));
+					}else{
+						profit = Arith.add(profit, close_line.getDeposit());
+					}				}
+				Wallet wallet = this.walletService.saveWalletByPartyId(this.getLoginPartyId());
+				double totleMoney = wallet.getMoney();
+				profit = Arith.add(profit,totleMoney);
+
+
+				if (map.get("direction") != null && map.get("state").equals("submitted")) {
+					String direction = map.get("direction").toString();
+					double liquidationPrice;
+					double deposit =  profit;
+
+					if(leverRate == 1){
+						liquidationPrice = 0;
+					}else {
+						if ("sell".equals(direction)) {
+							double lossPercentage = deposit / Double.parseDouble(map.get("amount").toString());
+							double priceIncrease = lossPercentage * tradeAvgPrice;
+							liquidationPrice = tradeAvgPrice + priceIncrease;
+						} else {
+							double lossPercentage = deposit / Double.parseDouble(map.get("amount").toString());
+							double priceDrop = lossPercentage * tradeAvgPrice;
+							liquidationPrice = tradeAvgPrice - priceDrop;
+						}
+					}
+					// 检查 liquidationPrice 是否为有效数字
+					if (Double.isInfinite(liquidationPrice) || Double.isNaN(liquidationPrice)) {
+						liquidationPrice = 0;  // 如果是无效结果,回退为 0
+					}
+					DecimalFormat dfs = new DecimalFormat("#.#####");
+					String formattedPrice = dfs.format(liquidationPrice);
+					// 检查是否为负数
+					if (Double.parseDouble(formattedPrice) < 0) {
+						formattedPrice = "0";
+					}
+					map.put("qiangPing", formattedPrice);
+				}
 				// 标记价格
 				Realtime realtime = realtimeMap.get(map.get("symbol"));
 				if (null == realtime) {
@@ -191,9 +252,9 @@
 					map.put("mark_price", realtime.getClose());
 				}
 			}
-			
+
 			resultObject.setData(data);
-			
+
 		} catch (BusinessException e) {
 			resultObject.setCode("1");
 			resultObject.setMsg(e.getMessage());
@@ -208,7 +269,7 @@
 
 	/**
 	 * 订单详情
-	 * 
+	 *
 	 * order_no 订单号
 	 */
 	@RequestMapping(action + "get.action")
@@ -222,21 +283,21 @@
 		}
 
 		try {
-			
+
 			if (StringUtils.isNullOrEmpty(order_no)) {
 				logger.info("contractOrder!get order_no null");
 				throw new BusinessException("订单不存在");
 			}
 
 			ContractOrder order = this.contractOrderService.findByOrderNo(order_no);
-						
+
 			if (null == order) {
 				logger.info("contractOrder!get order_no:" + order_no + ", order null");
 				throw new BusinessException("订单不存在");
 			}
-						
+
 			resultObject.setData(this.contractOrderService.bulidOne(order));
-		
+
 		} catch (BusinessException e) {
 			resultObject.setCode("1");
 			resultObject.setMsg(e.getMessage());
@@ -259,9 +320,9 @@
 		private boolean all = false;
 
 		public void run() {
-			
+
 			try {
-				
+
 				while (true) {
 					if (true == all) {
 						// 一键平仓
@@ -271,7 +332,7 @@
 							// 处理完退出
 							break;
 						}
-						ThreadUtils.sleep(500);	
+						ThreadUtils.sleep(500);
 					} else {
 						// if (ContractLock.add(order_no)) {
 						if (contractLockService.getContractLock(order_no)) {
@@ -279,7 +340,7 @@
 							// 处理完退出
 							break;
 						}
-						ThreadUtils.sleep(500);						
+						ThreadUtils.sleep(500);
 					}
 				}
 
@@ -303,5 +364,5 @@
 			this.all = all;
 		}
 	}
-	
+
 }

--
Gitblit v1.9.3