FarmDailyStatsController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <?php
  2. namespace App\Module\Farm\AdminControllers;
  3. use App\Module\Farm\Models\FarmDailyStats;
  4. use UCore\DcatAdmin\AdminController;
  5. use UCore\DcatAdmin\GridHelper;
  6. use UCore\DcatAdmin\ShowHelper;
  7. use UCore\DcatAdmin\FormHelper;
  8. use UCore\DcatAdmin\FilterHelper;
  9. use Dcat\Admin\Grid;
  10. use Dcat\Admin\Show;
  11. use Dcat\Admin\Form;
  12. use Dcat\Admin\Layout\Content;
  13. use Dcat\Admin\Widgets\Card;
  14. use Dcat\Admin\Widgets\Alert;
  15. use Carbon\Carbon;
  16. /**
  17. * 农场每日统计后台控制器
  18. *
  19. * @AdminController(
  20. * title="农场每日统计",
  21. * permission="farm.daily-stats",
  22. * menu_title="每日统计",
  23. * menu_parent="农场管理",
  24. * menu_order=100
  25. * )
  26. */
  27. class FarmDailyStatsController extends AdminController
  28. {
  29. /**
  30. * 列表页面
  31. */
  32. protected function grid(): Grid
  33. {
  34. return Grid::make(new FarmDailyStats(), function (Grid $grid) {
  35. $helper = new GridHelper($grid, $this);
  36. $grid->model()->orderBy('stats_date', 'desc');
  37. $grid->column('id', 'ID')->sortable();
  38. $grid->column('stats_date', '统计日期')->sortable();
  39. $grid->column('total_users', '总用户数')->sortable();
  40. $grid->column('active_users', '活跃用户数')->sortable();
  41. // 房屋等级统计(显示前5级)
  42. $grid->column('house_stats', '房屋等级统计')->display(function () {
  43. $html = '';
  44. for ($level = 1; $level <= 5; $level++) {
  45. $field = "house_level_{$level}";
  46. $count = $this->$field ?? 0;
  47. if ($count > 0) {
  48. $html .= "<div>{$level}级: {$count}个</div>";
  49. }
  50. }
  51. return $html ?: '<span class="text-muted">无数据</span>';
  52. });
  53. // 土地类型统计
  54. $grid->column('land_type_stats', '土地类型统计')->display(function () {
  55. $typeNames = [
  56. 1 => '普通',
  57. 2 => '红土',
  58. 3 => '黑土',
  59. 4 => '金土',
  60. 5 => '蓝土',
  61. 6 => '紫土',
  62. ];
  63. $html = '';
  64. for ($type = 1; $type <= 6; $type++) {
  65. $field = "land_type_{$type}";
  66. $count = $this->$field ?? 0;
  67. if ($count > 0) {
  68. $typeName = $typeNames[$type];
  69. $html .= "<div>{$typeName}: {$count}块</div>";
  70. }
  71. }
  72. return $html ?: '<span class="text-muted">无数据</span>';
  73. });
  74. $grid->column('total_lands', '总土地数')->sortable();
  75. $grid->column('total_special_lands', '特殊土地数')->sortable();
  76. $grid->column('total_crops', '总作物数')->sortable();
  77. // 作物生长阶段统计
  78. $grid->column('crop_stage_stats', '作物生长阶段统计')->display(function () {
  79. $stageNames = [
  80. 1 => '种子期',
  81. 20 => '发芽期',
  82. 30 => '生长期',
  83. 35 => '果实期',
  84. 40 => '成熟期',
  85. 50 => '枯萎期',
  86. ];
  87. $stageFields = [
  88. 1 => 'crops_seed_stage',
  89. 20 => 'crops_sprout_stage',
  90. 30 => 'crops_growth_stage',
  91. 35 => 'crops_fruit_stage',
  92. 40 => 'crops_mature_stage',
  93. 50 => 'crops_withered_stage',
  94. ];
  95. $html = '';
  96. foreach ($stageFields as $stageValue => $field) {
  97. $count = $this->$field ?? 0;
  98. if ($count > 0) {
  99. $stageName = $stageNames[$stageValue];
  100. $html .= "<div>{$stageName}: {$count}个</div>";
  101. }
  102. }
  103. return $html ?: '<span class="text-muted">无数据</span>';
  104. });
  105. $grid->column('total_disasters', '总灾害数')->sortable();
  106. $helper->columnCreatedAt();
  107. // 筛选器
  108. $grid->filter(function (Grid\Filter $filter) {
  109. $filter->between('stats_date', '统计日期')->date();
  110. $filter->equal('total_users', '总用户数');
  111. $filter->equal('active_users', '活跃用户数');
  112. });
  113. // 禁用创建按钮(统计数据由命令生成)
  114. $grid->disableCreateButton();
  115. // 禁用批量删除
  116. $grid->disableBatchActions();
  117. // 行操作
  118. $grid->actions(function (Grid\Displayers\Actions $actions) {
  119. $actions->disableEdit(); // 禁用编辑
  120. });
  121. });
  122. }
  123. /**
  124. * 详情页面
  125. */
  126. protected function detail($id): Show
  127. {
  128. return Show::make($id, new FarmDailyStats(), function (Show $show) {
  129. $helper = new ShowHelper($show, $this);
  130. $show->field('id', 'ID');
  131. $show->field('stats_date', '统计日期');
  132. $show->field('total_users', '总用户数');
  133. $show->field('active_users', '活跃用户数');
  134. // 房屋等级统计
  135. $show->divider('房屋等级统计');
  136. for ($level = 1; $level <= 10; $level++) {
  137. $field = "house_level_{$level}";
  138. $show->field($field, "{$level}级房屋数量");
  139. }
  140. // 土地类型统计
  141. $show->divider('土地类型统计');
  142. $landTypeNames = [
  143. 1 => '普通土地数量',
  144. 2 => '红土地数量',
  145. 3 => '黑土地数量',
  146. 4 => '金色特殊土地数量',
  147. 5 => '蓝色特殊土地数量',
  148. 6 => '紫色特殊土地数量',
  149. ];
  150. for ($type = 1; $type <= 6; $type++) {
  151. $field = "land_type_{$type}";
  152. $show->field($field, $landTypeNames[$type]);
  153. }
  154. // 土地状态统计
  155. $show->divider('土地状态统计');
  156. $landStatusNames = [
  157. 0 => '空闲土地数量',
  158. 1 => '种植中土地数量',
  159. 2 => '灾害土地数量',
  160. 3 => '可收获土地数量',
  161. 4 => '枯萎土地数量',
  162. ];
  163. for ($status = 0; $status <= 4; $status++) {
  164. $field = "land_status_{$status}";
  165. $show->field($field, $landStatusNames[$status]);
  166. }
  167. // 总计统计
  168. $show->divider('总计统计');
  169. $show->field('total_lands', '总土地数量');
  170. $show->field('total_special_lands', '特殊土地总数量');
  171. $show->field('total_crops', '总作物数量');
  172. $show->field('total_disasters', '总灾害数量');
  173. $show->field('created_at', '创建时间');
  174. $show->field('updated_at', '更新时间');
  175. });
  176. }
  177. /**
  178. * 表单页面(禁用)
  179. */
  180. protected function form(): Form
  181. {
  182. return Form::make(new FarmDailyStats(), function (Form $form) {
  183. $helper = new FormHelper($form, $this);
  184. $form->display('id', 'ID');
  185. $form->date('stats_date', '统计日期')->required();
  186. // 基础统计
  187. $form->number('total_users', '总用户数')->required();
  188. $form->number('active_users', '活跃用户数')->required();
  189. // 房屋等级统计
  190. $form->tab('房屋等级统计', function (Form $form) {
  191. for ($level = 1; $level <= 10; $level++) {
  192. $form->number("house_level_{$level}", "{$level}级房屋数量")->default(0);
  193. }
  194. });
  195. // 土地类型统计
  196. $form->tab('土地类型统计', function (Form $form) {
  197. $landTypeNames = [
  198. 1 => '普通土地数量',
  199. 2 => '红土地数量',
  200. 3 => '黑土地数量',
  201. 4 => '金色特殊土地数量',
  202. 5 => '蓝色特殊土地数量',
  203. 6 => '紫色特殊土地数量',
  204. ];
  205. for ($type = 1; $type <= 6; $type++) {
  206. $form->number("land_type_{$type}", $landTypeNames[$type])->default(0);
  207. }
  208. });
  209. // 土地状态统计
  210. $form->tab('土地状态统计', function (Form $form) {
  211. $landStatusNames = [
  212. 0 => '空闲土地数量',
  213. 1 => '种植中土地数量',
  214. 2 => '灾害土地数量',
  215. 3 => '可收获土地数量',
  216. 4 => '枯萎土地数量',
  217. ];
  218. for ($status = 0; $status <= 4; $status++) {
  219. $form->number("land_status_{$status}", $landStatusNames[$status])->default(0);
  220. }
  221. });
  222. // 总计统计
  223. $form->tab('总计统计', function (Form $form) {
  224. $form->number('total_lands', '总土地数量')->default(0);
  225. $form->number('total_special_lands', '特殊土地总数量')->default(0);
  226. $form->number('total_crops', '总作物数量')->default(0);
  227. $form->number('total_disasters', '总灾害数量')->default(0);
  228. });
  229. // 作物生长阶段统计
  230. $form->tab('作物生长阶段统计', function (Form $form) {
  231. $form->number('crops_seed_stage', '种子期作物数量')->default(0);
  232. $form->number('crops_sprout_stage', '发芽期作物数量')->default(0);
  233. $form->number('crops_growth_stage', '生长期作物数量')->default(0);
  234. $form->number('crops_fruit_stage', '果实期作物数量')->default(0);
  235. $form->number('crops_mature_stage', '成熟期作物数量')->default(0);
  236. $form->number('crops_withered_stage', '枯萎期作物数量')->default(0);
  237. });
  238. });
  239. }
  240. /**
  241. * 首页概览
  242. */
  243. public function index(Content $content)
  244. {
  245. return $content
  246. ->title('农场每日统计')
  247. ->description('查看农场模块的每日统计数据')
  248. ->body($this->grid())
  249. ->body($this->getStatsCards());
  250. }
  251. /**
  252. * 获取统计卡片
  253. */
  254. protected function getStatsCards()
  255. {
  256. $latestStats = FarmDailyStats::orderBy('stats_date', 'desc')->first();
  257. if (!$latestStats) {
  258. return new Alert('warning', '暂无统计数据,请先运行统计命令生成数据');
  259. }
  260. $content = "
  261. <div class='row'>
  262. <div class='col-md-3'>
  263. <div class='info-box'>
  264. <span class='info-box-icon bg-info'><i class='fa fa-calendar'></i></span>
  265. <div class='info-box-content'>
  266. <span class='info-box-text'>最新统计日期</span>
  267. <span class='info-box-number'>{$latestStats->stats_date->format('Y-m-d')}</span>
  268. </div>
  269. </div>
  270. </div>
  271. <div class='col-md-3'>
  272. <div class='info-box'>
  273. <span class='info-box-icon bg-success'><i class='fa fa-users'></i></span>
  274. <div class='info-box-content'>
  275. <span class='info-box-text'>总用户数</span>
  276. <span class='info-box-number'>{$latestStats->total_users}</span>
  277. </div>
  278. </div>
  279. </div>
  280. <div class='col-md-3'>
  281. <div class='info-box'>
  282. <span class='info-box-icon bg-warning'><i class='fa fa-user'></i></span>
  283. <div class='info-box-content'>
  284. <span class='info-box-text'>活跃用户数</span>
  285. <span class='info-box-number'>{$latestStats->active_users}</span>
  286. </div>
  287. </div>
  288. </div>
  289. <div class='col-md-3'>
  290. <div class='info-box'>
  291. <span class='info-box-icon bg-danger'><i class='fa fa-map'></i></span>
  292. <div class='info-box-content'>
  293. <span class='info-box-text'>总土地数</span>
  294. <span class='info-box-number'>{$latestStats->total_lands}</span>
  295. </div>
  296. </div>
  297. </div>
  298. </div>
  299. ";
  300. return new Card('农场统计概览', $content);
  301. }
  302. }