修改类型
This commit is contained in:
+2
-1
@@ -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)
|
||||
{
|
||||
|
||||
+111
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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) = '';
|
||||
@@ -60,9 +60,10 @@
|
||||
<el-table-column prop="priceUnit" label="单位" width="110" show-overflow-tooltip>
|
||||
<template #default="{ row }"><cell-text v-model="row.priceUnit" :edit="editable" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column v-if="editable" label="操作" width="70" align="center">
|
||||
<el-table-column v-if="editable" label="操作" width="120" align="center" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button link type="danger" @click="removeRow(pane.item.weightBands, row)">删除</el-button>
|
||||
<el-button link type="primary" :loading="isRowSaving(row)" @click="saveBandRow(pane, row)">保存</el-button>
|
||||
<el-button link type="danger" :disabled="!!savingRowKey" @click="removeRow(pane.item.weightBands, row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -82,8 +83,27 @@
|
||||
<el-button v-if="editable" size="small" type="primary" plain @click="addFee(pane)">添加附加费</el-button>
|
||||
</div>
|
||||
<el-table :data="pageFees(pane)" border size="small" max-height="360" empty-text="没有附加费">
|
||||
<el-table-column prop="feeName" label="附加费用" min-width="160" show-overflow-tooltip>
|
||||
<template #default="{ row }"><cell-text v-model="row.feeName" :edit="editable" /></template>
|
||||
<el-table-column prop="feeName" label="附加费用" min-width="180" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<el-select
|
||||
v-if="editable"
|
||||
v-model="row.feeName"
|
||||
filterable
|
||||
clearable
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
:placeholder="'请选择附加费'"
|
||||
@change="name => onFeeNameChange(row, name)"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in feeNameOptions(row)"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
<span v-else>{{ row.feeName || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="zoneName" label="地区" min-width="160" show-overflow-tooltip>
|
||||
<template #default="{ row }"><cell-text v-model="row.zoneName" :edit="editable" /></template>
|
||||
@@ -94,10 +114,52 @@
|
||||
<span v-else>{{ money(row.amount) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="货币" width="120" show-overflow-tooltip>
|
||||
<el-table-column label="币种" width="110" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<cell-text v-if="editable" v-model="row.priceUnit" :edit="true" />
|
||||
<span v-else>{{ row.priceUnit || row.currency || '-' }}</span>
|
||||
<el-select
|
||||
v-if="editable"
|
||||
:model-value="feeCurrencyOf(row)"
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
clearable
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
:placeholder="'币种'"
|
||||
@update:model-value="value => setFeeCurrency(row, value)"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in currencyOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
<span v-else>{{ feeCurrencyOf(row) || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="单位" width="110" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<el-select
|
||||
v-if="editable"
|
||||
:model-value="feeUnitOf(row)"
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
clearable
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
:placeholder="'单位'"
|
||||
@update:model-value="value => setFeeUnit(row, value)"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in feeUnitOptions"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
<span v-else>{{ feeUnitOf(row) || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="收费标准" min-width="180" show-overflow-tooltip>
|
||||
@@ -119,13 +181,21 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="calcParam" label="条件参数" min-width="220" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<div>{{ feeCondition(row) }}</div>
|
||||
<cell-text v-if="editable" v-model="row.calcParam" :edit="editable" />
|
||||
<span v-if="!editable">{{ feeCondition(row) }}</span>
|
||||
<template v-else>
|
||||
<div v-if="conditionHint(row)" class="pay-cond-hint">{{ conditionHint(row) }}</div>
|
||||
<cell-text
|
||||
v-if="showCalcParamEditor(row)"
|
||||
v-model="row.calcParam"
|
||||
:edit="true"
|
||||
/>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column v-if="editable" label="操作" width="70" align="center">
|
||||
<el-table-column v-if="editable" label="操作" width="120" align="center" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button link type="danger" @click="removeRow(pane.item.surcharges, row)">删除</el-button>
|
||||
<el-button link type="primary" :loading="isRowSaving(row)" @click="saveFeeRow(pane, row)">保存</el-button>
|
||||
<el-button link type="danger" :disabled="!!savingRowKey" @click="removeRow(pane.item.surcharges, row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -163,8 +233,9 @@
|
||||
|
||||
<script setup>
|
||||
// 重量段和附加费。传入 products 时一次展示全部产品。
|
||||
import { h } from 'vue'
|
||||
import { h, onMounted } from 'vue'
|
||||
import { ElInput } from 'element-plus'
|
||||
import { listSurchargeOptions } from '@/api/price/surcharge'
|
||||
|
||||
const props = defineProps({
|
||||
product: {
|
||||
@@ -178,9 +249,140 @@ const props = defineProps({
|
||||
editable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
savingRowKey: {
|
||||
type: [String, Number],
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
|
||||
const emit = defineEmits(['save-row'])
|
||||
|
||||
function rowKeyOf(row) {
|
||||
if (!row) return ''
|
||||
if (row.surchargeId != null) return 'fee-' + row.surchargeId
|
||||
if (row.bandId != null) return 'band-' + row.bandId
|
||||
if (row.__rowKey) return row.__rowKey
|
||||
row.__rowKey = 'tmp-' + Date.now() + '-' + Math.random().toString(36).slice(2, 8)
|
||||
return row.__rowKey
|
||||
}
|
||||
|
||||
function isRowSaving(row) {
|
||||
return props.savingRowKey && String(props.savingRowKey) === String(rowKeyOf(row))
|
||||
}
|
||||
|
||||
function saveBandRow(pane, row) {
|
||||
emit('save-row', { kind: 'band', product: pane.item, row, rowKey: rowKeyOf(row) })
|
||||
}
|
||||
|
||||
function saveFeeRow(pane, row) {
|
||||
emit('save-row', { kind: 'fee', product: pane.item, row, rowKey: rowKeyOf(row) })
|
||||
}
|
||||
|
||||
const surchargeOptions = ref([])
|
||||
const { bms_currency } = useDict('bms_currency')
|
||||
const currencyOptions = computed(() => (bms_currency.value || []).map(item => ({
|
||||
label: item.label || item.value,
|
||||
value: item.value
|
||||
})))
|
||||
const feeUnitOptions = ['ITEM', 'KG', 'PCS', 'PARCEL', '%']
|
||||
|
||||
function parseFeeUnit(priceUnit) {
|
||||
const text = String(priceUnit || '').trim()
|
||||
if (!text) return ''
|
||||
if (text === '%') return '%'
|
||||
const slash = text.lastIndexOf('/')
|
||||
if (slash >= 0) {
|
||||
return text.slice(slash + 1).trim().toUpperCase()
|
||||
}
|
||||
if (/^[A-Za-z]{3}$/.test(text)) return ''
|
||||
return text.toUpperCase()
|
||||
}
|
||||
|
||||
function feeCurrencyOf(row) {
|
||||
const currency = String(row?.currency || '').trim()
|
||||
if (currency) return currency.toUpperCase()
|
||||
const text = String(row?.priceUnit || '').trim()
|
||||
const match = text.match(/^([A-Za-z]{3})(?:\/|$)/)
|
||||
return match ? match[1].toUpperCase() : ''
|
||||
}
|
||||
|
||||
function feeUnitOf(row) {
|
||||
return parseFeeUnit(row?.priceUnit)
|
||||
}
|
||||
|
||||
function syncFeePriceUnit(row, unitOverride) {
|
||||
const currency = feeCurrencyOf(row)
|
||||
const unit = unitOverride != null ? String(unitOverride || '').trim().toUpperCase() : feeUnitOf(row)
|
||||
if (unit === '%') {
|
||||
row.priceUnit = '%'
|
||||
return
|
||||
}
|
||||
if (currency && unit) {
|
||||
row.priceUnit = currency + '/' + unit
|
||||
return
|
||||
}
|
||||
if (currency) {
|
||||
row.priceUnit = currency
|
||||
return
|
||||
}
|
||||
row.priceUnit = unit || ''
|
||||
}
|
||||
|
||||
function setFeeCurrency(row, value) {
|
||||
const currency = String(value || '').trim().toUpperCase()
|
||||
row.currency = currency
|
||||
syncFeePriceUnit(row)
|
||||
}
|
||||
|
||||
function setFeeUnit(row, value) {
|
||||
syncFeePriceUnit(row, value)
|
||||
}
|
||||
|
||||
function loadSurchargeOptions() {
|
||||
return listSurchargeOptions({ ssCode: 'on' }).then(res => {
|
||||
surchargeOptions.value = res.data || []
|
||||
}).catch(() => {
|
||||
surchargeOptions.value = []
|
||||
})
|
||||
}
|
||||
|
||||
function feeNameOptions(row) {
|
||||
const names = []
|
||||
const seen = new Set()
|
||||
for (const item of surchargeOptions.value || []) {
|
||||
const name = String(item?.scName || '').trim()
|
||||
if (!name || seen.has(name)) continue
|
||||
seen.add(name)
|
||||
names.push(name)
|
||||
}
|
||||
const current = String(row?.feeName || '').trim()
|
||||
if (current && !seen.has(current)) {
|
||||
names.unshift(current)
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
function onFeeNameChange(row, name) {
|
||||
const matched = (surchargeOptions.value || []).find(item => String(item?.scName || '').trim() === String(name || '').trim())
|
||||
if (!matched) {
|
||||
row.scId = undefined
|
||||
return
|
||||
}
|
||||
row.scId = matched.scId
|
||||
const currency = matched.currency || feeCurrencyOf(row)
|
||||
if (currency) {
|
||||
setFeeCurrency(row, currency)
|
||||
}
|
||||
if (!feeUnitOf(row)) {
|
||||
setFeeUnit(row, 'ITEM')
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadSurchargeOptions()
|
||||
})
|
||||
|
||||
const CellText = {
|
||||
props: { modelValue: { default: '' }, edit: Boolean },
|
||||
emits: ['update:modelValue'],
|
||||
@@ -210,7 +412,7 @@ function calcRuleLabel(value) {
|
||||
return calcRules.find(item => item.value === value)?.label || '人工确认'
|
||||
}
|
||||
|
||||
function feeCondition(row) {
|
||||
function conditionHint(row) {
|
||||
const parts = []
|
||||
const hasMin = row.weightMin != null && row.weightMin !== ''
|
||||
const hasMax = row.weightMax != null && row.weightMax !== ''
|
||||
@@ -220,9 +422,24 @@ function feeCondition(row) {
|
||||
if (row.postcodeParam) {
|
||||
parts.push(`邮编 ${row.postcodeParam}`)
|
||||
}
|
||||
if (row.calcParam && row.calcParam !== row.postcodeParam) {
|
||||
parts.push(String(row.calcParam))
|
||||
}
|
||||
return parts.join(';')
|
||||
}
|
||||
|
||||
function hasCalcParam(row) {
|
||||
const text = String(row?.calcParam ?? '').trim()
|
||||
if (!text) return false
|
||||
return text !== String(row?.postcodeParam ?? '').trim()
|
||||
}
|
||||
|
||||
function showCalcParamEditor(row) {
|
||||
return hasCalcParam(row) || !conditionHint(row)
|
||||
}
|
||||
|
||||
function feeCondition(row) {
|
||||
const parts = []
|
||||
const hint = conditionHint(row)
|
||||
if (hint) parts.push(hint)
|
||||
if (hasCalcParam(row)) parts.push(String(row.calcParam).trim())
|
||||
return parts.join(';') || '-'
|
||||
}
|
||||
|
||||
@@ -261,7 +478,19 @@ function addBand(pane) {
|
||||
|
||||
function addFee(pane) {
|
||||
if (!pane.item.surcharges) pane.item.surcharges = []
|
||||
pane.item.surcharges.push({ feeName: '', zoneName: '', chargeText: '', amount: '', priceUnit: '', currency: '', feeDesc: '', calcRule: 'MANUAL', calcParam: '' })
|
||||
const currency = String(pane.item.currency || 'EUR').trim().toUpperCase() || 'EUR'
|
||||
pane.item.surcharges.push({
|
||||
feeName: '',
|
||||
scId: undefined,
|
||||
zoneName: '',
|
||||
chargeText: '',
|
||||
amount: '',
|
||||
priceUnit: currency + '/ITEM',
|
||||
currency,
|
||||
feeDesc: '',
|
||||
calcRule: 'MANUAL',
|
||||
calcParam: ''
|
||||
})
|
||||
pane.feePageNo = Math.ceil(pane.item.surcharges.length / pageSize) || 1
|
||||
}
|
||||
|
||||
@@ -384,6 +613,10 @@ function statusText(status) {
|
||||
margin-top: 8px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
.pay-cond-hint {
|
||||
line-height: 1.5;
|
||||
color: var(--el-text-color-regular);
|
||||
}
|
||||
.limit-tag {
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
@@ -134,13 +134,31 @@
|
||||
</el-table>
|
||||
</el-drawer>
|
||||
|
||||
<el-drawer v-model="detailVisible" :title="detailTitle" size="78%" destroy-on-close>
|
||||
<pay-config-detail v-loading="detailLoading" :product="detail" :editable="editing" />
|
||||
<el-drawer
|
||||
v-model="detailVisible"
|
||||
:title="detailTitle"
|
||||
size="78%"
|
||||
append-to-body
|
||||
:close-on-click-modal="false"
|
||||
@closed="editing = false"
|
||||
>
|
||||
<pay-config-detail
|
||||
v-loading="detailLoading || !!savingRowKey"
|
||||
:product="detail"
|
||||
:editable="editing"
|
||||
:saving-row-key="savingRowKey"
|
||||
@save-row="saveProductRow"
|
||||
/>
|
||||
<template #footer>
|
||||
<el-button v-if="detail" @click="downloadSource(detail)" v-hasPermi="['price:pay:query']">下载源文件</el-button>
|
||||
<el-button v-if="!editing" type="primary" @click="editing = true" v-hasPermi="['price:pay:import']">编辑</el-button>
|
||||
<el-button v-else type="primary" :loading="saving" @click="saveDetail">保存</el-button>
|
||||
<el-button @click="detailVisible = false">关闭</el-button>
|
||||
<el-button v-if="detail" @click="downloadSource(detail)" v-hasPermi="['price:pay:query']">下载源文件</el-button>
|
||||
<el-button
|
||||
v-if="!editing"
|
||||
type="primary"
|
||||
@click="editing = true"
|
||||
v-hasPermi="['price:pay:import']"
|
||||
>编辑</el-button>
|
||||
<el-button v-else @click="editing = false">完成</el-button>
|
||||
</template>
|
||||
</el-drawer>
|
||||
</div>
|
||||
@@ -157,7 +175,7 @@ const importRef = ref()
|
||||
const detailVisible = ref(false)
|
||||
const detailLoading = ref(false)
|
||||
const editing = ref(false)
|
||||
const saving = ref(false)
|
||||
const savingRowKey = ref('')
|
||||
const detail = ref(null)
|
||||
const historyVisible = ref(false)
|
||||
const historyLoading = ref(false)
|
||||
@@ -275,6 +293,7 @@ function handleDelete(ids) {
|
||||
function openDetail(row) {
|
||||
detailVisible.value = true
|
||||
editing.value = false
|
||||
savingRowKey.value = ''
|
||||
detailLoading.value = true
|
||||
detail.value = null
|
||||
getPay(row.versionProductId || row.productId).then(res => {
|
||||
@@ -284,15 +303,24 @@ function openDetail(row) {
|
||||
})
|
||||
}
|
||||
|
||||
function saveDetail() {
|
||||
function saveProductRow(payload) {
|
||||
if (!detail.value || savingRowKey.value) return
|
||||
cleanMoney(detail.value)
|
||||
saving.value = true
|
||||
;(detail.value.surcharges || []).forEach(row => {
|
||||
if (row.amount === '') row.amount = null
|
||||
})
|
||||
const productId = detail.value.productId
|
||||
savingRowKey.value = payload?.rowKey || 'row'
|
||||
updatePay(detail.value).then(() => {
|
||||
proxy.$modal.msgSuccess('已保存这一版。产品编号不变,绑定该产品的渠道按有效期取价')
|
||||
editing.value = false
|
||||
tableRef.value.refresh()
|
||||
proxy.$modal.msgSuccess('该行已保存')
|
||||
if (!productId) return
|
||||
return getPay(productId).then(res => {
|
||||
if (res.data) detail.value = res.data
|
||||
})
|
||||
}).then(() => {
|
||||
tableRef.value?.refresh()
|
||||
}).finally(() => {
|
||||
saving.value = false
|
||||
savingRowKey.value = ''
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user