ReceivingTaskController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. $this->sendOwnerPiece($request->input('owner_id'),$receiving_task->number);
  82. return ['success' => true, 'data' => $receiving_task];
  83. } catch (\Exception $e) {
  84. return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
  85. }
  86. }
  87. public function sendPiece($ownerId, $taskId)
  88. {
  89. $url = config('api.java.base') . config('api.java.piece.log.record');
  90. $owner = Owner::query()->where("id", $ownerId)->first();
  91. $warehouseId = $owner->warehouse_id ?? null;
  92. $request = [
  93. "user_type" => 0,
  94. "job_type" => "开单",
  95. "job_name" => "开单",
  96. "form_number" => 1,
  97. "piece_time" => date("Y-m-d H:i:s"),
  98. "message_id" => $taskId,
  99. "user_id" => Auth::user()['id'],
  100. "warehouse_id" => $warehouseId,
  101. "owner_id" => $ownerId,
  102. "item_number" => 0,
  103. ];
  104. app('LogService')->log("开单", "通知服务端", json_encode($request));
  105. $http = Http::post($url, $request);
  106. if (!$http->successful()) {
  107. app('LogService')->log("开单", "sendPiece", '发送失败:' . $http->body());
  108. return;
  109. }
  110. $result = $http->json();
  111. if ($result["code"] != 200) {
  112. app('LogService')->log("开单", "sendPiece", '服务端错误:' . $http->body());
  113. }
  114. }
  115. public function sendOwnerPiece($ownerId, $taskId)
  116. {
  117. $url = config('api.java.base') . config('api.java.piece.ownerLog.entry');
  118. $owner = Owner::query()->where("id", $ownerId)->first();
  119. $warehouseId = $owner->warehouse_id ?? null;
  120. $request = [
  121. "user_type" => 0,
  122. "job_type" => "开单",
  123. "job_name" => "开单",
  124. "form_number" => 1,
  125. "piece_time" => date("Y-m-d H:i:s"),
  126. "message_id" => "owner_entry" . $taskId,
  127. "form_scale" =>1,
  128. "user_id" => Auth::user()['id'],
  129. "warehouse_id" => $warehouseId,
  130. "owner_id" => $ownerId,
  131. ];
  132. app('LogService')->log("货主开单", "通知服务端", json_encode($request));
  133. $http = Http::post($url, $request);
  134. if (!$http->successful()) {
  135. app('LogService')->log("货主开单", "sendPiece", '发送失败:' . $http->body());
  136. return;
  137. }
  138. $result = $http->json();
  139. if ($result["code"] != 200) {
  140. app('LogService')->log("货主开单", "sendPiece", '服务端错误:' . $http->body());
  141. }
  142. }
  143. /**
  144. * 根据预约号获取Asn单号
  145. * @param Request $request
  146. * @return array
  147. */
  148. public function getAsnByAppointmentNumberApi(Request $request): array
  149. {
  150. $appointment_number = $request->input('appointment_number');
  151. if (!$appointment_number) {
  152. return ['success' => false, 'errors' => ['appointment_number' => '预约号不能为空']];
  153. }
  154. $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')->where('appointment_number', $appointment_number)->first();
  155. if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
  156. return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
  157. }
  158. $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
  159. $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
  160. return ['success' => true, 'data' => $ans_numbers];
  161. }
  162. public function exportExcel(Request $request, ReceivingTaskFilters $filter)
  163. {
  164. ini_set('memory_limit', '1024M');
  165. $items = ReceivingTask::query()->with(['items', 'owner', 'wareHouse', 'file', 'deliveryAppointmentCar'])->filter($filter)->orderByDesc('created_at')->paginate(50);
  166. $json = [];
  167. $row = ['收货任务号', '状态', '货主', 'ASN单号', '投单时间', '仓库', '预约号', '驾驶证号', '收货类型'];
  168. foreach ($items as $item) {
  169. $asnNos = [];
  170. $item->items->each(function ($receivingTaskItem) use (&$asnNos) {
  171. $asnNos[] = $receivingTaskItem->asn_no;
  172. });
  173. $asnNos = implode(",\r\n", $asnNos);
  174. $json[] = [
  175. $item->number,
  176. $item->status,
  177. isset($item->owner) ? $item->owner->name : '',
  178. $asnNos,
  179. isset($item->created_at) ? str_split($item->created_at, 10)[0] : '',
  180. isset($item->wareHouse) ? $item->wareHouse->name : '',
  181. isset($item->deliveryAppointmentCar) ? $item->deliveryAppointmentCar->appointment_number : '',
  182. $item->plate_number,
  183. $item->receiving_type
  184. ];
  185. }
  186. return Export::make($row, $json, "开单入库");
  187. }
  188. }