From befbf57e4112d07003bff18102f556a1e5a154de Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Wed, 22 Apr 2026 10:53:37 +0800
Subject: [PATCH] 1

---
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/trader/AdminTraderController.java |  123 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 111 insertions(+), 12 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/trader/AdminTraderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/trader/AdminTraderController.java
index 3ccb69d..e4cfd50 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/trader/AdminTraderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/trader/AdminTraderController.java
@@ -5,6 +5,7 @@
 import com.yami.trading.admin.model.trader.TraderModel;
 import com.yami.trading.bean.contract.domain.ContractOrder;
 import com.yami.trading.bean.model.User;
+import com.yami.trading.bean.trader.FollowCommissionType;
 import com.yami.trading.bean.trader.domain.Trader;
 import com.yami.trading.common.constants.Constants;
 import com.yami.trading.common.domain.Result;
@@ -22,6 +23,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
@@ -55,6 +57,11 @@
 					Double.parseDouble(data.get("deviation_profit_ratio").toString())), 100));
 			data.put("profit_share_ratio",
 					Arith.mul(Double.parseDouble(data.get("profit_share_ratio").toString()), 100));
+			Object dailyPct = data.get("follow_commission_daily_pct");
+			if (dailyPct != null && !"".equals(String.valueOf(dailyPct))) {
+				data.put("follow_commission_daily_pct",
+						Arith.mul(Double.parseDouble(dailyPct.toString()), 100));
+			}
 			data.put("follower_now", Arith.add(Double.parseDouble(data.get("follower_now").toString()),
 					Double.parseDouble(data.get("deviation_follower_now").toString())));
 			data.put("follower_sum", Arith.add(Double.parseDouble(data.get("follower_sum").toString()),
@@ -125,7 +132,7 @@
 
 		int follower_max = model.getFollowerMax();
 
-		int follow_volumn_min = model.getFollowVolumnMin();
+		double follow_volumn_min = model.getFollowVolumnMin();
 
 		double week_3_profit = model.getWeek3Profit();
 
@@ -209,12 +216,21 @@
 			trader.setDeviationFollowerSum(deviation_follower_sum);
 			trader.setDeviationFollowerNow(deviation_follower_now);
 
-			trader.setProfitShareRatio(Arith.div(profit_share_ratio, 100));
 			trader.setState(state);
 			trader.setFollowerMax(follower_max);
 			trader.setCreateTime(sdf.parse(create_time));
 			trader.setImg(img);
-			trader.setFollowVolumnMin(follow_volumn_min);
+			trader.setFollowVolumnMin(BigDecimal.valueOf(follow_volumn_min));
+			bindTraderFollowCommissionFromModel(trader, model);
+			if (FollowCommissionType.isLegacy(FollowCommissionType.normalizeOrLegacy(trader.getFollowCommissionType()))) {
+				trader.setProfitShareRatio(Arith.div(profit_share_ratio, 100));
+			} else {
+				trader.setProfitShareRatio(0D);
+			}
+			String fcErr = validateFollowCommission(trader);
+			if (!StringUtils.isNullOrEmpty(fcErr)) {
+				throw new BusinessException(fcErr);
+			}
 			trader.setChecked(1);
 
 			adminTraderService.save(trader);
@@ -296,6 +312,7 @@
 		}
 		trader.setProfitRatio(Arith.mul(trader.getProfitRatio(), 100));
 		trader.setProfitShareRatio(Arith.mul(trader.getProfitShareRatio(), 100));
+		trader.setFollowCommissionDailyPct(Arith.mul(trader.getFollowCommissionDailyPct(), 100));
 		trader.setWeek3ProfitRatio(Arith.mul(trader.getWeek3ProfitRatio(), 100));
 		trader.setDeviationProfitRatio(Arith.mul(trader.getDeviationWeek3ProfitRatio(), 100));
 		trader.setDeviationProfitRatio(Arith.mul(trader.getDeviationProfitRatio(), 100));
@@ -394,7 +411,7 @@
 
 		int follower_max = model.getFollowerMax();
 
-		int follow_volumn_min = model.getFollowVolumnMin();
+		double follow_volumn_min = model.getFollowVolumnMin();
 
 		double week_3_profit = model.getWeek3Profit();
 
@@ -466,10 +483,20 @@
 
 			trader.setState(state);
 			trader.setFollowerMax(follower_max);
-			trader.setProfitShareRatio(Arith.div(profit_share_ratio, 100));
 			trader.setCreateTime(sdf.parse(create_time));
 			trader.setImg(img);
-			trader.setFollowVolumnMin(follow_volumn_min);
+			trader.setFollowVolumnMin(BigDecimal.valueOf(follow_volumn_min));
+
+			bindTraderFollowCommissionFromModel(trader, model);
+			if (FollowCommissionType.isLegacy(FollowCommissionType.normalizeOrLegacy(trader.getFollowCommissionType()))) {
+				trader.setProfitShareRatio(Arith.div(profit_share_ratio, 100));
+			} else {
+				trader.setProfitShareRatio(0D);
+			}
+			String fcErrUpdate = validateFollowCommission(trader);
+			if (!StringUtils.isNullOrEmpty(fcErrUpdate)) {
+				throw new BusinessException(fcErrUpdate);
+			}
 
 			adminTraderService.update(trader);
 			return Result.succeed(null,"更新成功!");
@@ -489,6 +516,7 @@
 	public Result check(HttpServletRequest request) {
 		String id = request.getParameter("uuid");
 		String check = request.getParameter("check");
+		String reason = request.getParameter("reason");
 		try {
 			if(StringUtils.isEmptyString(check)) {
 				return Result.failed("1","审核参数不能为空");
@@ -500,6 +528,12 @@
 			if(Integer.parseInt(check) == trader.getChecked()) {
 				return Result.failed("1","该记录审核状跟提交状态一致");
 			}
+			if(Integer.parseInt(check) == -1) {
+				if(StringUtils.isEmptyString(reason)) {
+					return Result.failed("1","驳回原因不能为空");
+				}
+				trader.setRemarks(reason);
+			}
             trader.setChecked(Integer.parseInt(check));
 			adminTraderService.update(trader);
 			return Result.succeed(null,"审核成功!");
@@ -507,6 +541,33 @@
 			return Result.failed("1", e.getMessage());
 		} catch (Throwable t) {
 			logger.error("update error ", t);
+			return Result.failed("1", t.getMessage());
+		}
+	}
+
+	@RequestMapping(action + "updateState.action")
+	public Result updateState(HttpServletRequest request) {
+		String id = request.getParameter("uuid");
+		String state = request.getParameter("state");
+		try {
+			if (StringUtils.isEmptyString(id)) {
+				return Result.failed("1", "交易员ID不能为空");
+			}
+			if (StringUtils.isEmptyString(state)) {
+				return Result.failed("1", "带单状态不能为空");
+			}
+			if (!"0".equals(state) && !"1".equals(state) && !"2".equals(state)) {
+				return Result.failed("1", "带单状态非法");
+			}
+			Trader trader = adminTraderService.findById(id);
+			if (trader == null) {
+				return Result.failed("1", "该记录不存在");
+			}
+			trader.setState(state);
+			adminTraderService.update(trader);
+			return Result.succeed(null, "带单状态更新成功");
+		} catch (Throwable t) {
+			logger.error("updateState error", t);
 			return Result.failed("1", t.getMessage());
 		}
 	}
@@ -533,7 +594,7 @@
 	private String verification(String name, String img, String create_time, String symbols, int order_profit, int deviation_order_profit, int order_loss
 			, int deviation_order_loss, double week_3_order_amount, double deviation_week_3_order_amount, double week_3_order_profit, double deviation_week_3_order_profit,
 			int week_3_order_sum, int deviation_week_3_order_sum, double order_amount, double deviation_order_amount, int follower_sum, int deviation_follower_sum,
-			int follower_now, int deviation_follower_now, double profit_share_ratio, int follower_max, int follow_volumn_min) {
+			int follower_now, int deviation_follower_now, double profit_share_ratio, int follower_max, double follow_volumn_min) {
 		
 		
 		if (StringUtils.isEmptyString(name))
@@ -572,14 +633,52 @@
 			return "当前跟随人数加偏差值不能小于0";
 		if (profit_share_ratio < 0.0D)
 			return "利润分成比例不能小于0";
-		if (follower_max <= 0)
-			return "此次跟单最多跟随人数不能小于等于0";
 		if (StringUtils.isEmptyString(img))
 			return "请上传头像";
-		if (follower_max < Arith.add(follower_now, deviation_follower_now))
-			return "此次跟单最多跟随人数不能小于当前跟随人数加偏差值";
 		if (follow_volumn_min < 0)
-			return "最小跟单张数不能小于0";
+			return "最小跟单币数量不能小于0";
+		return null;
+	}
+
+	private void bindTraderFollowCommissionFromModel(Trader trader, TraderModel model) {
+		if (model.getFollowCommissionType() != null && !model.getFollowCommissionType().trim().isEmpty()) {
+			trader.setFollowCommissionType(FollowCommissionType.normalizeOrLegacy(model.getFollowCommissionType()));
+		} else if (trader.getFollowCommissionType() == null || trader.getFollowCommissionType().trim().isEmpty()) {
+			trader.setFollowCommissionType(FollowCommissionType.LEGACY);
+		}
+		if (model.getFollowCommissionMonthlyAmount() != null) {
+			trader.setFollowCommissionMonthlyAmount(model.getFollowCommissionMonthlyAmount());
+		}
+		if (model.getFollowCommissionDailyPct() != null) {
+			trader.setFollowCommissionDailyPct(Arith.div(model.getFollowCommissionDailyPct(), 100));
+		}
+		if (FollowCommissionType.isLegacy(trader.getFollowCommissionType())) {
+			trader.setFollowCommissionMonthlyAmount(BigDecimal.ZERO);
+			trader.setFollowCommissionDailyPct(0);
+		} else if (FollowCommissionType.isMonthlyFixed(trader.getFollowCommissionType())) {
+			trader.setFollowCommissionDailyPct(0);
+		} else if (FollowCommissionType.isDailyProfitPct(trader.getFollowCommissionType())) {
+			trader.setFollowCommissionMonthlyAmount(BigDecimal.ZERO);
+		}
+	}
+
+	private String validateFollowCommission(Trader t) {
+		String ct = FollowCommissionType.normalizeOrLegacy(t.getFollowCommissionType());
+		t.setFollowCommissionType(ct);
+		if (FollowCommissionType.isMonthlyFixed(ct)) {
+			if (t.getFollowCommissionMonthlyAmount() == null
+					|| t.getFollowCommissionMonthlyAmount().compareTo(BigDecimal.ZERO) <= 0) {
+				return "月固定跟单费须大于0";
+			}
+		} else if (FollowCommissionType.isDailyProfitPct(ct)) {
+			if (t.getFollowCommissionDailyPct() <= 0 || t.getFollowCommissionDailyPct() > 1) {
+				return "按日总盈利提成比例须在0到100之间(按百分比填写)";
+			}
+		} else if (FollowCommissionType.isLegacy(ct)) {
+			if (t.getProfitShareRatio() <= 0 || t.getProfitShareRatio() > 1) {
+				return "单笔盈利分成比例须在0到100之间(表单按百分比填写)";
+			}
+		}
 		return null;
 	}
 

--
Gitblit v1.9.3