fix: exclude domestic pickup products from price check
When destination country has no matching zone, stop using all price zones as fallback; also hide sales products in the domestic pickup group from price-check results and shipping options. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
69d234c705
commit
28d14034bd
@ -14,6 +14,7 @@ public partial class OrderService
|
|||||||
{
|
{
|
||||||
private const string SalesProductGroupDictType = "sales_product_group";
|
private const string SalesProductGroupDictType = "sales_product_group";
|
||||||
private const string UngroupedProductGroupCode = "_ungrouped";
|
private const string UngroupedProductGroupCode = "_ungrouped";
|
||||||
|
private const string DomesticPickupGroupNameKeyword = "国内揽收";
|
||||||
|
|
||||||
private sealed record PriceCheckCargoTarget(string Code, string DisplayName, string CargoAttribute);
|
private sealed record PriceCheckCargoTarget(string Code, string DisplayName, string CargoAttribute);
|
||||||
|
|
||||||
@ -26,6 +27,13 @@ public partial class OrderService
|
|||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var dictRows = await DictRepository.GetListAsync(x => x.DictType == SalesProductGroupDictType);
|
var dictRows = await DictRepository.GetListAsync(x => x.DictType == SalesProductGroupDictType);
|
||||||
|
// 查价页面不展示「国内揽收」分组的产品
|
||||||
|
var domesticPickupGroupCodes = dictRows
|
||||||
|
.Where(x => !string.IsNullOrWhiteSpace(x.DictName)
|
||||||
|
&& x.DictName.Trim().Contains(DomesticPickupGroupNameKeyword))
|
||||||
|
.Select(x => x.DictCode?.Trim())
|
||||||
|
.Where(code => !string.IsNullOrWhiteSpace(code))
|
||||||
|
.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||||
var dictOrder = dictRows
|
var dictOrder = dictRows
|
||||||
.OrderBy(x => x.DictSort)
|
.OrderBy(x => x.DictSort)
|
||||||
.ThenBy(x => x.DictCode)
|
.ThenBy(x => x.DictCode)
|
||||||
@ -43,7 +51,10 @@ public partial class OrderService
|
|||||||
foreach (var dict in dictOrder)
|
foreach (var dict in dictOrder)
|
||||||
{
|
{
|
||||||
var code = dict.DictCode?.Trim();
|
var code = dict.DictCode?.Trim();
|
||||||
if (string.IsNullOrWhiteSpace(code) || !grouped.TryGetValue(code, out var list) || list.Count == 0)
|
if (string.IsNullOrWhiteSpace(code)
|
||||||
|
|| domesticPickupGroupCodes.Contains(code)
|
||||||
|
|| !grouped.TryGetValue(code, out var list)
|
||||||
|
|| list.Count == 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -61,6 +72,7 @@ public partial class OrderService
|
|||||||
{
|
{
|
||||||
if (pair.Key.Equals(UngroupedProductGroupCode, StringComparison.OrdinalIgnoreCase)
|
if (pair.Key.Equals(UngroupedProductGroupCode, StringComparison.OrdinalIgnoreCase)
|
||||||
|| consumedCodes.Contains(pair.Key)
|
|| consumedCodes.Contains(pair.Key)
|
||||||
|
|| domesticPickupGroupCodes.Contains(pair.Key)
|
||||||
|| pair.Value.Count == 0)
|
|| pair.Value.Count == 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@ -152,6 +164,27 @@ public partial class OrderService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查价页面不展示「国内揽收」分组的产品
|
||||||
|
var domesticPickupGroupCodes = (await DictRepository.GetListAsync(x => x.DictType == SalesProductGroupDictType))
|
||||||
|
.Where(x => !string.IsNullOrWhiteSpace(x.DictName)
|
||||||
|
&& x.DictName.Trim().Contains(DomesticPickupGroupNameKeyword))
|
||||||
|
.Select(x => x.DictCode?.Trim())
|
||||||
|
.Where(code => !string.IsNullOrWhiteSpace(code))
|
||||||
|
.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
if (domesticPickupGroupCodes.Count > 0)
|
||||||
|
{
|
||||||
|
products = products
|
||||||
|
.Where(p =>
|
||||||
|
{
|
||||||
|
var groupCode = string.IsNullOrWhiteSpace(p.ProductGroup)
|
||||||
|
? UngroupedProductGroupCode
|
||||||
|
: p.ProductGroup.Trim();
|
||||||
|
return !domesticPickupGroupCodes.Contains(groupCode);
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
var result = new OrderPriceCheckResultOutput
|
var result = new OrderPriceCheckResultOutput
|
||||||
{
|
{
|
||||||
QueryHint = PriceCheckHintBuilder.BuildQueryHint(profile)
|
QueryHint = PriceCheckHintBuilder.BuildQueryHint(profile)
|
||||||
@ -639,6 +672,13 @@ public partial class OrderService
|
|||||||
|
|
||||||
await TryAddAsync(null, null, false);
|
await TryAddAsync(null, null, false);
|
||||||
|
|
||||||
|
// 如果按「仅目的国」都无法匹配到任何价格分区,则不要再用卖价快照的全量分区键兜底。
|
||||||
|
// 否则会导致未配置国家也能返回参考价格(estimated),与预期不符。
|
||||||
|
if (attempts.Count == 0)
|
||||||
|
{
|
||||||
|
return attempts;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var zoneKey in ParcelBillingCalculator.CollectDistinctDetailZoneKeys(snapshotBinding.Price))
|
foreach (var zoneKey in ParcelBillingCalculator.CollectDistinctDetailZoneKeys(snapshotBinding.Price))
|
||||||
{
|
{
|
||||||
if (attempts.Any(x => x.ZoneKeys.Any(k => string.Equals(k, zoneKey, StringComparison.OrdinalIgnoreCase))))
|
if (attempts.Any(x => x.ZoneKeys.Any(k => string.Equals(k, zoneKey, StringComparison.OrdinalIgnoreCase))))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user