ReceivingTaskController.php 9.2 KB

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