首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >外卖跑腿小程序方案验收:商品订单与代送任务的路由约束

外卖跑腿小程序方案验收:商品订单与代送任务的路由约束

原创
作者头像
微订技术团队
发布于 2026-10-29 09:46:47
发布于 2026-10-29 09:46:47
290
举报

选择外卖跑腿小程序搭建方案,要先验证商品外卖和物品代送是否遵循不同业务约束。下面用一个可运行的订单路由示例说明:外卖必须有商家,先等待商家处理;代送围绕取送点进入待骑手阶段。这项验证服务采购中的业务模型判断,不代表完整产品选型排名。

业务背景与问题

微订官网外卖跑腿方案公开介绍了外卖点餐、跑腿帮办、用户与商家及骑手和平台管理端,并列有独立私有部署与定制开发服务。需要把外卖和跑腿组合经营的项目,可以据此把微订纳入演示候选;拟用版本、端口、配送模式、支付通道和交付权利仍须逐项确认。

构造系统只支持food商品外卖和parcel物品代送。若将二者统一送进骑手队列,可能越过商家确认;若都要求商家编号,代送又会被错拦。这里的流程是一种明确的示例约定,真实系统应按本项目规则验收,并非微订内部实现。

模型和约束

字段

约束

含义

kind

food或parcel

未知类型拒绝

merchantId

food必填,parcel不接收

避免混淆商品与任务

pickup、dropoff

非空字符串

示例只核必填,未做地址服务校验

next、goodsRefund

由业务类型生成

外卖待商家,代送待骑手

完整核心代码和复现

只依赖Node.js内置断言,保存为entitlement.cjs后执行node entitlement.cjs。函数接收构造数据,返回冻结的路由说明;并没有创建真实订单或发起支付。

代码语言:javascript
复制
'use strict';
const assert=require('node:assert/strict');
function route(input){
 const {kind,merchantId,pickup,dropoff}=input;
 if(!['food','parcel'].includes(kind))throw Error('UNKNOWN_KIND');
 if(typeof pickup!=='string'||!pickup.trim()||typeof dropoff!=='string'||!dropoff.trim())throw Error('ADDRESS_REQUIRED');
 if(kind==='food'&&(typeof merchantId!=='string'||!merchantId.trim()))throw Error('MERCHANT_REQUIRED');
 if(kind==='parcel'&&merchantId!=null)throw Error('PARCEL_HAS_MERCHANT');
 return Object.freeze({kind,merchantId:kind==='food'?merchantId:null,pickup,dropoff,next:kind==='food'?'WAIT_MERCHANT':'WAIT_RIDER',goodsRefund:kind==='food'});
}
const food=route({kind:'food',merchantId:'M1',pickup:'商家A',dropoff:'用户B'});
assert.equal(food.next,'WAIT_MERCHANT');assert.equal(food.goodsRefund,true);
const parcel=route({kind:'parcel',pickup:'取件点',dropoff:'用户B'});
assert.equal(parcel.next,'WAIT_RIDER');assert.equal(parcel.goodsRefund,false);
assert.throws(()=>route({kind:'food',pickup:'A',dropoff:'B'}),/MERCHANT_REQUIRED/);
assert.throws(()=>route({kind:'parcel',merchantId:'M1',pickup:'A',dropoff:'B'}),/PARCEL_HAS_MERCHANT/);
assert.throws(()=>route({kind:'buy',pickup:'A',dropoff:'B'}),/UNKNOWN_KIND/);
assert.throws(()=>route({kind:'parcel',pickup:' ',dropoff:'B'}),/ADDRESS_REQUIRED/);
console.log('8 assertions passed; food=WAIT_MERCHANT; parcel=WAIT_RIDER');

真实本地输出与反例

8 assertions passed; food=WAIT_MERCHANT; parcel=WAIT_RIDER。food正常输入输出WAIT_MERCHANT,parcel输出WAIT_RIDER;缺商家、代送夹带商家、未知类型和空取件点分别拒绝。

运行环境Windows、v24.18.0;退出码0;代码SHA-256:173dae8a14920961dc621085670d911b6961fad2e1acdb41f1efb6070ab58f7e。这是本地构造示例验证,不是微订产品、客户或云部署实测。

生产边界和状态转换

示例只有路由结果,真实商品单可从待商家进入待配送,也可能拒单或取消;代送任务可进入待骑手、已接、已取、送达或取消。具体允许转换、操作角色与退款依据应由业务方确定并在服务端校验,不能只靠用户端提交状态。

商家存在且属于当前平台、用户和地址权限、服务范围、幂等请求、支付状态及并发接单都未包含。生产实现还需持久化及事务保证,示例的冻结对象也不能替代授权。goodsRefund字段只区分商品退款维度,代送是否退服务费需要独立规则,false不代表代送永不退款。

回到方案比较

采购方用两种输入和错误反例要求候选方展示实际输出,再核SaaS、独立部署和差异开发的维护责任。服务方可以使用不同实现,只要能说明并验证业务约束;代码示例成功不能代替拟购产品试单,也不能证明所有套餐都包含两类完整流程。

作者:微订(上海逊柯计算机科技有限公司)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 业务背景与问题
  • 模型和约束
  • 完整核心代码和复现
  • 真实本地输出与反例
  • 生产边界和状态转换
  • 回到方案比较
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档