|
|
@@ -0,0 +1,144 @@
|
|
|
+# Fund模块小数处理统一化
|
|
|
+
|
|
|
+**任务时间**: 2025年06月11日 15:01:52 CST
|
|
|
+**任务内容**: 移除币种数据库表的'data1'字段,将币种的精度移动到硬编码的枚举中
|
|
|
+
|
|
|
+## 1. 任务背景
|
|
|
+
|
|
|
+基于之前的梳理结果,Fund模块存在以下问题:
|
|
|
+- 币种精度配置存储在数据库的data1字段中,不够直观
|
|
|
+- 同时存在固定1000倍数处理和动态精度处理两种方式
|
|
|
+- 处理方式不统一,维护困难
|
|
|
+
|
|
|
+## 2. 实施方案
|
|
|
+
|
|
|
+### 2.1 完善币种枚举
|
|
|
+更新 `FUND_CURRENCY_TYPE` 枚举,添加:
|
|
|
+- 精度配置方法 `getPrecision()`
|
|
|
+- 币种标识获取方法 `getIdentification()`
|
|
|
+- 币种名称获取方法 `getCurrencyName()`
|
|
|
+- 静态方法 `getPrecisionById()` 和 `fromIdentification()`
|
|
|
+
|
|
|
+### 2.2 移除数据库data1字段
|
|
|
+- 执行SQL:`ALTER TABLE kku_fund_currency DROP COLUMN data1`
|
|
|
+- 更新模型文件移除data1字段引用
|
|
|
+- 更新SQL生成文件
|
|
|
+
|
|
|
+### 2.3 更新服务层
|
|
|
+- 修改 `CurrencyService::getCurrencyPrecision()` 使用枚举精度
|
|
|
+- 更新 `CurrencyDto::fromModel()` 使用枚举精度
|
|
|
+- 移除对data1字段的依赖
|
|
|
+
|
|
|
+### 2.4 移除历史遗留代码
|
|
|
+删除1000倍数处理相关代码:
|
|
|
+- `UserFundCheck1000Validator`
|
|
|
+- `DataFundCheck1000Validator`
|
|
|
+- `FundR1000CheckValidator`
|
|
|
+- `GridHelper::columnBalance1000()`
|
|
|
+- `GridHelper::columnAmount1000()`
|
|
|
+- `GridHelper::columnMoney1000()`
|
|
|
+
|
|
|
+### 2.5 统一显示格式
|
|
|
+更新 `GridHelper` 中的显示方法:
|
|
|
+- `columnBalance()` 使用基于币种精度的动态格式化
|
|
|
+- `columnAmount()` 使用基于币种精度的动态格式化
|
|
|
+
|
|
|
+## 3. 精度配置
|
|
|
+
|
|
|
+| 币种 | 标识 | 精度 | 说明 |
|
|
|
+|------|------|------|------|
|
|
|
+| 金币 | GOLD | 0 | 整数,无小数 |
|
|
|
+| 钻石 | OWG | 0 | 整数,无小数 |
|
|
|
+| 人民币 | CNY | 2 | 2位小数(分) |
|
|
|
+| 美元 | USD | 2 | 2位小数(分) |
|
|
|
+
|
|
|
+## 4. 核心代码变更
|
|
|
+
|
|
|
+### 4.1 枚举方法示例
|
|
|
+```php
|
|
|
+public function getPrecision(): int
|
|
|
+{
|
|
|
+ return match($this) {
|
|
|
+ self::JINBI => 0, // 金币:整数
|
|
|
+ self::ZUANSHI => 0, // 钻石:整数
|
|
|
+ self::CNY => 2, // 人民币:2位小数(分)
|
|
|
+ self::USD => 2, // 美元:2位小数(分)
|
|
|
+ };
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 4.2 服务层更新
|
|
|
+```php
|
|
|
+static public function getCurrencyPrecision($currency_id)
|
|
|
+{
|
|
|
+ $currency = FundCurrencyModel::find($currency_id);
|
|
|
+ if (!$currency || !$currency->type) {
|
|
|
+ return 2; // 默认精度为2
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从枚举中获取精度信息
|
|
|
+ return $currency->type->getPrecision();
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 4.3 显示格式统一
|
|
|
+```php
|
|
|
+public function columnBalance(string $field = 'balance', string $label = '余额'): Column
|
|
|
+{
|
|
|
+ return $this->grid->column($field, $label)->display(function ($value) {
|
|
|
+ // 获取币种信息并格式化金额
|
|
|
+ $currency = CurrencyService::getCurrencyByFundId($fundId);
|
|
|
+ if ($currency) {
|
|
|
+ return $currency->formatAmount($value);
|
|
|
+ }
|
|
|
+ return number_format($value, 0, '.', ',');
|
|
|
+ })->sortable();
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 5. 测试验证
|
|
|
+
|
|
|
+创建测试命令验证功能:
|
|
|
+- ✅ 枚举方法正常工作
|
|
|
+- ✅ 精度配置正确(金币/钻石:0位,人民币/美元:2位)
|
|
|
+- ✅ 金额格式化正常
|
|
|
+- ✅ 转换功能正常
|
|
|
+- ✅ 服务层方法正常
|
|
|
+
|
|
|
+## 6. 优化效果
|
|
|
+
|
|
|
+### 6.1 代码简化
|
|
|
+- 删除3个验证器类
|
|
|
+- 删除3个1000倍数处理方法
|
|
|
+- 移除数据库字段依赖
|
|
|
+- 统一处理逻辑
|
|
|
+
|
|
|
+### 6.2 维护性提升
|
|
|
+- 精度配置集中在枚举中,易于维护
|
|
|
+- 类型安全,编译时检查
|
|
|
+- 代码提示友好
|
|
|
+- 避免魔法数字
|
|
|
+
|
|
|
+### 6.3 性能优化
|
|
|
+- 减少数据库字段读取
|
|
|
+- 硬编码精度配置,无需解析JSON
|
|
|
+- 统一处理逻辑,减少重复计算
|
|
|
+
|
|
|
+## 7. 影响范围
|
|
|
+
|
|
|
+- ✅ 后台管理页面显示正常
|
|
|
+- ✅ 金额格式化功能正常
|
|
|
+- ✅ 币种精度配置生效
|
|
|
+- ✅ 服务层API兼容
|
|
|
+- ✅ 数据库结构优化
|
|
|
+
|
|
|
+## 8. 总结
|
|
|
+
|
|
|
+成功完成Fund模块小数处理的统一化:
|
|
|
+1. **移除历史遗留**:删除1000倍数处理相关代码
|
|
|
+2. **精度配置硬编码**:将精度配置从数据库移至枚举
|
|
|
+3. **统一处理机制**:全面使用基于币种精度的动态处理
|
|
|
+4. **优化数据库结构**:移除不必要的data1字段
|
|
|
+5. **提升代码质量**:类型安全、易维护、高性能
|
|
|
+
|
|
|
+Fund模块现在拥有了统一、清晰、易维护的小数处理机制。
|