OrderPackageCommoditiesService.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <?php
  2. namespace App\Services;
  3. use App\Commodity;
  4. use App\OracleActAllocationDetails;
  5. use App\OracleBasSKU;
  6. use App\OracleDOCOrderDetail;
  7. use App\OracleDOCOrderHeader;
  8. use App\Order;
  9. use App\OrderPackage;
  10. use App\OrderPackageCommodities;
  11. use App\OrderTracking;
  12. use App\Owner;
  13. use App\Services\common\BatchUpdateService;
  14. use App\Services\common\DataHandlerService;
  15. use Carbon\Carbon;
  16. use Illuminate\Support\Collection;
  17. class OrderPackageCommoditiesService
  18. {
  19. public function insert(array $params){
  20. return OrderPackageCommodities::query()->insert($params);
  21. }
  22. public function batchUpdate($params){
  23. return app(BatchUpdateService::class)->batchUpdate('order_package_commodities',$params);
  24. }
  25. public function create(array $params){
  26. if(!$params){return [];}
  27. try {
  28. $this->insert($params);
  29. app('LogService')->log(__METHOD__,__FUNCTION__,'批量创建 OrderPackageCommodities'.count($params).json_encode($params));
  30. } catch (\Exception $e) {
  31. app('LogService')->log(__METHOD__,__FUNCTION__,'批量创建 OrderPackageCommodities error'.json_encode($params)."||".$e->getMessage().'||'.$e->getTraceAsString());
  32. } finally {
  33. $order_package_ids = array_unique(data_get($params,'*.order_package_id'));
  34. unset($params);
  35. return OrderPackageCommodities::query()
  36. ->with('commodity')
  37. ->whereIn('order_package_id',$order_package_ids)
  38. ->get();
  39. }
  40. }
  41. public function getByWmsOrder($orderHeaders){
  42. $order_no = data_get($orderHeaders,'*.orderno');
  43. return OrderPackageCommodities::query()
  44. ->with('package.order','commodity')
  45. ->whereIn('order_package_id',function($query) use ($order_no){
  46. $query->from('order_packages')->select('id')->whereIn('order_id',function($query)use($order_no){
  47. $query->from('orders')->select('id')->whereIn('code',$order_no);
  48. });
  49. })->get();
  50. }
  51. public function batchUpdateItself($column, array $params)
  52. {
  53. return app(BatchUpdateService::class)->batchUpdateItself('order_package_commodities', $column, $params);
  54. }
  55. public function getByOrderNos($orderNos)
  56. {
  57. return OrderPackageCommodities::query()->with('package.order','commodity')
  58. ->whereIn('order_package_id',function($query) use ($orderNos){
  59. $query->from('order_packages')->select('id')->whereIn('order_id',function($query)use($orderNos){
  60. $query->from('orders')->select('id')->whereIn('code',$orderNos);
  61. });
  62. })->get();
  63. }
  64. public function syncOrderPackageCommodities($orderHeaders)
  65. {
  66. $this->syncOrderPackageCommoditiesByOrderHeaders($orderHeaders);
  67. }
  68. public function syncOrderPackageCommoditiesByOrderHeaders(&$orderHeaders)
  69. {
  70. /**
  71. * @var DataHandlerService $dataHandService
  72. * @var CommodityService $commodityService
  73. * @var OrderPackageService $orderPackageService
  74. * @var OwnerService $ownerService
  75. */
  76. $dataHandService = app('DataHandlerService');
  77. $commodityService = app('CommodityService');
  78. $orderPackageService = app( 'OrderPackageService');
  79. $ownerService = app( 'OwnerService');
  80. if(!$orderHeaders)return ;
  81. $owner_codes = [];$sku_codes = [];$map = [];
  82. foreach ($orderHeaders as $orderHeader) {
  83. $Order_Details = $orderHeader->oracleDOCOrderDetails;
  84. $Order_Details->each(function($item)use(&$owner_codes,&$sku_codes,&$map){
  85. $owner_codes[$item['customerid']] = $item['customerid'];
  86. $sku_codes[$item['sku']] = $item['sku'];
  87. $value = [
  88. 'owner_code'=> $item['customerid'],
  89. 'sku' => $item['sku']
  90. ];
  91. $key = json_encode($value);
  92. $map[$key] = $value;
  93. });
  94. }
  95. if(count($owner_codes) ==0 || count($sku_codes) == 0)return ;
  96. $owners = $ownerService->getOwnerByCodes($owner_codes);
  97. $commodities = $commodityService->getCommoditiesByMaps($map); // 预先处理 3s
  98. $orderPackages = $orderPackageService->getByWmsOrders($orderHeaders);
  99. $orderCommodities = $this->getByWmsOrder($orderHeaders);
  100. $owner_id_map=[];
  101. foreach ($owners as $owner) {
  102. $owner_id_map[$owner['id']] = $owner;
  103. }
  104. $package_map = $dataHandService->dataHeader(['logistic_number'],$orderPackages);
  105. $orderCommodities = $this->regroupOrderCommodities($orderCommodities);
  106. $orderAllocationDetails = $this->regroupWmsOrderAllocationDetails($orderHeaders);
  107. $del_orderCommodities =[];
  108. $update_params =$this->filterUpdateParams($orderAllocationDetails,$orderCommodities,$del_orderCommodities); // 修改
  109. $inner_params = $this->filterInnerParams($orderAllocationDetails,$orderCommodities); // 创建
  110. $delete_params = $this->filterDeleteParams($orderAllocationDetails,$orderCommodities); // 删除
  111. unset($orderAllocationDetails,$orderCommodities);
  112. if(count($inner_params)>0)
  113. $this->createOrderCommodities($inner_params,$package_map,$commodities,$owner_id_map); // 创建 3s
  114. unset($inner_params,$package_map,$commodities,$owner_id_map);
  115. if(count($update_params)>0)
  116. $this->updateOrderCommodities($update_params); // 更新
  117. unset($update_params);
  118. if(count($delete_params)>0)
  119. $this->deleteOrderCommodities($delete_params); // 删除
  120. unset($delete_params);
  121. if(count($del_orderCommodities)>0)
  122. $this->deleteOrderCommodities($del_orderCommodities); // 删除
  123. unset($del_orderCommodities);
  124. }
  125. public function regroupOrderCommodities(&$orderCommodities)
  126. {
  127. $params = [];
  128. $orderCommodities->each(function($orderCommodity)use(&$params){
  129. $order_no = $orderCommodity->package->order->code ?? '';
  130. $logistic_number = $orderCommodity->package->logistic_number ?? '';
  131. $sku = $orderCommodity->commodity->sku ?? '';
  132. $key = ' orderno='.$order_no.' logsitic_number='.$logistic_number.' sku='.$sku.' ';
  133. $params[$key][] = [
  134. 'id' =>$orderCommodity->id,
  135. 'orderno'=>$order_no,
  136. 'logistic_number'=>$logistic_number,
  137. 'sku' => $sku,
  138. 'amount' => $orderCommodity->amount,
  139. 'order_package_id'=>$orderCommodity->package->id ?? '',
  140. 'commodity_id'=>$orderCommodity->commodity->id ?? '',
  141. ];
  142. });
  143. return $params;
  144. }
  145. public function regroupWmsOrderAllocationDetails(&$orderHeaders)
  146. {
  147. /**
  148. * @var OracleDOCOrderHeader $orderHeader
  149. */
  150. $params =[];
  151. foreach ($orderHeaders as $orderHeader) {
  152. $order_no = $orderHeader->orderno;
  153. $actAllocationDetails = $orderHeader->actAllocationDetails ?? [];
  154. $actAllocationDetails->each(function($item)use(&$params,$order_no){
  155. $logistic_number = $item->picktotraceid;
  156. $sku = $item->sku;
  157. $key = ' orderno='.$order_no.' logsitic_number='.$logistic_number.' sku='.$sku.' ';
  158. if(isset($params[$key])){
  159. $params[$key]['amount']+= $item->qty_each;
  160. }else{
  161. $params[$key] = [
  162. 'orderno'=>$item->orderno,
  163. 'logistic_number'=>$item->picktotraceid,
  164. 'sku' => $sku,
  165. 'amount' => $item->qty_each,
  166. 'owner_code' => $item->customerid
  167. ];
  168. }
  169. });
  170. }
  171. return $params;
  172. }
  173. public function filterUpdateParams(&$orderAllocationDetails,&$orderCommodities,&$del_orderCommodities)
  174. {
  175. $update_params = [];
  176. foreach ($orderCommodities as $key=>$orderCommodity) {
  177. if(isset($orderAllocationDetails[$key])){
  178. if(count($orderCommodity) == 1 && $orderAllocationDetails[$key]['amount'] != $orderCommodity[0]['amount']){
  179. $update_params[$key] = $orderCommodity[0];
  180. $update_params[$key]['amount'] = $orderAllocationDetails[$key]['amount'];
  181. }elseif(count($orderCommodity)>1){
  182. $update_params[$key] = array_shift($orderCommodity);
  183. $update_params[$key][0]['amount'] = $orderAllocationDetails[$key]['amount'];
  184. collect($orderCommodity)->each(function($item)use(&$del_orderCommodities){
  185. $del_orderCommodities[] = $item;
  186. });
  187. }
  188. unset($orderCommodities[$key],$orderAllocationDetails[$key]);
  189. }
  190. }
  191. return $update_params;
  192. }
  193. public function filterInnerParams(&$orderAllocationDetails,&$orderCommodities)
  194. {
  195. $inner_params = [];
  196. foreach ($orderAllocationDetails as $key=>$orderAllocationDetail) {
  197. if(!($orderCommodities[$key] ?? false)){
  198. $inner_params[] = $orderAllocationDetail;
  199. unset($orderCommodities[$key],$orderAllocationDetail);
  200. }
  201. }
  202. return $inner_params;
  203. }
  204. public function filterDeleteParams(&$orderAllocationDetails,&$orderCommodities)
  205. {
  206. $del_params = [];
  207. foreach ($orderCommodities as $key => $orderCommodity) {
  208. if(!isset($orderAllocationDetails[$key])){
  209. collect($orderCommodity)->each(function ($item)use(&$del_params){
  210. $del_params[] = $item;
  211. });
  212. unset($orderCommodities[$key]);
  213. }
  214. }
  215. return $del_params;
  216. }
  217. public function createOrderCommodities(&$inner_params,&$package_map,&$commodities,&$owner_id_map)
  218. {
  219. /** @var DataHandlerService $dataHandlerService */
  220. $dataHandlerService = app('DataHandlerService');
  221. $commodity_map = (function()use(&$commodities,&$owner_id_map){
  222. $map = [];
  223. foreach ($commodities as $commodity) {
  224. $owner = $owner_id_map[$commodity['owner_id']] ;
  225. $key = ' owner='.$owner->code.' sku='.$commodity->sku;
  226. $map[$key] = $commodity;
  227. }
  228. return $map;
  229. })();
  230. $create_params =[];
  231. $date = Carbon::now();
  232. foreach ($inner_params as $inner_param) {
  233. if($inner_param['logistic_number'] === '*' || $inner_param['logistic_number'] === ' ')continue;
  234. $package = $dataHandlerService->getKeyValue(['logistic_number'=>$inner_param['logistic_number']],$package_map);
  235. if(!$package)continue;
  236. $commodity = $commodity_map[' owner='.$inner_param['owner_code'].' sku='.$inner_param['sku']] ?? null;
  237. $create_params[] = [
  238. 'order_package_id'=>$package->id,
  239. 'commodity_id'=>$commodity->id ?? null,
  240. 'amount' => $inner_param['amount'],
  241. 'created_at' => $date,
  242. 'updated_at' => $date
  243. ];
  244. }
  245. if(count($create_params)>0){
  246. $inner_array = array_chunk($create_params,5000);
  247. foreach ($inner_array as $item) {
  248. try {
  249. $bool = $this->insert($item);
  250. LogService::log(__METHOD__, __FUNCTION__, '批量添加 orderCommodity ' . ($bool > 0 ? 'SUCCESS' : 'FAULT') . " || " . count($item) . ' || ' . json_encode($create_params));
  251. } catch (\Exception $e) {
  252. LogService::log(__METHOD__,__FUNCTION__.'error','批量添加 orderCommodity ERROR'." || ".count($item).' || '.json_encode($item). ' || '.json_encode($e->getMessage()). ' || '.json_encode($e->getTraceAsString()));
  253. }
  254. }
  255. }
  256. unset($create_params,$commodity_map);
  257. }
  258. public function updateOrderCommodities(&$orderCommodities)
  259. {
  260. if(!$orderCommodities)return ;
  261. $updated_at = Carbon::now();
  262. $update_params = [['id','order_package_id','commodity_id','amount','updated_at']];
  263. foreach ($orderCommodities as $orderCommodity) {
  264. $update_params[] = [
  265. 'id' => $orderCommodity['id'] ?? '',
  266. 'order_package_id'=>$orderCommodity['order_package_id'] ?? '',
  267. 'commodity_id'=>$orderCommodity['commodity_id'] ?? '',
  268. 'amount' => $orderCommodity['amount'],
  269. 'updated_at' => $updated_at
  270. ];
  271. }
  272. if(count($update_params)>1)
  273. $this->batchUpdate($update_params);
  274. unset($update_params);
  275. }
  276. public function deleteOrderCommodities(&$orderCommodities){
  277. /** @var OrderTrackingService $orderTrackingService */
  278. $orderTrackingService = app('OrderTrackingService');
  279. if(!$orderCommodities)return;
  280. if(count($orderCommodities)==0)return;
  281. try {
  282. $ids = data_get($orderCommodities, '*.id');
  283. if(count($ids) >0){
  284. $bool = OrderPackageCommodities::query()->whereIn('id', $ids)->delete();
  285. $orderTrackings = OrderTracking::query()->whereIn('order_package_commodity_id',$ids)->get();
  286. $orderTrackingService->deleteOrderTracings($orderTrackings);
  287. LogService::log(__METHOD__, __FUNCTION__, '批量删除 OrderCommodity ' . ($bool > 0 ? 'SUCCESS' : 'FAULT') .'||' .count($orderCommodities) . ' || ' . json_encode($orderCommodities));
  288. }
  289. } catch (\Exception $e) {
  290. LogService::log(__METHOD__, __FUNCTION__.' error', '批量删除 OrderCommodity Error' . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  291. }
  292. unset($orderCommodities);
  293. }
  294. }