diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/entity/CopyTrading.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/entity/CopyTrading.kt index d31cb03..ef202ba 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/entity/CopyTrading.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/entity/CopyTrading.kt @@ -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) diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/repository/CopyTradingRepository.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/repository/CopyTradingRepository.kt index b5ee3b4..cfa1bec 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/repository/CopyTradingRepository.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/repository/CopyTradingRepository.kt @@ -21,12 +21,12 @@ interface CopyTradingRepository : JpaRepository { fun findByLeaderId(leaderId: Long): List /** - * 根据账户ID和Leader ID查找跟单 + * 根据账户ID和Leader ID查找跟单列表 */ fun findByAccountIdAndLeaderId( accountId: Long, leaderId: Long - ): CopyTrading? + ): List /** * 查找所有启用的跟单 diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/configs/CopyTradingService.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/configs/CopyTradingService.kt index 9af66a4..c334fbe 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/configs/CopyTradingService.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/configs/CopyTradingService.kt @@ -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) diff --git a/backend/src/main/resources/db/migration/V23__remove_unique_constraint_from_copy_trading.sql b/backend/src/main/resources/db/migration/V23__remove_unique_constraint_from_copy_trading.sql new file mode 100644 index 0000000..3b7c50d --- /dev/null +++ b/backend/src/main/resources/db/migration/V23__remove_unique_constraint_from_copy_trading.sql @@ -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; +