From 930ed06139d69343db8691bb9cfd58b747454d0b Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 18 Mar 2025 11:20:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 3 +- .../src/controller/Ticket.php | 53 ++++++++++++++++++ .../src/view/ticket/index.html | 26 +++++++++ public/static/ticket_import_template.xlsx | Bin 0 -> 10034 bytes 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 public/static/ticket_import_template.xlsx diff --git a/composer.json b/composer.json index 871e83b..e0a615a 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,8 @@ "zoujingli/think-plugs-wechat": "^1.0", "zoujingli/think-plugs-center": "^1.0", "zoujingli/think-plugs-account": "^1.0", - "ext-json": "*" + "ext-json": "*", + "phpoffice/phpspreadsheet": "^4.0" }, "repositories": { "jerryyan/think-plugs-cms": { diff --git a/plugs/think-plugs-ticket/src/controller/Ticket.php b/plugs/think-plugs-ticket/src/controller/Ticket.php index d31e6cf..36ff137 100644 --- a/plugs/think-plugs-ticket/src/controller/Ticket.php +++ b/plugs/think-plugs-ticket/src/controller/Ticket.php @@ -14,6 +14,7 @@ use think\admin\Controller; use think\admin\helper\QueryHelper; use think\admin\model\SystemUser; use think\exception\HttpResponseException; +use \PhpOffice\PhpSpreadsheet\IOFactory; /** * 工单管理 @@ -363,4 +364,56 @@ class Ticket extends Controller ->append(['imgs_arr', 'source_type_name', 'status_text', 'type_name', 'last_reply'])->with('approval'); }); } + + /** + * @return void + * @auth true + */ + public function import() { + $file = $this->app->request->post('file'); + if (!$file) { + // 创建一个临时Excel模板用于下载 + $this->redirect('/static/excel/ticket_import_template.xlsx'); + }; + $file = '.' . str_replace($this->app->request->domain(), '', $file); + //表格字段对应 + $fields = [ + 'A' => 'title', + 'B' => 'type_id', + 'C' => 'content', + 'D' => 'contact_name', + 'E' => 'contact_phone', + 'F' => 'contact_address', + 'G' => 'ticket_address', + ]; + //加载文件 + $spreadsheet = IOFactory::load($file); + + $sheet = $spreadsheet->getActiveSheet(); // 获取表格 + $highestRow = $sheet->getHighestRow(); // 取得总行数 + $sheetData = []; + for ($row = 2; $row <= $highestRow; $row++) { // $row表示从第几行开始读取 + foreach ($fields as $cell => $field) { + $value = $sheet->getCell($cell . $row)->getValue(); + $value = trim($value); + $sheetData[$row][$field] = $value; + } + } + $sheetData = array_values($sheetData); + foreach ($sheetData as $key => $value) { + if (!empty($value['type_id'])) { + $type = TicketType::query()->where(['id' => $value['type_id']])->find(); + if (empty($type)) { + $this->error('工单类型【'.$value['type_id'].'】不存在'); + } else { + $sheetData[$key]['type_id'] = $type['id']; + } + } + $sheetData[$key]['create_at'] = date('Y-m-d H:i:s'); + $sheetData[$key]['user_id'] = $this->request->session('user')['id']; + $sheetData[$key]['status'] = 0; + } + TicketTicket::mk()->saveAll($sheetData); + $this->success("成功"); + } } \ No newline at end of file diff --git a/plugs/think-plugs-ticket/src/view/ticket/index.html b/plugs/think-plugs-ticket/src/view/ticket/index.html index 448f835..d13dd72 100644 --- a/plugs/think-plugs-ticket/src/view/ticket/index.html +++ b/plugs/think-plugs-ticket/src/view/ticket/index.html @@ -5,6 +5,10 @@ + +下载导入模板 + + {/block} {block name="content"} @@ -99,6 +103,28 @@ ]], page: true }) + /*!文件上传过程及事件处理 */ + $('[data-file]').on('upload.choose', function (files) { + // 文件选择后的事件 + }).on('upload.hash', function (event, file) { + // file 当前文件对象 + }).on('upload.progress', function (event, obj) { + // obj.file 当前文件对象 + // obj.event 文件上传进度事件 + // obj.number 当前上传进度值 + }).on('upload.done', function (event, obj) { + // obj.file 当前完成的文件对象,每个文件上传成功将会调用 + // obj.data 当前文件上传后服务端返回的内容,部分云上传不会返回数据 + + // obj.file 当前完成的文件对象 + // obj.data 当前文件上传后服务端返回的内容 + console.log(obj.file); + console.log(obj.data); + /*! 提交数据并返回结果 */ + if(obj.file.xurl) $.form.load('{:url("import")}', {file: obj.file.xurl}, 'post'); + }).on('upload.complete', function (event) { + // 全部文件上传成功 + }); }) {/block} \ No newline at end of file diff --git a/public/static/ticket_import_template.xlsx b/public/static/ticket_import_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3487c81c2b23b0ed532d94bc98efb31d3748a62d GIT binary patch literal 10034 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 literal 0 HcmV?d00001