Merge remote-tracking branch 'origin/master'

This commit is contained in:
luojiaquan
2026-09-09 17:41:00 +08:00
51 changed files with 2700 additions and 671 deletions
+5 -1
View File
@@ -13,6 +13,10 @@ INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component,
SELECT 2302, N'试算执行', 2301, 1, '', NULL, 1, 0, 'F', '0', '0', 'price:billing:quote', '#', 'admin', sysdate()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2302);
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
SELECT 2303, N'试算查询', 2301, 2, '', NULL, 1, 0, 'F', '0', '0', 'price:billing:quote', '#', 'admin', sysdate()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2303);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, m.menu_id FROM (SELECT 2300 AS menu_id UNION SELECT 2301 UNION SELECT 2302) m
SELECT 1, m.menu_id FROM (SELECT 2300 AS menu_id UNION SELECT 2301 UNION SELECT 2302 UNION SELECT 2303) m
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
@@ -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');
+68
View File
@@ -0,0 +1,68 @@
-- ----------------------------
-- BMS 下单计费试算落库
-- charset: utf8mb4
-- prc_quote:相同试算参数唯一,命中则直接返回
-- prc_quote_fee:运费/挂号费各一行,附加费按具体名称各一行
-- ----------------------------
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS prc_quote (
quote_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '试算ID',
quote_key CHAR(32) NOT NULL COMMENT '试算指纹 MD5(客户|产品|国家|重量|计费日期)',
customer_id BIGINT(20) NOT NULL COMMENT '客户ID',
product_code VARCHAR(20) NOT NULL COMMENT '产品代码',
product_name VARCHAR(100) DEFAULT NULL COMMENT '产品名称',
country_code CHAR(2) DEFAULT NULL COMMENT '国家二字码',
country_name VARCHAR(50) DEFAULT NULL COMMENT '国家名称',
weight DECIMAL(10,3) NOT NULL COMMENT '计费重量KG',
biz_date DATE NOT NULL COMMENT '计费日期',
tms_id BIGINT(20) DEFAULT NULL COMMENT '多租户系统ID',
match_source VARCHAR(30) DEFAULT NULL COMMENT '命中来源 PACKAGE_FIXED/套餐固定价 PACKAGE_DISCOUNT/套餐折扣 PRODUCT_DEFAULT/产品默认价',
match_message VARCHAR(200) DEFAULT NULL COMMENT '命中说明',
price_set_id BIGINT(20) DEFAULT NULL COMMENT '价格套餐ID',
price_set_code VARCHAR(20) DEFAULT NULL COMMENT '套餐编码',
price_set_name VARCHAR(50) DEFAULT NULL COMMENT '套餐名称',
set_type VARCHAR(10) 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',
weight_min DECIMAL(10,4) DEFAULT NULL COMMENT '重量段下限',
weight_max DECIMAL(10,4) DEFAULT NULL COMMENT '重量段上限',
weight_label VARCHAR(50) DEFAULT NULL COMMENT '重量段展示',
effective_date DATE DEFAULT NULL COMMENT '产品明细生效日',
charge_weight DECIMAL(10,3) DEFAULT NULL COMMENT '计费重量',
freight_rate DECIMAL(10,4) DEFAULT NULL COMMENT '运费单价',
base_freight_rate DECIMAL(10,4) DEFAULT NULL COMMENT '折扣前单价',
discount_percent DECIMAL(5,2) DEFAULT NULL COMMENT '折扣百分数',
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 '应付总额',
currency VARCHAR(10) NOT NULL DEFAULT 'RMB' COMMENT '币种',
round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
created_by VARCHAR(64) DEFAULT '' COMMENT '创建人',
created_at DATETIME DEFAULT NULL COMMENT '创建时间',
updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人',
updated_at DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (quote_id),
UNIQUE KEY uk_quote_key (quote_key),
INDEX idx_quote_customer (customer_id, biz_date),
INDEX idx_quote_product (product_code, country_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计费试算主表';
CREATE TABLE IF NOT EXISTS prc_quote_fee (
fee_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '费用明细ID',
quote_id BIGINT(20) NOT NULL COMMENT '试算ID',
fee_type VARCHAR(30) NOT NULL COMMENT '费用类型(字典bms_fee_type)',
fee_name VARCHAR(100) DEFAULT NULL COMMENT '费用名称(附加费取配置名称)',
sc_id BIGINT(20) NOT NULL DEFAULT 0 COMMENT '附加费配置ID,运费/挂号费为0',
amount DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '金额',
currency VARCHAR(10) NOT NULL DEFAULT 'RMB' COMMENT '币种',
round_mode VARCHAR(20) DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
created_at DATETIME DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (fee_id),
UNIQUE KEY uk_quote_fee_item (quote_id, fee_type, sc_id),
INDEX idx_quote_fee_type (fee_type),
CONSTRAINT fk_quote_fee_quote FOREIGN KEY (quote_id) REFERENCES prc_quote (quote_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计费试算费用明细-附加费按具体名称一行';
@@ -0,0 +1,21 @@
-- ----------------------------
-- prc_quote_fee:附加费按具体名称多行
-- 原 uk_quote_fee_type(quote_id, fee_type) 被外键 fk_quote_fee_quote 依赖,
-- 必须先补 quote_id 索引再删旧唯一键
-- ----------------------------
SET NAMES utf8mb4;
-- 1) 外键所需的 quote_id 索引(与旧唯一键分离)
ALTER TABLE prc_quote_fee ADD INDEX idx_quote_fee_quote_id (quote_id);
-- 2) 附加费配置ID
ALTER TABLE prc_quote_fee ADD COLUMN sc_id BIGINT(20) NOT NULL DEFAULT 0 COMMENT '附加费配置ID,运费/挂号费为0' AFTER fee_name;
-- 3) 新唯一:同一试算可有多条附加费
ALTER TABLE prc_quote_fee ADD UNIQUE KEY uk_quote_fee_item (quote_id, fee_type, sc_id);
-- 4) 现可安全删掉旧唯一键
ALTER TABLE prc_quote_fee DROP INDEX uk_quote_fee_type;
-- 5) 更新费用名称注释
ALTER TABLE prc_quote_fee MODIFY COLUMN fee_name VARCHAR(100) DEFAULT NULL COMMENT '费用名称(附加费取配置名称)';