LaborReportsCountingRecordService.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace App\Services;
  3. use App\LaborReport;
  4. use Carbon\Carbon;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Database\Eloquent\Collection;
  7. use Illuminate\Support\Facades\Cache;
  8. use Illuminate\Support\Str;
  9. use App\Traits\ServiceAppAop;
  10. class LaborReportsCountingRecordService
  11. {
  12. use ServiceAppAop;
  13. private $ttl;
  14. public function __construct(LaborReport $laborReport)
  15. {
  16. $this->ttl = config('cache.expirations.commonFrequent');
  17. $laborReport::$withoutAppends = false;
  18. }
  19. public function userGroupsCount($start, $end)
  20. {
  21. $resultByCache = Cache::remember('userGroupsCount_' . $start . '_' . $end, $this->ttl, function () use ($start, $end) {
  22. return LaborReport::query()->selectRaw('user_workgroup_id,count(user_workgroup_id) amount')
  23. ->with('userWorkgroup', 'laborReportStatus')
  24. ->whereDate('created_at', '>=', $start)
  25. ->whereDate('created_at', '<', $end)
  26. ->groupBy('user_workgroup_id')->get();
  27. });
  28. $resultByCache = $resultByCache->filter(function ($item) {
  29. return $item->amount != 0;
  30. });
  31. $result = collect();
  32. $resultByCache->each(function ($item) use (&$result) {
  33. $result->push(
  34. [
  35. 'value' => $item->amount,
  36. 'name' => $item->userWorkgroup->name ?? '未进组',
  37. 'id' => $item->userWorkgroup->id ?? 10000,
  38. ]
  39. );
  40. });
  41. return $result->sortBy('id');
  42. }
  43. /**
  44. * @param $kvPairs
  45. * @return array|Builder[]|Collection
  46. */
  47. public function get($kvPairs)
  48. {
  49. switch ($kvPairs['unit']) {
  50. case '日':
  51. $str = "'%Y-%m-%d'";
  52. break;
  53. case '月':
  54. $str = "'%Y-%m'";
  55. break;
  56. case '年':
  57. $str = "'%Y'";
  58. break;
  59. default:
  60. $str = "'%Y-%m-%d'";
  61. }
  62. $queryBuilder = LaborReport::query()
  63. ->selectRaw("DATE_FORMAT(created_at,{$str}) as date_target, count(DISTINCT enter_number ) as counter")
  64. ->whereBetween('created_at', [$kvPairs['start'], $kvPairs['end']]);
  65. if (!empty($kvPairs['userWorkgroupIds'])&&$kvPairs['userWorkgroupIds']!=='all') {
  66. $user_workgroup_ids = array_filter(preg_split('/[,, ]+/is', $kvPairs['userWorkgroupIds']));
  67. $queryBuilder->whereIn('user_workgroup_id', $user_workgroup_ids);
  68. }
  69. return $queryBuilder->groupBy('date_target')->get();
  70. }
  71. }