lihai-oa/app/api/controller/Import.php

368 lines
14 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-3.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\api\controller;
use app\api\BaseController;
use think\facade\Db;
use app\user\model\Admin;
use app\customer\model\Customer;
use avatars\MDAvatars;
use Overtrue\Pinyin\Pinyin;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date as Shared;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
class Import extends BaseController
{
//生成头像
public function to_avatars($char)
{
$defaultData = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾',
'一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
if (isset($char)) {
$Char = $char;
} else {
$Char = $defaultData[mt_rand(0, count($defaultData) - 1)];
}
$OutputSize = min(512, empty($_GET['size']) ? 36 : intval($_GET['size']));
$Avatar = new MDAvatars($Char, 256, 1);
$avatar_name = '/avatars/avatar_256_' . set_salt(10) . time() . '.png';
$path = get_config('filesystem.disks.public.url') . $avatar_name;
$res = $Avatar->Save('.' . $path, 256);
$Avatar->Free();
return $path;
}
//登录名校验
public function check_name($name,$arr)
{
if(in_array($name,$arr)){
$name = $this->check_name($name.'1',$arr);
}
return $name;
}
//导入员工
public function import_admin(){
// 获取表单上传文件
$file[]= request()->file('file');
if($this->uid>1){
return to_assign(1,'该操作只能是超级管理员有权限操作');
}
try {
// 验证文件大小,名称等是否正确
validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])->check($file);
// 日期前綴
$dataPath = date('Ym');
$md5 = $file[0]->hash('md5');
$savename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file[0], function () use ($md5) {
return $md5;
});
$fileExtendName = substr(strrchr($savename, '.'), 1);
// 有Xls和Xlsx格式两种
if ($fileExtendName == 'xlsx') {
$objReader = IOFactory::createReader('Xlsx');
} else {
$objReader = IOFactory::createReader('Xls');
}
$objReader->setReadDataOnly(TRUE);
$path = get_config('filesystem.disks.public.url');
// 读取文件tp6默认上传的文件在runtime的相应目录下可根据实际情况自己更改
$objPHPExcel = $objReader->load('.'.$path . '/' .$savename);
$sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
Coordinate::columnIndexFromString($highestColumn);
$lines = $highestRow - 1;
if ($lines <= 0) {
return to_assign(1, '数据不能为空');
exit();
}
$sex_array=['未知','男','女'];
$type_array=['未知','正式','试用','实习'];
$mobile_array = Db::name('Admin')->where([['status','>=',0]])->column('mobile');
$email_array = Db::name('Admin')->where([['status','>=',0]])->column('email');
$username_array = Db::name('Admin')->where([['status','>=',0]])->column('username');
$department_array = Db::name('Department')->where(['status' => 1])->column('title', 'id');
$position_array = Db::name('Position')->where(['status' => 1])->column('title', 'id');
//循环读取excel表格整合成数组。如果是不指定key的二维就用$data[i][j]表示。
$pinyin = new Pinyin();
for ($j = 3; $j <= $highestRow; $j++) {
$salt = set_salt(20);
$reg_pwd = '123456';
$name = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue();
if(empty($name)){
continue;
}
$char = mb_substr($name, 0, 1, 'utf-8');
$sex = arraySearch($sex_array,$objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue());
$department = arraySearch($department_array,$objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue());
$position = arraySearch($position_array,$objPHPExcel->getActiveSheet()->getCell("f" . $j)->getValue());
$type = arraySearch($type_array,$objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue());
$pinyinname = $pinyin->name($name,PINYIN_UMLAUT_V);
$username = implode('', $pinyinname);
$mobile = $objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue();
$email = $objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue();
$file_check['mobile'] = $mobile;
$file_check['email'] = $email;
$validate_mobile = \think\facade\Validate::rule([
'mobile' => 'require|mobile',
]);
$validate_email = \think\facade\Validate::rule([
'email' => 'email',
]);
if (!$validate_mobile->check($file_check)) {
return to_assign(1, '第'.($j - 2).'行的手机号码的格式错误');
}
else{
if(in_array($mobile,$mobile_array)){
return to_assign(1, '第'.($j - 2).'行的手机号码已存在或者重复');
}
else{
array_push($mobile_array,$mobile);
}
}
if(!empty($email)){
if (!$validate_email->check($file_check)) {
return to_assign(1, '第'.($j - 2).'行的电子邮箱的格式错误');
}
else{
if(in_array($email,$email_array)){
return to_assign(1, '第'.($j - 2).'行的电子邮箱已存在或者重复');
}
else{
array_push($email_array,$email);
}
}
}
else{
$email='';
}
if(empty($department)){
return to_assign(1, '第'.($j - 2).'行的所在部门错误');
}
if(empty($position)){
return to_assign(1, '第'.($j - 2).'行的所属职位错误');
}
$data[$j - 3] = [
'name' => $name,
'nickname' => $name,
'mobile' => $mobile,
'email' => $email,
'sex' => $sex,
'did' => $department,
'position_id' => $position,
'type' => $type,
'entry_time' => Shared::excelToTimestamp($objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue(),'Asia/Shanghai'),
'username' => $this->check_name($username,$username_array),
'salt' => $salt,
'pwd' => set_password($reg_pwd, $salt),
'reg_pwd' => $reg_pwd,
'thumb' => $this->to_avatars($char)
];
}
//dd($data);exit;
// 批量添加数据
if ((new Admin())->saveAll($data)) {
return to_assign(0, '导入成功');
}
else{
return to_assign(1, '导入失败请检查excel文件再试');
}
} catch (\think\exception\ValidateException $e) {
return to_assign(1, $e->getMessage());
}
}
//导入客户
public function import_customer(){
// 获取表单上传文件
$file[]= request()->file('file');
$param = get_params();
$type = 'sea';
if(isset($param['type'])){
$type = $param['type'];
}
try {
// 验证文件大小,名称等是否正确
validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])->check($file);
// 日期前綴
$dataPath = date('Ym');
$md5 = $file[0]->hash('md5');
$savename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file[0], function () use ($md5) {
return $md5;
});
$fileExtendName = substr(strrchr($savename, '.'), 1);
// 有Xls和Xlsx格式两种
if ($fileExtendName == 'xlsx') {
$objReader = IOFactory::createReader('Xlsx');
} else {
$objReader = IOFactory::createReader('Xls');
}
$objReader->setReadDataOnly(TRUE);
$path = get_config('filesystem.disks.public.url');
// 读取文件tp6默认上传的文件在runtime的相应目录下可根据实际情况自己更改
$objPHPExcel = $objReader->load('.'.$path . '/' .$savename);
//$objPHPExcel = $objReader->load('./storage/202209/d11544d20b3ca1c1a5f8ce799c3b2433.xlsx');
$sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
Coordinate::columnIndexFromString($highestColumn);
$lines = $highestRow - 1;
if ($lines <= 0) {
return to_assign(1, '数据不能为空');
exit();
}
$name_array = [];
$source_array = Db::name('CustomerSource')->where(['status' => 1])->column('title', 'id');
$grade_array = Db::name('CustomerGrade')->where(['status' => 1])->column('title', 'id');
$industry_array = Db::name('Industry')->where(['status' => 1])->column('title', 'id');
//循环读取excel表格整合成数组。如果是不指定key的二维就用$data[i][j]表示。
for ($j = 3; $j <= $highestRow; $j++) {
$file_check = [];
$name = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue();
if(empty($name)){
continue;
}
$count_name = Db::name('Customer')->where('name',$name)->count();
if($count_name>0){
return to_assign(1, '第'.($j - 2).'行的客户名称已经存在');
}
if(in_array($name,$name_array)){
return to_assign(1, '上传的文件存在相同的客户名称,请删除再操作');
}
array_push($name_array,$name);
$source_id = arraySearch($source_array,$objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue());
$grade_id = arraySearch($grade_array,$objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue());
$industry_id = arraySearch($industry_array,$objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue());
$c_name = $objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue();
$c_mobile = $objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue();
$file_check['c_mobile'] = $c_mobile;
$tax_num = $objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue();
$bank = $objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue();
$bank_sn = $objPHPExcel->getActiveSheet()->getCell("I" . $j)->getValue();
$file_check['bank_sn'] = $bank_sn;
$bank_no = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue();
$cperson_mobile = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue();
$address = $objPHPExcel->getActiveSheet()->getCell("L" . $j)->getValue();
$content = $objPHPExcel->getActiveSheet()->getCell("M" . $j)->getValue();
$market = $objPHPExcel->getActiveSheet()->getCell("N" . $j)->getValue();
if(empty($c_name)){
return to_assign(1, '第'.($j - 2).'行的客户联系人姓名没完善');
}
if(empty($c_mobile)){
return to_assign(1, '第'.($j - 2).'行的客户联系人手机号码没完善');
}
$validate_mobile = \think\facade\Validate::rule([
'c_mobile' => 'mobile',
]);
if (!$validate_mobile->check($file_check)) {
return to_assign(1, '第'.($j - 2).'行的客户联系人手机号码格式错误');
}
if(empty($source_id)){
return to_assign(1, '第'.($j - 2).'行的客户来源错误');
}
if(empty($grade_id)){
return to_assign(1, '第'.($j - 2).'行的客户等级错误');
}
if(empty($industry_id)){
return to_assign(1, '第'.($j - 2).'行的所属行业错误');
}
if(empty($tax_num)){
$tax_num='';
}
if(empty($bank)){
$bank='';
}
$validate_bank = \think\facade\Validate::rule([
'bank_sn' => 'number',
]);
if(!empty($bank_sn)){
if (!$validate_bank->check($file_check)) {
return to_assign(1, '第'.($j - 2).'行的银行卡账号格式错误');
}
}
else{
$bank_sn='';
}
if(empty($bank_no)){
$bank_no='';
}
if(empty($cperson_mobile)){
$cperson_mobile='';
}
if(empty($address)){
$address='';
}
if(empty($content)){
$content='';
}
if(empty($market)){
$market='';
}
$belong_uid = 0;
$belong_did = 0;
if($type != 'sea'){
$belong_uid = $this->uid;
$belong_did = $this->did;
}
$data[$j - 3] = [
'name' => $name,
'source_id' => $source_id,
'grade_id' => $grade_id,
'industry_id' => $industry_id,
'tax_num' => $tax_num,
'bank' => $bank,
'bank_sn' => $bank_sn,
'bank_no' => $bank_no,
'cperson_mobile' => $cperson_mobile,
'address' => $address,
'content' => $content,
'market' => $market,
'admin_id' => $this->uid,
'belong_uid' => $belong_uid,
'belong_did' => $belong_did,
'c_mobile' => $c_mobile,
'c_name' => $c_name,
'create_time' => time()
];
}
//dd($data);exit;
// 批量添加数据
$count=0;
foreach ($data as $a => $aa) {
$cid = Customer::strict(false)->field(true)->insertGetId($aa);
if($cid>0){
$contact = [
'name' => $aa['c_name'],
'mobile' => $aa['c_mobile'],
'sex' => 1,
'cid' => $cid,
'is_default' => 1,
'create_time' => time(),
'admin_id' => $this->uid
];
Db::name('CustomerContact')->strict(false)->field(true)->insert($contact);
$count++;
}
}
return to_assign(0, '共成功导入了'.$count.'条客户数据');
} catch (\think\exception\ValidateException $e) {
return to_assign(1, $e->getMessage());
}
}
}