OrderPackageService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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 App\OrderTracking;
  10. use App\Services\common\BatchUpdateService;
  11. use App\Services\common\DataHandlerService;
  12. use Carbon\Carbon;
  13. use App\Traits\ServiceAppAop;
  14. class OrderPackageService
  15. {
  16. use ServiceAppAop;
  17. protected $modelClass=OrderPackage::class;
  18. public function batchUpdate(array $params){
  19. return app(BatchUpdateService::class)->batchUpdate('order_packages',$params);
  20. }
  21. /**
  22. * @param string $logistic_number
  23. * @param array $values
  24. * @return OrderPackage $package
  25. */
  26. public function firstOrCreate($logistic_number, array $values){
  27. /** @var $package OrderPackage */
  28. $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
  29. if ($package)return $package;
  30. /** @var OrderService */
  31. $order = app('OrderService')->logisticNumberFirstOrCreateOrder($logistic_number);
  32. if ($order) $values["order_id"] = $order->id;
  33. $values["logistic_number"] = $logistic_number;
  34. /** @var OrderPackage $package */
  35. $package = OrderPackage::query()->create($values);
  36. return $package;
  37. }
  38. public function createExceptionPaginate($paginate)
  39. {
  40. return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id')
  41. ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC')
  42. ->paginate($paginate);
  43. }
  44. public function issueExceptionPaginate($paginate)
  45. {
  46. return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule')
  47. ->where('status', '下发异常')->orWhere('status', '记录异常')
  48. ->orWhere('uploaded_to_wms', '异常')->orderBy('created_at', 'DESC')
  49. ->paginate($paginate);
  50. }
  51. public function getByWmsOrders($orderHeaders){
  52. $order_nos = data_get($orderHeaders,'*.orderno');
  53. return OrderPackage::query()->with('order')
  54. ->whereIn('order_id',function($query) use ($order_nos){
  55. $query->from('orders')->select('id')->whereIn('code',$order_nos);
  56. })->get();
  57. }
  58. public function create(array $params)
  59. {
  60. if(count($params) == 0)return null;
  61. try {
  62. $this->insert($params);
  63. app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params));
  64. } catch (\Exception $e) {
  65. app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
  66. } finally {
  67. $logistic_numbers = data_get($params,'*.logistic_number');
  68. unset($params);
  69. return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get();
  70. }
  71. }
  72. public function getByOrderNos($orderNos)
  73. {
  74. return OrderPackage::query()->with('order')
  75. ->whereIn('order_id',function($query)use($orderNos){
  76. $query->from('orders')->select('id')->whereIn('code',$orderNos);
  77. })->get();
  78. }
  79. public function update($orderClientNo,$logisticNumber)
  80. {
  81. $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first();
  82. if(!$order){
  83. $order = Order::query()->create(['client_code'=>$orderClientNo]);
  84. }
  85. $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first();
  86. if($orderPackage){return compact('orderPackage','order');}
  87. $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
  88. return compact('orderPackage','order');
  89. }
  90. public function syncOrderPackage(&$orderHeaders)
  91. {
  92. $this->syncPackageByOrderHeaders($orderHeaders);
  93. }
  94. public function syncPackageByOrderHeaders(&$orderHeaders)
  95. {
  96. /** @var OrderService $orderService */
  97. $orderService = app('OrderService');
  98. if(!$orderHeaders)return;
  99. $orders = $orderService->getByWmsOrders($orderHeaders);
  100. $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno')); // 已有
  101. $this->createOrderPackage($orderHeaders,$orders,$packages); // 创建package
  102. $this->updatePackage($orderHeaders,$packages);
  103. $this->deleteUnnecessaryPackage($orderHeaders,$packages); // 删除package
  104. unset($orders,$packages); // 手动清除
  105. }
  106. public function createOrderPackage($orderHeaders,$orders,$packages)
  107. {
  108. if(!$orderHeaders)return;
  109. /**
  110. * @var DataHandlerService $dataHandlerService
  111. */
  112. $dataHandlerService = app(DataHandlerService::class);
  113. $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
  114. $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
  115. $inner_params = [];
  116. foreach ($orders as $order){
  117. $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeaders_map);
  118. if(!$orderHeader)continue;
  119. if($orderHeader->sotatus == 90)continue;
  120. $params = $this->getInnerParams($orderHeader,$order,$packages_maps);
  121. $inner_params = array_merge($inner_params,$params);
  122. }
  123. if(count($inner_params)>0){
  124. try {
  125. $inner_array = array_chunk($inner_params,5000);
  126. foreach ($inner_array as $params) {
  127. $bool = $this->insert($params);
  128. $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;
  129. }
  130. } catch (\Exception $e) {
  131. LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' .json_encode($e->getMessage()). json_encode($inner_params).json_encode($e->getTraceAsString()));
  132. }
  133. }
  134. }
  135. public function getInnerParams($orderHeader,$order,$packages_maps)
  136. {
  137. /**
  138. * @var DataHandlerService $dataHandlerService
  139. */
  140. $dataHandlerService = app('DataHandlerService');
  141. $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']);
  142. $inner_params = [];
  143. if($orderHeader['sostatus'] == '90'){
  144. if($orderHeader['soreference5']=='')$logistic_numbers = [$orderHeader['orderno']];
  145. else $logistic_numbers = [$orderHeader['soreference5']];
  146. }
  147. $date = Carbon::now()->format('Y-m-d H:i:s');
  148. $sentAtMap = [];
  149. foreach ($orderHeader->actAllocationDetails as $item){
  150. $sentAtMap[$item->picktotraceid] = $item;
  151. }
  152. foreach ($logistic_numbers as $logistic_number){
  153. $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps);
  154. if(isset($package))continue;
  155. try {
  156. $data = $sentAtMap[$logistic_number];
  157. } catch (\Exception $e) {
  158. $data = null;
  159. }
  160. $inner_params[] = [
  161. 'order_id' => $order->id,
  162. 'logistic_number' => $logistic_number,
  163. 'created_at' => $date,
  164. 'updated_at' => $date,
  165. 'status' => '无',
  166. 'owner_id' => $order->owner_id,
  167. 'sent_at' => $data ? $data->checktime:null,
  168. ];
  169. }
  170. return $inner_params;
  171. }
  172. public function deleteUnnecessaryPackage($orderHeaders,$packages)
  173. {
  174. /**
  175. * @var DataHandlerService $dataHandlerService
  176. * @var OrderTrackingService $orderTrackingService
  177. * @var OrderPackageCommoditiesService $orderPackageCommoditiesService
  178. */
  179. $dataHandlerService = app(DataHandlerService::class);
  180. $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
  181. $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'); // 获取picktotraceid (运单的快递单号)
  182. foreach ($orderHeaders as $orderHeader) {
  183. if($orderHeader['sostatus'] == '90'){
  184. if($orderHeader['soreference5']=='')$logistic_numbers[] =$orderHeader['orderno'];
  185. else $logistic_numbers[] = $orderHeader['soreference5'];
  186. }
  187. }
  188. $logistic_numbers = array_unique(array_values($logistic_numbers));
  189. $logistic_numbers = array_diff($logistic_numbers,['',' ','*']);
  190. $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
  191. $exits_number = data_get($packages,'*.logistic_number');
  192. $packages = [];
  193. $diff_number = array_diff($exits_number,$logistic_numbers);
  194. foreach ($diff_number as $number) {
  195. $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps);
  196. if($package ?? false)$packages[]=$package->id;
  197. }
  198. if(count($packages)==0)return;
  199. try {
  200. $bool = OrderPackage::query()->whereIn('id', $packages)->delete();
  201. $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id',$packages)->get();
  202. $orderPackageCommoditiesService->deleteOrderCommodities($orderPackageCommodities);
  203. $bool ? LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages)) : null;
  204. } catch (\Exception $e) {
  205. LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages).$e->getMessage());
  206. }
  207. }
  208. private function updatePackage($orderHeaders, $packages)
  209. {
  210. $map = $this->getSentAtMap($orderHeaders);
  211. $update_params = [];
  212. $update_params[] = ['id','sent_at'];
  213. foreach ($packages as $package) {
  214. if ($package->sent_at) continue;
  215. try {
  216. $data = $map[$package->logistic_number];
  217. } catch (\Exception $e) {
  218. continue;
  219. }
  220. $update_params[] = [
  221. 'id'=>$package->id,
  222. 'sent_at' => $data->checktime,
  223. ];
  224. }
  225. $this->batchUpdate($update_params);
  226. }
  227. /**
  228. * @param $orderHeaders
  229. * @return array
  230. */
  231. private function getSentAtMap($orderHeaders): array
  232. {
  233. $map = [];
  234. foreach ($orderHeaders as $orderHeader) {
  235. $actAllocationDetails = $orderHeader->actAllocationDetails;
  236. foreach ($actAllocationDetails as $actAllocationDetail) {
  237. $logistic_number = $actAllocationDetail->picktotraceid;
  238. $map[$logistic_number] = $actAllocationDetail;
  239. }
  240. }
  241. return $map;
  242. }
  243. }