OrderTrackingImport.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace App\Imports;
  3. use App\Commodity;
  4. use App\OracleBasSKU;
  5. use App\OracleDOCOrderHeader;
  6. use App\Order;
  7. use App\OrderPackage;
  8. use App\OrderPackageCommodities;
  9. use App\OrderTracking;
  10. use App\Owner;
  11. use App\Package;
  12. use App\Services\CommodityService;
  13. use App\Services\common\DataHandlerService;
  14. use App\Services\OracleDOCOrderHeaderService;
  15. use App\Services\OrderService;
  16. use App\Services\OrderTrackingService;
  17. use App\Shop;
  18. use Carbon\Carbon;
  19. use Illuminate\Support\Collection;
  20. use Illuminate\Support\Str;
  21. use Maatwebsite\Excel\Concerns\ToCollection;
  22. class OrderTrackingImport implements ToCollection
  23. {
  24. public $shops = [];
  25. public $commodities = [];
  26. public $bas_skus =[];
  27. public $owner = null;
  28. public $order = [];
  29. public $orderPackages = [];
  30. public $order_is = [];
  31. /**
  32. * @param Collection $collection
  33. */
  34. public function collection(Collection $collection)
  35. {
  36. /**
  37. * @var OrderTrackingService $service
  38. * @var OrderService $orderService
  39. * @var DataHandlerService $dataHandlerService
  40. * @var Order $order
  41. * @var OrderPackage $package
  42. * @var Commodity $commodity
  43. */
  44. $service = app('OrderTrackingService');
  45. $owner = Owner::query()->where('name','安桥主品')->first();
  46. $this->owner = $owner;
  47. $collection->shift();
  48. // 1 450 3 400
  49. $array = $collection->chunk(450);
  50. foreach ($array as $item_arr) {
  51. $inner_params = [];
  52. foreach ($item_arr as $items) {
  53. $order = $this->getOrder($items[1], $items);
  54. $orderPackageCommodities = $this->getOrderPackageCommodities($items);
  55. $bas_sku = $this->getBasSku((string)$items[6]);
  56. $gross_weight = round(($bas_sku->grossweight ?? 0) * $orderPackageCommodities->amount, 2);
  57. $bulk = round(($bas_sku->cube ?? 0) * $orderPackageCommodities->amount, 2);
  58. $inner_params[] = [
  59. 'order_package_commodity_id' => $orderPackageCommodities->id,
  60. 'owner_id' => $owner->id,
  61. 'web_order_number' => $items[2],
  62. 'order_client_code' => $order->client_code,
  63. 'gross_weight' => $gross_weight,
  64. 'bulk' => $bulk,
  65. ];
  66. }
  67. $this->order = [];
  68. $this->bas_skus = [];
  69. $this->shops = [];
  70. $this->order = [];
  71. $this->orderPackages = [];
  72. try {
  73. OrderTracking::query()->insert($inner_params);
  74. app('LogService')->log(__METHOD__,__FUNCTION__,'批量创建 OrderTracking'.' || '.json_encode($inner_params));
  75. } catch (\Exception $e) {
  76. app('LogService')->log(__METHOD__,'ERROR '.__FUNCTION__,'批量创建 OrderTracking ERROR'.json_encode($e->getMessage()).json_encode($e->getTraceAsString()).' || '.' || '.json_encode($inner_params));
  77. } finally {
  78. unset($inner_params,$item_arr);
  79. }
  80. }
  81. }
  82. public function getOrderPackageCommodities($items){
  83. /**
  84. * @var OrderService $orderService
  85. */
  86. $orderService = app('OrderService');
  87. $packages = $this->getPackage($items[1],$items);
  88. $packages = collect($packages);
  89. if(!$packages||$packages->isEmpty()){
  90. app('LogService')->log(__METHOD__,__FUNCTION__,'导入空值:'.json_encode($packages));
  91. };
  92. $orderPackageCommodities = null;
  93. if(count($packages)>1){
  94. $bool = false;
  95. foreach ($packages as $package) {
  96. foreach (($package->commodities ?? []) as $commodities) {
  97. if (isset($commodities->commodity) && $bool == false) {
  98. if ($commodities->commodity->sku == $items[6] && $commodities->amount == $items[8]) {
  99. $package->commodities = $package->commodities->filter(function($item)use($commodities){
  100. return $item->id != $commodities->id;
  101. });
  102. return $commodities;
  103. }
  104. }
  105. }
  106. }
  107. }elseif(count($packages)==1){
  108. $bool = false;
  109. foreach ($packages as $package) {
  110. foreach (($package->commodities ?? []) as $commodities) {
  111. if (isset($commodities->commodity) && $bool == false) {
  112. if ($commodities->commodity->sku == $items[6] && $commodities->amount == $items[8]) {
  113. $package->commodities = $package->commodities->filter(function($item)use($commodities){
  114. return $item->id != $commodities->id;
  115. });
  116. $this->orderPackages[$items[1]] = $packages;
  117. return $commodities;
  118. }
  119. }
  120. }
  121. }
  122. }
  123. if ($orderPackageCommodities == null) {
  124. $package = $packages->first();
  125. if(!$package){
  126. $order=$this->order[$items[1]];
  127. $package=$order->package;
  128. }
  129. $commodity = $this->getCommodity((string)$items[6], $items);
  130. $orderPackageCommodities = OrderPackageCommodities::query()->create(['order_package_id' => $package['id'], 'commodity_id' => $commodity->id, 'amount' => $items[8]]);
  131. }
  132. return $orderPackageCommodities;
  133. }
  134. public function getOrderHeader($soReference1){
  135. return $orderHeader = OracleDOCOrderHeader::query()->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
  136. ->with(['oracleBASCustomer'=>function($query){
  137. $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
  138. },'oracleDOCOrderDetails'=>function($query){
  139. $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
  140. }, 'actAllocationDetails'=>function($query){
  141. $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');
  142. },'oracleBASCode'=>function($query){
  143. $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
  144. }])
  145. ->where('DOC_Order_Header.SOReference1',$soReference1)
  146. ->first();
  147. }
  148. public function getShop($name){
  149. if(!empty($this->shops[$name])){
  150. return $this->shops[$name];
  151. }else{
  152. $shop = Shop::query()->firstOrCreate(['owner_id'=>$this->owner->id,'name'=>$name]);
  153. $this->shops[$name] = $shop;
  154. return $shop;
  155. }
  156. }
  157. public function getCommodity(string $sku,&$items){
  158. if(!empty($this->commodities[(string)$sku])){
  159. return $this->commodities[(string)$sku];
  160. }else{
  161. $bas_sku = $this->getBasSku((string)$sku);
  162. if($bas_sku == null){
  163. $commodity = Commodity::query()->firstOrCreate(['sku'=>$sku,'name'=>$items[7],'owner_id'=>$this->owner->id]);
  164. $this->commodities[(string)$sku] = $commodity;
  165. return $commodity;
  166. }
  167. $commodity = Commodity::query()->firstOrCreate(['sku'=>$bas_sku['sku'],'name'=>$bas_sku['descr_c'],'owner_id'=>$this->owner->id]);
  168. $this->commodities[(string)$sku] = $commodity;
  169. return $commodity;
  170. }
  171. }
  172. public function getBasSku($sku){
  173. if(!empty($this->bas_skus[(string)$sku])){
  174. return $this->bas_skus[(string)$sku];
  175. }else{
  176. $bas_sku = OracleBasSKU::query()->selectRaw('BAS_SKU.sku,BAS_SKU.customerid,BAS_SKU.grossweight,BAS_SKU.cube,BAS_SKU.descr_c')->where('sku',(string)$sku)->where('customerid',$this->owner->code)->first();
  177. $this->bas_skus[(string)$sku] = $bas_sku;
  178. return $bas_sku;
  179. }
  180. }
  181. public function getOrder($client_no,&$items){
  182. /**
  183. * @var OrderService $orderService
  184. */
  185. $orderService = app('OrderService');
  186. if( !empty($this->order[$client_no])){
  187. return $this->order[$client_no];
  188. }
  189. $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$client_no)->first();
  190. if($order){
  191. $this->order[$client_no] = $order;
  192. // if(!$order)app('LogService')->log(__METHOD__,__FUNCTION__,'get1:'.json_encode($order));
  193. return $order;
  194. }else{
  195. $orderHeader = $this->getOrderHeader($client_no);
  196. if($orderHeader){
  197. $orderService->createOrFindOrderInfo($orderHeader);
  198. $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$client_no)->first();
  199. if(!$order){
  200. $shop = $this->getShop($items[5]);
  201. $order = Order::query()->create([
  202. 'code'=>'null'.Str::uuid(),'client_code' => $items[1],'web_order_number' => $items[2],'shop_id'=>$shop->id
  203. ]);
  204. }
  205. $this->order[$client_no] = $order;
  206. unset($orderHeader);
  207. // if(!$order)app('LogService')->log(__METHOD__,__FUNCTION__,'get2:'.json_encode($order));
  208. return $order;
  209. }else{
  210. $shop = $this->getShop($items[5]);
  211. $order = Order::query()->create([
  212. 'code'=>'null'.Str::uuid(),'client_code' => $items[1],'web_order_number' => $items[2],'shop_id'=>$shop->id
  213. ]);
  214. // app('LogService')->log(__METHOD__,__FUNCTION__,'create1:'.json_encode($order));
  215. $this->order[$client_no] = $order;
  216. // if(!$order)app('LogService')->log(__METHOD__,__FUNCTION__,'get3:'.json_encode($order));
  217. return $order;
  218. }
  219. }
  220. }
  221. public function getPackage($client_code,&$items)
  222. {
  223. if(!empty($this->orderPackages[$client_code])){
  224. return $this->orderPackages[$client_code];
  225. }else{
  226. $order = $this->getOrder($client_code,$items);
  227. if($order && $order->packages->count() > 0 ){
  228. $this->orderPackages[$client_code] = $order->packages;
  229. return $order->packages;
  230. }else{
  231. $package = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>'null_'.Str::uuid()]);
  232. $list = collect();
  233. $list->push($package);
  234. $this->orderPackages[$client_code] = $list;
  235. return $list;
  236. }
  237. }
  238. }
  239. }