CommodityBarcodeService.php 13 KB

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