重构产品价和红线价功能
This commit is contained in:
+73
-161
@@ -287,138 +287,9 @@ CREATE TABLE `ar_export_template` (
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应收账单导出模板管理';
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`product`
|
||||
-- product / product_country / redline_* removed: use prc_price_set_version+product+detail with price_type
|
||||
-- ----------------------------
|
||||
CREATE TABLE `product` (
|
||||
`product_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '产品ID',
|
||||
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品对接代码,如 WSP037',
|
||||
`product_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品名称',
|
||||
`service_level` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '时效等级:标准等',
|
||||
`cargo_attr` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '走货属性:普货/F普货/带电/敏感等',
|
||||
`dest_region` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '目的区域:欧盟等',
|
||||
`update_note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新内容说明',
|
||||
`tax_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'TAX_INCLUDED' COMMENT 'TAX_INCLUDED包税 TAX_EXCLUDED不包税',
|
||||
`effective_date` datetime DEFAULT NULL COMMENT '目录生效时间(到小时)',
|
||||
`expire_date` datetime DEFAULT NULL COMMENT '产品失效时间(空=长期;下一版生效时间=本版失效时间)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
`source_sheet` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '来源Excel sheet名',
|
||||
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`tms_id` int(11) DEFAULT NULL COMMENT '多租户ID',
|
||||
`created_by` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_by` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`product_id`) USING BTREE,
|
||||
UNIQUE KEY `uk_product_code_eff_is_del` (`product_code`,`effective_date`,`is_del`),
|
||||
KEY `idx_tax_status` (`tax_mode`,`status`) USING BTREE,
|
||||
KEY `idx_product_code` (`product_code`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品主表-来自产品目录';
|
||||
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`product_country`
|
||||
-- ----------------------------
|
||||
CREATE TABLE `product_country` (
|
||||
`detail_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '明细ID',
|
||||
`product_id` bigint(20) DEFAULT NULL COMMENT '产品ID(product.product_id,绑定具体产品版本行)',
|
||||
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品代码',
|
||||
`country_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '国家中文名',
|
||||
`country_code` char(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'ISO2,可空待补齐',
|
||||
`zone_id` bigint(20) DEFAULT NULL COMMENT 'prc_zone.zone_id',
|
||||
`zone_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'zone code e.g. Z1',
|
||||
`zone_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'zone display name',
|
||||
`weight_min` decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)',
|
||||
`weight_max` decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)',
|
||||
`freight_price` decimal(10,4) DEFAULT NULL COMMENT '运费 RMB/KG',
|
||||
`registration_fee` decimal(10,2) DEFAULT NULL COMMENT '挂号费 RMB/票',
|
||||
`size_limit` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '尺寸限制',
|
||||
`last_mile` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '尾程派送说明',
|
||||
`lead_time` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '参考时效',
|
||||
`effective_date` datetime DEFAULT NULL COMMENT '产品价表生效时间(到小时)',
|
||||
`expire_date` datetime DEFAULT NULL COMMENT '失效时间(空=开放;下一版导入生效时间=本版失效时间)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`detail_id`) USING BTREE,
|
||||
UNIQUE KEY `uk_product_country_zone_weight_eff_is_del` (`product_code`,`country_name`,`zone_code`,`weight_min`,`weight_max`,`effective_date`,`is_del`),
|
||||
KEY `idx_country_code` (`country_code`) USING BTREE,
|
||||
KEY `idx_weight_match` (`product_code`,`country_code`,`weight_min`,`weight_max`) USING BTREE,
|
||||
KEY `idx_product_eff` (`product_code`,`effective_date`,`expire_date`),
|
||||
KEY `idx_product_country_pid` (`product_id`),
|
||||
KEY `idx_product_country_zone` (`zone_id`),
|
||||
KEY `idx_product_country_zone_code` (`country_code`,`zone_code`),
|
||||
CONSTRAINT `fk_product_country_pid` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=1609 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品国家服务明细-重量段+尺寸/尾程/时效(不含运费)';
|
||||
|
||||
-- redline_product / redline_product_country: mirror of product / product_country
|
||||
-- Run once on existing DB
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `redline_product` (
|
||||
`product_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '红线价产品ID',
|
||||
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品对接代码,如 WSP037',
|
||||
`product_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品名称',
|
||||
`service_level` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '时效等级',
|
||||
`cargo_attr` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '走货属性',
|
||||
`dest_region` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '目的区域',
|
||||
`update_note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新内容说明',
|
||||
`tax_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'TAX_INCLUDED' COMMENT 'TAX_INCLUDED包税 TAX_EXCLUDED不包税',
|
||||
`effective_date` datetime DEFAULT NULL COMMENT '目录生效时间(到小时)',
|
||||
`expire_date` datetime DEFAULT NULL COMMENT '失效时间(空=长期)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
`source_sheet` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '来源Excel sheet名',
|
||||
`pef_id` bigint(20) DEFAULT NULL COMMENT '关联导入价表Excel附件 prc_price_excel_file.pef_id',
|
||||
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`tms_id` int(11) DEFAULT NULL COMMENT '多租户ID',
|
||||
`created_by` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_by` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`product_id`) USING BTREE,
|
||||
UNIQUE KEY `uk_redline_product_code_eff_is_del` (`product_code`,`effective_date`,`is_del`),
|
||||
KEY `idx_redline_tax_status` (`tax_mode`,`status`) USING BTREE,
|
||||
KEY `idx_redline_product_code` (`product_code`),
|
||||
KEY `idx_redline_product_pef_id` (`pef_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红线价产品主表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `redline_product_country` (
|
||||
`detail_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '明细ID',
|
||||
`product_id` bigint(20) DEFAULT NULL COMMENT '红线价产品ID redline_product.product_id',
|
||||
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品代码',
|
||||
`country_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '国家中文名',
|
||||
`country_code` char(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'ISO2',
|
||||
`zone_id` bigint(20) DEFAULT NULL COMMENT 'prc_zone.zone_id',
|
||||
`zone_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`zone_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`weight_min` decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)',
|
||||
`weight_max` decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)',
|
||||
`freight_price` decimal(10,4) DEFAULT NULL COMMENT '运费 RMB/KG',
|
||||
`registration_fee` decimal(10,2) DEFAULT NULL COMMENT '挂号费 RMB/票',
|
||||
`size_limit` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`last_mile` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`lead_time` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`effective_date` datetime DEFAULT NULL COMMENT '生效时间(到小时)',
|
||||
`expire_date` datetime DEFAULT NULL COMMENT '失效时间(空=开放)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`detail_id`) USING BTREE,
|
||||
UNIQUE KEY `uk_redline_country_zone_weight_eff_is_del` (`product_code`,`country_name`,`zone_code`,`weight_min`,`weight_max`,`effective_date`,`is_del`),
|
||||
KEY `idx_redline_country_code` (`country_code`) USING BTREE,
|
||||
KEY `idx_redline_weight_match` (`product_code`,`country_code`,`weight_min`,`weight_max`) USING BTREE,
|
||||
KEY `idx_redline_product_eff` (`product_code`,`effective_date`,`expire_date`),
|
||||
KEY `idx_redline_country_pid` (`product_id`),
|
||||
KEY `idx_redline_country_zone` (`zone_id`),
|
||||
CONSTRAINT `fk_redline_country_pid` FOREIGN KEY (`product_id`) REFERENCES `redline_product` (`product_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红线价国家服务明细';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`region`
|
||||
-- ----------------------------
|
||||
CREATE TABLE `region` (
|
||||
`region_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '区域ID',
|
||||
@@ -1362,9 +1233,9 @@ CREATE TABLE `prc_price_set` (
|
||||
-- ----------------------------
|
||||
CREATE TABLE `prc_price_set_detail` (
|
||||
`psd_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '套餐明细id',
|
||||
`price_set_id` bigint(20) NOT NULL COMMENT '价格套餐id',
|
||||
`psv_id` bigint(20) DEFAULT NULL COMMENT '套餐版本id',
|
||||
`psp_id` bigint(20) DEFAULT NULL COMMENT '套餐产品主表id prc_price_set_product.psp_id',
|
||||
`price_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'SALES' COMMENT '价格类型 PRODUCT/REDLINE/SALES',
|
||||
`psv_id` bigint(20) DEFAULT NULL COMMENT '版本id',
|
||||
`psp_id` bigint(20) DEFAULT NULL COMMENT '产品主表id prc_price_set_product.psp_id',
|
||||
`product_code` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品代码',
|
||||
`product_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '产品名称',
|
||||
`country_code` char(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '国家二字码',
|
||||
@@ -1377,62 +1248,97 @@ CREATE TABLE `prc_price_set_detail` (
|
||||
`weight_label` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '重量段展示',
|
||||
`weight_min` decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)',
|
||||
`weight_max` decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)',
|
||||
`product_country_id` bigint(20) DEFAULT NULL COMMENT 'product_country.detail_id',
|
||||
`product_country_id` bigint(20) DEFAULT NULL COMMENT '迁移来源旧product_country.detail_id(可空)',
|
||||
`fv_value` decimal(10,4) DEFAULT NULL COMMENT '运费单价 RMB/KG',
|
||||
`fv_registration_fee` decimal(10,2) DEFAULT NULL COMMENT '挂号费 RMB/票',
|
||||
`size_limit` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '尺寸限制',
|
||||
`last_mile` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '尾程派送说明',
|
||||
`lead_time` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '参考时效',
|
||||
`discount_value` decimal(5,2) DEFAULT NULL COMMENT '明细折扣百分数,DISCOUNT 可覆盖默认',
|
||||
`round_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'HALF_UP' COMMENT 'round mode (dict bms_round_mode)',
|
||||
`pr_id` int(11) DEFAULT NULL COMMENT '关联价格规则id',
|
||||
`effective_date` date DEFAULT NULL COMMENT '生效日期',
|
||||
`expire_date` date DEFAULT NULL COMMENT '失效日期(空=长期)',
|
||||
`effective_date` datetime DEFAULT NULL COMMENT '生效时间',
|
||||
`expire_date` datetime DEFAULT NULL COMMENT '失效时间(空=长期)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '状态 0草稿 3待生效 1已生效 2已失效',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
`create_time` datetime DEFAULT NULL,
|
||||
`update_time` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`psd_id`),
|
||||
KEY `idx_psd_set` (`price_set_id`),
|
||||
KEY `idx_psd_product` (`price_set_id`,`product_code`,`country_code`),
|
||||
KEY `idx_psd_product` (`psv_id`,`product_code`,`country_code`),
|
||||
KEY `idx_psd_product_country` (`product_country_id`),
|
||||
KEY `idx_psd_zone` (`zone_id`),
|
||||
KEY `idx_psd_country_zone` (`price_set_id`,`product_code`,`country_code`,`zone_code`),
|
||||
KEY `idx_psd_country_zone` (`psv_id`,`product_code`,`country_code`,`zone_code`),
|
||||
KEY `idx_psd_psv` (`psv_id`),
|
||||
KEY `idx_psd_psp` (`psp_id`),
|
||||
KEY `idx_psd_weight_match` (`price_set_id`,`product_code`,`country_code`,`weight_min`,`weight_max`),
|
||||
KEY `idx_psd_eff` (`price_set_id`,`effective_date`,`expire_date`),
|
||||
CONSTRAINT `fk_psd_psv` FOREIGN KEY (`psv_id`) REFERENCES `prc_price_set_version` (`psv_id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_psd_set` FOREIGN KEY (`price_set_id`) REFERENCES `prc_price_set` (`price_set_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4095 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格套餐明细-固定价/折扣范围';
|
||||
KEY `idx_psd_type_psv` (`price_type`,`psv_id`),
|
||||
KEY `idx_psd_weight_match` (`psv_id`,`product_code`,`country_code`,`weight_min`,`weight_max`),
|
||||
KEY `idx_psd_eff` (`psv_id`,`effective_date`,`expire_date`),
|
||||
KEY `idx_psd_is_del` (`is_del`),
|
||||
CONSTRAINT `fk_psd_psv` FOREIGN KEY (`psv_id`) REFERENCES `prc_price_set_version` (`psv_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4095 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格明细(三价统一,归属版本)';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`prc_price_set_version`
|
||||
-- ----------------------------
|
||||
CREATE TABLE `prc_price_set_version` (
|
||||
`psv_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '套餐版本id',
|
||||
`price_set_id` bigint(20) NOT NULL COMMENT '价格套餐id',
|
||||
`price_set_id` bigint(20) DEFAULT NULL COMMENT '价格套餐id(弱关联;PRODUCT/REDLINE为空)',
|
||||
`price_set_id_key` bigint(20) GENERATED ALWAYS AS (IFNULL(`price_set_id`,0)) STORED COMMENT '唯一键辅助:空price_set_id视为0',
|
||||
`price_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'SALES' COMMENT '价格类型 PRODUCT产品价/REDLINE红线价/SALES销售价',
|
||||
`version_no` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '版本号 V1/V2,自动+1',
|
||||
`version_seq` int(11) NOT NULL COMMENT '版本序号,用于自动+1',
|
||||
`effective_time` datetime DEFAULT NULL COMMENT '生效时间',
|
||||
`expire_time` datetime DEFAULT NULL COMMENT '失效时间(空=长期;下一版本启动时写入该启动时间)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0 draft 3 pending 1 effect 2 expired',
|
||||
`price_build_mode` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建价格方式 PULL=拉取产品库 IMPORT=Excel导入',
|
||||
|
||||
`created_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建人',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`updated_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新人',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`psv_id`),
|
||||
UNIQUE KEY `uk_psv_set_no` (`price_set_id`,`version_no`),
|
||||
UNIQUE KEY `uk_psv_set_seq` (`price_set_id`,`version_seq`),
|
||||
UNIQUE KEY `uk_psv_type_set_no` (`price_type`,`price_set_id_key`,`version_no`),
|
||||
UNIQUE KEY `uk_psv_type_set_seq` (`price_type`,`price_set_id_key`,`version_seq`),
|
||||
KEY `idx_psv_set_eff` (`price_set_id`,`effective_time`),
|
||||
KEY `idx_psv_status` (`status`),
|
||||
CONSTRAINT `fk_psv_set` FOREIGN KEY (`price_set_id`) REFERENCES `prc_price_set` (`price_set_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格套餐版本';
|
||||
KEY `idx_psv_type_eff` (`price_type`,`status`,`effective_time`),
|
||||
KEY `idx_psv_status` (`status`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格版本(三价统一;与套餐弱关联)';
|
||||
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`prc_price_excel_file`
|
||||
-- ----------------------------
|
||||
CREATE TABLE `prc_price_excel_file` (
|
||||
`pef_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`excel_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '价表类型 PRODUCT/REDLINE/SALES',
|
||||
`psv_id` bigint(20) DEFAULT NULL COMMENT '价格版本id prc_price_set_version.psv_id',
|
||||
`effective_time` datetime NOT NULL COMMENT '生效时间',
|
||||
`file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件原始名称',
|
||||
`file_path` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件存储路径',
|
||||
`file_size` bigint(20) DEFAULT 0 COMMENT '文件大小(字节)',
|
||||
`content_type` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '',
|
||||
`file_extension` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT '',
|
||||
`oss_id` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`sheet_names` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`created_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '',
|
||||
`create_time` datetime DEFAULT NULL,
|
||||
`updated_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '',
|
||||
`update_time` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`pef_id`),
|
||||
KEY `idx_pef_type_eff` (`excel_type`,`effective_time`),
|
||||
KEY `idx_pef_psv` (`psv_id`),
|
||||
KEY `idx_pef_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='导入价表Excel附件';
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`prc_price_set_product`
|
||||
-- ----------------------------
|
||||
CREATE TABLE `prc_price_set_product` (
|
||||
`psp_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '套餐产品主表id',
|
||||
`price_set_id` bigint(20) NOT NULL COMMENT '价格套餐id',
|
||||
`psv_id` bigint(20) NOT NULL COMMENT '套餐版本id',
|
||||
`price_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'SALES' COMMENT '价格类型 PRODUCT/REDLINE/SALES',
|
||||
`psv_id` bigint(20) NOT NULL COMMENT '版本id',
|
||||
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品对接代码',
|
||||
`product_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '产品名称',
|
||||
`service_level` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '时效等级',
|
||||
@@ -1440,18 +1346,24 @@ CREATE TABLE `prc_price_set_product` (
|
||||
`dest_region` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '目的区域',
|
||||
`update_note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新说明',
|
||||
`tax_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'TAX_INCLUDED' COMMENT 'TAX_INCLUDED包税 TAX_EXCLUDED不包税',
|
||||
`source_product_id` bigint(20) DEFAULT NULL COMMENT '来源产品库 product.product_id',
|
||||
`effective_time` datetime DEFAULT NULL COMMENT '生效时间',
|
||||
`expire_time` datetime DEFAULT NULL COMMENT '失效时间(空=长期)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '状态 0草稿 3待生效 1已生效 2已失效',
|
||||
`source_product_id` bigint(20) DEFAULT NULL COMMENT '迁移来源旧product.product_id(可空)',
|
||||
`source_sheet` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '来源Excel sheet',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
`active_product_code` varchar(20) COLLATE utf8mb4_unicode_ci GENERATED ALWAYS AS (CASE WHEN IFNULL(`is_del`,'0') = '0' THEN `product_code` ELSE NULL END) STORED COMMENT '未删除时等于product_code,用于唯一约束',
|
||||
`create_time` datetime DEFAULT NULL,
|
||||
`update_time` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`psp_id`),
|
||||
UNIQUE KEY `uk_psp_psv_code` (`psv_id`,`product_code`),
|
||||
KEY `idx_psp_set` (`price_set_id`),
|
||||
UNIQUE KEY `uk_psp_psv_active_code` (`psv_id`,`active_product_code`),
|
||||
KEY `idx_psp_is_del` (`is_del`),
|
||||
KEY `idx_psp_psv` (`psv_id`),
|
||||
KEY `idx_psp_type_psv` (`price_type`,`psv_id`),
|
||||
KEY `idx_psp_code` (`product_code`),
|
||||
CONSTRAINT `fk_psp_psv` FOREIGN KEY (`psv_id`) REFERENCES `prc_price_set_version` (`psv_id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_psp_set` FOREIGN KEY (`price_set_id`) REFERENCES `prc_price_set` (`price_set_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格套餐产品主表-与产品库快照独立';
|
||||
CONSTRAINT `fk_psp_psv` FOREIGN KEY (`psv_id`) REFERENCES `prc_price_set_version` (`psv_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格产品主表(三价统一,归属版本)';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 表结构:`prc_quote`
|
||||
@@ -1561,9 +1473,9 @@ CREATE TABLE `prc_surcharge` (
|
||||
CREATE TABLE `prc_surcharge_rel` (
|
||||
`rel_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '关联ID',
|
||||
`sc_id` bigint(20) NOT NULL COMMENT '附加费配置ID prc_surcharge.sc_id',
|
||||
`product_id` bigint(20) NOT NULL COMMENT '产品ID或套餐产品ID:PRODUCT/REDLINE=product.product_id;SALES=prc_price_set_product.psp_id',
|
||||
`product_id` bigint(20) NOT NULL COMMENT '\u4ea7\u54c1ID:均为prc_price_set_product.psp_id(PRODUCT/REDLINE/SALES)',
|
||||
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品对接代码 product.product_code',
|
||||
`detail_id` bigint(20) DEFAULT NULL COMMENT '明细ID:PRODUCT/REDLINE=product_country.detail_id(空=产品全部);SALES=prc_price_set_detail.psd_id',
|
||||
`detail_id` bigint(20) DEFAULT NULL COMMENT '\u660e\u7ec6ID:均为prc_price_set_detail.psd_id(空=产品全部)',
|
||||
`price_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'PRODUCT' COMMENT '价格类型 PRODUCT产品价/SALES销售价/REDLINE红线价',
|
||||
`country_code` char(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '适用国家ISO2(空=全部)',
|
||||
`is_del` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||
|
||||
@@ -1,37 +1,27 @@
|
||||
-- ------------------------------------------------------------
|
||||
-- 导入价表 Excel 附件记录(建表/字段)
|
||||
-- 用途:产品价/红线价/销售价 Excel 导入时落库文件元数据
|
||||
-- 关联:product.pef_id、prc_price_set_product.pef_id -> prc_price_excel_file.pef_id
|
||||
-- 导入价表 Excel 附件记录
|
||||
-- 关联:prc_price_excel_file.psv_id -> prc_price_set_version.psv_id
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
-- 1) 主表:导入价表 Excel 附件
|
||||
CREATE TABLE IF NOT EXISTS prc_price_excel_file (
|
||||
pef_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
excel_type varchar(20) NOT NULL COMMENT '价表类型 PRODUCT=产品价 REDLINE=红线价 SALES=销售价',
|
||||
effective_time datetime NOT NULL COMMENT '生效时间(导入时选择/解析)',
|
||||
excel_type varchar(20) NOT NULL COMMENT '价表类型 PRODUCT/REDLINE/SALES',
|
||||
psv_id bigint(20) DEFAULT NULL COMMENT '价格版本id prc_price_set_version.psv_id',
|
||||
effective_time datetime NOT NULL COMMENT '生效时间',
|
||||
file_name varchar(255) NOT NULL COMMENT '文件原始名称',
|
||||
file_path varchar(500) NOT NULL COMMENT '文件存储路径(相对路径或完整URL)',
|
||||
file_path varchar(500) NOT NULL COMMENT '文件存储路径',
|
||||
file_size bigint(20) DEFAULT 0 COMMENT '文件大小(字节)',
|
||||
content_type varchar(100) DEFAULT '' COMMENT 'MIME类型',
|
||||
file_extension varchar(20) DEFAULT '' COMMENT '扩展名,如 xlsx/xls',
|
||||
oss_id varchar(64) DEFAULT NULL COMMENT 'OSS/对象存储ID(可空)',
|
||||
sheet_names varchar(1000) DEFAULT NULL COMMENT '导入涉及的 sheet 名(多个逗号分隔,可空)',
|
||||
remark varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
created_by varchar(64) DEFAULT '' COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
updated_by varchar(64) DEFAULT '' COMMENT '更新人',
|
||||
update_time datetime DEFAULT NULL COMMENT '更新时间',
|
||||
content_type varchar(100) DEFAULT '' COMMENT 'MIME',
|
||||
file_extension varchar(20) DEFAULT '' COMMENT '扩展名',
|
||||
oss_id varchar(64) DEFAULT NULL,
|
||||
sheet_names varchar(1000) DEFAULT NULL,
|
||||
remark varchar(500) DEFAULT NULL,
|
||||
created_by varchar(64) DEFAULT '',
|
||||
create_time datetime DEFAULT NULL,
|
||||
updated_by varchar(64) DEFAULT '',
|
||||
update_time datetime DEFAULT NULL,
|
||||
PRIMARY KEY (pef_id),
|
||||
KEY idx_pef_type_eff (excel_type, effective_time),
|
||||
KEY idx_pef_psv (psv_id),
|
||||
KEY idx_pef_create_time (create_time)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='导入价表Excel附件';
|
||||
|
||||
-- 2) 产品主表:关联导入附件
|
||||
ALTER TABLE product
|
||||
ADD COLUMN pef_id bigint(20) DEFAULT NULL COMMENT '关联导入价表Excel附件 prc_price_excel_file.pef_id' AFTER source_sheet,
|
||||
ADD KEY idx_product_pef_id (pef_id);
|
||||
|
||||
-- 3) 套餐产品表:关联导入附件(销售价 Excel 建价)
|
||||
ALTER TABLE prc_price_set_product
|
||||
ADD COLUMN pef_id bigint(20) DEFAULT NULL COMMENT '关联导入价表Excel附件 prc_price_excel_file.pef_id' AFTER source_sheet,
|
||||
ADD KEY idx_psp_pef_id (pef_id);
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
-- Move Excel attachment link: product.pef_id -> excel_file.psv_id
|
||||
SET NAMES utf8mb4;
|
||||
SET @db := DATABASE();
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_excel_file ADD COLUMN psv_id bigint(20) DEFAULT NULL COMMENT ''价格版本id prc_price_set_version.psv_id'' AFTER excel_type, ADD KEY idx_pef_psv (psv_id)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_excel_file' AND COLUMN_NAME = 'psv_id'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @has_psp_pef := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'pef_id'
|
||||
);
|
||||
|
||||
SET @sql := IF(@has_psp_pef > 0,
|
||||
'UPDATE prc_price_excel_file f INNER JOIN (SELECT pef_id, MIN(psv_id) AS psv_id FROM prc_price_set_product WHERE pef_id IS NOT NULL GROUP BY pef_id) x ON x.pef_id = f.pef_id SET f.psv_id = IFNULL(f.psv_id, x.psv_id)',
|
||||
'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0,
|
||||
'ALTER TABLE prc_price_set_product DROP INDEX idx_psp_pef_id',
|
||||
'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND INDEX_NAME = 'idx_psp_pef_id'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0,
|
||||
'ALTER TABLE prc_price_set_product DROP COLUMN pef_id',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'pef_id'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
@@ -0,0 +1,52 @@
|
||||
-- Add soft-delete is_del to prc_price_set_product / prc_price_set_detail
|
||||
SET NAMES utf8mb4;
|
||||
SET @db := DATABASE();
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD COLUMN is_del char(1) NOT NULL DEFAULT ''0'' COMMENT ''是否删除 0未删除 1已删除'' AFTER pef_id, ADD KEY idx_psp_is_del (is_del)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'is_del'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_detail ADD COLUMN is_del char(1) NOT NULL DEFAULT ''0'' COMMENT ''是否删除 0未删除 1已删除'' AFTER expire_date, ADD KEY idx_psd_is_del (is_del)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'is_del'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
UPDATE prc_price_set_product SET is_del = '0' WHERE is_del IS NULL OR is_del = '';
|
||||
UPDATE prc_price_set_detail SET is_del = '0' WHERE is_del IS NULL OR is_del = '';
|
||||
|
||||
-- Active-only unique: soft-deleted rows do not block re-insert of same product_code
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0,
|
||||
'ALTER TABLE prc_price_set_product DROP INDEX uk_psp_psv_code',
|
||||
'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND INDEX_NAME = 'uk_psp_psv_code'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD COLUMN active_product_code varchar(20) GENERATED ALWAYS AS (CASE WHEN IFNULL(is_del,''0'') = ''0'' THEN product_code ELSE NULL END) STORED COMMENT ''未删除时等于product_code,用于唯一约束''',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'active_product_code'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD UNIQUE KEY uk_psp_psv_active_code (psv_id, active_product_code)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND INDEX_NAME = 'uk_psp_psv_active_code'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
@@ -0,0 +1,75 @@
|
||||
-- product effective/expire time and status; detail status; detail dates keep time
|
||||
SET NAMES utf8mb4;
|
||||
SET @db := DATABASE();
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD COLUMN effective_time datetime DEFAULT NULL COMMENT ''生效时间'' AFTER tax_mode',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'effective_time'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD COLUMN expire_time datetime DEFAULT NULL COMMENT ''失效时间(空=长期)'' AFTER effective_time',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'expire_time'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD COLUMN status char(1) NOT NULL DEFAULT ''0'' COMMENT ''状态 0草稿 3待生效 1已生效 2已失效'' AFTER expire_time',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'status'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- If status was added before expire_time, move status after expire_time when both exist
|
||||
SET @has_status := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'status'
|
||||
);
|
||||
SET @has_expire := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'expire_time'
|
||||
);
|
||||
SET @sql := (
|
||||
SELECT IF(@has_status > 0 AND @has_expire > 0,
|
||||
'ALTER TABLE prc_price_set_product MODIFY COLUMN status char(1) NOT NULL DEFAULT ''0'' COMMENT ''状态 0草稿 3待生效 1已生效 2已失效'' AFTER expire_time',
|
||||
'SELECT 1')
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
ALTER TABLE prc_price_set_detail
|
||||
MODIFY COLUMN effective_date datetime DEFAULT NULL COMMENT '生效时间',
|
||||
MODIFY COLUMN expire_date datetime DEFAULT NULL COMMENT '失效时间(空=长期)';
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_detail ADD COLUMN status char(1) NOT NULL DEFAULT ''0'' COMMENT ''状态 0草稿 3待生效 1已生效 2已失效'' AFTER expire_date',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'status'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
UPDATE prc_price_set_product p
|
||||
INNER JOIN prc_price_set_version v ON v.psv_id = p.psv_id
|
||||
SET p.effective_time = v.effective_time,
|
||||
p.expire_time = v.expire_time,
|
||||
p.status = v.status
|
||||
WHERE p.price_type IN ('PRODUCT', 'REDLINE')
|
||||
AND v.price_set_id IS NULL;
|
||||
|
||||
UPDATE prc_price_set_detail d
|
||||
INNER JOIN prc_price_set_version v ON v.psv_id = d.psv_id
|
||||
SET d.effective_date = v.effective_time,
|
||||
d.expire_date = v.expire_time,
|
||||
d.status = v.status
|
||||
WHERE d.price_type IN ('PRODUCT', 'REDLINE')
|
||||
AND v.price_set_id IS NULL;
|
||||
@@ -0,0 +1,514 @@
|
||||
-- Unify PRODUCT / REDLINE / SALES into prc_price_set_version + product/detail
|
||||
-- Run once on existing DB. Safe-ish: checks columns via information_schema patterns where needed.
|
||||
-- price_type: PRODUCT | REDLINE | SALES
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ========== 1) prc_price_set_version: price_type + soft FK ==========
|
||||
SET @db := DATABASE();
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_version ADD COLUMN price_type varchar(20) NOT NULL DEFAULT ''SALES'' COMMENT ''价格类型 PRODUCT产品价/REDLINE红线价/SALES销售价'' AFTER price_set_id',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND COLUMN_NAME = 'price_type'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
UPDATE prc_price_set_version SET price_type = 'SALES' WHERE price_type IS NULL OR price_type = '';
|
||||
|
||||
-- drop FK fk_psv_set if exists
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0,
|
||||
'ALTER TABLE prc_price_set_version DROP FOREIGN KEY fk_psv_set',
|
||||
'SELECT 1')
|
||||
FROM information_schema.TABLE_CONSTRAINTS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND CONSTRAINT_NAME = 'fk_psv_set'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- price_set_id nullable
|
||||
ALTER TABLE prc_price_set_version MODIFY COLUMN price_set_id bigint(20) DEFAULT NULL COMMENT '价格套餐id(弱关联;PRODUCT/REDLINE为空)';
|
||||
|
||||
-- generated key for uniqueness (NULL price_set_id -> 0)
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_version ADD COLUMN price_set_id_key bigint(20) GENERATED ALWAYS AS (IFNULL(price_set_id,0)) STORED COMMENT ''唯一键辅助:空price_set_id视为0'' AFTER price_set_id',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND COLUMN_NAME = 'price_set_id_key'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- replace unique keys
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0, 'ALTER TABLE prc_price_set_version DROP INDEX uk_psv_set_no', 'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND INDEX_NAME = 'uk_psv_set_no' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0, 'ALTER TABLE prc_price_set_version DROP INDEX uk_psv_set_seq', 'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND INDEX_NAME = 'uk_psv_set_seq' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_version ADD UNIQUE KEY uk_psv_type_set_no (price_type, price_set_id_key, version_no)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND INDEX_NAME = 'uk_psv_type_set_no' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_version ADD UNIQUE KEY uk_psv_type_set_seq (price_type, price_set_id_key, version_seq)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND INDEX_NAME = 'uk_psv_type_set_seq' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_version ADD KEY idx_psv_type_eff (price_type, status, effective_time)',
|
||||
'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND INDEX_NAME = 'idx_psv_type_eff' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ========== 2) prc_price_set_product: price_type, drop price_set_id ==========
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_product ADD COLUMN price_type varchar(20) NOT NULL DEFAULT ''SALES'' COMMENT ''价格类型 PRODUCT/REDLINE/SALES'' AFTER psp_id',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'price_type'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
UPDATE prc_price_set_product psp
|
||||
INNER JOIN prc_price_set_version v ON v.psv_id = psp.psv_id
|
||||
SET psp.price_type = IFNULL(NULLIF(v.price_type,''), 'SALES')
|
||||
WHERE psp.price_type IS NULL OR psp.price_type = '' OR psp.price_type = 'SALES';
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0, 'ALTER TABLE prc_price_set_product DROP FOREIGN KEY fk_psp_set', 'SELECT 1')
|
||||
FROM information_schema.TABLE_CONSTRAINTS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND CONSTRAINT_NAME = 'fk_psp_set'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0, 'ALTER TABLE prc_price_set_product DROP COLUMN price_set_id', 'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND COLUMN_NAME = 'price_set_id'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0, 'ALTER TABLE prc_price_set_product ADD KEY idx_psp_type_psv (price_type, psv_id)', 'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_product' AND INDEX_NAME = 'idx_psp_type_psv' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ========== 3) prc_price_set_detail: price_type, catalog cols, drop price_set_id ==========
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_detail ADD COLUMN price_type varchar(20) NOT NULL DEFAULT ''SALES'' COMMENT ''价格类型 PRODUCT/REDLINE/SALES'' AFTER psd_id',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'price_type'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
UPDATE prc_price_set_detail d
|
||||
INNER JOIN prc_price_set_version v ON v.psv_id = d.psv_id
|
||||
SET d.price_type = IFNULL(NULLIF(v.price_type,''), 'SALES')
|
||||
WHERE d.psv_id IS NOT NULL;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_detail ADD COLUMN size_limit varchar(1000) DEFAULT NULL COMMENT ''尺寸限制'' AFTER fv_registration_fee',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'size_limit'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_detail ADD COLUMN last_mile varchar(500) DEFAULT NULL COMMENT ''尾程派送说明'' AFTER size_limit',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'last_mile'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE prc_price_set_detail ADD COLUMN lead_time varchar(100) DEFAULT NULL COMMENT ''参考时效'' AFTER last_mile',
|
||||
'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'lead_time'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0, 'ALTER TABLE prc_price_set_detail DROP FOREIGN KEY fk_psd_set', 'SELECT 1')
|
||||
FROM information_schema.TABLE_CONSTRAINTS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND CONSTRAINT_NAME = 'fk_psd_set'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) > 0, 'ALTER TABLE prc_price_set_detail DROP COLUMN price_set_id', 'SELECT 1')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'price_set_id'
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := (
|
||||
SELECT IF(COUNT(*) = 0, 'ALTER TABLE prc_price_set_detail ADD KEY idx_psd_type_psv (price_type, psv_id)', 'SELECT 1')
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND INDEX_NAME = 'idx_psd_type_psv' LIMIT 1
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ========== 4) Migrate PRODUCT catalog -> version snapshot ==========
|
||||
-- Create one version per distinct effective_date group from active product rows (status in 0,1),
|
||||
-- collapsed into global versions ordered by effective_date.
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_product_version_map;
|
||||
CREATE TEMPORARY TABLE tmp_product_version_map (
|
||||
old_product_id bigint(20) NOT NULL PRIMARY KEY,
|
||||
new_psv_id bigint(20) NOT NULL,
|
||||
new_psp_id bigint(20) DEFAULT NULL
|
||||
);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_product_eff;
|
||||
CREATE TEMPORARY TABLE tmp_product_eff AS
|
||||
SELECT DISTINCT effective_date
|
||||
FROM product
|
||||
WHERE IFNULL(is_del,'0') = '0'
|
||||
ORDER BY IFNULL(effective_date, '1970-01-01');
|
||||
|
||||
-- Build PRODUCT versions from distinct effective dates (empty catalog skipped)
|
||||
INSERT INTO prc_price_set_version (
|
||||
price_set_id, price_type, version_no, version_seq, effective_time, expire_time, status,
|
||||
price_build_mode, created_by, create_time
|
||||
)
|
||||
SELECT
|
||||
NULL,
|
||||
'PRODUCT',
|
||||
CONCAT('V', (@seq := @seq + 1)),
|
||||
@seq,
|
||||
e.effective_date,
|
||||
NULL,
|
||||
CASE
|
||||
WHEN e.effective_date IS NOT NULL AND e.effective_date > NOW() THEN '0'
|
||||
ELSE '1'
|
||||
END,
|
||||
'IMPORT',
|
||||
'migrate',
|
||||
NOW()
|
||||
FROM tmp_product_eff e
|
||||
CROSS JOIN (SELECT @seq := IFNULL((SELECT MAX(version_seq) FROM prc_price_set_version WHERE price_type='PRODUCT' AND IFNULL(price_set_id,0)=0), 0)) s
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM prc_price_set_version v
|
||||
WHERE v.price_type = 'PRODUCT' AND IFNULL(v.price_set_id,0) = 0
|
||||
)
|
||||
ORDER BY IFNULL(e.effective_date, '1970-01-01');
|
||||
|
||||
-- If versions already exist (re-run), skip product migrate body when PRODUCT versions already present with products
|
||||
SET @product_migrated := (
|
||||
SELECT COUNT(*) FROM prc_price_set_product WHERE price_type = 'PRODUCT'
|
||||
);
|
||||
|
||||
-- Chain expire_time for PRODUCT versions
|
||||
UPDATE prc_price_set_version v
|
||||
LEFT JOIN prc_price_set_version n
|
||||
ON n.price_type = 'PRODUCT' AND IFNULL(n.price_set_id,0)=0 AND n.version_seq = v.version_seq + 1
|
||||
SET v.expire_time = n.effective_time,
|
||||
v.status = CASE
|
||||
WHEN n.psv_id IS NOT NULL AND n.effective_time IS NOT NULL AND n.effective_time <= NOW() THEN '2'
|
||||
WHEN v.effective_time IS NOT NULL AND v.effective_time > NOW() THEN '0'
|
||||
WHEN v.effective_time IS NULL OR v.effective_time <= NOW() THEN '1'
|
||||
ELSE v.status
|
||||
END
|
||||
WHERE v.price_type = 'PRODUCT' AND IFNULL(v.price_set_id,0)=0;
|
||||
|
||||
-- Map each product row to version by effective_date match (only if not yet migrated)
|
||||
INSERT INTO prc_price_set_product (
|
||||
price_type, psv_id, product_code, product_name, service_level, cargo_attr, dest_region,
|
||||
update_note, tax_mode, source_product_id, source_sheet, create_time
|
||||
)
|
||||
SELECT
|
||||
'PRODUCT',
|
||||
v.psv_id,
|
||||
p.product_code,
|
||||
p.product_name,
|
||||
p.service_level,
|
||||
p.cargo_attr,
|
||||
p.dest_region,
|
||||
p.update_note,
|
||||
IFNULL(p.tax_mode, 'TAX_INCLUDED'),
|
||||
p.product_id,
|
||||
p.source_sheet,
|
||||
IFNULL(p.create_time, NOW())
|
||||
FROM product p
|
||||
INNER JOIN prc_price_set_version v
|
||||
ON v.price_type = 'PRODUCT' AND IFNULL(v.price_set_id,0)=0
|
||||
AND (
|
||||
(p.effective_date IS NULL AND v.effective_time IS NULL)
|
||||
OR p.effective_date = v.effective_time
|
||||
)
|
||||
WHERE IFNULL(p.is_del,'0') = '0'
|
||||
AND @product_migrated = 0
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM prc_price_set_product x
|
||||
WHERE x.psv_id = v.psv_id AND x.product_code = p.product_code
|
||||
);
|
||||
|
||||
INSERT INTO tmp_product_version_map (old_product_id, new_psv_id, new_psp_id)
|
||||
SELECT p.product_id, psp.psv_id, psp.psp_id
|
||||
FROM product p
|
||||
INNER JOIN prc_price_set_product psp
|
||||
ON psp.price_type = 'PRODUCT' AND psp.source_product_id = p.product_id;
|
||||
|
||||
INSERT INTO prc_price_set_detail (
|
||||
price_type, psv_id, psp_id, product_code, product_name, country_code, country_name,
|
||||
zone_id, zone_code, zone_name, weight_label, weight_min, weight_max, product_country_id,
|
||||
fv_value, fv_registration_fee, size_limit, last_mile, lead_time, round_mode,
|
||||
effective_date, expire_date, create_time
|
||||
)
|
||||
SELECT
|
||||
'PRODUCT',
|
||||
m.new_psv_id,
|
||||
m.new_psp_id,
|
||||
c.product_code,
|
||||
p.product_name,
|
||||
c.country_code,
|
||||
c.country_name,
|
||||
c.zone_id,
|
||||
c.zone_code,
|
||||
c.zone_name,
|
||||
CASE
|
||||
WHEN c.weight_min IS NULL AND c.weight_max IS NULL THEN NULL
|
||||
ELSE CONCAT(
|
||||
IFNULL(TRIM(TRAILING '0' FROM TRIM(TRAILING '.' FROM CAST(c.weight_min AS CHAR))), ''),
|
||||
'<W≤',
|
||||
IFNULL(TRIM(TRAILING '0' FROM TRIM(TRAILING '.' FROM CAST(c.weight_max AS CHAR))), '')
|
||||
)
|
||||
END,
|
||||
c.weight_min,
|
||||
c.weight_max,
|
||||
c.detail_id,
|
||||
c.freight_price,
|
||||
c.registration_fee,
|
||||
c.size_limit,
|
||||
c.last_mile,
|
||||
c.lead_time,
|
||||
'HALF_UP',
|
||||
DATE(c.effective_date),
|
||||
DATE(c.expire_date),
|
||||
IFNULL(c.create_time, NOW())
|
||||
FROM product_country c
|
||||
INNER JOIN tmp_product_version_map m ON m.old_product_id = c.product_id
|
||||
INNER JOIN product p ON p.product_id = c.product_id
|
||||
WHERE IFNULL(c.is_del,'0') = '0'
|
||||
AND @product_migrated = 0
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM prc_price_set_detail d WHERE d.product_country_id = c.detail_id AND d.price_type = 'PRODUCT'
|
||||
);
|
||||
|
||||
-- Remap PRODUCT surcharge_rel to psp_id / psd_id
|
||||
UPDATE prc_surcharge_rel r
|
||||
INNER JOIN tmp_product_version_map m ON m.old_product_id = r.product_id
|
||||
SET r.product_id = m.new_psp_id
|
||||
WHERE r.price_type = 'PRODUCT' AND IFNULL(r.is_del,'0') = '0'
|
||||
AND @product_migrated = 0;
|
||||
|
||||
UPDATE prc_surcharge_rel r
|
||||
INNER JOIN prc_price_set_detail d ON d.price_type = 'PRODUCT' AND d.product_country_id = r.detail_id
|
||||
SET r.detail_id = d.psd_id
|
||||
WHERE r.price_type = 'PRODUCT' AND r.detail_id IS NOT NULL AND IFNULL(r.is_del,'0') = '0'
|
||||
AND @product_migrated = 0;
|
||||
|
||||
-- ========== 5) Migrate REDLINE catalog ==========
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_redline_version_map;
|
||||
CREATE TEMPORARY TABLE tmp_redline_version_map (
|
||||
old_product_id bigint(20) NOT NULL PRIMARY KEY,
|
||||
new_psv_id bigint(20) NOT NULL,
|
||||
new_psp_id bigint(20) DEFAULT NULL
|
||||
);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_redline_eff;
|
||||
CREATE TEMPORARY TABLE tmp_redline_eff AS
|
||||
SELECT DISTINCT effective_date
|
||||
FROM redline_product
|
||||
WHERE IFNULL(is_del,'0') = '0'
|
||||
ORDER BY IFNULL(effective_date, '1970-01-01');
|
||||
|
||||
INSERT INTO prc_price_set_version (
|
||||
price_set_id, price_type, version_no, version_seq, effective_time, expire_time, status,
|
||||
price_build_mode, created_by, create_time
|
||||
)
|
||||
SELECT
|
||||
NULL,
|
||||
'REDLINE',
|
||||
CONCAT('V', (@rseq := @rseq + 1)),
|
||||
@rseq,
|
||||
e.effective_date,
|
||||
NULL,
|
||||
CASE
|
||||
WHEN e.effective_date IS NOT NULL AND e.effective_date > NOW() THEN '0'
|
||||
ELSE '1'
|
||||
END,
|
||||
'IMPORT',
|
||||
'migrate',
|
||||
NOW()
|
||||
FROM tmp_redline_eff e
|
||||
CROSS JOIN (SELECT @rseq := IFNULL((SELECT MAX(version_seq) FROM prc_price_set_version WHERE price_type='REDLINE' AND IFNULL(price_set_id,0)=0), 0)) s
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM prc_price_set_version v
|
||||
WHERE v.price_type = 'REDLINE' AND IFNULL(v.price_set_id,0) = 0
|
||||
)
|
||||
ORDER BY IFNULL(e.effective_date, '1970-01-01');
|
||||
|
||||
SET @redline_migrated := (
|
||||
SELECT COUNT(*) FROM prc_price_set_product WHERE price_type = 'REDLINE'
|
||||
);
|
||||
|
||||
UPDATE prc_price_set_version v
|
||||
LEFT JOIN prc_price_set_version n
|
||||
ON n.price_type = 'REDLINE' AND IFNULL(n.price_set_id,0)=0 AND n.version_seq = v.version_seq + 1
|
||||
SET v.expire_time = n.effective_time,
|
||||
v.status = CASE
|
||||
WHEN n.psv_id IS NOT NULL AND n.effective_time IS NOT NULL AND n.effective_time <= NOW() THEN '2'
|
||||
WHEN v.effective_time IS NOT NULL AND v.effective_time > NOW() THEN '0'
|
||||
WHEN v.effective_time IS NULL OR v.effective_time <= NOW() THEN '1'
|
||||
ELSE v.status
|
||||
END
|
||||
WHERE v.price_type = 'REDLINE' AND IFNULL(v.price_set_id,0)=0;
|
||||
|
||||
INSERT INTO prc_price_set_product (
|
||||
price_type, psv_id, product_code, product_name, service_level, cargo_attr, dest_region,
|
||||
update_note, tax_mode, source_product_id, source_sheet, create_time
|
||||
)
|
||||
SELECT
|
||||
'REDLINE',
|
||||
v.psv_id,
|
||||
p.product_code,
|
||||
p.product_name,
|
||||
p.service_level,
|
||||
p.cargo_attr,
|
||||
p.dest_region,
|
||||
p.update_note,
|
||||
IFNULL(p.tax_mode, 'TAX_INCLUDED'),
|
||||
p.product_id,
|
||||
p.source_sheet,
|
||||
IFNULL(p.create_time, NOW())
|
||||
FROM redline_product p
|
||||
INNER JOIN prc_price_set_version v
|
||||
ON v.price_type = 'REDLINE' AND IFNULL(v.price_set_id,0)=0
|
||||
AND (
|
||||
(p.effective_date IS NULL AND v.effective_time IS NULL)
|
||||
OR p.effective_date = v.effective_time
|
||||
)
|
||||
WHERE IFNULL(p.is_del,'0') = '0'
|
||||
AND @redline_migrated = 0
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM prc_price_set_product x
|
||||
WHERE x.psv_id = v.psv_id AND x.product_code = p.product_code
|
||||
);
|
||||
|
||||
INSERT INTO tmp_redline_version_map (old_product_id, new_psv_id, new_psp_id)
|
||||
SELECT p.product_id, psp.psv_id, psp.psp_id
|
||||
FROM redline_product p
|
||||
INNER JOIN prc_price_set_product psp
|
||||
ON psp.price_type = 'REDLINE' AND psp.source_product_id = p.product_id;
|
||||
|
||||
INSERT INTO prc_price_set_detail (
|
||||
price_type, psv_id, psp_id, product_code, product_name, country_code, country_name,
|
||||
zone_id, zone_code, zone_name, weight_label, weight_min, weight_max, product_country_id,
|
||||
fv_value, fv_registration_fee, size_limit, last_mile, lead_time, round_mode,
|
||||
effective_date, expire_date, create_time
|
||||
)
|
||||
SELECT
|
||||
'REDLINE',
|
||||
m.new_psv_id,
|
||||
m.new_psp_id,
|
||||
c.product_code,
|
||||
p.product_name,
|
||||
c.country_code,
|
||||
c.country_name,
|
||||
c.zone_id,
|
||||
c.zone_code,
|
||||
c.zone_name,
|
||||
CASE
|
||||
WHEN c.weight_min IS NULL AND c.weight_max IS NULL THEN NULL
|
||||
ELSE CONCAT(
|
||||
IFNULL(TRIM(TRAILING '0' FROM TRIM(TRAILING '.' FROM CAST(c.weight_min AS CHAR))), ''),
|
||||
'<W≤',
|
||||
IFNULL(TRIM(TRAILING '0' FROM TRIM(TRAILING '.' FROM CAST(c.weight_max AS CHAR))), '')
|
||||
)
|
||||
END,
|
||||
c.weight_min,
|
||||
c.weight_max,
|
||||
c.detail_id,
|
||||
c.freight_price,
|
||||
c.registration_fee,
|
||||
c.size_limit,
|
||||
c.last_mile,
|
||||
c.lead_time,
|
||||
'HALF_UP',
|
||||
DATE(c.effective_date),
|
||||
DATE(c.expire_date),
|
||||
IFNULL(c.create_time, NOW())
|
||||
FROM redline_product_country c
|
||||
INNER JOIN tmp_redline_version_map m ON m.old_product_id = c.product_id
|
||||
INNER JOIN redline_product p ON p.product_id = c.product_id
|
||||
WHERE IFNULL(c.is_del,'0') = '0'
|
||||
AND @redline_migrated = 0
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM prc_price_set_detail d WHERE d.product_country_id = c.detail_id AND d.price_type = 'REDLINE'
|
||||
);
|
||||
|
||||
UPDATE prc_surcharge_rel r
|
||||
INNER JOIN tmp_redline_version_map m ON m.old_product_id = r.product_id
|
||||
SET r.product_id = m.new_psp_id
|
||||
WHERE r.price_type = 'REDLINE' AND IFNULL(r.is_del,'0') = '0'
|
||||
AND @redline_migrated = 0;
|
||||
|
||||
UPDATE prc_surcharge_rel r
|
||||
INNER JOIN prc_price_set_detail d ON d.price_type = 'REDLINE' AND d.product_country_id = r.detail_id
|
||||
SET r.detail_id = d.psd_id
|
||||
WHERE r.price_type = 'REDLINE' AND r.detail_id IS NOT NULL AND IFNULL(r.is_del,'0') = '0'
|
||||
AND @redline_migrated = 0;
|
||||
|
||||
-- Ensure SALES rows have price_type
|
||||
UPDATE prc_price_set_version SET price_type = 'SALES' WHERE price_set_id IS NOT NULL AND (price_type IS NULL OR price_type = '');
|
||||
UPDATE prc_price_set_product psp
|
||||
INNER JOIN prc_price_set_version v ON v.psv_id = psp.psv_id
|
||||
SET psp.price_type = 'SALES'
|
||||
WHERE v.price_type = 'SALES';
|
||||
UPDATE prc_price_set_detail d
|
||||
INNER JOIN prc_price_set_version v ON v.psv_id = d.psv_id
|
||||
SET d.price_type = 'SALES'
|
||||
WHERE v.price_type = 'SALES';
|
||||
|
||||
-- ========== 6) DROP old catalog tables ==========
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
DROP TABLE IF EXISTS product_country;
|
||||
DROP TABLE IF EXISTS redline_product_country;
|
||||
DROP TABLE IF EXISTS product;
|
||||
DROP TABLE IF EXISTS redline_product;
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
Reference in New Issue
Block a user