grid->column($field, $label)->display(function ($value) { return BUFF_TYPE::getName($value); }); } /** * 添加灾害类型列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnDisasterType(string $field = 'disaster_type', string $label = '灾害类型'): Column { return $this->grid->column($field, $label)->display(function ($value) { return DISASTER_TYPE::getName($value); }); } /** * 添加土地状态列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnLandStatus(string $field = 'status', string $label = '土地状态'): Column { return $this->grid->column($field, $label)->display(function ($value) { return LAND_STATUS::getName($value); })->label([ LAND_STATUS::IDLE->value => 'default', LAND_STATUS::PLANTING->value => 'primary', LAND_STATUS::DISASTER->value => 'warning', LAND_STATUS::HARVESTABLE->value => 'success', LAND_STATUS::WITHERED->value => 'danger', ]); } /** * 添加土地类型列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnLandType(string $field = 'land_type', string $label = '土地类型'): Column { return $this->grid->column($field, $label)->display(function ($value) { return LAND_TYPE::getName($value); })->label([ LAND_TYPE::NORMAL->value => 'default', LAND_TYPE::RED->value => 'danger', LAND_TYPE::BLACK->value => 'dark', LAND_TYPE::GOLD->value => 'warning', LAND_TYPE::BLUE->value => 'info', LAND_TYPE::PURPLE->value => 'primary', ]); } /** * 添加产出详情列 * * 展示该土地类型的作物种类概率和产量 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnOutputDetails(string $field = 'output_details', string $label = '产出详情'): Column { return $this->grid->column($field, $label)->display(function () { // 获取当前土地类型 $landType = $this; $html = '
'; $html .= '
' . htmlspecialchars($landType->name) . ' (产量加成:' . ($landType->output_bonus * 100) . '%)
'; // 1. 显示神秘种子的产出概率和产量 $html .= self::renderMysterySeeLOutputs($landType); // 2. 显示普通种子的产出 $html .= self::renderNormalSeeLOutputs($landType); $html .= '
'; return $html; })->width(500); } /** * 渲染神秘种子的产出详情 * * 使用服务层逻辑计算神秘种子在该土地类型上的产出概率和产量 * * @param \App\Module\Farm\Models\FarmLandType $landType * @return string */ private static function renderMysterySeeLOutputs($landType): string { // 获取神秘种子 $mysterySeeds = \App\Module\Farm\Models\FarmSeed::where('type', \App\Module\Farm\Enums\SEED_TYPE::MYSTERIOUS->value)->get(); if ($mysterySeeds->isEmpty()) { return ''; } $html = '
'; $html .= '
神秘种子产出概率
'; foreach ($mysterySeeds as $seed) { try { // 使用服务层逻辑计算概率 $mysteryLogic = new \App\Module\Farm\Logics\MysterySeeLLogic(); $adjustedOutputs = $mysteryLogic->calculateAdjustedProbabilities($seed->id, $landType->id); $html .= '
'; $html .= '' . htmlspecialchars($seed->name) . ':'; $html .= '
'; $html .= ''; $html .= ''; $html .= ''; foreach ($adjustedOutputs as $output) { // 跳过概率为0的产出 if ($output['adjusted_probability'] <= 0) { continue; } $itemName = self::getItemName($output['item_id']); $probability = number_format($output['adjusted_probability'], 2) . '%'; // 正常产量范围 $normalMin = $output['min_amount']; $normalMax = $output['max_amount']; // 灾害产量范围 - 现在从服务层获取正确的数据 $disasterMin = $output['disaster_min_amount'] ?? $output['min_amount']; $disasterMax = $output['disaster_max_amount'] ?? $output['max_amount']; // 应用土地加成后的产量 $normalBonusMin = (int)($normalMin * (1 + $landType->output_bonus)); $normalBonusMax = (int)($normalMax * (1 + $landType->output_bonus)); $disasterBonusMin = (int)($disasterMin * (1 + $landType->output_bonus)); $disasterBonusMax = (int)($disasterMax * (1 + $landType->output_bonus)); $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } $html .= '
产出物品概率正常产量灾害产量应用土地加成后(正常)应用土地加成后(灾害)
' . htmlspecialchars($itemName) . '' . $probability . '' . $normalMin . '-' . $normalMax . '' . $disasterMin . '-' . $disasterMax . '' . $normalBonusMin . '-' . $normalBonusMax . '' . $disasterBonusMin . '-' . $disasterBonusMax . '
'; $html .= '
'; $html .= '
'; } catch (\Exception $e) { $html .= '
计算神秘种子概率失败:' . htmlspecialchars($e->getMessage()) . '
'; } } $html .= '
'; return $html; } /** * 渲染普通种子的产出详情 * * @param \App\Module\Farm\Models\FarmLandType $landType * @return string */ private static function renderNormalSeeLOutputs($landType): string { // 获取普通种子的产出配置 $normalOutputs = \App\Module\Farm\Models\FarmSeedOutput::with(['seed', 'item']) ->whereHas('seed', function($query) { $query->where('type', '!=', \App\Module\Farm\Enums\SEED_TYPE::MYSTERIOUS->value); }) ->where('is_default', true) ->get(); if ($normalOutputs->isEmpty()) { return ''; } $html = '
'; $html .= '
普通种子产出
'; $html .= '
'; $html .= ''; $html .= ''; $html .= ''; foreach ($normalOutputs as $output) { $seedName = $output->seed->name ?? "种子{$output->seed_id}"; $itemName = $output->item->name ?? "物品{$output->item_id}"; // 正常产量范围 $normalMin = $output->min_amount; $normalMax = $output->max_amount; // 灾害产量范围 $disasterMin = $output->disaster_min_amount ?? $output->min_amount; $disasterMax = $output->disaster_max_amount ?? $output->max_amount; // 应用土地加成后的产量 $normalBonusMin = (int)($normalMin * (1 + $landType->output_bonus)); $normalBonusMax = (int)($normalMax * (1 + $landType->output_bonus)); $disasterBonusMin = (int)($disasterMin * (1 + $landType->output_bonus)); $disasterBonusMax = (int)($disasterMax * (1 + $landType->output_bonus)); $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } $html .= '
种子产出物品正常产量灾害产量应用土地加成后(正常)应用土地加成后(灾害)
' . htmlspecialchars($seedName) . '' . htmlspecialchars($itemName) . '' . $normalMin . '-' . $normalMax . '' . $disasterMin . '-' . $disasterMax . '' . $normalBonusMin . '-' . $normalBonusMax . '' . $disasterBonusMin . '-' . $disasterBonusMax . '
'; $html .= '
'; $html .= '
'; return $html; } /** * 获取物品名称 * * @param int $itemId * @return string */ private static function getItemName(int $itemId): string { try { $item = \App\Module\GameItems\Models\Item::find($itemId); return $item ? $item->name : "物品{$itemId}"; } catch (\Exception $e) { return "物品{$itemId}"; } } /** * 添加种子类型列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnSeedType(string $field = 'type', string $label = '种子类型'): Column { return $this->grid->column($field, $label)->display(function ($value) { return SEED_TYPE::getName($value); })->label([ SEED_TYPE::NORMAL->value => 'default', SEED_TYPE::MYSTERIOUS->value => 'primary', SEED_TYPE::GIANT->value => 'success', ]); } /** * 添加升级类型列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnUpgradeType(string $field = 'upgrade_type', string $label = '升级类型'): Column { return $this->grid->column($field, $label)->display(function ($value) { return UPGRADE_TYPE::getName($value); })->label([ UPGRADE_TYPE::LAND->value => 'primary', UPGRADE_TYPE::HOUSE->value => 'success', ]); } /** * 添加灾害情况列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnDisasters(string $field = 'disasters', string $label = '灾害情况'): Column { return $this->grid->column($field, $label)->display(function ($value) { if (empty($value)) { return '无灾害'; } $disasters = json_decode($value, true); if (empty($disasters)) { return '无灾害'; } $result = []; foreach ($disasters as $type => $time) { $disasterName = DISASTER_TYPE::getName((int)$type); $result[] = $disasterName; } return implode('
', $result); }); } /** * 添加是否施肥列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnFertilized(string $field = 'fertilized', string $label = '已施肥'): Column { return $this->grid->column($field, $label)->bool(); } /** * 添加产量加成列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnOutputBonus(string $field = 'output_bonus', string $label = '产量加成'): Column { return $this->grid->column($field, $label)->display(function ($value) { return ($value * 100) . '%'; }); } /** * 添加灾害抵抗列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnDisasterResistance(string $field = 'disaster_resistance', string $label = '灾害抵抗'): Column { return $this->grid->column($field, $label)->display(function ($value) { return ($value * 100) . '%'; }); } /** * 添加是否特殊土地列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnIsSpecial(string $field = 'is_special', string $label = '特殊土地'): Column { return $this->grid->column($field, $label)->bool(); } /** * 添加种子列 * * @param string $field 字段名 * @param string $label 标签名 * @param bool $showType 是否显示种子类型 * @return Column */ public function columnSeed(string $field = 'seed_id', string $label = '种子', bool $showType = true): Column { return $this->grid->column($field, $label)->display(function ($value) use ($showType) { if (empty($value)) { return '-'; } // 尝试获取种子名称 $seed = \App\Module\Farm\Models\FarmSeed::find($value); if ($seed) { $html = "{$seed->name}"; if ($showType) { $typeName = \App\Module\Farm\Enums\SEED_TYPE::getName($seed->type); $html .= " {$typeName}"; } // 如果有关联的物品ID,尝试获取物品名称 if ($seed->item_id) { try { $item = \App\Module\GameItems\Models\Item::find($seed->item_id); if ($item) { $html .= "
物品: {$item->name} (ID: {$item->id})"; } } catch (\Exception $e) { // 忽略异常,只是不显示物品信息 } } return $html; } return $value; }); } /** * 添加物品列 * * @param string $field 字段名 * @param string $label 标签名 * @param bool $showType 是否显示物品类型 * @return Column */ public function columnItem(string $field = 'item_id', string $label = '物品', bool $showType = true): Column { return $this->grid->column($field, $label)->display(function ($value) use ($showType) { if (empty($value)) { return '-'; } // 尝试获取物品名称 try { $item = \App\Module\GameItems\Models\Item::find($value); if ($item) { $html = "{$item->name}"; if ($showType && isset($item->type)) { try { $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type); $html .= " {$typeName}"; } catch (\Exception $e) { // 忽略异常,只是不显示类型信息 } } return $html; } } catch (\Exception $e) { // 忽略异常,只是不显示物品信息 } return $value; }); } /** * 添加模型Cast JSON列 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnModelCatsJson(string $field, string $label): Column { return $this->grid->column($field, $label)->display(function ($value) { if (empty($value)) { return '-'; } if (is_string($value)) { $value = json_decode($value, true); } elseif (is_object($value)) { $value = (array)$value; } if (!is_array($value)) { return '-'; } $html = '
'; $html .= ''; $html .= ''; foreach ($value as $key => $val) { if (is_array($val) || is_object($val)) { $val = json_encode($val, JSON_UNESCAPED_UNICODE); } $html .= ""; } $html .= '
属性
{$key}{$val}
'; return $html; }); } /** * 添加消耗组详情列 * * 展示消耗组的名称和详细内容 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnConsumeGroupDetails(string $field = 'materials', string $label = '消耗组详情'): Column { return $this->grid->column($field, $label)->display(function ($materialsGroupId) { if (!$materialsGroupId) { return '使用 materials 字段'; } $consumeGroup = \App\Module\Game\Models\GameConsumeGroup::with('consumeItems')->find($materialsGroupId); if (!$consumeGroup) { return '未知消耗组 (ID: ' . $materialsGroupId . ')'; } $html = '
'; $html .= '
' . htmlspecialchars($consumeGroup->name) . ' (' . htmlspecialchars($consumeGroup->code) . ')
'; if ($consumeGroup->consumeItems->isEmpty()) { $html .= '
暂无消耗项
'; } else { $html .= '
'; $html .= ''; $html .= ''; $html .= ''; foreach ($consumeGroup->consumeItems as $item) { $typeName = \App\Module\Game\Enums\CONSUME_TYPE::getName($item->consume_type); $targetName = $item->getTargetName(); $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } $html .= '
消耗类型目标数量
' . htmlspecialchars($typeName) . '' . htmlspecialchars($targetName) . '' . number_format($item->quantity) . '
'; $html .= '
'; } $html .= '
'; return $html; })->width(300); } /** * 添加条件组详情列 * * 展示条件组的名称和详细内容 * * @param string $field 字段名 * @param string $label 标签名 * @return Column */ public function columnConditionGroupDetails(string $field = 'conditions', string $label = '条件组详情'): Column { return $this->grid->column($field, $label)->display(function ($conditionsGroupId) { if (!$conditionsGroupId) { return '使用 conditions 字段'; } $conditionGroup = \App\Module\Game\Models\GameConditionGroup::with('conditionItems')->find($conditionsGroupId); if (!$conditionGroup) { return '未知条件组 (ID: ' . $conditionsGroupId . ')'; } $html = '
'; $html .= '
' . htmlspecialchars($conditionGroup->name) . ' (' . htmlspecialchars($conditionGroup->code) . ')
'; if ($conditionGroup->conditionItems->isEmpty()) { $html .= '
暂无条件项
'; } else { $html .= '
'; $html .= ''; $html .= ''; $html .= ''; foreach ($conditionGroup->conditionItems as $item) { $typeName = \App\Module\Game\Enums\CONDITION_TYPE::getName($item->condition_type); $targetName = \App\Module\Game\Services\ConditionTypeDescriptor::getTargetNameFromModel($item); $operatorName = self::getOperatorName($item->operator); $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } $html .= '
条件类型目标操作符要求值
' . htmlspecialchars($typeName) . '' . htmlspecialchars($targetName) . '' . htmlspecialchars($operatorName) . '' . number_format($item->value) . '
'; $html .= '
'; } $html .= '
'; return $html; })->width(300); } /** * 获取操作符名称 * * @param int $operator * @return string */ private static function getOperatorName(int $operator): string { $operators = [ 1 => '等于', 2 => '不等于', 3 => '小于', 4 => '大于等于', 5 => '小于等于', 6 => '大于', ]; return $operators[$operator] ?? "未知操作符({$operator})"; } }