StorageService.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Services;
  3. use App\CommodityMaterialBoxModel;
  4. use App\StationTask;
  5. use App\StationTaskMaterialBox;
  6. use App\TaskTransaction;
  7. use App\Traits\ServiceAppAop;
  8. use App\Storage;
  9. use Illuminate\Support\Collection;
  10. use Illuminate\Support\Facades\DB;
  11. class StorageService
  12. {
  13. use ServiceAppAop;
  14. protected $modelClass=Storage::class;
  15. /**
  16. * 填充缓存架
  17. *
  18. * @param \Illuminate\Database\Eloquent\Collection $stations
  19. */
  20. public function paddingCacheShelf($stations)
  21. {
  22. $collection = new Collection();
  23. $stationCollection = new Collection();
  24. $blacklist = [];
  25. foreach ($stations as $station){
  26. $box = app("MaterialBoxService")->getAnEmptyBox($blacklist);
  27. if (!$box)continue;
  28. $task = StationTask::query()->create([
  29. 'status' => "待处理",
  30. 'station_id' => $station->id,
  31. ]);
  32. $collection->add(StationTaskMaterialBox::query()->create([
  33. 'station_id' => $station->id,
  34. 'material_box_id'=>$box->id,
  35. 'status'=>"待处理",
  36. 'type' => '取',
  37. 'station_task_id' => $task->id,
  38. ]));
  39. $stationCollection->add($station->code);
  40. $blacklist[] = $box->id;
  41. }
  42. app("ForeignHaiRoboticsService")->fetchGroup_multiLocation($stationCollection,$collection,'','立架出至缓存架');
  43. }
  44. /**
  45. * 释放库位占用
  46. *
  47. * @param StationTaskMaterialBox|\stdClass $stationTaskMaterialBox
  48. */
  49. public function releaseOccupation($stationTaskMaterialBox)
  50. {
  51. if ($stationTaskMaterialBox->station->station_type_id != 5)return;
  52. $storage = Storage::query()->where("material_box_id",$stationTaskMaterialBox->material_box_id)->first();
  53. if (!$storage)return;
  54. $update = [];
  55. if ($storage->status == 1)$update["status"] = 0;
  56. if ($storage->station_id)$update["station_id"] = null;
  57. if ($update)$storage->update($update);
  58. }
  59. /**
  60. * 检查临时事务标记处理一些特殊情况
  61. *
  62. * @param StationTaskMaterialBox|\stdClass $stationTaskMaterialBox
  63. */
  64. public function checkMark($stationTaskMaterialBox)
  65. {
  66. $task = TaskTransaction::query()->where("material_box_id",$stationTaskMaterialBox->material_box_id)
  67. ->where("status",0)->first();
  68. if (!$task)return;
  69. //蓝灯闪烁
  70. if ($task->type == '入库' && $task->mark == 1)app("CacheShelfService")->stationLightUp($stationTaskMaterialBox->station->code,null,'2','2');
  71. }
  72. /**
  73. * 入库
  74. *
  75. * @param integer $stationId
  76. * @param integer $boxId
  77. * @param integer $commodityId
  78. * @param integer $amount
  79. * @param integer $modelId
  80. */
  81. public function enterWarehouse($stationId, $boxId, $commodityId, $amount, $modelId)
  82. {
  83. DB::beginTransaction();
  84. try{
  85. $storage = Storage::query()->where("material_box_id",$boxId)->lockForUpdate()->first();
  86. $obj = [
  87. "station_id" => $stationId,
  88. "material_box_id" => $boxId,
  89. "commodity_id" => $commodityId,
  90. "amount" => $amount,
  91. "status" => 1,
  92. ];
  93. if ($storage){
  94. $obj["amount"] = DB::raw("amount+{$amount}");
  95. $storage->update($obj);
  96. $amount = (int)$storage->amount + (int)$amount;
  97. } else Storage::query()->create($obj);
  98. if ($commodityId){
  99. //维护料箱最大上限 用于半箱补货
  100. $model = CommodityMaterialBoxModel::query()->select("maximum")->where("commodity_id",$commodityId)
  101. ->where("material_box_model_id",$modelId)->first();
  102. if (!$model)CommodityMaterialBoxModel::query()->create(["commodity_id"=>$commodityId,"material_box_model_id"=>$modelId,"maximum"=>$amount]);
  103. if ($model && $model->maximum < $amount)$model->update(["maximum"=>$amount]);
  104. }
  105. DB::commit();
  106. }catch(\Exception $e){
  107. DB::rollBack();
  108. }
  109. }
  110. }