OrderPackageService.php 9.7 KB

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