修改产品价格显示

This commit is contained in:
wuweihua
2026-09-09 17:06:50 +08:00
parent fddd8f0586
commit e265656060
30 changed files with 771 additions and 194 deletions
@@ -0,0 +1,5 @@
-- prc_customer_price_set:一个客户只能绑定一个套餐
SET NAMES utf8mb4;
ALTER TABLE prc_customer_price_set
ADD UNIQUE KEY uk_customer_one_set (customer_id);
@@ -1,6 +1,6 @@
-- BMS product effect status dict
-- dict_type: bms_product_effect_status
-- values: ACTIVE / PENDING / EXPIRED
-- values: 1 active / 0 pending / 2 expired
SET NAMES utf8mb4;
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
@@ -8,13 +8,13 @@ SELECT N'产品生效状态', 'bms_product_effect_status', '0', 'admin', sysdate
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_product_effect_status');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 1, N'已生效', 'ACTIVE', 'bms_product_effect_status', '', 'success', 'N', '0', 'admin', sysdate(), N'启用且生效日期<=今天'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = 'ACTIVE');
SELECT 1, N'已生效', '1', 'bms_product_effect_status', '', 'success', 'Y', '0', 'admin', sysdate(), N'1 已生效'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = '1');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 2, N'待生效', 'PENDING', 'bms_product_effect_status', '', 'warning', 'N', '0', 'admin', sysdate(), N'启用且生效日期为空或>今天'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = 'PENDING');
SELECT 2, N'待生效', '0', 'bms_product_effect_status', '', 'warning', 'N', '0', 'admin', sysdate(), N'0 待生效'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = '0');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 3, N'已失效', 'EXPIRED', 'bms_product_effect_status', '', 'info', 'N', '0', 'admin', sysdate(), N'手动标记失效 status=1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = 'EXPIRED');
SELECT 3, N'已失效', '2', 'bms_product_effect_status', '', 'info', 'N', '0', 'admin', sysdate(), N'2 已失效'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = '2');
+1
View File
@@ -72,6 +72,7 @@ CREATE TABLE IF NOT EXISTS prc_customer_price_set (
updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人',
updated_at DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (customer_priceset_id),
UNIQUE KEY uk_customer_one_set (customer_id),
INDEX idx_customer_set (customer_id, pr_begindate, pr_enddate),
INDEX idx_cps_set (price_set_id),
CONSTRAINT fk_customer_price_set FOREIGN KEY (price_set_id) REFERENCES prc_price_set (price_set_id) ON DELETE RESTRICT
+9 -4
View File
@@ -13,7 +13,8 @@ CREATE TABLE IF NOT EXISTS bms_product (
update_note varchar(500) DEFAULT NULL COMMENT '更新内容说明',
tax_mode varchar(20) NOT NULL DEFAULT 'TAX_INCLUDED' COMMENT 'TAX_INCLUDED包税 TAX_EXCLUDED不包税',
effective_date date DEFAULT NULL COMMENT '目录生效日期',
status char(1) NOT NULL DEFAULT '0' COMMENT '0正常 1停用',
expire_date date DEFAULT NULL COMMENT '产品失效日期(空=长期;下一版生效日=本版失效日)',
status char(1) NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
source_sheet varchar(100) DEFAULT NULL COMMENT '来源Excel sheet名',
remark varchar(500) DEFAULT NULL,
tms_id int DEFAULT NULL COMMENT '多租户ID',
@@ -22,12 +23,14 @@ CREATE TABLE IF NOT EXISTS bms_product (
updated_by varchar(50) NOT NULL DEFAULT '',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (product_id),
UNIQUE KEY uk_product_code (product_code),
UNIQUE KEY uk_product_code_eff (product_code, effective_date),
KEY idx_product_code (product_code),
KEY idx_tax_status (tax_mode, status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='BMS产品主表-来自产品目录';
CREATE TABLE IF NOT EXISTS bms_product_country (
detail_id bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID',
product_id bigint DEFAULT NULL COMMENT '产品ID(bms_product.product_id)',
product_code varchar(20) NOT NULL COMMENT '产品代码',
country_name varchar(50) NOT NULL COMMENT '国家中文名',
country_code char(2) DEFAULT NULL COMMENT 'ISO2,可空待补齐',
@@ -40,14 +43,15 @@ CREATE TABLE IF NOT EXISTS bms_product_country (
lead_time varchar(100) DEFAULT NULL COMMENT '参考时效',
effective_date date DEFAULT NULL COMMENT '产品价表生效日期',
expire_date date DEFAULT NULL COMMENT '失效日期(空=长期;新导入生效日=上一版失效日)',
status char(1) NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (detail_id),
UNIQUE KEY uk_product_country_weight_eff (product_code, country_name, weight_min, weight_max, effective_date),
KEY idx_product_country_pid (product_id),
KEY idx_country_code (country_code),
KEY idx_weight_match (product_code, country_code, weight_min, weight_max),
KEY idx_product_eff (product_code, effective_date, expire_date),
CONSTRAINT fk_product_country_code FOREIGN KEY (product_code) REFERENCES bms_product (product_code) ON DELETE CASCADE ON UPDATE CASCADE
KEY idx_product_eff (product_code, effective_date, expire_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品国家明细-重量段+运费挂号费+尺寸/尾程/时效';
-- 已建表升级(幂等:列已存在时跳过报错可忽略)
@@ -59,6 +63,7 @@ CREATE TABLE IF NOT EXISTS bms_product_country (
-- ALTER TABLE bms_product_country ADD COLUMN expire_date date DEFAULT NULL COMMENT '失效日期' AFTER effective_date;
-- ALTER TABLE bms_product_country DROP INDEX uk_product_country_weight;
-- ALTER TABLE bms_product_country ADD UNIQUE KEY uk_product_country_weight_eff (product_code, country_name, weight_min, weight_max, effective_date);
-- product_id: run product_country_product_id_alter.sql
-- 菜单:挂在价格基础 2100 下(order_num=0 置顶)
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
@@ -0,0 +1,20 @@
-- ----------------------------
-- bms_product:产品代码不单独唯一
-- 唯一键改为 (product_code, effective_date)
-- 导入:相同代码+相同生效日不覆盖;不同生效日新增一行
-- ----------------------------
SET NAMES utf8mb4;
-- 1) 国家明细外键依赖 uk_product_code,必须先删
ALTER TABLE bms_product_country DROP FOREIGN KEY fk_product_country_code;
-- 2) 删除产品代码单列唯一
ALTER TABLE bms_product DROP INDEX uk_product_code;
-- 3) 按代码+生效日期唯一
ALTER TABLE bms_product
ADD UNIQUE KEY uk_product_code_eff (product_code, effective_date);
-- 4) 保留产品代码查询索引
ALTER TABLE bms_product
ADD KEY idx_product_code (product_code);
@@ -0,0 +1,27 @@
-- bms_product_country:增加 bms_product.product_id,明细绑定到具体产品版本行
SET NAMES utf8mb4;
-- 1) 新增 product_id 列
ALTER TABLE bms_product_country
ADD COLUMN product_id bigint DEFAULT NULL COMMENT '产品ID(bms_product.product_id,绑定具体产品版本行)' AFTER detail_id;
-- 2) 按 product_code + effective_date 回填既有明细
UPDATE bms_product_country c
INNER JOIN bms_product p
ON p.product_code = c.product_code
AND (
(p.effective_date IS NULL AND c.effective_date IS NULL)
OR p.effective_date = c.effective_date
)
SET c.product_id = p.product_id
WHERE c.product_id IS NULL;
-- 3) 索引
ALTER TABLE bms_product_country
ADD KEY idx_product_country_pid (product_id);
-- 4) 外键(删除产品时级联删除明细;若已存在或有孤儿数据报错可忽略)
ALTER TABLE bms_product_country
ADD CONSTRAINT fk_product_country_pid
FOREIGN KEY (product_id) REFERENCES bms_product (product_id)
ON DELETE CASCADE;
@@ -0,0 +1,58 @@
-- bms_product 增加失效日期;产品/国家明细 status:0待生效 1已生效 2已失效
SET NAMES utf8mb4;
-- 1) 产品主表增加 expire_date
ALTER TABLE bms_product
ADD COLUMN expire_date date DEFAULT NULL COMMENT '产品失效日期(空=长期;下一版生效日=本版失效日)' AFTER effective_date;
ALTER TABLE bms_product
MODIFY COLUMN status char(1) NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效';
-- 2) 国家明细增加 status
ALTER TABLE bms_product_country
ADD COLUMN status char(1) NOT NULL DEFAULT '0' COMMENT '0待生效 1已生效 2已失效' AFTER expire_date;
-- 3) 按同代码下一版生效日回填产品失效日
UPDATE bms_product p
INNER JOIN (
SELECT p1.product_id,
(SELECT MIN(p2.effective_date)
FROM bms_product p2
WHERE p2.product_code = p1.product_code
AND p2.effective_date IS NOT NULL
AND p1.effective_date IS NOT NULL
AND p2.effective_date > p1.effective_date) AS next_eff
FROM bms_product p1
) t ON t.product_id = p.product_id
SET p.expire_date = t.next_eff
WHERE p.expire_date IS NULL AND t.next_eff IS NOT NULL;
-- 4) 按生效/失效日期回写 status
UPDATE bms_product
SET status = CASE
WHEN expire_date IS NOT NULL AND expire_date <= CURDATE() THEN '2'
WHEN effective_date IS NULL OR effective_date > CURDATE() THEN '0'
ELSE '1'
END;
UPDATE bms_product_country
SET status = CASE
WHEN expire_date IS NOT NULL AND expire_date <= CURDATE() THEN '2'
WHEN effective_date IS NULL OR effective_date > CURDATE() THEN '0'
ELSE '1'
END;
-- 5) 字典值 ACTIVE/PENDING/EXPIRED 改为 1/0/2
DELETE FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value IN ('ACTIVE', 'PENDING', 'EXPIRED');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 1, N'已生效', '1', 'bms_product_effect_status', '', 'success', 'Y', '0', 'admin', sysdate(), N'1 已生效'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = '1');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 2, N'待生效', '0', 'bms_product_effect_status', '', 'warning', 'N', '0', 'admin', sysdate(), N'0 待生效'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = '0');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 3, N'已失效', '2', 'bms_product_effect_status', '', 'info', 'N', '0', 'admin', sysdate(), N'2 已失效'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_product_effect_status' AND dict_value = '2');