OrderPackageService.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  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. public function createdByOrder($order)
  26. {
  27. /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
  28. $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
  29. $oracleActAllocationDetails = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->get();
  30. $orderHeader = OracleDOCOrderHeader::query()->where('OrderNo', $order['code'])->first();
  31. $oracleDOCOrderDetail = OracleDOCOrderDetail::query()->where('OrderNo', $order['code'])->get();
  32. $logistic_number = null;
  33. if ($oracleActAllocationDetails->count() == 0) { // 通过oracle Order Detail
  34. $logistic_number = $orderHeader['soreference5'];
  35. if ($oracleDOCOrderDetail->count() == 0) {
  36. return null;
  37. }
  38. if ($logistic_number == null || $logistic_number == '*') {
  39. return null;
  40. }
  41. try {
  42. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  43. $orderPackageCommoditiesService->basedOnOracleDetailsStore($orderHeader['orderno'], $orderPackage);
  44. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
  45. } catch (\Exception $e) {
  46. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
  47. }
  48. } else if ($oracleActAllocationDetails->count() > 0) {
  49. $count = $oracleActAllocationDetails->where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
  50. if ($count > 0) { // 快递单号为空
  51. if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') {
  52. return null;
  53. }
  54. $logistic_number = $orderHeader['soreference5'];
  55. try {
  56. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  57. $orderPackageCommoditiesService->basedOnOracleDetailsStore($order, $orderPackage);
  58. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
  59. } catch (\Exception $e) {
  60. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
  61. }
  62. } else {
  63. $ActAllocationDetails = $oracleActAllocationDetails->where('orderno', $order['code']);
  64. $picktotraceids = data_get($ActAllocationDetails,'*.picktotraceid');
  65. $picktotraceids = array_unique($picktotraceids);
  66. foreach ($picktotraceids as $picktotraceid) {
  67. $logistic_number = $picktotraceid;
  68. if ($logistic_number == null || $logistic_number == '*') {
  69. $logistic_number = $orderHeader['soreference5'];
  70. if ($logistic_number == null || $logistic_number == '*') {
  71. return null;
  72. }
  73. $orderPackage = OrderPackage::query()->where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
  74. if ($orderPackage) {
  75. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  76. continue;
  77. }
  78. try {
  79. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  80. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  81. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单orderPackage' . json_encode($orderPackage));
  82. } catch (\Exception $e) {
  83. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
  84. }
  85. continue;
  86. }
  87. $orderPackage = OrderPackage::query()->where('order_id', $order['id'])->where('logistic_number', $logistic_number)->first();
  88. if ($orderPackage) {
  89. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  90. continue;
  91. }
  92. try {
  93. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  94. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  95. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单' . json_encode($orderPackage));
  96. } catch (\Exception $e) {
  97. app('LogService')->log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
  98. }
  99. }
  100. }
  101. }
  102. unset($oracleActAllocationDetails,$oracleDOCOrderDetail);
  103. }
  104. // 需删除
  105. // public function updateOrderPackageInfo(Order $order)
  106. // {
  107. // $orderHeader = OracleDOCOrderHeader::where('orderNo', $order['code'])->first();
  108. // if ($orderHeader['oracleBASCode_codename_c'] == $order['wam_status']) {
  109. // return;
  110. // }
  111. // $orderPackages = OrderPackage::where('order_id', $order['id'])->get();
  112. // $orderPackageCommodities = OrderPackageCommodities::with('commodity')->whereIn('order_package_id', data_get($orderPackages, '*.id'))->get();
  113. // $actAllocationDetails = OracleActAllocationDetails::where('orderNo', $order['client_code'])->get();
  114. // if (count($orderPackageCommodities) < count($actAllocationDetails)) {
  115. // $actAllocationDetails = $actAllocationDetails->reject(function ($value, $key) use (&$orderPackageCommodities) {
  116. // $bool = false;
  117. // $count = 0;
  118. // $orderPackageCommodities->reject(function ($value1, $key1) use ($value, &$bool, $count) {
  119. // if ($count > 0) {
  120. // return false;
  121. // }
  122. // if ($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty'])) {
  123. // $bool = true;
  124. // $count++;
  125. // return true;
  126. // } else {
  127. // return false;
  128. // }
  129. // });
  130. // return $bool;
  131. // });
  132. // }
  133. // $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
  134. // $orderPackageCommoditiesService->basedOnActAllocationDetail($order, $orderHeader, $actAllocationDetails);
  135. // $order['wam_status'] = $orderHeader['oracleBASCode_codename_c'];
  136. // $order->save();
  137. // }
  138. /**
  139. * @param string $logistic_number
  140. * @param array $values
  141. * @return OrderPackage $package
  142. */
  143. public function firstOrCreate($logistic_number, array $values){
  144. /** @var $package OrderPackage */
  145. $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
  146. if ($package)return $package;
  147. /** @var OrderService */
  148. $order = app('OrderService')->logisticNumberFirstOrCreateOrder($logistic_number);
  149. if ($order) $values["order_id"] = $order->id;
  150. $values["logistic_number"] = $logistic_number;
  151. /** @var OrderPackage $package */
  152. $package = OrderPackage::query()->create($values);
  153. return $package;
  154. }
  155. public function createExceptionPaginate($paginate)
  156. {
  157. return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id')
  158. ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC')
  159. ->paginate($paginate);
  160. }
  161. public function issueExceptionPaginate($paginate)
  162. {
  163. return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule')
  164. ->where('status', '下发异常')->orWhere('status', '记录异常')
  165. ->orWhere('status', '已上传异常')->orderBy('created_at', 'DESC')
  166. ->paginate($paginate);
  167. }
  168. public function createByWmsOrder($orderHeaders)
  169. {
  170. /**
  171. * @var OrderService $orderService
  172. * @var DataHandlerService $dataHandlerService
  173. * @var OrderPackageCommoditiesService $orderPackageCommodityService
  174. */
  175. $orderService = app(OrderService::class);
  176. $dataHandlerService = app(DataHandlerService::class);
  177. $orderPackageCommodityService = app(OrderPackageCommoditiesService::class);
  178. if(!$orderHeaders ){return ;}
  179. $orders = $orderService->getByWmsOrders($orderHeaders);
  180. if(!$orders){return ;}
  181. $order_packages = OrderPackage::query()->whereIn('order_id',data_get($orders,'*.id'))->get();
  182. $order_packages_logistic_number_map=$dataHandlerService->dataHeader(['order_id','logistic_number'],$order_packages);
  183. $order_headers_orderNo_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
  184. $insert_params = [];
  185. foreach ($orders as $order) {
  186. $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$order_headers_orderNo_map);
  187. if(!$orderHeader){ continue;}
  188. if(!$orderHeader->sostatus == 90){ continue;}
  189. $params = $this->getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map);
  190. if(!$params){continue;}
  191. foreach ($params as $param) {
  192. $key = ['order_id'=>$param['order_id'],'logistic_number'=>$param['logistic_number']];
  193. $orderPackage = $dataHandlerService->getKeyValue($key,$order_packages_logistic_number_map);
  194. if(isset($orderPackage)){
  195. continue;
  196. }else{
  197. $insert_params[] = $param;
  198. }
  199. }
  200. }
  201. if(count($insert_params)>0){
  202. $order_packages = $this->create($insert_params);
  203. }
  204. unset($orders_code_map,$order_packages_logistic_number_ma,$insert_params,$order_packages,$order_package_commodities);
  205. $orderPackageCommodityService->createByWmsOrder($orderHeaders);
  206. unset($orderHeaders);
  207. }
  208. public function getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map)
  209. {
  210. /** @var DataHandlerService $dataHandlerService */
  211. $dataHandlerService = app(DataHandlerService::class);
  212. $actAllocationDetails = $orderHeader->actAllocationDetails;
  213. $logistic_numbers = array_diff(array_unique(data_get($actAllocationDetails,'*.picktotraceid')),['','*',null]);
  214. $params = [];
  215. $created_at = Carbon::now()->format('Y-m-d H:i:s');
  216. $updated_at = Carbon::now()->format('Y-m-d H:i:s');
  217. foreach ($logistic_numbers as $logistic_number) {
  218. // if($logistic_number == $orderHeader->orderno)continue;
  219. $key = ['order_id'=>$order->id,'logistic_number'=>$logistic_number];
  220. $orderPackage = $dataHandlerService->getKeyValue($key,$order_packages_logistic_number_map);
  221. if(isset($orderPackage)){ continue;}
  222. $params[] = [
  223. 'order_id' => $order->id, 'logistic_number' => $logistic_number,'created_at' => $created_at,'updated_at' => $updated_at
  224. ];
  225. }
  226. return $params;
  227. }
  228. // public function getUpdateParamsByOrderHeader($orderHeader,$order,$orderPackages)
  229. // {
  230. // $updated_at = Carbon::now()->format('Y-m-d H:i:s');
  231. // /** @var DataHandlerService $dataHandlerService */
  232. // $dataHandlerService = app(DataHandlerService::class);
  233. // $wms_logistic_number = app(OracleDOCOrderHeaderService::class)->getLogisticNumbers($orderHeader);
  234. // $order_packages = $orderPackages->where('order_id',$order->id)->get();
  235. // $was__logistic_number = data_get($order_packages,'*.logistic_number');
  236. // $arr1= array_diff($was__logistic_number,$wms_logistic_number);
  237. // $arr2= array_diff($wms_logistic_number,$was__logistic_number);
  238. // if(count($arr2) > 0 && count($arr1) == 0){
  239. // return [
  240. // 'id'=>$order_packages->first()->id,
  241. // 'logistic_number' => $arr1[0],
  242. // 'updated_at'=> $updated_at,
  243. // ];
  244. // }
  245. // return null;
  246. // }
  247. public function updateOrderPackageByWmsOrder($orderHeaders){
  248. /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
  249. $orderPackageCommoditiesService = app(OrderPackageCommoditiesService::class);
  250. /** @var DataHandlerService $dataHandlerService */
  251. $dataHandlerService = app(DataHandlerService::class);
  252. if(!$orderHeaders){return;}
  253. $orders = Order::query()->with('packages')->whereIn('code',data_get($orderHeaders,'*.orderno'))->get();
  254. $orders_code_map = $dataHandlerService->dataHeader(['code'],$orders);
  255. $orderPackages =$this->getByWmsOrders($orderHeaders);
  256. $order_packages_logistic_number_map = $dataHandlerService->dataHeader(['order_id','logistic_number'],$orderPackages);
  257. $insertParams = [];
  258. foreach ($orderHeaders as $orderHeader) {
  259. $order = $dataHandlerService->getKeyValue(['code'=>$orderHeader->orderno ?? ''],$orders_code_map);
  260. if(!$order){continue;}
  261. $order_packages = $order->packages ?? null;
  262. if(!$order_packages){continue;}
  263. $params =$this->getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map);
  264. if(count($params) > 0){
  265. foreach ($params as $param) {
  266. $key = ['order_id'=>$param['order_id'],'logistic_number'=>$param['logistic_number']];
  267. $order_package = $dataHandlerService->getKeyValue($key,$order_packages_logistic_number_map);
  268. if($order_package){continue;}
  269. $insertParams[] = $param;
  270. }
  271. }
  272. }
  273. if(count($insertParams)>0){
  274. $this->create($insertParams);
  275. }
  276. $orderPackageCommoditiesService->updateByWmsOrder($orderHeaders);
  277. $this->删除多余的订单包裹_根据WMS订单($orderHeaders);
  278. }
  279. public function getByWmsOrders($orderHeaders){
  280. $order_nos = data_get($orderHeaders,'*.orderno');
  281. return OrderPackage::query()->with('order')
  282. ->whereIn('order_id',function($query) use ($order_nos){
  283. $query->from('orders')->select('id')->whereIn('code',$order_nos);
  284. })->get();
  285. }
  286. public function create(array $params)
  287. {
  288. if(count($params) == 0)return null;
  289. try {
  290. $this->insert($params);
  291. app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params));
  292. } catch (\Exception $e) {
  293. app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
  294. } finally {
  295. $logistic_numbers = data_get($params,'*.logistic_number');
  296. unset($params);
  297. return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get();
  298. }
  299. }
  300. /**
  301. * @param OracleDOCOrderHeader $orderHeaders
  302. */
  303. public function 删除多余的订单包裹_根据WMS订单($orderHeaders)
  304. {
  305. if(!isset($orderHeaders)){return;}
  306. if(is_array($orderHeaders) && count($orderHeaders) == 0){return;}
  307. $orderPackages = $this->getByWmsOrders($orderHeaders);
  308. $Was_logistic_number = data_get($orderPackages,'*.logistic_number');
  309. $Wms_logistic_number = array_unique(data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'));
  310. $delete_logistic_number = array_diff($Was_logistic_number,$Wms_logistic_number);
  311. if(count($delete_logistic_number) == 0){return;}
  312. $delete_orderPackages = OrderPackage::query()->wherein('logistic_number',$delete_logistic_number)->get();
  313. $delete_ids = app(OrderPackageCommoditiesService::class)->删除包裹商品信息_根据快递单号($delete_logistic_number);
  314. try {
  315. OrderPackage::query()->whereIn('logistic_number', $delete_logistic_number)->delete();
  316. app('LogService')->log(__METHOD__,__FUNCTION__,'删除多余OrderPackage '.$delete_orderPackages->count().json_encode($delete_orderPackages),null);
  317. $orderTracking = OrderTracking::query()->whereIn('order_package_commodity_id', $delete_ids)->get();
  318. app(OrderTrackingService::class)->deleteOrderTracings($orderTracking);
  319. } catch (\Exception $e) {
  320. app('LogService')->log(__METHOD__,__FUNCTION__,'删除多余OrderPackage error'.$delete_orderPackages->count().json_encode($delete_orderPackages).$e->getMessage().$e->getTraceAsString(),null);
  321. }
  322. }
  323. /**
  324. * @param array $orderNos
  325. * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
  326. */
  327. public function getByOrderNos($orderNos)
  328. {
  329. return OrderPackage::query()->with('order')
  330. ->whereIn('order_id',function($query)use($orderNos){
  331. $query->from('orders')->select('id')->whereIn('code',$orderNos);
  332. })->get();
  333. }
  334. public function 返回OrderPackage数组_根据数组中的快递单号($params)
  335. {
  336. $map = [];
  337. $orderPackages = OrderPackage::query()->whereIn('logistic_number',data_get($params,'*.logistic_number'))->get();
  338. if($orderPackages->count() == 0){return $map;}
  339. foreach ($orderPackages as $orderPackage) {
  340. $map[$orderPackage->logistic_number] = $orderPackage;
  341. }
  342. return $map;
  343. }
  344. /**
  345. * @param string $orderClientNo
  346. * @param string $logisticNumber
  347. * @return array|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object
  348. */
  349. public function update($orderClientNo,$logisticNumber)
  350. {
  351. $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first();
  352. if(!$order){
  353. $order = Order::query()->create(['client_code'=>$orderClientNo]);
  354. }
  355. $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first();
  356. if($orderPackage){return compact('orderPackage','order');}
  357. $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
  358. return compact('orderPackage','order');
  359. }
  360. // TODO
  361. public function syncOrderPackage(&$orderHeaders)
  362. {
  363. /**
  364. * @var OrderPackageCommoditiesService $OrderPackageCommoditiesService
  365. */
  366. $OrderPackageCommoditiesService = app('OrderPackageCommoditiesService');
  367. $this->syncPackageByOrderHeaders($orderHeaders);
  368. $OrderPackageCommoditiesService->syncOrderPackageCommodities($orderHeaders);
  369. }
  370. // TODO
  371. public function syncPackageByOrderHeaders(&$orderHeaders)
  372. {
  373. /**
  374. * @var OrderService $orderService
  375. * @var OrderPackageCommoditiesService $orderPackageCommodityService
  376. * @var OrderTrackingService $orderTrackingService
  377. */
  378. $orderService = app('OrderService');
  379. $orderPackageCommodityService= app('OrderPackageCommoditiesService');
  380. $orderTrackingService = app('OrderTrackingService');
  381. if(!$orderHeaders)return;
  382. $orders = $orderService->getByWmsOrders($orderHeaders);
  383. $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno')); // 已有
  384. $this->createOrderPackage($orderHeaders,$orders,$packages); // 创建package
  385. $del_ids = $this->deleteUnnecessaryPackage($orderHeaders,$packages); // 删除package
  386. $orderPackageCommodityService->deleteUnnecessaryOrderCommodities($del_ids); // 删除 orderCommodity
  387. $orderTracking = OrderTracking::query()->whereIn('order_package_commodity_id',function($query)use($del_ids){
  388. $query->from('order_package_commodities')->select('order_package_commodities.id')->whereIn('order_package_id',$del_ids);
  389. })->get();
  390. if($orderTracking->count()==0)return;
  391. $orderTrackingService->deleteOrderTracings($orderTracking); // 删除追踪件
  392. }
  393. // TODO
  394. public function createOrderPackage($orderHeaders,$orders,$packages)
  395. {
  396. if(!$orderHeaders)return;
  397. /**
  398. * @var DataHandlerService $dataHandlerService
  399. */
  400. $dataHandlerService = app(DataHandlerService::class);
  401. $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
  402. $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
  403. $inner_params = [];
  404. foreach ($orders as $order){
  405. $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeaders_map);
  406. if(!$orderHeader)continue;
  407. if($orderHeader->sotatus == 90)continue;
  408. $params = $this->getInnerParams($orderHeader,$order,$packages_maps);
  409. $inner_params = array_merge($inner_params,$params);
  410. }
  411. if(count($inner_params)>0){
  412. try {
  413. $inner_array = array_chunk($inner_params,5000);
  414. foreach ($inner_array as $params) {
  415. $bool = $this->insert($params);
  416. $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;
  417. }
  418. } catch (\Exception $e) {
  419. LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' .json_encode($e->getMessage()). json_encode($inner_params).json_encode($e->getTraceAsString()));
  420. }
  421. }
  422. }
  423. // TODO
  424. public function getInnerParams($orderHeader,$order,$packages_maps)
  425. {
  426. /**
  427. * @var DataHandlerService $dataHandlerService
  428. */
  429. $dataHandlerService = app('DataHandlerService');
  430. $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']);
  431. $inner_params = [];
  432. $date = Carbon::now()->format('Y-m-d H:i:s');
  433. foreach ($logistic_numbers as $logistic_number){
  434. $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps);
  435. if(isset($package))continue;
  436. $inner_params[] = [
  437. 'order_id' => $order->id,
  438. 'logistic_number' => $logistic_number,
  439. 'created_at' => $date,
  440. 'updated_at' => $date,
  441. 'status' =>'无'
  442. ];
  443. }
  444. return $inner_params;
  445. }
  446. // TODO
  447. public function deleteUnnecessaryPackage($orderHeaders,$packages)
  448. {
  449. /**
  450. * @var DataHandlerService $dataHandlerService
  451. */
  452. $dataHandlerService = app(DataHandlerService::class);
  453. $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'); // 获取picktotraceid (运单的快递单号)
  454. $logistic_numbers = array_unique($logistic_numbers);
  455. $logistic_numbers = array_diff($logistic_numbers,['',' ','*']);
  456. $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
  457. $exits_number = data_get($packages,'*.logistic_number');
  458. $packages = collect();
  459. $diff_number = array_diff($exits_number,$logistic_numbers);
  460. foreach ($diff_number as $number) {
  461. $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps);
  462. if($package ?? false)$packages->push($package->id);
  463. }
  464. if($packages->isEmpty())return $packages;
  465. try {
  466. $bool = OrderPackage::query()->whereIn('id', $packages)->delete();
  467. $bool ? LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages)) : null;
  468. return $bool ? $packages : collect();
  469. } catch (\Exception $e) {
  470. LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages).$e->getMessage());
  471. return collect();
  472. }
  473. }
  474. // TODO
  475. public function createPackagesFromBatchCode($batchCode,$weight)
  476. {
  477. /**
  478. * @var OrderService $orderService
  479. */
  480. $now = Carbon::now();
  481. $orderService = app('OrderService');
  482. $orderHeaders = OracleDOCOrderHeader::query()->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
  483. ->with(['oracleBASCustomer'=>function($query){
  484. $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
  485. },'oracleDOCOrderDetails'=>function($query){
  486. $query->selectRaw('doc_order_details.orderNo,doc_order_details.CustomerId,doc_order_details.sku,doc_order_details.QtyOrdered');
  487. }, 'actAllocationDetails'=>function($query){
  488. $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku');
  489. },'oracleBASCode'=>function($query){
  490. $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
  491. }])
  492. ->where('Doc_Order_Header.WaveNo',$batchCode)
  493. ->get();
  494. $orderService->syncOrderByWMSOrderHeaders($orderHeaders);
  495. $this->syncPackageByOrderHeaders($orderHeaders);
  496. $orders = Order::query()->with('packages')->whereIn('code',data_get($orderHeaders,'*.orderno'))->get();
  497. $update_params = [[
  498. 'id','weight','weighed_at','status','batch_number'
  499. ]];
  500. foreach ($orderHeaders as $orderHeader) {
  501. $order = $orders->where('code',$orderHeader->orderno)->first();
  502. if(!$order){
  503. app('LogService')->log(__METHOD__,"此包裹在WMS未找到order",json_encode($orderHeader),Auth::user()['id']);
  504. continue;
  505. }
  506. $order->packages->each(function($package)use(&$update_params,$weight,$batchCode,$now){
  507. $update_params[] = [
  508. 'id' => $package->id,
  509. 'weight' =>$weight,
  510. 'weighed_at'=>$now,
  511. 'status' =>"已上传",
  512. 'batch_number' => $batchCode
  513. ];
  514. });
  515. }
  516. if(count($update_params)==1)return;
  517. DB::transaction(function ()use($update_params){
  518. $this->batchUpdate($update_params);
  519. });
  520. app('LogService')->log(__METHOD__,"批量录入包裹成功",json_encode($update_params),Auth::user()['id']);
  521. }
  522. }