StationTaskCommodityService.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace App\Services;
  3. use App\Batch;
  4. use App\OrderCommodity;
  5. use App\StationTask;
  6. use App\StationTaskCommodity;
  7. use Illuminate\Support\Collection;
  8. use Illuminate\Support\Facades\Cache;
  9. class StationTaskCommodityService
  10. {
  11. /** @var StationService $stationService */
  12. private $stationService;
  13. /** @var StationTypeService $stationTypeService */
  14. private $stationTypeService;
  15. /** @var StationTaskService $stationTaskService */
  16. private $stationTaskService;
  17. /** @var MaterialBoxService $materialBoxService */
  18. private $materialBoxService;
  19. public function __construct(){
  20. $this->stationService=null;
  21. $this->stationTypeService=null;
  22. $this->stationTaskService=null;
  23. $this->materialBoxService=null;
  24. }
  25. function get(array $kvPairs){
  26. ksort($kvPairs);
  27. return Cache::remember('stationTaskChild_'.md5(json_encode($kvPairs)), config('cache.expirations.oftenChange'), function ()use($kvPairs) {
  28. $query = StationTaskCommodity::query();
  29. foreach ($kvPairs as $column => $value){
  30. if (is_array($value))$query->whereIn($column,$value);
  31. else $query->where($column,$value);
  32. }
  33. return $query->get();
  34. });
  35. }
  36. function createByBatches(array $batches,Collection $stationTasks_toAttach): Collection
  37. {
  38. $this->stationTaskService=app('StationTaskService');
  39. $stationTaskCommodities_listByBatch=new Collection();
  40. foreach ($batches as $batch){
  41. $stationTaskCommodities_listByBatch->push(
  42. $this->createByBatch($batch)
  43. );
  44. }
  45. $this->stationTaskService->registerSubTasks(
  46. $stationTasks_toAttach,
  47. $stationTaskCommodities_listByBatch);
  48. }
  49. function createByBatch(Batch $batch): Collection
  50. {
  51. $this->stationTypeService=app('StationTypeService');
  52. $this->stationService=app('StationService');
  53. $this->materialBoxService=app('MaterialBoxService');
  54. $stationTaskCommodities_toCreate=new Collection();
  55. $order_ids=data_get($batch['orders'],'*.id');
  56. $orderCommodities=OrderCommodity::query()->with('orderBin')->whereIn('order_id',$order_ids)->get();
  57. foreach ($orderCommodities as $orderCommodity){
  58. $stationType=$this->stationTypeService->getForCommodity();
  59. $station=$this->stationService->getStation_byType($stationType['name']);
  60. $materialBox=$this->materialBoxService->firstOrCreate(['code' => $orderCommodity['location']]);
  61. $stationTaskCommodities_toCreate->push([
  62. 'station_id'=>$station['id'],
  63. 'material_box_id'=>$materialBox['id'],
  64. 'commodity_id'=>$orderCommodity['commodity_id'],
  65. 'amount'=>$orderCommodity['amount'],
  66. 'bin_number'=>$orderCommodity['orderBin']['number']??'',
  67. 'order_id'=>$orderCommodity['order_id'],
  68. 'status'=>'待处理'
  69. ]);
  70. }
  71. $this->insert($stationTaskCommodities_toCreate->toArray());
  72. }
  73. public function insert(array $stationTaskCommodities): bool
  74. {
  75. $inserted = StationTaskCommodity::query()->insert($stationTaskCommodities);
  76. LogService::log(__METHOD__,__FUNCTION__,json_encode($stationTaskCommodities).
  77. '||'.json_encode(array_slice(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS),0,3)));
  78. return $inserted;
  79. }
  80. function markProcessing($stationTaskCommodities)
  81. {
  82. if (get_class($stationTaskCommodities)==StationTaskCommodity::class){
  83. $stationTaskCommodities = collect($stationTaskCommodities);
  84. }
  85. StationTaskCommodity::query()
  86. ->whereIn('id',data_get($stationTaskCommodities,'*.id'))
  87. ->update(['status'=>'处理中']);
  88. $this->stationTaskService
  89. ->markProcessing_byId(
  90. data_get($stationTaskCommodities, '*.station_id')
  91. );
  92. }
  93. }