-- 退款收回代理佣金功能 - 数据库迁移SQL
-- 说明：此功能使用现有的 status 字段来标记撤销状态
--
-- 状态字段含义（根据代码和模型注释）：
-- agent_commission.status: 1=已发放，2=已冻结，3=已取消（撤销）
-- agent_rebate.status: 1=已发放，2=已冻结，3=已取消（撤销）
-- agent_freeze_task.status: 1=待解冻，2=已解冻，3=已取消（撤销）
--
-- 注意：如果数据库中这三个表的 status 字段含义不同（例如：1=待解冻，2=已解冻，3=已取消），
-- 需要确认是否有冲突。当前实现使用 status=3 表示已撤销。
-- 如果 status=3 与其他业务冲突，请使用方案2添加新字段。

-- 检查字段是否存在（可选，用于验证）
SELECT
    COLUMN_NAME,
    COLUMN_TYPE,
    COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
    TABLE_SCHEMA = DATABASE()
    AND TABLE_NAME IN (
        'agent_commission',
        'agent_rebate',
        'agent_freeze_task'
    )
    AND COLUMN_NAME = 'status';

-- ========== 方案1：使用现有 status 字段（当前实现，推荐） ==========
-- 如果 status=3 的含义是"已取消"，可以直接使用，无需修改数据库
-- 代码中已实现：撤销时将 status 设置为 3
-- 注意：需要确认数据库中这三个表的 status 字段实际含义是否与代码一致

-- ========== 方案2：添加新字段（如果 status=3 与其他业务冲突） ==========
-- 如果 status 字段的含义不同（例如：1=待解冻，2=已解冻，3=已取消，但3不是用于撤销），
-- 可以使用以下SQL添加新字段：
--
-- ALTER TABLE `agent_commission`
-- ADD COLUMN `cancel_status` TINYINT DEFAULT 0 COMMENT '撤销状态：0=正常，1=已撤销' AFTER `status`;
--
-- ALTER TABLE `agent_rebate`
-- ADD COLUMN `cancel_status` TINYINT DEFAULT 0 COMMENT '撤销状态：0=正常，1=已撤销' AFTER `status`;
--
-- ALTER TABLE `agent_freeze_task`
-- ADD COLUMN `cancel_status` TINYINT DEFAULT 0 COMMENT '撤销状态：0=正常，1=已撤销' AFTER `status`;
--
-- 如果使用方案2，需要修改代码：
-- 1. 在 CancelAgentCommission 方法中，使用 cancel_status 字段而不是 status 字段
-- 2. 查询时使用 cancel_status = 1 来筛选已撤销的记录

-- 当前实现不需要修改数据库结构，使用现有的 status 字段即可
-- 如果后续需要查询已撤销的记录，可以使用：
SELECT * FROM agent_commission WHERE status = 3 AND del_state = 0;

SELECT * FROM agent_rebate WHERE status = 3 AND del_state = 0;

SELECT * FROM agent_freeze_task WHERE status = 3 AND del_state = 0;

-- 如果需要添加索引优化查询（可选）：
CREATE INDEX `idx_order_id_status` ON `agent_commission` (
    `order_id`,
    `status`,
    `del_state`
);

CREATE INDEX `idx_order_id_status` ON `agent_rebate` (
    `order_id`,
    `status`,
    `del_state`
);

CREATE INDEX `idx_order_id_status` ON `agent_freeze_task` (
    `order_id`,
    `status`,
    `del_state`
);