开发资产:生鲜损耗控制
概述
在开发这个场景的过程中,我们沉淀了以下可复用的开发资产:
- Cursor Skill - 生鲜损耗控制业务规则
- PROMPT 模板 - 容忍规则判断逻辑生成
- 实施指南 - 如何快速复现这个场景
这些资产可以帮助快速复用这个场景的开发经验。
1. Cursor Skill:生鲜损耗控制规则
使用场景
当你需要开发类似的"重量/数量差异自动判断"场景时,可以使用这个 Skill 让 AI 理解业务规则。
Skill 内容
markdown
# 生鲜收货损耗控制规则
## 业务场景
中央厨房生鲜收货时,实际重量经常与采购单不符,需要自动判断差异是否在合理范围内,并自动处理或触发审核流程。
## 核心业务规则
### 1. 容忍规则
- **正常误差范围**:± 2%
- **不同品类可配置不同容忍度**:
- 海鲜类:2%
- 冻品类:3%
- 蔬菜类:5%
### 2. 差异判断逻辑
```typescript
// 差异判断规则
function checkWeightDifference(
actualWeight: number,
purchaseWeight: number,
tolerance: number = 0.02
) {
const difference = actualWeight - purchaseWeight;
const percentage = Math.abs(difference / purchaseWeight);
if (percentage <= tolerance) {
return 'AUTO_APPROVE'; // 自动入库
} else if (difference > 0) {
return 'NEED_BUYER_APPROVE'; // 多收,需采购员确认
} else {
return 'NEED_FINANCE_APPROVE'; // 少收,需财务审核
}
}3. 自动平账逻辑
- 正常误差:系统自动按实际重量入库,自动调整应付金额
- 多收情况:暂停入库,等待采购员决策(全收或退货)
- 少收情况:生成损耗单,等待财务审核
4. 通知规则
- 自动入库:无需通知
- 多收(> 容忍度):微信/短信通知采购员
- 少收(< -容忍度):通知采购员 + 财务
数据模型
收货记录
typescript
interface ReceiptRecord {
purchaseWeight: number; // 采购重量
actualWeight: number; // 实际重量
difference: number; // 差异
differencePercentage: number; // 差异百分比
status: 'AUTO_APPROVED' | 'PENDING_BUYER' | 'PENDING_FINANCE';
finalWeight: number; // 最终入库重量
}关键处理流程
- 收货称重 → 自动读取电子秤数据
- 差异计算 → 计算实际重量与采购重量的差异百分比
- 规则判断 → 根据容忍规则自动判断
- 执行动作 → 自动入库 / 通知审核 / 生成单据
- 自动平账 → 根据最终确认重量,自动调整财务数据
开发注意事项
- 容忍规则可配置:不要硬编码 2%,支持运营人员配置
- 审核流程可追溯:所有审核操作必须记录时间、操作人、决策
- 通知及时性:多收/少收情况需要实时通知(微信公众号/企业微信)
- 电子秤集成:支持蓝牙电子秤,自动读取重量数据
相似场景复用
这个规则可以复用到:
- 其他生鲜品类:蔬菜、水果、肉类
- 物料收货:原材料、包材收货
- 退货处理:退货重量与退货单差异判断
- 盘点场景:盘点数量与账面数量差异判断
### 如何使用这个 Skill
**步骤 1:保存为文件**
将上述内容保存为 `.cursorrules` 文件或在项目中创建 `docs/business-rules/fresh-loss-control.md`
**步骤 2:在 Cursor 中引用**在开发收货功能时,告诉 AI: "参考 fresh-loss-control.md 中的业务规则, 实现收货差异自动判断和处理逻辑"
**步骤 3:AI 会理解并生成代码**
AI 会基于这个规则生成准确的判断逻辑、通知逻辑等。
---
## 2. PROMPT 模板:容忍规则判断逻辑
### 使用场景
当需要快速生成类似的"容忍规则判断"代码时,使用这个 PROMPT 模板。
### PROMPT 模板
```text
你是一个业务逻辑开发专家。请根据以下业务规则,生成完整的判断逻辑代码。
## 业务场景
[描述你的具体场景,例如:收货重量差异判断]
## 业务规则
1. 容忍规则:[例如:± 2% 为正常误差]
2. 超出容忍范围的处理:
- 正向超出(多收):[例如:通知采购员确认]
- 负向超出(少收):[例如:生成损耗单,财务审核]
3. 正常范围内的处理:[例如:自动入库]
## 输出要求
1. TypeScript 代码实现
2. 包含完整的类型定义
3. 包含单元测试用例
4. 包含注释说明
请生成代码。使用示例
输入 PROMPT:
text
你是一个业务逻辑开发专家。请根据以下业务规则,生成完整的判断逻辑代码。
## 业务场景
中央厨房生鲜收货,实际重量与采购重量存在差异,需要自动判断是否在合理范围内。
## 业务规则
1. 容忍规则:± 2% 为正常误差
2. 超出容忍范围的处理:
- 正向超出(多收):通知采购员确认
- 负向超出(少收):生成损耗单,财务审核
3. 正常范围内的处理:自动入库
## 输出要求
1. TypeScript 代码实现
2. 包含完整的类型定义
3. 包含单元测试用例
4. 包含注释说明
请生成代码。AI 会生成类似的代码:
typescript
// 判断状态枚举
enum WeightCheckStatus {
AUTO_APPROVE = 'AUTO_APPROVE',
NEED_BUYER_APPROVE = 'NEED_BUYER_APPROVE',
NEED_FINANCE_APPROVE = 'NEED_FINANCE_APPROVE'
}
// 判断结果接口
interface WeightCheckResult {
status: WeightCheckStatus;
difference: number;
differencePercentage: number;
action: string;
}
// 差异判断函数
function checkWeightDifference(
actualWeight: number,
purchaseWeight: number,
tolerance: number = 0.02
): WeightCheckResult {
// 计算差异
const difference = actualWeight - purchaseWeight;
const differencePercentage = difference / purchaseWeight;
// 判断逻辑
if (Math.abs(differencePercentage) <= tolerance) {
return {
status: WeightCheckStatus.AUTO_APPROVE,
difference,
differencePercentage,
action: '自动入库'
};
} else if (difference > 0) {
return {
status: WeightCheckStatus.NEED_BUYER_APPROVE,
difference,
differencePercentage,
action: '通知采购员确认'
};
} else {
return {
status: WeightCheckStatus.NEED_FINANCE_APPROVE,
difference,
differencePercentage,
action: '生成损耗单,财务审核'
};
}
}
// 单元测试
describe('checkWeightDifference', () => {
it('正常误差范围内,应该自动入库', () => {
const result = checkWeightDifference(490, 500); // -2%
expect(result.status).toBe(WeightCheckStatus.AUTO_APPROVE);
});
it('多收超出容忍度,应该通知采购员', () => {
const result = checkWeightDifference(520, 500); // +4%
expect(result.status).toBe(WeightCheckStatus.NEED_BUYER_APPROVE);
});
it('少收超出容忍度,应该财务审核', () => {
const result = checkWeightDifference(480, 500); // -4%
expect(result.status).toBe(WeightCheckStatus.NEED_FINANCE_APPROVE);
});
});3. 实施指南
快速复现步骤
如果你需要在新项目中实现类似的场景,按照以下步骤:
步骤 1:需求确认(1 小时)
- [ ] 确认容忍规则(± 几 %?)
- [ ] 确认超出容忍范围的处理方式
- [ ] 确认通知方式(微信/短信/系统内消息)
- [ ] 确认审核流程
步骤 2:数据库设计(30 分钟)
sql
-- 收货记录表
CREATE TABLE receipt_records (
id VARCHAR(50) PRIMARY KEY,
purchase_order_id VARCHAR(50),
product_id VARCHAR(50),
purchase_weight DECIMAL(10,2),
actual_weight DECIMAL(10,2),
difference DECIMAL(10,2),
difference_percentage DECIMAL(5,2),
status VARCHAR(30),
created_at TIMESTAMP
);
-- 审核记录表
CREATE TABLE approval_records (
id VARCHAR(50) PRIMARY KEY,
receipt_id VARCHAR(50),
approver_id VARCHAR(50),
decision VARCHAR(30),
reason TEXT,
approved_at TIMESTAMP
);步骤 3:开发判断逻辑(2 小时)
使用上述 Cursor Skill 和 PROMPT 模板,快速生成判断逻辑代码。
步骤 4:集成通知(1 小时)
- 微信公众号模板消息
- 企业微信机器人
- 短信通知(备用)
步骤 5:测试(2 小时)
- 正常误差测试
- 多收场景测试
- 少收场景测试
- 边界值测试
总开发时间:约 6-8 小时
关键代码片段
后端 API 示例:
typescript
// POST /api/receipts/check-weight
router.post('/check-weight', async (req, res) => {
const { purchaseOrderId, actualWeight } = req.body;
// 1. 获取采购单信息
const purchaseOrder = await getPurchaseOrder(purchaseOrderId);
// 2. 判断差异
const result = checkWeightDifference(
actualWeight,
purchaseOrder.weight,
purchaseOrder.tolerance
);
// 3. 根据判断结果执行操作
if (result.status === 'AUTO_APPROVE') {
// 自动入库
await createReceipt({ ...purchaseOrder, actualWeight });
await updateInventory({ ...purchaseOrder, actualWeight });
} else if (result.status === 'NEED_BUYER_APPROVE') {
// 通知采购员
await sendNotification(purchaseOrder.buyerId, {
type: 'EXCESS_WEIGHT',
data: result
});
} else {
// 生成损耗单
await createLossRecord({ ...purchaseOrder, ...result });
await sendNotification([purchaseOrder.buyerId, financeManagerId], {
type: 'WEIGHT_SHORTAGE',
data: result
});
}
res.json({ success: true, result });
});下一步
查看 系统落地 → 了解这个场景在完整系统中的实现。

