CommodityBarcodeService.php 13 KB

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