最后更新时间:2024年5月
为了提高系统的灵活性和可维护性,我们将 FarmLandUpgradeConfig 模型中的 conditions JSON 字段改为关联 Game 模块中的条件组(GameConditionGroup)。这样做的好处是:
在 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`);
在 FarmLandUpgradeConfig 模型中添加了与条件组的关联:
/**
* 获取关联的条件组
*
* @return BelongsTo
*/
public function conditionGroup(): BelongsTo
{
return $this->belongsTo(GameConditionGroup::class, 'condition_group_id', 'id');
}
同时,添加了 getUpgradeConditions 和 checkUpgradeConditions 方法,用于获取升级条件和检查用户是否满足条件:
/**
* 获取升级条件
*
* 兼容旧版本,优先使用条件组,如果没有则使用 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);
}
// 否则使用旧版本的条件检查逻辑
// ...
}
在 LandLogic 类中修改了 getAvailableUpgradePaths 方法,使用 getUpgradeConditions 和 checkUpgradeConditions 方法获取和检查条件:
// 格式化返回结果
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();
在 FarmLandUpgradeConfigController 类中添加了条件组选择字段:
// 添加条件组选择
$form->select('condition_group_id', '条件组')
->options(function () {
return GameConditionGroup::pluck('name', 'id')->toArray();
})
->help('选择条件组后,将使用条件组中的条件项作为升级条件,而不使用 conditions 字段');
为了将现有的 conditions 字段数据转换为条件组,我们创建了一个迁移命令:
php artisan farm:migrate-land-upgrade-conditions [--dry-run]
该命令会执行以下操作:
conditions 字段中的条件创建条件项condition_group_id 字段使用 --dry-run 参数可以查看将要执行的操作,而不实际执行。
conditions 字段conditions 字段conditions 字段中的常见条件,如房屋等级条件,其他特殊条件可能需要手动添加--dry-run 参数查看将要执行的操作,确保没有问题后再执行实际迁移