OrderPackageService.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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. class OrderPackageService
  15. {
  16. public function batchUpdate(array $params){
  17. return app(BatchUpdateService::class)->batchUpdate('order_packages',$params);
  18. }
  19. public function insert(array $params)
  20. {
  21. return OrderPackage::query()->insert($params);
  22. }
  23. public function createdByOrder($order)
  24. {
  25. /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
  26. $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
  27. $oracleActAllocationDetails = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->get();
  28. $orderHeader = OracleDOCOrderHeader::query()->where('OrderNo', $order['code'])->first();
  29. $oracleDOCOrderDetail = OracleDOCOrderDetail::query()->where('OrderNo', $order['code'])->get();
  30. $logistic_number = null;
  31. if ($oracleActAllocationDetails->count() == 0) { // 通过oracle Order Detail
  32. $logistic_number = $orderHeader['soreference5'];
  33. if ($oracleDOCOrderDetail->count() == 0) {
  34. return null;
  35. }
  36. if ($logistic_number == null || $logistic_number == '*') {
  37. return null;
  38. }
  39. try {
  40. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  41. $orderPackageCommoditiesService->basedOnOracleDetailsStore($orderHeader['orderno'], $orderPackage);
  42. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
  43. } catch (\Exception $e) {
  44. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
  45. }
  46. } else if ($oracleActAllocationDetails->count() > 0) {
  47. $count = $oracleActAllocationDetails->where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
  48. if ($count > 0) { // 快递单号为空
  49. if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') {
  50. return null;
  51. }
  52. $logistic_number = $orderHeader['soreference5'];
  53. try {
  54. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  55. $orderPackageCommoditiesService->basedOnOracleDetailsStore($order, $orderPackage);
  56. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
  57. } catch (\Exception $e) {
  58. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
  59. }
  60. } else {
  61. $ActAllocationDetails = $oracleActAllocationDetails->where('orderno', $order['code']);
  62. $picktotraceids = data_get($ActAllocationDetails,'*.picktotraceid');
  63. $picktotraceids = array_unique($picktotraceids);
  64. foreach ($picktotraceids as $picktotraceid) {
  65. $logistic_number = $picktotraceid;
  66. if ($logistic_number == null || $logistic_number == '*') {
  67. $logistic_number = $orderHeader['soreference5'];
  68. if ($logistic_number == null || $logistic_number == '*') {
  69. return null;
  70. }
  71. $orderPackage = OrderPackage::query()->where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
  72. if ($orderPackage) {
  73. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  74. continue;
  75. }
  76. try {
  77. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  78. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  79. LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage' . json_encode($orderPackage));
  80. } catch (\Exception $e) {
  81. LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
  82. }
  83. continue;
  84. }
  85. $orderPackage = OrderPackage::query()->where('order_id', $order['id'])->where('logistic_number', $logistic_number)->first();
  86. if ($orderPackage) {
  87. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  88. continue;
  89. }
  90. try {
  91. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  92. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  93. LogService::log(__METHOD__, __FUNCTION__, '创建订单' . json_encode($orderPackage));
  94. } catch (\Exception $e) {
  95. LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
  96. }
  97. }
  98. }
  99. }
  100. unset($oracleActAllocationDetails,$oracleDOCOrderDetail);
  101. }
  102. // 需删除
  103. // public function updateOrderPackageInfo(Order $order)
  104. // {
  105. // $orderHeader = OracleDOCOrderHeader::where('orderNo', $order['code'])->first();
  106. // if ($orderHeader['oracleBASCode_codename_c'] == $order['wam_status']) {
  107. // return;
  108. // }
  109. // $orderPackages = OrderPackage::where('order_id', $order['id'])->get();
  110. // $orderPackageCommodities = OrderPackageCommodities::with('commodity')->whereIn('order_package_id', data_get($orderPackages, '*.id'))->get();
  111. // $actAllocationDetails = OracleActAllocationDetails::where('orderNo', $order['client_code'])->get();
  112. // if (count($orderPackageCommodities) < count($actAllocationDetails)) {
  113. // $actAllocationDetails = $actAllocationDetails->reject(function ($value, $key) use (&$orderPackageCommodities) {
  114. // $bool = false;
  115. // $count = 0;
  116. // $orderPackageCommodities->reject(function ($value1, $key1) use ($value, &$bool, $count) {
  117. // if ($count > 0) {
  118. // return false;
  119. // }
  120. // if ($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty'])) {
  121. // $bool = true;
  122. // $count++;
  123. // return true;
  124. // } else {
  125. // return false;
  126. // }
  127. // });
  128. // return $bool;
  129. // });
  130. // }
  131. // $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
  132. // $orderPackageCommoditiesService->basedOnActAllocationDetail($order, $orderHeader, $actAllocationDetails);
  133. // $order['wam_status'] = $orderHeader['oracleBASCode_codename_c'];
  134. // $order->save();
  135. // }
  136. /**
  137. * @param string $logistic_number
  138. * @param array $values
  139. * @return OrderPackage $package
  140. */
  141. public function firstOrCreate($logistic_number, array $values){
  142. /** @var $package OrderPackage */
  143. $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
  144. if ($package)return $package;
  145. /** @var OrderService */
  146. $order = app('OrderService')->logisticNumberFirstOrCreateOrder($logistic_number);
  147. if ($order) $values["order_id"] = $order->id;
  148. $values["logistic_number"] = $logistic_number;
  149. /** @var OrderPackage $package */
  150. $package = OrderPackage::query()->create($values);
  151. return $package;
  152. }
  153. public function createExceptionPaginate($paginate)
  154. {
  155. return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id')
  156. ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC')
  157. ->paginate($paginate);
  158. }
  159. public function issueExceptionPaginate($paginate)
  160. {
  161. return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule')
  162. ->where('status', '下发异常')->orWhere('status', '记录异常')
  163. ->orWhere('status', '已上传异常')->orderBy('created_at', 'DESC')
  164. ->paginate($paginate);
  165. }
  166. public function createByWmsOrder($orderHeaders)
  167. {
  168. if(!$orderHeaders ){return ;}
  169. /** @var OrderService $orderService */
  170. $orderService = app(OrderService::class);
  171. /** @var DataHandlerService $dataHandlerService */
  172. $dataHandlerService = app(DataHandlerService::class);
  173. $order_headers_orderNo_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
  174. $orders = $orderService->getByWmsOrders($orderHeaders);
  175. if(!$orders){return ;}
  176. $order_packages = OrderPackage::query()->whereIn('order_id',data_get($orders,'*.id'))->get();
  177. $order_packages_logistic_number_map =$dataHandlerService->dataHeader(['order_id','logistic_number'],$order_packages);
  178. $insert_params = [];
  179. foreach ($orders as $order) {
  180. $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$order_headers_orderNo_map);
  181. if(!$orderHeader){ continue;}
  182. if(!$orderHeader->sostatus == 90){ continue;}
  183. $params = $this->getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map);
  184. if(!$params){continue;}
  185. foreach ($params as $param) {
  186. $key = ['order_id'=>$param['order_id'],'logistic_number'=>$param['logistic_number']];
  187. $orderPackage = $dataHandlerService->getKeyValue($key,$order_packages_logistic_number_map);
  188. if(isset($orderPackage)){
  189. continue;
  190. }else{
  191. $insert_params[] = $param;
  192. }
  193. }
  194. }
  195. if(count($insert_params)>0){
  196. $order_packages = $this->create($insert_params);
  197. }
  198. unset($orders_code_map,$order_packages_logistic_number_ma,$insert_params,$order_packages,$order_package_commodities);
  199. /** @var OrderPackageCommoditiesService $orderPackageCommodityService */
  200. $orderPackageCommodityService = app(OrderPackageCommoditiesService::class);
  201. $orderPackageCommodityService->createByWmsOrder($orderHeaders);
  202. unset($orderHeaders);
  203. }
  204. public function getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map)
  205. {
  206. /** @var DataHandlerService $dataHandlerService */
  207. $dataHandlerService = app(DataHandlerService::class);
  208. $actAllocationDetails = $orderHeader->actAllocationDetails;
  209. $logistic_numbers = array_diff(array_unique(data_get($actAllocationDetails,'*.picktotraceid')),['','*',null]);
  210. $params = [];
  211. $created_at = Carbon::now()->format('Y-m-d H:i:s');
  212. $updated_at = Carbon::now()->format('Y-m-d H:i:s');
  213. foreach ($logistic_numbers as $logistic_number) {
  214. if($logistic_number == $orderHeader->orderno)continue;
  215. $key = ['order_id'=>$order->id,'logistic_number'=>$logistic_number];
  216. $orderPackage = $dataHandlerService->getKeyValue($key,$order_packages_logistic_number_map);
  217. if(isset($orderPackage)){ continue;}
  218. $params[] = [
  219. 'order_id' => $order->id, 'logistic_number' => $logistic_number,'created_at' => $created_at,'updated_at' => $updated_at
  220. ];
  221. }
  222. return $params;
  223. }
  224. // public function getUpdateParamsByOrderHeader($orderHeader,$order,$orderPackages)
  225. // {
  226. // $updated_at = Carbon::now()->format('Y-m-d H:i:s');
  227. // /** @var DataHandlerService $dataHandlerService */
  228. // $dataHandlerService = app(DataHandlerService::class);
  229. // $wms_logistic_number = app(OracleDOCOrderHeaderService::class)->getLogisticNumbers($orderHeader);
  230. // $order_packages = $orderPackages->where('order_id',$order->id)->get();
  231. // $was__logistic_number = data_get($order_packages,'*.logistic_number');
  232. // $arr1= array_diff($was__logistic_number,$wms_logistic_number);
  233. // $arr2= array_diff($wms_logistic_number,$was__logistic_number);
  234. // if(count($arr2) > 0 && count($arr1) == 0){
  235. // return [
  236. // 'id'=>$order_packages->first()->id,
  237. // 'logistic_number' => $arr1[0],
  238. // 'updated_at'=> $updated_at,
  239. // ];
  240. // }
  241. // return null;
  242. // }
  243. public function updateOrderPackageByWmsOrder($orderHeaders){
  244. /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
  245. $orderPackageCommoditiesService = app(OrderPackageCommoditiesService::class);
  246. /** @var DataHandlerService $dataHandlerService */
  247. $dataHandlerService = app(DataHandlerService::class);
  248. if(!$orderHeaders){return;}
  249. $orders = Order::query()->with('packages')->whereIn('code',data_get($orderHeaders,'*.orderno'))->get();
  250. $orders_code_map = $dataHandlerService->dataHeader(['code'],$orders);
  251. $orderPackages =$this->getByWmsOrders($orderHeaders);
  252. $order_packages_logistic_number_map = $dataHandlerService->dataHeader(['order_id','logistic_number'],$orderPackages);
  253. $insertParams = [];
  254. foreach ($orderHeaders as $orderHeader) {
  255. $order = $dataHandlerService->getKeyValue(['code'=>$orderHeader->orderno ?? ''],$orders_code_map);
  256. if(!$order){continue;}
  257. $order_packages = $order->packages ?? null;
  258. if(!$order_packages){continue;}
  259. $params =$this->getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map);
  260. if(count($params) > 0){
  261. foreach ($params as $param) {
  262. $key = ['order_id'=>$param['order_id'],'logistic_number'=>$param['logistic_number']];
  263. $order_package = $dataHandlerService->getKeyValue($key,$order_packages_logistic_number_map);
  264. if($order_package){continue;}
  265. $insertParams[] = $param;
  266. }
  267. }
  268. }
  269. if(count($insertParams)>0){
  270. $this->create($insertParams);
  271. }
  272. $orderPackageCommoditiesService->updateByWmsOrder($orderHeaders);
  273. $this->删除多余的订单包裹_根据WMS订单($orderHeaders);
  274. }
  275. public function getByWmsOrders($orderHeaders){
  276. $order_nos = data_get($orderHeaders,'*.orderno');
  277. return OrderPackage::query()->with('order')
  278. ->whereHas('order',function($query) use ($order_nos){
  279. $query->whereIn('code',$order_nos);
  280. })->get();
  281. }
  282. public function create(array $params)
  283. {
  284. if(count($params) == 0)return null;
  285. try {
  286. $this->insert($params);
  287. LogService::log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params));
  288. } catch (\Exception $e) {
  289. LogService::log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
  290. } finally {
  291. $logistic_numbers = data_get($params,'*.logistic_number');
  292. unset($params);
  293. return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get();
  294. }
  295. }
  296. /**
  297. * @param OracleDOCOrderHeader $orderHeaders
  298. */
  299. public function 删除多余的订单包裹_根据WMS订单($orderHeaders)
  300. {
  301. if(!isset($orderHeaders)){return;}
  302. if(is_array($orderHeaders) && count($orderHeaders) == 0){return;}
  303. $orderPackages = $this->getByWmsOrders($orderHeaders);
  304. $Was_logistic_number = data_get($orderPackages,'*.logistic_number');
  305. $Wms_logistic_number = array_unique(data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'));
  306. $delete_logistic_number = array_diff($Was_logistic_number,$Wms_logistic_number);
  307. if(count($delete_logistic_number) == 0){return;}
  308. $delete_orderPackages = OrderPackage::query()->wherein('logistic_number',$delete_logistic_number)->get();
  309. $delete_ids = app(OrderPackageCommoditiesService::class)->删除包裹商品信息_根据快递单号($delete_logistic_number);
  310. try {
  311. OrderPackage::query()->whereIn('logistic_number', $delete_logistic_number)->delete();
  312. LogService::log(__METHOD__,__FUNCTION__,'删除多余OrderPackage '.$delete_orderPackages->count().json_encode($delete_orderPackages),null);
  313. $orderTracking = OrderTracking::query()->whereIn('order_package_commodity_id', $delete_ids)->get();
  314. app(OrderTrackingService::class)->deleteOrderTracings($orderTracking);
  315. } catch (\Exception $e) {
  316. LogService::log(__METHOD__,__FUNCTION__,'删除多余OrderPackage error'.$delete_orderPackages->count().json_encode($delete_orderPackages).$e->getMessage().$e->getTraceAsString(),null);
  317. }
  318. }
  319. /**
  320. * @param array $orderNos
  321. * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
  322. */
  323. public function getByOrderNos($orderNos)
  324. {
  325. return OrderPackage::query()->with('order')
  326. ->whereHas('order',function($query)use($orderNos){
  327. $query->whereIn('code',$orderNos);
  328. })->get();
  329. }
  330. /**
  331. * @param Collection $orders
  332. * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
  333. */
  334. public function getByOrders($orders)
  335. {
  336. return $this->getByOrderNos(data_get($orders,'*.code'));
  337. }
  338. public function 返回OrderPackage数组_根据数组中的快递单号($params)
  339. {
  340. $map = [];
  341. $orderPackages = OrderPackage::query()->whereIn('logistic_number',data_get($params,'*.logistic_number'))->get();
  342. if($orderPackages->count() == 0){return $map;}
  343. foreach ($orderPackages as $orderPackage) {
  344. $map[$orderPackage->logistic_number] = $orderPackage;
  345. }
  346. return $map;
  347. }
  348. /**
  349. * @param string $orderClientNo
  350. * @param string $logisticNumber
  351. * @return array|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object
  352. */
  353. public function update($orderClientNo,$logisticNumber)
  354. {
  355. $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first();
  356. if(!$order){
  357. $order = Order::query()->create(['client_code'=>$orderClientNo]);
  358. }
  359. $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first();
  360. if($orderPackage){return compact('orderPackage','order');}
  361. $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
  362. return compact('orderPackage','order');
  363. }
  364. }