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:
zzh 2026-07-27 16:00:58 +08:00
parent 69d234c705
commit 28d14034bd

View File

@ -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))))