OrderPackageService.php 8.9 KB

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