RejectedBillService.php 9.9 KB

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