| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | <?phpnamespace App\Service;use App\Import\Import;use App\Model\BasicType;use App\Model\Product;use App\Model\ProductCategory;use PhpOffice\PhpSpreadsheet\IOFactory;class ImportService extends Service{    public static $type = [        'product', //产品    ];    //导入入口    public function import($data,$user){        if(empty($data['type'])) return [false,'缺少导入类型,导入失败'];        if(! in_array($data['type'],self::$type)) return [false,'导入类型不存在,导入失败'];        if(empty($data['file'])) return [false,'导入文件不能为空'];        //导入的数据并且校验写入        list($status,$msg) = $this->importMain($data,$user);        if(! $status) return [false, $msg];        return [true, ''];    }    //主方法    public function importMain($data,$user){        //获取配置文件        $config = "excel." . $data['type'];        $config_array = config($config) ?? [];        if(empty($config_array)) return [false, '配置文件不存在'];        //(特殊 额外的表头数据)        $config_array = $this->getTableTitle($config_array,$user,$data);        //获取合并单元格范围        $uploadedFile = $_FILES['file']['tmp_name']; // 获取上传文件的临时路径        $spreadsheet = IOFactory::load($uploadedFile); // 加载上传的 Excel 文件        $worksheet = $spreadsheet->getActiveSheet(); // 获取第一个工作表        $mergedCells = $worksheet->getMergeCells(); // 获取单元格合并范围        // 需要导入的公用数据        $msg['user_id'] = $user['id'];        $msg['depart_id'] = $this->getDepart($user);        $msg['top_depart_id'] = $user['depart_map'][$msg['depart_id']] ?? 0;        //导入        $import = new Import();        $import->setConfig($config_array, $mergedCells,$msg);        \Maatwebsite\Excel\Facades\Excel::import($import,$data['file']);        //异常提示报错        if($import->getMsg()) return [false, $import->getMsg()];        return [true, ''];    }    //表头入口    public function getTableTitle($config_array,$user,$data){        if(! empty($config_array['dynamics_field'])){            $func = $config_array['dynamics_field']['func'];            return $this->$func($config_array,$user,$data);        }        return $config_array;    }    //产品导入的额外表头    public function productTitle($config_array,$user,$data){        $model = BasicType::TopClear($user,$data);        $result = $model->whereRaw('type = 22 And del_time = 0')->get()->toArray();        if(! empty($result)){            foreach ($result as $value){                $config_array['field'][$value['title']] = [                    "key" => $config_array['dynamics_field']['name'],                    "key_array" => [                        "basic_type_id" => $value['id'],                        "price" => 0,                    ],                    "rule" => "",                    "other_rule" => "is_numeric",                    "multiple" => true,                    "map" => [                        $value['title'] => "price",                    ],                ];            }        }        return $config_array;    }    //产品导入的额外数据    public function fillInsertProductData($time){        $last_insert_data = Product::where('crt_time',$time)            ->where('del_time',0)            ->select("id","product_category_id")            ->get()->toArray();        if(empty($last_insert_data)) return;        $list = ProductCategory::where('del_time',0)            ->select('id','parent_id')            ->get()->toArray();        foreach ($last_insert_data as $value){            $parentsId = $this->findParentIds($value['product_category_id'], $list);            array_unshift($parentsId, $value['product_category_id']);            $result = array_reverse($parentsId);            Product::where('id',$value['id'])->update([                'product_category' => json_encode($result)            ]);        }    }}
 |