diff --git a/bms-back/sql/price/README_billing_postcode.md b/bms-back/sql/price/README_billing_postcode.md deleted file mode 100644 index ab259466..00000000 --- a/bms-back/sql/price/README_billing_postcode.md +++ /dev/null @@ -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` diff --git a/bms-back/sql/price/README_price_set_version.md b/bms-back/sql/price/README_price_set_version.md deleted file mode 100644 index 86dfa120..00000000 --- a/bms-back/sql/price/README_price_set_version.md +++ /dev/null @@ -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. diff --git a/bms-back/sql/price/bill.sql b/bms-back/sql/price/bill.sql deleted file mode 100644 index 59c11568..00000000 --- a/bms-back/sql/price/bill.sql +++ /dev/null @@ -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='应付费用明细'; diff --git a/bms-back/sql/price/bill_menu.sql b/bms-back/sql/price/bill_menu.sql deleted file mode 100644 index ff9a738e..00000000 --- a/bms-back/sql/price/bill_menu.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/bill_order_info_alter.sql b/bms-back/sql/price/bill_order_info_alter.sql deleted file mode 100644 index 00b221ce..00000000 --- a/bms-back/sql/price/bill_order_info_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/billing_menu.sql b/bms-back/sql/price/billing_menu.sql deleted file mode 100644 index 445b30f9..00000000 --- a/bms-back/sql/price/billing_menu.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/billing_postcode_alter.sql b/bms-back/sql/price/billing_postcode_alter.sql deleted file mode 100644 index c8962ad8..00000000 --- a/bms-back/sql/price/billing_postcode_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/billing_zone_alter.sql b/bms-back/sql/price/billing_zone_alter.sql deleted file mode 100644 index fab86b77..00000000 --- a/bms-back/sql/price/billing_zone_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/customer_code_alter.sql b/bms-back/sql/price/customer_code_alter.sql deleted file mode 100644 index 45e2153c..00000000 --- a/bms-back/sql/price/customer_code_alter.sql +++ /dev/null @@ -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 = ''; diff --git a/bms-back/sql/price/customer_one_set_unique_alter.sql b/bms-back/sql/price/customer_one_set_unique_alter.sql deleted file mode 100644 index 690a237c..00000000 --- a/bms-back/sql/price/customer_one_set_unique_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/dict_charge_currency.sql b/bms-back/sql/price/dict_charge_currency.sql deleted file mode 100644 index 0f80048b..00000000 --- a/bms-back/sql/price/dict_charge_currency.sql +++ /dev/null @@ -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'; diff --git a/bms-back/sql/price/dict_fee_round.sql b/bms-back/sql/price/dict_fee_round.sql deleted file mode 100644 index 095708c0..00000000 --- a/bms-back/sql/price/dict_fee_round.sql +++ /dev/null @@ -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'; diff --git a/bms-back/sql/price/dict_product_effect_status.sql b/bms-back/sql/price/dict_product_effect_status.sql deleted file mode 100644 index 9645fe54..00000000 --- a/bms-back/sql/price/dict_product_effect_status.sql +++ /dev/null @@ -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'); diff --git a/bms-back/sql/price/dict_tax_mode.sql b/bms-back/sql/price/dict_tax_mode.sql deleted file mode 100644 index bb234c44..00000000 --- a/bms-back/sql/price/dict_tax_mode.sql +++ /dev/null @@ -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'); diff --git a/bms-back/sql/price/order_bill_totals_alter.sql b/bms-back/sql/price/order_bill_totals_alter.sql deleted file mode 100644 index d9157b39..00000000 --- a/bms-back/sql/price/order_bill_totals_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/price_set.sql b/bms-back/sql/price/price_set.sql deleted file mode 100644 index 5b1b09bf..00000000 --- a/bms-back/sql/price/price_set.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/price_set_detail_product_country_alter.sql b/bms-back/sql/price/price_set_detail_product_country_alter.sql deleted file mode 100644 index 2e0477ac..00000000 --- a/bms-back/sql/price/price_set_detail_product_country_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/price_set_detail_round_mode_alter.sql b/bms-back/sql/price/price_set_detail_round_mode_alter.sql deleted file mode 100644 index 3cb34d1e..00000000 --- a/bms-back/sql/price/price_set_detail_round_mode_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/price_set_detail_unique_alter.sql b/bms-back/sql/price/price_set_detail_unique_alter.sql deleted file mode 100644 index 570bbee0..00000000 --- a/bms-back/sql/price/price_set_detail_unique_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/price_set_detail_weight_eff_alter.sql b/bms-back/sql/price/price_set_detail_weight_eff_alter.sql deleted file mode 100644 index bfee6991..00000000 --- a/bms-back/sql/price/price_set_detail_weight_eff_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/price_set_detail_zone_alter.sql b/bms-back/sql/price/price_set_detail_zone_alter.sql deleted file mode 100644 index db929899..00000000 --- a/bms-back/sql/price/price_set_detail_zone_alter.sql +++ /dev/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; diff --git a/bms-back/sql/price/price_set_force_edit_menu.sql b/bms-back/sql/price/price_set_force_edit_menu.sql deleted file mode 100644 index 9b5af96c..00000000 --- a/bms-back/sql/price/price_set_force_edit_menu.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/price_set_version.sql b/bms-back/sql/price/price_set_version.sql deleted file mode 100644 index 2945e458..00000000 --- a/bms-back/sql/price/price_set_version.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/price_set_version_eff_nullable.sql b/bms-back/sql/price/price_set_version_eff_nullable.sql deleted file mode 100644 index 11a7edc7..00000000 --- a/bms-back/sql/price/price_set_version_eff_nullable.sql +++ /dev/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; diff --git a/bms-back/sql/price/price_set_version_status_pending_comment.sql b/bms-back/sql/price/price_set_version_status_pending_comment.sql deleted file mode 100644 index 87f8c87a..00000000 --- a/bms-back/sql/price/price_set_version_status_pending_comment.sql +++ /dev/null @@ -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'; diff --git a/bms-back/sql/price/product.sql b/bms-back/sql/price/product.sql deleted file mode 100644 index 94111bd1..00000000 --- a/bms-back/sql/price/product.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/product_code_eff_unique_alter.sql b/bms-back/sql/price/product_code_eff_unique_alter.sql deleted file mode 100644 index a5f1aecc..00000000 --- a/bms-back/sql/price/product_code_eff_unique_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/product_country_expire_alter.sql b/bms-back/sql/price/product_country_expire_alter.sql deleted file mode 100644 index 45bdc571..00000000 --- a/bms-back/sql/price/product_country_expire_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/product_country_fee_alter.sql b/bms-back/sql/price/product_country_fee_alter.sql deleted file mode 100644 index 25cdd0e1..00000000 --- a/bms-back/sql/price/product_country_fee_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/product_country_fee_fix_comment.sql b/bms-back/sql/price/product_country_fee_fix_comment.sql deleted file mode 100644 index 2d65ba4a..00000000 --- a/bms-back/sql/price/product_country_fee_fix_comment.sql +++ /dev/null @@ -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/票'; diff --git a/bms-back/sql/price/product_country_product_id_alter.sql b/bms-back/sql/price/product_country_product_id_alter.sql deleted file mode 100644 index 7fb2e07f..00000000 --- a/bms-back/sql/price/product_country_product_id_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/product_country_weight_alter.sql b/bms-back/sql/price/product_country_weight_alter.sql deleted file mode 100644 index 59c38bb2..00000000 --- a/bms-back/sql/price/product_country_weight_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/product_country_zone_alter.sql b/bms-back/sql/price/product_country_zone_alter.sql deleted file mode 100644 index 1d9dfb5f..00000000 --- a/bms-back/sql/price/product_country_zone_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/product_expire_status_alter.sql b/bms-back/sql/price/product_expire_status_alter.sql deleted file mode 100644 index 46b7eed6..00000000 --- a/bms-back/sql/price/product_expire_status_alter.sql +++ /dev/null @@ -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'); diff --git a/bms-back/sql/price/product_status_alter.sql b/bms-back/sql/price/product_status_alter.sql deleted file mode 100644 index bee4e381..00000000 --- a/bms-back/sql/price/product_status_alter.sql +++ /dev/null @@ -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 -); \ No newline at end of file diff --git a/bms-back/sql/price/quote_customer_code_alter.sql b/bms-back/sql/price/quote_customer_code_alter.sql deleted file mode 100644 index 4837cec4..00000000 --- a/bms-back/sql/price/quote_customer_code_alter.sql +++ /dev/null @@ -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 = ''); diff --git a/bms-back/sql/price/quote_customer_code_unique_alter.sql b/bms-back/sql/price/quote_customer_code_unique_alter.sql deleted file mode 100644 index 6cc0b76f..00000000 --- a/bms-back/sql/price/quote_customer_code_unique_alter.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/quote_fee.sql b/bms-back/sql/price/quote_fee.sql deleted file mode 100644 index f2942fea..00000000 --- a/bms-back/sql/price/quote_fee.sql +++ /dev/null @@ -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='计费试算费用明细-附加费按具体名称一行'; diff --git a/bms-back/sql/price/quote_fee_surcharge_name_alter.sql b/bms-back/sql/price/quote_fee_surcharge_name_alter.sql deleted file mode 100644 index f4519ebe..00000000 --- a/bms-back/sql/price/quote_fee_surcharge_name_alter.sql +++ /dev/null @@ -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 '费用名称(附加费取配置名称)'; diff --git a/bms-back/sql/price/quote_uuid_alter.sql b/bms-back/sql/price/quote_uuid_alter.sql deleted file mode 100644 index 74956797..00000000 --- a/bms-back/sql/price/quote_uuid_alter.sql +++ /dev/null @@ -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; \ No newline at end of file diff --git a/bms-back/sql/price/quote_uuid_backup.sql b/bms-back/sql/price/quote_uuid_backup.sql deleted file mode 100644 index 6b45d7ff..00000000 --- a/bms-back/sql/price/quote_uuid_backup.sql +++ /dev/null @@ -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='计费试算费用明细-按费用类型一行'; diff --git a/bms-back/sql/price/rename_bill_tables.sql b/bms-back/sql/price/rename_bill_tables.sql deleted file mode 100644 index bc7f7251..00000000 --- a/bms-back/sql/price/rename_bill_tables.sql +++ /dev/null @@ -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='应付费用明细'; diff --git a/bms-back/sql/price/rename_create_update_time.sql b/bms-back/sql/price/rename_create_update_time.sql deleted file mode 100644 index cd16e252..00000000 --- a/bms-back/sql/price/rename_create_update_time.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/surcharge.sql b/bms-back/sql/price/surcharge.sql deleted file mode 100644 index 87d07f3d..00000000 --- a/bms-back/sql/price/surcharge.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/surcharge_rel.sql b/bms-back/sql/price/surcharge_rel.sql deleted file mode 100644 index 659d6203..00000000 --- a/bms-back/sql/price/surcharge_rel.sql +++ /dev/null @@ -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; diff --git a/bms-back/sql/price/zone_country.sql b/bms-back/sql/price/zone_country.sql deleted file mode 100644 index 1118f464..00000000 --- a/bms-back/sql/price/zone_country.sql +++ /dev/null @@ -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'; diff --git a/bms-back/sql/price/zone_country_code_alter.sql b/bms-back/sql/price/zone_country_code_alter.sql deleted file mode 100644 index 01751d58..00000000 --- a/bms-back/sql/price/zone_country_code_alter.sql +++ /dev/null @@ -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); diff --git a/bms-back/sql/price/zone_weight.sql b/bms-back/sql/price/zone_weight.sql deleted file mode 100644 index bf971c63..00000000 --- a/bms-back/sql/price/zone_weight.sql +++ /dev/null @@ -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); \ No newline at end of file