RejectedBillService.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace App\Services;
  3. use App\OracleDOCOrderHeader;
  4. use App\OrderIssue;
  5. use App\RejectedBill;
  6. use App\Services\common\BatchUpdateService;
  7. use App\Services\common\DataHandlerService;
  8. use Carbon\Carbon;
  9. use App\Traits\ServiceAppAop;
  10. Class RejectedBillService
  11. {
  12. use ServiceAppAop;
  13. private function conditionQuery(array $params)
  14. {
  15. $query = RejectedBill::query();
  16. if ($params['order_number'] ?? false) {
  17. $query->whereIn('order_number', $params['order_number']);
  18. }
  19. return $query;
  20. }
  21. public function get(array $params)
  22. {
  23. return $this->conditionQuery($params)->get();
  24. }
  25. public function create(array $params)
  26. {
  27. return RejectedBill::query()->create($params);
  28. }
  29. public function syncOrderIssue($rejectedBill)
  30. {
  31. /**
  32. * @var OrderIssue $orderIssue
  33. */
  34. $orderIssue = $rejectedBill->orderIssue()->first();
  35. if (!$orderIssue && $rejectedBill['logistic_number'] === '原单退回') { // 原单退回
  36. $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($rejectedBill) {
  37. $query->where('client_code', $rejectedBill['order_number']);
  38. })->first();
  39. } else if (!$orderIssue && isset($rejectedBill->logistic_number_return)) {
  40. $orderIssue = OrderIssue::query()->with('order.packages')->whereHas('order.packages', function ($query) use ($rejectedBill) {
  41. $query->where('logistic_number', $rejectedBill->logistic_number_return);
  42. })->first();
  43. }
  44. if (!isset($orderIssue)) { // 没有对应的问题发货订单
  45. $orderHeader = OracleDOCOrderHeader::query()->where('soreference1', function ($query) use ($rejectedBill) {
  46. $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3', $rejectedBill->logistic_number_return)->first();
  47. })->first();
  48. // $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
  49. // $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
  50. // })->first();
  51. if (!isset($orderHeader)) return;
  52. $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($orderHeader) {
  53. $query->where('code', $orderHeader->orderno);
  54. })->first();
  55. }
  56. if (isset($orderIssue)) {
  57. // 更新问题件的退回单号
  58. if ($orderIssue['logistic_number_return'] != $rejectedBill['logistic_number_return'])
  59. $orderIssue->update(['logistic_number_return' => $rejectedBill['logistic_number_return']]);
  60. //确认问题件有的时候需要更新状态和提示
  61. $orderIssue->同步退单状态();
  62. $orderIssue->update(['is_new_rejecting' => '有']);
  63. app('LogService')->log(__METHOD__, __FUNCTION__, '退回单同步问题件' . json_encode($rejectedBill) . json_encode($orderIssue));
  64. }
  65. }
  66. public function syncLoadedStatusByAsnHerder($asnHerders)
  67. {
  68. $updateParams=$this->getNeedUpdateLoadedStatusByWms($asnHerders);
  69. if (!$updateParams)return;
  70. if (count($updateParams) > 1) {
  71. $this->batchUpdate($updateParams);
  72. }
  73. }
  74. public function getNeedUpdateLoadedStatusByWms($asnHerders)
  75. {
  76. if ($asnHerders->isEmpty()) return null;
  77. $updateCollect = $this->getUpdateCollect($asnHerders);
  78. if ($updateCollect->isEmpty()) return null;
  79. $logisticNumberReturn = $this->getLogisticNumberReturn($updateCollect);
  80. $rejectedBills = $this->getRejectedBills($logisticNumberReturn);
  81. if (!$rejectedBills) return null;
  82. $updateParams = [[
  83. 'logistic_number_return', 'is_loaded', 'updated_at'
  84. ]];
  85. $updated_at = Carbon::now()->toDateTimeString();
  86. /** @var DataHandlerService $dataHandlerService */
  87. $dataHandlerService = app(DataHandlerService::class);
  88. $rejectedBills_map = $dataHandlerService->dataHeader(['logistic_number_return'], $rejectedBills);
  89. foreach ($updateCollect as $data) {
  90. if (!$data->asnreference3 && !$data->notes) {
  91. continue;
  92. }
  93. $result = [];
  94. if ($data->asnreference3) {
  95. $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $data->asnreference3], $rejectedBills_map);
  96. if ($rejectedBill && $rejectedBill->is_loaded != 1) $updateParams[] = [
  97. 'logistic_number_return' => $data->asnreference3,
  98. 'is_loaded' => 1,
  99. 'updated_at' => $updated_at,
  100. ];
  101. } else {
  102. preg_match("/[a-zA-Z]{0,5}\d{6,20}/", $data->notes, $result);
  103. if (count($result)<1) continue;
  104. $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $result[0]], $rejectedBills_map);
  105. if ($rejectedBill && $rejectedBill->is_loaded != 1) $updateParams[] = [
  106. 'logistic_number_return' => $result[0],
  107. 'is_loaded' => 1,
  108. 'updated_at' => $updated_at,
  109. ];
  110. $result = [];
  111. }
  112. }
  113. return $updateParams;
  114. }
  115. public function getUpdateCollect($asnHerders)
  116. {
  117. $updateCollect = collect();
  118. foreach ($asnHerders as $asnHerder) {
  119. if ($asnHerder->asnType && $asnHerder->asnStatus &&
  120. ($asnHerder->asnType->codename_c == '退货入库' || $asnHerder->asnType->codename_c == '其他入库')
  121. && ($asnHerder->asnStatus->codename_c == '完全收货' ||$asnHerder->asnStatus->codename_c == 'ASN关闭')) {
  122. $updateCollect->add($asnHerder);
  123. }
  124. }
  125. return $updateCollect;
  126. }
  127. public function getLogisticNumberReturn($updateCollect)
  128. {
  129. $logisticNumberReturn = [];
  130. foreach ($updateCollect as $data) {
  131. if (!$data->asnreference3 && !$data->notes) {
  132. continue;
  133. }
  134. $result = [];
  135. if ($data->asnreference3) {
  136. array_push($logisticNumberReturn, $data->asnreference3);
  137. } else {
  138. preg_match("/[a-zA-Z]{0,5}\d{6,20}/", $data->notes, $result);
  139. if (count($result) > 0) array_push($logisticNumberReturn, $result[0]);
  140. $result = [];
  141. }
  142. }
  143. return $logisticNumberReturn;
  144. }
  145. public function batchUpdate($params)
  146. {
  147. return app(BatchUpdateService::class)->batchUpdate('rejected_bills', $params);
  148. }
  149. public function getRejectedBills(array $logisticNumberReturn)
  150. {
  151. if (count($logisticNumberReturn) < 1) {
  152. return null;
  153. }
  154. return RejectedBill::query()->whereIn('logistic_number_return', $logisticNumberReturn)->get();
  155. }
  156. }