StoreItemService.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. namespace App\Services;
  3. use App\OracleDOCASNDetail;
  4. use App\Services\common\BatchUpdateService;
  5. use App\Services\common\DataHandlerService;
  6. use App\Store;
  7. use App\StoreItems;
  8. use Carbon\Carbon;
  9. use Illuminate\Support\Facades\DB;
  10. Class StoreItemService
  11. {
  12. public function insert(array $params)
  13. {
  14. return StoreItems::query()->insert($params);
  15. }
  16. public function storeItemCreateByWms($asnHerders)
  17. {
  18. if (!$asnHerders) return null;
  19. $asnDetails = $this->getAsnDetailsByAsnHerder($asnHerders);
  20. $this->createStoreItem($asnDetails);
  21. }
  22. public function storeItemUpdateByWms($asnHerders)
  23. {
  24. if (!$asnHerders) return null;
  25. $asnDetails = $this->getAsnDetailsByAsnHerder($asnHerders);
  26. $this->updateStoreItem($asnDetails);
  27. }
  28. public function getAsnDetailsByAsnHerder($asnHerders)
  29. {
  30. // $customerids=collect();
  31. // $asnnos=collect();
  32. // foreach ($asnHerders as $asnHerder){
  33. // $customerids->add($asnHerder->customerid);
  34. // $asnnos->add($asnHerder->asnno);
  35. // }
  36. // $customerids=$customerids->unique();
  37. // $asnnos=$asnnos->unique();
  38. // $asnDetails=OracleDOCASNDetail::query()
  39. // ->with(['lineStatus', 'qualityStatus','basSku'=>function($query)use($customerids){
  40. // $query->whereIn('customerid',$customerids);
  41. // }])
  42. // ->whereIn('asnno',$asnnos)
  43. // ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','expectedqty','addtime','edittime')
  44. // ->get();
  45. $asnDetails = collect();
  46. $asnHerders->each(function ($asnHeader) use ($asnDetails) {
  47. $asnHeader->asnDetails->each(function ($asnDetail) use ($asnDetails) {
  48. $asnDetails->add($asnDetail);
  49. });
  50. });
  51. return $asnDetails;
  52. }
  53. public function createStoreItem($asnDetails)
  54. {
  55. if ($asnDetails->isEmpty()) return null;
  56. ini_set('memory_limit','512M');
  57. $stores = Store::query()->whereIn('asn_code', array_unique(data_get($asnDetails, '*.asnno')))->get();
  58. $store_asn_code_map = [];
  59. foreach ($stores as $store) {
  60. $store_asn_code_map[$store->asn_code] = $store;
  61. }
  62. $params = $this->getParamsByAsnDetails($asnDetails, $store_asn_code_map);
  63. if (count($params) > 0) $this->insertStoreItem($params);
  64. }
  65. public function getParamsByAsnDetails($asnDetails, $store_asn_code_map)
  66. {
  67. /** @var DataHandlerService $dataHandlerService */
  68. $dataHandlerService = app(DataHandlerService::class);
  69. $storeItems = $this->getByWms($asnDetails);
  70. $storeItem_map = $dataHandlerService->dataHeader(['store_asn_code', 'asn_line_code', 'sku'], $storeItems);
  71. $params = [];
  72. foreach ($asnDetails as $asnDetail) {
  73. $storeItem = $dataHandlerService
  74. ->getKeyValue(['store_asn_code' => $asnDetail->asnno, 'asn_line_code' => $asnDetail->asnlineno, 'sku' => $asnDetail->sku], $storeItem_map);
  75. if ($storeItem ?? false) continue;
  76. $status=null;
  77. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='完全收货') $status='已入库';
  78. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='订单创建') $status='未入库';
  79. //if (empty($store_asn_code_map[$asnDetail->asnno])) continue;
  80. $params[] = [
  81. 'store_id' => $store_asn_code_map[$asnDetail->asnno]['id'],
  82. 'asn_line_code' => (string)$asnDetail->asnlineno,
  83. 'name' => $asnDetail->skudescrc,
  84. 'sku' => $asnDetail->sku,
  85. 'barcode' => $asnDetail->basSku ? $asnDetail->basSku->alternate_sku1 : '',
  86. 'amount' => $asnDetail->receivedqty ?? 0,
  87. 'quality' => $asnDetail->qualityStatus ? $asnDetail->qualityStatus->codename_c : '',
  88. 'status' => $status ? $status :$asnDetail->lineStatus->codename_c,
  89. 'created_at' => $asnDetail->addtime ?? null,
  90. 'updated_at' => $asnDetail->edittime ?? null,
  91. ];
  92. }
  93. return $params;
  94. }
  95. public function insertStoreItem(array $params)
  96. {
  97. if (count($params) === 0) return;
  98. foreach (array_chunk($params, 1000) as $item) {
  99. try {
  100. $bool = $this->insert($item);
  101. if ($bool) {
  102. app('LogService')->log(__METHOD__, __FUNCTION__, "批量创建 store_item success " . count($item) . ' || ' . json_encode($item));
  103. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 store_item FAILED " . ' || ' . json_encode($item));
  104. } catch (\Exception $e) {
  105. app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 store_item ERROR " . ' || ' . json_encode($params) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  106. }
  107. }
  108. }
  109. public function updateStoreItem($asnDetails)
  110. {
  111. if (!$asnDetails || $asnDetails->count() == 0) {
  112. return null;
  113. }
  114. /** @var DataHandlerService $dataHandlerService */
  115. $dataHandlerService = app(DataHandlerService::class);
  116. $storeItems = $this->getByWms($asnDetails);
  117. $asnDetails_map = $dataHandlerService->dataHeader(['asnno', 'asnlineno', 'sku'], $asnDetails);
  118. $updateParams = [[
  119. 'id', 'store_id', 'asn_line_code', 'name', 'sku', 'barcode', 'amount', 'quality', 'status', 'created_at', 'updated_at'
  120. ]];
  121. $delete_storeItems = [];
  122. foreach ($storeItems as $storeItem) {
  123. $asnDetail = $dataHandlerService
  124. ->getKeyValue(['asnno' => $storeItem->store_asn_code, 'asnlineno' => $storeItem->asn_line_code, 'sku' => $storeItem->sku], $asnDetails_map);
  125. if (!$asnDetail) {
  126. array_push($delete_storeItems, $storeItem);
  127. continue;
  128. }
  129. $status=null;
  130. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='完全收货') $status='已入库';
  131. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='订单创建') $status='未入库';
  132. if ($storeItem->asn_line_code != $asnDetail['asnlineno'] ||
  133. $storeItem->name != $asnDetail['skudescrc'] ||
  134. $storeItem->sku != $asnDetail['sku'] ||
  135. $storeItem->barcode != $asnDetail['basSku']['alternate_sku1'] ||
  136. $storeItem->amount != $asnDetail['receivedqty'] ||
  137. $storeItem->quality != $asnDetail['qualityStatus'] ?? $asnDetail['qualityStatus']['codename_c'] ||
  138. $storeItem->status != $asnDetail['lineStatus'] ?? $asnDetail['lineStatus']['codename_c'] ||
  139. $storeItem->created_at != $asnDetail['addtime'] ||
  140. $storeItem->updated_at != $asnDetail['edittime']) {
  141. $updateParams[] = [
  142. 'id' => $storeItem->id,
  143. 'store_id' => $storeItem->store->id,
  144. 'asn_line_code' => (string)$asnDetail['asnlineno'],
  145. 'name' => $asnDetail['skudescrc'],
  146. 'sku' => $asnDetail['sku'],
  147. 'barcode' => $asnDetail['basSku'] ? $asnDetail['basSku']['alternate_sku1'] : '',
  148. 'amount' => $asnDetail['receivedqty'] ?? 0,
  149. 'quality' => $asnDetail['qualityStatus'] ? $asnDetail['qualityStatus']['codename_c'] : '',
  150. 'status' => $status ? $status :$asnDetail['lineStatus']['codename_c'],
  151. 'created_at' => $asnDetail['addtime'] ?? null,
  152. 'updated_at' => $asnDetail['edittime'],
  153. ];
  154. }
  155. }
  156. if (count($updateParams) > 0) {
  157. foreach (array_chunk($updateParams, 1000) as $item) {
  158. try {
  159. $bool=$this->batchUpdate($item);
  160. if ($bool) {
  161. app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store_item success " . count($item) . ' || ' . json_encode($item));
  162. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store_item FAILED " . ' || ' . json_encode($item));
  163. } catch (\Exception $e) {
  164. app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store_item ERROR " . ' || ' . json_encode($updateParams) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  165. }
  166. }
  167. }
  168. if (count($delete_storeItems) > 0) $this->deleteStoreItem($delete_storeItems);
  169. unset($updateParams, $asnDetails, $delete_storeItems);
  170. }
  171. public function batchUpdate($params)
  172. {
  173. return app(BatchUpdateService::class)->batchUpdate('store_items', $params);
  174. }
  175. public function getByWms($asnDetails)
  176. {
  177. if (!$asnDetails) {
  178. return null;
  179. }
  180. return StoreItems::query()->with('store')->whereIn('store_id', function ($query) use ($asnDetails) {
  181. $query->from('stores')->select('id')->whereIn('asn_code', array_unique(data_get($asnDetails, '*.asnno')));
  182. })->get();
  183. }
  184. public function deleteStoreItem(array $delete_storeItems)
  185. {
  186. $storeItemIds = [];
  187. foreach ($delete_storeItems as $delete_storeItem) {
  188. array_push($storeItemIds, $delete_storeItem->id);
  189. }
  190. try {
  191. StoreItems::query()->whereIn('id', $storeItemIds)->delete();
  192. LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems ' . count($delete_storeItems) . json_encode($delete_storeItems), null);
  193. } catch (\Exception $e) {
  194. LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems error' . count($delete_storeItems) . json_encode($delete_storeItems) . $e->getMessage() . $e->getTraceAsString(), null);
  195. }
  196. }
  197. }