OrderCountingRecordService.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Services;
  3. use App\Order;
  4. use App\OrderCountingRecord;
  5. use Illuminate\Support\Facades\Cache;
  6. use App\Services\OwnerService;
  7. class OrderCountingRecordService
  8. {
  9. public function get($start, $end, $unit)
  10. {
  11. $result = collect();$emptyKeys = collect();$emptyKeys2 = collect();
  12. $ownerIds = app(OwnerService::class)->getSelectionId();
  13. if ($ownerIds->isEmpty()) {
  14. $ownerIds = [10, 35, 70];
  15. }
  16. collect($this->periodDate($start, $end))->each(function($item)use(&$ownerIds,&$result,&$emptyKeys){
  17. foreach ($ownerIds as $ownerId) {
  18. $key = 'order_counting_records_' . $item . '_' . $ownerId;
  19. $value = Cache::get($key);
  20. if (empty($value)) $emptyKeys->push( ['owner_id' => $ownerId, 'date' => $item]);
  21. else $result->push($value);
  22. }
  23. });
  24. $emptyKeys->each(function($key)use(&$emptyKeys2,&$result){
  25. $owner_id = $key['owner_id'];
  26. $date = $key['date'];
  27. $orderCountingRecords = OrderCountingRecord::query()->where('owner_id', $owner_id)->where('date_target', $date)->get();
  28. $orderCountingRecords->each(function ($item)use(&$result) {
  29. $result->push($item);
  30. });
  31. if ($orderCountingRecords->isEmpty()) {
  32. $emptyKeys2->push(['owner_id' => $owner_id, 'date' => $date]);
  33. }
  34. });
  35. $emptyKeys2->each(function($item)use(&$result){
  36. $owner_id = $item['owner_id'];
  37. $date = $item['date'];
  38. $orders = Order::query()->selectRaw('owner_id,warehouse_id,shop_id,logistic_id as logistics_id,count(1) as amounts')
  39. ->where('owner_id', $owner_id)
  40. ->where('created_at', 'like', $date . '%')
  41. ->groupBy(['owner_id', 'warehouse_id', 'shop_id', 'logistic_id'])->get();
  42. $orders->each(function($order)use(&$result,$date){
  43. $order->date = $date;
  44. $result->push(OrderCountingRecord::query()->create([
  45. 'owner_id' => $order->owner_id,
  46. 'shop_id' => $order->shop_id,
  47. 'warehouse_id' => $order->warehouse_id,
  48. 'logistics_id' => $order->logistics_id,
  49. 'date_target' => $order->date,
  50. 'counting_unit' => '日',
  51. 'amount' => $order->amounts,
  52. ]));
  53. });
  54. });
  55. return $result;
  56. }
  57. public function periodDate($start, $end)
  58. {
  59. $start_time = strtotime($start);
  60. $end_time = strtotime($end);
  61. $i = 0;
  62. $arr = [];
  63. while ($start_time <= $end_time) {
  64. $arr[$i] = date('Y-m-d', $start_time);
  65. $start_time = strtotime('+1 day', $start_time);
  66. $i++;
  67. }
  68. return $arr;
  69. }
  70. }