CommodityBarcodeService.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. namespace App\Services;
  3. use App\Commodity;
  4. use App\CommodityBarcode;
  5. use App\Services\common\DataHandlerService;
  6. use Illuminate\Support\Collection;
  7. use Illuminate\Support\Facades\Cache;
  8. Class CommodityBarcodeService
  9. {
  10. public function getCommodities(array $codes, $owner_id){
  11. return CommodityBarcode::query()->whereHas('commodity',function ($query)use($owner_id){
  12. $query->where('owner_id',$owner_id);
  13. })->select('code','commodity_id')->whereIn('code',$codes)->get();
  14. }
  15. public function insert(array $params){
  16. return CommodityBarcode::query()->insert($params);
  17. }
  18. public function first(array $params){
  19. $query = CommodityBarcode::query();
  20. foreach ($params as $column => $value){
  21. $query->where($column,$value);
  22. }
  23. return $query->first();
  24. }
  25. public function get(array $params){
  26. $query = CommodityBarcode::query()->select('commodity_id','code');
  27. foreach ($params as $column => $values){
  28. if (is_array($values)) $query->whereIn($column,$values);
  29. else $query->where($column,$values);
  30. }
  31. return $query->get();
  32. }
  33. public function firstOrCreate(array $params, array $value = null)
  34. {
  35. if (!$value)$value = $params;
  36. return CommodityBarcode::query()->firstOrCreate($params,$value);
  37. }
  38. public function create(array $params)
  39. {
  40. return CommodityBarcode::query()->create($params);
  41. }
  42. /**
  43. * @param array $commoditiesAndBarcodesPacks 格式:[['commodity_id'=>id, barcodes=[str,str,str]], [......]]
  44. * @return bool
  45. */
  46. public function insertMany_onCommodities(array $commoditiesAndBarcodesPacks)
  47. {
  48. $commodityBarcodes=[];
  49. foreach ($commoditiesAndBarcodesPacks as $commoditiesAndBarcodesPack){
  50. $commodity_id=$commoditiesAndBarcodesPack['commodity_id'];
  51. $barcodes=$commoditiesAndBarcodesPack['barcodes'];
  52. foreach ($barcodes as $barcode){
  53. $commodityBarcodes[]=[
  54. 'commodity_id'=>$commodity_id,
  55. 'code'=>$barcode,
  56. ];
  57. }
  58. }
  59. if(empty($commodityBarcodes))return false;
  60. return CommodityBarcode::query()->insert($commodityBarcodes);
  61. }
  62. public function destroyCollections(Collection $commodityBarcodes)
  63. {
  64. $ids=$commodityBarcodes->map(function($commodityBarcode){
  65. return $commodityBarcode['id'];
  66. });
  67. return CommodityBarcode::destroy($ids);
  68. }
  69. public function createBarcodeByWms($bas_skus)
  70. {
  71. if (count($bas_skus)<1)return;
  72. $owner_sku_map = [];
  73. $sku = [];
  74. $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
  75. if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
  76. $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
  77. $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
  78. $sku[] = $addBasSku['sku'];
  79. }
  80. });
  81. /**
  82. * @var OwnerService $ownerService
  83. * @var DataHandlerService $dataHandlerService
  84. */
  85. $ownerService = app(OwnerService::class);
  86. $dataHandlerService=app(DataHandlerService::class);
  87. $owner_codes = (function () use ($owner_sku_map) {
  88. $owner_codes = [];
  89. if (count($owner_sku_map) == 0) return $owner_codes;
  90. foreach ($owner_sku_map as $item) {
  91. $owner_codes[$item['owner_code']] = $item['owner_code'];
  92. }
  93. return $owner_codes;
  94. })();
  95. $owner_map = (function () use ($ownerService, $owner_codes) {
  96. $owners = $ownerService->getOwnerByCodes($owner_codes);
  97. $map = [];
  98. $owners->each(function ($owner) use (&$map) {
  99. $map[$owner['code']] = $owner['id'];
  100. });
  101. return $map;
  102. })();
  103. $owner_id = (function () use ($ownerService, $owner_codes) {
  104. $owners = $ownerService->getOwnerByCodes($owner_codes);
  105. $map = [];
  106. $owners->each(function ($owner) use (&$map) {
  107. $map[] = $owner['id'];
  108. });
  109. return $map;
  110. })();
  111. $commodityBarcodes=$this->getByWms($bas_skus);
  112. $commodityBarcodes_map=$dataHandlerService->dataHeader(['commodity_id','code'], $commodityBarcodes);
  113. $insert_params=$this->getInsertParams($bas_skus, $commodityBarcodes_map,$owner_id,$sku,$owner_map);
  114. if (count($insert_params)>0) {
  115. foreach (array_chunk($insert_params, 1000) as $item) {
  116. try {
  117. $bool = $this->insert($item);
  118. if ($bool) {
  119. app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode Success " . count($insert_params) . ' || ' . json_encode($insert_params));
  120. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode FAILED " . ' || ' . json_encode($insert_params));
  121. } catch (\Exception $e) {
  122. app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode ERROR " . ' || ' . json_encode($insert_params) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  123. }
  124. }
  125. }
  126. }
  127. public function getInsertParams($bas_skus, $commodityBarcodes_map,$owner_id,$sku,$owner_map)
  128. {
  129. /**
  130. * @var DataHandlerService $dataHandlerService
  131. */
  132. $dataHandlerService = app(DataHandlerService::class);
  133. $commodities = Commodity::query()
  134. ->whereIn('owner_id', array_unique($owner_id))
  135. ->whereIn('sku', array_unique($sku))
  136. ->groupBy('owner_id', 'sku')
  137. ->get();
  138. $commodities_map = $dataHandlerService->dataHeader(['owner_id','sku'], $commodities);
  139. $params = [];
  140. foreach ($bas_skus as $bas_sku) {
  141. $commodity = Cache::get("owner_code_{$bas_sku['customerid']}_sku_{$bas_sku['sku']}");
  142. if (!$commodity) {
  143. $commodity = $dataHandlerService->getKeyValue(['owner_id' => $owner_map[$bas_sku['customerid']], 'sku' => $bas_sku['sku']], $commodities_map);
  144. if (!$commodity) continue;
  145. }
  146. if ($bas_sku->alternate_sku1){
  147. $commodityBarcode1 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku1], $commodityBarcodes_map);
  148. if(!$commodityBarcode1) $params[]=[
  149. 'code'=>$bas_sku->alternate_sku1,
  150. 'commodity_id' => $commodity->id,
  151. 'created_at'=>$bas_sku->addtime,
  152. 'updated_at'=>$bas_sku->edittime,
  153. ];
  154. }
  155. if ($bas_sku->alternate_sku2){
  156. $commodityBarcode2 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku2], $commodityBarcodes_map);
  157. if(!$commodityBarcode2) $params[]=[
  158. 'code'=>$bas_sku->alternate_sku2,
  159. 'commodity_id' => $commodity->id,
  160. 'created_at'=>$bas_sku->addtime,
  161. 'updated_at'=>$bas_sku->edittime,
  162. ];
  163. }
  164. if ($bas_sku->alternate_sku3){
  165. $commodityBarcode3 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku3], $commodityBarcodes_map);
  166. if(!$commodityBarcode3) $params[]=[
  167. 'code'=>$bas_sku->alternate_sku3,
  168. 'commodity_id' => $commodity->id,
  169. 'created_at'=>$bas_sku->addtime,
  170. 'updated_at'=>$bas_sku->edittime,
  171. ];
  172. }
  173. }
  174. return $params;
  175. }
  176. public function updateBarcodeByWms($bas_skus)
  177. {
  178. if (!$bas_skus || $bas_skus->count() == 0) return;
  179. $this->createBarcodeByWms($bas_skus);
  180. $owner_sku_map = [];
  181. $sku = [];
  182. $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
  183. if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
  184. $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
  185. $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
  186. $sku[] = $addBasSku['sku'];
  187. }
  188. });
  189. /**
  190. * @var OwnerService $ownerService
  191. * @var DataHandlerService $dataHandlerService
  192. */
  193. $ownerService = app(OwnerService::class);
  194. $dataHandlerService=app(DataHandlerService::class);
  195. $owner_codes = (function () use ($owner_sku_map) {
  196. $owner_codes = [];
  197. if (count($owner_sku_map) == 0) return $owner_codes;
  198. foreach ($owner_sku_map as $item) {
  199. $owner_codes[$item['owner_code']] = $item['owner_code'];
  200. }
  201. return $owner_codes;
  202. })();
  203. $owner_map = (function () use ($ownerService, $owner_codes) {
  204. $owners = $ownerService->getOwnerByCodes($owner_codes);
  205. $map = [];
  206. $owners->each(function ($owner) use (&$map) {
  207. $map[$owner['id']] = $owner['code'];
  208. });
  209. return $map;
  210. })();
  211. $commodityBarcodes=$this->getByWms($bas_skus);
  212. $bas_skus_map_one = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku1',], $bas_skus);
  213. $bas_skus_map_two = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku2',], $bas_skus);
  214. $bas_skus_map_three = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku3',], $bas_skus);
  215. $delete_Items = [];
  216. foreach ($commodityBarcodes as $commodityBarcode) {
  217. $bas_sku_one = $dataHandlerService
  218. ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku1'=>$commodityBarcode->code], $bas_skus_map_one);
  219. if ($bas_sku_one) continue;
  220. $bas_sku_two = $dataHandlerService
  221. ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku2'=>$commodityBarcode->code], $bas_skus_map_two);
  222. if ($bas_sku_two) continue;
  223. $bas_sku_three = $dataHandlerService
  224. ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku3'=>$commodityBarcode->code], $bas_skus_map_three);
  225. if ($bas_sku_three) continue;
  226. if (!$bas_sku_one&& !$bas_sku_two&& !$bas_sku_three){
  227. $delete_Items[]=$commodityBarcode;
  228. }
  229. }
  230. if (count($delete_Items)>0) $this->deleteStoreItem($delete_Items);
  231. }
  232. public function getByWms($bas_skus)
  233. {
  234. if (!$bas_skus) return null;
  235. $owner_sku_map = [];
  236. $sku = [];
  237. $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
  238. if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
  239. $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
  240. $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
  241. $sku[] = $addBasSku['sku'];
  242. }
  243. });
  244. /**
  245. * @var OwnerService $ownerService
  246. */
  247. $ownerService = app(OwnerService::class);
  248. $owner_codes = (function () use ($owner_sku_map) {
  249. $owner_codes = [];
  250. if (count($owner_sku_map) == 0) return $owner_codes;
  251. foreach ($owner_sku_map as $item) {
  252. $owner_codes[$item['owner_code']] = $item['owner_code'];
  253. }
  254. return $owner_codes;
  255. })();
  256. $owner_id = (function () use ($ownerService, $owner_codes) {
  257. $owners = $ownerService->getOwnerByCodes($owner_codes);
  258. $map = [];
  259. $owners->each(function ($owner) use (&$map) {
  260. $map[] = $owner['id'];
  261. });
  262. return $map;
  263. })();
  264. return CommodityBarcode::query()->with('commodity')->whereHas('commodity', function ($query) use ($owner_id,$sku) {
  265. $query->whereIn('owner_id', array_unique($owner_id))->whereIn('sku',array_unique($sku));
  266. })->get();
  267. }
  268. public function deleteStoreItem(array $delete_Items)
  269. {
  270. $itemIds = [];
  271. foreach ($delete_Items as $item) {
  272. array_push($storeItemIds, $item->id);
  273. }
  274. try {
  275. CommodityBarcode::query()->whereIn('id', $itemIds)->delete();
  276. LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems ' . count($delete_Items) . json_encode($delete_Items), null);
  277. } catch (\Exception $e) {
  278. LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems error' . count($delete_Items) . json_encode($delete_Items) . $e->getMessage() . $e->getTraceAsString(), null);
  279. }
  280. }
  281. }