系统落地:生鲜损耗控制
系统实现
这个场景已经作为"中央厨房管理系统"的核心模块之一落地实施。
在完整系统中的位置
中央厨房管理系统
├── 菜品标准化管理
├── 门店需求计划
├── 生产调度
└── 【采购收货管理】← 本场景所在模块
├── 采购计划
├── 【生鲜收货与损耗控制】← 本场景
├── 库存管理
└── 供应商管理功能模块
1. 移动端收货
界面展示:
┌───────────────────────────┐
│ 收货扫码 │
├───────────────────────────┤
│ │
│ [扫描采购单二维码] │
│ │
│ 或手动输入采购单号: │
│ [____________] [搜索] │
│ │
└───────────────────────────┘
扫码后 ↓
┌───────────────────────────┐
│ 收货:海鲜-大虾 │
├───────────────────────────┤
│ 采购单号:PO202501160001 │
│ 供应商:XX 海鲜供应 │
│ │
│ 📦 采购重量:500.00 kg │
│ ⚖️ 实际重量:490.00 kg │
│ 📊 差异:-10 kg (-2.0%) │
│ │
│ ✅ 系统判断:自动入库 │
│ │
│ [确认入库] │
│ │
│ 说明: │
│ • 差异在容忍范围内(±2%) │
│ • 系统已自动处理 │
│ • 损耗:10kg(自然损耗) │
│ • 应付金额:14,700元 │
└───────────────────────────┘核心功能:
- ✓ 扫码快速收货
- ✓ 蓝牙电子秤自动读重
- ✓ 实时差异计算和判断
- ✓ 一键确认入库
2. 异常处理
多收场景(微信通知)
【收货异常提醒】
商品:海鲜-大虾
采购单号:PO202501160001
采购重量:500kg
实际重量:520kg
多收:+20kg (+4%)
超出容忍范围,请处理:
[全部收货] [退回多余]
点击处理 >少收场景(损耗单)
┌───────────────────────────┐
│ 损耗单 #LS202501160001 │
├───────────────────────────┤
│ 商品:海鲜-大虾 │
│ 采购单号:PO202501160001 │
│ │
│ 采购重量:500 kg │
│ 实际重量:480 kg │
│ 损耗:-20 kg (-4%) │
│ │
│ 损耗金额:600元 │
│ (20kg × 30元/kg) │
│ │
│ 状态:待财务审核 │
│ │
│ 审核操作: │
│ [ ] 正常损耗,审核通过 │
│ [ ] 异常损耗,联系供应商 │
│ │
│ 备注:_________________ │
│ │
│ [审核通过] [拒绝] │
└───────────────────────────┘3. 数据看板
供应商损耗分析:
供应商损耗分析(最近30天)
供应商A(XX海鲜)
━━━━━━━━━━━━━━━━━━━━━━
收货次数:45次
平均损耗率:1.8%
损耗金额:¥8,500
供应商B(YY海鲜)
━━━━━━━━━━━━━━━━━━━━━━
收货次数:38次
平均损耗率:3.2% ⚠️ 偏高
损耗金额:¥12,300
[查看详情] [导出报表]实施效果
定量效果
| 指标 | 上线前 | 上线后 | 提升 |
|---|---|---|---|
| 平均收货时间 | 8 分钟/单 | 3 分钟/单 | ⬇️ 62.5% |
| 财务对账时间 | 2 小时/天 | 10 分钟/天 | ⬇️ 91.7% |
| 采购员凌晨处理 | 8 次/月 | 2 次/月 | ⬇️ 75% |
| 损耗数据准确率 | ~70% | ~98% | ⬆️ 40% |
定性效果
仓管员反馈:
"以前收货要看采购单,手工记录,算差异,不知道该怎么处理。现在扫码、称重,系统自动告诉我怎么做,太方便了。" —— 李师傅(仓管)
采购员反馈:
"以前凌晨 4 点经常被叫醒处理重量差异问题,现在只有超出 2% 才会通知我,而且可以在手机上直接处理,不用赶到公司。" —— 张经理(采购主管)
财务反馈:
"最大的变化是对账不用重新算了,系统已经自动按实际重量调整了应付金额,我只要审核异常的损耗单就行。" —— 王会计(财务)
技术实现
技术栈
后端:
- Node.js + Express
- MySQL 数据库
- Redis 缓存
前端:
- Vue 3 + Vant(移动端)
- PC 管理后台
集成:
- 蓝牙电子秤 SDK
- 微信公众号推送
- 企业微信通知
核心代码片段
typescript
// 收货判断服务
class ReceiptCheckService {
async checkAndProcess(data: ReceiptData) {
// 1. 获取采购单信息
const purchaseOrder = await this.getPurchaseOrder(data.purchaseOrderId);
// 2. 判断差异
const result = this.checkWeightDifference(
data.actualWeight,
purchaseOrder.weight,
purchaseOrder.tolerance || 0.02
);
// 3. 根据判断结果执行不同流程
switch (result.status) {
case 'AUTO_APPROVE':
return await this.autoApprove(purchaseOrder, data.actualWeight);
case 'NEED_BUYER_APPROVE':
return await this.notifyBuyer(purchaseOrder, result);
case 'NEED_FINANCE_APPROVE':
return await this.createLossRecord(purchaseOrder, result);
}
}
private checkWeightDifference(actual, purchase, tolerance) {
const diff = actual - purchase;
const percent = Math.abs(diff / purchase);
if (percent <= tolerance) return { status: 'AUTO_APPROVE' };
if (diff > 0) return { status: 'NEED_BUYER_APPROVE', diff, percent };
return { status: 'NEED_FINANCE_APPROVE', diff, percent };
}
}扩展应用
这个场景的逻辑已经被复用到以下场景:
- 蔬菜收货 - 容忍度调整为 5%
- 冻品收货 - 容忍度调整为 3%
- 退货处理 - 使用相同的差异判断逻辑
- 盘点差异 - 盘点数量与账面数量的差异处理
查看完整系统
本场景是"中央厨房管理系统"的核心模块之一。
查看完整系统文档
完整系统包含:
- 菜品标准化管理
- 门店需求计划
- 生产调度
- 采购收货管理(本场景所在模块)
- 配送管理
- 成本核算
系统演示
如需查看系统演示或了解部署方案,请 联系我们 →

