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. use App\Traits\ServiceAppAop;
  9. class CommodityBarcodeService
  10. {
  11. use ServiceAppAop;
  12. protected $modelClass=CommodityBarcode::class;
  13. public function getCommodities(array $codes, $owner_id){
  14. return CommodityBarcode::query()->whereHas('commodity',function ($query)use($owner_id){
  15. $query->where('owner_id',$owner_id);
  16. })->select('code','commodity_id')->whereIn('code',$codes)->get();
  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($item) . ' || ' . json_encode($item));
  120. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode FAILED " . ' || ' . json_encode($item));
  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. ->get();
  137. $commodities_map = $dataHandlerService->dataHeader(['owner_id','sku'], $commodities);
  138. $params = [];
  139. foreach ($bas_skus as $bas_sku) {
  140. $commodity = Cache::get("owner_code_{$bas_sku['customerid']}_sku_{$bas_sku['sku']}");
  141. if (!$commodity) {
  142. $commodity = $dataHandlerService->getKeyValue(['owner_id' => $owner_map[$bas_sku['customerid']], 'sku' => $bas_sku['sku']], $commodities_map);
  143. if (!$commodity) continue;
  144. }
  145. if ($bas_sku->alternate_sku1){
  146. $commodityBarcode1 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku1], $commodityBarcodes_map);
  147. if(!$commodityBarcode1) $params[]=[
  148. 'code'=>$bas_sku->alternate_sku1,
  149. 'commodity_id' => $commodity->id,
  150. 'created_at'=>$bas_sku->addtime,
  151. 'updated_at'=>$bas_sku->edittime,
  152. ];
  153. }
  154. if ($bas_sku->alternate_sku2){
  155. $commodityBarcode2 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku2], $commodityBarcodes_map);
  156. if(!$commodityBarcode2) $params[]=[
  157. 'code'=>$bas_sku->alternate_sku2,
  158. 'commodity_id' => $commodity->id,
  159. 'created_at'=>$bas_sku->addtime,
  160. 'updated_at'=>$bas_sku->edittime,
  161. ];
  162. }
  163. if ($bas_sku->alternate_sku3){
  164. $commodityBarcode3 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku3], $commodityBarcodes_map);
  165. if(!$commodityBarcode3) $params[]=[
  166. 'code'=>$bas_sku->alternate_sku3,
  167. 'commodity_id' => $commodity->id,
  168. 'created_at'=>$bas_sku->addtime,
  169. 'updated_at'=>$bas_sku->edittime,
  170. ];
  171. }
  172. }
  173. return $params;
  174. }
  175. public function updateBarcodeByWms($bas_skus)
  176. {
  177. if (!$bas_skus || $bas_skus->count() == 0) return;
  178. $this->createBarcodeByWms($bas_skus);
  179. $owner_sku_map = [];
  180. $sku = [];
  181. $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
  182. if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
  183. $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
  184. $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
  185. $sku[] = $addBasSku['sku'];
  186. }
  187. });
  188. /**
  189. * @var OwnerService $ownerService
  190. * @var DataHandlerService $dataHandlerService
  191. */
  192. $ownerService = app(OwnerService::class);
  193. $dataHandlerService=app(DataHandlerService::class);
  194. $owner_codes = (function () use ($owner_sku_map) {
  195. $owner_codes = [];
  196. if (count($owner_sku_map) == 0) return $owner_codes;
  197. foreach ($owner_sku_map as $item) {
  198. $owner_codes[$item['owner_code']] = $item['owner_code'];
  199. }
  200. return $owner_codes;
  201. })();
  202. $owner_map = (function () use ($ownerService, $owner_codes) {
  203. $owners = $ownerService->getOwnerByCodes($owner_codes);
  204. $map = [];
  205. $owners->each(function ($owner) use (&$map) {
  206. $map[$owner['id']] = $owner['code'];
  207. });
  208. return $map;
  209. })();
  210. $commodityBarcodes=$this->getByWms($bas_skus);
  211. $bas_skus_map_one = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku1',], $bas_skus);
  212. $bas_skus_map_two = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku2',], $bas_skus);
  213. $bas_skus_map_three = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku3',], $bas_skus);
  214. $delete_Items = [];
  215. foreach ($commodityBarcodes as $commodityBarcode) {
  216. $bas_sku_one = $dataHandlerService
  217. ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku1'=>$commodityBarcode->code], $bas_skus_map_one);
  218. if ($bas_sku_one) continue;
  219. $bas_sku_two = $dataHandlerService
  220. ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku2'=>$commodityBarcode->code], $bas_skus_map_two);
  221. if ($bas_sku_two) continue;
  222. $bas_sku_three = $dataHandlerService
  223. ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku3'=>$commodityBarcode->code], $bas_skus_map_three);
  224. if ($bas_sku_three) continue;
  225. if (!$bas_sku_one&& !$bas_sku_two&& !$bas_sku_three){
  226. $delete_Items[]=$commodityBarcode;
  227. }
  228. }
  229. if (count($delete_Items)>0) $this->deleteCommodityBarcode($delete_Items);
  230. }
  231. public function getByWms($bas_skus)
  232. {
  233. if (!$bas_skus) return null;
  234. $owner_sku_map = [];
  235. $sku = [];
  236. $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
  237. if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
  238. $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
  239. $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
  240. $sku[] = $addBasSku['sku'];
  241. }
  242. });
  243. /**
  244. * @var OwnerService $ownerService
  245. */
  246. $ownerService = app(OwnerService::class);
  247. $owner_codes = (function () use ($owner_sku_map) {
  248. $owner_codes = [];
  249. if (count($owner_sku_map) == 0) return $owner_codes;
  250. foreach ($owner_sku_map as $item) {
  251. $owner_codes[$item['owner_code']] = $item['owner_code'];
  252. }
  253. return $owner_codes;
  254. })();
  255. $owner_id = (function () use ($ownerService, $owner_codes) {
  256. $owners = $ownerService->getOwnerByCodes($owner_codes);
  257. $map = [];
  258. $owners->each(function ($owner) use (&$map) {
  259. $map[] = $owner['id'];
  260. });
  261. return $map;
  262. })();
  263. return CommodityBarcode::query()->with('commodity')->whereIn('commodity_id', function ($query) use ($owner_id,$sku) {
  264. $query->from('commodities')->select('id')->whereIn('owner_id', array_unique($owner_id))->whereIn('sku',array_unique($sku));
  265. })->get();
  266. }
  267. public function deleteCommodityBarcode(array $delete_params)
  268. {
  269. $itemIds = [];
  270. foreach ($delete_params as $item) {
  271. array_push($itemIds, $item->id);
  272. }
  273. try {
  274. CommodityBarcode::query()->whereIn('id', $itemIds)->delete();
  275. LogService::log(__METHOD__, __FUNCTION__, '删除多余CommodityBarcode ' . count($delete_params) . json_encode($delete_params), null);
  276. } catch (\Exception $e) {
  277. LogService::log(__METHOD__, __FUNCTION__, '删除多余CommodityBarcode error' . count($delete_params) . json_encode($delete_params) . $e->getMessage() . $e->getTraceAsString(), null);
  278. }
  279. }
  280. }