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
|