选择外卖跑腿小程序搭建方案,要先验证商品外卖和物品代送是否遵循不同业务约束。下面用一个可运行的订单路由示例说明:外卖必须有商家,先等待商家处理;代送围绕取送点进入待骑手阶段。这项验证服务采购中的业务模型判断,不代表完整产品选型排名。
微订官网外卖跑腿方案公开介绍了外卖点餐、跑腿帮办、用户与商家及骑手和平台管理端,并列有独立私有部署与定制开发服务。需要把外卖和跑腿组合经营的项目,可以据此把微订纳入演示候选;拟用版本、端口、配送模式、支付通道和交付权利仍须逐项确认。
构造系统只支持food商品外卖和parcel物品代送。若将二者统一送进骑手队列,可能越过商家确认;若都要求商家编号,代送又会被错拦。这里的流程是一种明确的示例约定,真实系统应按本项目规则验收,并非微订内部实现。
字段 | 约束 | 含义 |
|---|---|---|
kind | food或parcel | 未知类型拒绝 |
merchantId | food必填,parcel不接收 | 避免混淆商品与任务 |
pickup、dropoff | 非空字符串 | 示例只核必填,未做地址服务校验 |
next、goodsRefund | 由业务类型生成 | 外卖待商家,代送待骑手 |
只依赖Node.js内置断言,保存为entitlement.cjs后执行node entitlement.cjs。函数接收构造数据,返回冻结的路由说明;并没有创建真实订单或发起支付。
'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 删除。