diff --git a/initialize/migrate/database/02141_order_iap_token.up.sql b/initialize/migrate/database/02141_order_iap_token.up.sql index f2236d0..f9f96e5 100644 --- a/initialize/migrate/database/02141_order_iap_token.up.sql +++ b/initialize/migrate/database/02141_order_iap_token.up.sql @@ -1,5 +1,13 @@ --- Add subscription_user_id column to order table -ALTER TABLE `order` ADD COLUMN `subscription_user_id` bigint NOT NULL DEFAULT 0 COMMENT 'Target user ID for subscription (0=same as UserId)' AFTER `user_id`; +-- Add subscription_user_id column to order table (idempotent) +SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'order' AND COLUMN_NAME = 'subscription_user_id'); +SET @sql = IF(@col_exists = 0, 'ALTER TABLE `order` ADD COLUMN `subscription_user_id` bigint NOT NULL DEFAULT 0 COMMENT ''Target user ID for subscription (0=same as UserId)'' AFTER `user_id`', 'SELECT 1'); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; --- Add app_account_token column to order table for Apple IAP -ALTER TABLE `order` ADD COLUMN `app_account_token` varchar(36) DEFAULT NULL COMMENT 'Apple IAP App Account Token (UUID)' AFTER `subscribe_token`; +-- Add app_account_token column to order table for Apple IAP (idempotent) +SET @col_exists2 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'order' AND COLUMN_NAME = 'app_account_token'); +SET @sql2 = IF(@col_exists2 = 0, 'ALTER TABLE `order` ADD COLUMN `app_account_token` varchar(36) DEFAULT NULL COMMENT ''Apple IAP App Account Token (UUID)'' AFTER `subscribe_token`', 'SELECT 1'); +PREPARE stmt2 FROM @sql2; +EXECUTE stmt2; +DEALLOCATE PREPARE stmt2; diff --git a/queue/logic/iap/dailyReconcileLogic.go b/queue/logic/iap/dailyReconcileLogic.go index 3159422..12b3365 100644 --- a/queue/logic/iap/dailyReconcileLogic.go +++ b/queue/logic/iap/dailyReconcileLogic.go @@ -23,5 +23,5 @@ func (l *DailyReconcileLogic) ProcessTask(ctx context.Context, _ *asynq.Task) er logger.Infof("[IAPDailyReconcile] start at %s", time.Now().Format("2006-01-02 15:04:05")) // 第三层:扫描 1min ~ 48h,trade_no 非空(trade_no 为空说明客户端从未上传过 token,服务端无法主动补单) // 实际上与第二层的区别是时间窗口:覆盖全天的遗漏 - return l.inner.reconcile(ctx, 1*time.Minute, 48*time.Hour, true) + return l.inner.reconcile(ctx, 1*time.Minute, 48*time.Hour, false) } diff --git a/queue/logic/iap/reconcileLogic.go b/queue/logic/iap/reconcileLogic.go index 324547f..54fd0d3 100644 --- a/queue/logic/iap/reconcileLogic.go +++ b/queue/logic/iap/reconcileLogic.go @@ -27,7 +27,7 @@ func NewReconcileLogic(svc *svc.ServiceContext) *ReconcileLogic { func (l *ReconcileLogic) ProcessTask(ctx context.Context, _ *asynq.Task) error { logger.Infof("[IAPReconcile] start at %s", time.Now().Format("2006-01-02 15:04:05")) - return l.reconcile(ctx, 5*time.Minute, 48*time.Hour, true) + return l.reconcile(ctx, 5*time.Minute, 48*time.Hour, false) } // reconcile 核心对账逻辑,被第二层和第三层共享