From a16b6fce546cbe631a9925357bf5a6a866697f69 Mon Sep 17 00:00:00 2001 From: WrBug Date: Fri, 9 Jan 2026 08:56:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=90=8C=E4=B8=80?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=88=9B=E5=BB=BA=E5=A4=9A=E4=B8=AA=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=20leader=20=E7=9A=84=E8=B7=9F=E5=8D=95=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 copy_trading 表的唯一约束 uk_account_leader - 移除实体类 CopyTrading 的唯一约束注解 - 移除创建跟单时的重复检查逻辑 - 修改 Repository 方法 findByAccountIdAndLeaderId 返回列表而非单个对象 - 更新查询逻辑以支持返回多个跟单配置 现在允许同一用户对同一个 leader 创建多个不同配置的跟单关系。 --- .../wrbug/polymarketbot/entity/CopyTrading.kt | 7 +------ .../repository/CopyTradingRepository.kt | 4 ++-- .../copytrading/configs/CopyTradingService.kt | 14 ++------------ ...ve_unique_constraint_from_copy_trading.sql | 19 +++++++++++++++++++ 4 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 backend/src/main/resources/db/migration/V23__remove_unique_constraint_from_copy_trading.sql 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; +