diff --git a/src/main/java/com/yau/digitalrmb/issuance/application/service/IssuanceTrainingResetService.java b/src/main/java/com/yau/digitalrmb/issuance/application/service/IssuanceTrainingResetService.java index ef96b0a..99c71b6 100644 --- a/src/main/java/com/yau/digitalrmb/issuance/application/service/IssuanceTrainingResetService.java +++ b/src/main/java/com/yau/digitalrmb/issuance/application/service/IssuanceTrainingResetService.java @@ -97,7 +97,8 @@ public class IssuanceTrainingResetService { Integer resettable = jdbc.queryForObject("SELECT COUNT(*) FROM commercial_bank_currency c " + "JOIN central_bank_currency_ownership o ON o.currency_id=c.currency_id " + "WHERE c.issuance_request_id=? AND c.status='可用' AND o.owner_type='BANK' " - + "AND o.owner_id=c.bank_code AND o.status='AVAILABLE' AND o.lock_business_type IS NULL " + + "AND CAST(o.owner_id AS BINARY)=CAST(c.bank_code AS BINARY) " + + "AND o.status='AVAILABLE' AND o.lock_business_type IS NULL " + "AND o.lock_business_id IS NULL AND o.last_transaction_id IS NULL", Integer.class, requestId); if (!safeEquals(issued, resettable)) { throw validation("模块二发行的数字货币已被后续模块使用,不能从模块二重置"); diff --git a/src/main/resources/db/manual/issuance_cancel_reset_fix_upgrade.sql b/src/main/resources/db/manual/issuance_cancel_reset_fix_upgrade.sql new file mode 100644 index 0000000..dc12c54 --- /dev/null +++ b/src/main/resources/db/manual/issuance_cancel_reset_fix_upgrade.sql @@ -0,0 +1,34 @@ +-- 修复模块二取消、重新实训接口依赖的线上数据库结构。 +-- 适用问题: +-- 1. POST /api/v1/issuance/attempts/{attemptId}/cancel 返回 500; +-- 2. POST /api/v1/issuance/training/reset 返回 500。 +-- 3. POST /api/v1/central-banks/issuance/requests/{id}/business-review 返回 500。 + +CREATE TABLE IF NOT EXISTS issuance_source_currency_usage ( + id BIGINT PRIMARY KEY, + source_currency_id BIGINT NOT NULL, + source_batch_id BIGINT NOT NULL, + issuance_request_id CHAR(36) NOT NULL, + status VARCHAR(16) NOT NULL, + reserved_at TIMESTAMP NOT NULL, + released_at TIMESTAMP NULL, + issued_at TIMESTAMP NULL, + audit_user_id VARCHAR(36) NOT NULL, + audit_username VARCHAR(64) NOT NULL, + created_at TIMESTAMP NOT NULL, + updated_at TIMESTAMP NOT NULL, + CONSTRAINT uk_issuance_source_currency UNIQUE (source_currency_id), + INDEX idx_issuance_source_request (issuance_request_id, status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +ALTER TABLE central_bank_currency_ownership + ADD COLUMN lock_business_type VARCHAR(32) NULL AFTER status, + ADD COLUMN lock_business_id VARCHAR(96) NULL AFTER lock_business_type, + ADD INDEX idx_currency_ownership_available (owner_type, owner_id, status), + ADD INDEX idx_currency_ownership_lock_business (lock_business_type, lock_business_id); + +-- commercial_bank_currency 来自较新的默认排序规则,而兑换权属相关表沿用 +-- utf8mb4_unicode_ci。统一关联键,避免 owner_id=bank_code 查询触发 collation 冲突。 +ALTER TABLE commercial_bank_currency + MODIFY COLUMN bank_code VARCHAR(32) + CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;