OrderPackageService.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. class OrderPackageService
  10. {
  11. public function __construct()
  12. {
  13. app()->bind('orderPackageCommoditiesService', OrderPackageCommoditiesService::class);
  14. }
  15. public function createdByOrder($order)
  16. {
  17. $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
  18. $actAllocationCount = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->count();
  19. $orderHeader = OracleDOCOrderHeader::query()->where('OrderNo', $order['code'])->first();
  20. $orderDetailCount = OracleDOCOrderDetail::query()->where('OrderNo', $order['code'])->count();
  21. $logistic_number = null;
  22. if ($actAllocationCount == 0) { // 通过oracle Order Detail
  23. $logistic_number = $orderHeader['soreference5'];
  24. if ($orderDetailCount == 0) {return null;}
  25. if ($logistic_number == null || $logistic_number == '*') { return null; }
  26. try {
  27. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  28. $orderPackageCommoditiesService->basedOnOracleDetailsStore($orderHeader['orderno'], $orderPackage);
  29. LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage'. json_encode($orderPackage));
  30. } catch (\Exception $e) {
  31. LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage失败'.$e->getMessage().$e->getTraceAsString());
  32. }
  33. } else if ($actAllocationCount > 0) {
  34. $count = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
  35. if ($count > 0) { // 快递单号为空
  36. if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') { return null; }
  37. $logistic_number = $orderHeader['soreference5'];
  38. try {
  39. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  40. $orderPackageCommoditiesService->basedOnOracleDetailsStore($order, $orderPackage);
  41. LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage'. json_encode($orderPackage));
  42. } catch (\Exception $e) {
  43. LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage失败'.$e->getMessage().$e->getTraceAsString());
  44. }
  45. } else {
  46. $ActAllocationDetails = OracleActAllocationDetails::query()->where('orderno', $order['code'])->get();
  47. foreach ($ActAllocationDetails as $detail) {
  48. $logistic_number = $detail['picktotraceid'];
  49. if ($logistic_number == null || $logistic_number == '*') {
  50. $logistic_number = $orderHeader['soreference5'];
  51. if ($logistic_number == null || $logistic_number == '*') {return null;}
  52. $orderPackage = OrderPackage::query()->where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
  53. if($orderPackage){continue;}
  54. try {
  55. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  56. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  57. LogService::log(__METHOD__,__FUNCTION__,'创建订单orderPackage'.json_encode($orderPackage));
  58. } catch (\Exception $e) {
  59. LogService::log(__METHOD__,__FUNCTION__,'创建订单orderPackage失败'.json_encode($e->getMessage()).json_encode($e->getTraceAsString()));
  60. }
  61. continue;
  62. }
  63. $orderPackage = OrderPackage::query()->where('order_id' , $order['id'])->where('logistic_number' , $logistic_number)->first();
  64. if ($orderPackage) {continue;}
  65. try {
  66. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  67. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  68. LogService::log(__METHOD__,__FUNCTION__,'创建订单'.json_encode($orderPackage));
  69. } catch (\Exception $e) {
  70. LogService::log(__METHOD__,__FUNCTION__,'创建订单orderPackage失败'.json_encode($e->getMessage()).json_encode($e->getTraceAsString()));
  71. }
  72. }
  73. }
  74. }else{
  75. $this->updateOrderPackageInfo($order);
  76. }
  77. return OrderPackage::with(['commodities' => function ($query) {
  78. return $query->with(['commodity']);
  79. }])->get();
  80. }
  81. public function updateOrderPackageInfo(Order $order)
  82. {
  83. $orderHeader = OracleDOCOrderHeader::where('orderNo', $order['code'])->first();
  84. if ($orderHeader['oracleBASCode_codename_c'] == $order['wam_status']) {
  85. return;
  86. }
  87. $orderPackages = OrderPackage::where('order_id', $order['id'])->get();
  88. $orderPackageCommodities = OrderPackageCommodities::with('commodity')->whereIn('order_package_id', data_get($orderPackages, '*.id'))->get();
  89. $actAllocationDetails = OracleActAllocationDetails::where('orderNo', $order['client_code'])->get();
  90. if (count($orderPackageCommodities) < count($actAllocationDetails)) {
  91. $actAllocationDetails = $actAllocationDetails->reject(function($value,$key) use (&$orderPackageCommodities){
  92. $bool = false;
  93. $count = 0;
  94. $orderPackageCommodities->reject(function($value1,$key1)use($value,&$bool,$count){
  95. if($count>0){return false;}
  96. if($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty']) ){
  97. $bool = true;
  98. $count++;
  99. return true;
  100. }else{
  101. return false;
  102. }
  103. });
  104. return $bool;
  105. });
  106. }
  107. $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
  108. $orderPackageCommoditiesService->basedOnActAllocationDetail($order, $orderHeader, $actAllocationDetails);
  109. $order['wam_status'] = $orderHeader['oracleBASCode_codename_c'];
  110. $order->save();
  111. }
  112. /**
  113. * @param string $logistic_number
  114. * @param array $values
  115. * @return OrderPackage $package
  116. */
  117. public function firstOrCreate($logistic_number, array $values){
  118. /** @var OrderPackage $package */
  119. $package = OrderPackage::query()->where('logistic_number','=',$logistic_number)->first();
  120. if ($package)return $package;
  121. /** @var OrderService */
  122. $order = app('orderService')->logisticNumberCreateOrder($logistic_number);
  123. if ($order)$values["order_id"] = $order->id;
  124. $values["logistic_number"] = $logistic_number;
  125. /** @var OrderPackage $package */
  126. $package = OrderPackage::query()->create($values);
  127. return $package;
  128. }
  129. public function createExceptionPaginate($paginate){
  130. return OrderPackage::query()->select('id','status','logistic_number','measuring_machine_id','weighed_at','weight','length','width','height','bulk','paper_box_id')
  131. ->where('status','上传异常')->orWhere('status','测量异常')->orderBy('created_at','DESC')
  132. ->paginate($paginate);
  133. }
  134. public function issueExceptionPaginate($paginate){
  135. return OrderPackage::query()->select('id','logistic_number','created_at','batch_number','batch_rule')
  136. ->where('status','下发异常')->orWhere('status','记录异常')
  137. ->orWhere('status','已上传异常')->orderBy('created_at','DESC')
  138. ->paginate($paginate);
  139. }
  140. }