|
|
@@ -0,0 +1,232 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Module\Farm\AdminControllers;
|
|
|
+
|
|
|
+use App\Module\Farm\Models\FarmCropLog;
|
|
|
+use App\Module\Farm\Repositories\FarmCropLogRepository;
|
|
|
+use UCore\DcatAdmin\AdminController;
|
|
|
+use App\Module\Farm\AdminControllers\Helper\GridHelper;
|
|
|
+use App\Module\Farm\AdminControllers\Helper\ShowHelper;
|
|
|
+use App\Module\Farm\AdminControllers\Helper\FilterHelper;
|
|
|
+use Dcat\Admin\Grid;
|
|
|
+use Dcat\Admin\Show;
|
|
|
+use Dcat\Admin\Http\Controllers\AdminController as BaseAdminController;
|
|
|
+use Dcat\Admin\Layout\Content;
|
|
|
+use Dcat\Admin\Widgets\Alert;
|
|
|
+use Spatie\RouteAttributes\Attributes\Resource;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 作物事件日志管理控制器
|
|
|
+ */
|
|
|
+#[Resource('farm-crop-logs', names: 'dcat.admin.farm-crop-logs')]
|
|
|
+class FarmCropLogController extends AdminController
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * 页面标题
|
|
|
+ *
|
|
|
+ * @var string
|
|
|
+ */
|
|
|
+ protected $title = '作物事件日志管理';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 页面描述
|
|
|
+ *
|
|
|
+ * @var string
|
|
|
+ */
|
|
|
+ protected $description = '查看作物生长过程中的各种事件记录';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建表格
|
|
|
+ *
|
|
|
+ * @return Grid
|
|
|
+ */
|
|
|
+ protected function grid()
|
|
|
+ {
|
|
|
+ return Grid::make(new FarmCropLogRepository(['crop', 'seed', 'land']), function (Grid $grid) {
|
|
|
+ $helper = new GridHelper($grid, $this);
|
|
|
+
|
|
|
+ $helper->columnId();
|
|
|
+
|
|
|
+ $grid->column('user_id', '用户ID')->sortable();
|
|
|
+
|
|
|
+ $grid->column('crop.id', '作物ID')->display(function ($value) {
|
|
|
+ return "<span class='badge badge-primary'>作物#{$value}</span>";
|
|
|
+ });
|
|
|
+
|
|
|
+ $grid->column('seed.name', '种子名称')->label('info');
|
|
|
+
|
|
|
+ $grid->column('land.id', '土地ID')->display(function ($value) {
|
|
|
+ return "<span class='badge badge-secondary'>土地#{$value}</span>";
|
|
|
+ });
|
|
|
+
|
|
|
+ $grid->column('event_type', '事件类型')->display(function ($value) {
|
|
|
+ $colors = [
|
|
|
+ FarmCropLog::EVENT_FRUIT_CONFIRMED => 'success',
|
|
|
+ FarmCropLog::EVENT_OUTPUT_CALCULATED => 'info',
|
|
|
+ FarmCropLog::EVENT_DISASTER_OCCURRED => 'danger',
|
|
|
+ FarmCropLog::EVENT_DISASTER_CLEARED => 'warning',
|
|
|
+ FarmCropLog::EVENT_HARVESTED => 'primary',
|
|
|
+ ];
|
|
|
+ $color = $colors[$value] ?? 'secondary';
|
|
|
+
|
|
|
+ $names = [
|
|
|
+ FarmCropLog::EVENT_FRUIT_CONFIRMED => '确认果实种类',
|
|
|
+ FarmCropLog::EVENT_OUTPUT_CALCULATED => '确认产出数量',
|
|
|
+ FarmCropLog::EVENT_DISASTER_OCCURRED => '灾害产生',
|
|
|
+ FarmCropLog::EVENT_DISASTER_CLEARED => '灾害清除',
|
|
|
+ FarmCropLog::EVENT_HARVESTED => '收获',
|
|
|
+ ];
|
|
|
+ $name = $names[$value] ?? '未知事件';
|
|
|
+
|
|
|
+ return "<span class='badge badge-{$color}'>{$name}</span>";
|
|
|
+ });
|
|
|
+
|
|
|
+ $grid->column('growth_stage_name', '生长阶段')->label();
|
|
|
+
|
|
|
+ $grid->column('event_data', '事件数据')->display(function ($value, $column, $model) {
|
|
|
+ if (empty($value)) {
|
|
|
+ return '<span class="text-muted">无数据</span>';
|
|
|
+ }
|
|
|
+
|
|
|
+ $summary = '';
|
|
|
+ switch ($model->event_type) {
|
|
|
+ case FarmCropLog::EVENT_FRUIT_CONFIRMED:
|
|
|
+ $summary = "果实ID: " . ($value['final_output_item_id'] ?? '未知');
|
|
|
+ break;
|
|
|
+ case FarmCropLog::EVENT_OUTPUT_CALCULATED:
|
|
|
+ $summary = "产量: " . ($value['final_amount'] ?? '未知');
|
|
|
+ break;
|
|
|
+ case FarmCropLog::EVENT_DISASTER_OCCURRED:
|
|
|
+ $summary = "灾害类型: " . ($value['disaster_type'] ?? '未知');
|
|
|
+ break;
|
|
|
+ case FarmCropLog::EVENT_DISASTER_CLEARED:
|
|
|
+ $summary = "清除灾害: " . ($value['disaster_type'] ?? '未知');
|
|
|
+ break;
|
|
|
+ case FarmCropLog::EVENT_HARVESTED:
|
|
|
+ $summary = "收获物品: " . ($value['item_id'] ?? '未知') . " x " . ($value['amount'] ?? '未知');
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ $summary = '查看详情';
|
|
|
+ }
|
|
|
+
|
|
|
+ return "<small class='text-info'>{$summary}</small>";
|
|
|
+ });
|
|
|
+
|
|
|
+ $helper->columnCreatedAt();
|
|
|
+
|
|
|
+ // 筛选器
|
|
|
+ $grid->filter(function (Grid\Filter $filter) {
|
|
|
+ $helper = new FilterHelper($filter, $this);
|
|
|
+
|
|
|
+ $filter->equal('user_id', '用户ID');
|
|
|
+ $filter->equal('crop_id', '作物ID');
|
|
|
+ $filter->equal('event_type', '事件类型')->select([
|
|
|
+ FarmCropLog::EVENT_FRUIT_CONFIRMED => '确认果实种类',
|
|
|
+ FarmCropLog::EVENT_OUTPUT_CALCULATED => '确认产出数量',
|
|
|
+ FarmCropLog::EVENT_DISASTER_OCCURRED => '灾害产生',
|
|
|
+ FarmCropLog::EVENT_DISASTER_CLEARED => '灾害清除',
|
|
|
+ FarmCropLog::EVENT_HARVESTED => '收获',
|
|
|
+ ]);
|
|
|
+ $filter->equal('growth_stage', '生长阶段')->select([
|
|
|
+ 1 => '种子期',
|
|
|
+ 2 => '发芽期',
|
|
|
+ 3 => '生长期',
|
|
|
+ 4 => '成熟期',
|
|
|
+ ]);
|
|
|
+ $helper->betweenDatetime('created_at', '事件时间');
|
|
|
+ });
|
|
|
+
|
|
|
+ // 禁用新增、编辑、删除操作(只读日志)
|
|
|
+ $grid->disableCreateButton();
|
|
|
+ $grid->disableEditButton();
|
|
|
+ $grid->disableDeleteButton();
|
|
|
+ $grid->disableBatchDelete();
|
|
|
+
|
|
|
+ // 设置默认排序
|
|
|
+ $grid->model()->orderBy('created_at', 'desc');
|
|
|
+
|
|
|
+ // 设置每页显示数量
|
|
|
+ $grid->paginate(20);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建详情页
|
|
|
+ *
|
|
|
+ * @param mixed $id
|
|
|
+ * @return Show
|
|
|
+ */
|
|
|
+ protected function detail($id)
|
|
|
+ {
|
|
|
+ return Show::make($id, new FarmCropLogRepository(['crop', 'seed', 'land']), function (Show $show) {
|
|
|
+ $helper = new ShowHelper($show, $this);
|
|
|
+
|
|
|
+ $show->field('id', 'ID');
|
|
|
+ $show->field('user_id', '用户ID');
|
|
|
+ $show->field('crop.id', '作物ID');
|
|
|
+ $show->field('seed.name', '种子名称');
|
|
|
+ $show->field('land.id', '土地ID');
|
|
|
+ $show->field('event_type_name', '事件类型');
|
|
|
+ $show->field('growth_stage_name', '生长阶段');
|
|
|
+ $show->field('land_type', '土地类型');
|
|
|
+
|
|
|
+ $show->field('event_data', '事件详细数据')->as(function ($value) {
|
|
|
+ return '<pre>' . json_encode($value, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . '</pre>';
|
|
|
+ });
|
|
|
+
|
|
|
+ $show->field('created_at', '创建时间');
|
|
|
+ $show->field('updated_at', '更新时间');
|
|
|
+
|
|
|
+ // 禁用编辑和删除按钮
|
|
|
+ $show->disableEditButton();
|
|
|
+ $show->disableDeleteButton();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重写index方法,添加统计信息
|
|
|
+ */
|
|
|
+ public function index(Content $content)
|
|
|
+ {
|
|
|
+ return $content
|
|
|
+ ->title($this->title())
|
|
|
+ ->description($this->description())
|
|
|
+ ->body($this->getStatsCards())
|
|
|
+ ->body($this->grid());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取统计卡片
|
|
|
+ */
|
|
|
+ protected function getStatsCards()
|
|
|
+ {
|
|
|
+ $stats = [
|
|
|
+ '总事件数' => FarmCropLog::count(),
|
|
|
+ '今日事件数' => FarmCropLog::whereDate('created_at', today())->count(),
|
|
|
+ '确认果实事件' => FarmCropLog::byEventType(FarmCropLog::EVENT_FRUIT_CONFIRMED)->count(),
|
|
|
+ '产出计算事件' => FarmCropLog::byEventType(FarmCropLog::EVENT_OUTPUT_CALCULATED)->count(),
|
|
|
+ '灾害产生事件' => FarmCropLog::byEventType(FarmCropLog::EVENT_DISASTER_OCCURRED)->count(),
|
|
|
+ '灾害清除事件' => FarmCropLog::byEventType(FarmCropLog::EVENT_DISASTER_CLEARED)->count(),
|
|
|
+ '收获事件' => FarmCropLog::byEventType(FarmCropLog::EVENT_HARVESTED)->count(),
|
|
|
+ ];
|
|
|
+
|
|
|
+ $cards = '';
|
|
|
+ foreach ($stats as $title => $count) {
|
|
|
+ $cards .= "
|
|
|
+ <div class='col-md-3'>
|
|
|
+ <div class='small-box bg-info'>
|
|
|
+ <div class='inner'>
|
|
|
+ <h3>{$count}</h3>
|
|
|
+ <p>{$title}</p>
|
|
|
+ </div>
|
|
|
+ <div class='icon'>
|
|
|
+ <i class='fa fa-list'></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ";
|
|
|
+ }
|
|
|
+
|
|
|
+ return "<div class='row'>{$cards}</div>";
|
|
|
+ }
|
|
|
+}
|