StoreItemService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. namespace App\Services;
  3. use App\OracleDOCASNDetail;
  4. use App\Owner;
  5. use App\Services\common\BatchUpdateService;
  6. use App\Services\common\DataHandlerService;
  7. use App\Store;
  8. use App\StoreItems;
  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. $asnnos = collect();
  30. foreach ($asnHerders as $asnHerder) {
  31. $asnnos->add($asnHerder->asnno);
  32. }
  33. $asnnos = $asnnos->unique()->toArray();
  34. $asnDetails=OracleDOCASNDetail::query()
  35. ->with(['lineStatus', 'qualityStatus'])
  36. ->whereIn('asnno',$asnnos)
  37. ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','expectedqty','addtime','edittime')
  38. ->get();
  39. //dd($asnDetails->first());
  40. // $db = DB::connection('oracle');
  41. // $sql = <<<sql
  42. // SELECT d.asnno,d.ASNLINENO,d.SKUDESCRC,d.CUSTOMERID,d.SKU,c.CODENAME_C as lotatt08,b.CODENAME_C as linestatus,d.lotatt05,
  43. // d.receivedqty,d.expectedqty,d.addtime,d.edittime FROM DOC_ASN_DETAILS d
  44. // LEFT JOIN BAS_CODES b ON d.linestatus = b.code AND 'ASN_STS' = b.codeid
  45. // LEFT JOIN BAS_CODES c ON d.lotatt08 = c.code AND 'QLT_STS' = c.codeid WHERE d.ASNNO in (
  46. //sql;
  47. // $asno_str = '';
  48. // foreach ($asnnos as $str) $asno_str .= "'" . $str . "',";
  49. // $asno_str = rtrim($asno_str, ',');
  50. // $sql=$sql.$asno_str.")";
  51. // $asnDetails = $db->select(DB::raw($sql));
  52. // $asnDetails=collect($asnDetails);
  53. // $asnDetails = collect();
  54. // $asnHerders->each(function ($asnHeader) use ($asnDetails) {
  55. // $asnHeader->asnDetails->each(function ($asnDetail) use ($asnDetails) {
  56. // $asnDetails->add($asnDetail);
  57. // });
  58. // });
  59. return $asnDetails;
  60. }
  61. public function createStoreItem($asnDetails)
  62. {
  63. if ($asnDetails->isEmpty()) return null;
  64. ini_set('memory_limit', '512M');
  65. $stores = Store::query()->whereIn('asn_code', array_unique(data_get($asnDetails, '*.asnno')))->get();
  66. $store_asn_code_map = [];
  67. foreach ($stores as $store) {
  68. $store_asn_code_map[$store->asn_code] = $store;
  69. }
  70. $params = $this->getParamsByAsnDetails($asnDetails, $store_asn_code_map);
  71. if (count($params) > 0) $this->insertStoreItem($params);
  72. }
  73. public function getParamsByAsnDetails($asnDetails, $store_asn_code_map)
  74. {
  75. /**
  76. * @var DataHandlerService $dataHandlerService
  77. * @var CommodityService $commodityService
  78. */
  79. $dataHandlerService = app(DataHandlerService::class);
  80. $commodityService = app(CommodityService::class);
  81. $owners = Owner::query()->whereIn('code', array_unique(data_get($asnDetails,'*.customerid')))->get();
  82. $owner_map=[];
  83. foreach ($owners as $owner){
  84. $owner_map[$owner->code]=$owner->id;
  85. }
  86. $maps = [];
  87. foreach ($asnDetails as $asnDetail) {
  88. $value = [
  89. 'owner_code' => $asnDetail->customerid,
  90. 'sku' => $asnDetail->sku,
  91. ];
  92. $maps[json_encode($value)] = $value;
  93. }
  94. $commodities=$commodityService->getCommoditiesByMaps($maps);
  95. $commodities_map= $dataHandlerService->dataHeader(['owner_id','sku'], $commodities);
  96. $storeItems = $this->getByWms($asnDetails);
  97. $storeItem_map = $dataHandlerService->dataHeader(['store_asn_code', 'asn_line_code', 'commodity_id'], $storeItems);
  98. $params = [];
  99. foreach ($asnDetails as $asnDetail) {
  100. $commodity=$dataHandlerService->getKeyValue(['owner_id'=>$owner_map[$asnDetail->customerid],'sku'=>$asnDetail->sku],$commodities_map);
  101. if (!$commodity)continue;
  102. $storeItem = $dataHandlerService
  103. ->getKeyValue(['store_asn_code' => $asnDetail->asnno, 'asn_line_code' => $asnDetail->asnlineno, 'commodity_id' => $commodity->id], $storeItem_map);
  104. if ($storeItem ?? false) continue;
  105. $status = null;
  106. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c == '完全收货') $status = '已入库';
  107. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c == '订单创建') $status = '未入库';
  108. //if (empty($store_asn_code_map[$asnDetail->asnno])) continue;
  109. $params[] = [
  110. 'store_id' => $store_asn_code_map[$asnDetail->asnno]['id'],
  111. 'asn_line_code' => (string)$asnDetail->asnlineno,
  112. 'commodity_id' => $commodity->id,
  113. 'name' => $asnDetail->skudescrc,
  114. 'sku' => $asnDetail->sku,
  115. 'amount' => $asnDetail->receivedqty ?? 0,
  116. 'quality' => $asnDetail->qualityStatus ? $asnDetail->qualityStatus->codename_c :'',
  117. 'status' => $status ? $status : $asnDetail->lineStatus->codename_c,
  118. 'created_at' => $asnDetail->addtime ?? null,
  119. 'updated_at' => $asnDetail->edittime ?? null,
  120. ];
  121. }
  122. return $params;
  123. }
  124. public function insertStoreItem(array $params)
  125. {
  126. if (count($params) === 0) return;
  127. foreach (array_chunk($params, 1000) as $item) {
  128. try {
  129. $bool = $this->insert($item);
  130. if ($bool) {
  131. app('LogService')->log(__METHOD__, __FUNCTION__, "批量创建 store_item success " . count($item) . ' || ' . json_encode($item));
  132. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 store_item FAILED " . ' || ' . json_encode($item));
  133. } catch (\Exception $e) {
  134. app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 store_item ERROR " . ' || ' . json_encode($params) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  135. }
  136. }
  137. }
  138. public function updateStoreItem($asnDetails)
  139. {
  140. if (!$asnDetails || $asnDetails->count() == 0) return null;
  141. /**
  142. * @var DataHandlerService $dataHandlerService
  143. * @var CommodityService $commodityService
  144. */
  145. $dataHandlerService = app(DataHandlerService::class);
  146. $commodityService = app(CommodityService::class);
  147. $owners = Owner::query()->whereIn('code', array_unique(data_get($asnDetails,'*.customerid')))->get();
  148. $owner_map=[];
  149. foreach ($owners as $owner){
  150. $owner_map[$owner->id]=$owner->code;
  151. }
  152. $maps = [];
  153. foreach ($asnDetails as $asnDetail) {
  154. $value = [
  155. 'owner_code' => $asnDetail->customerid,
  156. 'sku' => $asnDetail->sku,
  157. ];
  158. $maps[json_encode($value)] = $value;
  159. }
  160. $commodities=$commodityService->getCommoditiesByMaps($maps);
  161. $commodities_map= $dataHandlerService->dataHeader(['id'], $commodities);
  162. $storeItems = $this->getByWms($asnDetails);
  163. $asnDetails_map = $dataHandlerService->dataHeader(['asnno', 'asnlineno','customerid','sku'], $asnDetails);
  164. $updateParams = [[
  165. 'id', 'store_id', 'asn_line_code', 'name', 'sku', 'barcode', 'amount', 'quality', 'status', 'created_at', 'updated_at'
  166. ]];
  167. $delete_storeItems = [];
  168. foreach ($storeItems as $storeItem) {
  169. $commodity= $dataHandlerService->getKeyValue(['id'=>$storeItem->commodity_id],$commodities_map);if (!$commodity) continue;
  170. $asnDetail = $dataHandlerService
  171. ->getKeyValue(['asnno' => $storeItem->store_asn_code, 'asnlineno' => $storeItem->asn_line_code,'customerid'=>$owner_map[$commodity->owner_id],'sku' => $commodity->sku], $asnDetails_map);
  172. if (!$asnDetail) {
  173. array_push($delete_storeItems, $storeItem);
  174. continue;
  175. }
  176. $status = null;
  177. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c == '完全收货') $status = '已入库';
  178. if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c == '订单创建') $status = '未入库';
  179. if ($storeItem->updated_at != $asnDetail->edittime ||
  180. $storeItem->status !=$asnDetail->lineStatus->codename_c||
  181. $storeItem->quality !=$asnDetail->qualityStatus->codename_c
  182. ) {
  183. $updateParams[] = [
  184. 'id' => $storeItem->id,
  185. 'store_id' => $storeItem->store->id,
  186. 'asn_line_code' => (string)$asnDetail->asnlineno,
  187. 'name' => $asnDetail->skudescrc,
  188. 'sku' => $asnDetail->sku,
  189. 'amount' => $asnDetail->receivedqty ?? 0,
  190. 'quality' => $asnDetail->qualityStatus ? $asnDetail->qualityStatus->codename_c :'',
  191. 'status' => $status ? $status : $asnDetail->lineStatus->codename_c,
  192. 'created_at' => $asnDetail->addtime ?? null,
  193. 'updated_at' => $asnDetail->edittime ?? null,
  194. ];
  195. }
  196. }
  197. if (count($updateParams) > 0) {
  198. foreach (array_chunk($updateParams, 1000) as $item) {
  199. try {
  200. $bool = $this->batchUpdate($item);
  201. if ($bool) {
  202. app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store_item success " . count($item) . ' || ' . json_encode($item));
  203. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store_item FAILED " . ' || ' . json_encode($item));
  204. } catch (\Exception $e) {
  205. app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store_item ERROR " . ' || ' . json_encode($updateParams) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  206. }
  207. }
  208. }
  209. if (count($delete_storeItems) > 0) $this->deleteStoreItem($delete_storeItems);
  210. unset($updateParams, $asnDetails, $delete_storeItems);
  211. }
  212. public function batchUpdate($params)
  213. {
  214. return app(BatchUpdateService::class)->batchUpdate('store_items', $params);
  215. }
  216. public function getByWms($asnDetails)
  217. {
  218. if (!$asnDetails) {
  219. return null;
  220. }
  221. return StoreItems::query()->with('store')->whereIn('store_id', function ($query) use ($asnDetails) {
  222. $query->from('stores')->select('id')->whereIn('asn_code', array_unique(data_get($asnDetails, '*.asnno')));
  223. })->get();
  224. }
  225. public function deleteStoreItem(array $delete_storeItems)
  226. {
  227. $storeItemIds = [];
  228. foreach ($delete_storeItems as $delete_storeItem) {
  229. array_push($storeItemIds, $delete_storeItem->id);
  230. }
  231. try {
  232. StoreItems::query()->whereIn('id', $storeItemIds)->delete();
  233. LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems ' . count($delete_storeItems) . json_encode($delete_storeItems), null);
  234. } catch (\Exception $e) {
  235. LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems error' . count($delete_storeItems) . json_encode($delete_storeItems) . $e->getMessage() . $e->getTraceAsString(), null);
  236. }
  237. }
  238. }