土地升级条件组迁移.md 5.8 KB

土地升级条件组迁移

最后更新时间:2024年5月

1. 概述

为了提高系统的灵活性和可维护性,我们将 FarmLandUpgradeConfig 模型中的 conditions JSON 字段改为关联 Game 模块中的条件组(GameConditionGroup)。这样做的好处是:

  1. 统一了条件管理,可以在一个地方管理所有类型的条件
  2. 支持更复杂的条件组合,如同时检查多种条件
  3. 提高了代码的可维护性和可扩展性

2. 数据库变更

farm_land_upgrade_configs 表中添加了 condition_group_id 字段,用于关联 game_condition_groups 表:

ALTER TABLE `kku_farm_land_upgrade_configs` 
ADD COLUMN `condition_group_id` int(10) unsigned DEFAULT NULL COMMENT '条件组ID,关联game_condition_groups表' AFTER `consume_group_id`,
ADD INDEX `idx_condition_group_id` (`condition_group_id`);

3. 代码变更

3.1 模型变更

FarmLandUpgradeConfig 模型中添加了与条件组的关联:

/**
 * 获取关联的条件组
 *
 * @return BelongsTo
 */
public function conditionGroup(): BelongsTo
{
    return $this->belongsTo(GameConditionGroup::class, 'condition_group_id', 'id');
}

同时,添加了 getUpgradeConditionscheckUpgradeConditions 方法,用于获取升级条件和检查用户是否满足条件:

/**
 * 获取升级条件
 * 
 * 兼容旧版本,优先使用条件组,如果没有则使用 conditions 字段
 * 
 * @return array
 */
public function getUpgradeConditions(): array
{
    // 如果有关联的条件组,则使用条件组
    if ($this->condition_group_id && $this->conditionGroup) {
        return [
            'condition_group_id' => $this->condition_group_id,
            'condition_group_code' => $this->conditionGroup->code,
            'logic_type' => $this->conditionGroup->logic_type
        ];
    }
    
    // 否则使用 conditions 字段
    if (is_string($this->conditions)) {
        return json_decode($this->conditions, true) ?? [];
    }
    
    return $this->conditions ?? [];
}

/**
 * 检查用户是否满足升级条件
 * 
 * @param int $userId 用户ID
 * @return array 检查结果,包含success字段表示是否满足条件,message字段表示错误信息
 */
public function checkUpgradeConditions(int $userId): array
{
    // 如果有关联的条件组,则使用条件组检查
    if ($this->condition_group_id && $this->conditionGroup) {
        return \App\Module\Game\Services\ConditionService::checkCondition($userId, $this->condition_group_id);
    }
    
    // 否则使用旧版本的条件检查逻辑
    // ...
}

3.2 逻辑层变更

LandLogic 类中修改了 getAvailableUpgradePaths 方法,使用 getUpgradeConditionscheckUpgradeConditions 方法获取和检查条件:

// 格式化返回结果
return $availablePaths->map(function ($path) use ($userId) {
    // 获取升级所需材料
    $materials = $path->getUpgradeMaterials();
    
    // 获取升级条件
    $conditions = $path->getUpgradeConditions();
    
    // 检查条件是否满足
    $conditionCheck = $path->checkUpgradeConditions($userId);
    
    return [
        'from_type_id' => $path->from_type_id,
        'to_type_id' => $path->to_type_id,
        'to_type_name' => $path->toType->name,
        'materials' => ['materials' => $materials], // 保持与旧版本兼容的格式
        'conditions' => $conditions,
        'consume_group_id' => $path->consume_group_id,
        'condition_group_id' => $path->condition_group_id,
        'condition_check' => [
            'success' => $conditionCheck['success'],
            'message' => $conditionCheck['message']
        ]
    ];
})->values()->toArray();

3.3 控制器变更

FarmLandUpgradeConfigController 类中添加了条件组选择字段:

// 添加条件组选择
$form->select('condition_group_id', '条件组')
    ->options(function () {
        return GameConditionGroup::pluck('name', 'id')->toArray();
    })
    ->help('选择条件组后,将使用条件组中的条件项作为升级条件,而不使用 conditions 字段');

4. 数据迁移

为了将现有的 conditions 字段数据转换为条件组,我们创建了一个迁移命令:

php artisan farm:migrate-land-upgrade-conditions [--dry-run]

该命令会执行以下操作:

  1. 获取所有土地升级配置
  2. 对于每个配置,如果没有关联的条件组,则创建一个新的条件组
  3. 根据 conditions 字段中的条件创建条件项
  4. 更新土地升级配置,设置 condition_group_id 字段

使用 --dry-run 参数可以查看将要执行的操作,而不实际执行。

5. 使用方法

5.1 创建条件组

  1. 在后台管理界面中,进入"条件组管理"页面
  2. 点击"新增"按钮,填写条件组的名称、编码、描述和逻辑类型,然后保存
  3. 在条件组详情页面,可以查看和管理该条件组下的条件项

5.2 添加条件项

  1. 在后台管理界面中,进入"条件项管理"页面
  2. 点击"新增"按钮,选择所属的条件组,填写条件类型、目标ID、比较运算符、比较值等信息,然后保存
  3. 根据不同的条件类型,填写相应的参数和额外数据

5.3 关联条件组

  1. 在后台管理界面中,进入"土地升级配置管理"页面
  2. 编辑土地升级配置,选择对应的条件组,然后保存
  3. 如果没有选择条件组,系统会继续使用 conditions 字段

6. 注意事项

  1. 为了保持向后兼容性,系统会优先使用条件组,如果没有关联的条件组,则使用 conditions 字段
  2. 在迁移过程中,只会处理 conditions 字段中的常见条件,如房屋等级条件,其他特殊条件可能需要手动添加
  3. 建议在迁移前先使用 --dry-run 参数查看将要执行的操作,确保没有问题后再执行实际迁移