using Oms.Application.Dtos.Orders; namespace Oms.Application.Services.Orders; internal static class PriceCheckHintBuilder { public static OrderPriceCheckHintOutput BuildQueryHint(PriceCheckInputProfile profile) { var missing = profile.MissingFieldCodes.ToList(); var disclaimers = BuildDisclaimers(missing); if (profile.IsQueryEstimated) { disclaimers.Add("以下报价可能含估算项,最终以预报/入库计费为准。"); } return new OrderPriceCheckHintOutput { QuoteLevel = profile.IsQueryEstimated ? PriceCheckQuoteLevelCodes.Estimated : PriceCheckQuoteLevelCodes.Exact, MissingFieldCodes = missing, Disclaimers = disclaimers }; } public static (string QuoteLevel, List MissingFieldCodes, List Disclaimers) BuildItemHint( PriceCheckInputProfile profile, bool usedZoneFallback) { var missing = profile.MissingFieldCodes.ToList(); if (usedZoneFallback && !missing.Contains(PriceCheckMissingFieldCodes.PostalCode)) { missing.Add(PriceCheckMissingFieldCodes.PostalCode); } var disclaimers = BuildDisclaimers(missing); if (usedZoneFallback) { disclaimers.Add("未匹配到精确分区,本行按可匹配分区参考价展示,下单后可能调整。"); } var estimated = missing.Count > 0 || usedZoneFallback; return ( estimated ? PriceCheckQuoteLevelCodes.Estimated : PriceCheckQuoteLevelCodes.Exact, missing, disclaimers); } private static List BuildDisclaimers(IReadOnlyList missingFieldCodes) { var disclaimers = new List(); foreach (var code in missingFieldCodes) { var text = code switch { PriceCheckMissingFieldCodes.Dimensions => "未填写包裹尺寸:计费重按实重估算,入库实测尺寸后价格可能变化。", PriceCheckMissingFieldCodes.PostalCode => "未填写邮编:优先按州/市或国家级分区匹配,精确邮编可能调整价格。", PriceCheckMissingFieldCodes.Province => "未填写省州:无邮编时无法按州/市降级匹配,分区可能按国家级兜底。", PriceCheckMissingFieldCodes.City => "未填写城市:无邮编且州未命中时无法按城市匹配。", PriceCheckMissingFieldCodes.CargoType => "未选择货物属性:已分别试算普货/带电/敏感货等,下单时以所选属性为准。", PriceCheckMissingFieldCodes.Warehouse => "未选择仓库:展示各仓库报价,下单时请确认发货仓。", _ => null }; if (!string.IsNullOrWhiteSpace(text)) { disclaimers.Add(text); } } return disclaimers; } }