目前,各地陆续上线了防疫物资预约产品,用来同意调度防疫物资。本文按照时间维度,结合业务流程,对防疫物资预约的后台逻辑、数据处理进行说明。
当前,新型肺炎疫情严重,防疫物资紧缺。各地陆续上线防疫物资预约的产品,统一调配防疫物资,如广州的穗康小程序等。
本人有幸参与某地市的预约防疫物资产品的项目。因为项目时间紧、任务重、压力大,所以该产品以简单可行为主,主要功能是预约防疫物资和查询预约结果(原型设计部分相对简单,没什么可说的)。
整个预约业务可分为三部分,分别为主办方创建活动、用户预约及查询、药店发放物资。本文按照时间维度,结合业务流程,对防疫物资预约的后台逻辑、数据处理进行说明。
1. 第1天
1.1 主办方填写活动创建表,系统导入该表
活动创建表的信息包括:活动名称、主办单位、领取时间、领取点、物资名称、总物资数量、每人领取的数量。
为方便药店管理,同一时间同一个领取点只派发一种或者一组物资(例如2个口罩+1瓶酒精)。同时,同一时间同一个领取点只有一个活动,暂不考虑多个活动(涉及同一时间段药店对多个活动物资的管理问题)。
1.2 系统生成剩余物资表
剩余物资表的信息包括:领取时间、领取地点、物资名称、剩余数量。
把活动创建表的总物资数量均分到每个时间段。如果均分到每个时间段的数量不为整,则向下取整,最后一个时间段加上各时间段的小数部分,使得所以时间段的物资数之和等于总物资数。
举个例子,对于以下这条记录的生成的剩余物资表,应该是下图。
所以,活动开始前的总剩余物资表为:
需要注意的是,可能存在前一天没预约满,还有剩余物资可用的情况。所以,需先把前一天剩余的物资导入当天的物资中(下文2.2节有详细说明)。
当前防疫物资紧缺,所以一个活动一个用户只能领取一次。因此,用户选择第2天预约物资后,系统先查询用户以前是否预约成功过,没有才缓存用户预约记录。
缓存的信息包括:姓名、身份证号、手机号、预约物资、预约数量、预约时间、预约地点。
按时间排序如下:
如果需要查看实时的剩余物资情况,则系统还需要实时更新剩余物资表。同时,当剩余物资数量<每人领取的数量时,举个例子,剩余1个口罩,而每人领取两个口罩,此时需要关闭预约渠道。
常见的筛选机制有三种:
一是摇号,给每条记录配一个随机数字,所有的随机数字都不相同,按随机数字的升序或者降序排列,排在前面的用户预约成功,排在后面的用户预约失败,预约成功的用户数量需等于可预约人数。对于这种方法,用户需要等待一段时间,才能看到预约结果。不足之处是,逻辑可能较复杂。
二是按“先来后到”的规则筛选,先预约的用户预约成功,到可预约的物资用完时,后面的用户预约失败。这种方法可以马上出结果,但用户可能“挤爆”服务器。
三是第二种方法的变形,规则一样,但是预约结果不是马上公布,让用户产生“预约成功与否跟预约的先后顺序无关”的错觉,可防止服务器挤爆的现象。
本文选用第三种方法,筛选出预约成功用户,保存新预约记录表(增加预约号)。此时,李四的预约是失败的。
第二天剩余的物资为:
1.5 系统导出预约成功的用户信息给药店
1.6 12:00以后,开放查询,用户查询预约结果
用户查询预约结果,结果包括两种:预约成功、无记录或者预约失败。预约成功的用户第二天到药店领取防疫物资。
2. 第2天
2.1 用户到药店领取防疫物资
药店核对用户身份证发放防疫物资,如果用户没来,药店人员电话联系用户,询问情况,协商处理。
暂不考虑现场凭身份证领取物资的情况。
2.2 重复1.2-1.6流程
同时,预约失败或者第一天未预约的用户可以再次发起预约,流程与第一天相同(1.2节-1.6节)。
第二天,总的剩余物资表为:
可以看到,A县药店在第2天下午派发的口罩有剩余,剩余2个。所以把剩余物资数量加入到第三天上午派发,即A县药店在第3天上午派发的口罩为2+2=4个。
所以,第3天分配的物资为:
当天预约成功的用户有:
剩余的物资为:
3. 第3天
3.1 系统导出剩余物资给主办方
A县活动结束,剩余的物资为:
把最终A县活动的物资剩余情况汇报给主办方。
总结