ReceivingTaskController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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 Oursdreams\Export\Export;
  18. use Ramsey\Uuid\Uuid;
  19. class ReceivingTaskController extends Controller
  20. {
  21. public $service;
  22. public $ownerService;
  23. public function __construct(ReceivingTaskService $service, OwnerService $ownerService)
  24. {
  25. $this->service = $service;
  26. $this->ownerService = $ownerService;
  27. }
  28. public function index(Request $request, ReceivingTaskFilters $filter)
  29. {
  30. if (Gate::denies('入库管理-开单入库-查询')) {
  31. return redirect('/');
  32. }
  33. $receivingTasks = ReceivingTask::query()->with(['items', 'owner', 'wareHouse', 'file', 'deliveryAppointmentCar'])->filter($filter)->orderByDesc('created_at')->paginate(50);
  34. $owners = $this->ownerService->getQuery()->select('id', 'name')->get();
  35. $warehouses = Warehouse::query()->get();
  36. return view("store.receivingTasks.index", compact('receivingTasks', 'owners', 'warehouses'));
  37. }
  38. public function create()
  39. {
  40. if (Gate::denies('入库管理-开单入库-创建')) {
  41. return redirect('/');
  42. }
  43. $wareHouse = Warehouse::query()->get();
  44. $owners = $this->ownerService->getQuery()->select("id", "code", "name")->get();
  45. return view("store.receivingTasks.create", compact('wareHouse', 'owners'));
  46. }
  47. public function storeApi(ReceivingTaskRequest $request): array
  48. {
  49. if (Gate::denies('入库管理-开单入库-创建')) {
  50. return ['success' => false, 'message' => '没有对应权限'];
  51. }
  52. $appointment_number = $request->input('appointment_number', null);
  53. $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')
  54. ->where('status','!=',2)
  55. ->where('appointment_number', $appointment_number)
  56. ->orderByDesc('id')
  57. ->first();
  58. if (!$delivery_appointment_car || !$delivery_appointment_car->deliveryAppointment) {
  59. return ['success' => false, 'errors' => ['appointment_number' => ['对应预约号未找到']]];
  60. }
  61. $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
  62. $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
  63. if (count($ans_numbers) === 0 && count($request->input('asn_no',[])) == 0) {
  64. return ['success' => false, 'errors' => ['appointment_number' => ['预约号没有对应的Asn号']]];
  65. }
  66. $asn_nos = array_unique(array_merge($ans_numbers, $request->input('asn_nos') ?? []));
  67. if (count($asn_nos) == 0){
  68. return ['success' => false, 'errors' => ['appointment_number' => ['预约号没有对应的Asn号']]];
  69. }
  70. if ($delivery_appointment_car->deliveryAppointment->owner_id != $request->input('owner_id')) {
  71. return ['success' => false, 'errors' => ['appointment_number' => ['预约号与货主为必填项']]];
  72. }
  73. if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
  74. return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
  75. }
  76. try {
  77. $receiving_task = $this->service->createReceivingTask($delivery_appointment_car, $request->all());
  78. if (!$receiving_task->id) return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
  79. $receiving_task->loadMissing(['wareHouse', 'owner', 'deliveryAppointmentCar']);
  80. $this->sendPiece($request->input('owner_id'),$receiving_task->number);
  81. return ['success' => true, 'data' => $receiving_task];
  82. } catch (\Exception $e) {
  83. return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
  84. }
  85. }
  86. public function sendPiece($ownerId,$taskId){
  87. $url = config('api.java.base').config('api.java.piece.log.record');
  88. $owner = Owner::query()->where("id",$ownerId)->first();
  89. $warehouseId = $owner->warehouse_id ?? null;
  90. $request = [
  91. "user_type" => 0,
  92. "job_type" => "开单",
  93. "job_name" => "开单",
  94. "form_number" => 1,
  95. "piece_time" => date("Y-m-d H:i:s"),
  96. "message_id" => $taskId,
  97. "user_id" => Auth::user()['id'],
  98. "warehouse_id" => $warehouseId,
  99. "owner_id" => $ownerId,
  100. "item_number" => 0,
  101. ];
  102. app('LogService')->log("开单", "通知服务端", json_encode($request));
  103. $http = Http::post($url, $request);
  104. if (!$http->successful()) {
  105. app('LogService')->log("开单", "sendPiece", '发送失败:'.$http->body());
  106. return;
  107. }
  108. $result = $http->json();
  109. if ($result["code"] != 200) {
  110. app('LogService')->log("开单", "sendPiece", '服务端错误:'.$http->body());
  111. }
  112. }
  113. /**
  114. * 根据预约号获取Asn单号
  115. * @param Request $request
  116. * @return array
  117. */
  118. public function getAsnByAppointmentNumberApi(Request $request): array
  119. {
  120. $appointment_number = $request->input('appointment_number');
  121. if (!$appointment_number) {
  122. return ['success' => false, 'errors' => ['appointment_number' => '预约号不能为空']];
  123. }
  124. $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')->where('appointment_number', $appointment_number)->first();
  125. if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
  126. return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
  127. }
  128. $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
  129. $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
  130. return ['success' => true, 'data' => $ans_numbers];
  131. }
  132. public function exportExcel(Request $request, ReceivingTaskFilters $filter){
  133. ini_set ('memory_limit', '1024M');
  134. $items = ReceivingTask::query()->with(['items', 'owner', 'wareHouse', 'file', 'deliveryAppointmentCar'])->filter($filter)->orderByDesc('created_at')->paginate(50);
  135. $json = [];
  136. $row = ['收货任务号','状态','货主','ASN单号','投单时间','仓库','预约号','驾驶证号','收货类型'];
  137. foreach ($items as $item){
  138. $asnNos = [];
  139. $item->items->each(function($receivingTaskItem)use(&$asnNos){
  140. $asnNos[] = $receivingTaskItem->asn_no;
  141. });
  142. $asnNos = implode(",\r\n",$asnNos);
  143. $json[] = [
  144. $item->number,
  145. $item->status,
  146. isset($item->owner) ? $item->owner->name : '',
  147. $asnNos,
  148. isset($item->created_at) ? str_split($item->created_at, 10)[0] : '',
  149. isset($item->wareHouse) ? $item->wareHouse->name : '',
  150. isset($item->deliveryAppointmentCar) ? $item->deliveryAppointmentCar->appointment_number : '',
  151. $item->plate_number,
  152. $item->receiving_type
  153. ];
  154. }
  155. return Export::make($row, $json, "开单入库");
  156. }
  157. }