OrderPackageService.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace App\Services;
  3. use App\OracleActAllocationDetails;
  4. use App\OracleDOCOrderDetail;
  5. use App\OracleDOCOrderHeader;
  6. use App\Order;
  7. use App\OrderPackage;
  8. use App\OrderPackageCommodities;
  9. use Tightenco\Collect\Support\Arr;
  10. class OrderPackageService
  11. {
  12. public function __construct()
  13. {
  14. app()->bind('orderPackageCommoditiesService', OrderPackageCommoditiesService::class);
  15. }
  16. public function createdByOrder(Order $order)
  17. {
  18. $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
  19. $actAllocationCount = OracleActAllocationDetails::where('OrderNo', $order['code'])->count();
  20. $orderHeader = OracleDOCOrderHeader::where('OrderNo', $order['code'])->first();
  21. $orderDetailCount = OracleDOCOrderDetail::where('OrderNo', $order['code'])->count();
  22. $logistic_number = null;
  23. if ($actAllocationCount == 0) { // 通过oracle Order Detail
  24. $logistic_number = $orderHeader['soreference5'];
  25. if ($orderDetailCount == 0) {return null;}
  26. if ($logistic_number == null || $logistic_number == '*') { return null; }
  27. $orderPackage = OrderPackage::create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  28. $orderPackageCommoditiesService->basedOnOracleDetailsStore($orderHeader['orderno'], $orderPackage);
  29. } else if ($actAllocationCount > 0) {
  30. $count = OracleActAllocationDetails::where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
  31. if ($count > 0) { // 快递单号为空
  32. if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') { return null; }
  33. $logistic_number = $orderHeader['soreference5'];
  34. $orderPackage = OrderPackage::create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  35. $orderPackageCommoditiesService->basedOnOracleDetailsStore($order, $orderPackage);
  36. } else {
  37. $ActAllocationDetails = OracleActAllocationDetails::where('orderno', $order['code'])->get();
  38. foreach ($ActAllocationDetails as $detail) {
  39. $logistic_number = $detail['picktotraceid'];
  40. if ($logistic_number == null || $logistic_number == '*') {
  41. $logistic_number = $orderHeader['soreference5'];
  42. if ($logistic_number == null || $logistic_number == '*') {return null;}
  43. $orderPackage = OrderPackage::where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
  44. if($orderPackage)continue;
  45. $orderPackage = OrderPackage::create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  46. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  47. continue;
  48. }
  49. $orderPackage = OrderPackage::where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
  50. if ($orderPackage) {continue;}
  51. $orderPackage = OrderPackage::create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  52. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  53. }
  54. }
  55. }else{
  56. $this->updateOrderPackageInfo($order);
  57. }
  58. return OrderPackage::with(['commodities' => function ($query) {
  59. return $query->with(['commodity']);
  60. }])->get();
  61. }
  62. public function updateOrderPackageInfo(Order $order)
  63. {
  64. $orderHeader = OracleDOCOrderHeader::where('orderNo', $order['code'])->first();
  65. if ($orderHeader['oracleBASCode_codename_c'] == $order['wam_status']) {
  66. return;
  67. }
  68. $orderPackages = OrderPackage::where('order_id', $order['id'])->get();
  69. $orderPackageCommodities = OrderPackageCommodities::with('commodity')->whereIn('order_package_id', data_get($orderPackages, '*.id'))->get();
  70. $actAllocationDetails = OracleActAllocationDetails::where('orderNo', $order['client_code'])->get();
  71. if (count($orderPackageCommodities) < count($actAllocationDetails)) {
  72. $actAllocationDetails = $actAllocationDetails->reject(function($value,$key) use (&$orderPackageCommodities){
  73. $bool = false;
  74. $count = 0;
  75. $orderPackageCommodities->reject(function($value1,$key1)use($value,&$bool,$count){
  76. if($count>0){return false;}
  77. if($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty']) ){
  78. $bool = true;
  79. $count++;
  80. return true;
  81. }else{
  82. return false;
  83. }
  84. });
  85. return $bool;
  86. });
  87. }
  88. $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
  89. $orderPackageCommoditiesService->basedOnActAllocationDetail($order, $orderHeader, $actAllocationDetails);
  90. $order['wam_status'] = $orderHeader['oracleBASCode_codename_c'];
  91. $order->save();
  92. }
  93. }