ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CoopCycle定价规则引擎详解:如何用表达式语言设计灵活配送费

CoopCycle定价规则引擎详解:如何用表达式语言设计灵活配送费 CoopCycle定价规则引擎详解如何用表达式语言设计灵活配送费【免费下载链接】coopcycle-webLogistics marketplace platform. Only for worker-owned business.项目地址: https://gitcode.com/gh_mirrors/co/coopcycle-webCoopCycle 的定价规则引擎Pricing Rules是这套物流与市集平台中负责计算配送费的核心模块。它使用 Symfony 表达式语言Expression Language来描述什么条件下收多少钱让运营人员无需写一行 PHP 代码就能设计出按距离、重量、区域、时段、包裹规格灵活组合的配送价格。本文将带你快速上手这套规则引擎。定价规则由什么组成CoopCycle 的定价逻辑分两层概念说明对应实体定价规则集 PricingRuleSet一组有序规则的整体可命名为标准配送重物加价等并选择匹配策略src/Entity/Delivery/PricingRuleSet.php定价规则 PricingRule单条规则 一个条件表达式expression 一个价格表达式price 适用目标DELIVERY 或 TASKsrc/Entity/Delivery/PricingRule.php规则按position排序系统自上而下依次求值直到命中为止默认策略find。规则的目标target可选DELIVERY按整单配送计费或TASK多点配送时按每个任务点计费。表达式语言条件是怎么写的每条规则的expression字段是一段表达式语言例如distance 5000表示配送距离超过 5000 米时命中。系统把一单配送转换成一组变量传入表达式求值器核心变量来自src/ExpressionLanguage/DeliveryExpressionLanguageVisitor.phpdistance配送总距离米weight配送总重量克pickup/dropoff取件、送达任务对象含地址、时间窗packages包裹信息支持packages.totalVolumeUnits()、packages.containsAtLeastOne(XL)order关联订单如order.itemsTotal商品件数常用函数速查表函数 / 写法含义in_zone(dropoff, CityCenter)送达地址在CityCenter区域内out_zone(pickup, Suburb)取件地址在Suburb区域外time_range_length(dropoff, hours, 1.5)送达时间窗长度小于 1.5 小时diff_hours(pickup, 12)距取件时间不足 12 小时diff_days(pickup, 1)距取件至少 1 天区域Zone是在地图上绘制多边形定义的规则引擎会判断地址是否落在多边形内条件可以用and组合比如in_zone(dropoff, CityCenter) and distance 2000含义即送达地址在市区内且距离超过 2 公里。价格表达式4 种计费方式规则的price字段同样是表达式引擎用src/Pricing/PriceExpressionParser.php解析成 4 种类型位于src/Pricing/PriceExpressions/固定价格—— 直接写金额如3.5欧元单位由系统币种决定。阶梯计价PriceRangeExpression—— 按距离/重量/体积分档支持起步价threshold。例如起步价 3 元每多 1 公里加收 0.5 元。按包裹计价PricePerPackageExpression—— 按某规格包裹数量 × 单价例如每个 XL 包裹加收 2 元。百分比调价PricePercentageExpression—— 在前一档基础上加/减百分比适合市区内额外加收 10%这类场景。一个贴近实战的规则集示例假设某门店的市区配送价规则集可参考测试夹具fixtures/ORM/pricing_rule_set_with_names.yml顺序条件expression价格price效果1weight 1000固定 1.5 元重物加费2distance 03.5 元基础配送费3false固定 2 元手工加价项false条件表示人工补费见PricingRule::isManualSupplement()总配送费 命中规则的金额累加最终计算由src/Pricing/PricingManager.php汇总输出。规则如何变成人话对运营后台来说直接展示in_zone(dropoff, CityCenter) and weight 1000并不友好。src/Pricing/RuleHumanizer.php会解析表达式语法树把每条规则翻译成人类可读的名称例如送达地址在 CityCenter 区域内、重量超过 1.00 kg —— 1.50 €翻译规则覆盖距离公里、重量公斤、区域、时间窗、任务类型等让商家在管理面板里一眼看懂每条配送费规则。用 API 实时评估一条规则想验证某条规则是否会命中一单配送CoopCycle 提供了评估接口定义在src/Entity/Delivery/PricingRule.php的 API 注解中POST /api/pricing_rules/{id}/evaluate请求体只需给出取件/送达地址、时间窗、包裹等信息返回{ result: true/false }。完整示例见features/pricing_rules.feature包含按包裹、按重量、多点配送等场景。源码地图想深入可以看这些文件规则实体与匹配逻辑src/Entity/Delivery/PricingRule.php、src/Entity/Delivery/PricingRuleSet.php表达式变量构造src/ExpressionLanguage/DeliveryExpressionLanguageVisitor.php、src/ExpressionLanguage/TaskExpressionLanguageVisitor.php区域判定函数src/ExpressionLanguage/ZoneExpressionLanguageProvider.php价格表达式解析src/Pricing/PriceExpressionParser.php、src/Pricing/PriceExpressions/计价汇总src/Pricing/PricingManager.php、src/Pricing/PriceCalculationVisitor.php规则人读化src/Pricing/RuleHumanizer.php端到端测试features/pricing_rules.feature、features/pricing_rules_set.feature小结CoopCycle 定价规则引擎的设计哲学是条件与价格都用表达式描述规则有序、逐条命中、金额累加。借助表达式语言你只需用距离、重量、区域、时间窗、包裹几个变量和函数做组合就能覆盖几乎所有配送计费场景——这正是它比硬编码价格表更灵活、也更易维护的原因。【免费下载链接】coopcycle-webLogistics marketplace platform. Only for worker-owned business.项目地址: https://gitcode.com/gh_mirrors/co/coopcycle-web创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表