-- +goose Up CREATE TABLE distribution_sites ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, site_code VARCHAR(64) NOT NULL, site_name VARCHAR(128) NOT NULL, domain VARCHAR(255) NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'active', display_account_enabled TINYINT(1) NOT NULL DEFAULT 1, default_support_group_id BIGINT UNSIGNED NULL, tax_enabled TINYINT(1) NOT NULL DEFAULT 0, tax_rate_bps BIGINT NOT NULL DEFAULT 100, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_sites_code (site_code), UNIQUE KEY uk_distribution_sites_domain (domain), KEY idx_distribution_sites_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销网站主体'; CREATE TABLE distribution_site_members ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, site_id BIGINT UNSIGNED NOT NULL, admin_user_id BIGINT UNSIGNED NOT NULL, member_type VARCHAR(32) NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'active', data_scope VARCHAR(32) NOT NULL DEFAULT 'site', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_site_member (site_id, admin_user_id), KEY idx_distribution_site_members_admin (admin_user_id, status), CONSTRAINT fk_distribution_site_members_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id), CONSTRAINT fk_distribution_site_members_admin FOREIGN KEY (admin_user_id) REFERENCES admin_users (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销网站后台成员'; CREATE TABLE distribution_site_accounts ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, site_id BIGINT UNSIGNED NOT NULL, account_id BIGINT UNSIGNED NOT NULL, listing_id BIGINT UNSIGNED NOT NULL, display_status VARCHAR(16) NOT NULL DEFAULT 'enabled', display_started_at DATETIME NULL, display_ended_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_site_account (site_id, account_id), KEY idx_distribution_site_accounts_listing (listing_id), KEY idx_distribution_site_accounts_display (site_id, display_status), CONSTRAINT fk_distribution_site_accounts_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销网站账号展示关系'; CREATE TABLE distribution_rule_versions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, site_id BIGINT UNSIGNED NULL, mode VARCHAR(32) NOT NULL, version INT NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'draft', platform_receive_ratio DECIMAL(10,2) NOT NULL DEFAULT 0, platform_sell_ratio DECIMAL(10,2) NOT NULL DEFAULT 0, distributor_receive_ratio DECIMAL(10,2) NOT NULL DEFAULT 0, distributor_sell_ratio DECIMAL(10,2) NOT NULL DEFAULT 0, distributor_a_ratio DECIMAL(10,2) NOT NULL DEFAULT 0, distributor_b_ratio DECIMAL(10,2) NOT NULL DEFAULT 0, service_fee_value DECIMAL(12,4) NOT NULL DEFAULT 0, service_fee_unit VARCHAR(24) NOT NULL DEFAULT 'ratio', payment_fee_bps BIGINT NOT NULL DEFAULT 50, tax_enabled TINYINT(1) NOT NULL DEFAULT 0, tax_rate_bps BIGINT NOT NULL DEFAULT 100, effective_from DATETIME NOT NULL, effective_to DATETIME NULL, created_by BIGINT UNSIGNED NULL, created_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_rule_version (site_id, mode, version), KEY idx_distribution_rule_effective (site_id, mode, status, effective_from), CONSTRAINT fk_distribution_rule_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id), CONSTRAINT fk_distribution_rule_admin FOREIGN KEY (created_by) REFERENCES admin_users (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销分账规则版本'; CREATE TABLE distribution_order_financials ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL, site_id BIGINT UNSIGNED NOT NULL, rule_version_id BIGINT UNSIGNED NOT NULL, gross_paid_amount_cent BIGINT NOT NULL DEFAULT 0, refund_amount_cent BIGINT NOT NULL DEFAULT 0, net_paid_amount_cent BIGINT NOT NULL DEFAULT 0, payment_fee_bps BIGINT NOT NULL DEFAULT 50, payment_fee_cent BIGINT NOT NULL DEFAULT 0, service_fee_value DECIMAL(12,4) NOT NULL DEFAULT 0, service_fee_unit VARCHAR(24) NOT NULL DEFAULT 'ratio', service_fee_cent BIGINT NOT NULL DEFAULT 0, markup_amount_cent BIGINT NOT NULL DEFAULT 0, tax_enabled TINYINT(1) NOT NULL DEFAULT 0, tax_rate_bps BIGINT NOT NULL DEFAULT 100, tax_amount_cent BIGINT NOT NULL DEFAULT 0, split_base_amount_cent BIGINT NOT NULL DEFAULT 0, rounding_adjustment_cent BIGINT NOT NULL DEFAULT 0, settlement_status VARCHAR(24) NOT NULL DEFAULT 'pending', settled_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_order_financial_order (order_id), KEY idx_distribution_order_financial_site_status (site_id, settlement_status), CONSTRAINT fk_distribution_order_financial_order FOREIGN KEY (order_id) REFERENCES rental_orders (id), CONSTRAINT fk_distribution_order_financial_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id), CONSTRAINT fk_distribution_order_financial_rule FOREIGN KEY (rule_version_id) REFERENCES distribution_rule_versions (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销正常订单财务快照'; CREATE TABLE distribution_order_parties ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL, site_id BIGINT UNSIGNED NOT NULL, party_role VARCHAR(32) NOT NULL, party_type VARCHAR(16) NOT NULL, party_id BIGINT UNSIGNED NOT NULL, ratio DECIMAL(10,2) NOT NULL DEFAULT 0, income_amount_cent BIGINT NOT NULL DEFAULT 0, cost_amount_cent BIGINT NOT NULL DEFAULT 0, profit_amount_cent BIGINT NOT NULL DEFAULT 0, tax_amount_cent BIGINT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), KEY idx_distribution_order_parties_order (order_id), KEY idx_distribution_order_parties_site_role (site_id, party_role), CONSTRAINT fk_distribution_order_parties_order FOREIGN KEY (order_id) REFERENCES rental_orders (id), CONSTRAINT fk_distribution_order_parties_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销订单参与方快照'; CREATE TABLE distribution_settlement_batches ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, site_id BIGINT UNSIGNED NOT NULL, batch_no VARCHAR(64) NOT NULL, period_start DATETIME NOT NULL, period_end DATETIME NOT NULL, total_amount_cent BIGINT NOT NULL DEFAULT 0, status VARCHAR(16) NOT NULL DEFAULT 'draft', created_by BIGINT UNSIGNED NULL, settled_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_settlement_batch_no (batch_no), KEY idx_distribution_settlement_batches_site_status (site_id, status), CONSTRAINT fk_distribution_settlement_batches_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id), CONSTRAINT fk_distribution_settlement_batches_admin FOREIGN KEY (created_by) REFERENCES admin_users (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销结算批次'; CREATE TABLE distribution_settlement_items ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, batch_id BIGINT UNSIGNED NOT NULL, order_id BIGINT UNSIGNED NOT NULL, party_id BIGINT UNSIGNED NOT NULL, amount_cent BIGINT NOT NULL DEFAULT 0, status VARCHAR(16) NOT NULL DEFAULT 'pending', created_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_settlement_item (batch_id, order_id, party_id), KEY idx_distribution_settlement_items_order (order_id), CONSTRAINT fk_distribution_settlement_items_batch FOREIGN KEY (batch_id) REFERENCES distribution_settlement_batches (id), CONSTRAINT fk_distribution_settlement_items_order FOREIGN KEY (order_id) REFERENCES rental_orders (id), CONSTRAINT fk_distribution_settlement_items_party FOREIGN KEY (party_id) REFERENCES distribution_order_parties (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销结算明细'; CREATE TABLE distribution_site_payment_channels ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, site_id BIGINT UNSIGNED NOT NULL, config_id BIGINT UNSIGNED NOT NULL, priority INT NOT NULL DEFAULT 0, status VARCHAR(16) NOT NULL DEFAULT 'active', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_distribution_site_payment (site_id, config_id), KEY idx_distribution_site_payment_status (site_id, status, priority), CONSTRAINT fk_distribution_site_payment_site FOREIGN KEY (site_id) REFERENCES distribution_sites (id), CONSTRAINT fk_distribution_site_payment_config FOREIGN KEY (config_id) REFERENCES payment_merchant_configs (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销网站收款通道绑定'; ALTER TABLE rental_orders ADD COLUMN distribution_site_id BIGINT UNSIGNED NULL AFTER source_channel, ADD COLUMN distribution_mode VARCHAR(32) NOT NULL DEFAULT '' AFTER distribution_site_id, ADD COLUMN distribution_rule_version_id BIGINT UNSIGNED NULL AFTER distribution_mode, ADD KEY idx_rental_orders_distribution_site (distribution_site_id, distribution_mode), ADD CONSTRAINT fk_rental_orders_distribution_site FOREIGN KEY (distribution_site_id) REFERENCES distribution_sites (id), ADD CONSTRAINT fk_rental_orders_distribution_rule FOREIGN KEY (distribution_rule_version_id) REFERENCES distribution_rule_versions (id); INSERT INTO permissions (code, name, resource, action) VALUES ('distribution:site_view', '查看分销网站', 'distribution', 'site_view'), ('distribution:site_manage', '管理分销网站', 'distribution', 'site_manage'), ('distribution:order_view', '查看分销订单', 'distribution', 'order_view'), ('distribution:process_view', '查看分销订单过程', 'distribution', 'process_view'), ('distribution:finance_view', '查看分销财务', 'distribution', 'finance_view'), ('distribution:settlement_view', '查看分销结算', 'distribution', 'settlement_view'), ('distribution:settlement_manage', '管理分销结算', 'distribution', 'settlement_manage'), ('distribution:rule_view', '查看分销规则', 'distribution', 'rule_view'), ('distribution:rule_manage', '管理分销规则', 'distribution', 'rule_manage'), ('distribution:account_view', '查看分销账号', 'distribution', 'account_view'), ('distribution:account_display', '管理分销账号展示', 'distribution', 'account_display'), ('distribution:payment_view', '查看分销支付通道', 'distribution', 'payment_view'), ('distribution:payment_manage', '管理分销支付通道', 'distribution', 'payment_manage'), ('distribution:chat_view', '查看分销客服消息', 'distribution', 'chat_view'), ('distribution:chat_send', '发送分销客服消息', 'distribution', 'chat_send') ON DUPLICATE KEY UPDATE name = VALUES(name), resource = VALUES(resource), action = VALUES(action); INSERT IGNORE INTO role_permissions (role_id, permission_id) SELECT r.id, p.id FROM roles r CROSS JOIN permissions p WHERE r.code = 'super_admin' AND p.code LIKE 'distribution:%'; INSERT INTO distribution_rule_versions ( site_id, mode, version, status, platform_receive_ratio, platform_sell_ratio, distributor_receive_ratio, distributor_sell_ratio, distributor_a_ratio, distributor_b_ratio, service_fee_value, service_fee_unit, payment_fee_bps, tax_enabled, tax_rate_bps, effective_from, created_at ) VALUES (NULL, 'two_party_distributor_receive', 1, 'active', 0, 4, 3.5, 0, 0, 0, 2.5, 'ratio', 50, 0, 100, NOW(), NOW()), (NULL, 'two_party_platform_receive', 1, 'active', 3.5, 0, 0, 4, 0, 0, 2.5, 'ratio', 50, 0, 100, NOW(), NOW()), (NULL, 'three_party', 1, 'active', 0, 0, 0, 0, 3.5, 4, 2.5, 'ratio', 50, 0, 100, NOW(), NOW()) ON DUPLICATE KEY UPDATE status = VALUES(status), service_fee_value = VALUES(service_fee_value), service_fee_unit = VALUES(service_fee_unit), payment_fee_bps = VALUES(payment_fee_bps); -- +goose Down DROP TABLE IF EXISTS distribution_order_financials; DROP TABLE IF EXISTS distribution_site_payment_channels; DROP TABLE IF EXISTS distribution_settlement_items; DROP TABLE IF EXISTS distribution_settlement_batches; DROP TABLE IF EXISTS distribution_order_parties; ALTER TABLE rental_orders DROP FOREIGN KEY fk_rental_orders_distribution_rule, DROP FOREIGN KEY fk_rental_orders_distribution_site, DROP KEY idx_rental_orders_distribution_site, DROP COLUMN distribution_rule_version_id, DROP COLUMN distribution_mode, DROP COLUMN distribution_site_id; DROP TABLE IF EXISTS distribution_rule_versions; DROP TABLE IF EXISTS distribution_site_accounts; DROP TABLE IF EXISTS distribution_site_members; DROP TABLE IF EXISTS distribution_sites; DELETE rp FROM role_permissions rp JOIN permissions p ON p.id = rp.permission_id WHERE p.code LIKE 'distribution:%'; DELETE FROM permissions WHERE code IN ( 'distribution:site_view', 'distribution:site_manage', 'distribution:order_view', 'distribution:process_view', 'distribution:finance_view', 'distribution:settlement_view', 'distribution:settlement_manage', 'distribution:rule_view', 'distribution:rule_manage', 'distribution:account_view', 'distribution:account_display', 'distribution:payment_view', 'distribution:payment_manage', 'distribution:chat_view', 'distribution:chat_send' );