diff --git a/src/application/admin/controller/Project.php b/src/application/admin/controller/Project.php index 2a67b3e..77b1928 100644 --- a/src/application/admin/controller/Project.php +++ b/src/application/admin/controller/Project.php @@ -360,28 +360,30 @@ class Project extends Base { $file = request()->file('excel_file'); if (!$file) { $this->error('请选择要导入的文件'); + return; } // 验证文件类型 $ext = strtolower(pathinfo($file->getInfo('name'), PATHINFO_EXTENSION)); if (!in_array($ext, ['xls', 'xlsx'])) { $this->error('只支持Excel格式文件(.xls, .xlsx)'); + return; } // 移动文件到临时目录 $info = $file->move(ROOT_PATH . 'data' . DS . 'runtime', ''); if (!$info) { $this->error('文件上传失败: ' . $file->getError()); + return; } $filename = ROOT_PATH . 'data' . DS . 'runtime' . DS . $info->getSaveName(); - - // 解析Excel文件 - $data = []; + + + // 加载PHPExcel库 + $objReader = null; try { - // 引入PHPExcel库 vendor('phpoffice.phpexcel.Classes.PHPExcel'); - // 判断文件类型 if ($ext == 'xls') { $objReader = \PHPExcel_IOFactory::createReader('Excel5'); @@ -389,6 +391,17 @@ class Project extends Base { $objReader = \PHPExcel_IOFactory::createReader('Excel2007'); } + // 设置只读模式以提高性能 + $objReader->setReadDataOnly(true); + } catch (\Exception $e) { + $this->error('加载PHPExcel库失败: ' . $e->getMessage()); + return; + } + + + // 解析Excel文件 + $data = []; + try { $objPHPExcel = $objReader->load($filename); $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); @@ -400,43 +413,96 @@ class Project extends Base { $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE)[0]; // 确保行数据完整 - if (count($rowData) >= 5) { + if (count($rowData) >= 5) { // 修改为5列,因为模板中已移除密码列 // 验证必要字段不为空 - if (empty(trim($rowData[0]))) { + if (empty(trim($rowData[0])) || empty(trim($rowData[4]))) { // 检查名称和有效期字段 continue; // 跳过必填字段为空的行 } $data[] = [ 'name' => trim($rowData[0]), - 'enterprise' => trim($rowData[1]), - 'filing' => trim($rowData[2]), - 'sid' => trim($rowData[3]), - 'limitationdate' => trim($rowData[4]), + 'enterprise' => trim($rowData[1]), // 个人/企业字段位置修正 + 'filing' => trim($rowData[2]), // 备案号字段位置修正 + 'sid' => trim($rowData[3]), // 证件号码字段位置修正 + 'limitationdate' => trim($rowData[4]), // 有效期字段位置修正 'createtime' => getTime() ]; } } - - // 删除临时文件 - unlink($filename); - - // 批量插入数据 - if (!empty($data)) { - $result = Db::name('project')->insertAll($data); - if ($result) { - $this->success('成功导入 ' . count($data) . ' 条记录'); - } else { - $this->error('导入失败'); - } - } else { - $this->error('文件中没有有效数据'); - } } catch (\Exception $e) { + $this->error('文件解析失败: ' . $e->getMessage()); + return; + } finally { // 删除临时文件 if (file_exists($filename)) { unlink($filename); } - $this->error('文件解析失败: ' . $e->getMessage()); + } + + // 验证数据 + if (empty($data)) { + $this->error('文件中没有有效数据'); + return; + } + + // 批量插入数据,避免重复数据 + try { + // 先检查是否已存在相同的数据,避免重复插入 + $insertData = []; + foreach ($data as $item) { + // 检查是否已存在相同的名称和证件号码 + $exists = Db::name('project') + ->where('name', $item['name']) + ->find(); + + if (!$exists) { + $insertData[] = $item; + } + } + + if (!empty($insertData)) { + // 记录插入前的信息 + trace('准备插入 ' . count($insertData) . ' 条记录', 'info'); + + $result = Db::name('project')->insertAll($insertData); + + // 记录插入后的信息 + trace('成功插入 ' . count($insertData) . ' 条记录,结果: ' . var_export($result, true), 'info'); + echo json_encode(['code' => 1, 'msg' => '成功导入 ' . count($insertData) . ' 条记录,已过滤 ' . (count($data) - count($insertData)) . ' 条重复数据']); + return; // 确保在success后立即返回 + } else { + $this->error('没有新的数据需要导入,所有数据都已存在'); + return; // 确保在error后立即返回 + } + } catch (\Exception $e) { + // 记录详细的错误信息到日志 + $errorMsg = '数据库插入失败: ' . $e->getMessage() . + ' Code: ' . $e->getCode() . + ' File: ' . $e->getFile() . + ' Line: ' . $e->getLine(); + + // 同时记录第一条数据作为参考 + if (!empty($data)) { + $errorMsg .= ' Sample Data: ' . json_encode($data[0], JSON_UNESCAPED_UNICODE); + } + + // 记录到系统日志 + trace($errorMsg, 'error'); + + $this->error($errorMsg); + return; + } catch (\Error $e) { + // 捕获Error类型的异常 + $errorMsg = '数据库插入出现错误: ' . $e->getMessage() . + ' Code: ' . $e->getCode() . + ' File: ' . $e->getFile() . + ' Line: ' . $e->getLine(); + + // 记录到系统日志 + trace($errorMsg, 'error'); + + $this->error($errorMsg); + return; } } diff --git a/src/application/admin/template/project/users_index.htm b/src/application/admin/template/project/users_index.htm index 02dc333..0a9a9a0 100644 --- a/src/application/admin/template/project/users_index.htm +++ b/src/application/admin/template/project/users_index.htm @@ -286,7 +286,7 @@ '
' + '' + '' + - '下载模板' + + '下载模板' + '
' + '' + '' + diff --git a/src/project_template.xlsx b/src/project_template.xlsx index 307fa1d..73fea9a 100644 Binary files a/src/project_template.xlsx and b/src/project_template.xlsx differ diff --git a/src/public/project_template.xlsx b/src/public/project_template.xlsx new file mode 100644 index 0000000..1ff7c33 Binary files /dev/null and b/src/public/project_template.xlsx differ diff --git a/src/原生应用数据模板.xlsx b/src/原生应用数据模板.xlsx new file mode 100644 index 0000000..307fa1d Binary files /dev/null and b/src/原生应用数据模板.xlsx differ