73 lines
3.1 KiB
SQL
73 lines
3.1 KiB
SQL
-- 渠道与产品的收付关系。一个渠道同一收付类型只保留一条。可重复执行。
|
||
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,应付/应收时为价卡产品编号',
|
||
`price_set_id` bigint(20) DEFAULT NULL COMMENT '应收套餐ID,对应 prc_price_set.price_set_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_price_set` (`price_set_id`),
|
||
KEY `idx_channel_product_map_channel_code` (`channel_code`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='渠道产品关系映射';
|
||
|
||
SET @sql = (
|
||
SELECT IF(
|
||
COUNT(*) = 0,
|
||
'ALTER TABLE srv_channel_product_map ADD COLUMN price_set_id bigint(20) DEFAULT NULL COMMENT ''应收套餐ID,对应 prc_price_set.price_set_id'' AFTER product_id, ADD KEY idx_channel_product_map_price_set (price_set_id)',
|
||
'SELECT 1'
|
||
)
|
||
FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'srv_channel_product_map' AND COLUMN_NAME = 'price_set_id'
|
||
);
|
||
PREPARE stmt FROM @sql;
|
||
EXECUTE stmt;
|
||
DEALLOCATE PREPARE stmt;
|
||
|
||
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;
|