diff --git a/.gitignore b/.gitignore index 3228f02..320e9e7 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,7 @@ vendor/ .vscode/ /phpstan.neon /phpunit.xml -composer.lock \ No newline at end of file +composer.lock +/static/export +/static/super +/static/upload \ No newline at end of file diff --git a/app/Controller/Admin/System.php b/app/Controller/Admin/System.php index 1417981..1d7b6ed 100644 --- a/app/Controller/Admin/System.php +++ b/app/Controller/Admin/System.php @@ -836,4 +836,13 @@ class System extends Base $res = amModel::where(['mess_id' => $param['id'], 'account_id' => $this->accountId()])->delete(); return $this->toAjax($res); } + + #[DeleteMapping(path: "message/clear")] + #[Auth(needAuth: false)] + public function messageClear() + { + $param = Param::only(['type' => '']); + $param['account_id'] = $this->accountId(); + return $this->toAjax(amModel::clearAll($param)); + } } \ No newline at end of file diff --git a/app/Controller/Admin/Tools.php b/app/Controller/Admin/Tools.php index ebd41ca..c2bf99d 100644 --- a/app/Controller/Admin/Tools.php +++ b/app/Controller/Admin/Tools.php @@ -272,12 +272,14 @@ class Tools extends Base } #[GetMapping(path: "file/export")] - #[Auth(auth: "file:export")] + #[Auth(needAuth: false)] public function messageExport() { $param = Param::only(["module" => "demo", "name" => "数据导出", "params" => []]); $res = aModel::add([ 'account_id' => $this->accountId(), + 'account_type' => $this->account()['account_type'], + 'belong_id' => $this->account()['belong_id'], 'name' => $param['name'], 'module' => $param['module'], 'params' => json_encode($param['params'], true), @@ -285,7 +287,31 @@ class Tools extends Base 'create_time' => date("Y-m-d H:i:s") ]); if (!$res) return $this->error("导出任务创建失败"); - QueueClient::push("App\Job\FileExportJob", ['messageId' => $res, 'channels' => ['websocket', 'email']]); + QueueClient::push("App\Job\FileExportJob", ['attachmentId' => $res]); return $this->success("导出任务创建成功"); } + + #[GetMapping(path: "attachment/list")] + #[Auth(needAuth: false)] + public function attachmentList() + { + $param = Param::only(["limit" => 10]); + $param['account_id'] = $this->accountId(); + return $this->success("列表接口", aModel::list($param)); + } + + #[DeleteMapping(path: "attachment/del")] + #[Auth(needAuth: false)] + public function attachmentDel() + { + $ids = $this->request->input("ids"); + return $this->toAjax(aModel::del($ids)); + } + + #[DeleteMapping(path: "attachment/clear")] + #[Auth(needAuth: false)] + public function attachmentClear() + { + return $this->toAjax(aModel::where("account_id", $this->accountId())->delete()); + } } \ No newline at end of file diff --git a/app/Job/FileExportJob.php b/app/Job/FileExportJob.php index 34d57eb..23d6d39 100644 --- a/app/Job/FileExportJob.php +++ b/app/Job/FileExportJob.php @@ -2,9 +2,12 @@ namespace App\Job; +use App\Utils\Excel; +use App\Utils\QueueClient; use Hyperf\AsyncQueue\Job; use App\Model\Attachment as aModel; use App\Model\Post as pModel; +use App\Model\Message as mModel; class FileExportJob extends Job { @@ -19,21 +22,37 @@ class FileExportJob extends Job public function handle() { try { + sleep(10); $attach = aModel::find($this->attachmentId); if (empty($attach)) return false; + // 参数解析 + $params = $attach->params ? json_decode($attach->params, true) : []; + // 导出类型 默认excel + $type = "excel"; switch ($attach->module) { case "post_export": - $res = pModel::exportData($attach->params); - $res = true; + list($header, $data) = pModel::list($attach->belong_id, $attach->account_type, $params['post_name'] ?? "", true); + $res = Excel::exportData($attach->name, $header, $data); break; default: throw new \Exception("导出模块不存在"); } - aModel::edit([ - 'attachment_id' => $this->attachmentId, - 'status' => $res ? 1 : 2, - 'fail_reason' => $res ? "" : "导出失败" + if (!$res) { + return aModel::edit(['attachment_id' => $this->attachmentId, 'status' => 2, 'fail_reason' => "导出失败"]); + } + aModel::edit(['attachment_id' => $this->attachmentId, 'status' => 1, 'type' => $type, 'path' => $res]); + // 导出成功,消息通知 + $data['type'] = 'system'; + $id = mModel::add([ + 'type' => 'attach', + 'title' => $attach->name . " [执行成功]", + 'content' => '执行成功', + 'create_id' => $attach->account_id, ]); + if ($id) { + QueueClient::push("App\Job\NotifyJob", ['messageId' => $id, 'channels' => ['websocket', 'email'], 'userIds' => [$attach->account_id]]); + } + return true; } catch (\Exception $e) { aModel::edit([ 'attachment_id' => $this->attachmentId, diff --git a/app/Model/AccountMessage.php b/app/Model/AccountMessage.php index cc66e53..95ed485 100644 --- a/app/Model/AccountMessage.php +++ b/app/Model/AccountMessage.php @@ -45,7 +45,7 @@ class AccountMessage extends Model ->orderBy("am.read_flag") ->orderByDesc("am.mess_id") ->select(['am.mess_id', 'am.read_flag', 'am.create_time', 'm.title', 'm.extra']) - ->paginate($param['limit']); + ->paginate((int)$param['limit']); } public static function read(array $param) @@ -79,4 +79,15 @@ class AccountMessage extends Model ->select(['am.mess_id', 'am.create_time', 'm.title', 'm.content', 'm.extra', 'm.type', 'a.nickname']) ->first(); } + + public static function clearAll(array $param) + { + return (new self())->setTable("am") + ->from("account_message as am") + ->leftJoin("message as m", "m.message_id", "=", "am.message_id") + ->where("am.read_flag", 1) + ->where("am.account_id", $param['account_id']) + ->where("m.type", $param['type']) + ->delete(); + } } diff --git a/app/Model/Attachment.php b/app/Model/Attachment.php index 0906340..13f2696 100644 --- a/app/Model/Attachment.php +++ b/app/Model/Attachment.php @@ -5,18 +5,20 @@ declare(strict_types=1); namespace App\Model; /** - * @property int $attachment_id - * @property int $account_id - * @property string $name - * @property string $module - * @property string $params - * @property string $type - * @property string $path - * @property int $status - * @property string $fail_reason - * @property string $deleted_at - * @property string $create_time - * @property string $update_time + * @property int $attachment_id + * @property int $account_type + * @property int $belong_id + * @property int $account_id + * @property string $name + * @property string $module + * @property string $params + * @property string $type + * @property string $path + * @property int $status + * @property string $fail_reason + * @property string $deleted_at + * @property string $create_time + * @property string $update_time */ class Attachment extends Model { @@ -35,5 +37,28 @@ class Attachment extends Model /** * The attributes that should be cast to native types. */ - protected array $casts = ['attachment_id' => 'integer', 'account_id' => 'integer', 'status' => 'integer']; + protected array $casts = ['attachment_id' => 'integer', 'account_id' => 'integer', 'status' => 'integer', 'account_type' => 'integer', 'belong_id' => 'integer']; + + public static function list(array $param) + { + $model = self::query(); + if (isset($param['account_id']) && $param['account_id'] != '') { + $model = $model->where('account_id', $param['account_id']); + } + if (isset($param['name']) && $param['name'] != '') { + $model = $model->where('name', "like", "%{$param['name']}%"); + } + if (isset($param['module']) && $param['module'] != '') { + $model = $model->where('module', $param['module']); + } + if (isset($param['type']) && $param['type'] != '') { + $model = $model->where('type', $param['type']); + } + if (isset($param['status']) && $param['status'] != '') { + $model = $model->where('status', $param['status']); + } + return $model->orderByDesc("attachment_id") + ->select(["attachment_id", "name", "type", "path", "status", "fail_reason", "create_time"]) + ->paginate((int)$param['limit']); + } } diff --git a/app/Model/Post.php b/app/Model/Post.php index a50c5ed..18cdfd4 100644 --- a/app/Model/Post.php +++ b/app/Model/Post.php @@ -5,15 +5,15 @@ declare(strict_types=1); namespace App\Model; /** - * @property int $post_id - * @property int $account_type - * @property int $belong_id + * @property int $post_id + * @property int $account_type + * @property int $belong_id * @property string $post_name * @property int $status * @property int $rank - * @property string $create_time - * @property string $update_time - * @property string $deleted_at + * @property string $create_time + * @property string $update_time + * @property string $deleted_at */ class Post extends Model { @@ -34,23 +34,36 @@ class Post extends Model */ protected array $casts = ['post_id' => 'integer', 'account_type' => 'integer', 'belong_id' => 'integer', 'rank' => 'integer', 'status' => 'integer']; - public static function list(int $belong_id, int $account_type, string $post_name) + public static function list(int $belong_id, int $account_type, string $post_name, bool $export = false): array { $model = self::where('belong_id', $belong_id) ->where('account_type', $account_type); if ($post_name != '') { $model = $model->where('post_name', "like", "%$post_name%"); } - return $model->orderByDesc("rank")->orderByDesc("post_id") - ->select(["post_id", "post_name", "rank", "status", "create_time"]) - ->get()->toArray(); + $model = $model->orderByDesc("rank")->orderByDesc("post_id") + ->select(["post_id", "post_name", "rank", "status", "create_time"]); + if (!$export) { + // 非导出数据 + return $model->get()->toArray(); + } + $header = ['岗位名称', '状态', '创建时间']; + $data = []; + foreach ($model->get() as $row) { + $data[] = [ + $row->post_name, + $row->status ? '启用' : '禁用', + $row->create_time->format('Y-m-d H:i:s'), + ]; + } + return [$header, $data]; } public static function options(int $belong_id, int $account_type) { return self::where('belong_id', $belong_id) ->where('account_type', $account_type) - ->where("status",1) + ->where("status", 1) ->orderByDesc("rank")->orderByDesc("post_id") ->select(["post_id", "post_name"]) ->get()->toArray(); diff --git a/app/Utils/Excel.php b/app/Utils/Excel.php index b6426f9..09a4e86 100644 --- a/app/Utils/Excel.php +++ b/app/Utils/Excel.php @@ -49,7 +49,7 @@ class Excel $sheet->fromArray($data, '', 'A2'); $sheet->getDefaultColumnDimension()->setWidth(12); $date = date("Ymd"); - $saveDir = BASE_PATH . '/static' . "/export/{$date}/"; + $saveDir = BASE_PATH . '/static' . "/export/excel/{$date}/"; if (!is_dir($saveDir)) { mkdir($saveDir, 0777, true); } @@ -58,7 +58,7 @@ class Excel $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save($saveFile); if (is_file($saveFile)) { - return config("app.domain") . "xlsx/{$date}/{$name}.xlsx"; + return config("app.domain") . "/export/excel/{$date}/{$name}.xlsx"; } return false; }