Skip to content

开发资产:生鲜损耗控制

← 上一阶段:方案设计 | 下一阶段:系统落地 →


概述

在开发这个场景的过程中,我们沉淀了以下可复用的开发资产:

  1. Cursor Skill - 生鲜损耗控制业务规则
  2. PROMPT 模板 - 容忍规则判断逻辑生成
  3. 实施指南 - 如何快速复现这个场景

这些资产可以帮助快速复用这个场景的开发经验。


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;           // 最终入库重量
}

关键处理流程

  1. 收货称重 → 自动读取电子秤数据
  2. 差异计算 → 计算实际重量与采购重量的差异百分比
  3. 规则判断 → 根据容忍规则自动判断
  4. 执行动作 → 自动入库 / 通知审核 / 生成单据
  5. 自动平账 → 根据最终确认重量,自动调整财务数据

开发注意事项

  1. 容忍规则可配置:不要硬编码 2%,支持运营人员配置
  2. 审核流程可追溯:所有审核操作必须记录时间、操作人、决策
  3. 通知及时性:多收/少收情况需要实时通知(微信公众号/企业微信)
  4. 电子秤集成:支持蓝牙电子秤,自动读取重量数据

相似场景复用

这个规则可以复用到:

  • 其他生鲜品类:蔬菜、水果、肉类
  • 物料收货:原材料、包材收货
  • 退货处理:退货重量与退货单差异判断
  • 盘点场景:盘点数量与账面数量差异判断

### 如何使用这个 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 });
});

下一步

查看 系统落地 → 了解这个场景在完整系统中的实现。


相关链接

基于 AI 辅助开发,快速、灵活、可靠