OrderPackageService.php 8.8 KB

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