OrderPackageService.php 23 KB

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