This commit is contained in:
luojiaquan
2026-09-20 10:26:37 +08:00
48 changed files with 0 additions and 2004 deletions
@@ -1,22 +0,0 @@
# Billing quote / order sync: postcode -> zone
## Rule
- Whether a country needs a zone is decided by `bms_product_country` (rows with `zone_code`).
- If the product+country has zones: request **must** include `destPostcode`.
- Zone is resolved at runtime: `destPostcode` -> `prc_zone_detail` + `prc_zone` -> `zone_code`, then match `bms_product_country`.
- Billing tables store **postcode only**, not zone columns:
- `prc_quote.dest_postcode`
- `prc_order_bill.dest_postcode` (already existed)
## SQL
Run: `bms-back/sql/price/billing_postcode_alter.sql`
## API fields
- Request: `destPostcode` on `/api/tms/price/quote` and `/api/tms/price/bill` (and console `/price/billing/quote`).
- Response may include `zoneId` / `zoneCode` / `zoneName` for display only (not persisted on bill/quote tables).
## Errors (i18n)
- `price.quote.postcodeRequired`
- `price.quote.postcodeZoneNotFound`
- `price.quote.zonePriceNotHit`
- `price.quote.priceNotHit`
@@ -1,34 +0,0 @@
# Price set version tables
## Wizard (2 steps)
1. Basic info + view bound customers (read-only)
2. Edit product prices (library pull on next)
- No manual effective_time input.
- Draft version: status=0, effective_time null until activate.
- Activate: sets effective_time=now; previous version expires. Does not change package header status.
- Copy as new version: `POST /price/set/version/copy/{psvId}` inserts new draft `prc_price_set_version` and copies `prc_price_set_detail` (+ surcharge snapshots) from source psv_id.
- Audit submit/approve/reject removed from UI save path.
## Graph
```
prc_price_set
-> prc_price_set_version draft / active / expired
-> prc_price_set_detail product prices (psv_id)
-> prc_price_set_version_surcharge
```
## Status
Version: 0 draft, 1 active, 2 expired. Active when effective_time <= now and (expire_time null or > now).
## SQL
1. `price_set_version.sql`
2. `price_set_version_eff_nullable.sql` (allow null `prc_price_set.effective_date` and `prc_price_set_version.effective_time` for drafts)
## Billing
Match by price_set_id; multi-version quote should filter active psv_id by bill time.
-104
View File
@@ -1,104 +0,0 @@
-- prc_order_bill: order info header
-- prc_income_bill_fee: receivable fee lines
-- prc_pay_bill_fee: payable fee lines
-- fields follow prc_quote / prc_quote_fee; extra order_no + customer_code
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS prc_order_bill (
bill_id VARCHAR(36) NOT NULL COMMENT '计费ID',
bill_key CHAR(32) NOT NULL COMMENT 'MD5(order_no)',
order_no VARCHAR(64) NOT NULL COMMENT '订单号',
tracking_no VARCHAR(64) DEFAULT NULL COMMENT '运单号',
customer_id BIGINT(20) NOT NULL DEFAULT 0 COMMENT '客户ID',
customer_code VARCHAR(50) DEFAULT NULL COMMENT '客户代码',
customer_name VARCHAR(100) DEFAULT NULL COMMENT '客户名称',
pieces INT(11) DEFAULT NULL COMMENT '件数',
actual_weight DECIMAL(10,3) DEFAULT NULL COMMENT '实际重量KG',
volume DECIMAL(12,4) DEFAULT NULL COMMENT '体积m3',
volume_weight DECIMAL(10,3) DEFAULT NULL COMMENT '材积重KG',
pkg_length DECIMAL(10,2) DEFAULT NULL COMMENT '长CM',
pkg_width DECIMAL(10,2) DEFAULT NULL COMMENT '宽CM',
pkg_height DECIMAL(10,2) DEFAULT NULL COMMENT '高CM',
shipper_name VARCHAR(100) DEFAULT NULL COMMENT '发件人',
consignee_name VARCHAR(100) DEFAULT NULL COMMENT '收件人',
dest_postcode VARCHAR(20) DEFAULT NULL COMMENT '目的邮编',
warehouse_code VARCHAR(50) DEFAULT NULL COMMENT '仓库',
order_time DATETIME DEFAULT NULL COMMENT '下单时间',
order_remark VARCHAR(500) DEFAULT NULL COMMENT '订单备注',
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 '命中来源',
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 '计价类型',
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 '附加费合计',
income_total DECIMAL(10,2) DEFAULT NULL COMMENT '应收总额',
pay_total DECIMAL(10,2) DEFAULT NULL COMMENT '应付总额',
currency VARCHAR(10) NOT NULL DEFAULT 'CNY' COMMENT '币种',
ar_bill_status VARCHAR(20) NOT NULL DEFAULT 'UNBILLED' COMMENT '应收账单占用状态:UNBILLED/BILLED',
round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' 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 '更新时间',
PRIMARY KEY (bill_id),
UNIQUE KEY uk_bill_order (order_no),
UNIQUE KEY uk_bill_key (bill_key),
INDEX idx_bill_customer (customer_code, biz_date),
INDEX idx_bill_ar_status (customer_id, currency, ar_bill_status, biz_date),
INDEX idx_bill_product (product_code, country_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单信息主表';
CREATE TABLE IF NOT EXISTS prc_income_bill_fee (
fee_id VARCHAR(36) NOT NULL COMMENT '费用明细ID',
bill_id VARCHAR(36) 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',
amount DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '金额',
currency VARCHAR(10) NOT NULL DEFAULT 'CNY' COMMENT '币种',
round_mode VARCHAR(20) DEFAULT 'HALF_UP' COMMENT '取值方式',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (fee_id),
UNIQUE KEY uk_income_bill_fee_item (bill_id, fee_type, sc_id),
INDEX idx_income_bill_fee_type (fee_type),
CONSTRAINT fk_income_bill_fee_order FOREIGN KEY (bill_id) REFERENCES prc_order_bill (bill_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应收费用明细';
CREATE TABLE IF NOT EXISTS prc_pay_bill_fee (
fee_id VARCHAR(36) NOT NULL COMMENT '费用明细ID',
bill_id VARCHAR(36) 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',
amount DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '金额',
currency VARCHAR(10) NOT NULL DEFAULT 'CNY' COMMENT '币种',
round_mode VARCHAR(20) DEFAULT 'HALF_UP' COMMENT '取值方式',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (fee_id),
UNIQUE KEY uk_pay_bill_fee_item (bill_id, fee_type, sc_id),
INDEX idx_pay_bill_fee_type (fee_type),
CONSTRAINT fk_pay_bill_fee_order FOREIGN KEY (bill_id) REFERENCES prc_order_bill (bill_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应付费用明细';
-23
View File
@@ -1,23 +0,0 @@
SET NAMES utf8mb4;
-- visible C menu under billing center (2300)
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)
SELECT 2310, N'同步计费', 2300, 2, 'bill', 'price/billing/bill', '', 'BillingBill', 1, 0, 'C', '0', '0', 'price:billing:bill', 'list', 'admin', sysdate(), N'订单同步计费应收'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2310);
UPDATE sys_menu SET menu_name = N'同步计费', parent_id = 2300, order_num = 2, path = 'bill', component = 'price/billing/bill', route_name = 'BillingBill', menu_type = 'C', visible = '0', perms = 'price:billing:bill', remark = N'订单同步计费应收'
WHERE menu_id = 2310;
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 2311, N'计费查询', 2310, 1, '', NULL, 1, 0, 'F', '0', '0', 'price:billing:bill', '#', 'admin', sysdate()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2311);
UPDATE sys_menu SET menu_name = N'计费查询', parent_id = 2310, menu_type = 'F', path = '', component = NULL, perms = 'price:billing:bill' WHERE menu_id = 2311;
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 2312, N'计费详情', 2310, 2, '', NULL, 1, 0, 'F', '0', '0', 'price:billing:bill', '#', 'admin', sysdate()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2312);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, m.menu_id FROM (SELECT 2310 AS menu_id UNION SELECT 2311 UNION SELECT 2312) m
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
@@ -1,21 +0,0 @@
-- prc_bill add order snapshot columns
SET NAMES utf8mb4;
ALTER TABLE prc_bill
ADD COLUMN tracking_no VARCHAR(64) DEFAULT NULL COMMENT '运单号' AFTER order_no,
ADD COLUMN customer_name VARCHAR(100) DEFAULT NULL COMMENT '客户名称' AFTER customer_code,
ADD COLUMN pieces INT(11) DEFAULT NULL COMMENT '件数' AFTER customer_name,
ADD COLUMN actual_weight DECIMAL(10,3) DEFAULT NULL COMMENT '实际重量KG' AFTER pieces,
ADD COLUMN volume DECIMAL(12,4) DEFAULT NULL COMMENT '体积m3' AFTER actual_weight,
ADD COLUMN volume_weight DECIMAL(10,3) DEFAULT NULL COMMENT '材积重KG' AFTER volume,
ADD COLUMN pkg_length DECIMAL(10,2) DEFAULT NULL COMMENT '长CM' AFTER volume_weight,
ADD COLUMN pkg_width DECIMAL(10,2) DEFAULT NULL COMMENT '宽CM' AFTER pkg_length,
ADD COLUMN pkg_height DECIMAL(10,2) DEFAULT NULL COMMENT '高CM' AFTER pkg_width,
ADD COLUMN shipper_name VARCHAR(100) DEFAULT NULL COMMENT '发件人' AFTER pkg_height,
ADD COLUMN consignee_name VARCHAR(100) DEFAULT NULL COMMENT '收件人' AFTER shipper_name,
ADD COLUMN dest_postcode VARCHAR(20) DEFAULT NULL COMMENT '目的邮编' AFTER consignee_name,
ADD COLUMN warehouse_code VARCHAR(50) DEFAULT NULL COMMENT '仓库' AFTER dest_postcode,
ADD COLUMN order_time DATETIME DEFAULT NULL COMMENT '下单时间' AFTER warehouse_code,
ADD COLUMN order_remark VARCHAR(500) DEFAULT NULL COMMENT '订单备注' AFTER order_time;
ALTER TABLE prc_bill ADD INDEX idx_bill_tracking (tracking_no);
-22
View File
@@ -1,22 +0,0 @@
-- Billing center menus
SET NAMES utf8mb4;
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)
SELECT 2300, N'计费中心', 0, 9, 'billing', NULL, '', '', 1, 0, 'M', '0', '0', '', 'money', 'admin', sysdate(), N'计费中心目录'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2300);
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)
SELECT 2301, N'下单计费试算', 2300, 1, 'quote', 'price/billing/quote', '', 'BillingQuote', 1, 0, 'C', '0', '0', 'price:billing:quote', 'edit', 'admin', sysdate(), N'下单计费试算'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2301);
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 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 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);
@@ -1,28 +0,0 @@
-- prc_quote: add dest_postcode only (zone resolved at runtime by postcode)
-- billing tables do NOT store zone_* columns
SET NAMES utf8mb4;
SET @db := DATABASE();
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_quote' AND COLUMN_NAME='dest_postcode');
SET @sql := IF(@has=0, 'ALTER TABLE prc_quote ADD COLUMN dest_postcode VARCHAR(20) DEFAULT NULL COMMENT ''dest postcode'' AFTER country_name', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_quote' AND COLUMN_NAME='zone_id');
SET @sql := IF(@has>0, 'ALTER TABLE prc_quote DROP COLUMN zone_id', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_quote' AND COLUMN_NAME='zone_code');
SET @sql := IF(@has>0, 'ALTER TABLE prc_quote DROP COLUMN zone_code', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_quote' AND COLUMN_NAME='zone_name');
SET @sql := IF(@has>0, 'ALTER TABLE prc_quote DROP COLUMN zone_name', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME='zone_id');
SET @sql := IF(@has>0, 'ALTER TABLE prc_order_bill DROP COLUMN zone_id', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME='zone_code');
SET @sql := IF(@has>0, 'ALTER TABLE prc_order_bill DROP COLUMN zone_code', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME='zone_name');
SET @sql := IF(@has>0, 'ALTER TABLE prc_order_bill DROP COLUMN zone_name', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-89
View File
@@ -1,89 +0,0 @@
-- Add zone + dest_postcode to prc_quote / zone to prc_order_bill
-- Idempotent
-- charset: utf8mb4
SET NAMES utf8mb4;
SET @db := DATABASE();
-- ========== prc_quote ==========
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'dest_postcode'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD COLUMN dest_postcode VARCHAR(20) DEFAULT NULL COMMENT ''dest postcode'' AFTER country_name',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'zone_id'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD COLUMN zone_id BIGINT(20) DEFAULT NULL COMMENT ''prc_zone.zone_id'' AFTER dest_postcode',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'zone_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD COLUMN zone_code VARCHAR(50) DEFAULT NULL COMMENT ''zone code'' AFTER zone_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'zone_name'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD COLUMN zone_name VARCHAR(100) DEFAULT NULL COMMENT ''zone display name'' AFTER zone_code',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND INDEX_NAME = 'idx_quote_zone'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD INDEX idx_quote_zone (zone_id)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ========== prc_order_bill ==========
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'zone_id'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_order_bill ADD COLUMN zone_id BIGINT(20) DEFAULT NULL COMMENT ''prc_zone.zone_id'' AFTER country_name',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'zone_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_order_bill ADD COLUMN zone_code VARCHAR(50) DEFAULT NULL COMMENT ''zone code'' AFTER zone_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'zone_name'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_order_bill ADD COLUMN zone_name VARCHAR(100) DEFAULT NULL COMMENT ''zone display name'' AFTER zone_code',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND INDEX_NAME = 'idx_bill_zone'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_order_bill ADD INDEX idx_bill_zone (zone_id)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
@@ -1,10 +0,0 @@
-- prc_customer_price_set add customer_code
SET NAMES utf8mb4;
ALTER TABLE prc_customer_price_set
ADD COLUMN customer_code varchar(50) DEFAULT NULL COMMENT '客户代码' AFTER customer_id;
UPDATE prc_customer_price_set cps
INNER JOIN bms_customer c ON c.customer_id = cps.customer_id
SET cps.customer_code = c.customer_code
WHERE cps.customer_code IS NULL OR cps.customer_code = '';
@@ -1,5 +0,0 @@
-- prc_customer_price_set:一个客户只能绑定一个套餐
SET NAMES utf8mb4;
ALTER TABLE prc_customer_price_set
ADD UNIQUE KEY uk_customer_one_set (customer_id);
@@ -1,59 +0,0 @@
-- ----------------------------
-- BMS 计费字典:计费方式 / 币种
-- charset: utf8mb4
-- 幂等:dict_type 唯一键 + WHERE NOT EXISTS,可重复执行
-- 默认值:计费方式 = FIXED(固定金额),币种 = CNY(人民币)
-- ----------------------------
-- 1) 字典类型
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
SELECT '计费方式', 'bms_charge_type', '0', 'admin', sysdate(), '计费方式 FIXED固定金额/WEIGHT按重量/RATE按比例'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_charge_type');
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
SELECT '币种', 'bms_currency', '0', 'admin', sysdate(), '计费币种'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_currency');
-- 2) 计费方式字典数据(默认 FIXED 固定金额)
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 1, '固定金额(每票)', 'FIXED', 'bms_charge_type', 'Y', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_charge_type' AND dict_value = 'FIXED');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 2, '按重量(每KG)', 'WEIGHT', 'bms_charge_type', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_charge_type' AND dict_value = 'WEIGHT');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 3, '按比例(%)', 'RATE', 'bms_charge_type', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_charge_type' AND dict_value = 'RATE');
-- 3) 币种字典数据(默认 CNY 人民币)
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 1, '人民币', 'CNY', 'bms_currency', 'Y', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'CNY');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 2, '美元', 'USD', 'bms_currency', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'USD');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 3, '欧元', 'EUR', 'bms_currency', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'EUR');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 4, '英镑', 'GBP', 'bms_currency', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'GBP');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 5, '日元', 'JPY', 'bms_currency', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'JPY');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 6, '港币', 'HKD', 'bms_currency', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'HKD');
-- 4) 幂等修正默认值(数据已存在时强制对齐)
UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_charge_type' AND dict_value <> 'FIXED';
UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_charge_type' AND dict_value = 'FIXED';
UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_currency' AND dict_value <> 'CNY';
UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_currency' AND dict_value = 'CNY';
-47
View File
@@ -1,47 +0,0 @@
-- ----------------------------
-- BMS 计费字典:取值方式 / 费用类型
-- charset: utf8mb4
-- 幂等:dict_type 唯一键 + WHERE NOT EXISTS,可重复执行
-- 默认值:费用类型 = SURCHARGE(附加费),取值方式 = HALF_UP(四舍五入)
-- ----------------------------
-- 1) 字典类型
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
SELECT '取值方式', 'bms_round_mode', '0', 'admin', sysdate(), '计费金额取值方式'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_round_mode');
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
SELECT '费用类型', 'bms_fee_type', '0', 'admin', sysdate(), '计费费用类型'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_fee_type');
-- 2) 取值方式字典数据(默认 HALF_UP 四舍五入)
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 1, '向上取值', 'UP', 'bms_round_mode', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_round_mode' AND dict_value = 'UP');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 2, '向下取整', 'DOWN', 'bms_round_mode', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_round_mode' AND dict_value = 'DOWN');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 3, '四舍五入', 'HALF_UP', 'bms_round_mode', 'Y', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_round_mode' AND dict_value = 'HALF_UP');
-- 3) 费用类型字典数据(默认 SURCHARGE 附加费)
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 1, '基础运费', 'BASIC_FREIGHT', 'bms_fee_type', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_fee_type' AND dict_value = 'BASIC_FREIGHT');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 2, '挂号费', 'REGISTRATION_FEE', 'bms_fee_type', 'N', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_fee_type' AND dict_value = 'REGISTRATION_FEE');
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark)
SELECT 3, '附加费', 'SURCHARGE', 'bms_fee_type', 'Y', '0', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_fee_type' AND dict_value = 'SURCHARGE');
-- 4) 幂等修正默认值(数据已存在时强制对齐,保证重复执行后默认值仍正确)
UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_round_mode' AND dict_value <> 'HALF_UP';
UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_round_mode' AND dict_value = 'HALF_UP';
UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_fee_type' AND dict_value <> 'SURCHARGE';
UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_fee_type' AND dict_value = 'SURCHARGE';
@@ -1,20 +0,0 @@
-- BMS product effect status dict
-- dict_type: bms_product_effect_status
-- 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)
SELECT N'产品生效状态', 'bms_product_effect_status', '0', 'admin', sysdate(), N'产品列表:已生效/待生效/已失效'
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'已生效', '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');
-16
View File
@@ -1,16 +0,0 @@
-- BMS product tax mode dict
-- dict_type: bms_tax_mode
-- values: TAX_INCLUDED / TAX_EXCLUDED
SET NAMES utf8mb4;
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
SELECT N'税模式', 'bms_tax_mode', '0', 'admin', sysdate(), N'产品列表:包税/不包税'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_tax_mode');
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'包税', 'TAX_INCLUDED', 'bms_tax_mode', '', 'success', 'Y', '0', 'admin', sysdate(), N''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_tax_mode' AND dict_value = 'TAX_INCLUDED');
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'不包税', 'TAX_EXCLUDED', 'bms_tax_mode', '', 'warning', 'N', '0', 'admin', sysdate(), N''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_tax_mode' AND dict_value = 'TAX_EXCLUDED');
@@ -1,35 +0,0 @@
-- prc_order_bill: income_total + pay_total
SET NAMES utf8mb4;
SET @db := DATABASE();
SET @has_income := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'income_total'
);
SET @has_payable := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'payable_total'
);
SET @sql := IF(@has_income = 0 AND @has_payable > 0,
'ALTER TABLE prc_order_bill CHANGE COLUMN payable_total income_total DECIMAL(10,2) DEFAULT NULL COMMENT \'应收总额\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has_income2 := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'income_total'
);
SET @sql := IF(@has_income2 = 0,
'ALTER TABLE prc_order_bill ADD COLUMN income_total DECIMAL(10,2) DEFAULT NULL COMMENT \'应收总额\' AFTER surcharge_amount',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has_pay := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill' AND COLUMN_NAME = 'pay_total'
);
SET @sql := IF(@has_pay = 0,
'ALTER TABLE prc_order_bill ADD COLUMN pay_total DECIMAL(10,2) DEFAULT NULL COMMENT \'应付总额\' AFTER income_total',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-137
View File
@@ -1,137 +0,0 @@
-- ----------------------------
-- BMS price set: 套餐管理 · 价格套餐管理
-- charset: utf8mb4
-- menu_id: 2200-2210
-- 相对 PRD《价格表优化建表.sql》差异:
-- 1. prc_price_set 增加 price_set_code / set_type / default_discount,status 对齐原型 D/A/E/R/S
-- 2. 新增 prc_price_set_detail(原型 FIXED/DISCOUNT 明细,运费+挂号费同行)
-- 3. prc_customer_price_set 增加 customer_name / bind_priority
-- ----------------------------
CREATE TABLE IF NOT EXISTS prc_price_set (
price_set_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '价格套餐id',
price_set_code VARCHAR(20) DEFAULT NULL COMMENT '套餐编码 SET0001',
price_set_name VARCHAR(50) NOT NULL COMMENT '报价名称',
price_set_note VARCHAR(200) DEFAULT NULL COMMENT '备注',
set_type VARCHAR(10) NOT NULL DEFAULT 'FIXED' COMMENT '计价类型 FIXED=固定价 DISCOUNT=折扣',
default_discount DECIMAL(5,2) DEFAULT NULL COMMENT '默认折扣百分数 1-99,仅 DISCOUNT',
default_type CHAR(1) DEFAULT NULL COMMENT '默认套餐 Y=默认',
calculate_sign CHAR(1) DEFAULT NULL COMMENT '试算标记 Y=外部试算套餐',
effective_date DATE DEFAULT NULL COMMENT 'effective date (null until activate)',
expire_date DATE DEFAULT NULL COMMENT '失效日期(空=长期)',
status CHAR(1) NOT NULL DEFAULT 'D' COMMENT 'D草稿 A审核中 E生效 R驳回 S停用',
tms_id BIGINT(20) DEFAULT NULL COMMENT '多租户系统ID',
created_by VARCHAR(64) DEFAULT '' COMMENT '创建人',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (price_set_id),
UNIQUE KEY uk_price_set_code (price_set_code),
INDEX idx_ps_status (status),
INDEX idx_ps_type (set_type),
INDEX idx_ps_tms (tms_id),
INDEX idx_ps_effective (effective_date, expire_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格方案表-报价基本资料';
CREATE TABLE IF NOT EXISTS prc_price_set_detail (
psd_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '套餐明细id',
price_set_id BIGINT(20) NOT NULL COMMENT '价格套餐id',
product_code VARCHAR(10) NOT NULL COMMENT '产品代码',
product_name VARCHAR(50) DEFAULT NULL COMMENT '产品名称',
country_code CHAR(2) DEFAULT NULL COMMENT 'country ISO2',
country_name VARCHAR(50) DEFAULT NULL COMMENT 'country name',
zone_id BIGINT(20) DEFAULT NULL COMMENT 'prc_zone.zone_id',
zone_code VARCHAR(50) DEFAULT NULL COMMENT 'zone code e.g. Z1',
zone_name VARCHAR(100) DEFAULT NULL COMMENT 'zone display name',
zd_id BIGINT(20) DEFAULT NULL COMMENT 'legacy zone division id',
wsd_id BIGINT(20) DEFAULT NULL COMMENT '重量段明细id',
weight_label VARCHAR(50) 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',
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 可覆盖默认',
round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
pr_id INT(11) DEFAULT NULL COMMENT '关联价格规则id',
effective_date DATE DEFAULT NULL COMMENT '生效日期',
expire_date DATE DEFAULT NULL COMMENT '失效日期(空=长期)',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (psd_id),
INDEX idx_psd_set (price_set_id),
INDEX idx_psd_product (price_set_id, product_code, country_code),
INDEX idx_psd_weight_match (price_set_id, product_code, country_code, weight_min, weight_max),
INDEX idx_psd_eff (price_set_id, effective_date, expire_date),
INDEX idx_psd_product_country (product_country_id),
CONSTRAINT fk_psd_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='价格套餐明细-固定价/折扣范围';
CREATE TABLE IF NOT EXISTS prc_customer_price_set (
customer_priceset_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '客户价格套餐id',
price_set_id BIGINT(20) NOT NULL COMMENT '价格套餐id',
customer_id BIGINT(20) DEFAULT NULL COMMENT '客户id',
customer_code VARCHAR(50) DEFAULT NULL COMMENT '客户代码',
customer_name VARCHAR(100) DEFAULT NULL COMMENT '客户名称(展示)',
bind_priority INT(11) NOT NULL DEFAULT 1 COMMENT '优先级,数字越小越优先',
pr_begindate DATETIME NOT NULL COMMENT '价格开始生效日期',
pr_enddate DATETIME DEFAULT NULL COMMENT '价格失效日期(空=长期)',
price_set_note VARCHAR(100) 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 '更新时间',
PRIMARY KEY (customer_priceset_id),
UNIQUE KEY uk_customer_one_set (customer_code),
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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户套餐表-客户某时间段内使用的套餐';
-- 套餐管理目录
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)
SELECT 2200, N'套餐管理', 0, 8, 'customer', NULL, '', '', 1, 0, 'M', '0', '0', '', 'peoples', 'admin', sysdate(), N'套餐管理目录'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2200);
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)
SELECT 2201, N'价格套餐管理', 2200, 1, 'set', 'price/set/priceSet', '', 'PriceSet', 1, 0, 'C', '0', '0', 'price:set:list', 'shopping', 'admin', sysdate(), N'价格套餐管理菜单'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2201);
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)
SELECT 2202, N'套餐查询', 2201, 1, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:set:query', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2202);
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)
SELECT 2203, N'套餐新增', 2201, 2, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:set:add', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2203);
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)
SELECT 2204, N'套餐修改', 2201, 3, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:set:edit', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2204);
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)
SELECT 2205, N'套餐删除', 2201, 4, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:set:remove', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2205);
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)
SELECT 2206, N'套餐审核', 2201, 5, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:set:audit', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2206);
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)
SELECT 2208, N'新建套餐', 2200, 2, 'setCreate', 'price/set/create', '', 'PriceSetCreate', 1, 0, 'C', '1', '0', 'price:set:add', '#', 'admin', sysdate(), N'新建套餐隐藏页'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2208);
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)
SELECT 2209, N'套餐详情', 2200, 3, 'setDetail', 'price/set/detail', '', 'PriceSetDetail', 1, 0, 'C', '1', '0', 'price:set:query', '#', 'admin', sysdate(), N'套餐详情隐藏页'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2209);
-- role_id=1 grants
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2200 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2200);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2201 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2201);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2202 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2202);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2203 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2203);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2204 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2204);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2205 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2205);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2206 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2206);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2208 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2208);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2209 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2209);
@@ -1,6 +0,0 @@
-- 价格套餐明细关联 bms_product_country.detail_id
SET NAMES utf8mb4;
ALTER TABLE prc_price_set_detail
ADD COLUMN product_country_id bigint DEFAULT NULL COMMENT 'bms_product_country.detail_id' AFTER weight_label,
ADD KEY idx_psd_product_country (product_country_id);
@@ -1,6 +0,0 @@
-- Add round_mode to price set detail
-- dict: bms_round_mode (UP / DOWN / HALF_UP)
SET NAMES utf8mb4;
ALTER TABLE prc_price_set_detail
ADD COLUMN round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' COMMENT 'round mode (dict bms_round_mode)' AFTER discount_value;
@@ -1,22 +0,0 @@
-- Prevent duplicate FIXED details within one version (same product_country snapshot row)
-- MySQL allows multiple NULLs in UNIQUE, so DISCOUNT rows (product_country_id null) are OK.
SET NAMES utf8mb4;
SET @db := DATABASE();
-- Clean exact duplicates before adding unique key (keep min psd_id)
DELETE d1 FROM prc_price_set_detail d1
INNER JOIN prc_price_set_detail d2
ON d1.psv_id = d2.psv_id
AND d1.product_country_id = d2.product_country_id
AND d1.psd_id > d2.psd_id
WHERE d1.psv_id IS NOT NULL
AND d1.product_country_id IS NOT NULL;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND INDEX_NAME = 'uk_psd_psv_product_country'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD UNIQUE KEY uk_psd_psv_product_country (psv_id, product_country_id)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
@@ -1,38 +0,0 @@
-- prc_price_set_detail: weight_min/weight_max + effective_date/expire_date
-- same types as bms_product_country
SET NAMES utf8mb4;
SET @db := DATABASE();
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_price_set_detail' AND COLUMN_NAME='weight_min');
SET @sql := IF(@has=0, 'ALTER TABLE prc_price_set_detail ADD COLUMN weight_min DECIMAL(10,3) DEFAULT NULL COMMENT ''重量段最小值KG(含)'' AFTER weight_label', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_price_set_detail' AND COLUMN_NAME='weight_max');
SET @sql := IF(@has=0, 'ALTER TABLE prc_price_set_detail ADD COLUMN weight_max DECIMAL(10,3) DEFAULT NULL COMMENT ''重量段最大值KG(含)'' AFTER weight_min', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_price_set_detail' AND COLUMN_NAME='effective_date');
SET @sql := IF(@has=0, 'ALTER TABLE prc_price_set_detail ADD COLUMN effective_date DATE DEFAULT NULL COMMENT ''生效日期'' AFTER pr_id', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_price_set_detail' AND COLUMN_NAME='expire_date');
SET @sql := IF(@has=0, 'ALTER TABLE prc_price_set_detail ADD COLUMN expire_date DATE DEFAULT NULL COMMENT ''失效日期(空=长期)'' AFTER effective_date', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_price_set_detail' AND INDEX_NAME='idx_psd_weight_match');
SET @sql := IF(@has=0, 'ALTER TABLE prc_price_set_detail ADD INDEX idx_psd_weight_match (price_set_id, product_code, country_code, weight_min, weight_max)', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=@db AND TABLE_NAME='prc_price_set_detail' AND INDEX_NAME='idx_psd_eff');
SET @sql := IF(@has=0, 'ALTER TABLE prc_price_set_detail ADD INDEX idx_psd_eff (price_set_id, effective_date, expire_date)', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 回填: 从 bms_product_country 带入重量段与有效期
UPDATE prc_price_set_detail d
INNER JOIN bms_product_country c ON c.detail_id = d.product_country_id
SET
d.weight_min = IFNULL(d.weight_min, c.weight_min),
d.weight_max = IFNULL(d.weight_max, c.weight_max),
d.effective_date = IFNULL(d.effective_date, c.effective_date),
d.expire_date = IFNULL(d.expire_date, c.expire_date)
WHERE d.product_country_id IS NOT NULL;
@@ -1,55 +0,0 @@
-- Add zone fields to prc_price_set_detail (nullable when country has no zone)
-- Idempotent: safe to re-run
-- charset: utf8mb4
SET NAMES utf8mb4;
SET @db := DATABASE();
-- zone_id
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'zone_id'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD COLUMN zone_id BIGINT(20) DEFAULT NULL COMMENT ''prc_zone.zone_id'' AFTER country_name',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- zone_code
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'zone_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD COLUMN zone_code VARCHAR(50) DEFAULT NULL COMMENT ''zone code e.g. Z1'' AFTER zone_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- zone_name
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'zone_name'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD COLUMN zone_name VARCHAR(100) DEFAULT NULL COMMENT ''zone display name'' AFTER zone_code',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- index
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND INDEX_NAME = 'idx_psd_zone'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD INDEX idx_psd_zone (zone_id)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND INDEX_NAME = 'idx_psd_country_zone'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD INDEX idx_psd_country_zone (price_set_id, product_code, country_code, zone_code)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
@@ -1,10 +0,0 @@
-- price:set:forceEdit: edit any version status (design highest privilege)
SET NAMES utf8mb4;
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)
SELECT 2207, N'任意版本编辑', 2201, 6, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:set:forceEdit', '#', 'admin', sysdate(), N'设计最高权限:任意状态版本可编辑价格明细'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2207 OR perms = 'price:set:forceEdit');
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, 2207 FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2207);
-152
View File
@@ -1,152 +0,0 @@
-- 价格套餐版本中间表 + 版本附加费
-- 关系:
-- prc_price_set
-- -> prc_price_set_version (步骤2: 版本号自动生成, 生效时间)
-- -> prc_price_set_detail (步骤3: 产品价格, 通过 psv_id)
-- -> prc_price_set_version_surcharge (psd_id 关联明细)
-- 可重复执行
SET NAMES utf8mb4;
SET @db := DATABASE();
CREATE TABLE IF NOT EXISTS prc_price_set_version (
psv_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '套餐版本id',
price_set_id BIGINT(20) NOT NULL COMMENT '价格套餐id',
version_no VARCHAR(20) NOT NULL COMMENT '版本号 V1/V2,自动+1',
version_seq INT(11) NOT NULL COMMENT '版本序号,用于自动+1',
effective_time DATETIME DEFAULT NULL COMMENT 'version start time (null until activate)',
expire_time DATETIME DEFAULT NULL COMMENT '失效时间(空=长期;下一版本启动时写入该启动时间)',
status CHAR(1) NOT NULL DEFAULT '0' COMMENT '0草稿 1生效 2失效',
created_by VARCHAR(64) DEFAULT '' COMMENT '创建人',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
updated_by VARCHAR(64) 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),
INDEX idx_psv_set_eff (price_set_id, effective_time),
INDEX 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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格套餐版本';
CREATE TABLE IF NOT EXISTS prc_price_set_version_surcharge (
psvs_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '版本附加费id',
psv_id BIGINT(20) NOT NULL COMMENT '套餐版本id',
psd_id BIGINT(20) NOT NULL COMMENT '套餐明细id',
sc_id BIGINT(20) DEFAULT NULL COMMENT '来源附加费配置id',
product_code VARCHAR(20) DEFAULT NULL COMMENT '产品代码(与明细一致)',
sc_name VARCHAR(100) NOT NULL COMMENT '附加费名称快照',
fee_type VARCHAR(30) NOT NULL DEFAULT 'SURCHARGE' COMMENT '费用类型(字典bms_fee_type)',
charge_type VARCHAR(20) NOT NULL COMMENT '计费方式 FIXED固定金额/WEIGHT按重量/RATE按比例',
charge_value DECIMAL(18,6) NOT NULL COMMENT '计费数值快照',
currency CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
country_code CHAR(2) DEFAULT NULL COMMENT '适用国家ISO2(空=全部)',
sc_note 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 '更新时间',
PRIMARY KEY (psvs_id),
INDEX idx_psvs_psv (psv_id),
INDEX idx_psvs_psd (psd_id),
INDEX idx_psvs_product (psv_id, product_code),
INDEX idx_psvs_sc (sc_id),
CONSTRAINT fk_psvs_psv FOREIGN KEY (psv_id) REFERENCES prc_price_set_version (psv_id) ON DELETE CASCADE,
CONSTRAINT fk_psvs_psd FOREIGN KEY (psd_id) REFERENCES prc_price_set_detail (psd_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='价格套餐版本附加费快照';
-- expire_time: previous version expire = next version effective_time (start)
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND COLUMN_NAME = 'expire_time'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_version ADD COLUMN expire_time DATETIME DEFAULT NULL COMMENT ''失效时间(空=长期;下一版本启动时写入该启动时间)'' AFTER effective_time',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- backfill: expire_time = next version start time (by version_seq)
UPDATE prc_price_set_version cur
INNER JOIN prc_price_set_version nxt
ON nxt.price_set_id = cur.price_set_id
AND nxt.version_seq = cur.version_seq + 1
SET cur.expire_time = nxt.effective_time;
-- prc_price_set_detail.psv_id
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND COLUMN_NAME = 'psv_id'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD COLUMN psv_id BIGINT(20) DEFAULT NULL COMMENT ''套餐版本id'' AFTER price_set_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND INDEX_NAME = 'idx_psd_psv'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD INDEX idx_psd_psv (psv_id)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND CONSTRAINT_NAME = 'fk_psd_psv'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_detail ADD CONSTRAINT fk_psd_psv FOREIGN KEY (psv_id) REFERENCES prc_price_set_version (psv_id) ON DELETE CASCADE',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 已建表补关联: 附加费.psd_id -> 套餐明细
DELETE FROM prc_price_set_version_surcharge
WHERE psd_id IS NULL
OR NOT EXISTS (
SELECT 1 FROM prc_price_set_detail d WHERE d.psd_id = prc_price_set_version_surcharge.psd_id
);
SET @sql := CONCAT(
'ALTER TABLE prc_price_set_version_surcharge MODIFY COLUMN psd_id BIGINT(20) NOT NULL COMMENT ''套餐明细id'''
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version_surcharge' AND CONSTRAINT_NAME = 'fk_psvs_psd'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_price_set_version_surcharge ADD CONSTRAINT fk_psvs_psd FOREIGN KEY (psd_id) REFERENCES prc_price_set_detail (psd_id) ON DELETE CASCADE',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 回填: 每个已有套餐生成一条 V1
INSERT INTO prc_price_set_version (
price_set_id, version_no, version_seq, effective_time, status, created_by, create_time
)
SELECT
s.price_set_id,
'V1',
1,
COALESCE(CAST(s.effective_date AS DATETIME), s.create_time, NOW()),
CASE
WHEN s.status = 'S' THEN '2'
WHEN s.expire_date IS NOT NULL AND s.expire_date <= CURDATE() THEN '2'
WHEN s.status = 'E' AND (s.effective_date IS NULL OR s.effective_date <= CURDATE()) THEN '1'
ELSE '0'
END,
IFNULL(s.created_by, ''),
NOW()
FROM prc_price_set s
WHERE NOT EXISTS (
SELECT 1 FROM prc_price_set_version v WHERE v.price_set_id = s.price_set_id
);
-- 将已有明细绑定到同一套餐的 V1
UPDATE prc_price_set_detail d
INNER JOIN prc_price_set_version v
ON v.price_set_id = d.price_set_id AND v.version_seq = 1
SET d.psv_id = v.psv_id
WHERE d.psv_id IS NULL;
@@ -1,23 +0,0 @@
-- Draft package / version: effective dates nullable until activate
SET NAMES utf8mb4;
SET @db := DATABASE();
-- prc_price_set.effective_date
SET @nullable := (
SELECT IS_NULLABLE FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set' AND COLUMN_NAME = 'effective_date'
);
SET @sql := IF(@nullable = 'NO',
'ALTER TABLE prc_price_set MODIFY COLUMN effective_date DATE DEFAULT NULL COMMENT ''effective date (null until version activate)''',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- prc_price_set_version.effective_time
SET @nullable := (
SELECT IS_NULLABLE FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_version' AND COLUMN_NAME = 'effective_time'
);
SET @sql := IF(@nullable = 'NO',
'ALTER TABLE prc_price_set_version MODIFY COLUMN effective_time DATETIME DEFAULT NULL COMMENT ''version start time (null until activate)''',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
@@ -1,7 +0,0 @@
-- Comment only: version status now includes pending (3)
-- 0 draft / 3 pending (effective_time in future) / 1 effect / 2 expired
-- No column change; CHAR(1) already supports '3'.
ALTER TABLE prc_price_set_version
MODIFY COLUMN status CHAR(1) NOT NULL DEFAULT '0'
COMMENT '0 draft 3 pending 1 effect 2 expired';
-91
View File
@@ -1,91 +0,0 @@
-- 产品主数据(来源:威狮B2C小包价表.xlsx)
-- 导入范围:产品目录 + 各产品 sheet 国家×重量段(运费/挂号费/尺寸/尾程/时效)
-- 不导入:退件重派、申报说明、赔偿标准
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS bms_product (
product_id bigint NOT NULL AUTO_INCREMENT COMMENT '产品ID',
product_code varchar(20) NOT NULL COMMENT '产品对接代码,如 WSP037',
product_name varchar(100) NOT NULL COMMENT '产品名称',
service_level varchar(20) DEFAULT NULL COMMENT '时效等级:标准等',
cargo_attr varchar(100) DEFAULT NULL COMMENT '走货属性:普货/F普货/带电/敏感等',
dest_region varchar(50) DEFAULT NULL COMMENT '目的区域:欧盟等',
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 '目录生效日期',
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',
created_by varchar(50) NOT NULL DEFAULT '',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_by varchar(50) NOT NULL DEFAULT '',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (product_id),
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,可空待补齐',
zone_id bigint DEFAULT NULL COMMENT 'prc_zone.zone_id',
zone_code varchar(50) DEFAULT NULL COMMENT 'zone code e.g. Z1',
zone_name varchar(100) 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) DEFAULT NULL COMMENT '尺寸限制',
last_mile varchar(500) DEFAULT NULL COMMENT '尾程派送说明',
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已失效',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (detail_id),
UNIQUE KEY uk_product_country_zone_weight_eff (product_code, country_name, zone_code, weight_min, weight_max, effective_date),
KEY idx_product_country_pid (product_id),
KEY idx_country_code (country_code),
KEY idx_product_country_zone (zone_id),
KEY idx_product_country_zone_code (country_code, zone_code),
KEY idx_weight_match (product_code, country_code, weight_min, weight_max),
KEY idx_product_eff (product_code, effective_date, expire_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品国家明细-重量段+运费挂号费+尺寸/尾程/时效';
-- 已建表升级(幂等:列已存在时跳过报错可忽略)
-- ALTER TABLE bms_product_country ADD COLUMN weight_min decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)' AFTER country_code;
-- ALTER TABLE bms_product_country ADD COLUMN weight_max decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)' AFTER weight_min;
-- ALTER TABLE bms_product_country DROP INDEX uk_product_country;
-- ALTER TABLE bms_product_country ADD UNIQUE KEY uk_product_country_weight (product_code, country_name, weight_min, weight_max);
-- ALTER TABLE bms_product_country ADD KEY idx_weight_match (product_code, country_code, weight_min, weight_max);
-- 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)
SELECT 2130, N'产品列表', 2100, 0, 'product', 'price/basic/product/index', '', 'PriceProduct', 1, 0, 'C', '0', '0', 'price:product:list', 'shopping', 'admin', sysdate(), N'产品目录与国家服务明细'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2130);
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 2131, N'产品查询', 2130, 1, '', NULL, 1, 0, 'F', '0', '0', 'price:product:query', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2131);
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 2132, N'产品新增', 2130, 2, '', NULL, 1, 0, 'F', '0', '0', 'price:product:add', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2132);
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 2133, N'产品修改', 2130, 3, '', NULL, 1, 0, 'F', '0', '0', 'price:product:edit', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2133);
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 2134, N'产品删除', 2130, 4, '', NULL, 1, 0, 'F', '0', '0', 'price:product:remove', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2134);
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 2135, N'产品导入', 2130, 5, '', NULL, 1, 0, 'F', '0', '0', 'price:product:import', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2135);
INSERT INTO sys_role_menu(role_id, menu_id)
SELECT 1, m.menu_id FROM (SELECT 2130 AS menu_id UNION SELECT 2131 UNION SELECT 2132 UNION SELECT 2133 UNION SELECT 2134 UNION SELECT 2135) m
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id=1 AND rm.menu_id=m.menu_id);
@@ -1,20 +0,0 @@
-- ----------------------------
-- 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);
@@ -1,14 +0,0 @@
-- Add expire_date for product country versioning on re-import
-- When new effective_date is later than previous, keep old rows and set their expire_date = new effective_date
SET NAMES utf8mb4;
ALTER TABLE bms_product_country
ADD COLUMN expire_date date DEFAULT NULL COMMENT 'expire date (null=open; set to next import effective_date)' AFTER effective_date;
-- Allow multiple versions: unique includes 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);
ALTER TABLE bms_product_country
ADD KEY idx_product_eff (product_code, effective_date, expire_date);
@@ -1,7 +0,0 @@
-- 产品国家明细增加运费/挂号费(与 Excel 重量段同行)
-- 执行后请在「产品列表」重新导入威狮B2C小包价表.xlsx
SET NAMES utf8mb4;
ALTER TABLE bms_product_country
ADD COLUMN freight_price decimal(10,4) DEFAULT NULL COMMENT '运费 RMB/KG' AFTER weight_max,
ADD COLUMN registration_fee decimal(10,2) DEFAULT NULL COMMENT '挂号费 RMB/票' AFTER freight_price;
@@ -1,6 +0,0 @@
-- 若之前 ALTER 将 COMMENT 写成乱码,执行此脚本修复
SET NAMES utf8mb4;
ALTER TABLE bms_product_country
MODIFY COLUMN freight_price decimal(10,4) DEFAULT NULL COMMENT '运费 RMB/KG',
MODIFY COLUMN registration_fee decimal(10,2) DEFAULT NULL COMMENT '挂号费 RMB/票';
@@ -1,27 +0,0 @@
-- 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;
@@ -1,13 +0,0 @@
-- 已存在 bms_product_country 时升级:增加重量段最小/最大值,便于后续按重量匹配
-- 执行后请重新在「产品列表」导入 Excel(旧数据一行一国 → 新数据按重量段多行)
SET NAMES utf8mb4;
ALTER TABLE bms_product_country
ADD COLUMN weight_min decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)' AFTER country_code,
ADD COLUMN weight_max decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)' AFTER weight_min;
-- 旧唯一键(国家级)改为重量段级
ALTER TABLE bms_product_country DROP INDEX uk_product_country;
ALTER TABLE bms_product_country
ADD UNIQUE KEY uk_product_country_weight (product_code, country_name, weight_min, weight_max),
ADD KEY idx_weight_match (product_code, country_code, weight_min, weight_max);
@@ -1,74 +0,0 @@
-- Add zone fields to bms_product_country (nullable when no zone)
-- Idempotent: safe to re-run (skip if column/index already exists)
-- charset: utf8mb4
SET NAMES utf8mb4;
SET @db := DATABASE();
-- zone_id
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND COLUMN_NAME = 'zone_id'
);
SET @sql := IF(@has = 0,
'ALTER TABLE bms_product_country ADD COLUMN zone_id BIGINT(20) DEFAULT NULL COMMENT ''prc_zone.zone_id'' AFTER country_code',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- zone_code
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND COLUMN_NAME = 'zone_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE bms_product_country ADD COLUMN zone_code VARCHAR(50) DEFAULT NULL COMMENT ''zone code e.g. Z1'' AFTER zone_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- zone_name
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND COLUMN_NAME = 'zone_name'
);
SET @sql := IF(@has = 0,
'ALTER TABLE bms_product_country ADD COLUMN zone_name VARCHAR(100) DEFAULT NULL COMMENT ''zone display name'' AFTER zone_code',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- indexes
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND INDEX_NAME = 'idx_product_country_zone'
);
SET @sql := IF(@has = 0,
'ALTER TABLE bms_product_country ADD INDEX idx_product_country_zone (zone_id)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND INDEX_NAME = 'idx_product_country_zone_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE bms_product_country ADD INDEX idx_product_country_zone_code (country_code, zone_code)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- unique key: drop old, add new
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND INDEX_NAME = 'uk_product_country_weight_eff'
);
SET @sql := IF(@has > 0,
'ALTER TABLE bms_product_country DROP INDEX uk_product_country_weight_eff',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'bms_product_country' AND INDEX_NAME = 'uk_product_country_zone_weight_eff'
);
SET @sql := IF(@has = 0,
'ALTER TABLE bms_product_country ADD UNIQUE KEY uk_product_country_zone_weight_eff (product_code, country_name, zone_code, weight_min, weight_max, effective_date)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
@@ -1,58 +0,0 @@
-- 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');
@@ -1,40 +0,0 @@
-- ============================================================
-- bms_product / bms_product_country 自动状态回填
-- ============================================================
-- 背景:
-- bms_product.status char(1) DEFAULT '0' COMMENT '0待生效 1已生效 2已失效'
-- bms_product_country.status char(1) DEFAULT '0' COMMENT '0待生效 1已生效 2已失效'
-- 字典 bms_product_effect_status value=ACTIVE/PENDING/EXPIRED
-- 自动刷新:
-- BmsStatusRefreshTask 每天 02:00 调用两表 Mapper.refreshStatusByDates()
-- 即本文件末尾的回填 SQL(每日定时跑同样效果)
-- 现状验证:
-- bms_product.status 当前值仅 '0' / '1'('2' = EXPIRED 尚未触发,因今天 2026-09-09
-- 还没到任一 expire_date);bms_product_country.status 同上
-- ============================================================
SET NAMES utf8mb4;
-- ---------- 一次性回填(幂等:重跑结果一致) ----------
-- bms_product:
-- expire_date 非空且 <= 今天 → '2' 已失效
-- effective_date 为空 / 未来 → '0' 待生效
-- 其余(已生效且仍在有效期) → '1' 已生效
UPDATE bms_product p
SET p.status = (
CASE
WHEN p.expire_date IS NOT NULL AND p.expire_date <= CURDATE() THEN '2'
WHEN p.effective_date IS NULL OR p.effective_date > CURDATE() THEN '0'
ELSE '1'
END
);
-- bms_product_country:同上规则(多了 detail 级过期判断)
UPDATE bms_product_country c
SET c.status = (
CASE
WHEN c.expire_date IS NOT NULL AND c.expire_date <= CURDATE() THEN '2'
WHEN c.effective_date IS NULL OR c.effective_date > CURDATE() THEN '0'
ELSE '1'
END
);
@@ -1,29 +0,0 @@
-- prc_quote add customer_code; backfill from bms_customer
-- Idempotent
SET NAMES utf8mb4;
SET @db := DATABASE();
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'customer_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD COLUMN customer_code VARCHAR(50) DEFAULT NULL COMMENT ''customer code'' AFTER customer_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @hasIdx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND INDEX_NAME = 'idx_quote_customer_code'
);
SET @sql := IF(@hasIdx = 0,
'ALTER TABLE prc_quote ADD INDEX idx_quote_customer_code (customer_code, biz_date)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
UPDATE prc_quote q
INNER JOIN bms_customer c ON c.customer_id = q.customer_id
SET q.customer_code = c.customer_code
WHERE q.customer_id IS NOT NULL
AND q.customer_id <> 0
AND (q.customer_code IS NULL OR q.customer_code = '');
@@ -1,59 +0,0 @@
-- prc_quote: customer_code required + included in unique business key
-- Idempotent; safe after quote_customer_code_alter.sql
SET NAMES utf8mb4;
SET @db := DATABASE();
-- Ensure column exists
SET @has := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'customer_code'
);
SET @sql := IF(@has = 0,
'ALTER TABLE prc_quote ADD COLUMN customer_code VARCHAR(50) DEFAULT NULL COMMENT ''customer code'' AFTER customer_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- Backfill from bms_customer
UPDATE prc_quote q
INNER JOIN bms_customer c ON c.customer_id = q.customer_id
SET q.customer_code = c.customer_code
WHERE q.customer_id IS NOT NULL
AND q.customer_id <> 0
AND (q.customer_code IS NULL OR q.customer_code = '');
-- Remove rows that still have no customer_code (cannot join unique NOT NULL)
DELETE FROM prc_quote WHERE customer_code IS NULL OR customer_code = '';
-- NOT NULL
ALTER TABLE prc_quote
MODIFY COLUMN customer_code VARCHAR(50) NOT NULL COMMENT 'customer code';
-- Drop old non-unique index if present
SET @hasIdx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND INDEX_NAME = 'idx_quote_customer_code'
);
SET @sql := IF(@hasIdx > 0,
'ALTER TABLE prc_quote DROP INDEX idx_quote_customer_code',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- Normalized postcode for unique (NULL -> '')
SET @hasGen := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND COLUMN_NAME = 'quote_postcode_key'
);
SET @sql := IF(@hasGen = 0,
'ALTER TABLE prc_quote ADD COLUMN quote_postcode_key VARCHAR(20) AS (IFNULL(dest_postcode, '''')) STORED COMMENT ''dest_postcode for unique key'' AFTER dest_postcode',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- Unique: customer_code + product + country + postcode + weight + biz_date
SET @hasUk := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_quote' AND INDEX_NAME = 'uk_quote_cust_biz'
);
SET @sql := IF(@hasUk = 0,
'ALTER TABLE prc_quote ADD UNIQUE KEY uk_quote_cust_biz (customer_code, product_code, country_code, quote_postcode_key, weight, biz_date)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-72
View File
@@ -1,72 +0,0 @@
-- ----------------------------
-- 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',
customer_code VARCHAR(50) NOT NULL COMMENT '客户代码',
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 '国家名称',
dest_postcode VARCHAR(20) DEFAULT NULL COMMENT '目的邮编',
quote_postcode_key VARCHAR(20) AS (IFNULL(dest_postcode, '')) STORED 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 '创建人',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (quote_id),
UNIQUE KEY uk_quote_key (quote_key),
UNIQUE KEY uk_quote_cust_biz (customer_code, product_code, country_code, quote_postcode_key, weight, biz_date),
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 '备注',
create_time 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='计费试算费用明细-附加费按具体名称一行';
@@ -1,21 +0,0 @@
-- ----------------------------
-- 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 '费用名称(附加费取配置名称)';
-41
View File
@@ -1,41 +0,0 @@
-- ======================================================================
-- prc_quote / prc_quote_fee 主键改 UUID 改造(VARCHAR(36))
--
-- 背景:测试大数据量场景下 UUID 主键的查询性能
-- 风险:会清空 prc_quote / prc_quote_fee 全部数据
-- 备份:quote_uuid_backup.sql(保留原始 schema)
--
-- 关键顺序(踩坑总结):
-- 1. DROP FOREIGN KEY
-- 2. TRUNCATE TABLE
-- 3. **先 MODIFY 列去掉 AUTO_INCREMENT**,再 DROP PRIMARY KEY
-- 否则 InnoDB 报 1075「auto column must be defined as a key」
-- 4. 再 MODIFY quote_id 列 / ADD PRIMARY KEY
-- 5. ADD FOREIGN KEY 时**会自动创建 quote_id 索引**,不要额外 ADD INDEX
-- 否则报 1061「Duplicate key name」
--
-- 回滚:参考 quote_uuid_backup.sql,重建表结构即可
-- ======================================================================
-- === 1. 解除外键 ===
ALTER TABLE prc_quote_fee DROP FOREIGN KEY fk_quote_fee_quote;
-- === 2. 清空数据 ===
TRUNCATE TABLE prc_quote_fee;
TRUNCATE TABLE prc_quote;
-- === 3. prc_quote: PK 改 UUID ===
-- 顺序很关键:先 MODIFY 列去掉 AUTO_INCREMENT
ALTER TABLE prc_quote MODIFY quote_id VARCHAR(36) NOT NULL COMMENT '试算ID(UUID)';
ALTER TABLE prc_quote DROP PRIMARY KEY;
ALTER TABLE prc_quote ADD PRIMARY KEY (quote_id);
-- === 4. prc_quote_fee: PK 改 UUID; quote_id 列同步 ===
ALTER TABLE prc_quote_fee MODIFY fee_id VARCHAR(36) NOT NULL COMMENT '费用明细ID(UUID)';
ALTER TABLE prc_quote_fee DROP PRIMARY KEY;
ALTER TABLE prc_quote_fee MODIFY quote_id VARCHAR(36) NOT NULL COMMENT '试算ID(UUID)';
ALTER TABLE prc_quote_fee ADD PRIMARY KEY (fee_id);
-- === 5. 重建 FK(自动创建 idx_quote_fee_quote_id 索引,无需手动加) ===
ALTER TABLE prc_quote_fee ADD CONSTRAINT fk_quote_fee_quote
FOREIGN KEY (quote_id) REFERENCES prc_quote (quote_id) ON DELETE CASCADE;
-61
View File
@@ -1,61 +0,0 @@
CREATE TABLE `prc_quote` (
`quote_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '试算ID',
`quote_key` char(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '试算指纹 MD5(客户|产品|国家|重量|计费日期)',
`customer_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 '产品名称',
`country_code` char(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '国家二字码',
`country_name` varchar(50) COLLATE utf8mb4_unicode_ci 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) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '命中来源 PACKAGE_FIXED/套餐固定价 PACKAGE_DISCOUNT/套餐折扣 PRODUCT_DEFAULT/产品默认价',
`match_message` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '命中说明',
`price_set_id` bigint(20) DEFAULT NULL COMMENT '价格套餐ID',
`price_set_code` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '套餐编码',
`price_set_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '套餐名称',
`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',
`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 '重量段展示',
`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) 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 '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`quote_id`),
UNIQUE KEY `uk_quote_key` (`quote_key`),
KEY `idx_quote_customer` (`customer_id`,`biz_date`),
KEY `idx_quote_product` (`product_code`,`country_code`)
) ENGINE=InnoDB AUTO_INCREMENT=150000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计费试算主表';
CREATE TABLE `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) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型(字典bms_fee_type)',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称(附加费取配置名称)',
`sc_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '附加费配置ID,运费/挂号费为0',
`amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '金额',
`currency` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RMB' COMMENT '币种',
`round_mode` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注(附加费明细摘要)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`fee_id`),
UNIQUE KEY `uk_quote_fee_item` (`quote_id`,`fee_type`,`sc_id`),
KEY `idx_quote_fee_type` (`fee_type`),
KEY `idx_quote_fee_quote_id` (`quote_id`),
CONSTRAINT `fk_quote_fee_quote` FOREIGN KEY (`quote_id`) REFERENCES `prc_quote` (`quote_id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=236791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计费试算费用明细-按费用类型一行';
-68
View File
@@ -1,68 +0,0 @@
-- rename prc_bill -> prc_order_bill, prc_bill_fee -> prc_income_bill_fee, add prc_pay_bill_fee
SET NAMES utf8mb4;
SET @db := DATABASE();
SET @fk := (
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_bill_fee' AND CONSTRAINT_TYPE = 'FOREIGN KEY'
LIMIT 1
);
SET @sql := IF(@fk IS NOT NULL,
CONCAT('ALTER TABLE prc_bill_fee DROP FOREIGN KEY `', @fk, '`'),
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has_old := (
SELECT COUNT(*) FROM information_schema.TABLES
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_bill'
);
SET @has_new := (
SELECT COUNT(*) FROM information_schema.TABLES
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_order_bill'
);
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE prc_bill TO prc_order_bill', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @has_old_fee := (
SELECT COUNT(*) FROM information_schema.TABLES
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_bill_fee'
);
SET @has_new_fee := (
SELECT COUNT(*) FROM information_schema.TABLES
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_income_bill_fee'
);
SET @sql := IF(@has_old_fee > 0 AND @has_new_fee = 0, 'RENAME TABLE prc_bill_fee TO prc_income_bill_fee', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @fk2 := (
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_income_bill_fee'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
LIMIT 1
);
SET @sql := IF(@fk2 IS NULL,
'ALTER TABLE prc_income_bill_fee ADD CONSTRAINT fk_income_bill_fee_order FOREIGN KEY (bill_id) REFERENCES prc_order_bill (bill_id) ON DELETE CASCADE',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
ALTER TABLE prc_order_bill COMMENT = '订单信息主表';
ALTER TABLE prc_income_bill_fee COMMENT = '应收费用明细';
CREATE TABLE IF NOT EXISTS prc_pay_bill_fee (
fee_id VARCHAR(36) NOT NULL COMMENT '费用明细ID',
bill_id VARCHAR(36) 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',
amount DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '金额',
currency VARCHAR(10) NOT NULL DEFAULT 'CNY' COMMENT '币种',
round_mode VARCHAR(20) DEFAULT 'HALF_UP' COMMENT '取值方式',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (fee_id),
UNIQUE KEY uk_pay_bill_fee_item (bill_id, fee_type, sc_id),
INDEX idx_pay_bill_fee_type (fee_type),
CONSTRAINT fk_pay_bill_fee_order FOREIGN KEY (bill_id) REFERENCES prc_order_bill (bill_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应付费用明细';
@@ -1,57 +0,0 @@
-- Rename created_at -> create_time, updated_at -> update_time
-- Price/billing/zone tables created for BMS. Safe to re-run.
DROP PROCEDURE IF EXISTS bms_rename_col;
DELIMITER $$
CREATE PROCEDURE bms_rename_col(IN tbl VARCHAR(64), IN old_col VARCHAR(64), IN new_col VARCHAR(64), IN col_def VARCHAR(255))
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tbl AND COLUMN_NAME = old_col
) AND NOT EXISTS (
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tbl AND COLUMN_NAME = new_col
) THEN
SET @sql = CONCAT('ALTER TABLE `', tbl, '` CHANGE COLUMN `', old_col, '` `', new_col, '` ', col_def);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
-- DATETIME NULL
CALL bms_rename_col('prc_price_set', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_price_set', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_price_set_detail', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_price_set_detail', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_customer_price_set', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_customer_price_set', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_surcharge', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_surcharge', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_surcharge_rel', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_surcharge_rel', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_quote', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_quote', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_quote_fee', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_bill', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_bill', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_bill_fee', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('xtd_zone_scheme', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('xtd_zone_scheme', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('xtd_zone_division', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('xtd_zone_division', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('xtd_zonecountry', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('xtd_zonecountry', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_weight_section_template', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_weight_section_template', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_weight_section_detail', 'created_at', 'create_time', 'DATETIME DEFAULT NULL');
CALL bms_rename_col('prc_weight_section_detail', 'updated_at', 'update_time', 'DATETIME DEFAULT NULL');
-- product tables keep timestamp defaults
CALL bms_rename_col('bms_product', 'created_at', 'create_time', 'datetime NOT NULL DEFAULT CURRENT_TIMESTAMP');
CALL bms_rename_col('bms_product', 'updated_at', 'update_time', 'datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
CALL bms_rename_col('bms_product_country', 'created_at', 'create_time', 'datetime NOT NULL DEFAULT CURRENT_TIMESTAMP');
CALL bms_rename_col('bms_product_country', 'updated_at', 'update_time', 'datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
DROP PROCEDURE IF EXISTS bms_rename_col;
-55
View File
@@ -1,55 +0,0 @@
-- ----------------------------
-- BMS price basic: surcharge config (附加费配置)
-- charset: utf8mb4
-- menu_id: 2115-2119
-- ----------------------------
CREATE TABLE IF NOT EXISTS prc_surcharge (
sc_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '附加费配置ID',
sc_name VARCHAR(100) NOT NULL COMMENT '附加费名称',
fee_type VARCHAR(30) NOT NULL DEFAULT 'SURCHARGE' COMMENT '费用类型(字典bms_fee_type)',
charge_type VARCHAR(20) NOT NULL COMMENT '计费方式 FIXED固定金额/WEIGHT按重量/RATE按比例',
charge_value DECIMAL(18,6) NOT NULL COMMENT '计费数值',
currency CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)',
ss_code VARCHAR(20) NOT NULL DEFAULT 'on' COMMENT '状态 on/of',
country_code CHAR(2) DEFAULT NULL COMMENT '适用国家ISO2(空=全部)',
sc_note VARCHAR(500) DEFAULT NULL COMMENT '备注',
tms_id BIGINT(20) DEFAULT NULL COMMENT '租户ID',
created_by VARCHAR(64) DEFAULT '' COMMENT '创建人',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (sc_id),
INDEX idx_sc_ss_code (ss_code),
INDEX idx_sc_country (country_code),
INDEX idx_sc_tms_id (tms_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='附加费配置';
-- menus 2115-2119
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)
SELECT 2115, N'附加费配置', 2100, 3, 'surcharge', 'price/basic/surcharge/index', '', 'PriceSurcharge', 1, 0, 'C', '0', '0', 'price:surcharge:list', 'money', 'admin', sysdate(), N'附加费配置菜单'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2115);
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)
SELECT 2116, N'附加费查询', 2115, 1, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:query', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2116);
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)
SELECT 2117, N'附加费新增', 2115, 2, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:add', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2117);
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)
SELECT 2118, N'附加费修改', 2115, 3, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:edit', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2118);
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)
SELECT 2119, N'附加费删除', 2115, 4, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:remove', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2119);
-- role_id=1 grants
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2115 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2115);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2116 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2116);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2117 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2117);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2118 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2118);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2119 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2119);
-39
View File
@@ -1,39 +0,0 @@
-- 附加费关联表:维护 prc_surcharge 与 bms_product(产品表) / bms_product_country(明细表) 的关系
-- 语义:
-- product_id 产品主键(外键关联 bms_product.product_id,与 product_code 一一对应)
-- product_code 产品对接代码(便于与明细表 bms_product_country 及前端交互)
-- detail_id 为空 = 产品级附加费(作用于该产品全部明细)
-- 有值 = 明细级附加费(作用于该产品某个 国家×重量段 明细)
-- 一个附加费可关联多个产品/明细;一个产品/明细可挂多个附加费(多对多)
-- 执行后即可在「产品列表」按产品/明细维护附加费关联
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS 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) NOT NULL COMMENT '产品对接代码 bms_product.product_code',
detail_id BIGINT(20) DEFAULT NULL COMMENT '产品明细ID bms_product_country.detail_id(空=作用于产品全部明细)',
created_by VARCHAR(64) DEFAULT '' COMMENT '创建人',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (rel_id),
UNIQUE KEY uk_rel_scope (sc_id, product_id, detail_id),
INDEX idx_rel_sc (sc_id),
INDEX idx_rel_product (product_id),
INDEX idx_rel_product_code (product_code),
INDEX idx_rel_detail (detail_id),
CONSTRAINT fk_rel_sc FOREIGN KEY (sc_id) REFERENCES prc_surcharge (sc_id) ON DELETE CASCADE,
CONSTRAINT fk_rel_product FOREIGN KEY (product_id) REFERENCES bms_product (product_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='附加费与产品/明细关联表';
-- 若已按旧版(无 product_id)建表且已有数据,升级步骤:
-- ALTER TABLE prc_surcharge_rel ADD COLUMN product_id BIGINT(20) DEFAULT NULL COMMENT '产品ID' AFTER sc_id;
-- UPDATE prc_surcharge_rel r JOIN bms_product p ON p.product_code = r.product_code SET r.product_id = p.product_id;
-- ALTER TABLE prc_surcharge_rel MODIFY COLUMN product_id BIGINT(20) NOT NULL COMMENT '产品ID bms_product.product_id';
-- ALTER TABLE prc_surcharge_rel ADD INDEX idx_rel_product (product_id);
-- ALTER TABLE prc_surcharge_rel ADD CONSTRAINT fk_rel_product FOREIGN KEY (product_id) REFERENCES bms_product (product_id) ON DELETE CASCADE;
-- 若上一版方案(prc_surcharge 加 product_code 字段)已执行,可手动回退(MySQL 5.7 不支持 DROP COLUMN IF EXISTS):
-- ALTER TABLE prc_surcharge DROP COLUMN product_code;
-43
View File
@@ -1,43 +0,0 @@
-- ----------------------------
-- Zone management: bms_region -> prc_zone -> prc_zone_detail
-- Country master is bms_region (no prc_zone_country)
-- charset: utf8mb4
-- ----------------------------
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS prc_zone_detail;
DROP TABLE IF EXISTS prc_zone;
DROP TABLE IF EXISTS prc_zone_country;
DROP TABLE IF EXISTS xtd_zonecountry;
DROP TABLE IF EXISTS xtd_zone_division;
DROP TABLE IF EXISTS xtd_zone_scheme;
SET FOREIGN_KEY_CHECKS = 1;
CREATE TABLE IF NOT EXISTS prc_zone (
zone_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'zone id',
region_id BIGINT(20) NOT NULL COMMENT 'bms_region.region_id',
country_code VARCHAR(10) NOT NULL COMMENT 'ISO2 country code from bms_region',
zone_code VARCHAR(50) NOT NULL COMMENT 'zone code e.g. 1',
zone_name VARCHAR(100) DEFAULT NULL COMMENT 'display name e.g. AU(1)',
zone_sort INT(11) DEFAULT 0 COMMENT 'sort',
remark VARCHAR(500) DEFAULT NULL COMMENT 'remark',
create_time DATETIME DEFAULT NULL COMMENT 'created at',
update_time DATETIME DEFAULT NULL COMMENT 'updated at',
PRIMARY KEY (zone_id),
UNIQUE KEY uk_zone_region_code (region_id, zone_code),
INDEX idx_zone_region_id (region_id),
INDEX idx_zone_country_code (country_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='zone under bms_region';
CREATE TABLE IF NOT EXISTS prc_zone_detail (
detail_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'detail id',
zone_id BIGINT(20) NOT NULL COMMENT 'zone id',
postcode VARCHAR(32) NOT NULL COMMENT 'postcode',
create_time DATETIME DEFAULT NULL COMMENT 'created at',
update_time DATETIME DEFAULT NULL COMMENT 'updated at',
PRIMARY KEY (detail_id),
INDEX idx_zd_zone_id (zone_id),
INDEX idx_zd_postcode (postcode),
UNIQUE KEY uk_zd_zone_postcode (zone_id, postcode),
CONSTRAINT fk_zd_zone FOREIGN KEY (zone_id) REFERENCES prc_zone (zone_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='zone postcode detail';
@@ -1,16 +0,0 @@
-- Add country_code to existing prc_zone (skip if re-running full zone_country.sql)
-- charset: utf8mb4
ALTER TABLE prc_zone
ADD COLUMN country_code VARCHAR(10) NULL COMMENT 'ISO2 country code from bms_region' AFTER region_id;
UPDATE prc_zone z
INNER JOIN bms_region r ON r.region_id = z.region_id
SET z.country_code = r.country_code_2
WHERE z.country_code IS NULL OR z.country_code = '';
ALTER TABLE prc_zone
MODIFY COLUMN country_code VARCHAR(10) NOT NULL COMMENT 'ISO2 country code from bms_region';
ALTER TABLE prc_zone
ADD INDEX idx_zone_country_code (country_code);
-102
View File
@@ -1,102 +0,0 @@
-- ----------------------------
-- BMS price basic: zone / weight section
-- charset: utf8mb4
-- menu_id: 2100-2123 (2115-2123 reserved)
-- ----------------------------
-- Zone tables moved to zone_country.sql (prc_zone_country / prc_zone / prc_zone_detail)
-- Run: bms-back/sql/price/zone_country.sql
CREATE TABLE IF NOT EXISTS prc_weight_section_template (
wst_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'weight template id',
wst_name VARCHAR(100) NOT NULL COMMENT 'template name',
ss_code VARCHAR(20) NOT NULL DEFAULT 'on' COMMENT 'status on/off',
pg_code VARCHAR(50) DEFAULT NULL COMMENT 'product group code',
sn_id BIGINT(20) DEFAULT NULL COMMENT 'service channel id',
ct_code VARCHAR(50) DEFAULT NULL COMMENT 'cargo type code',
pm_code VARCHAR(50) DEFAULT NULL COMMENT 'payment method code',
wst_note VARCHAR(500) DEFAULT NULL COMMENT 'note',
tms_id BIGINT(20) DEFAULT NULL COMMENT 'tenant id',
created_by VARCHAR(64) DEFAULT '' COMMENT 'created by',
create_time DATETIME DEFAULT NULL COMMENT 'created at',
updated_by VARCHAR(64) DEFAULT '' COMMENT 'updated by',
update_time DATETIME DEFAULT NULL COMMENT 'updated at',
PRIMARY KEY (wst_id),
INDEX idx_wst_ss_code (ss_code),
INDEX idx_wst_tms_id (tms_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='weight section template';
CREATE TABLE IF NOT EXISTS prc_weight_section_detail (
wsd_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'weight detail id globally unique',
wst_id BIGINT(20) NOT NULL COMMENT 'template id',
wl_title VARCHAR(100) DEFAULT NULL COMMENT 'title',
wl_startweight DECIMAL(18,6) NOT NULL COMMENT 'start weight',
wl_endweight DECIMAL(18,6) NOT NULL COMMENT 'end weight',
weight_billing_code VARCHAR(20) DEFAULT NULL COMMENT 'billing code',
fv_unitweight DECIMAL(18,6) DEFAULT NULL COMMENT 'unit weight',
effective_date DATE DEFAULT NULL COMMENT 'effective date',
expire_date DATE DEFAULT NULL COMMENT 'expire date',
create_time DATETIME DEFAULT NULL COMMENT 'created at',
update_time DATETIME DEFAULT NULL COMMENT 'updated at',
PRIMARY KEY (wsd_id),
INDEX idx_wsd_wst_id (wst_id),
CONSTRAINT fk_wsd_wst FOREIGN KEY (wst_id) REFERENCES prc_weight_section_template (wst_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='weight section detail';
-- menus 2100-2114 (active); 2115-2123 reserved
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)
SELECT 2100, N'价格基础', 0, 7, 'price', NULL, '', '', 1, 0, 'M', '0', '0', '', 'money', 'admin', sysdate(), N'价格基础数据目录'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2100);
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)
SELECT 2101, N'分区管理', 2100, 1, 'zone', 'price/basic/zone/index', '', 'PriceZone', 1, 0, 'C', '0', '0', 'price:zone:list', 'international', 'admin', sysdate(), N'分区管理菜单'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2101);
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)
SELECT 2102, N'分区查询', 2101, 1, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:zone:query', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2102);
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)
SELECT 2103, N'分区新增', 2101, 2, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:zone:add', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2103);
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)
SELECT 2104, N'分区修改', 2101, 3, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:zone:edit', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2104);
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)
SELECT 2105, N'分区删除', 2101, 4, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:zone:remove', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2105);
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)
SELECT 2110, N'重量段管理', 2100, 2, 'weight', 'price/basic/weight/index', '', 'PriceWeight', 1, 0, 'C', '0', '0', 'price:weight:list', 'chart', 'admin', sysdate(), N'重量段管理菜单'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2110);
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)
SELECT 2111, N'重量段查询', 2110, 1, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:weight:query', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2111);
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)
SELECT 2112, N'重量段新增', 2110, 2, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:weight:add', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2112);
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)
SELECT 2113, N'重量段修改', 2110, 3, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:weight:edit', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2113);
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)
SELECT 2114, N'重量段删除', 2110, 4, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:weight:remove', '#', 'admin', sysdate(), ''
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2114);
-- role_id=1 grants
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2100 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2100);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2101 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2101);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2102 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2102);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2103 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2103);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2104 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2104);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2105 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2105);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2110 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2110);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2111 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2111);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2112 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2112);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2113 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2113);
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2114 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2114);