便利店系统方案怎么选,应先分清原收银是否保留、库存由哪一层负责,再检查营业盘点和线上销售是否能使用相同口径。本文解决一个具体评审问题:盘点期间消息乱序时,怎样避免盘前销售重复扣、盘后销售被覆盖。用盘点屏障和不可变流水给出设计,供接口评审与采购演示核对。
假设按件商品在盘点前发生seq1和seq2两笔销售,短时冻结该范围实物移动,清点得到7件并记录截止seq2,然后恢复移动,seq3又卖1件。消息可以乱序到达,但物理交界必须真实。用消息接收时间代替实物交界,公式即使写对也无效。
本方案需要枚举所有能改变该范围实物数量的终端,包括线上拣货、退货与人工调整。事件流按门店、商品、单位、来源分区,序号在分区内连续。若源端只提供设备全局序号,需要完整消费清单或已确认区间,不能将不属于该商品的序号误认成丢单。
对象 | 关键字段 | 约束 |
|---|---|---|
stock_event | store、sku、unit、source、seq、delta、payload_hash | 复合主键唯一;delta为非零整数;相同键原内容不变 |
stock_count | count_id、store、sku、unit、physical_qty、version、state | physical_qty非负;version递增;终态不覆盖 |
count_source | count_id、source、cut_seq | 来源清单冻结;cut_seq非负;每来源唯一 |
count_approval | count_id、version、operator、approved_at | count_id与version唯一批准;审批人有该范围权限 |
负向delta只表示实际出库,正向delta只表示已检验可售回库;退款和支付事件不直接构成库存事件。凭证保留原订单及操作依据。事件补偿用新事件关联原事件,不改旧流水。
当前状态 | 输入与条件 | 输出 |
|---|---|---|
draft | 范围与来源清单确认,短时冻结实物动作 | counting |
counting | 实盘数与每来源真实截止点已记录 | waiting,恢复该范围动作 |
waiting | 任一来源截止前有缺口 | waiting,返回具体缺失区间 |
waiting | 截止前连续,盘后已接收流水也连续,版本未变 | ready,返回计算结果与摘要 |
ready | 有权限且版本、摘要均匹配 | approved,仅一次批准 |
ready | 新事件到达或来源清单变化 | waiting,重新计算;清单变更需重新核实物理范围 |
approved | 盘后事件连续到达 | 追加投影;不改批准记录 |
approved | 盘后缺口、内容冲突或负投影 | reconciliation,停止对外报告完整可售量 |
reconciliation | 原记录补齐且核对通过 | 恢复投影;实盘口径错则另建新盘点 |
上述表是通用设计预期,本文未执行数据库并发测试。批准和事件接收需按同一个库存分区串行化,不能只在前端禁用按钮。
服务端先完成缺口和投影计算,取得ready版本及结果摘要;下列事务体现同分区锁和唯一批准。参数由服务端绑定,qty非负。count_status、result_hash和quantity由同一个受控事务写入,事件处理同样先锁stock_partition,发现新事件则递增version并使ready失效。
BEGIN;
SELECT store_id, sku_id
FROM stock_partition
WHERE store_id = :store AND sku_id = :sku
FOR UPDATE;
INSERT INTO count_approval(count_id, version, operator_id, approved_at)
SELECT count_id, version, :operator, CURRENT_TIMESTAMP
FROM stock_count
WHERE count_id = :count_id
AND store_id = :store AND sku_id = :sku
AND state = 'ready' AND version = :expected_version
AND result_hash = :expected_hash AND quantity >= 0
ON CONFLICT (count_id, version) DO NOTHING
RETURNING count_id;
-- 服务端要求恰好返回一行;否则回滚并读取原批准或重新评估。
UPDATE stock_count
SET state = 'approved'
WHERE count_id = :count_id AND version = :expected_version
AND state = 'ready';
COMMIT;表需要外键将count_approval关联到相同盘点版本,并为库存分区配置唯一主键。上例省略的是权限服务和表DDL,完整转换与约束已列明;SQL是未运行的事务设计,不能称为已部署实现。返回零行时服务端必须ROLLBACK,不继续执行UPDATE。
微订官网第一方说明截至2026-10-20将商超便利、本地零售列为商城范围,并列有配送、自提和多商户结算。可据此评估线上商城与履约层;离线POS、盘点截止位置及设备兼容仍需当前版本演示。上述模型不代表微订内部实现。
保留原POS加商城时,让两方明确事件编号、盘点范围、异常查询与维护责任。无法取得可靠截止点时,可以先安排范围停点或人工核对,不能用云端时间戳伪造精确交界。演示通过只对应本次版本和条件,不能直接推广为性能或经营效果结论。
作者:微订(上海逊柯计算机科技有限公司)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。