-- 关联商户和门店信息的完整视图 CREATE OR REPLACE VIEW v_member_card_full AS SELECT mc.key_id, mc.card_no, mc.chip_id, mc.phone, mc.card_type, mc.status, mc.current_balance, mc.current_principal, mc.current_gift, mc.current_points, mc.discount_rate, mc.open_date, mc.expire_date, mc.last_consume_time, -- 商户信息 sm.company_fullname AS company_name, sm.company_shortname AS company_shortname, sm.contact_info AS company_contact, sm.contact_phone AS company_phone, -- 门店信息 sms.name AS store_name, sms.store_no, sms.phone AS store_phone, sms.address AS store_address, sms.contact AS store_contact, -- 配置信息 COALESCE(mmc_store.gift_consume_ratio, mmc_company.gift_consume_ratio, sys1.config_value) AS gift_consume_ratio, COALESCE(mmc_store.points_rate, mmc_company.points_rate, sys2.config_value) AS points_rate, COALESCE(mmc_store.points_exchange_rate, mmc_company.points_exchange_rate, sys3.config_value) AS points_exchange_rate FROM member_card mc LEFT JOIN sauna_merchant sm ON mc.fk_company_id = sm.key_id LEFT JOIN sauna_merchant_store sms ON mc.fk_store_id = sms.key_id LEFT JOIN member_merchant_config mmc_store ON mc.fk_store_id = mmc_store.fk_store_id AND mmc_store.is_enabled = 1 LEFT JOIN member_merchant_config mmc_company ON mc.fk_company_id = mmc_company.fk_company_id AND mmc_company.fk_store_id IS NULL AND mmc_company.is_enabled = 1 LEFT JOIN system_consume_config sys1 ON sys1.config_key = 'gift_consume_ratio' LEFT JOIN system_consume_config sys2 ON sys2.config_key = 'points_rate' LEFT JOIN system_consume_config sys3 ON sys3.config_key = 'points_exchange_rate';
⚙️ 核心建表SQL(完整)
-- ====================================================== -- 1. 会员卡主表(支持多商户多门店) -- ====================================================== CREATE TABLE member_card ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', key_id VARCHAR(50) NOT NULL COMMENT '业务主键ID', card_no VARCHAR(20) NOT NULL COMMENT '会员卡编号', chip_id VARCHAR(32) NOT NULL COMMENT '芯片ID唯一码', phone VARCHAR(11) NOT NULL COMMENT '绑定手机号', fk_company_id VARCHAR(50) NOT NULL COMMENT '所属公司ID', fk_store_id VARCHAR(50) NOT NULL COMMENT '所属门店ID', card_type TINYINT NOT NULL DEFAULT 1 COMMENT '卡类型:1-储值卡,2-计次卡', status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0-冻结,1-正常,2-挂失,3-注销', total_recharge BIGINT NOT NULL DEFAULT 0 COMMENT '累计充值金额', total_gift BIGINT NOT NULL DEFAULT 0 COMMENT '累计赠送金额', total_consume BIGINT NOT NULL DEFAULT 0 COMMENT '累计消费本金', total_gift_consume BIGINT NOT NULL DEFAULT 0 COMMENT '累计赠送消费', current_balance BIGINT NOT NULL DEFAULT 0 COMMENT '当前可用总余额', current_principal BIGINT NOT NULL DEFAULT 0 COMMENT '当前本金余额', current_gift BIGINT NOT NULL DEFAULT 0 COMMENT '当前赠送余额', total_points INT NOT NULL DEFAULT 0 COMMENT '累计获得积分', used_points INT NOT NULL DEFAULT 0 COMMENT '已使用积分', current_points INT NOT NULL DEFAULT 0 COMMENT '当前可用积分', discount_rate DECIMAL(5,2) NOT NULL DEFAULT 100.00 COMMENT '折扣比例', open_date DATETIME NOT NULL COMMENT '开卡日期', expire_date DATETIME DEFAULT NULL COMMENT '有效期', last_consume_time DATETIME DEFAULT NULL COMMENT '最后消费时间', sort_index INT DEFAULT 0 COMMENT '排序码', create_by VARCHAR(50) DEFAULT NULL COMMENT '创建人', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_by VARCHAR(50) DEFAULT NULL COMMENT '修改人', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (id), UNIQUE KEY uk_key_id (key_id), UNIQUE KEY uk_card_no (card_no), UNIQUE KEY uk_chip_id (chip_id), KEY idx_phone (phone), KEY idx_company_store (fk_company_id, fk_store_id), KEY idx_status (status), KEY idx_create_time (create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员卡主表'; -- ====================================================== -- 2. 会员开卡/充值记录表 -- ====================================================== CREATE TABLE member_recharge ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, key_id VARCHAR(50) NOT NULL COMMENT '业务主键ID', card_id BIGINT UNSIGNED NOT NULL COMMENT '会员卡自增ID', card_key_id VARCHAR(50) NOT NULL COMMENT '会员卡业务ID', recharge_no VARCHAR(32) NOT NULL COMMENT '充值流水号', recharge_type TINYINT NOT NULL COMMENT '类型:1-开卡,2-充值,3-赠送活动,4-手动调账', amount BIGINT NOT NULL DEFAULT 0 COMMENT '充值金额(本金)', gift_amount BIGINT NOT NULL DEFAULT 0 COMMENT '赠送金额', pay_method TINYINT DEFAULT NULL COMMENT '支付方式', operator_id VARCHAR(50) DEFAULT NULL COMMENT '操作人员ID', remark VARCHAR(255) DEFAULT NULL COMMENT '备注', recharge_time DATETIME NOT NULL COMMENT '充值时间', sort_index INT DEFAULT 0 COMMENT '排序码', create_by VARCHAR(50) DEFAULT NULL COMMENT '创建人', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_by VARCHAR(50) DEFAULT NULL COMMENT '修改人', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (id), UNIQUE KEY uk_key_id (key_id), UNIQUE KEY uk_recharge_no (recharge_no), KEY idx_card_id (card_id), KEY idx_card_key_id (card_key_id), KEY idx_recharge_time (recharge_time), KEY idx_create_time (create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值/开卡记录表'; -- ... 其余表结构请参见文档上方详细字段说明 ...
-- 多商户查询优化索引 CREATE INDEX idx_company_store ON member_card(fk_company_id, fk_store_id); CREATE INDEX idx_company_store_status ON member_card(fk_company_id, fk_store_id, status); CREATE INDEX idx_company_store_time ON member_card(fk_company_id, fk_store_id, create_time); -- 余额日志查询优化 CREATE INDEX idx_balance_log_card_time ON member_balance_log(card_key_id, create_time DESC); CREATE INDEX idx_balance_log_company ON member_balance_log(card_key_id, create_time DESC); -- 消费记录优化 CREATE INDEX idx_consume_card_time ON member_consume(card_key_id, consume_time DESC); CREATE INDEX idx_consume_company_time ON member_consume(card_key_id, consume_time DESC); -- 操作日志查询 CREATE INDEX idx_oplog_card_time ON member_operation_log(card_key_id, operation_time DESC); CREATE INDEX idx_oplog_type_time ON member_operation_log(operation_type, operation_time DESC);