-- 应付附加费一键脚本(可重复执行)。 -- 合并自: -- 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) = '';