修改产品功能

This commit is contained in:
wuweihua
2026-09-28 21:43:39 +08:00
parent b247bc2fd2
commit 0ad90f6183
32 changed files with 339 additions and 660 deletions
+20 -40
View File
@@ -279,9 +279,9 @@ CREATE TABLE `ar_export_template` (
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应收账单导出模板管理';
-- ----------------------------
-- 表结构:`bms_product`
-- 表结构:`product`
-- ----------------------------
CREATE TABLE `bms_product` (
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 '产品名称',
@@ -304,39 +304,16 @@ CREATE TABLE `bms_product` (
UNIQUE KEY `uk_product_code_eff` (`product_code`,`effective_date`),
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='BMS产品主表-来自产品目录';
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品主表-来自产品目录';
-- ----------------------------
-- 表结构:`bms_product_price_version`
-- 表结构:`product_country`
-- ----------------------------
CREATE TABLE `bms_product_price_version` (
`ppv_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '产品基础价格版本ID',
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品代码',
`product_id` bigint(20) DEFAULT NULL COMMENT '对应 bms_product.product_id(该版本产品行)',
`version_no` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '版本号 V1/V2',
`version_seq` int(11) NOT NULL COMMENT '版本序号,用于自动+1',
`effective_date` date NOT NULL COMMENT '生效日期',
`expire_date` date DEFAULT NULL COMMENT '失效日期(空=长期;下一版生效日=本版失效日)',
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
`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 (`ppv_id`),
UNIQUE KEY `uk_ppv_code_seq` (`product_code`,`version_seq`),
UNIQUE KEY `uk_ppv_code_eff` (`product_code`,`effective_date`),
KEY `idx_ppv_code_status` (`product_code`,`status`),
KEY `idx_ppv_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品基础价格版本';
-- ----------------------------
-- 表结构:`bms_product_country`
-- ----------------------------
CREATE TABLE `bms_product_country` (
CREATE TABLE `product_country` (
`detail_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`product_id` bigint(20) DEFAULT NULL COMMENT '产品ID(bms_product.product_id,绑定具体产品版本行)',
`ppv_id` bigint(20) DEFAULT NULL COMMENT '产品基础价格版本ID bms_product_price_version.ppv_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,可空待补齐',
@@ -361,10 +338,9 @@ CREATE TABLE `bms_product_country` (
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_ppv` (`ppv_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 `bms_product` (`product_id`) ON DELETE CASCADE
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='产品国家服务明细-重量段+尺寸/尾程/时效(不含运费)';
-- ----------------------------
@@ -978,7 +954,7 @@ CREATE TABLE `prc_order_bill` (
`customer_priceset_id` bigint(20) DEFAULT NULL COMMENT '客户套餐绑定ID',
`psv_id` bigint(20) DEFAULT NULL COMMENT '套餐版本ID,对应 prc_price_set_version.psv_id',
`psd_id` bigint(20) DEFAULT NULL COMMENT '套餐明细ID,对应 prc_price_set_detail.psd_id',
`product_country_id` bigint(20) DEFAULT NULL COMMENT '关联 bms_product_country.detail_id',
`product_country_id` bigint(20) DEFAULT NULL COMMENT '关联 product_country.detail_id',
`weight_min` decimal(10,4) DEFAULT NULL COMMENT '重量段下限',
`weight_max` decimal(10,4) DEFAULT NULL COMMENT '重量段上限',
`weight_label` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '重量段展示',
@@ -1291,7 +1267,7 @@ 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 'bms_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/票',
`discount_value` decimal(5,2) DEFAULT NULL COMMENT '明细折扣百分数,DISCOUNT 可覆盖默认',
@@ -1392,7 +1368,7 @@ CREATE TABLE `prc_quote` (
`set_type` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '计价类型 FIXED=固定价 DISCOUNT=折扣',
`bind_priority` int(11) DEFAULT NULL COMMENT '客户套餐优先级',
`customer_priceset_id` bigint(20) DEFAULT NULL COMMENT '客户套餐绑定ID',
`product_country_id` bigint(20) DEFAULT NULL COMMENT '关联 bms_product_country.detail_id',
`product_country_id` bigint(20) DEFAULT NULL COMMENT '关联 product_country.detail_id',
`weight_min` decimal(10,4) DEFAULT NULL COMMENT '重量段下限',
`weight_max` decimal(10,4) DEFAULT NULL COMMENT '重量段上限',
`weight_label` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '重量段展示',
@@ -1404,7 +1380,11 @@ CREATE TABLE `prc_quote` (
`registration_fee` decimal(10,2) DEFAULT NULL COMMENT '挂号费',
`freight_amount` decimal(10,2) DEFAULT NULL COMMENT '运费金额',
`surcharge_amount` decimal(10,2) DEFAULT NULL COMMENT '附加费合计',
`payable_total` decimal(10,2) DEFAULT NULL COMMENT '应付总额',
`payable_total` decimal(10,2) DEFAULT NULL COMMENT '销售价/应收试算合计',
`product_amount` decimal(18,4) DEFAULT NULL COMMENT '产品价合计',
`redline_amount` decimal(18,4) DEFAULT NULL COMMENT '红线价合计',
`cost_amount` decimal(18,4) DEFAULT NULL COMMENT '成本价合计(当前等于产品目录价)',
`pay_total` decimal(18,4) DEFAULT NULL COMMENT '应付合计(当前等于成本价)',
`currency` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RMB' COMMENT '币种',
`round_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
`created_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建人',
@@ -1470,9 +1450,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 bms_product.product_id',
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品对接代码 bms_product.product_code',
`detail_id` bigint(20) DEFAULT NULL COMMENT '产品明细ID bms_product_country.detail_id(空=作用于产品全部明细)',
`product_id` bigint(20) NOT NULL COMMENT '产品ID product.product_id',
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品对接代码 product.product_code',
`detail_id` bigint(20) DEFAULT NULL COMMENT '产品明细ID product_country.detail_id(空=作用于产品全部明细)',
`created_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建人',
`create_time` datetime DEFAULT NULL,
`updated_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新人',
@@ -1483,7 +1463,7 @@ CREATE TABLE `prc_surcharge_rel` (
KEY `idx_rel_product` (`product_id`),
KEY `idx_rel_product_code` (`product_code`),
KEY `idx_rel_detail` (`detail_id`),
CONSTRAINT `fk_rel_product` FOREIGN KEY (`product_id`) REFERENCES `bms_product` (`product_id`) ON DELETE CASCADE,
CONSTRAINT `fk_rel_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE,
CONSTRAINT `fk_rel_sc` FOREIGN KEY (`sc_id`) REFERENCES `prc_surcharge` (`sc_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='附加费与产品/明细关联表';
@@ -0,0 +1,17 @@
-- prc_quote: product / cost amounts (run once on existing DB)
SET @col_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'product_amount'
);
SET @sql := IF(@col_exists = 0,
CONCAT(
'ALTER TABLE `prc_quote` ',
'ADD COLUMN `product_amount` decimal(18,4) DEFAULT NULL COMMENT ''产品价合计'' AFTER `payable_total`, ',
'ADD COLUMN `redline_amount` decimal(18,4) DEFAULT NULL COMMENT ''红线价合计'' AFTER `product_amount`, ',
'ADD COLUMN `cost_amount` decimal(18,4) DEFAULT NULL COMMENT ''成本价合计(当前等于产品目录价)'' AFTER `redline_amount`, ',
'ADD COLUMN `pay_total` decimal(18,4) DEFAULT NULL COMMENT ''应付合计(当前等于成本价)'' AFTER `cost_amount`'
),
'SELECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
@@ -1,98 +0,0 @@
-- Product base price version: table + bms_product_country.ppv_id
-- Run once on existing DB. New installs: see bms_init.sql
CREATE TABLE IF NOT EXISTS `bms_product_price_version` (
`ppv_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '产品基础价格版本ID',
`product_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品代码',
`product_id` bigint(20) DEFAULT NULL COMMENT '对应 bms_product.product_id(该版本产品行)',
`version_no` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '版本号 V1/V2',
`version_seq` int(11) NOT NULL COMMENT '版本序号,用于自动+1',
`effective_date` date NOT NULL COMMENT '生效日期',
`expire_date` date DEFAULT NULL COMMENT '失效日期(空=长期;下一版生效日=本版失效日)',
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
`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 (`ppv_id`),
UNIQUE KEY `uk_ppv_code_seq` (`product_code`,`version_seq`),
UNIQUE KEY `uk_ppv_code_eff` (`product_code`,`effective_date`),
KEY `idx_ppv_code_status` (`product_code`,`status`),
KEY `idx_ppv_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品基础价格版本';
SET @col_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bms_product_country'
AND COLUMN_NAME = 'ppv_id'
);
SET @sql := IF(@col_exists = 0,
'ALTER TABLE `bms_product_country` ADD COLUMN `ppv_id` bigint(20) DEFAULT NULL COMMENT ''产品基础价格版本ID bms_product_price_version.ppv_id'' AFTER `product_id`, ADD KEY `idx_product_country_ppv` (`ppv_id`)',
'SELECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
INSERT INTO `bms_product_price_version` (
product_code, product_id, version_no, version_seq, effective_date, expire_date, status, created_by, create_time
)
SELECT
t.product_code,
(
SELECT p.product_id FROM bms_product p
WHERE p.product_code = t.product_code
AND p.effective_date = t.effective_date
ORDER BY p.product_id ASC
LIMIT 1
) AS product_id,
CONCAT('V', t.version_seq) AS version_no,
t.version_seq,
t.effective_date,
t.expire_date,
CASE
WHEN t.expire_date IS NOT NULL AND t.expire_date <= CURDATE() THEN '2'
WHEN t.effective_date > CURDATE() THEN '0'
ELSE '1'
END AS status,
'migrate' AS created_by,
NOW() AS create_time
FROM (
SELECT
g.product_code,
g.effective_date,
g.expire_date,
(
SELECT COUNT(1)
FROM (
SELECT product_code, effective_date
FROM bms_product_country
WHERE effective_date IS NOT NULL
GROUP BY product_code, effective_date
) earlier
WHERE earlier.product_code = g.product_code
AND earlier.effective_date <= g.effective_date
) AS version_seq
FROM (
SELECT
product_code,
effective_date,
MAX(expire_date) AS expire_date
FROM bms_product_country
WHERE effective_date IS NOT NULL
GROUP BY product_code, effective_date
) g
) t
WHERE NOT EXISTS (
SELECT 1 FROM bms_product_price_version v
WHERE v.product_code = t.product_code
AND v.effective_date = t.effective_date
);
UPDATE bms_product_country c
INNER JOIN bms_product_price_version v
ON v.product_code = c.product_code
AND v.effective_date = c.effective_date
SET c.ppv_id = v.ppv_id
WHERE c.ppv_id IS NULL
AND c.effective_date IS NOT NULL;
@@ -0,0 +1,91 @@
-- Rename product tables (drop bms_ prefix) and remove base price version
SET NAMES utf8mb4;
-- 1) Drop FK from country -> product if present
SET @fk := (
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bms_product_country'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
AND CONSTRAINT_NAME = 'fk_product_country_pid'
LIMIT 1
);
SET @sql := IF(@fk IS NULL, 'SELECT 1', CONCAT('ALTER TABLE bms_product_country DROP FOREIGN KEY ', @fk));
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 2) Drop version index / column on country
SET @idx := (
SELECT INDEX_NAME FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bms_product_country'
AND INDEX_NAME = 'idx_product_country_ppv'
LIMIT 1
);
SET @sql := IF(@idx IS NULL, 'SELECT 1', 'ALTER TABLE bms_product_country DROP INDEX idx_product_country_ppv');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @col := (
SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bms_product_country'
AND COLUMN_NAME = 'ppv_id'
LIMIT 1
);
SET @sql := IF(@col IS NULL, 'SELECT 1', 'ALTER TABLE bms_product_country DROP COLUMN ppv_id');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- Also handle already-renamed country table
SET @idx := (
SELECT INDEX_NAME FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'product_country'
AND INDEX_NAME = 'idx_product_country_ppv'
LIMIT 1
);
SET @sql := IF(@idx IS NULL, 'SELECT 1', 'ALTER TABLE product_country DROP INDEX idx_product_country_ppv');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @col := (
SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'product_country'
AND COLUMN_NAME = 'ppv_id'
LIMIT 1
);
SET @sql := IF(@col IS NULL, 'SELECT 1', 'ALTER TABLE product_country DROP COLUMN ppv_id');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 3) Drop version table
DROP TABLE IF EXISTS bms_product_price_version;
DROP TABLE IF EXISTS product_price_version;
-- 4) Rename tables (skip if already renamed)
SET @t := (
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bms_product' LIMIT 1
);
SET @sql := IF(@t IS NULL, 'SELECT 1', 'RENAME TABLE bms_product TO product');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @t := (
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bms_product_country' LIMIT 1
);
SET @sql := IF(@t IS NULL, 'SELECT 1', 'RENAME TABLE bms_product_country TO product_country');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 5) Recreate FK product_country.product_id -> product.product_id
SET @fk := (
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'product_country'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
AND CONSTRAINT_NAME = 'fk_product_country_pid'
LIMIT 1
);
SET @sql := IF(
@fk IS NOT NULL,
'SELECT 1',
'ALTER TABLE product_country ADD CONSTRAINT fk_product_country_pid FOREIGN KEY (product_id) REFERENCES product (product_id) ON DELETE CASCADE'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;