海工商新版后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

240 lines
7.4 KiB

<?php
namespace App\Imports;
use App\Models\AllocationDormitoryBed;
use App\Models\Bed;
use App\Models\Building;
use App\Models\Config;
use App\Models\DormitoryNumber;
use App\Models\DormitoryType;
use App\Models\Floor;
use App\Models\LivingArea;
use App\Models\MultipleWorld;
use App\Models\SecondaryCollege;
use App\Models\Speciality;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\Model;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Imports\HeadingRowFormatter;
use Illuminate\Support\Facades\DB;
HeadingRowFormatter::
default('none');
class BedFirstSheetImport implements ToCollection, WithBatchInserts, WithChunkReading, WithHeadingRow, ToModel
{
private $round;
public function __construct(int $round)
{
$this->round = $round;
}
/**
* @param array $row
*
* @return Model|Model[]|null
*/
public function model(array $row)
{
//写导入的逻辑关系
// $user = Orderuser::where('phone', '=', $row['电话'])->where('name', '=',$row['姓名'])->first();
// dd($row);
// // 数据库对应的字段
return null;
}
public function collection(Collection $rows)
{
//导入的表格所有数据都在此处显示
$list = $rows->toArray();
if(empty($list)){
throw new \Exception("请勿上传空文件");
}
//取出当前年份
$config = Config::query()->where([
"unique_identification" => "annual_session"
])->first();
if(empty($config)){
throw new \Exception("相关配置信息不能为空");
}
//取出所有二级学院
$secondaryCollegeList = SecondaryCollege::query()->where([
"status" => SecondaryCollege::STATUS_YES
])->get()->toArray();
if(empty($secondaryCollegeList)){
throw new \Exception("识别失败,二级学院信息为空");
}
//以学院名作为键
$secondaryCollegeList = array_column($secondaryCollegeList, null, "name");
//宿舍类型
$dormitoryTypeList = DormitoryType::query()->where([
"status" => DormitoryType::STATUS_YES
])->get()->toArray();
if(empty($dormitoryTypeList)){
throw new \Exception("识别失败,宿舍类型信息为空");
}
$dormitoryTypeList = array_column($dormitoryTypeList, null, "dormitory");
//生活区
$livingAreaList = LivingArea::query()->where([
"status" => LivingArea::STATUS_YES
])->get()->toArray();
if(empty($livingAreaList)){
throw new \Exception("识别失败,生活区信息为空");
}
$livingAreaList = array_column($livingAreaList, null, "title");
//楼栋
$buildingList = Building::query()->where([
"status" => Building::STATUS_YES
])->get()->toArray();
if(empty($buildingList)){
throw new \Exception("识别失败,楼栋信息为空");
}
$buildingList = array_column($buildingList, null, "building_title");
//楼层
$floorList = Floor::query()->where([
"status" => Floor::STATUS_YES
])->get()->toArray();
if(empty($floorList)){
throw new \Exception("识别失败,楼层信息为空");
}
$floorList = array_column($floorList, null, "floor_title");
//宿舍号
$dormitoryNumberList = DormitoryNumber::query()->where([
"status" => DormitoryNumber::STATUS_YES
])->get()->toArray();
if(empty($dormitoryNumberList)){
throw new \Exception("识别失败,宿舍号信息为空");
}
$dormitoryNumberList = array_column($dormitoryNumberList, null, "dormitory_number");
//床位
$bedList = Bed::query()->where([
"status" => Bed::STATUS_YES
])->get()->toArray();
if(empty($bedList)){
throw new \Exception("识别失败,床位信息为空");
}
$bedList = array_column($bedList, null, "bed_number");
//入库
$insertData = [];
foreach($list as $key => $item){
$arr = [
"create_time" => time(),
"annual_session" => $config->data
];
//检测性别
if(trim($item["男女生宿舍"]) == ""){
$arr["sex"] = 1;
}else if(trim($item["男女生宿舍"]) == ""){
$arr["sex"] = 2;
}
//初识化专业id
$speciality_id = 0;
//取出指定学院下面的专业
$specialityInfo = Speciality::query()->where([
"secondary_college_id" => $secondaryCollegeList[trim($item["二级学院"])]["id"],
"speciality_name" => trim($item["专业名称"]),
"status" => Speciality::STATUS_YES
])->first();
if(!empty($specialityInfo)){
$speciality_id = $specialityInfo->id;
}
//专业ID为空时提示
if(empty($speciality_id)){
throw new \Exception("识别失败,请检查二级学院或专业名称是否和后台录入的一致");
}
//专业id
$arr["speciality_id"] = $speciality_id;
//宿舍类型id
$arr["dormitory_type"] = $dormitoryTypeList[trim($item["宿舍类型"])]["id"];
//多人间
$multipleWorlds = MultipleWorld::query()->where([
"dormitory_type_id" => $dormitoryTypeList[trim($item["宿舍类型"])]["id"],
"people" => trim($item["多人间"]),
"status" => MultipleWorld::STATUS_YES
])->first();
if(empty($multipleWorlds)){
throw new \Exception("识别失败,多人间信息为空");
}
//多人间id
$arr["multiple_worlds"] = $multipleWorlds->id;
//生活区id
$arr["living_area"] = $livingAreaList[trim($item["生活区"])]["id"];
//楼栋id
$arr["building_id"] = $buildingList[trim($item["楼栋"])]["id"];
//楼层id
$arr["floor_id"] = $floorList[trim($item["楼层"])]["id"];
//宿舍号id
$arr["dormitory_number"] = $dormitoryNumberList[trim($item["宿舍号"])]["id"];
//床位id
$arr["bed_id"] = $bedList[trim($item["床位号"])]["id"];
array_push($insertData, $arr);
}
DB::beginTransaction();
try {
$chunk_list = array_chunk($insertData, 1000);
foreach ($chunk_list as $new_list) {
$add = AllocationDormitoryBed::query()->insert($new_list);
if($add != count($insertData)){
throw new \Exception("导入数据失败,请重试");
}
}
DB::commit();
}catch (\Exception $e){
DB::rollBack();
throw new \Exception("导入数据失败,请重试");
}
}
//批量导入1000条
public function batchSize(): int
{
return 1000;
}
//以1000条数据基准切割数据
public function chunkSize(): int
{
return 1000;
}
}