-- 资源直购虚拟支付改造
-- 执行前请先备份数据库。适用于当前项目的 MySQL 数据库。

ALTER TABLE app_resource
    ADD COLUMN price_fen INT NOT NULL DEFAULT 0 COMMENT '虚拟支付价格，单位分' AFTER ad_number;

-- 兼容已有“is_ad=3 且 ad_number 表示人民币元”的资源。
UPDATE app_resource
SET price_fen = ad_number * 100
WHERE is_ad = 3 AND price_fen = 0 AND ad_number > 0;

CREATE TABLE app_virtual_product (
    id            BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键',
    product_id    VARCHAR(64) NOT NULL COMMENT '微信虚拟道具productId',
    price_fen     INT         NOT NULL COMMENT '价格档位，单位分',
    product_name  VARCHAR(100) NOT NULL COMMENT '档位名称',
    status        TINYINT     NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
    create_time   DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_time   DATETIME    NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_virtual_product_id (product_id),
    UNIQUE KEY uk_virtual_product_price (price_fen)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信虚拟道具价格档位';

CREATE TABLE app_virtual_order (
    id               BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键',
    order_no         VARCHAR(32) NOT NULL COMMENT '业务订单号',
    user_id          BIGINT      NOT NULL COMMENT '用户ID',
    resource_id      BIGINT      NOT NULL COMMENT '资源ID',
    product_id       VARCHAR(64) NOT NULL COMMENT '微信虚拟道具ID',
    price_fen        INT         NOT NULL COMMENT '支付金额，单位分',
    open_id          VARCHAR(64) NOT NULL COMMENT '微信OpenID',
    status           TINYINT     NOT NULL DEFAULT 0 COMMENT '0待支付 1已支付发货 2已退款 3已关闭',
    wx_order_no      VARCHAR(64) NULL COMMENT '微信内部订单号',
    transaction_id   VARCHAR(64) NULL COMMENT '微信支付交易单号',
    create_time      DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    pay_time         DATETIME    NULL,
    provide_time     DATETIME    NULL,
    refund_time      DATETIME    NULL,
    last_query_time  DATETIME    NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_virtual_order_no (order_no),
    KEY idx_virtual_order_user (user_id, create_time),
    KEY idx_virtual_order_resource (resource_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资源虚拟支付订单';

CREATE TABLE app_resource_entitlement (
    id            BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键',
    user_id       BIGINT      NOT NULL COMMENT '用户ID',
    resource_id   BIGINT      NOT NULL COMMENT '资源ID',
    order_no      VARCHAR(32) NOT NULL COMMENT '来源虚拟支付订单号',
    status        TINYINT     NOT NULL DEFAULT 1 COMMENT '1有效 0已撤销',
    granted_time  DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    revoked_time  DATETIME    NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_resource_entitlement_order (order_no),
    UNIQUE KEY uk_resource_entitlement_user_resource (user_id, resource_id),
    KEY idx_resource_entitlement_resource (resource_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='付费资源访问权益';

-- 执行迁移后：
-- 1. 在微信公众平台创建各价格档位的道具并发布；
-- 2. 在若依后台编辑付费资源，填写“价格（分）”和对应的 productId；
-- 3. 同一价格填写同一个 productId，后台会自动维护 app_virtual_product 映射。

-- 当前小程序已发布的微信虚拟道具价格映射。
-- product_id 必须与微信后台保持完全一致（包括 resourse 的现有拼写）。
INSERT INTO app_virtual_product
    (product_id, price_fen, product_name, status, create_time)
VALUES
    ('resourse_1', 100, '1元资源', 1, NOW()),
    ('resourse_10', 1000, '10元资源', 1, NOW()),
    ('resourse_50', 5000, '50元资源', 1, NOW()),
    ('resourse_99', 9900, '99元资源', 1, NOW()),
    ('resourse_300', 30000, '300元资源', 1, NOW())
ON DUPLICATE KEY UPDATE
    product_name = VALUES(product_name),
    status = 1,
    update_time = NOW();
