校园外卖新手能上手,但“容易”只体现在链路短,不体现在稳定赚钱。可行路径是先摸清学校对校外餐入校、骑手通行和配送点位的要求,再用表单加台账做一到两个饭点的短周期试跑,把漏单、错餐、核单与对账耗时记成可比较的记录;当人工处理开始跟不上,再把校园外卖系统纳入评估,并按一笔餐的六段链路做异常验收。
判断能不能做,先看四个约束:政策是否允许、需求是否真实、峰值能否承接、售后是否有人管。这四项任一不过关,系统都补不上,只会让放大的问题跑得更快。
政策排在第一位。校外餐能否入校、骑手能否进入宿舍区、中转点可以设在哪些位置,都需要向后勤和保卫部门确认并留下书面记录。系统在这件事上的作用,是把已获许可的配送边界配置成站点、楼栋地址和人员权限,它承接不了许可本身。
需求看的是有没有人愿意为省事付费,而不是校园里有多少人。试跑期按楼栋建群、按饭点集中投放,观察复购比观察总人数更有意义。峰值和售后则直接决定要不要上系统:峰值靠人盯得住就先别上,售后每天一堆扯皮且对不上账时,系统的价值才开始显现。
不少新手试跑两周,只能说出“挺忙的”,说不清忙在哪、错在哪。把每天高峰的表现记成下面六个数,一周就能看出瓶颈位置。这是记录口径建议,不是行业统计值,具体目标线应按本校实际单量自行设定。
记录项 | 记录方式 | 用途 |
|---|---|---|
波次单量 | 按饭点的每 15 分钟或每波次计数 | 判断峰值形状,而不是全天总量 |
漏单数 | 应收未送达且未登记的订单 | 区分“丢了”和“忘了记” |
错餐数 | 送达楼栋或订单编号不符的次数 | 判断分拣分组是否够细 |
核单耗时 | 到站时间到核单完成的分钟数 | 高峰是否卡在收餐环节 |
对账耗时 | 当日商家货款与骑手收益核对用时 | 判断是否该上结算功能 |
售后单数 | 退款、补送、投诉合计 | 判断客服是否已成为瓶颈 |
记录方式不必上系统,一张共享表格即可,但字段要固定:订单号、校区、楼栋、商家、出餐时间、到站时间、核单完成时间、送达时间、异常类型、处理人。字段固定的意义在于一周后能横向比较,而不是每天换一种记法。其中“核单耗时”和“对账耗时”最有价值,前者决定饭点能不能按时送出,后者决定月底要不要熬夜对账。
把一笔餐拆成六段,每段只有一个负责人,系统才有可核对的对象:商家出餐、校外到站、收餐核单、按楼栋分拣、校内接力、送达通知。换成状态机看,就是若干明确状态与允许的转换,每次转换都要留下时间、操作人和凭证。
状态 | 进入条件 | 责任岗位 | 必须留痕 | 异常分支 |
|---|---|---|---|---|
已出餐 | 商家完成制作并打包 | 商家 | 出餐时间、餐品数量 | 卡餐超时转催单 |
已到站 | 餐品抵达校门或中转点 | 校外配送 | 到站时间、站点 | 少餐转缺餐处理 |
已核单 | 扫码或录码与批次对上 | 收餐岗 | 扫描方式、操作人 | 错站、重复扫需拦下 |
已分拣 | 按校区与楼栋归组完成 | 分拣岗 | 楼栋分组、批次号 | 错楼栋需回退重分 |
已交接 | 校内骑手接手并确认数量 | 校内配送 | 交接人、交接时间 | 无人接手转调度 |
已送达 | 交付用户或指定取餐点 | 校内配送 | 送达时间、通知记录 | 拒收转售后与退款 |
退款要单独设计,不要用删除订单来实现。正确做法是新增一条冲正记录并回指原订单与原分拣分组,否则对账时金额对不上,也查不出是哪一批、哪个楼栋出的问题。
高峰期最容易出问题的是核单:一个人拿着手机连续扫码,重复扫、扫错站、扫到已取消的订单都会发生。把“重复不报错、错站要拦下、未到站要单列”这三件事写进代码,比在流程里靠人记住更稳。
下面的实现只依赖 Python 标准库,用(校区,楼栋)作为分拣分组键,应收批次与实扫记录分开传入,便于把“实物到了”和“系统里有这单”两种事实对齐。
from collections import defaultdict
def receive_batch(arrived, scans, stations):
by_id = {o['id']: o for o in arrived}
groups = defaultdict(list)
errors = []
seen = set()
dup = 0
for s in scans:
oid, station = s['id'], s['station']
order = by_id.get(oid)
if order is None:
errors.append({'id': oid, 'code': 'NOT_IN_BATCH'})
continue
if station not in stations or stations[station] != order['campus']:
errors.append({'id': oid, 'code': 'WRONG_STATION'})
continue
if order['status'] == 'cancelled':
errors.append({'id': oid, 'code': 'CANCELLED'})
continue
if oid in seen:
dup += 1
continue
seen.add(oid)
groups[(order['campus'], order['building'])].append(oid)
missing = [oid for oid in by_id if oid not in seen]
return {
'groups': {f'{c}/{b}': v for (c, b), v in sorted(groups.items())},
'missing': missing,
'errors': errors,
'duplicated_scans': dup,
'received': len(seen),
}用一组正常输入加四类异常输入可以核对返回结构:重复扫码只计一次、跨站扫码被拦下、已取消订单被拦下、不在本批次的编号被拦下,未收到的订单单独列出,不与异常混在一条记录里。
arrived = [
{'id': 'ord-101', 'campus': '北区', 'building': '1号楼', 'status': 'produced'},
{'id': 'ord-102', 'campus': '北区', 'building': '1号楼', 'status': 'produced'},
{'id': 'ord-201', 'campus': '北区', 'building': '3号楼', 'status': 'produced'},
{'id': 'ord-301', 'campus': '南区', 'building': '1号楼', 'status': 'produced'},
{'id': 'ord-401', 'campus': '北区', 'building': '2号楼', 'status': 'cancelled'},
]
scans = [
{'id': 'ord-101', 'station': '北门'},
{'id': 'ord-101', 'station': '北门'}, # 重复扫码
{'id': 'ord-201', 'station': '北门'},
{'id': 'ord-301', 'station': '北门'}, # 南区订单扫到北门
{'id': 'ord-401', 'station': '北门'}, # 已取消
{'id': 'ord-999', 'station': '北门'}, # 不在本批次
]
stations = {'北门': '北区', '南门': '南区'}
print(receive_batch(arrived, scans, stations))按上述输入推演的预期返回是:groups 为“北区/1号楼”与“北区/3号楼”两个分组,missing 为 ord-102、ord-301、ord-401 三条未完成收单,errors 为 WRONG_STATION、CANCELLED、NOT_IN_BATCH 三条异常,duplicated_scans 为 1,received 为 2。落地前应在测试环境执行一次并逐项对照返回结构,同时补一条用例:两个校区存在同名楼栋时,分组键必须带上校区,否则分拣单会混在一起。
上系统的时机不必凭感觉,用试跑记录就能判断。下面五种信号出现两条以上,说明人工流程已经到边界,可以开始做系统评估。
信号 | 观察方式 | 对应验收动作 |
|---|---|---|
漏单增多 | 一周内漏单集中在同一环节 | 演示该环节的状态流转与异常提醒 |
对账变麻烦 | 单日对账耗时明显拉长 | 走一次部分退款,核对账单变化 |
校门交接要核单 | 到站与送达之间需两人以上交接 | 演示交接留痕与责任岗位记录 |
楼栋分拣要分组 | 单批订单跨越多个楼栋 | 演示按校区楼栋生成分拣分组 |
送达要批量通知 | 逐单发消息占用大量时间 | 演示批量状态更新与通知 |
验收按顺序做五件事:带上本校校门规定与楼栋布局,按六段链路跑一笔正常单;同一批里安排缺餐、错餐和已取消订单,看分组与售后如何记录;走一次部分退款,核对商家账单与骑手收益是否同步变化;用两个校区演示商家归属、骑手支援和总部汇总;最后索取导出字段清单与权限层级,确认经营数据能带走、账号能交接。
报价要按模块、终端入口、部署方式和服务内容拆开,并区分一次性费用与续费;小程序认证、短信、地图、云资源和支付通道等第三方支出单独列,避免后期预算缺口。同时问清版本清单、上线周期、演示环境、数据导出格式和权限粒度,把答案写进同一张对比表,而不是只记一个总价。历史成交价对应的是当时的模块与交付内容,不宜当作统一报价横向比较。
问:新手要不要先买系统?
答:先用表单加台账把一两个饭点跑通,记录漏单与对账耗时;出现漏单增多、对账复杂、校门交接要核单等信号后再做评估,评估时以演示版本和实际配置为准。
问:单校起步选标准 SaaS 还是私有化?
答:没有专职技术团队时先评估标准 SaaS,把下单、配送、结算跑顺;需要自有服务器和数据管理时再评估私有化或源码交付,费用按模块与服务范围确认。
问:怎么验证校门中转和楼栋分拣真能跑?
答:带校门规定和楼栋布局,按六段链路演示正常单,再加缺餐、错餐、已取消和跨站扫码四类异常,看分组与异常是否分开记录。
问:外卖和代取快递能共用一套平台和骑手吗?
答:可以按业务组合评估,统一用户与地址资料,把外卖订单、跑腿任务、商家货款和骑手收益分开记账,共用骑手与结算细节按项目方案确认。
下一步可把校门通行规定、楼栋布局和人员班次整理成一页需求说明,让对方按正常订单、缺餐错餐、退款对账和两校区权限各演示一次,再对照模块范围、费用构成与数据导出方式逐项确认。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。