# 采购订单计算器

## 概述

这是一个重构后的采购订单计算器系统，采用模块化设计，将复杂的业务逻辑分解为独立的计算模块，提高了代码的可维护性和可测试性。

## 架构设计

```
calculators/
├── core/                     # 核心工具和规则
│   ├── DecimalUtils.ts      # Decimal 工具类，统一精度计算
│   └── BusinessRules.ts     # 业务规则验证器
├── modules/                  # 计算模块
│   ├── CostCalculator.ts    # 成本计算模块
│   ├── SalesCalculator.ts   # 销售计算模块
│   ├── ProfitCalculator.ts  # 利润计算模块
│   ├── PackagingCalculator.ts # 包装计算模块
│   ├── OrderSupplierCalculator.ts # 供应商计算模块
│   └── SupplierWeightCalculator.ts # 供应商重量计算模块
├── services/                 # 服务层
│   └── WeightCalculationService.ts # 重量计算服务
├── types/                    # 类型定义
│   └── index.ts
├── OrderCalculator.ts # 主计算器类
└── README.md               # 文档
```

## 核心组件

### 1. DecimalUtils

- 统一处理所有精度计算
- 避免重复的 Decimal 创建和配置
- 提供常用的数学运算方法

### 2. BusinessRules

- 集中管理所有业务规则判断
- 如：是否包含运费、是否启用计提税等
- 提供清晰的业务规则接口

### 3. 计算模块

- **CostCalculator**: 成本相关计算
- **SalesCalculator**: 销售相关计算
- **ProfitCalculator**: 利润相关计算
- **PackagingCalculator**: 包装相关计算
- **OrderSupplierCalculator**: 单个供应商相关计算
- **SupplierWeightCalculator**: 供应商重量计算

### 4. 服务层

- **WeightCalculationService**: 重量计算服务，提供简化的 API 和批量操作功能

## 使用方法

```typescript
import { OrderCalculator } from "@/utils/classes/calculators/OrderCalculator";

// 创建计算器实例
const calculator = new OrderCalculator(orderVO);

// 计算总成本
const totalCost = calculator.getTotalPurchaseCost();

// 计算利润
const profit = calculator.getPersonalProfit();

// 获取市场报价
const marketPrice = calculator.getMarketPrice();

// 计算单斤成本
const costPerJin = calculator.getSingleCost();

// 计算供应商重量
const updatedOrder = calculator.calculateSupplierWeights();

// 获取重量统计
const weightStats = calculator.getWeightStatistics();
```

## 主要改进

### 1. 模块化设计

- 将计算逻辑按业务类型分离
- 每个模块职责单一，易于维护
- 模块间依赖关系清晰

### 2. 统一精度处理

- 通过 DecimalUtils 统一处理精度
- 避免浮点数计算误差
- 减少重复的 Decimal 操作

### 3. 业务规则集中化

- 所有业务判断逻辑集中在 BusinessRules
- 规则变更只需修改一处
- 提高代码可读性

### 4. 清晰的命名

- 方法名直观反映计算内容
- 去除 `getMelonCost1`/`getMelonCost2` 等模糊命名
- 添加详细的注释说明

### 5. 完整的类型定义

- 定义所有接口和枚举
- 提供类型安全保障
- 便于 IDE 智能提示

## 业务逻辑说明

### 成本计算

1. **西瓜采购成本**: 根据定价方式（毛重/净重）× 采购单价
2. **其他成本项**: 辅料费、人工费、纸箱费等
3. **税费补贴**: 公司返利
4. **计提税金**: 按比例计算的税费
5. **成本差异**: 调诚信志远分成的差异

### 销售计算

1. **销售金额**: 重量 × 销售单价
2. **市场报价**: 销售金额 + 包装费（可选）
3. **单斤成本**: 总成本 ÷ 总重量

### 利润计算

1. **毛利润**: 市场报价 - 基础成本
2. **净利润**: 毛利润 - 个人返点
3. **利润**: 按比例计算的分成
4. **个人利润**: 净利润 - 利润 + 成本差异

## 测试建议

每个计算模块都应该有对应的单元测试：

```typescript
// 示例：成本计算器测试
describe("CostCalculator", () => {
  let calculator: CostCalculator;
  let mockOrder: OrderVO;
  let rules: BusinessRules;

  beforeEach(() => {
    mockOrder = createMockOrder();
    rules = new BusinessRules(mockOrder);
    calculator = new CostCalculator(mockOrder, rules);
  });

  it("should calculate total costs correctly", () => {
    const result = calculator.calculateTotalCosts();
    expect(result).toBe(expectedCost);
  });
});
```

## 注意事项

1. 所有金额计算都使用 Decimal 避免精度丢失
2. 除法运算需要处理除零情况
3. 百分比计算记得除以100
4. 保持业务规则的一致性
