-- 渠道与产品的收付关系。一个渠道同一收付类型只保留一条。可重复执行。 SET NAMES utf8mb4; CREATE TABLE IF NOT EXISTS `srv_channel_product_map` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `channel_id` varchar(50) NOT NULL COMMENT '渠道ID,对应 srv_service_channel.id', `channel_code` varchar(64) DEFAULT NULL COMMENT '渠道编码,对应 srv_service_channel.channel_code', `product_id` bigint(20) NOT NULL COMMENT '产品ID,应付/应收时为价卡产品编号', `pay_type` varchar(10) NOT NULL COMMENT '收付类型,字典 bms_pay_type:AR应收 AP应付', `create_by` varchar(64) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_channel_pay_type` (`channel_id`, `pay_type`), KEY `idx_channel_product_map_product` (`product_id`), KEY `idx_channel_product_map_channel_code` (`channel_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='渠道产品关系映射'; SET @sql_channel_code = ( SELECT IF( COUNT(*) = 0, 'ALTER TABLE srv_channel_product_map ADD COLUMN channel_code varchar(64) DEFAULT NULL COMMENT ''渠道编码,对应 srv_service_channel.channel_code'' AFTER channel_id, ADD KEY idx_channel_product_map_channel_code (channel_code)', 'SELECT 1' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'srv_channel_product_map' AND COLUMN_NAME = 'channel_code' ); PREPARE stmt FROM @sql_channel_code; EXECUTE stmt; DEALLOCATE PREPARE stmt; UPDATE srv_channel_product_map m INNER JOIN srv_service_channel c ON c.id = m.channel_id SET m.channel_code = c.channel_code WHERE m.channel_code IS NULL OR m.channel_code = ''; SET @copy_sql = ( SELECT IF( COUNT(*) > 0, 'INSERT INTO srv_channel_product_map (channel_id, product_id, pay_type, create_time, update_time) SELECT c.channel_id, IFNULL(c.origin_id, c.product_id), ''AP'', c.update_time, c.update_time FROM srv_channel_pay c WHERE NOT EXISTS ( SELECT 1 FROM srv_channel_product_map m WHERE m.channel_id = c.channel_id AND m.pay_type = ''AP'' )', 'SELECT 1' ) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'srv_channel_pay' ); PREPARE stmt FROM @copy_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE IF EXISTS srv_channel_pay;