修改类型

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
@@ -72,7 +72,8 @@ public class SurchargeController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('price:surcharge:list') or @ss.hasPermi('price:surcharge:query')"
+ " or @ss.hasPermi('price:set:query') or @ss.hasPermi('price:set:add') or @ss.hasPermi('price:set:edit')"
+ " or @ss.hasPermi('price:billing:bill')")
+ " or @ss.hasPermi('price:billing:bill')"
+ " or @ss.hasPermi('price:pay:query') or @ss.hasPermi('price:pay:edit') or @ss.hasPermi('price:pay:import')")
@GetMapping("/options")
public AjaxResult listOptions(PrcSurcharge surcharge)
{
@@ -25,6 +25,9 @@ public class PaySurcharge
private String feeName;
/** 附加费配置ID,对应 prc_surcharge.sc_id */
private Long scId;
private String zoneName;
/** 收费标准原文 */
@@ -442,6 +442,7 @@ public class PayWorkbookParser
PaySurcharge copy = new PaySurcharge();
copy.setSectionName(fee.getSectionName());
copy.setFeeName(fee.getFeeName());
copy.setScId(fee.getScId());
copy.setZoneName(fee.getZoneName());
copy.setChargeText(fee.getChargeText());
copy.setAmount(fee.getAmount());
@@ -1189,7 +1190,12 @@ public class PayWorkbookParser
{
detectedCurrency = product.getCurrency();
}
if (detectedCurrency == null || detectedCurrency.isBlank())
{
detectedCurrency = "EUR";
}
product.setCurrency(detectedCurrency);
fillSurchargeCurrency(product, detectedCurrency);
product.setWeightCount(product.getWeightBands().size());
product.setSurchargeCount(product.getSurcharges().size());
product.setExtraCount(product.getExtraLines().size());
@@ -3294,11 +3300,37 @@ public class PayWorkbookParser
fee.setCurrency("");
fee.setPriceUnit("");
}
if (fee.getCurrency() == null || fee.getCurrency().isBlank())
{
String cardCurrency = product.getCurrency();
fee.setCurrency(cardCurrency == null || cardCurrency.isBlank() ? "EUR" : cardCurrency.trim().toUpperCase(Locale.ROOT));
}
fee.setSortNo(product.getSurcharges().size() + 1);
PaySurchargeRules.apply(fee);
product.getSurcharges().add(fee);
}
/** 附加费币种为空时取价卡币种,价卡也没有则默认 EUR。 */
private static void fillSurchargeCurrency(PayProduct product, String cardCurrency)
{
if (product == null || product.getSurcharges() == null || product.getSurcharges().isEmpty())
{
return;
}
String fallback = cardCurrency == null || cardCurrency.isBlank() ? "EUR" : cardCurrency.trim().toUpperCase(Locale.ROOT);
for (PaySurcharge fee : product.getSurcharges())
{
if (fee == null)
{
continue;
}
if (fee.getCurrency() == null || fee.getCurrency().isBlank())
{
fee.setCurrency(fallback);
}
}
}
/** 燃油、去碳列是整张表的包含说明,只记一条,不跟每个重量段重复。 */
private void readFuelMark(ExcelGrid grid, PayProduct product)
{
@@ -37,12 +37,14 @@ import com.bms.price.domain.PaySaveCommand;
import com.bms.price.domain.PaySurcharge;
import com.bms.price.domain.PayWeightBand;
import com.bms.price.domain.PrcPriceSet;
import com.bms.price.domain.PrcSurcharge;
import com.bms.masterdata.domain.ServiceChannel;
import com.bms.masterdata.mapper.ServiceChannelMapper;
import com.bms.price.mapper.ChannelProductMapMapper;
import com.bms.price.mapper.PayProductMapper;
import com.bms.price.mapper.PayProductTermMapper;
import com.bms.price.mapper.PrcPriceSetMapper;
import com.bms.price.mapper.PrcSurchargeMapper;
import com.bms.price.pay.PayParseProgressListener;
import com.bms.price.pay.PayWorkbookParser;
import com.bms.price.service.IPayProductService;
@@ -69,9 +71,14 @@ public class PayProductServiceImpl implements IPayProductService
private static final String TERM_EXPIRED = "2";
private static final String DEFAULT_CURRENCY = "EUR";
@Autowired
private PayProductMapper payProductMapper;
@Autowired
private PrcSurchargeMapper prcSurchargeMapper;
@Autowired
private ChannelProductMapMapper channelProductMapMapper;
@@ -1383,6 +1390,7 @@ public class PayProductServiceImpl implements IPayProductService
{
return;
}
prepareSurcharges(product);
for (PaySurcharge row : rows)
{
row.setProductId(product.getProductId());
@@ -1395,6 +1403,105 @@ public class PayProductServiceImpl implements IPayProductService
}
}
/**
* 按附加费名称映射 prc_surcharge.sc_id;币种不能为空:附加费 -> 价卡 -> EUR。
*/
private void prepareSurcharges(PayProduct product)
{
List<PaySurcharge> rows = product.getSurcharges();
if (rows == null || rows.isEmpty())
{
return;
}
if (isBlank(product.getCurrency()))
{
product.setCurrency(DEFAULT_CURRENCY);
}
String productCurrency = product.getCurrency().trim().toUpperCase(Locale.ROOT);
Map<String, Long> nameToScId = surchargeNameMap();
for (PaySurcharge fee : rows)
{
if (fee.getScId() == null && !isBlank(fee.getFeeName()))
{
Long scId = nameToScId.get(fee.getFeeName().trim());
if (scId != null)
{
fee.setScId(scId);
}
}
String currency = firstCurrency(fee.getCurrency(), currencyFromUnit(fee.getPriceUnit()), productCurrency);
fee.setCurrency(currency);
if (isBlank(fee.getPriceUnit()) || "%".equals(fee.getPriceUnit().trim()))
{
continue;
}
String unit = fee.getPriceUnit().trim();
if (!unit.contains("/") && !"%".equals(unit) && !unit.toUpperCase(Locale.ROOT).startsWith(currency))
{
fee.setPriceUnit(currency + "/" + unit.toUpperCase(Locale.ROOT));
}
else if (unit.matches("(?i)^[A-Za-z]{3}$"))
{
fee.setPriceUnit(currency);
}
}
}
private Map<String, Long> surchargeNameMap()
{
Map<String, Long> map = new LinkedHashMap<String, Long>();
List<PrcSurcharge> list = prcSurchargeMapper.selectPrcSurchargeList(new PrcSurcharge());
if (list == null)
{
return map;
}
for (PrcSurcharge item : list)
{
if (item == null || item.getScId() == null || isBlank(item.getScName()))
{
continue;
}
String key = item.getScName().trim();
if (!map.containsKey(key))
{
map.put(key, item.getScId());
}
}
return map;
}
private static String currencyFromUnit(String priceUnit)
{
if (isBlank(priceUnit) || "%".equals(priceUnit.trim()))
{
return null;
}
String text = priceUnit.trim();
int slash = text.indexOf('/');
String head = slash > 0 ? text.substring(0, slash) : text;
if (head.matches("(?i)^[A-Za-z]{3}$"))
{
return head.toUpperCase(Locale.ROOT);
}
return null;
}
private static String firstCurrency(String... values)
{
if (values == null)
{
return DEFAULT_CURRENCY;
}
for (String value : values)
{
if (!isBlank(value))
{
return value.trim().toUpperCase(Locale.ROOT);
}
}
return DEFAULT_CURRENCY;
}
private void insertExtras(PayProduct product)
{
List<PayExtraLine> rows = product.getExtraLines();
@@ -1438,6 +1545,10 @@ public class PayProductServiceImpl implements IPayProductService
product.setSourceFile(cut(product.getSourceFile(), 500));
product.setFilePath(cut(product.getFilePath(), 500));
product.setSupplierName(cut(product.getSupplierName(), 100));
if (isBlank(product.getCurrency()))
{
product.setCurrency(DEFAULT_CURRENCY);
}
product.setCurrency(cut(product.getCurrency(), 20));
product.setServiceNote(cut(product.getServiceNote(), 4000));
product.setParseStatus(cut(product.getParseStatus(), 20));
@@ -326,11 +326,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<insert id="insertSurcharges">
insert into pay_surcharge (
product_id, term_id, version_no, section_name, fee_name, zone_name, charge_text, amount, currency, price_unit, fee_desc, period_text,
product_id, term_id, version_no, section_name, fee_name, sc_id, zone_name, charge_text, amount, currency, price_unit, fee_desc, period_text,
effective_start, effective_end, charge_timing, calc_rule, calc_param, weight_min, weight_max, postcode_param, sort_no
) values
<foreach collection="list" item="row" separator=",">
(#{row.productId}, #{row.termId}, ifnull(#{row.versionNo}, 1), #{row.sectionName}, #{row.feeName}, #{row.zoneName}, #{row.chargeText}, #{row.amount},
(#{row.productId}, #{row.termId}, ifnull(#{row.versionNo}, 1), #{row.sectionName}, #{row.feeName}, #{row.scId}, #{row.zoneName}, #{row.chargeText}, #{row.amount},
#{row.currency}, #{row.priceUnit}, #{row.feeDesc}, #{row.periodText}, #{row.effectiveStart}, #{row.effectiveEnd},
#{row.chargeTiming}, ifnull(#{row.calcRule}, 'MANUAL'), #{row.calcParam}, #{row.weightMin}, #{row.weightMax},
#{row.postcodeParam}, #{row.sortNo})
@@ -366,7 +366,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectSurcharges" resultType="com.bms.price.domain.PaySurcharge">
select surcharge_id as surchargeId, product_id as productId, term_id as termId, version_no as versionNo, section_name as sectionName, fee_name as feeName,
zone_name as zoneName, charge_text as chargeText, amount, currency, price_unit as priceUnit, fee_desc as feeDesc,
sc_id as scId, zone_name as zoneName, charge_text as chargeText, amount, currency, price_unit as priceUnit, fee_desc as feeDesc,
period_text as periodText, effective_start as effectiveStart, effective_end as effectiveEnd,
charge_timing as chargeTiming, calc_rule as calcRule, calc_param as calcParam,
weight_min as weightMin, weight_max as weightMax, postcode_param as postcodeParam, sort_no as sortNo
@@ -378,7 +378,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectSurchargesByTerm" resultType="com.bms.price.domain.PaySurcharge">
select surcharge_id as surchargeId, product_id as productId, term_id as termId, version_no as versionNo, section_name as sectionName, fee_name as feeName,
zone_name as zoneName, charge_text as chargeText, amount, currency, price_unit as priceUnit, fee_desc as feeDesc,
sc_id as scId, zone_name as zoneName, charge_text as chargeText, amount, currency, price_unit as priceUnit, fee_desc as feeDesc,
period_text as periodText, effective_start as effectiveStart, effective_end as effectiveEnd,
charge_timing as chargeTiming, calc_rule as calcRule, calc_param as calcParam,
weight_min as weightMin, weight_max as weightMax, postcode_param as postcodeParam, sort_no as sortNo
+2 -161
View File
@@ -1,162 +1,3 @@
-- 应付附加费类型。名称来自 D:\应付供应商 全部价卡的附加费收费项,已去重。
-- 可重复执行。
-- 已废弃字典 bms_surcharge_type。
-- 请执行 sql/price/pay_surcharge_setup.sql(迁入 prc_surcharge 并删除字典)。
SET NAMES utf8mb4;
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
SELECT '附加费类型', 'bms_surcharge_type', '0', 'admin', sysdate(), '应付价卡附加费名称'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_surcharge_type');
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 v.dict_sort, v.dict_label, v.dict_value, 'bms_surcharge_type', '', 'default', 'N', '0', 'admin', sysdate(), '应付价卡附加费'
FROM (
SELECT 1 AS dict_sort, '疫情附加费' AS dict_label, '疫情附加费' AS dict_value
UNION ALL SELECT 2, '燃油附加费', '燃油附加费'
UNION ALL SELECT 3, '地址及联系方式修正费', '地址及联系方式修正费'
UNION ALL SELECT 4, '城市邮编不匹配', '城市邮编不匹配'
UNION ALL SELECT 5, '分拣机不可操作费', '分拣机不可操作费'
UNION ALL SELECT 6, '超重超尺寸费', '超重超尺寸费'
UNION ALL SELECT 7, '脱碳附加费', '脱碳附加费'
UNION ALL SELECT 8, '非法国电话联系费', '非法国电话联系费'
UNION ALL SELECT 9, '换面单费', '换面单费'
UNION ALL SELECT 10, '交错仓罚金', '交错仓罚金'
UNION ALL SELECT 11, '乡村邮编单量占比过大罚金', '乡村邮编单量占比过大罚金'
UNION ALL SELECT 12, '仿牌侵权罚款', '仿牌侵权罚款'
UNION ALL SELECT 13, '危险品罚款', '危险品罚款'
UNION ALL SELECT 14, '燃油费', '燃油费'
UNION ALL SELECT 15, '重派费', '重派费'
UNION ALL SELECT 16, '退件仓库操作费', '退件仓库操作费'
UNION ALL SELECT 17, '重派仓库操作费', '重派仓库操作费'
UNION ALL SELECT 18, '旺季附加费', '旺季附加费'
UNION ALL SELECT 19, '高峰旺季附加费', '高峰旺季附加费'
UNION ALL SELECT 20, '超尺寸超重费', '超尺寸超重费'
UNION ALL SELECT 21, '路由码选择附加费', '路由码选择附加费'
UNION ALL SELECT 22, '未预报附加费', '未预报附加费'
UNION ALL SELECT 23, '托收附加费', '托收附加费'
UNION ALL SELECT 24, '提供虚假信息罚款费', '提供虚假信息罚款费'
UNION ALL SELECT 25, '零售网点路线', '零售网点路线'
UNION ALL SELECT 26, '退件费', '退件费'
UNION ALL SELECT 27, '退件重派费', '退件重派费'
UNION ALL SELECT 28, '退件操作费', '退件操作费'
UNION ALL SELECT 29, '重派操作费', '重派操作费'
UNION ALL SELECT 30, '道路通行费', '道路通行费'
UNION ALL SELECT 31, '重量信息修正附加费', '重量信息修正附加费'
UNION ALL SELECT 32, '高风险地区附加费', '高风险地区附加费'
UNION ALL SELECT 33, '取还服务', '取还服务'
UNION ALL SELECT 34, '取货发货服务', '取货发货服务'
UNION ALL SELECT 35, '现金服务', '现金服务'
UNION ALL SELECT 36, '灵活配送服务', '灵活配送服务'
UNION ALL SELECT 37, '安全费', '安全费'
UNION ALL SELECT 38, '危机燃油附加费', '危机燃油附加费'
UNION ALL SELECT 39, '能源附加费', '能源附加费'
UNION ALL SELECT 40, '异形费', '异形费'
UNION ALL SELECT 41, '漏预报或漏发货', '漏预报或漏发货'
UNION ALL SELECT 42, '标签费', '标签费'
UNION ALL SELECT 43, '无法派送费', '无法派送费'
UNION ALL SELECT 44, '变更服务费', '变更服务费'
UNION ALL SELECT 45, '二次派送费', '二次派送费'
UNION ALL SELECT 46, '签名费', '签名费'
UNION ALL SELECT 47, '危险货物费', '危险货物费'
UNION ALL SELECT 48, '特殊产品加收', '特殊产品加收'
UNION ALL SELECT 49, '岛屿附加费', '岛屿附加费'
UNION ALL SELECT 50, '陆运能源附加费', '陆运能源附加费'
UNION ALL SELECT 51, '空运能源附加费', '空运能源附加费'
UNION ALL SELECT 52, '带电附加费', '带电附加费'
UNION ALL SELECT 53, '特货费', '特货费'
UNION ALL SELECT 54, '偏远费', '偏远费'
UNION ALL SELECT 55, '偏远地区附加费', '偏远地区附加费'
UNION ALL SELECT 56, '超大附加费(包裹)', '超大附加费(包裹)'
UNION ALL SELECT 57, '超重附加费(包裹)', '超重附加费(包裹)'
UNION ALL SELECT 58, '重复单号', '重复单号'
UNION ALL SELECT 59, '未预报', '未预报'
UNION ALL SELECT 60, '无法投递或其他原因退件运费', '无法投递或其他原因退件运费'
UNION ALL SELECT 61, '航司可持续性附加费', '航司可持续性附加费'
UNION ALL SELECT 62, '退件处理费', '退件处理费'
UNION ALL SELECT 63, '超尺寸费', '超尺寸费'
UNION ALL SELECT 64, '周末服务费', '周末服务费'
UNION ALL SELECT 65, '空气清洁费', '空气清洁费'
UNION ALL SELECT 66, '拖车附加费', '拖车附加费'
UNION ALL SELECT 67, '派送附加费', '派送附加费'
UNION ALL SELECT 68, '自送海外仓运费', '自送海外仓运费'
UNION ALL SELECT 69, '操作费', '操作费'
UNION ALL SELECT 70, '仓库操作费', '仓库操作费'
UNION ALL SELECT 71, '重新包装费', '重新包装费'
UNION ALL SELECT 72, '换包装费', '换包装费'
UNION ALL SELECT 73, '去碳附加费', '去碳附加费'
UNION ALL SELECT 74, '超重费', '超重费'
UNION ALL SELECT 75, '地址修正费', '地址修正费'
UNION ALL SELECT 76, '邮编城市不对应费', '邮编城市不对应费'
UNION ALL SELECT 77, '邮箱和电话缺失费', '邮箱和电话缺失费'
UNION ALL SELECT 78, '人工处理费', '人工处理费'
UNION ALL SELECT 79, '海外省费', '海外省费'
UNION ALL SELECT 80, '错误送仓罚款', '错误送仓罚款'
UNION ALL SELECT 81, '更换面单费', '更换面单费'
UNION ALL SELECT 82, '乡村地区占比超标准罚款', '乡村地区占比超标准罚款'
UNION ALL SELECT 83, 'COD', 'COD'
UNION ALL SELECT 84, '重新贴标附加费', '重新贴标附加费'
UNION ALL SELECT 85, '重派运费', '重派运费'
UNION ALL SELECT 86, '短期能源附加费', '短期能源附加费'
UNION ALL SELECT 87, '旺季高峰期附加费', '旺季高峰期附加费'
UNION ALL SELECT 88, '面单错误附加费', '面单错误附加费'
UNION ALL SELECT 89, '零售网点自提费', '零售网点自提费'
UNION ALL SELECT 90, '异形件费', '异形件费'
UNION ALL SELECT 91, '重量差异附加费', '重量差异附加费'
UNION ALL SELECT 92, '换单费', '换单费'
UNION ALL SELECT 93, '无法投递处理费', '无法投递处理费'
UNION ALL SELECT 94, '无法投递处理费-陆运', '无法投递处理费-陆运'
UNION ALL SELECT 95, '无法投递处理费-空运', '无法投递处理费-空运'
UNION ALL SELECT 96, '战争附加费', '战争附加费'
UNION ALL SELECT 97, '超尺寸附加费', '超尺寸附加费'
UNION ALL SELECT 98, '偏远附加费', '偏远附加费'
UNION ALL SELECT 99, '空气减排费', '空气减排费'
UNION ALL SELECT 100, '面单无法识别费', '面单无法识别费'
UNION ALL SELECT 101, '无法派送或退件费', '无法派送或退件费'
UNION ALL SELECT 102, '超重附加费', '超重附加费'
UNION ALL SELECT 103, '重复单号费', '重复单号费'
UNION ALL SELECT 104, '使用取消单号发货费', '使用取消单号发货费'
UNION ALL SELECT 105, '面单不符费', '面单不符费'
UNION ALL SELECT 106, '面单粘贴不合规范', '面单粘贴不合规范'
UNION ALL SELECT 107, '未经允许乱交邮费', '未经允许乱交邮费'
UNION ALL SELECT 108, '异形件附加费', '异形件附加费'
UNION ALL SELECT 109, '退件费(陆运)', '退件费(陆运)'
UNION ALL SELECT 110, '退件费(空运)', '退件费(空运)'
UNION ALL SELECT 111, '邮编城市不对应', '邮编城市不对应'
UNION ALL SELECT 112, '收件人信息错误处理费', '收件人信息错误处理费'
UNION ALL SELECT 113, '无法过机操作费', '无法过机操作费'
UNION ALL SELECT 114, '不可达地址费', '不可达地址费'
UNION ALL SELECT 115, '销毁费', '销毁费'
UNION ALL SELECT 116, '仓储费', '仓储费'
UNION ALL SELECT 117, 'CO₂附加费', 'CO₂附加费'
UNION ALL SELECT 118, '退回件处理费', '退回件处理费'
UNION ALL SELECT 119, '异形件/超尺寸处理费', '异形件/超尺寸处理费'
UNION ALL SELECT 120, '重量申报错误操作费', '重量申报错误操作费'
UNION ALL SELECT 121, '垃圾处理费', '垃圾处理费'
UNION ALL SELECT 122, '绿色附加费', '绿色附加费'
UNION ALL SELECT 123, '无法投递费', '无法投递费'
UNION ALL SELECT 124, '额外处理费', '额外处理费'
UNION ALL SELECT 125, '超大件', '超大件'
UNION ALL SELECT 126, '超限制', '超限制'
UNION ALL SELECT 127, '地址更正', '地址更正'
UNION ALL SELECT 128, '扩展区域收货和送货服务', '扩展区域收货和送货服务'
UNION ALL SELECT 129, '偏远地区收货和送货服务', '偏远地区收货和送货服务'
UNION ALL SELECT 130, '私人地址派送费', '私人地址派送费'
UNION ALL SELECT 131, '包裹信息缺失', '包裹信息缺失'
UNION ALL SELECT 132, '高峰附加费', '高峰附加费'
UNION ALL SELECT 133, '更改地址费', '更改地址费'
UNION ALL SELECT 134, '空气减排附加费', '空气减排附加费'
UNION ALL SELECT 135, '异地取货费', '异地取货费'
UNION ALL SELECT 136, '包裹退件运费', '包裹退件运费'
UNION ALL SELECT 137, '退件入仓处理费', '退件入仓处理费'
UNION ALL SELECT 138, '退件重派操作费', '退件重派操作费'
UNION ALL SELECT 139, '退件重派运费', '退件重派运费'
UNION ALL SELECT 140, '退件销毁费', '退件销毁费'
UNION ALL SELECT 141, 'Bulky goods Fee', 'Bulky goods Fee'
UNION ALL SELECT 142, '地址校验费', '地址校验费'
UNION ALL SELECT 143, 'Labeling fee', 'Labeling fee'
UNION ALL SELECT 144, '瑞典和芬兰门到门派送费', '瑞典和芬兰门到门派送费'
UNION ALL SELECT 145, '特别旺季附加费', '特别旺季附加费'
UNION ALL SELECT 146, '脱欧手续费', '脱欧手续费'
) v
WHERE NOT EXISTS (
SELECT 1 FROM sys_dict_data d
WHERE d.dict_type = 'bms_surcharge_type' AND d.dict_value = v.dict_value
);
@@ -0,0 +1,2 @@
-- 已合并到 sql/price/pay_surcharge_setup.sql,请执行该脚本。
SET NAMES utf8mb4;
+3 -142
View File
@@ -1,142 +1,3 @@
-- 应付价卡配置。目录里的一个产品一行,重量段和附加费挂在产品下面。
-- 表名使用 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 '费用名称',
`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_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
);
-- 已合并到 sql/price/pay_surcharge_setup.sql,请执行该脚本。
-- (含应付价卡表结构、菜单、附加费迁移、sc_id)
SET NAMES utf8mb4;
@@ -0,0 +1,2 @@
-- 已合并到 sql/price/pay_surcharge_setup.sql,请执行该脚本。
SET NAMES utf8mb4;
+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) = '';