OrderPackageCommoditiesService.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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\Owner;
  12. use App\Services\common\BatchUpdateService;
  13. use Carbon\Carbon;
  14. class OrderPackageCommoditiesService
  15. {
  16. public function basedOnOracleDetailsStore($orderNo, $orderPackage)
  17. {
  18. $details = OracleDOCOrderDetail::query()->where('orderNo', $orderNo)->get();
  19. $orderPackageCommodities = OrderPackageCommodities::query()->where('order_package_id',$orderPackage['id'])->get();
  20. $this->根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,'qtyordered');
  21. unset($details,$orderPackageCommodities);
  22. }
  23. public function basedOnActAllocationDetailsStoreByOrderNo($orderNo,$orderPackage){
  24. $details = OracleActAllocationDetails::query()->where('orderno', $orderNo)->get();
  25. $orderPackageCommodities = OrderPackageCommodities::query()->where('order_package_id',$orderPackage['id'])->get();
  26. $this->根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,'qty');
  27. unset($details,$orderPackageCommodities);
  28. }
  29. public function 根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,$key){
  30. $newItems = [];
  31. foreach ($details as $detail) {
  32. $owner = Owner::query()->where(['code' => $detail['customerid']])->first(); // 货主
  33. $sku = $detail->sku; // sku
  34. $owner_id = $owner->id; // 货主id
  35. $commodity = Commodity::query()->where(['sku' => $sku, 'owner_id' => $owner_id])->first(); // 商品
  36. if ($commodity == null) {
  37. $basSku = OracleBasSKU::query()->where(['sku' => $sku, 'customerid' => $detail->customerid])->first(); // 没有找到对应的商品信息
  38. $commodity = Commodity::query()->create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
  39. }
  40. $data = ['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail[$key]];
  41. array_push($newItems,$data);
  42. }
  43. $diffarr = [];
  44. foreach ($newItems as $newItem) {
  45. $packageCommodity = $orderPackageCommodities->where('order_package_id',$newItem['order_package_id'])->where('commodity_id',$newItem['commodity_id'])->first();
  46. if($packageCommodity!=null){
  47. if($packageCommodity['amount'] != $newItem['amount']){
  48. $packageCommodity->update(['amount'=>intval($newItem['amount'])]);
  49. }
  50. $orderPackageCommodities = $orderPackageCommodities->filter(function ($item) use ($packageCommodity){
  51. if($item['id'] == $packageCommodity['id']){
  52. return false;
  53. }
  54. return true;
  55. });
  56. array_push($diffarr,$newItem);
  57. }
  58. }
  59. if($orderPackageCommodities->count() > 0){
  60. foreach ($orderPackageCommodities as $orderPackageCommodity) {
  61. $id = $orderPackageCommodity['id'];
  62. OrderPackageCommodities::destroy($id);
  63. }
  64. }
  65. $newItems = array_filter($newItems,function($newItem) use ($diffarr){
  66. foreach ($diffarr as $item) {
  67. if($item['order_package_id'] == $newItem['order_package_id'] &&
  68. $item['commodity_id'] == $newItem['commodity_id'] &&
  69. $item['amount'] == $newItem['amount']){
  70. return false;
  71. }
  72. }
  73. return true;
  74. });
  75. try {
  76. if(count($newItems) > 0 ){
  77. OrderPackageCommodities::query()->insert($newItems);
  78. LogService::log(__METHOD__,__FUNCTION__,'添加包裹商品信息'.json_encode($newItems));
  79. }
  80. } catch (\Exception $e) {
  81. LogService::log(__METHOD__,__FUNCTION__,'添加包裹商品信息异常'.json_encode($newItems).$e->getMessage(),$e->getTraceAsString());
  82. } finally {
  83. unset($newItems,$orderPackageCommodities);
  84. }
  85. }
  86. public function basedOnActAllocationDetailsStore($orderPackage)
  87. {
  88. $details = OracleActAllocationDetails::query()->where('picktotraceid', $orderPackage->logistic_number)->get();
  89. $orderPackageCommodities = OrderPackageCommodities::query()->where('order_package_id',$orderPackage['id'])->get();
  90. $this->根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,'qty');
  91. unset($details,$orderPackageCommodities);
  92. }
  93. public function basedOnActAllocationDetail(Order $order, OracleDOCOrderHeader $header, array $details)
  94. {
  95. foreach ($details as $detail) {
  96. $logistic_number = $details['picktotraceid'];
  97. if ($logistic_number == '*' || $logistic_number == null || $logistic_number == '') {
  98. $logistic_number = $header['soreference5'];
  99. if ($logistic_number == '*' || $logistic_number == null || $logistic_number == '') {
  100. continue;
  101. }
  102. }
  103. $orderPackage = OrderPackage::query()->firstOrCreate(['order_id'=>$order['id'],'logistic_number',$details]);
  104. $this->createByActAllocationDetail($detail, $orderPackage);
  105. }
  106. }
  107. private function createByActAllocationDetail($detail,$orderPackage)
  108. {
  109. $owner = Owner::query()->where(['code' => $detail->customerid])->first(); // 货主
  110. $sku = $detail->sku;
  111. $owner_id = $owner['id'];
  112. $commodity = Commodity::query()->where(['sku' => $sku, 'owner_id' => $owner_id])->first();
  113. if ($commodity == null) {
  114. $basSku = OracleBasSKU::query()->where(['sku' => $sku, 'customerid' => $detail->customerid])->first();
  115. $commodity = Commodity::query()->create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
  116. }
  117. try {
  118. $count = OrderPackageCommodities::query()->where(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qty']])->count();
  119. if($count == 0){
  120. $orderPackageCommodities = OrderPackageCommodities::query()->firstOrCreate(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qty']]);
  121. LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹详情'.json_encode($orderPackageCommodities));
  122. }
  123. } catch (\Exception $e) {
  124. LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹失败'.$e->getMessage().$e->getTraceAsString());
  125. } finally {
  126. return $orderPackageCommodities ?? null;
  127. }
  128. }
  129. public function getOrderPackageCommoditiesByOrderId($orderId)
  130. {
  131. $order = Order::query()->where('id', $orderId)->first();
  132. if (!$order) {
  133. return null;
  134. }
  135. $orderPackageIds = OrderPackage::query()->select('id')->where('order_id', $order['id'])->get();
  136. if (!$orderPackageIds) {
  137. return null;
  138. }
  139. return OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id', $orderPackageIds)->get();
  140. }
  141. public function createByOrderDetail(OracleDOCOrderDetail $detail, OrderPackage $orderPackage)
  142. {
  143. $owner = Owner::query()->where('code', $detail['customerid'])->first(); // 货主
  144. $sku = $detail->sku; // sku
  145. $owner_id = $owner->id; // 货主id
  146. $commodity = Commodity::query()->where('sku', $sku)->where('owner_id', $owner_id)->first(); // 商品
  147. if ($commodity == null) {
  148. $basSku = OracleBasSKU::query()->where('sku', $sku)->where('customerid' , $detail->customerid)->first(); // 没有找到对应的商品信息
  149. $commodity = Commodity::query()->create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
  150. }
  151. return OrderPackageCommodities::query()->create(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qtyordered']]);
  152. }
  153. public function 根据WMS订单信息创建WAS订单包裹商品($orderHeaders,$oracleDOCOrderDetails,$actAllocationDetails,$orders)
  154. {
  155. /** @var CommodityService $commodityService */
  156. $commodityService = app('commodityService');
  157. $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders); // 商品
  158. $orderPackages = [];
  159. $orderList = [];
  160. foreach ($orders as $order) {
  161. $orderList[$order['id']] = $order;
  162. $packages = $order['packages'] ?? [];
  163. foreach ($packages as $package) {
  164. $orderPackages[$package['logistic_number']] = $package;
  165. }
  166. }
  167. $fillables = [];
  168. foreach ($orderPackages as $key=>$orderPackage) {
  169. $logistic_number = $key;
  170. $order = $orderList[$orderPackage['order_id']];
  171. $details1 = $actAllocationDetails[strval($logistic_number)] ?? [];
  172. $details2 = [];
  173. if(count($details1)== 0){
  174. $details2 = $actAllocationDetails[$order['code']] ?? [];
  175. }
  176. if(count($details1) > 0 || count($details2) > 0){
  177. $items = $this->根据订单分配详情返回创建数组($details1,$orderPackage,$commodities,$order);
  178. foreach ($items as $item){
  179. $fillables[] = $item;
  180. }
  181. $items = $this->根据订单分配详情返回创建数组($details2,$orderPackage,$commodities,$order);
  182. foreach ($items as $item){
  183. $fillables[] = $item;
  184. }
  185. continue;
  186. }
  187. $details = $oracleDOCOrderDetails[$order['code']] ?? [];
  188. if($details->count() >0){
  189. $items = $this->根据订单详情返回创建数组($details,$orderPackage,$commodities,$order);
  190. foreach ($items as $item){
  191. $fillables[] = $item;
  192. }
  193. }
  194. }
  195. try {
  196. if(count($fillables) > 0){
  197. OrderPackageCommodities::query()->insert($fillables);
  198. LogService::log(__METHOD__,__FUNCTION__,'批量创建'.count($fillables).json_encode($fillables));
  199. }
  200. } catch (\Exception $e) {
  201. LogService::log(__METHOD__,__FUNCTION__,'批量创建异常:'.$e->getMessage().$e->getTraceAsString());
  202. } finally {
  203. $orderIds = data_get($orders,'*.id');
  204. return Order::query()->with('packages.commodities')->whereIn('id',$orderIds)->get();
  205. }
  206. }
  207. // XXX 逻辑优化 删除不存在未完成
  208. public function 更新WAS订单快递打包商品信息($orderHeaders,$orders,$commodities)
  209. {
  210. $newItems = $this->获取WMS订单打包信息($orderHeaders,$commodities,$orders);
  211. $orderPackagesCommodities = $this->basedOrdersReturnOrderPackageCommodities($orders);
  212. $multipleData = [['id','order_package_id','commodity_id']];
  213. $packageCommodity_list_amount = [];
  214. $packageCommodity_list = [];
  215. foreach ($orderPackagesCommodities as $item) {
  216. $key = 'order_package_id='.$item['order_package_id'].' commodity_id='.$item['commodity_id'].' amount='.$item['amount'];
  217. if(!($packageCommodity_list_amount[$key] ?? false)){
  218. $packageCommodity_list_amount[$key] = [];
  219. }
  220. $packageCommodity_list_amount[$key][] = $item;
  221. $key2 = 'order_package_id'.$item['order_package_id'].' commodity_id='.$item['commodity_id'];
  222. if($packageCommodity_list[$key2] ?? false){
  223. $packageCommodity_list[$key2] = [];
  224. }
  225. $packageCommodity_list[$key2][] = $item;
  226. }
  227. foreach ($newItems as $key=>$newItem) {
  228. $key1 = 'order_package_id='.$newItem['order_package_id'].' commodity_id='.$newItem['commodity_id'].' amount='.$newItem['amount'];
  229. $packageCommodity = $packageCommodity_list_amount[$key1][0] ?? false;
  230. if($packageCommodity ?? false){
  231. unset($newItems[$key]);
  232. array_shift($packageCommodity_list_amount[$key1]);
  233. }else{
  234. $key2 = 'order_package_id'.$newItem['order_package_id'].' commodity_id='.$newItem['commodity_id'];
  235. $packageCommodity = $packageCommodity_list[$key2][0] ?? false;
  236. if($packageCommodity ?? false) {
  237. $amount = intval($newItem['amount']);
  238. if($packageCommodity['amount'] !== $amount){
  239. $data = [
  240. 'order_package_id' => $packageCommodity['order_package_id'],
  241. 'commodity_id' => $packageCommodity['commodity_id'],
  242. 'amount' => $amount,
  243. ];
  244. $multipleData[] = $data;
  245. }
  246. array_shift($packageCommodity_list[$key2]);
  247. unset($newItems[$key]);
  248. }
  249. }
  250. }
  251. try {
  252. if (count($newItems) > 0) {
  253. OrderPackageCommodities::query()->insert($newItems);
  254. LogService::log(__METHOD__, __FUNCTION__, '添加打包信息' . json_encode($newItems));
  255. }
  256. }catch (\Exception $e) {
  257. LogService::log(__METHOD__, __FUNCTION__, '添加打包信息失败' . json_encode($newItems).$e->getMessage().$e->getTraceAsString());
  258. }
  259. if(count($multipleData) > 1){
  260. try {
  261. /** @var BatchUpdateService $batchUpdateService */
  262. $batchUpdateService = app('batchUpdateService');
  263. $batchUpdateService->batchUpdate('order_package_commodities', $multipleData);
  264. LogService::log(__METHOD__,__FUNCTION__,'批量更新'.count($multipleData).json_encode($multipleData));
  265. } catch (\Exception $e) {
  266. LogService::log(__METHOD__,__FUNCTION__,'批量更新失败'.json_encode($multipleData).$e->getMessage(),$e->getTraceAsString());
  267. } finally {
  268. unset($multipleData);
  269. }
  270. }
  271. }
  272. private function 获取WMS订单打包信息($orderHeaders,$commodities,$orders){
  273. $newItems = [];
  274. $commodities_list = [];
  275. foreach ($commodities as $commodity) {
  276. $key = 'sku='.$commodity['sku'].' owner_id='.$commodity['owner_id'];
  277. $commodities_list[$key] = $commodity;
  278. }
  279. foreach ($orderHeaders as $orderHeader) {
  280. $order = $orders[$orderHeader['orderno']] ?? null;
  281. if(isset($order)){
  282. continue;
  283. }
  284. $orderPackages = $order['packages'];
  285. $oracleDOCOrderDetails = $orderHeader['oracleDOCOrderDetails'] ?? [];
  286. $actAllocationDetails = $orderHeader['actAllocationDetails'] ?? [];
  287. if($actAllocationDetails->count() > 0){
  288. foreach ($orderPackages as $orderPackage) {
  289. $details = [];
  290. if($orderPackage['logistic_number'] == $orderHeader['soreference5'] ){
  291. foreach ($actAllocationDetails as $detail) {
  292. if($detail['picktotraceid'] == '*' || $detail['picktotraceid'] == $orderHeader['soreference5'])
  293. $details[] = $detail;
  294. }
  295. }else{
  296. $logistic_number = $orderPackage['logistic_number'];
  297. foreach ($actAllocationDetails as $detail) {
  298. if($detail['picktotraceid'] == $logistic_number)
  299. $details[] = $detail;
  300. }
  301. }
  302. $addArr = $this->basedDetailsReturnFillables($details,$orderPackage,$commodities_list,$order,'qty');
  303. $newItems = array_merge($newItems,$addArr);
  304. }
  305. }elseif($oracleDOCOrderDetails->count() > 0){
  306. foreach ($orderPackages as $orderPackage) {
  307. $details = [];
  308. $logistic_number = $orderPackage['logistic_number'];
  309. foreach ($actAllocationDetails as $detail) {
  310. if($detail['dropid'] == $logistic_number){
  311. array_push($details,$detail);
  312. }
  313. }
  314. $addArr = $this->basedDetailsReturnFillables($details,$orderPackage,$commodities_list,$order,'qtyordered');
  315. $newItems = array_merge($newItems,$addArr);
  316. }
  317. }
  318. }
  319. return $newItems;
  320. }
  321. public function 根据订单详情返回创建数组($details,$orderPackage,$commodities,$order){
  322. $orderPackagerCommodities = [];
  323. foreach ($details as $detail) {
  324. $commodity = $commodities->where('sku', $detail['sku'])->where('owner_id', $order['owner_id'])->first();
  325. $fillable = [
  326. 'order_package_id' => $orderPackage['id'] ?? '',
  327. 'commodity_id' => $commodity['id'] ?? '',
  328. 'amount' => $detail['qtyordered'],
  329. ];
  330. $orderPackagerCommodities[] = $fillable;
  331. }
  332. return $orderPackagerCommodities;
  333. }
  334. public function 根据订单分配详情返回创建数组($details,$orderPackage,$commodities,$order){
  335. $orderPackagerCommodities = [];
  336. foreach ($details as $detail) {
  337. $commodity = $commodities->where('sku', $detail['sku'])->where('owner_id', $order['owner_id'])->first();
  338. $fillable = [
  339. 'order_package_id' => $orderPackage['id'] ?? '',
  340. 'commodity_id' => $commodity['id'] ?? '',
  341. 'amount' => $detail['qty'] ?? '',
  342. ];
  343. array_push($orderPackagerCommodities,$fillable);
  344. }
  345. return $orderPackagerCommodities;
  346. }
  347. public function basedOrdersReturnOrderPackageCommodities($orders){
  348. $orderPackageCommodities = [];
  349. foreach ($orders as $order) {
  350. foreach ($order['packages'] as $package) {
  351. foreach ($package['commodities'] as $commodity) {
  352. $orderPackageCommodities[] = $commodity;
  353. }
  354. }
  355. }
  356. return $orderPackageCommodities;
  357. }
  358. public function basedDetailsReturnFillables($details,$orderPackage,$commoditiesMap,$order,$column){
  359. $orderPackagerCommodities = [];
  360. foreach ($details as $detail) {
  361. $key = 'sku='.$detail['sku'].' owner_id='.$order['owner_id'];
  362. $commodity = $commoditiesMap[$key];
  363. $fillable = [
  364. 'order_package_id' => $orderPackage['id'] ?? '',
  365. 'commodity_id' => $commodity['id'] ?? '',
  366. 'amount' => $detail[$column] ?? '',
  367. ];
  368. array_push($orderPackagerCommodities,$fillable);
  369. }
  370. return $orderPackagerCommodities;
  371. }
  372. }