FarmDailyStatsController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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. $grid->column('total_disasters', '总灾害数')->sortable();
  78. $helper->columnCreatedAt();
  79. // 筛选器
  80. $grid->filter(function (Grid\Filter $filter) {
  81. $filter->between('stats_date', '统计日期')->date();
  82. $filter->equal('total_users', '总用户数');
  83. $filter->equal('active_users', '活跃用户数');
  84. });
  85. // 禁用创建按钮(统计数据由命令生成)
  86. $grid->disableCreateButton();
  87. // 禁用批量删除
  88. $grid->disableBatchActions();
  89. // 行操作
  90. $grid->actions(function (Grid\Displayers\Actions $actions) {
  91. $actions->disableEdit(); // 禁用编辑
  92. });
  93. });
  94. }
  95. /**
  96. * 详情页面
  97. */
  98. protected function detail($id): Show
  99. {
  100. return Show::make($id, new FarmDailyStats(), function (Show $show) {
  101. $helper = new ShowHelper($show, $this);
  102. $show->field('id', 'ID');
  103. $show->field('stats_date', '统计日期');
  104. $show->field('total_users', '总用户数');
  105. $show->field('active_users', '活跃用户数');
  106. // 房屋等级统计
  107. $show->divider('房屋等级统计');
  108. for ($level = 1; $level <= 10; $level++) {
  109. $field = "house_level_{$level}";
  110. $show->field($field, "{$level}级房屋数量");
  111. }
  112. // 土地类型统计
  113. $show->divider('土地类型统计');
  114. $landTypeNames = [
  115. 1 => '普通土地数量',
  116. 2 => '红土地数量',
  117. 3 => '黑土地数量',
  118. 4 => '金色特殊土地数量',
  119. 5 => '蓝色特殊土地数量',
  120. 6 => '紫色特殊土地数量',
  121. ];
  122. for ($type = 1; $type <= 6; $type++) {
  123. $field = "land_type_{$type}";
  124. $show->field($field, $landTypeNames[$type]);
  125. }
  126. // 土地状态统计
  127. $show->divider('土地状态统计');
  128. $landStatusNames = [
  129. 0 => '空闲土地数量',
  130. 1 => '种植中土地数量',
  131. 2 => '灾害土地数量',
  132. 3 => '可收获土地数量',
  133. 4 => '枯萎土地数量',
  134. ];
  135. for ($status = 0; $status <= 4; $status++) {
  136. $field = "land_status_{$status}";
  137. $show->field($field, $landStatusNames[$status]);
  138. }
  139. // 总计统计
  140. $show->divider('总计统计');
  141. $show->field('total_lands', '总土地数量');
  142. $show->field('total_special_lands', '特殊土地总数量');
  143. $show->field('total_crops', '总作物数量');
  144. $show->field('total_disasters', '总灾害数量');
  145. $show->field('created_at', '创建时间');
  146. $show->field('updated_at', '更新时间');
  147. });
  148. }
  149. /**
  150. * 表单页面(禁用)
  151. */
  152. protected function form(): Form
  153. {
  154. return Form::make(new FarmDailyStats(), function (Form $form) {
  155. $helper = new FormHelper($form, $this);
  156. $form->display('id', 'ID');
  157. $form->date('stats_date', '统计日期')->required();
  158. // 基础统计
  159. $form->number('total_users', '总用户数')->required();
  160. $form->number('active_users', '活跃用户数')->required();
  161. // 房屋等级统计
  162. $form->tab('房屋等级统计', function (Form $form) {
  163. for ($level = 1; $level <= 10; $level++) {
  164. $form->number("house_level_{$level}", "{$level}级房屋数量")->default(0);
  165. }
  166. });
  167. // 土地类型统计
  168. $form->tab('土地类型统计', function (Form $form) {
  169. $landTypeNames = [
  170. 1 => '普通土地数量',
  171. 2 => '红土地数量',
  172. 3 => '黑土地数量',
  173. 4 => '金色特殊土地数量',
  174. 5 => '蓝色特殊土地数量',
  175. 6 => '紫色特殊土地数量',
  176. ];
  177. for ($type = 1; $type <= 6; $type++) {
  178. $form->number("land_type_{$type}", $landTypeNames[$type])->default(0);
  179. }
  180. });
  181. // 土地状态统计
  182. $form->tab('土地状态统计', function (Form $form) {
  183. $landStatusNames = [
  184. 0 => '空闲土地数量',
  185. 1 => '种植中土地数量',
  186. 2 => '灾害土地数量',
  187. 3 => '可收获土地数量',
  188. 4 => '枯萎土地数量',
  189. ];
  190. for ($status = 0; $status <= 4; $status++) {
  191. $form->number("land_status_{$status}", $landStatusNames[$status])->default(0);
  192. }
  193. });
  194. // 总计统计
  195. $form->tab('总计统计', function (Form $form) {
  196. $form->number('total_lands', '总土地数量')->default(0);
  197. $form->number('total_special_lands', '特殊土地总数量')->default(0);
  198. $form->number('total_crops', '总作物数量')->default(0);
  199. $form->number('total_disasters', '总灾害数量')->default(0);
  200. });
  201. });
  202. }
  203. /**
  204. * 首页概览
  205. */
  206. public function index(Content $content)
  207. {
  208. return $content
  209. ->title('农场每日统计')
  210. ->description('查看农场模块的每日统计数据')
  211. ->body($this->grid())
  212. ->body($this->getStatsCards());
  213. }
  214. /**
  215. * 获取统计卡片
  216. */
  217. protected function getStatsCards()
  218. {
  219. $latestStats = FarmDailyStats::orderBy('stats_date', 'desc')->first();
  220. if (!$latestStats) {
  221. return new Alert('warning', '暂无统计数据,请先运行统计命令生成数据');
  222. }
  223. $content = "
  224. <div class='row'>
  225. <div class='col-md-3'>
  226. <div class='info-box'>
  227. <span class='info-box-icon bg-info'><i class='fa fa-calendar'></i></span>
  228. <div class='info-box-content'>
  229. <span class='info-box-text'>最新统计日期</span>
  230. <span class='info-box-number'>{$latestStats->stats_date->format('Y-m-d')}</span>
  231. </div>
  232. </div>
  233. </div>
  234. <div class='col-md-3'>
  235. <div class='info-box'>
  236. <span class='info-box-icon bg-success'><i class='fa fa-users'></i></span>
  237. <div class='info-box-content'>
  238. <span class='info-box-text'>总用户数</span>
  239. <span class='info-box-number'>{$latestStats->total_users}</span>
  240. </div>
  241. </div>
  242. </div>
  243. <div class='col-md-3'>
  244. <div class='info-box'>
  245. <span class='info-box-icon bg-warning'><i class='fa fa-user'></i></span>
  246. <div class='info-box-content'>
  247. <span class='info-box-text'>活跃用户数</span>
  248. <span class='info-box-number'>{$latestStats->active_users}</span>
  249. </div>
  250. </div>
  251. </div>
  252. <div class='col-md-3'>
  253. <div class='info-box'>
  254. <span class='info-box-icon bg-danger'><i class='fa fa-map'></i></span>
  255. <div class='info-box-content'>
  256. <span class='info-box-text'>总土地数</span>
  257. <span class='info-box-number'>{$latestStats->total_lands}</span>
  258. </div>
  259. </div>
  260. </div>
  261. </div>
  262. ";
  263. return new Card('农场统计概览', $content);
  264. }
  265. }