|
|
@@ -0,0 +1,186 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Imports;
|
|
|
+
|
|
|
+use App\Services\CommodityService;
|
|
|
+use Illuminate\Support\Collection;
|
|
|
+use Maatwebsite\Excel\Concerns\ToCollection;
|
|
|
+use Maatwebsite\Excel\Concerns\WithHeadingRow;
|
|
|
+use Maatwebsite\Excel\Imports\HeadingRowFormatter;
|
|
|
+
|
|
|
+HeadingRowFormatter::default('none');
|
|
|
+class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
|
|
|
+{
|
|
|
+ /** @var bool $isOverride
|
|
|
+ * 是否覆盖
|
|
|
+ */
|
|
|
+ protected $isOverride;
|
|
|
+ public function __construct($isOverride)
|
|
|
+ {
|
|
|
+ $this->isOverride=$isOverride ? true : false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param Collection $collection
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public function collection(Collection $collection)
|
|
|
+ {
|
|
|
+ $row = $collection->first();
|
|
|
+ $header = [
|
|
|
+ "货主","SKU","商品名称","条码","数量","生产日期","失效日期","批号","唯一码"
|
|
|
+ ];
|
|
|
+ foreach ($header as $str){
|
|
|
+ if (!($row[$str] ?? false)) return ["success"=>false, "data"=>"表头不存在“".$str."”"];
|
|
|
+ }
|
|
|
+ $owner_name = null;
|
|
|
+ $items = [];
|
|
|
+ $errors = [];
|
|
|
+ $commodities = [];
|
|
|
+ $barcodes = [];
|
|
|
+ //去重 筛选 错误
|
|
|
+ foreach ($collection as $index => $item){
|
|
|
+ if (!$owner_name && $item["货主"]) $owner_name = $item["货主"];
|
|
|
+ if (!$item["条码"] || !$item["数量"] || !is_numeric($item["数量"])){
|
|
|
+ array_push($errors,($index+2)." 行:条码或数量不存在");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if ($item["生产日期"] && !(strtotime($item["生产日期"]) ? true : false)){
|
|
|
+ array_push($errors,($index+2)." 行:生产日期格式错误");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if ($item["失效日期"] && !(strtotime($item["失效日期"]) ? true : false)){
|
|
|
+ array_push($errors,($index+2)." 行:失效日期格式错误");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $isUniqueCommodity = isset($commodities[$item["条码"]]);
|
|
|
+ if ($isUniqueCommodity){
|
|
|
+ $line = &$items[$commodities[$item["条码"]]];
|
|
|
+ if ($line["produced_at"] == $item["生产日期"] && $line["invalid_at"] == $item["失效日期"]
|
|
|
+ && $line["batch_code"] == $item["批号"] && $line["unique_code"] == $item["唯一码"]) {
|
|
|
+ $line["imported_amount"] += $item["数量"];
|
|
|
+ array_push($errors, ($index + 2) . " 行:重复数据已合并数量");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ array_push($items,[
|
|
|
+ "imported_amount" => $item["数量"],
|
|
|
+ "produced_at" => $item["生产日期"],
|
|
|
+ "invalid_at" => $item["失效日期"],
|
|
|
+ "batch_code" => $item["批号"],
|
|
|
+ "unique_code" => $item["唯一码"],
|
|
|
+ "SKU" => $item["SKU"],
|
|
|
+ "商品名称" => $item["商品名称"],
|
|
|
+ "条码" => $item["条码"],
|
|
|
+ "lineno" => $index+2,
|
|
|
+ ]);
|
|
|
+ if ($isUniqueCommodity){
|
|
|
+ if (is_array($commodities[$item["条码"]])) array_push($commodities[$item["条码"]], count($items)-1);
|
|
|
+ else $commodities[$item["条码"]] = [$commodities[$item["条码"]], count($items)-1];
|
|
|
+ }else{
|
|
|
+ $commodities[$item["条码"]] = count($items)-1 ;
|
|
|
+ array_push($barcodes,$item["条码"]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //不存在货主
|
|
|
+ if (!$owner_name) return ["success"=>false, "data"=>"货主为空,不允许录入,至少为一行标明货主!"];
|
|
|
+
|
|
|
+ //使用条码获取商品ID
|
|
|
+ $commodityBarCodes = app('commodityBarcodeService')->getCommodities($barcodes);
|
|
|
+ foreach ($commodityBarCodes as $barcode){
|
|
|
+ if (!is_array($commodities[$barcode->code])){
|
|
|
+ $commodities[$barcode->code] = [$commodities[$barcode->code]];
|
|
|
+ }
|
|
|
+ foreach ($commodities[$barcode->code] as $index){
|
|
|
+ $items[$index]["commodity_id"] = $barcode->commodity_id;
|
|
|
+ unset($items[$index]["SKU"]);
|
|
|
+ unset($items[$index]["商品名称"]);
|
|
|
+ unset($items[$index]["条码"]);
|
|
|
+ unset($items[$index]["lineno"]);
|
|
|
+ }
|
|
|
+ unset($commodities[$barcode->code]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $owner = app('ownerService')->firstOrCreate(["name"=>$owner_name],["name"=>$owner_name, "code"=>$owner_name]);
|
|
|
+
|
|
|
+ //填充商品ID,未找到项流转下一步,空SKU删除该行并返回错误
|
|
|
+ $skus = [];
|
|
|
+ $skuParam = [];
|
|
|
+ foreach ($commodities as $key => $value){
|
|
|
+ if (!is_array($value)){
|
|
|
+ $value = [$value];
|
|
|
+ }
|
|
|
+ foreach ($value as $i => $index){
|
|
|
+ if (!$items[$index]["SKU"]){
|
|
|
+ array_push($errors, ($items[$index]["lineno"]) . " 行:条码未找到商品时SKU不得为空");
|
|
|
+ unset($items[$index]);
|
|
|
+ if ($i == count($value)-1) unset($commodities[$key]);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (isset($skus[$items[$index]["SKU"]])) array_push($skus, $index);
|
|
|
+ else{
|
|
|
+ $skus[$items[$index]["SKU"]] = [$index];
|
|
|
+ array_push($skuParam,$items[$index]["SKU"]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //使用货主+SKU获取商品ID,将条码补录
|
|
|
+ $barcodes = [];
|
|
|
+ /** @var CommodityService $commodityService */
|
|
|
+ $commodityService = app('commodityService');
|
|
|
+ $commodities = $commodityService->get(["owner_id"=>$owner->id,"sku"=>$skuParam]);
|
|
|
+ foreach ($commodities as $commodity){
|
|
|
+ foreach ($skus[$commodity->sku] as $i => $index){
|
|
|
+ $items[$index]["commodity_id"] = $commodity->id;
|
|
|
+ if ($i == 0){
|
|
|
+ array_push($barcodes,[
|
|
|
+ "code" => $items[$index]["条码"],
|
|
|
+ "commodity_id" => $commodity->id,
|
|
|
+ "created_at" => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ unset($items[$index]["SKU"]);
|
|
|
+ unset($items[$index]["商品名称"]);
|
|
|
+ unset($items[$index]["条码"]);
|
|
|
+ unset($items[$index]["lineno"]);
|
|
|
+ }
|
|
|
+ unset($skus[$commodity->sku]);
|
|
|
+ }
|
|
|
+ if (count($barcodes) > 0) app('commodityBarcodeService')->insert($barcodes);
|
|
|
+
|
|
|
+ //未找到商品录入商品
|
|
|
+ $commodities = [];
|
|
|
+ $skuParam = [];
|
|
|
+ foreach ($skus as $sku => $arr){
|
|
|
+ $data = &$items[$arr[0]];
|
|
|
+ array_push($commodities,[
|
|
|
+ "name" => $data["商品名称"],
|
|
|
+ "sku" => $data["SKU"],
|
|
|
+ "owner_id" => $owner->id,
|
|
|
+ "created_at" => date('Y-m-d H:i:s'),
|
|
|
+ ]);
|
|
|
+ array_push($skuParam, $sku);
|
|
|
+ }
|
|
|
+ $commodityService->insert($commodities);
|
|
|
+ $commodities = $commodityService->get(["owner_id"=>$owner->id,"sku"=>$skuParam]);
|
|
|
+ foreach ($commodities as $commodity){
|
|
|
+ foreach ($skus[$commodity->sku] as $i => $index){
|
|
|
+ $items[$index]["commodity_id"] = $commodity->id;
|
|
|
+ if ($i == 0){
|
|
|
+ array_push($barcodes,[
|
|
|
+ "code" => $items[$index]["条码"],
|
|
|
+ "commodity_id" => $commodity->id,
|
|
|
+ "created_at" => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ unset($items[$index]["SKU"]);
|
|
|
+ unset($items[$index]["商品名称"]);
|
|
|
+ unset($items[$index]["条码"]);
|
|
|
+ unset($items[$index]["lineno"]);
|
|
|
+ }
|
|
|
+ unset($skus[$commodity->sku]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|