StoreItemService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. return DB::table('store_items')->insert($params);
  13. }
  14. public function storeItemCreateByWms($asnHerders)
  15. {
  16. if ($asnHerders->isEmpty())return null;
  17. $asnDetails=collect();
  18. $asnHerders->each(function ($asnHeader)use($asnDetails){
  19. $asnHeader->asnDetails->each(function ($asnDetail)use($asnDetails){
  20. $asnDetails->add($asnDetail);
  21. });
  22. });
  23. $this->createStoreItem($asnDetails);
  24. }
  25. public function storeItemUpdateByWms($asnHerders)
  26. {
  27. if ($asnHerders->isEmpty())return null;
  28. $asnDetails=collect();
  29. $asnHerders->each(function ($asnHeader)use($asnDetails){
  30. $asnHeader->asnDetails->each(function ($asnDetail)use($asnDetails){
  31. $asnDetails->add($asnDetail);
  32. });
  33. });
  34. $this->updateStoreItem($asnDetails);
  35. }
  36. public function createStoreItem($asnDetails)
  37. {
  38. if ($asnDetails->isEmpty())return null;
  39. $stores = Store::query()->whereIn('asn_code',array_unique(data_get($asnDetails,'*.asnno')))->get();
  40. $store_asn_code_map = [];
  41. foreach ($stores as $store) {
  42. $store_asn_code_map[$store->asn_code]= $store;
  43. }
  44. $params=$this->getParamsByAsnDetails($asnDetails,$store_asn_code_map);
  45. if(count($params)> 0){
  46. $this->insertStore($params);
  47. }
  48. }
  49. public function getParamsByAsnDetails($asnDetails,$store_asn_code_map)
  50. {
  51. /** @var DataHandlerService $dataHandlerService */
  52. $dataHandlerService = app(DataHandlerService::class);
  53. $storeItems=$this->getByWms($asnDetails);
  54. $storeItem_map = $dataHandlerService->dataHeader(['store_asn_code','asn_line_code','sku'],$storeItems);
  55. $params = [];
  56. foreach ($asnDetails as $asnDetail) {
  57. $storeItem =$dataHandlerService
  58. ->getKeyValue(['store_asn_code'=>$asnDetail->asnno,'asn_line_code'=>$asnDetail->asnlineno,'sku'=>$asnDetail->sku],$storeItem_map);
  59. if($storeItem ?? false)continue;
  60. $params[] = [
  61. 'store_id'=>$store_asn_code_map[$asnDetail->asnno]['id'],
  62. 'asn_line_code' => $asnDetail->asnlineno,
  63. 'name' =>$asnDetail->skudescrc,
  64. 'sku' =>$asnDetail->sku,
  65. 'barcode' =>$asnDetail->basSku?$asnDetail->basSku->alternate_sku1:'',
  66. 'amount' =>$asnDetail->expectedqty??0,
  67. 'quality' =>$asnDetail->qualityStatus?$asnDetail->qualityStatus->codename_c:'',
  68. 'status' => $asnDetail->lineStatus?$asnDetail->lineStatus->codename_c:'',
  69. 'created_at'=>$asnDetail->addtime??null,
  70. 'updated_at'=>$asnDetail->edittime??null,
  71. ];
  72. }
  73. return $params;
  74. }
  75. public function insertStore(array $params){
  76. if(count($params) === 0) return [];
  77. try {
  78. $this->insert($params);
  79. LogService::log(__METHOD__,__FUNCTION__,'批量创建 store_item success'.count($params).json_encode($params));
  80. } catch (\Exception $e) {
  81. LogService::log(__METHOD__,__FUNCTION__,'批量创建 store_item error'.json_encode($params).'||'.$e->getMessage().'||'.$e->getTraceAsString());
  82. } finally{
  83. return StoreItems::query()->whereIn('id',data_get($params,'*.id'))->get();
  84. }
  85. }
  86. // public function updateStoreItem($asnDetails)
  87. // {
  88. // if(!$asnDetails || $asnDetails->count() == 0){return null;}
  89. // /** @var DataHandlerService $dataHandlerService */
  90. // $dataHandlerService = app(DataHandlerService::class);
  91. // $storeItems=$this->getByWms($asnDetails);
  92. // $storeItems_map = $dataHandlerService->dataHeader(['store_asn_code','asn_line_code','sku'],$storeItems);
  93. // /** @var StoreService $storeService */
  94. // $storeService=app(StoreService::class);
  95. // $stores=$storeService->getByWms($asnDetails);
  96. // $stores_map = $dataHandlerService->dataHeader(['asn_code'],$stores);
  97. // $updateParams = [[
  98. // 'id','store_id','asn_line_code','name','sku','barcode','amount','quality','status','created_at','updated_at'
  99. // ]];
  100. // $updated_at=Carbon::now()->toDateTimeString();
  101. // $delete_storeItems=[];
  102. // foreach ($asnDetails as $asnDetail) {
  103. // $store =$dataHandlerService->getKeyValue(['asn_code'=>$asnDetail->asnno],$stores_map);
  104. // $storeItem =$dataHandlerService
  105. // ->getKeyValue(['store_asn_code'=>$asnDetail->asnno,'asn_line_code'=>$asnDetail->asnlineno,'sku'=>$asnDetail->sku],$storeItems_map);
  106. // if(!$storeItem){
  107. // array_push($delete_storeItems,$asnDetail);
  108. // continue;
  109. // }
  110. // if( $storeItem->store_id != $store->id ||
  111. // $storeItem->asn_line_code!=$asnDetail->asnlineno ||
  112. // $storeItem->name != $asnDetail->skudescrc ||
  113. // $storeItem->sku != $asnDetail->sku||
  114. // $storeItem->barcode !=$asnDetail->basSku->alternate_sku1||
  115. // $storeItem->amount !=$asnDetail->expectedqty||
  116. // $storeItem->quality !=$asnDetail->qualityStatus??$asnDetail->qualityStatus->codename_c||
  117. // $storeItem->status !=$asnDetail->lineStatus??$asnDetail->lineStatus->codename_c||
  118. // $storeItem->created_at !=$asnDetail->addtime||
  119. // $storeItem->updated_at != $asnDetail->edittime){
  120. // $updateParams[] = [
  121. // 'id'=>$storeItem->id,
  122. // 'store_id'=>$store->id,
  123. // 'asn_line_code' => $asnDetail->asnlineno,
  124. // 'name' =>$asnDetail->skudescrc,
  125. // 'sku' =>$asnDetail->sku,
  126. // 'barcode' =>$asnDetail->basSku?$asnDetail->basSku->alternate_sku1:'',
  127. // 'amount' =>$asnDetail->expectedqty??0,
  128. // 'quality' =>$asnDetail->qualityStatus?$asnDetail->qualityStatus->codename_c:'',
  129. // 'status' => $asnDetail->lineStatus?$asnDetail->lineStatus->codename_c:'',
  130. // 'created_at'=>$asnDetail->addtime??null,
  131. // 'updated_at'=>$updated_at,
  132. // ];
  133. // }
  134. // }
  135. // if(count($updateParams) > 1){
  136. // $this->batchUpdate($updateParams);
  137. // }
  138. //
  139. // if (count($asnDetails)<count($storeItems)){
  140. // dd($delete_storeItems);
  141. // }
  142. // unset($updateParams,$asnDetails);
  143. // }
  144. public function updateStoreItem($asnDetails)
  145. {
  146. if(!$asnDetails || $asnDetails->count() == 0){return null;}
  147. /** @var DataHandlerService $dataHandlerService */
  148. $dataHandlerService = app(DataHandlerService::class);
  149. $storeItems=$this->getByWms($asnDetails);
  150. $asnDetails_map = $dataHandlerService->dataHeader(['asnno','asnlineno','sku'],$asnDetails);
  151. $updateParams = [[
  152. 'id','store_id','asn_line_code','name','sku','barcode','amount','quality','status','created_at','updated_at'
  153. ]];
  154. $updated_at=Carbon::now()->toDateTimeString();
  155. $delete_storeItems=[];
  156. foreach ($storeItems as $storeItem) {
  157. $asnDetail =$dataHandlerService
  158. ->getKeyValue(['asnno'=>$storeItem->store_asn_code,'asnlineno'=>$storeItem->asn_line_code,'sku'=>$storeItem->sku],$asnDetails_map);
  159. if(!$asnDetail){
  160. array_push($delete_storeItems,$storeItem);
  161. continue;
  162. }
  163. if($storeItem->asn_line_code!=$asnDetail['asnlineno'] ||
  164. $storeItem->name != $asnDetail['skudescrc'] ||
  165. $storeItem->sku != $asnDetail['sku']||
  166. $storeItem->barcode !=$asnDetail['basSku']['alternate_sku1']||
  167. $storeItem->amount !=$asnDetail['expectedqty']||
  168. $storeItem->quality !=$asnDetail['qualityStatus']??$asnDetail['qualityStatus']['codename_c']||
  169. $storeItem->status !=$asnDetail['lineStatus']??$asnDetail['lineStatus']['codename_c']||
  170. $storeItem->created_at !=$asnDetail['addtime']||
  171. $storeItem->updated_at != $asnDetail['edittime']){
  172. $updateParams[] = [
  173. 'id'=>$storeItem->id,
  174. 'store_id'=>$storeItem->store->id,
  175. 'asn_line_code' => $asnDetail['asnlineno'],
  176. 'name' =>$asnDetail['skudescrc'],
  177. 'sku' =>$asnDetail['sku'],
  178. 'barcode' =>$asnDetail['basSku']?$asnDetail['basSku']['alternate_sku1']:'',
  179. 'amount' =>$asnDetail['expectedqty']??0,
  180. 'quality' =>$asnDetail['qualityStatus']?$asnDetail['qualityStatus']['codename_c']:'',
  181. 'status' => $asnDetail['lineStatus']?$asnDetail['lineStatus']['codename_c']:'',
  182. 'created_at'=>$asnDetail['addtime']??null,
  183. 'updated_at'=>$updated_at,
  184. ];
  185. }
  186. }
  187. if(count($updateParams) > 1){
  188. $this->batchUpdate($updateParams);
  189. }
  190. if (count($delete_storeItems)>0) $this->deleteStoreItem($delete_storeItems);
  191. unset($updateParams,$asnDetails,$delete_storeItems);
  192. }
  193. public function batchUpdate($params){
  194. return app(BatchUpdateService::class)->batchUpdate('store_items',$params);
  195. }
  196. public function getByWms($asnDetails){
  197. if(!$asnDetails){return null;}
  198. return StoreItems::query()->whereHas('store',function($query)use($asnDetails){
  199. $query->whereIn('asn_code',array_unique(data_get($asnDetails,'*.asnno')));
  200. })->get();
  201. }
  202. public function deleteStoreItem(array $delete_storeItems){
  203. $storeItemIds=[];
  204. foreach ($delete_storeItems as $delete_storeItem){
  205. array_push($storeItemIds,$delete_storeItem->id);
  206. }
  207. try {
  208. StoreItems::query()->whereIn('id', $storeItemIds)->delete();
  209. LogService::log(__METHOD__,__FUNCTION__,'删除多余StoreItems '.count($delete_storeItems).json_encode($delete_storeItems),null);
  210. } catch (\Exception $e) {
  211. LogService::log(__METHOD__,__FUNCTION__,'删除多余StoreItems error'.count($delete_storeItems).json_encode($delete_storeItems).$e->getMessage().$e->getTraceAsString(),null);
  212. }
  213. }
  214. }