feat: 支持同一用户创建多个相同 leader 的跟单配置

- 删除 copy_trading 表的唯一约束 uk_account_leader
- 移除实体类 CopyTrading 的唯一约束注解
- 移除创建跟单时的重复检查逻辑
- 修改 Repository 方法 findByAccountIdAndLeaderId 返回列表而非单个对象
- 更新查询逻辑以支持返回多个跟单配置

现在允许同一用户对同一个 leader 创建多个不同配置的跟单关系。
This commit is contained in:
WrBug
2026-01-09 08:56:14 +08:00
parent 0327eaffe3
commit a16b6fce54
4 changed files with 24 additions and 20 deletions
@@ -8,12 +8,7 @@ import com.wrbug.polymarketbot.util.toSafeBigDecimal
* 跟单配置实体(独立配置,不再绑定模板)
*/
@Entity
@Table(
name = "copy_trading",
uniqueConstraints = [
UniqueConstraint(columnNames = ["account_id", "leader_id"])
]
)
@Table(name = "copy_trading")
data class CopyTrading(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -21,12 +21,12 @@ interface CopyTradingRepository : JpaRepository<CopyTrading, Long> {
fun findByLeaderId(leaderId: Long): List<CopyTrading>
/**
* 根据账户ID和Leader ID查找跟单
* 根据账户ID和Leader ID查找跟单列表
*/
fun findByAccountIdAndLeaderId(
accountId: Long,
leaderId: Long
): CopyTrading?
): List<CopyTrading>
/**
* 查找所有启用的跟单
@@ -50,16 +50,7 @@ class CopyTradingService(
val leader = leaderRepository.findById(request.leaderId).orElse(null)
?: return Result.failure(IllegalArgumentException("Leader 不存在"))
// 3. 检查是否已存在相同的跟单关系(accountId + leaderId
val existing = copyTradingRepository.findByAccountIdAndLeaderId(
request.accountId,
request.leaderId
)
if (existing != null) {
return Result.failure(IllegalArgumentException("该跟单关系已存在"))
}
// 4. 验证配置名(强校验:不能为空字符串)
// 3. 验证配置名(强校验:不能为空字符串
val configName = request.configName?.trim()
if (configName.isNullOrBlank()) {
return Result.failure(IllegalArgumentException("配置名不能为空"))
@@ -286,11 +277,10 @@ class CopyTradingService(
return try {
val copyTradings = when {
request.accountId != null && request.leaderId != null -> {
val found = copyTradingRepository.findByAccountIdAndLeaderId(
copyTradingRepository.findByAccountIdAndLeaderId(
request.accountId,
request.leaderId
)
if (found != null) listOf(found) else emptyList()
}
request.accountId != null -> {
copyTradingRepository.findByAccountId(request.accountId)
@@ -0,0 +1,19 @@
-- ============================================
-- V23: 移除跟单关系的唯一约束
-- 允许同一用户创建多个相同 leader 的跟单配置
-- ============================================
-- 删除唯一约束 uk_account_leader
SET @uk_name = (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'copy_trading'
AND CONSTRAINT_TYPE = 'UNIQUE'
AND CONSTRAINT_NAME = 'uk_account_leader'
LIMIT 1);
SET @sql = IF(@uk_name IS NOT NULL,
CONCAT('ALTER TABLE copy_trading DROP INDEX ', @uk_name),
'SELECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;