Files
BMS/bms-back/sql/price/pay_surcharge_setup.sql
T
2026-11-10 14:38:38 +08:00

358 lines
19 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 应付附加费一键脚本(可重复执行)。
-- 合并自:
-- sql/price/pay_product.sql
-- sql/price/migrate_surcharge_type_to_prc_surcharge.sql
-- sql/price/pay_surcharge_sc_id.sql
-- sql/data/bms_surcharge_type.sql(字典已废弃,改迁 prc_surcharge)
-- 步骤:1)建表/菜单 2)补 sc_id 3)字典迁入 prc_surcharge 并删字典 4)回填 sc_id/币种
SET NAMES utf8mb4;
-- ========== 1. 应付价卡表与菜单 ==========
-- 应付价卡配置。目录里的一个产品一行,重量段和附加费挂在产品下面。
-- 表名使用 pay_ 前缀。可重复执行。
CREATE TABLE IF NOT EXISTS `pay_product` (
`product_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '产品ID',
`product_name` varchar(200) NOT NULL COMMENT '目录中的产品名称',
`product_type` varchar(30) DEFAULT NULL COMMENT '产品类型:AR:应收、AP:应付',
`country_scope` varchar(200) DEFAULT NULL COMMENT '目录中的国家或口岸',
`service_type` varchar(100) DEFAULT NULL COMMENT '服务类型',
`classification` varchar(100) DEFAULT NULL COMMENT '目录分类',
`catalog_remark` varchar(1000) DEFAULT NULL COMMENT '目录备注',
`update_content` varchar(500) DEFAULT NULL COMMENT '目录更新内容',
`weight_limit` varchar(100) DEFAULT NULL COMMENT '目录重量限制',
`sheet_name` varchar(200) NOT NULL COMMENT '报价工作表',
`related_sheet` varchar(500) DEFAULT NULL COMMENT '目录里一并指向的分区或附加表,不单独入库',
`source_file` varchar(500) NOT NULL COMMENT '来源文件名',
`file_path` varchar(500) DEFAULT NULL COMMENT '源文件OSS地址,oss://bucket/key',
`file_md5` char(32) NOT NULL COMMENT '来源文件MD5',
`supplier_name` varchar(100) DEFAULT NULL COMMENT '价卡归属,如威狮、易德、GWE',
`effective_date` date DEFAULT NULL COMMENT '价卡生效日',
`currency` varchar(20) DEFAULT NULL COMMENT '报价币种',
`service_note` varchar(4000) DEFAULT NULL COMMENT '报价表中的服务说明',
`parse_status` varchar(20) NOT NULL DEFAULT 'OK' COMMENT '识别结果:OK已识别 EMPTY未识别到配置 MISSING缺少工作表',
`weight_count` int(11) NOT NULL DEFAULT 0 COMMENT '重量段行数',
`surcharge_count` int(11) NOT NULL DEFAULT 0 COMMENT '附加费行数',
`extra_count` int(11) NOT NULL DEFAULT 0 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 '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`product_id`),
KEY `idx_pay_product_name` (`product_name`),
KEY `idx_pay_product_file` (`file_md5`, `sheet_name`),
KEY `idx_pay_product_effective` (`effective_date`),
KEY `idx_pay_product_supplier` (`supplier_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应付价卡产品';
CREATE TABLE IF NOT EXISTS `pay_weight_band` (
`band_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '重量段ID',
`product_id` bigint(20) NOT NULL COMMENT '产品ID',
`version_no` int(11) NOT NULL DEFAULT 1 COMMENT '价卡版本,随产品版本变更',
`section_name` varchar(200) DEFAULT NULL COMMENT '报价区块,如派送费、偏远、额外线路',
`country_name` varchar(200) DEFAULT NULL COMMENT '国家',
`country_code` varchar(32) DEFAULT NULL COMMENT '国家二字码,多个用逗号',
`zone_name` varchar(200) DEFAULT NULL COMMENT '分区或价格列',
`weight_label` varchar(100) DEFAULT NULL COMMENT '重量段原文,如0<W≤1、首重1 Kg',
`weight_min` decimal(10,3) DEFAULT NULL COMMENT '重量下限KG',
`weight_max` decimal(10,3) DEFAULT NULL COMMENT '重量上限KG',
`volume_text` varchar(40) DEFAULT NULL COMMENT '体积上限,数字加单位,如10000cm³',
`charge_name` varchar(200) DEFAULT NULL COMMENT '费用项,如处理费、派送费、续重',
`price` decimal(12,4) DEFAULT NULL COMMENT '单价',
`price_unit` varchar(40) DEFAULT NULL COMMENT '单位,如EUR/ITEM、EUR/KG',
`sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
PRIMARY KEY (`band_id`),
KEY `idx_pay_weight_product` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应付产品重量段和起重配置';
CREATE TABLE IF NOT EXISTS `pay_surcharge` (
`surcharge_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '附加费ID',
`product_id` bigint(20) NOT NULL COMMENT '产品ID',
`version_no` int(11) NOT NULL DEFAULT 1 COMMENT '价卡版本,随产品版本变更',
`section_name` varchar(200) DEFAULT NULL COMMENT '附加费区块',
`fee_name` varchar(200) NOT NULL COMMENT '费用名称',
`sc_id` bigint(20) DEFAULT NULL COMMENT '附加费配置ID,对应 prc_surcharge.sc_id',
`zone_name` varchar(200) DEFAULT NULL COMMENT '适用分区,没有则空',
`charge_text` varchar(500) DEFAULT NULL COMMENT '收费标准原文',
`amount` decimal(12,4) DEFAULT NULL COMMENT '能解析出的金额或百分比',
`currency` varchar(20) DEFAULT NULL COMMENT '币种',
`price_unit` varchar(40) DEFAULT NULL COMMENT '货币和计费单位,如EUR/ITEM、RMB/KG、%',
`fee_desc` varchar(2000) DEFAULT NULL COMMENT '费用说明',
`period_text` varchar(500) DEFAULT NULL COMMENT '时效原文',
`effective_start` date DEFAULT NULL COMMENT '生效开始,空表示价卡期内一直有效',
`effective_end` date DEFAULT NULL COMMENT '生效结束',
`charge_timing` varchar(40) DEFAULT NULL COMMENT '收取时点:固定收取、产生时收取、旺季期间',
`sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
PRIMARY KEY (`surcharge_id`),
KEY `idx_pay_surcharge_product` (`product_id`),
KEY `idx_pay_surcharge_sc` (`sc_id`),
KEY `idx_pay_surcharge_period` (`effective_start`, `effective_end`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应付产品附加费,含时效';
CREATE TABLE IF NOT EXISTS `pay_extra_line` (
`line_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '配置行ID',
`product_id` bigint(20) NOT NULL COMMENT '产品ID',
`line_type` varchar(20) NOT NULL COMMENT '行类型:邮编、配置',
`line_text` varchar(1000) NOT NULL COMMENT '原文,列之间用 | 分隔',
`sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
PRIMARY KEY (`line_id`),
KEY `idx_pay_extra_product` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应付产品上的邮编或其他配置原文';
-- 菜单挂在价格基础下面
SET @parentId := (
SELECT menu_id FROM sys_menu
WHERE path = 'basic' AND menu_type = 'M'
ORDER BY menu_id ASC LIMIT 1
);
SET @parentId := IFNULL(@parentId, (
SELECT parent_id FROM sys_menu
WHERE perms = 'price:product:list' OR component LIKE '%price/basic/product%'
ORDER BY menu_id ASC LIMIT 1
));
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
SELECT '应付配置', @parentId, 16, 'pay', 'price/basic/pay/index', 1, 0, 'C', '0', '0', 'price:pay:list', 'money', 'admin', sysdate(), '应付价卡产品、重量段和附加费'
WHERE @parentId IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'price:pay:list' OR component = 'price/basic/pay/index');
SET @menuId := (SELECT menu_id FROM sys_menu WHERE perms = 'price:pay:list' LIMIT 1);
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
SELECT '应付配置查询', @menuId, 1, '', '', 1, 0, 'F', '0', '0', 'price:pay:query', '#', 'admin', sysdate()
WHERE @menuId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'price:pay:query');
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
SELECT '应付配置导入', @menuId, 2, '', '', 1, 0, 'F', '0', '0', 'price:pay:import', '#', 'admin', sysdate()
WHERE @menuId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'price:pay:import');
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
SELECT '应付配置删除', @menuId, 3, '', '', 1, 0, 'F', '0', '0', 'price:pay:remove', '#', 'admin', sysdate()
WHERE @menuId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'price:pay:remove');
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
SELECT '应付配置导出', @menuId, 4, '', '', 1, 0, 'F', '0', '0', 'price:pay:export', '#', 'admin', sysdate()
WHERE @menuId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'price:pay:export');
-- 已经能维护价格基础的角色,同步拿到应付配置菜单
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT DISTINCT rm.role_id, m.menu_id
FROM sys_role_menu rm
JOIN sys_menu src ON src.menu_id = rm.menu_id AND src.perms = 'price:product:list'
JOIN sys_menu m ON m.perms LIKE 'price:pay:%'
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_menu x WHERE x.role_id = rm.role_id AND x.menu_id = m.menu_id
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, m.menu_id
FROM sys_menu m
WHERE m.perms LIKE 'price:pay:%'
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu x WHERE x.role_id = 1 AND x.menu_id = m.menu_id
);
-- ========== 2. pay_surcharge 补 sc_id(已有表时) ==========
SET @sql = (
SELECT IF(
COUNT(*) = 0,
'ALTER TABLE pay_surcharge ADD COLUMN sc_id bigint(20) DEFAULT NULL COMMENT ''附加费配置ID,对应 prc_surcharge.sc_id'' AFTER fee_name, ADD KEY idx_pay_surcharge_sc (sc_id)',
'SELECT 1'
)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pay_surcharge' AND COLUMN_NAME = 'sc_id'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ========== 3. 字典 bms_surcharge_type 迁入 prc_surcharge,并删除字典 ==========
-- 已存在同名且未作废的附加费不覆盖;新增行默认 FIXED/0、币种 EUR
INSERT INTO prc_surcharge (
sc_name, fee_type, charge_type, charge_value, currency, round_mode, ss_code, is_del,
sc_note, created_by, create_time
)
SELECT v.sc_name, 'SURCHARGE', 'FIXED', 0, 'EUR', 'HALF_UP', 'on', '0',
'从附加费类型字典迁移', 'admin', sysdate()
FROM (
SELECT '疫情附加费' AS sc_name
UNION ALL SELECT '燃油附加费' AS sc_name
UNION ALL SELECT '地址及联系方式修正费' AS sc_name
UNION ALL SELECT '城市邮编不匹配' AS sc_name
UNION ALL SELECT '分拣机不可操作费' AS sc_name
UNION ALL SELECT '超重超尺寸费' AS sc_name
UNION ALL SELECT '脱碳附加费' AS sc_name
UNION ALL SELECT '非法国电话联系费' AS sc_name
UNION ALL SELECT '换面单费' AS sc_name
UNION ALL SELECT '交错仓罚金' AS sc_name
UNION ALL SELECT '乡村邮编单量占比过大罚金' AS sc_name
UNION ALL SELECT '仿牌侵权罚款' AS sc_name
UNION ALL SELECT '危险品罚款' AS sc_name
UNION ALL SELECT '燃油费' AS sc_name
UNION ALL SELECT '重派费' AS sc_name
UNION ALL SELECT '退件仓库操作费' AS sc_name
UNION ALL SELECT '重派仓库操作费' AS sc_name
UNION ALL SELECT '旺季附加费' AS sc_name
UNION ALL SELECT '高峰旺季附加费' AS sc_name
UNION ALL SELECT '超尺寸超重费' AS sc_name
UNION ALL SELECT '路由码选择附加费' AS sc_name
UNION ALL SELECT '未预报附加费' AS sc_name
UNION ALL SELECT '托收附加费' AS sc_name
UNION ALL SELECT '提供虚假信息罚款费' AS sc_name
UNION ALL SELECT '零售网点路线' AS sc_name
UNION ALL SELECT '退件费' AS sc_name
UNION ALL SELECT '退件重派费' AS sc_name
UNION ALL SELECT '退件操作费' AS sc_name
UNION ALL SELECT '重派操作费' AS sc_name
UNION ALL SELECT '道路通行费' AS sc_name
UNION ALL SELECT '重量信息修正附加费' AS sc_name
UNION ALL SELECT '高风险地区附加费' AS sc_name
UNION ALL SELECT '取还服务' AS sc_name
UNION ALL SELECT '取货发货服务' AS sc_name
UNION ALL SELECT '现金服务' AS sc_name
UNION ALL SELECT '灵活配送服务' AS sc_name
UNION ALL SELECT '安全费' AS sc_name
UNION ALL SELECT '危机燃油附加费' AS sc_name
UNION ALL SELECT '能源附加费' AS sc_name
UNION ALL SELECT '异形费' AS sc_name
UNION ALL SELECT '漏预报或漏发货' AS sc_name
UNION ALL SELECT '标签费' AS sc_name
UNION ALL SELECT '无法派送费' AS sc_name
UNION ALL SELECT '变更服务费' AS sc_name
UNION ALL SELECT '二次派送费' AS sc_name
UNION ALL SELECT '签名费' AS sc_name
UNION ALL SELECT '危险货物费' AS sc_name
UNION ALL SELECT '特殊产品加收' AS sc_name
UNION ALL SELECT '岛屿附加费' AS sc_name
UNION ALL SELECT '陆运能源附加费' AS sc_name
UNION ALL SELECT '空运能源附加费' AS sc_name
UNION ALL SELECT '带电附加费' AS sc_name
UNION ALL SELECT '特货费' AS sc_name
UNION ALL SELECT '偏远费' AS sc_name
UNION ALL SELECT '偏远地区附加费' AS sc_name
UNION ALL SELECT '超大附加费(包裹)' AS sc_name
UNION ALL SELECT '超重附加费(包裹)' AS sc_name
UNION ALL SELECT '重复单号' AS sc_name
UNION ALL SELECT '未预报' AS sc_name
UNION ALL SELECT '无法投递或其他原因退件运费' AS sc_name
UNION ALL SELECT '航司可持续性附加费' AS sc_name
UNION ALL SELECT '退件处理费' AS sc_name
UNION ALL SELECT '超尺寸费' AS sc_name
UNION ALL SELECT '周末服务费' AS sc_name
UNION ALL SELECT '空气清洁费' AS sc_name
UNION ALL SELECT '拖车附加费' AS sc_name
UNION ALL SELECT '派送附加费' AS sc_name
UNION ALL SELECT '自送海外仓运费' AS sc_name
UNION ALL SELECT '操作费' AS sc_name
UNION ALL SELECT '仓库操作费' AS sc_name
UNION ALL SELECT '重新包装费' AS sc_name
UNION ALL SELECT '换包装费' AS sc_name
UNION ALL SELECT '去碳附加费' AS sc_name
UNION ALL SELECT '超重费' AS sc_name
UNION ALL SELECT '地址修正费' AS sc_name
UNION ALL SELECT '邮编城市不对应费' AS sc_name
UNION ALL SELECT '邮箱和电话缺失费' AS sc_name
UNION ALL SELECT '人工处理费' AS sc_name
UNION ALL SELECT '海外省费' AS sc_name
UNION ALL SELECT '错误送仓罚款' AS sc_name
UNION ALL SELECT '更换面单费' AS sc_name
UNION ALL SELECT '乡村地区占比超标准罚款' AS sc_name
UNION ALL SELECT 'COD' AS sc_name
UNION ALL SELECT '重新贴标附加费' AS sc_name
UNION ALL SELECT '重派运费' AS sc_name
UNION ALL SELECT '短期能源附加费' AS sc_name
UNION ALL SELECT '旺季高峰期附加费' AS sc_name
UNION ALL SELECT '面单错误附加费' AS sc_name
UNION ALL SELECT '零售网点自提费' AS sc_name
UNION ALL SELECT '异形件费' AS sc_name
UNION ALL SELECT '重量差异附加费' AS sc_name
UNION ALL SELECT '换单费' AS sc_name
UNION ALL SELECT '无法投递处理费' AS sc_name
UNION ALL SELECT '无法投递处理费-陆运' AS sc_name
UNION ALL SELECT '无法投递处理费-空运' AS sc_name
UNION ALL SELECT '战争附加费' AS sc_name
UNION ALL SELECT '超尺寸附加费' AS sc_name
UNION ALL SELECT '偏远附加费' AS sc_name
UNION ALL SELECT '空气减排费' AS sc_name
UNION ALL SELECT '面单无法识别费' AS sc_name
UNION ALL SELECT '无法派送或退件费' AS sc_name
UNION ALL SELECT '超重附加费' AS sc_name
UNION ALL SELECT '重复单号费' AS sc_name
UNION ALL SELECT '使用取消单号发货费' AS sc_name
UNION ALL SELECT '面单不符费' AS sc_name
UNION ALL SELECT '面单粘贴不合规范' AS sc_name
UNION ALL SELECT '未经允许乱交邮费' AS sc_name
UNION ALL SELECT '异形件附加费' AS sc_name
UNION ALL SELECT '退件费(陆运)' AS sc_name
UNION ALL SELECT '退件费(空运)' AS sc_name
UNION ALL SELECT '邮编城市不对应' AS sc_name
UNION ALL SELECT '收件人信息错误处理费' AS sc_name
UNION ALL SELECT '无法过机操作费' AS sc_name
UNION ALL SELECT '不可达地址费' AS sc_name
UNION ALL SELECT '销毁费' AS sc_name
UNION ALL SELECT '仓储费' AS sc_name
UNION ALL SELECT 'CO₂附加费' AS sc_name
UNION ALL SELECT '退回件处理费' AS sc_name
UNION ALL SELECT '异形件/超尺寸处理费' AS sc_name
UNION ALL SELECT '重量申报错误操作费' AS sc_name
UNION ALL SELECT '垃圾处理费' AS sc_name
UNION ALL SELECT '绿色附加费' AS sc_name
UNION ALL SELECT '无法投递费' AS sc_name
UNION ALL SELECT '额外处理费' AS sc_name
UNION ALL SELECT '超大件' AS sc_name
UNION ALL SELECT '超限制' AS sc_name
UNION ALL SELECT '地址更正' AS sc_name
UNION ALL SELECT '扩展区域收货和送货服务' AS sc_name
UNION ALL SELECT '偏远地区收货和送货服务' AS sc_name
UNION ALL SELECT '私人地址派送费' AS sc_name
UNION ALL SELECT '包裹信息缺失' AS sc_name
UNION ALL SELECT '高峰附加费' AS sc_name
UNION ALL SELECT '更改地址费' AS sc_name
UNION ALL SELECT '空气减排附加费' AS sc_name
UNION ALL SELECT '异地取货费' AS sc_name
UNION ALL SELECT '包裹退件运费' AS sc_name
UNION ALL SELECT '退件入仓处理费' AS sc_name
UNION ALL SELECT '退件重派操作费' AS sc_name
UNION ALL SELECT '退件重派运费' AS sc_name
UNION ALL SELECT '退件销毁费' AS sc_name
UNION ALL SELECT 'Bulky goods Fee' AS sc_name
UNION ALL SELECT '地址校验费' AS sc_name
UNION ALL SELECT 'Labeling fee' AS sc_name
UNION ALL SELECT '瑞典和芬兰门到门派送费' AS sc_name
UNION ALL SELECT '特别旺季附加费' AS sc_name
UNION ALL SELECT '脱欧手续费' AS sc_name
) v
WHERE NOT EXISTS (
SELECT 1 FROM prc_surcharge s
WHERE s.sc_name = v.sc_name
AND ifnull(s.is_del, '0') = '0'
AND lower(ifnull(s.ss_code, '')) <> 'vd'
);
DELETE FROM sys_dict_data WHERE dict_type = 'bms_surcharge_type';
DELETE FROM sys_dict_type WHERE dict_type = 'bms_surcharge_type';
-- ========== 4. 回填 pay_surcharge.sc_id 与空币种 ==========
-- 按名称回填未绑定的 sc_id(取未作废最新一条)
UPDATE pay_surcharge ps
INNER JOIN (
SELECT s.sc_name, MAX(s.sc_id) AS sc_id
FROM prc_surcharge s
WHERE ifnull(s.is_del, '0') = '0'
AND lower(ifnull(s.ss_code, '')) <> 'vd'
GROUP BY s.sc_name
) m ON m.sc_name = ps.fee_name
SET ps.sc_id = m.sc_id
WHERE ps.sc_id IS NULL;
-- 币种为空:先取价卡币种,再默认 EUR
UPDATE pay_surcharge ps
LEFT JOIN pay_product p ON p.product_id = ps.product_id
SET ps.currency = ifnull(nullif(trim(p.currency), ''), 'EUR')
WHERE ps.currency IS NULL OR trim(ps.currency) = '';