ReceivingTaskController.php 9.4 KB

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