title($this->title)
->description('查看用户的农场信息汇总')
->body($this->grid());
}
/**
* 查看指定用户的农场信息汇总
*
* @param int $userId 用户ID
* @param Content $content
* @return Content
*/
#[Get('farm-user-summary/{userId}', name: 'dcat.admin.farm-user-summary.show')]
public function show($userId, Content $content)
{
// 查找用户
$user = User::find($userId);
if (!$user) {
admin_error('错误', '用户不存在');
return redirect()->route('dcat.admin.farm-user-summary');
}
return $content
->title($this->title)
->description("用户 {$user->username}(ID: {$user->id})的农场信息汇总")
->body(function (Row $row) use ($user) {
// 第一行:用户基本信息和房屋信息
$row->column(6, $this->userInfoCard($user));
$row->column(6, $this->houseInfoCard($user->id));
// 第二行:土地信息和作物信息
$row->column(12, $this->landInfoCard($user->id));
// 第三行:物品信息
$row->column(12, $this->itemInfoCard($user->id));
// 第四行:代币信息
$row->column(12, $this->fundInfoCard($user->id));
// 第五行:神像buff信息
$row->column(12, $this->buffInfoCard($user->id));
});
}
/**
* 用户基本信息卡片
*
* @param User $user 用户对象
* @return Card
*/
protected function userInfoCard(User $user)
{
$userInfo = $user->info;
$avatar = $userInfo ? $userInfo->avatar : '';
$nickname = $userInfo ? $userInfo->nickname : '';
$content = <<
用户ID:{$user->id}
用户名:{$user->username}
昵称:{$nickname}
注册时间:{$user->created_at}
HTML;
return new Card('用户基本信息', $content);
}
/**
* 房屋信息卡片
*
* @param int $userId 用户ID
* @return Card
*/
protected function houseInfoCard($userId)
{
// 获取用户的农场信息
$farmUser = FarmUser::where('user_id', $userId)->first();
if (!$farmUser) {
return new Card('房屋信息', new Alert('warning', '该用户没有农场信息'));
}
// 获取房屋配置信息
$houseConfig = FarmHouseConfig::where('level', $farmUser->house_level)->first();
$content = <<
房屋等级:{$farmUser->house_level}
最后升级时间:{$farmUser->last_upgrade_time}
产出加成:{$houseConfig->output_bonus}
特殊土地上限:{$houseConfig->special_land_limit}
可用土地数量:{$houseConfig->available_lands}
HTML;
// 如果有降级天数,显示降级信息
if ($houseConfig->downgrade_days) {
$content .= "
降级天数:{$houseConfig->downgrade_days}
";
}
$content .= <<
HTML;
return new Card('房屋信息', $content);
}
/**
* 土地信息卡片
*
* @param int $userId 用户ID
* @return Card
*/
protected function landInfoCard($userId)
{
// 获取用户的土地信息
/**
* @var FarmLand $land
*/
$lands = FarmLand::with([ 'landType', 'crop.seed' ])
->where('user_id', $userId)
->get();
if ($lands->isEmpty()) {
return new Card('土地信息', new Alert('warning', '该用户没有土地信息'));
}
// 土地类型统计
$landTypeStats = $lands->groupBy('land_type')->map->count();
// 土地状态统计
$landStatusStats = $lands->groupBy('status')->map->count();
// 创建土地类型和状态的统计表格
$statsContent = '';
// 土地类型统计
$statsContent .= '
';
$statsContent .= '
土地类型统计
';
$statsContent .= '
';
$statsContent .= '| 土地类型 | 数量 |
';
$statsContent .= '';
$landTypeNames = [
1 => '普通土地',
2 => '红土地',
3 => '黑土地',
4 => '金土地',
5 => '蓝土地',
6 => '紫土地',
];
foreach ($landTypeStats as $typeId => $count) {
$typeName = $landTypeNames[$typeId] ?? "类型{$typeId}";
$statsContent .= "| {$typeName} | {$count} |
";
}
$statsContent .= '
';
// 土地状态统计
$statsContent .= '
';
$statsContent .= '
土地状态统计
';
$statsContent .= '
';
$statsContent .= '| 土地状态 | 数量 |
';
$statsContent .= '';
$landStatusNames = [
0 => '空闲',
1 => '种植中',
2 => '灾害',
3 => '可收获',
4 => '枯萎',
];
foreach ($landStatusStats as $statusId => $count) {
$statusName = $landStatusNames[$statusId] ?? "状态{$statusId}";
$statsContent .= "| {$statusName} | {$count} |
";
}
$statsContent .= '
';
$statsContent .= '
';
// 创建土地详情表格
$headers = [ 'ID','位置', '土地类型', '状态', '种植作物', '种植时间', '生长阶段', '本阶段开始时间', '本阶段结束时间' ];
$rows = [];
foreach ($lands as $land) {
$landType = $land->landType ? $land->landType->name : "类型{$land->land_type}";
$status = $landStatusNames[$land->status] ?? "状态{$land->status}";
$crop = $land->crop;
$cropInfo = '无';
$plantTime = '';
$growthStage = '';
$stageStartTime = '';
$stageEndTime = '';
if ($crop) {
$seedName = $crop->seed ? $crop->seed->name : "种子{$crop->seed_id}";
$cropInfo = $seedName;
$plantTime = $crop->plant_time;
$growthStage = $this->getGrowthStageName($crop->growth_stage);
$stageStartTime = $crop->stage_start_time;
$stageEndTime = $crop->stage_end_time;
}
$rows[] = [
$land->id,
$land->position,
$landType,
$status,
$cropInfo,
$plantTime,
$growthStage,
$stageStartTime,
$stageEndTime,
];
}
$table = new Table($headers, $rows);
$content = $statsContent . '' . $table->render() . '
';
$content .= <<
HTML;
return new Card('土地信息', $content);
}
/**
* 获取生长阶段名称
*
* @param GROWTH_STAGE $stage 生长阶段枚举
* @return string 生长阶段名称
*/
protected function getGrowthStageName(GROWTH_STAGE $stage)
{
$stageNames = GROWTH_STAGE::getValueDescription();
$stageValue = $stage->value;
return $stageNames[$stageValue] ?? "阶段{$stageValue}";
}
/**
* 物品信息卡片
*
* @param int $userId 用户ID
* @return Card
*/
protected function itemInfoCard($userId)
{
// 获取用户的物品信息
$items = ItemUser::with('item')
->where('user_id', $userId)
->orderBy('quantity', 'desc')
->limit(20)
->get();
if ($items->isEmpty()) {
return new Card('物品信息', new Alert('warning', '该用户没有物品信息'));
}
// 创建物品表格
$headers = [ '物品ID', '物品名称', '数量', '物品类型', '过期时间' ];
$rows = [];
foreach ($items as $item) {
$itemName = $item->item ? $item->item->name : "物品{$item->item_id}";
$itemType = $item->item ? $this->getItemTypeName($item->item->type) : '';
$rows[] = [
$item->item_id,
$itemName,
$item->quantity,
$itemType,
$item->expire_at ?: '永久',
];
}
$table = new Table($headers, $rows);
// 获取用户物品总数
$totalCount = ItemUser::where('user_id', $userId)->count();
$content = <<
用户共有 {$totalCount} 种物品,下表显示数量最多的前20种物品
{$table->render()}
HTML;
return new Card('物品信息', $content);
}
/**
* 获取物品类型名称
*
* @param ITEM_TYPE $type 物品类型枚举
* @return string 物品类型名称
*/
protected function getItemTypeName(ITEM_TYPE $type)
{
$typeNames = ITEM_TYPE::getValueDescription();
$typeValue = $type->value;
return $typeNames[$typeValue] ?? "类型{$typeValue}";
}
/**
* 代币信息卡片
*
* @param int $userId 用户ID
* @return Card
*/
protected function fundInfoCard($userId)
{
// 获取用户的代币信息
$funds = FundModel::where('user_id', $userId)->get();
if ($funds->isEmpty()) {
return new Card('代币信息', new Alert('warning', '该用户没有代币信息'));
}
// 获取资金类型名称映射
$fundNames = AccountService::getFundsDesc();
// 创建代币表格
$headers = [ '账户ID', '账户名称', '余额', '更新时间' ];
$rows = [];
foreach ($funds as $fund) {
$fundName = $fundNames[$fund->fund_id->value()] ?? "账户{$fund->fund_id->value()}";
$balance = $fund->balance;
$rows[] = [
$fund->fund_id->value(),
$fundName,
$balance,
$fund->update_time ? date('Y-m-d H:i:s', $fund->update_time) : '',
];
}
$table = new Table($headers, $rows);
$content = <<render()}
HTML;
return new Card('代币信息', $content);
}
/**
* 神像buff信息卡片
*
* @param int $userId 用户ID
* @return Card
*/
protected function buffInfoCard($userId)
{
// 获取用户的神像buff信息
$buffs = FarmGodBuff::where('user_id', $userId)
->orderBy('expire_time', 'desc')
->get();
if ($buffs->isEmpty()) {
return new Card('神像加持信息', new Alert('warning', '该用户没有神像加持信息'));
}
// 创建buff表格
$headers = [ '加持类型', '过期时间', '状态' ];
$rows = [];
$buffTypeNames = [
1 => '丰收之神',
2 => '雨露之神',
3 => '屠草之神',
4 => '拭虫之神',
];
foreach ($buffs as $buff) {
$buffType = $buffTypeNames[$buff->buff_type] ?? "类型{$buff->buff_type}";
$isActive = now()->lt($buff->expire_time);
$status = $isActive ? '生效中' : '已过期';
$rows[] = [
$buffType,
$buff->expire_time,
$status,
];
}
$table = new Table($headers, $rows);
$content = $table->render();
return new Card('神像加持信息', $content);
}
/**
* 用户列表网格
*
* @return Grid
*/
protected function grid()
{
return Grid::make(User::with([ 'info', 'farmUser' ]), function (Grid $grid) {
$grid->column('id', 'ID')->sortable();
// 用户基本信息
$grid->column('username', '用户名');
$grid->column('info.nickname', '昵称');
// 农场信息
$grid->column('farmUser.house_level', '房屋等级')->sortable();
// 土地统计
$grid->column('id', '土地统计')->display(function ($userId) {
$lands = FarmLand::where('user_id', $userId)->get();
if ($lands->isEmpty()) {
return '无土地';
}
$landTypeStats = $lands->groupBy('land_type')->map->count();
$totalLands = $lands->count();
$html = "总计: {$totalLands}块土地
";
$landTypeNames = [
1 => '普通土地',
2 => '红土地',
3 => '黑土地',
4 => '金土地',
5 => '蓝土地',
6 => '紫土地',
];
foreach ($landTypeStats as $typeId => $count) {
$typeName = $landTypeNames[$typeId] ?? "类型{$typeId}";
$html .= "{$typeName}: {$count}块
";
}
return $html;
});
// 作物统计
$grid->column('id', '作物统计')->display(function ($userId) {
$crops = FarmCrop::where('user_id', $userId)->count();
return $crops > 0 ? "{$crops}种作物" : '无作物';
});
// 物品统计
$grid->column('id', '物品统计')->display(function ($userId) {
$itemCount = ItemUser::where('user_id', $userId)->count();
return $itemCount > 0 ? "{$itemCount}种物品" : '无物品';
});
// 代币统计
$grid->column('id', '代币统计')->display(function ($userId) {
$fundCount = FundModel::where('user_id', $userId)->count();
return $fundCount > 0 ? "{$fundCount}个账户" : '无账户';
});
$grid->column('created_at', '创建时间')->sortable();
// 添加查看详情操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
// 禁用默认操作按钮
$actions->disableDelete();
$actions->disableEdit();
$actions->disableQuickEdit();
// 修改查看按钮,使其打开详情页
$actions->append('查看详情');
});
// 禁用创建按钮
$grid->disableCreateButton();
// 禁用批量操作
$grid->disableBatchActions();
// 添加搜索
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id', '用户ID');
$filter->like('username', '用户名');
$filter->like('info.nickname', '昵称');
$filter->equal('farmUser.house_level', '房屋等级');
});
});
}
}