InventoryCompareImport.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace App\Imports;
  3. use App\Commodity;
  4. use App\CommodityBarcode;
  5. use App\OracleBasSKU;
  6. use App\Owner;
  7. use App\Services\InventoryCompareService;
  8. use Illuminate\Support\Collection;
  9. use Illuminate\Support\Facades\Cache;
  10. use Maatwebsite\Excel\Concerns\ToCollection;
  11. use Maatwebsite\Excel\Concerns\WithHeadingRow;
  12. use Maatwebsite\Excel\Concerns\WithMultipleSheets;
  13. use Maatwebsite\Excel\Imports\HeadingRowFormatter;
  14. HeadingRowFormatter::default('none');
  15. class InventoryCompareImport implements ToCollection, WithHeadingRow, WithMultipleSheets
  16. {
  17. protected $owner_id=null;
  18. public function __construct($owner_id)
  19. {
  20. $this->owner_id=$owner_id;
  21. app()->singleton('inventoryCompareService',InventoryCompareService::class);
  22. }
  23. public function Collection(Collection $collection)
  24. {
  25. $array = $collection->toArray();
  26. $skuName=(function()use($array){
  27. if($array[0]['物料编号']??false) return '物料编号';
  28. if($array[0]['SKU']??false) return 'SKU';
  29. if($array[0]['产品编码']??false) return '产品编码';
  30. })();
  31. $amountName=(function()use($array){
  32. if($array[0]['物料库存量']??false) return '物料库存量';
  33. if($array[0]['库存量']??false) return '库存量';
  34. if($array[0]['数量']??false) return '数量';
  35. })();
  36. $customLocationName=(function()use($array){
  37. if($array[0]['仓库']??false) return '仓库';
  38. if($array[0]['属性仓']??false) return '属性仓';
  39. })();
  40. $sku=$array[0][$skuName];
  41. $amount=$array[0][$amountName];
  42. $customLocation=$array[0][$customLocationName];
  43. $endIS = false;
  44. $skuAndWarehouseArr=[];
  45. foreach ($collection as $row){
  46. $skuAndWarehouse=$row[$skuName].$row[$customLocationName];
  47. array_push($skuAndWarehouseArr,$skuAndWarehouse);
  48. }
  49. $uniqueArr=array_unique($skuAndWarehouseArr);
  50. if (!isset($sku) || !isset($amount) || !isset($customLocation)) {
  51. Cache::put('error', '请检查您第一行标题是否存在产品编号,数量,属性仓');
  52. }elseif(count($uniqueArr)!=count($skuAndWarehouseArr)){
  53. Cache::put('error', '产品编号+属性仓不能同时重复!');
  54. } else {
  55. $endIS = true;
  56. }
  57. $exception = [];
  58. $sum = 2;
  59. if ($endIS) {
  60. foreach ($collection as $row) {
  61. if (!$row[$skuName]) {
  62. array_push($exception, ['第' . $sum . '行产品编号为空!']);
  63. $sum++;
  64. continue;
  65. } else if (!$row[$amountName]) {
  66. array_push($exception, ['第' . $sum . '行数量为空!']);
  67. $sum++;
  68. continue;
  69. } else if (!$row[$customLocationName]) {
  70. array_push($exception, ['第' . $sum . '行属性仓为空!']);
  71. $sum++;
  72. continue;
  73. }
  74. $commodityInWMS=Commodity::where('owner_id',$this->owner_id)->where('sku',$row[$skuName])->first();
  75. if(!$commodityInWMS) {
  76. $owner=Owner::find($this->owner_id);
  77. $commodityInWMS = OracleBasSKU::query()->where('sku', "$row[$skuName]")->where('customerid', "$owner->code")->first();
  78. $commodity=Commodity::query()->firstOrCreate(['owner_id'=>$this->owner_id,'sku'=>$row[$skuName],'name'=>$commodityInWMS['descr_c'],'length'=>$commodityInWMS['skulength'],'width'=>$commodityInWMS['skuwidth'],'height'=>$commodityInWMS['skuhigh'],'volumn'=>$commodityInWMS['skulength']*$commodityInWMS['skuwidth']*$commodityInWMS['skuhigh']]);
  79. $commodity->newBarcode($commodityInWMS['alternate_sku1']);
  80. }
  81. if (!$commodityInWMS){
  82. array_push($exception, ['该货主下不存在产品编号:'.$row[$skuName]]);
  83. $sum++;
  84. continue;
  85. }
  86. /** @var InventoryCompareService $service */
  87. $service = app('inventoryCompareService');
  88. $inventoryCompare= $service->createInventoryCompare($row[$skuName],$row[$customLocationName],$row[$amountName],$this->owner_id);
  89. if(!$inventoryCompare){
  90. $inventoryCompare=$service->createInventoryCompare_underImport($row[$skuName],$row[$customLocationName],$row[$amountName],$this->owner_id);
  91. }
  92. if ($inventoryCompare){
  93. array_push($exception, ['产品编号为:' . $row[$skuName] . '库存对比创建成功!']);
  94. }else{
  95. array_push($exception, ['产品编号为:' . $row[$skuName] . '库存对比创建失败!']);
  96. }
  97. $sum++;
  98. }
  99. }
  100. Cache::put('exception', $exception, 86400);
  101. }
  102. /**
  103. * 该方法是实现上传文件只选中 第一个表
  104. * ExcelImprot 默认是有多少个分表就执行多少次的分表
  105. * @return OrderIssueImport[]|array
  106. */
  107. public function sheets(): array
  108. {
  109. return [0 => new InventoryCompareImport($this->owner_id)];
  110. }
  111. }