# 贷款一致性验证数据访问层实现

## 概述

本文档描述了贷款一致性验证功能的数据访问层(Mapper)实现，包括接口定义、XML映射文件和相关的数据库操作方法。

## 实现的Mapper接口

### 1. LoanConsistencyMapper

**文件位置**: `com.ruoyi.credit.mapper.LoanConsistencyMapper`
**XML文件**: `mapper/credit/LoanConsistencyMapper.xml`

#### 主要功能

- **基础CRUD操作**
  - `insertLoanConsistencyValidation`: 新增验证记录
  - `selectLoanConsistencyValidationByValidationId`: 根据ID查询验证记录
  - `updateLoanConsistencyValidation`: 更新验证记录
  - `deleteLoanConsistencyValidationByValidationId`: 删除验证记录

- **复杂查询方法**
  - `selectLatestValidationByLoanId`: 查询贷款的最新验证记录
  - `selectLatestValidationsByLoanIds`: 批量查询多个贷款的最新验证记录
  - `selectValidationsByTimeRange`: 按时间范围查询验证记录
  - `selectValidationsByStatus`: 按验证状态筛选记录
  - `selectValidationsByTimeRangeAndStatus`: 按时间范围和验证状态筛选记录

- **业务查询方法**
  - `selectPassedLoanIds`: 查询通过验证的贷款ID列表
  - `selectFailedLoanIds`: 查询失败验证的贷款ID列表
  - `selectLoansNeedRevalidation`: 查询需要重新验证的贷款记录
  - `selectValidationsByCreditId`: 根据债权凭证ID查询相关验证记录
  - `selectValidationsByServicePeriodId`: 根据服务周期ID查询相关验证记录

- **批量操作方法**
  - `batchInsertLoanConsistencyValidation`: 批量新增验证记录
  - `batchUpdateValidationResults`: 批量更新验证结果
  - `batchUpdateValidationStatus`: 批量更新验证状态

- **统计和监控方法**
  - `selectValidationCountByStatus`: 统计各状态的验证记录数量
  - `countValidationsByTimeRange`: 统计指定时间范围内的验证记录数量
  - `selectValidationsByScoreRange`: 查询验证得分在指定范围内的记录

### 2. ValidationRuleMapper

**文件位置**: `com.ruoyi.credit.mapper.ValidationRuleMapper`
**XML文件**: `mapper/credit/ValidationRuleMapper.xml`

#### 主要功能

- **基础CRUD操作**
  - `insertValidationRule`: 新增验证规则
  - `selectValidationRuleByRuleId`: 根据ID查询验证规则
  - `updateValidationRule`: 更新验证规则
  - `deleteValidationRuleByRuleId`: 删除验证规则

- **规则查询方法**
  - `selectValidationRuleByRuleName`: 根据规则名称查询
  - `selectActiveValidationRules`: 查询激活状态的规则（按优先级排序）
  - `selectValidationRulesByType`: 根据规则类型查询
  - `selectValidationRulesByStatus`: 根据规则状态查询
  - `selectValidationRulesByPriorityRange`: 根据优先级范围查询

- **规则管理方法**
  - `checkRuleNameExists`: 检查规则名称是否已存在
  - `getNextAvailablePriority`: 获取下一个可用的优先级值
  - `updateRulePriority`: 更新规则优先级
  - `batchUpdateRuleStatus`: 批量更新规则状态

- **批量操作方法**
  - `batchInsertValidationRules`: 批量新增验证规则
  - `deleteValidationRulesByStatus`: 删除指定状态的规则

## 数据库表结构

### dc_loan_consistency_validation 表
- `validation_id`: 验证记录ID (主键)
- `loan_id`: 贷款ID
- `credit_id`: 债权凭证ID
- `service_period_id`: 服务周期ID
- `validation_status`: 验证状态 (PASS/FAIL/PENDING/ERROR/TIMEOUT)
- `validation_result`: 验证结果详情
- `failure_reason`: 失败原因
- `validation_time`: 验证时间
- `validated_by`: 验证执行者
- `validation_score`: 验证得分 (0-100)
- `rule_version`: 使用的规则版本

### dc_validation_rule 表
- `rule_id`: 规则ID (主键)
- `rule_name`: 规则名称 (唯一)
- `rule_type`: 规则类型
- `rule_expression`: 规则表达式
- `priority`: 优先级
- `rule_status`: 规则状态 (ACTIVE/INACTIVE/DRAFT/DEPRECATED)
- `description`: 规则描述
- `config_json`: 规则配置JSON
- `created_by`: 创建人

## 索引优化

为了提高查询性能，创建了以下索引：

### 主要索引
- `idx_loan_id`: 贷款ID索引
- `idx_validation_status`: 验证状态索引
- `idx_validation_time`: 验证时间索引
- `idx_rule_type`: 规则类型索引
- `idx_priority`: 优先级索引

### 复合索引
- `idx_loan_status_time`: 贷款ID + 验证状态 + 验证时间
- `idx_credit_status_time`: 债权凭证ID + 验证状态 + 验证时间
- `idx_type_status_priority`: 规则类型 + 规则状态 + 优先级

## 测试覆盖

### 单元测试
- `LoanConsistencyMapperTest`: 测试贷款一致性验证Mapper的各种操作
- `ValidationRuleMapperTest`: 测试验证规则Mapper的各种操作
- `MapperConfigurationTest`: 测试Mapper配置是否正确

### 测试场景
- 基础CRUD操作测试
- 复杂查询方法测试
- 批量操作测试
- 边界条件测试
- 数据一致性测试

## 性能考虑

1. **查询优化**
   - 使用适当的索引提高查询性能
   - 复杂查询使用子查询优化
   - 批量操作减少数据库交互次数

2. **内存优化**
   - 大结果集查询使用分页
   - 避免一次性加载过多数据

3. **事务管理**
   - 批量操作使用事务确保数据一致性
   - 适当的事务隔离级别

## 使用示例

```java
// 查询通过验证的贷款ID列表
List<Long> passedLoanIds = loanConsistencyMapper.selectPassedLoanIds();

// 批量更新验证结果
loanConsistencyMapper.batchUpdateValidationResults(
    loanIds, "PASS", "验证通过", null, "system", "v1.0"
);

// 查询激活的验证规则
List<ValidationRule> activeRules = validationRuleMapper.selectActiveValidationRules();
```

## 注意事项

1. 所有时间字段使用 `datetime` 类型，确保时区一致性
2. 批量操作需要考虑数据量大小，避免超出数据库限制
3. 删除操作需要谨慎，建议使用软删除或状态标记
4. 查询条件中的字符串比较使用 `LIKE` 时注意性能影响
5. 外键关联查询需要确保相关表的数据完整性