修改类型

This commit is contained in:
wuweihua
2026-11-10 14:38:38 +08:00
parent de5784cbac
commit e6a9fcf0a2
12 changed files with 808 additions and 337 deletions
+357
View File
@@ -0,0 +1,357 @@
-- 应付附加费一键脚本(可重复执行)。
-- 合并自:
-- 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) = '';