OrderPackageService.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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\Services\common\BatchUpdateService;
  10. use Carbon\Carbon;
  11. class OrderPackageService
  12. {
  13. public function batchUpdate(array $params){
  14. return app(BatchUpdateService::class)->batchUpdate('order_packages',$params);
  15. }
  16. public function insert(array $params)
  17. {
  18. return OrderPackage::query()->insert($params);
  19. }
  20. public function createdByOrder($order)
  21. {
  22. /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
  23. $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
  24. $oracleActAllocationDetails = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->get();
  25. $orderHeader = OracleDOCOrderHeader::query()->where('OrderNo', $order['code'])->first();
  26. $oracleDOCOrderDetail = OracleDOCOrderDetail::query()->where('OrderNo', $order['code'])->get();
  27. $logistic_number = null;
  28. if ($oracleActAllocationDetails->count() == 0) { // 通过oracle Order Detail
  29. $logistic_number = $orderHeader['soreference5'];
  30. if ($oracleDOCOrderDetail->count() == 0) {
  31. return null;
  32. }
  33. if ($logistic_number == null || $logistic_number == '*') {
  34. return null;
  35. }
  36. try {
  37. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  38. $orderPackageCommoditiesService->basedOnOracleDetailsStore($orderHeader['orderno'], $orderPackage);
  39. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
  40. } catch (\Exception $e) {
  41. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
  42. }
  43. } else if ($oracleActAllocationDetails->count() > 0) {
  44. $count = $oracleActAllocationDetails->where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
  45. if ($count > 0) { // 快递单号为空
  46. if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') {
  47. return null;
  48. }
  49. $logistic_number = $orderHeader['soreference5'];
  50. try {
  51. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  52. $orderPackageCommoditiesService->basedOnOracleDetailsStore($order, $orderPackage);
  53. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
  54. } catch (\Exception $e) {
  55. LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
  56. }
  57. } else {
  58. $ActAllocationDetails = $oracleActAllocationDetails->where('orderno', $order['code']);
  59. $picktotraceids = data_get($ActAllocationDetails,'*.picktotraceid');
  60. $picktotraceids = array_unique($picktotraceids);
  61. foreach ($picktotraceids as $picktotraceid) {
  62. $logistic_number = $picktotraceid;
  63. if ($logistic_number == null || $logistic_number == '*') {
  64. $logistic_number = $orderHeader['soreference5'];
  65. if ($logistic_number == null || $logistic_number == '*') {
  66. return null;
  67. }
  68. $orderPackage = OrderPackage::query()->where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
  69. if ($orderPackage) {
  70. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  71. continue;
  72. }
  73. try {
  74. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  75. $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
  76. LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage' . json_encode($orderPackage));
  77. } catch (\Exception $e) {
  78. LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
  79. }
  80. continue;
  81. }
  82. $orderPackage = OrderPackage::query()->where('order_id', $order['id'])->where('logistic_number', $logistic_number)->first();
  83. if ($orderPackage) {
  84. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  85. continue;
  86. }
  87. try {
  88. $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
  89. $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
  90. LogService::log(__METHOD__, __FUNCTION__, '创建订单' . json_encode($orderPackage));
  91. } catch (\Exception $e) {
  92. LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
  93. }
  94. }
  95. }
  96. }
  97. unset($oracleActAllocationDetails,$oracleDOCOrderDetail);
  98. }
  99. public function updateOrderPackageInfo(Order $order)
  100. {
  101. $orderHeader = OracleDOCOrderHeader::where('orderNo', $order['code'])->first();
  102. if ($orderHeader['oracleBASCode_codename_c'] == $order['wam_status']) {
  103. return;
  104. }
  105. $orderPackages = OrderPackage::where('order_id', $order['id'])->get();
  106. $orderPackageCommodities = OrderPackageCommodities::with('commodity')->whereIn('order_package_id', data_get($orderPackages, '*.id'))->get();
  107. $actAllocationDetails = OracleActAllocationDetails::where('orderNo', $order['client_code'])->get();
  108. if (count($orderPackageCommodities) < count($actAllocationDetails)) {
  109. $actAllocationDetails = $actAllocationDetails->reject(function ($value, $key) use (&$orderPackageCommodities) {
  110. $bool = false;
  111. $count = 0;
  112. $orderPackageCommodities->reject(function ($value1, $key1) use ($value, &$bool, $count) {
  113. if ($count > 0) {
  114. return false;
  115. }
  116. if ($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty'])) {
  117. $bool = true;
  118. $count++;
  119. return true;
  120. } else {
  121. return false;
  122. }
  123. });
  124. return $bool;
  125. });
  126. }
  127. $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
  128. $orderPackageCommoditiesService->basedOnActAllocationDetail($order, $orderHeader, $actAllocationDetails);
  129. $order['wam_status'] = $orderHeader['oracleBASCode_codename_c'];
  130. $order->save();
  131. }
  132. /**
  133. * @param string $logistic_number
  134. * @param array $values
  135. * @return OrderPackage $package
  136. */
  137. public function firstOrCreate($logistic_number, array $values){
  138. /** @var $package OrderPackage */
  139. $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
  140. if ($package)return $package;
  141. /** @var OrderService */
  142. $order = app('orderService')->logisticNumberCreateOrder($logistic_number);
  143. if ($order) $values["order_id"] = $order->id;
  144. $values["logistic_number"] = $logistic_number;
  145. /** @var OrderPackage $package */
  146. $package = OrderPackage::query()->create($values);
  147. return $package;
  148. }
  149. public function createExceptionPaginate($paginate)
  150. {
  151. return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id')
  152. ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC')
  153. ->paginate($paginate);
  154. }
  155. public function issueExceptionPaginate($paginate)
  156. {
  157. return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule')
  158. ->where('status', '下发异常')->orWhere('status', '记录异常')
  159. ->orWhere('status', '已上传异常')->orderBy('created_at', 'DESC')
  160. ->paginate($paginate);
  161. }
  162. public function 根据WMS订单创建WAS包裹($orderHeaders, $orders)
  163. {
  164. $orderPackagesFillables = [];
  165. foreach ($orders as $order) {
  166. $orderHeader = $orderHeaders[strval($order['code'])] ?? false;
  167. if(!$orderHeader){
  168. continue;
  169. }
  170. $fillables = $this->根据WMS订单生成包裹信息($orderHeader, $order);
  171. foreach ($fillables as $fillable) {
  172. $orderPackagesFillables[] = $fillable;
  173. }
  174. }
  175. try {
  176. if(count($orderPackagesFillables) > 0){
  177. OrderPackage::query()->insert($orderPackagesFillables);
  178. LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息' .count($orderPackagesFillables). json_encode($orderPackagesFillables) );
  179. }
  180. } catch (\Exception $e) {
  181. LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息 error' .json_encode($orderPackagesFillables) . $e->getMessage().$e->getTraceAsString());
  182. } finally {
  183. $order_ids = data_get($orders,'*.id');
  184. unset($orderPackagesFillables,$orders,$fillables);
  185. return Order::query()->with('packages')->whereIn('id',$order_ids)->get();
  186. }
  187. }
  188. public function 根据WMS订单生成包裹信息($orderHeader, $order)
  189. {
  190. $soReference5 = $orderHeader['soreference5'];
  191. $orderPackages= [];
  192. $logistic_numbers = [];
  193. foreach ($orderHeader['actAllocationDetails'] as $actAllocationDetail) {
  194. $logistic_numbers[] =$actAllocationDetail->picktotraceid;
  195. array_push($logistic_numbers,$actAllocationDetail['picktotraceid']);
  196. }
  197. $logistic_numbers = array_unique($logistic_numbers);
  198. $logistic_numbers = array_diff($logistic_numbers,['','*',null]);
  199. $logistic_numbers = count($logistic_numbers) == 0 ? ($soReference5 != '*' ? [$soReference5] : []) : $logistic_numbers;
  200. $logistic_numbers = array_diff($logistic_numbers,['','*',null]);
  201. if(count($logistic_numbers) == 0 ){ return [];}
  202. if (count($logistic_numbers) != 0) {
  203. foreach ($logistic_numbers as $logistic_number) {
  204. $fillable = [
  205. 'order_id' => $order['id'],
  206. 'logistic_number' => $logistic_number,
  207. ];
  208. $orderPackages[] = $fillable;
  209. }
  210. }
  211. return $orderPackages;
  212. }
  213. public function 更新WAS订单的包裹的重量和体积($orderHeaders,$orderPackages)
  214. {
  215. /** @var CommodityService $commodityService */
  216. $commodityService = app('commodityService');
  217. $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders); // 商品
  218. $multipleData = [['id','weight','bulk']];
  219. $noAttributeCommodity = [];
  220. $commodity_map = [];
  221. foreach ($commodities as $commodity) {
  222. $key = ' id='.$commodity->id;
  223. $commodity_map[$key] = $commodity;
  224. }
  225. foreach ($orderPackages as $packages) {
  226. foreach ($packages as $package) {
  227. if($package == null){
  228. continue;
  229. }
  230. $orderPackageCommodities = $package['commodities'] ?? [];
  231. $updateArr = [
  232. 'id' => $package['id'],
  233. 'weight' => 0,
  234. 'bulk' => 0,
  235. ];
  236. foreach ($orderPackageCommodities as $packageCommodity) {
  237. $commodity = $commodity_map[' id='.$packageCommodity->commodity_id];
  238. if($commodity['weight'] == 0 || !$commodity['bulk'] == 0 ){
  239. array_push($noAttributeCommodity,$commodity);
  240. }
  241. // $updateArr['weight'] += bcmul($commodity['weight'], $packageCommodity['amount'],5);
  242. // $updateArr['bulk'] += bcmul($commodity['bulk'], $packageCommodity['amount'],5);
  243. // $updateArr['weight'] += round($commodity['weight']*$packageCommodity['amount'],5);
  244. $updateArr['bulk'] += round($commodity['bulk']*$packageCommodity['amount'],5);
  245. //$updateArr['weight'] +=(intval($commodity['weight'] ?? 0) ) * ( intval($packageCommodity['amount'] ?? 0) );
  246. //$updateArr['bulk'] += (intval($commodity['bulk'] ?? 0)) * (intval($packageCommodity['amount'] ?? 0) );
  247. }
  248. if($package['weight'] == $updateArr['weight'] && $package['bulk'] == $updateArr['bulk']){
  249. continue;
  250. }
  251. // 订单同步步时 重量 体积不覆盖已有值
  252. if($packages['weight'] ?? false){
  253. $updateArr['weight'] = $packages['weight'];
  254. }
  255. if($packages['bulk'] ?? false){
  256. $updateArr['bulk'] = $packages['bulk'];
  257. }
  258. $multipleData[] = $updateArr;
  259. }
  260. }
  261. if(count($multipleData) > 1){
  262. /** @var BatchUpdateService $batchUpdateService */
  263. $batchUpdateService = app('batchUpdateService');
  264. $batchUpdateService->batchUpdate('order_packages',$multipleData);
  265. }
  266. array_unique($noAttributeCommodity);
  267. if(count($noAttributeCommodity) > 1){
  268. $commodityService->syncCommodityAttribute($noAttributeCommodity);
  269. }
  270. unset($multipleData,$noAttributeCommodity,$commodities);
  271. }
  272. public function 更新WAS订单快递单号信息($orderHeaders,$orders)
  273. {
  274. $fillables = [];
  275. $orders_map = [];
  276. $orders_package_map = [];
  277. foreach ($orders as $order){
  278. $key = $order['code'];
  279. $orders_map[$key] = $order;
  280. foreach ($order['packages'] as $package) {
  281. $logistic_numbers = $package['logistic_number'];
  282. $orders_package_map[$key][$logistic_numbers] =$package;
  283. }
  284. }
  285. foreach ($orderHeaders as $key=>$orderHeader) {
  286. $order = $orders[$key] ?? false;
  287. if(!$order){
  288. continue;
  289. }
  290. $packages = $orders_package_map[$key] ?? false;
  291. $pickToTraceIds = [];
  292. foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
  293. $pickToTraceIds[] = $actAllocationDetail['picktotraceid'];
  294. }
  295. $pickToTraceIds = array_unique(array_diff($pickToTraceIds,['','*',null]));
  296. foreach ($pickToTraceIds as $pickToTraceId) {
  297. if(!$packages || !($orders_package_map[$key][$pickToTraceId] ?? false)){
  298. $fillables[] = [
  299. 'order_id' => $order->id,
  300. 'logistic_number' => $pickToTraceId
  301. ];
  302. }
  303. }
  304. }
  305. try {
  306. if(count($fillables)>0){
  307. OrderPackage::query()->insert($fillables);
  308. LogService::log(__METHOD__,__FUNCTION__,'创建orderPackage:'.json_encode($fillables));
  309. }
  310. } catch (\Exception $e) {
  311. LogService::log(__METHOD__,__FUNCTION__,'创建orderPackage 失败:'.json_encode($fillables).$e->getMessage().$e->getTraceAsString());
  312. } finally {
  313. unset($fillables);
  314. }
  315. }
  316. public function createByWmsOrder($orderHeaders_map)
  317. {
  318. if(!$orderHeaders_map ){return [];}
  319. /** @var OrderService $orderService */
  320. $orderService = app(OrderService::class);
  321. $orders = $orderService->getByWmsOrders($orderHeaders_map);
  322. if(!$orders){return [];}
  323. $orders_code_map = [];
  324. foreach ($orders as $order) {
  325. $orders_code_map[$order->code] = $order;
  326. }
  327. $order_packages_logistic_number_map = [];
  328. $order_packages = OrderPackage::query()->whereIn('order_id',data_get($orders,'*.id'))->get();
  329. foreach ($order_packages as $order_package) {
  330. // $key = ' order_id='.$order_package->order_id.' logistic_number='.$order_package->logistic_number;
  331. $key = ' order_id='.$order_package->order_id.' logistic_number='.$order_package->logistic_number;
  332. $order_packages_logistic_number_map[$key] = $order_package;
  333. }
  334. $insert_params = [];
  335. foreach ($orders_code_map as $key=>$order) {
  336. $orderHeader = $orderHeaders_map[$key];
  337. if(!$orderHeader){ continue;}
  338. $params = $this->getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map);
  339. if(!$params){continue;}
  340. $insert_params[] = $params;
  341. }
  342. if(count($insert_params)>0){
  343. $order_packages = $this->create($insert_params);
  344. }
  345. /** @var OrderPackageCommoditiesService $orderPackageCommodityService */
  346. /** @var OwnerService $ownerService */
  347. /** @var CommodityService $commodityService */
  348. $orderPackageCommodityService = app(OrderPackageCommoditiesService::class);
  349. $ownerService = app(OwnerService::class);
  350. $commodityService = app(CommodityService::class);
  351. $owner_code_map = [];
  352. $commodities = $commodityService->getByWmsOrders($orderHeaders_map);
  353. $owners = $ownerService->getByWmsOrders($orderHeaders_map);
  354. foreach ($owners as $owner) {
  355. $owner_code_map[$owner->code] = $owner;
  356. }
  357. $order_package_commodities = $orderPackageCommodityService->createByWmsOrder($orderHeaders_map,$order_packages,$owner_code_map,$commodities);
  358. unset($orderHeaders_map,$orders_code_map,$fillables,$order_packages_logistic_number_map);
  359. $this->updateWeightAndBulk($order_packages,$order_package_commodities);
  360. unset($order_packages,$order_package_commodities);
  361. }
  362. public function getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map){
  363. $actAllocationDetails = $orderHeader->actAllocationDetails;
  364. $logistic_numbers = array_diff(array_unique(data_get($actAllocationDetails,'*.picktotraceid')),['','*',null]);
  365. $params = [];
  366. $created_at = Carbon::now()->format('Y-m-d H:i:s');;
  367. foreach ($logistic_numbers as $logistic_number) {
  368. $map_key = ' order_id='.$order->id.' logistic_number='.$logistic_number;
  369. if(isset($order_packages_logistic_number_map[$map_key])){ continue;}
  370. $params[] = [
  371. 'order_id' => $order->id, 'logistic_number' => $logistic_number,'created_at' => $created_at
  372. ];
  373. }
  374. $oracleDOCOrderDetails = $orderHeader->oracleDOCOrderDetails;
  375. if(count($logistic_numbers) === 0 && count($oracleDOCOrderDetails) > 0){
  376. $key = ' logistic_number='.$orderHeader->soreference5;
  377. if(!isset($orderHeader->soreference5) || in_array($orderHeader->soreference5,[''.'*',null])){return $params;}
  378. if(!isset($order_packages_logistic_number_map[$key])){
  379. $params[] = [
  380. 'order_id' => $order->id, 'logistic_number' => $orderHeader->soreference5,'created_at' => $created_at
  381. ];
  382. }
  383. }
  384. return $params;
  385. }
  386. public function updateWeightAndBulk($orderPackages,$orderPackageCommodities){
  387. if(!$orderPackageCommodities){return ;}
  388. if(!$orderPackages){return ;}
  389. $orderPackageCommodities_map =[];
  390. foreach ($orderPackageCommodities as $orderPackageCommodity) {
  391. $order_package_id = $orderPackageCommodity->order_package_id;
  392. if(!isset($orderPackageCommodities_map[$order_package_id])){
  393. $orderPackageCommodities_map[$order_package_id]= [];
  394. }
  395. $orderPackageCommodities_map[$order_package_id][] = $orderPackageCommodity;
  396. }
  397. $update_params = [['id','bulk','updated_at']];
  398. $updated_at = Carbon::now()->format('Y-m-d H:i:s');
  399. foreach ($orderPackages as $orderPackage) {
  400. $order_package_id = $orderPackage->id;
  401. $orderPackageCommodity_list = $orderPackageCommodities_map[$order_package_id] ?? [];
  402. if(!$orderPackageCommodity_list){continue;}
  403. if( isset($orderPackage['bulk']) && $orderPackage['bulk']!=0){
  404. continue;
  405. }
  406. $params = ['id'=>$order_package_id,'bulk' => null,'updated_at'=>$updated_at];
  407. foreach ($orderPackageCommodity_list as $orderPackageCommodity) {
  408. $commodity = $orderPackageCommodity->commodity;
  409. if(!$commodity['length'] || !$commodity['width'] || !$commodity['height']){
  410. continue;
  411. }
  412. // $bulk = bcmul($commodity['length'],$commodity['width'],5);
  413. // $bulk = bcmul($commodity['height'],$bulk,5);
  414. // $bulk = bcmul($bulk,$orderPackageCommodity->amount,5);
  415. $bulk = round($commodity['length']*$commodity['width'],5);
  416. $bulk = round($commodity['height']*$bulk,5);
  417. $bulk = round($bulk*$orderPackageCommodity->amount,5);
  418. // if($bulk>=1000000)bcdiv($bulk,1000000000,3);
  419. if($bulk>=1000000)round($bulk/1000000000,3);
  420. $params['bulk'] += $bulk;
  421. }
  422. if($params['bulk'] == $orderPackage->bulk && $orderPackage->bulk!= 0){continue;}
  423. $update_params[]= $params;
  424. }
  425. if(count($update_params) > 1){
  426. $this->batchUpdate($update_params);
  427. }
  428. }
  429. public function updateOrderPackageByWmsOrder($orderHeaders){
  430. /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
  431. $orderPackageCommoditiesService = app(OrderPackageCommoditiesService::class);
  432. if(!$orderHeaders){return;}
  433. $order_nos = data_get($orderHeaders,'*.orderno');
  434. $orders = Order::query()->with('packages')->whereIn('code',$order_nos)->get();
  435. $orders_code_map = [];
  436. $order_packages_logistic_number_map = [];
  437. foreach ($orders as $order) {
  438. $orders_code_map[$order->code] = $order;
  439. $order_packages = $order->packages;
  440. if(!$order_packages){continue;}
  441. foreach ($order_packages as $order_package) {
  442. $key = ' order_id='.$order->id.' logistic_number='.$order_package->logistic_number;
  443. $order_packages_logistic_number_map[$key] =$order_package;
  444. }
  445. }
  446. $insertParams = [];
  447. foreach ($orderHeaders as $orderHeader) {
  448. $order = $orders_code_map[$orderHeader->orderno] ?? false;
  449. if(!$order){continue;}
  450. $order_packages = $order->packages;
  451. if(!$order_packages){continue;}
  452. $params =$this->getParamsByOrderHeader($orderHeader,$order,$order_packages_logistic_number_map);
  453. if(count($params) > 0){
  454. foreach ($params as $param) {
  455. $key = ' order_id='.$param['order_id'].' logistic_number='.$param['logistic_number'];
  456. $order_package = $order_packages_logistic_number_map[$key] ?? false;
  457. // $order_package = $order_packages_logistic_number_map[$param['logistic_number']] ?? false;
  458. // $order_package = $order_packages->where('logistic_number',$param)->first();
  459. if($order_package){continue;}
  460. $insertParams[] = $param;
  461. }
  462. }
  463. }
  464. if(count($insertParams)>0){
  465. $this->insert($insertParams);
  466. }
  467. $orderPackageCommoditiesService->updateByWmsOrder($orderHeaders);
  468. $order_packages = OrderPackage::query()->with('order')
  469. ->whereHas('order',function($query) use($order_nos){
  470. $query->whereIn('code',$order_nos);
  471. })->get();
  472. $order_package_ids = data_get($order_packages,'*.id');
  473. $order_package_commodities = OrderPackageCommodities::query()
  474. ->with('package')
  475. ->whereHas('package',function($query) use ($order_package_ids){
  476. $query->whereIn('id',$order_package_ids);
  477. })->get();
  478. $this->updateWeightAndBulk($order_packages,$order_package_commodities);
  479. }
  480. public function getLogisticNumbersByOrderHeader($orderHeader){
  481. $oracleDOCOrderDetails = $orderHeader->oracleDOCOrderDetails;
  482. $actAllocationDetails = $orderHeader->actAllocationDetails;
  483. if($actAllocationDetails){
  484. $logistic_numbers = data_get($actAllocationDetails,'*.picktotraceid');
  485. return array_diff(array_unique($logistic_numbers),['','*',null]);
  486. }
  487. if($oracleDOCOrderDetails){
  488. return [$orderHeader->soreference5];
  489. }
  490. return [];
  491. }
  492. public function getByWmsOrders($orderHeaders){
  493. $order_nos = data_get($orderHeaders,'*.orderno');
  494. return OrderPackage::query()->with('order')
  495. ->whereHas('order',function($query) use ($order_nos){
  496. $query->whereIn('code',$order_nos);
  497. })->get();
  498. }
  499. public function create(array $params)
  500. {
  501. if(count($params) == 0)return null;
  502. try {
  503. $this->insert($params);
  504. LogService::log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params));
  505. } catch (\Exception $e) {
  506. LogService::log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
  507. } finally {
  508. $logistic_numbers = data_get($params,'*.logistic_number');
  509. unset($params);
  510. return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get();
  511. }
  512. }
  513. }