导入
private static array $excelHead = [
['field' => 'contract_no', 'value' => '合同编号'],
['field' => 'name', 'value' => '姓名'],
['field' => 'sex', 'value' => '性别'],
['field' => 'card_id', 'value' => '身份证'],
['field' => 'phone', 'value' => '联系电话'],
['field' => 'area', 'value' => '家庭住址'],
['field' => 'bank', 'value' => '开户行'],
['field' => 'bank_no', 'value' => '银行账号'],
['field' => 'link_man', 'value' => '紧急联系人'],
['field' => 'link_phone', 'value' => '紧急联系人电话'],
['field' => 'start_time', 'value' => '进场时间'],
['field' => 'end_time', 'value' => '离场时间'],
['field' => 'work_code', 'value' => '工种'],
];
public function import(): \think\response\Json
{
try {
$file = request()->file('file');
$class_id = input('class_id');
$project_id = session('projectId');
if (!$class_id) {
throw new \Exception('班组id有误!');
}
if (!$project_id) {
throw new \Exception('项目id有误!');
}
validate(['file' => ['fileSize:10240000', 'fileExt:xls,xlsx']])->check(['file' => $file]);
$savename = \think\facade\Filesystem::putFile('excel', $file);
$spreadsheet = IOFactory::load(Filesystem::path($savename));
$worksheet = $spreadsheet->getSheet(0);
$highestRow = $worksheet->getHighestRow(); //行数
if ($highestRow <= 2) {
throw new \Exception('没获取到数据,请检查后上传');
}
$map = ['type' => '工种', 'status' => 1, 'deleted' => 0];
$work = (new SystemBase())->where($map)->column('code', 'name');
$array = [];
$errLog = [];
$cardList = [];
$contract_no_list = [];
$insert_key = CodeExtend::uniqidNumber(19);
for ($row = 2; $row <= $highestRow; ++$row) {
$emptyCount = 0;
$arr = array();
foreach (self::$excelHead as $k => $v) {
$value = str_replace(' ', '', $worksheet->getCellByColumnAndRow($k + 1, $row)->getFormattedValue());
switch ($v['field']) {
case 'end_time':
if ($value === '') {
$emptyCount++;
$value = null;
} else {
$value = date('Y-m-d', strtotime($value));
}
break;
case 'start_time':
if ($value === '') {
$errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
$emptyCount++;
} else {
$value = date('Y-m-d', strtotime($value));
}
break;
case 'contract_no':
if ($value === '') {
$emptyCount++;
$value = null;
} else {
if (in_array($value, $contract_no_list)) {
$errLog[$row][] = '第' . $row . '行 合同号重复!';
} else {
$contract_no_list[] = $value;
}
}
break;
case 'bank':
case 'bank_no':
case 'area':
case 'name':
case 'link_man':
if ($value === '') {
$errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
$emptyCount++;
}
break;
case 'sex':
if ($value === '') {
$errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
$emptyCount++;
} else {
if (!in_array($value, ['男', '女'])) {
$errLog[$row][] = '第' . $row . '行 性别错误';
} else {
$value = ['男' => 1, '女' => 2][$value];
}
}
break;
case 'link_phone':
case 'phone':
if ($value === '') {
$errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
$emptyCount++;
} else {
if (!checkMobile($value)) {
$errLog[$row][] = '第' . $row . '行 手机号码格式不正确';
}
}
break;
case 'work_code':
if ($value === '') {
$errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
$emptyCount++;
} else {
$value = explode('&', trim($value, '&'));
$tmp = '';
foreach ($value as $w) {
if (isset($work[$w])) {
$tmp .= $work[$w] . ',';
} else {
$errLog[$row][] = '第' . $row . '行 工种数据有误';
}
}
if ($tmp) {
$value = ',' . $tmp;
} else {
$errLog[$row][] = '第' . $row . '行 工种数据有误';
}
}
break;
case 'card_id':
if ($value === '') {
$errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
$emptyCount++;
} else {
if (!isCreditNo($value)) {
$errLog[$row][] = '第' . $row . '行 身份证不正确';
} else {
if (in_array($value, $cardList)) {
$errLog[$row][] = '第' . $row . '行 身份证号码重复!';
} else {
$cardList[] = $value;
}
}
}
break;
}
$arr[$v['field']] = $value;
$arr['class_id'] = $class_id;
$arr['project_id'] = $project_id;
$arr['insert_key'] = $insert_key;
$arr['type'] = 1;
}
if ($emptyCount === 13) {
unset($errLog[$row]);
continue;
}
$array[] = $arr;
}
if (!$array) {
throw new \Exception('没获取到数据,请检查后上传');
}
cliDump($array);
cliDump($errLog);
if ($errLog) {
ksort($errLog);
$newErrLog = array();
foreach ($errLog as $v) {
$newErrLog = array_merge($newErrLog, $v);
}
cliDump($newErrLog);
return json(['code' => 0, 'info' => '数据有误,请根据提示修改', 'data' => $newErrLog]);
} else {
//检查一下合同号是否有相同的
if ($contract_no_list) {
$contractCount = (new ProjectEmployee())->where('deleted', 0)->whereIn('contract_no', $contract_no_list)->count();
if ($contractCount) {
throw new \Exception('合同号与现有数据有重复!');
}
}
Db::startTrans();
(new ProjectEmployee())->insertAll($array, 200);
$contractList = (new ProjectEmployee())->field('contract_no,id,project_id')->where(['deleted' => 0, 'insert_key' => $insert_key])->select()->toArray();
if ($contract_no_list) {
$contractInsert = [];
foreach ($contractList as $v) {
$contractInsert[] = ['employee_id' => $v['id'], 'project_id' => $v['project_id'], 'type' => 1, 'no' => $v['contract_no']];
}
(new ProjectContract())->insertAll($contractInsert, 200);
}
Db::commit();
}
return json(['code' => 1, 'info' => '导入成功!', 'data' => []]);
} catch (\Exception $e) {
cliDump($e->getMessage());
cliDump($e->getLine());
return json(['code' => 0, 'info' => $e->getMessage(), 'data' => []]);
}
}
导出
public function download()
{
try {
$count = count(self::$excelHead); //计算表头数量
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet()->setTitle('导入模板');
for ($i = 65; $i < $count + 65; $i++) { //数字转字母从65开始,循环设置表头:
$sheet->setCellValue(strtoupper(chr($i)) . '1', self::$excelHead[$i - 65]['value']);
$sheet->getColumnDimension(strtoupper(chr($i)))->setWidth(20);
$sheet->getStyle(strtoupper(chr($i)))->getAlignment()
->setVertical('center')//设置垂直居中
->setHorizontal('center');//设置水平居中
if (($i > 65 && $i < 76) || $i == 77) {
$sheet->getStyleByColumnAndRow($i - 64, 1)->getFont()->getColor()->setARGB('FFFF0000');
}
}
for ($row = 2; $row < 2000; $row++) {
$this->setValidation($sheet, 'C' . $row, '"男,女"');
}
$work = SystemBase::mk()->items('工种');
$sheet->setCellValue('O1', '工种选项(多项用“&”拼接)');
$sheet->getColumnDimension('O')->setWidth(30);
$sheet->getStyleByColumnAndRow(15, 1)->getFont()->getColor()->setARGB('FFFF0000');
$i = 2;
foreach ($work as $v) {
$sheet->setCellValue('O' . $i++, $v['name']);
}
$writer = new Xlsx($spreadsheet);
$fileName = '劳务人员导入模板' . date('YmdHis') . '.xlsx';
$savename = Filesystem::path('excel/' . $fileName);
$writer->save($savename);
//删除清空:
$spreadsheet->disconnectWorksheets();
return download($savename, $fileName);
// $this->success('avc!', '');
} catch (\Exception $e) {
dump($e->getMessage());
dump($e->getLine());
// cliDump($e->getMessage());
// cliDump($e->getLine());
}
}