ControlPanelController.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use App\OrderPackageCountingRecord;
  5. use App\Owner;
  6. use App\Services\CacheService;
  7. use App\Services\CheckActiveMenuService;
  8. use App\Services\LaborReportsCountingRecordService;
  9. use App\Services\NewOrderCountingRecordService;
  10. use App\Services\RealtimePendingOrdersService;
  11. use App\Services\UserService;
  12. use App\User;
  13. use Carbon\Carbon;
  14. use Carbon\CarbonPeriod;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Cache;
  17. use Illuminate\Support\Facades\DB;
  18. class ControlPanelController extends Controller
  19. {
  20. use AsyncResponse;
  21. /**
  22. * ControlPanelController constructor.
  23. */
  24. public function __construct()
  25. {
  26. $this->middleware('auth');
  27. }
  28. public function index()
  29. {
  30. $ownerIds = $this->getCountingOwnerIds(null);
  31. $menus = app(CheckActiveMenuService::class)->activeMenus();
  32. $owners=Owner::query()->whereIn('id',$ownerIds)->get();
  33. $warehousesOrders = app(RealtimePendingOrdersService::class)->warehousesOrders();
  34. return view('control.panel', compact('owners','menus', 'warehousesOrders'));
  35. }
  36. public function orderCountingRecordsApi(Request $request)
  37. {
  38. /**
  39. * @var $orderCountingRecordService NewOrderCountingRecordService
  40. */
  41. $orderCountingRecordService = app(NewOrderCountingRecordService::class);
  42. $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
  43. $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
  44. $ownerIds=$request->owner_ids;
  45. if (!$ownerIds || in_array('all',$ownerIds)) $ownerIds = $this->getCountingOwnerIds(null);
  46. $orderCountingRecords = $orderCountingRecordService->orderCountingRecords($start, $end, $request->unit, $ownerIds);
  47. return compact('orderCountingRecords');
  48. }
  49. public function logisticsCountingRecordsApi(Request $request)
  50. {
  51. /**
  52. * @var $orderCountingRecordService NewOrderCountingRecordService
  53. */
  54. $orderCountingRecordService = app(NewOrderCountingRecordService::class);
  55. $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
  56. $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
  57. $ownerIds=$request->input('owner_ids');
  58. if (!$ownerIds || in_array('all',$ownerIds)) $ownerIds = $this->getCountingOwnerIds(null);
  59. $logisticsCountingRecords = $orderCountingRecordService->logisticsCountingRecords($start, $end, $ownerIds);
  60. return compact('logisticsCountingRecords');
  61. }
  62. public function warehouseCountingRecordsApi(Request $request)
  63. {
  64. /**
  65. * @var $orderCountingRecordService NewOrderCountingRecordService
  66. */
  67. $orderCountingRecordService = app(NewOrderCountingRecordService::class);
  68. $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
  69. $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
  70. $ownerIds = $this->getCountingOwnerIds(null);
  71. $warehouseCountingRecords = $orderCountingRecordService->warehouseCountingRecords($start, $end, $ownerIds);
  72. return compact('warehouseCountingRecords');
  73. }
  74. public function laborReportsCountingRecordApi(Request $request)
  75. {
  76. $laborReportsCountingRecordService = app(LaborReportsCountingRecordService::class);
  77. $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
  78. $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
  79. $unit = $request->unit;
  80. $laborReportsCountingRecords = $laborReportsCountingRecordService->get($start, $end, $unit);
  81. return compact('laborReportsCountingRecords');
  82. }
  83. public function laborReportsUserGroupsCountApi(Request $request)
  84. {
  85. $laborReportsCountingRecordService = app(LaborReportsCountingRecordService::class);
  86. $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
  87. $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
  88. $laborReportsUserGroupsCount = $laborReportsCountingRecordService->userGroupsCount($start, $end);
  89. return compact('laborReportsUserGroupsCount');
  90. }
  91. public function getCountingOwnerIds($ownerIds)
  92. {
  93. $user = auth()->user();
  94. /** @var UserService $userService */
  95. $userService = app('UserService');
  96. $permittingOwnerIds = $userService->getPermittingOwnerIds($user);
  97. if (!$ownerIds) {
  98. return $permittingOwnerIds;
  99. }
  100. return Cache::remember(
  101. 'PermittingOwnerIds' . '_' . auth()->user()->id . '_' . implode('_', $ownerIds),
  102. 600, function () use ($ownerIds, $permittingOwnerIds) {
  103. /** @var User $user */
  104. return array_intersect($ownerIds, $permittingOwnerIds);
  105. });
  106. }
  107. /**
  108. * 获取称重统计数据API
  109. */
  110. public function weightApi()
  111. {
  112. //转化为Carbon
  113. $start = Carbon::parse(request("start"));
  114. $end = Carbon::parse(request("end"));
  115. //定义三个数组 空间换时间 避免结果集二次转换
  116. $title = []; //标题
  117. $data = []; //核心数据,二维数组
  118. foreach (CarbonPeriod::create($start,$end) as $date){
  119. /** @var $date Carbon */
  120. $str = $date->format("Y-m-d");
  121. $data[] = $this->getTargetData($str);
  122. $title[] = $str;
  123. }
  124. //大于31天转换为月份显示
  125. if ($end->diffInDays($start) > 31){
  126. $title = [];
  127. $sign = []; //标记是否已被插入
  128. $dataTemp = []; //临时存储
  129. foreach ($data as $datum){
  130. $month = substr($datum["date"],0,7);
  131. if (!isset($sign[$month])){
  132. $dataTemp[] = ["date"=>$month,"total"=>$datum["total"],"count"=>$datum["count"],"value"=>$datum["value"]];
  133. $title[] = $month;
  134. $sign[$month] = count($dataTemp)-1;
  135. }else{
  136. $dataTemp[$sign[$month]]["total"] += $datum["total"];
  137. $dataTemp[$sign[$month]]["count"] += $datum["count"];
  138. $dataTemp[$sign[$month]]["value"] = (string)($dataTemp[$sign[$month]]["total"] ? intval(($dataTemp[$sign[$month]]["count"]/$dataTemp[$sign[$month]]["total"])*100) : 0);
  139. }
  140. }
  141. $data = $dataTemp;
  142. }
  143. $this->success(["title"=>$title,"data"=>$data]);
  144. }
  145. /**
  146. * 根据指定日期获取目标统计数据
  147. *
  148. * @param string $date
  149. * @return array|null
  150. */
  151. private function getTargetData(string $date)
  152. {
  153. if ($date == date("Y-m-d")){
  154. $sql = <<<sql
  155. SELECT DATE_FORMAT(order_packages.created_at,'%Y-%m-%d') date,
  156. SUM(CASE WHEN order_packages.weighed_at IS NOT NULL THEN 1 ELSE 0 END) AS count,
  157. COUNT(1) total FROM order_packages LEFT JOIN orders ON order_packages.order_id=orders.id WHERE orders.wms_status != '订单取消'
  158. AND order_packages.created_at >= '{$date} 00:00:00' GROUP BY date
  159. sql;
  160. $pack = DB::selectOne(DB::raw($sql));
  161. if (!$pack)return ["date"=>$date,"total"=>0,"count"=>0,"value"=>0];
  162. return ["date"=>$pack->date,"total"=>$pack->total,"count"=>$pack->count,"value"=>(string)($pack->total ? intval(($pack->count/$pack->total)*100) : 0)];
  163. }
  164. return app(CacheService::class)->getOrExecute("weight.".$date,function ()use($date){
  165. $count = OrderPackageCountingRecord::query()->where("targeted_at",$date)->first();
  166. if (!$count)return ["date"=>$date,"total"=>0,"count"=>0,"value"=>0];
  167. return ["date"=>$count->targeted_at,"total"=>$count->total_count,"count"=>$count->un_weigh_count,"value"=>(string)($count->total_count ? intval(($count->un_weigh_count/$count->total_count)*100) : 0)];
  168. },config("cache.expirations.forever"));
  169. }
  170. }