StoreItemService.php 7.6 KB

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