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 .= '| ' . htmlspecialchars($itemName) . ' | ';
$html .= '' . $probability . ' | ';
$html .= '' . $normalMin . '-' . $normalMax . ' | ';
$html .= '' . $disasterMin . '-' . $disasterMax . ' | ';
$html .= '' . $normalBonusMin . '-' . $normalBonusMax . ' | ';
$html .= '' . $disasterBonusMin . '-' . $disasterBonusMax . ' | ';
$html .= '
';
}
$html .= '
';
$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 .= '| ' . htmlspecialchars($seedName) . ' | ';
$html .= '' . htmlspecialchars($itemName) . ' | ';
$html .= '' . $normalMin . '-' . $normalMax . ' | ';
$html .= '' . $disasterMin . '-' . $disasterMax . ' | ';
$html .= '' . $normalBonusMin . '-' . $normalBonusMax . ' | ';
$html .= '' . $disasterBonusMin . '-' . $disasterBonusMax . ' | ';
$html .= '
';
}
$html .= '
';
$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 .= "| {$key} | {$val} |
";
}
$html .= '
';
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 .= '| ' . htmlspecialchars($typeName) . ' | ';
$html .= '' . htmlspecialchars($targetName) . ' | ';
$html .= '' . number_format($item->quantity) . ' | ';
$html .= '
';
}
$html .= '
';
$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 .= '| ' . htmlspecialchars($typeName) . ' | ';
$html .= '' . htmlspecialchars($targetName) . ' | ';
$html .= '' . htmlspecialchars($operatorName) . ' | ';
$html .= '' . number_format($item->value) . ' | ';
$html .= '
';
}
$html .= '
';
$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})";
}
}