DataLand灾害属性处理完成说明.md 3.7 KB

DataLand 灾害属性处理完成说明

概述

本次更新完成了对 DataLand 中新增的 disasters 灾害属性的处理,实现了从数据库中的灾害信息到 Protobuf 对象的完整转换流程。

主要更新内容

1. 创建灾害转换辅助类

文件: app/Module/AppGame/Proto/DisasterConverter.php

  • 提供统一的灾害转换逻辑
  • 将 Farm 模块的灾害数组转换为 Protobuf 的 LandDisaster 对象数组
  • 处理向后兼容性,同时设置新的 disasters 属性和旧的布尔值标志

主要方法:

  • convertToLandDisasters(): 转换灾害数组为 LandDisaster 对象数组
  • setCompatibilityFlags(): 设置向后兼容的布尔值标志
  • processDisasters(): 统一处理灾害信息的设置

2. 更新转换逻辑

文件: app/Module/AppGame/Proto/LandInfoDto.php

  • 更新 toDataLand() 方法,使用新的 DisasterConverter 处理灾害信息
  • 移除重复的转换代码

文件: app/Module/AppGame/Proto/CropInfoDto.php

  • 更新 toDataLand() 方法,使用新的 DisasterConverter 处理灾害信息
  • 移除重复的转换代码

3. 改进后台显示

文件: app/Module/Game/AdminControllers/FarmUserSummaryController.php

  • 更新 formatDisasterInfo() 方法,改进灾害信息的显示
  • DisasterService 获取默认减产比例
  • 显示更详细的灾害信息,包括ID、状态等

文件: app/Module/Farm/AdminControllers/FarmLandController.php

  • 更新灾害显示逻辑,使用正确的灾害类型映射
  • 使用 DISASTER_TYPE::getName() 获取灾害名称
  • 区分活跃和已处理的灾害状态

4. 创建单元测试

文件: tests/Unit/DisasterConverterTest.php

  • 测试灾害转换器的各种功能
  • 验证转换逻辑的正确性
  • 测试边界情况和异常处理

技术细节

灾害类型映射

根据 DISASTER_TYPE 枚举:

  • 1: 干旱 (DROUGHT) -> 对应 need_watering
  • 2: 虫害 (PEST) -> 对应 need_pest_control
  • 3: 杂草 (WEED) -> 对应 need_weed

向后兼容性

为了保持向后兼容性,系统同时设置:

  1. 新属性: disasters - LandDisaster 对象数组
  2. 旧属性: need_weed, need_pest_control, need_watering - 布尔值标志

灾害状态处理

  • active: 活跃的灾害,会影响作物产量
  • inactive/其他: 已处理的灾害,不再影响作物

数据流程

FarmCrop.disasters (JSON数组)
    ↓
DisasterConverter::processDisasters()
    ↓
DataLand.disasters (LandDisaster对象数组) + 向后兼容标志
    ↓
客户端接收完整的灾害信息

使用示例

在转换代码中使用

// 处理灾害信息
DisasterConverter::processDisasters($dataLand, $cropInfoDto->disasters ?? []);

在后台显示中使用

// 格式化灾害信息显示
$disasterInfo = $this->formatDisasterInfo($crop->disasters);

测试验证

创建了完整的单元测试来验证:

  • 灾害数组到 LandDisaster 对象的转换
  • 向后兼容标志的正确设置
  • 边界情况和异常处理
  • 空数据的处理

注意事项

  1. 数据格式: 确保数据库中的灾害信息包含 typestatus 字段
  2. 状态默认值: 如果没有指定 status,默认为 active
  3. 类型验证: 只处理包含有效 type 字段的灾害记录
  4. 性能考虑: 使用统一的转换器避免代码重复,提高维护性

后续建议

  1. 监控新的灾害属性在客户端的使用情况
  2. 在确认客户端完全支持新属性后,可以考虑逐步移除旧的布尔值标志
  3. 根据实际使用情况优化灾害信息的显示格式
  4. 考虑添加更多的灾害属性,如持续时间、严重程度等