ReceivingTaskController.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\DeliveryAppointmentCar;
  4. use App\Filters\ReceivingTaskFilters;
  5. use App\Http\Requests\Api\ReceivingTaskRequest;
  6. use App\Owner;
  7. use App\ReceivingTask;
  8. use App\ReceivingTaskItem;
  9. use App\Services\OwnerService;
  10. use App\Services\ReceivingTaskService;
  11. use App\Warehouse;
  12. use Illuminate\Support\Facades\Auth;
  13. use Illuminate\Support\Facades\Date;
  14. use Illuminate\Support\Facades\Gate;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Http;
  17. use Ramsey\Uuid\Uuid;
  18. class ReceivingTaskController extends Controller
  19. {
  20. public $service;
  21. public $ownerService;
  22. public function __construct(ReceivingTaskService $service, OwnerService $ownerService)
  23. {
  24. $this->service = $service;
  25. $this->ownerService = $ownerService;
  26. }
  27. public function index(Request $request, ReceivingTaskFilters $filter)
  28. {
  29. if (Gate::denies('入库管理-开单入库-查询')) {
  30. return redirect('/');
  31. }
  32. $receivingTasks = ReceivingTask::query()->with(['items', 'owner', 'wareHouse', 'file', 'deliveryAppointmentCar'])->filter($filter)->orderByDesc('created_at')->paginate(50);
  33. $owners = $this->ownerService->getQuery()->select('id', 'name')->get();
  34. $warehouses = Warehouse::query()->get();
  35. return view("store.receivingTasks.index", compact('receivingTasks', 'owners', 'warehouses'));
  36. }
  37. public function create()
  38. {
  39. if (Gate::denies('入库管理-开单入库-创建')) {
  40. return redirect('/');
  41. }
  42. $wareHouse = Warehouse::query()->get();
  43. $owners = $this->ownerService->getQuery()->select("id", "code", "name")->get();
  44. return view("store.receivingTasks.create", compact('wareHouse', 'owners'));
  45. }
  46. public function storeApi(ReceivingTaskRequest $request): array
  47. {
  48. if (Gate::denies('入库管理-开单入库-创建')) {
  49. return ['success' => false, 'message' => '没有对应权限'];
  50. }
  51. $appointment_number = $request->input('appointment_number', null);
  52. $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')
  53. ->where('status','!=',2)
  54. ->where('appointment_number', $appointment_number)
  55. ->orderByDesc('id')
  56. ->first();
  57. if (!$delivery_appointment_car || !$delivery_appointment_car->deliveryAppointment) {
  58. return ['success' => false, 'errors' => ['appointment_number' => ['对应预约号未找到']]];
  59. }
  60. $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
  61. $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
  62. if (count($ans_numbers) === 0 && count($request->input('asn_no',[])) == 0) {
  63. return ['success' => false, 'errors' => ['appointment_number' => ['预约号没有对应的Asn号']]];
  64. }
  65. $asn_nos = array_unique(array_merge($ans_numbers, $request->input('asn_nos') ?? []));
  66. if (count($asn_nos) == 0){
  67. return ['success' => false, 'errors' => ['appointment_number' => ['预约号没有对应的Asn号']]];
  68. }
  69. if ($delivery_appointment_car->deliveryAppointment->owner_id != $request->input('owner_id')) {
  70. return ['success' => false, 'errors' => ['appointment_number' => ['预约号与货主为必填项']]];
  71. }
  72. if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
  73. return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
  74. }
  75. try {
  76. $receiving_task = $this->service->createReceivingTask($delivery_appointment_car, $request->all());
  77. if (!$receiving_task->id) return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
  78. $receiving_task->loadMissing(['wareHouse', 'owner', 'deliveryAppointmentCar']);
  79. $this->sendPiece($request->input('owner_id'),$receiving_task->number);
  80. return ['success' => true, 'data' => $receiving_task];
  81. } catch (\Exception $e) {
  82. return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
  83. }
  84. }
  85. public function sendPiece($ownerId,$taskId){
  86. $url = config('api.java.base').config('api.java.piece.log.record');
  87. $owner = Owner::query()->where("id",$ownerId)->first();
  88. $warehouseId = $owner->warehouse_id ?? null;
  89. $request = [
  90. "user_type" => 0,
  91. "job_type" => "开单",
  92. "job_name" => "开单",
  93. "form_number" => 1,
  94. "piece_time" => new Date(),
  95. "message_id" => $taskId,
  96. "user_id" => Auth::user()['id'],
  97. "warehouse_id" => $warehouseId,
  98. "owner_id" => $ownerId,
  99. "item_number" => 0,
  100. ];
  101. app('LogService')->log("开单", "通知服务端", json_encode($request));
  102. $http = Http::post($url, $request);
  103. if (!$http->successful()) {
  104. app('LogService')->log("开单", "sendPiece", '发送失败:'.$http->body());
  105. return;
  106. }
  107. $result = $http->json();
  108. if ($result["code"] != 200) {
  109. app('LogService')->log("开单", "sendPiece", '服务端错误:'.$http->body());
  110. }
  111. }
  112. /**
  113. * 根据预约号获取Asn单号
  114. * @param Request $request
  115. * @return array
  116. */
  117. public function getAsnByAppointmentNumberApi(Request $request): array
  118. {
  119. $appointment_number = $request->input('appointment_number');
  120. if (!$appointment_number) {
  121. return ['success' => false, 'errors' => ['appointment_number' => '预约号不能为空']];
  122. }
  123. $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')->where('appointment_number', $appointment_number)->first();
  124. if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
  125. return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
  126. }
  127. $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
  128. $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
  129. return ['success' => true, 'data' => $ans_numbers];
  130. }
  131. }