# 项目奖金计算服务实现模板 (ProjectBonusCalImpl)

## 概述

项目奖金计算服务实现类([ProjectBonusCalImpl](file:///D:/project/aw-pbd/c-aw-gd-pbd-be/dev-c-aw-gd-pbd-service/src/main/java/com/yonyou/aw/pbd/service/impl/projectbonuscal/ProjectBonusCalImpl.java))是一个用于计算项目奖金的业务逻辑实现类。该类提供了多种与项目奖金计算相关的方法，包括单个计算、批量计算、状态更新等核心功能。

## 主要功能

1. **单个项目奖金计算**
2. **批量项目奖金计算**
3. **项目奖金状态更新**
4. **数据过滤和校验**
5. **审批流程处理**

## 核心方法说明

### 1. CalMoney - 单个项目奖金计算

```java
public ProjectBonusCalculation CalMoney(Map<String, Object> param) throws Exception
```

**功能**: 根据传入参数计算单个项目奖金

**参数**: 
- `param`: 计算所需参数Map，包含项目合同等信息

**返回值**: 
- `ProjectBonusCalculation`: 项目奖金计算结果对象

### 2. filterID - 数据过滤

```java
public List<String> filterID(Map<String, Object> param) throws Exception
```

**功能**: 过滤不需要参与计算的项目数据

**参数**: 
- `param`: 过滤条件参数

**返回值**: 
- `List<String>`: 需要排除的项目ID列表

### 3. updateAfterApprove - 审批后处理

```java
public Map<String, Object> updateAfterApprove(Map<String, Object> param)
```

**功能**: 在审批通过后执行相关操作，如推送下游数据、更新状态等

**参数**: 
- `param`: 审批相关信息

**返回值**: 
- `Map<String, Object>`: 处理结果

### 4. CalMoneyList - 批量计算奖金

```java
public Map<String, Object> CalMoneyList(Map<String, Object> param) throws Exception
```

**功能**: 批量计算项目奖金数据

**参数**: 
- `param`: 批量计算参数

**返回值**: 
- `Map<String, Object>`: 计算结果

### 5. updateStatus - 更新项目奖金状态

```java
public Map<String, Object> updateStatus(Map<String, Object> param) throws BusinessException, InstantiationException, IllegalAccessException
```

**功能**: 更新项目奖金的状态（如确认、取消确认等）

**参数**: 
- `param`: 状态更新参数

**返回值**: 
- `Map<String, Object>`: 更新结果

### 6. BatchCalMoney - 批量计算奖金包

```java
public Map<String, Object> BatchCalMoney(Map<String, Object> param) throws Exception
```

**功能**: 根据组织和周期批量计算奖金包

**参数**: 
- `param`: 批量计算参数，包含组织ID和考核周期

**返回值**: 
- `Map<String, Object>`: 批量计算结果

## 依赖组件

- `IYmsJdbcApi`: 数据库操作接口
- `IBillCommonRepository`: 单据通用仓库服务
- `IBillQueryRepository`: 单据查询仓库服务
- `ITeamEvalService`: 团队评估服务

## 使用示例

### 单个计算示例

```java
@Autowired
private IProjectBonusCal projectBonusCal;

public void calculateProjectBonus() {
    Map<String, Object> param = new HashMap<>();
    param.put("project_contract", "contract_id");
    param.put("assessment_cycle", "2023Q1");
    
    try {
        ProjectBonusCalculation result = projectBonusCal.CalMoney(param);
        // 处理计算结果
    } catch (Exception e) {
        // 异常处理
    }
}
```

### 批量计算示例

```java
@Autowired
private IProjectBonusCal projectBonusCal;

public void batchCalculateProjectBonus() {
    Map<String, Object> param = new HashMap<>();
    param.put("pk_org", "org_id");
    param.put("assessmentCycle", "2023Q1");
    
    try {
        Map<String, Object> result = projectBonusCal.BatchCalMoney(param);
        // 处理计算结果
    } catch (Exception e) {
        // 异常处理
    }
}
```

## 注意事项

1. 所有涉及资金计算的方法都使用了`BigDecimal`以确保精度
2. 方法上添加了`@Transactional`注解确保事务一致性
3. 对于重要的业务操作，添加了前置校验和后置处理
4. 使用了权限控制，确保数据安全
5. 实现了完整的异常处理机制

## 扩展建议

1. 可以根据具体业务需求调整计算公式
2. 可以增加更多的校验规则
3. 可以添加日志记录以便追踪计算过程
4. 可以增加缓存机制提高重复计算的性能