diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php index d5ec0c190..2ad8cb376 100755 --- a/app/Http/Controllers/IndexController.php +++ b/app/Http/Controllers/IndexController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Module\Base; use App\Tasks\AutoArchivedTask; use App\Tasks\DeleteTmpTask; +use App\Tasks\OverdueRemindEmailTask; use Hhxsv5\LaravelS\Swoole\Task\Task; use Redirect; @@ -61,6 +62,8 @@ class IndexController extends InvokeController Task::deliver(new DeleteTmpTask('tmp', 24)); // 自动归档任务 Task::deliver(new AutoArchivedTask()); + // 任务到期邮件提醒 + Task::deliver(new OverdueRemindEmailTask()); return "success"; } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 93eae4102..2be90a51a 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -1213,30 +1213,55 @@ class ProjectTask extends AbstractModel /** * 预超期任务提醒 - * @param $ownerIds + * @param $task */ - public static function overdueRemindEmail($ownerIds) + public static function overdueRemindEmail($task) { + $ownerIds = ProjectTaskUser::whereTaskId($task['id'])->whereOwner(1)->pluck('userid')->toArray(); $users = User::whereIn('userid', $ownerIds)->get(); if (!$users) { throw new ApiException("ProjectTask::overdueRemindEmail--没有负责人"); } - Config::set("mail.mailers.smtp.host", Base::settingFind('emailSetting', 'smtp_server')); - Config::set("mail.mailers.smtp.port", Base::settingFind('emailSetting', 'port')); - Config::set("mail.mailers.smtp.username", Base::settingFind('emailSetting', 'account')); - Config::set("mail.mailers.smtp.password", Base::settingFind('emailSetting', 'password')); + $type = $task['end_at'] < Carbon::now() ? 2 : 1; + $setting = Base::setting('emailSetting'); + $hours = floatval($setting['task_remind_hours']); + $hours2 = floatval($setting['task_remind_hours2']); + $time = $type === 1 ? $hours : $hours2; + Config::set("mail.mailers.smtp.host", Base::settingFind('emailSetting', 'smtp_server') ?: Config::get("mail.mailers.smtp.host")); + Config::set("mail.mailers.smtp.port", Base::settingFind('emailSetting', 'port') ?: Config::get("mail.mailers.smtp.port")); + Config::set("mail.mailers.smtp.username", Base::settingFind('emailSetting', 'account') ?: Config::get("mail.mailers.smtp.username")); + Config::set("mail.mailers.smtp.password", Base::settingFind('emailSetting', 'password') ?: Config::get("mail.mailers.smtp.password")); foreach ($users as $user) { /** @var User $user */ + if (ProjectTaskMailLog::whereTaskId($task['id'])->whereUserid($user->userid)->whereType($type)->whereIsSend(1)->exists()) { + return; + } $email = $user->email; + $isSend = 1; try { - Mail::send('taskOverdueRemind', ['url' => 'https://www.baidu.com'], function ($m) use ($email) { + $emailContent = [ + 'name' => $task['name'], + 'time' => $time, + 'type' => $type + ]; + Mail::send('taskOverdueRemind', $emailContent, function ($m) use ($email) { $m->from(Config::get("mail.mailers.smtp.username"), env('APP_NAME')); $m->to($email); - $m->subject("过期任务提醒"); + $m->subject("任务提醒"); }); } catch (\Exception $e) { - \Log::error($email.'--邮箱发动报错:', [$e->getMessage()]); + $isSend = 0; + \Log::error($email . '--邮箱发送报错:', [$e->getMessage()]); } + $logData = [ + 'userid' => $user->userid, + 'task_id' => $task['id'], + 'email' => $email, + 'type' => $type, + 'is_send' => $isSend, + ]; + $emailLog = ProjectTaskMailLog::whereTaskId($task['id'])->whereUserid($user->userid)->whereType($type)->first(); + ProjectTaskMailLog::createInstance($logData, $emailLog->id ?? null)->save(); } } } diff --git a/app/Models/ProjectTaskMailLog.php b/app/Models/ProjectTaskMailLog.php new file mode 100644 index 000000000..21a2432a1 --- /dev/null +++ b/app/Models/ProjectTaskMailLog.php @@ -0,0 +1,36 @@ +toArray(); } if ($hours2 > 0) { - $endTime2 = Carbon::now()->addHours($hours2); + $endTime2 = Carbon::now()->subHours($hours2); $taskLists2 = ProjectTask::whereNull('complete_at') - ->where('end_at', '>=', $startTime) - ->where('end_at', '<=', $endTime2) + ->where('end_at', '>=', $endTime2) + ->where('end_at', '<', $startTime) ->whereNull('archived_at') ->take(100) ->get() @@ -48,15 +47,8 @@ class OverdueRemindEmailTask extends AbstractTask } $taskLists = array_merge($taskLists1, $taskLists2); $taskLists = Base::assoc_unique($taskLists, 'id'); - $ownerIdsArr = []; - foreach ($taskLists as &$task) { - $ownerIds = ProjectTaskUser::whereTaskId($task['id'])->whereOwner(1)->pluck('userid')->toArray(); - foreach ($ownerIds as $ownerId) { - $ownerIdsArr[] = $ownerId; - } - } - if (!empty($ownerIdsArr)) { - ProjectTask::overdueRemindEmail($ownerIdsArr); + foreach ($taskLists as $task) { + ProjectTask::overdueRemindEmail($task); } } } diff --git a/database/migrations/2022_03_03_154459_create_project_task_mail_logs_table.php b/database/migrations/2022_03_03_154459_create_project_task_mail_logs_table.php new file mode 100644 index 000000000..b8110f853 --- /dev/null +++ b/database/migrations/2022_03_03_154459_create_project_task_mail_logs_table.php @@ -0,0 +1,36 @@ +id(); + $table->integer('userid')->nullable()->default(0)->comment('用户id'); + $table->integer('task_id')->nullable()->default(0)->comment('任务id'); + $table->string('email')->nullable()->default('')->comment('电子邮箱'); + $table->tinyInteger('type')->nullable()->default(0)->comment('提醒类型:1第一次任务提醒,2第二次任务超期提醒'); + $table->tinyInteger('is_send')->nullable()->default(0)->comment('邮件发送是否成功:0否,1是'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('project_task_mail_logs'); + } +} diff --git a/resources/assets/js/pages/manage/setting/system/EmailSetting.vue b/resources/assets/js/pages/manage/setting/system/EmailSetting.vue index adbbbe3b3..540224136 100644 --- a/resources/assets/js/pages/manage/setting/system/EmailSetting.vue +++ b/resources/assets/js/pages/manage/setting/system/EmailSetting.vue @@ -36,7 +36,7 @@ - + diff --git a/resources/views/taskOverdueRemind.blade.php b/resources/views/taskOverdueRemind.blade.php index d83355bb4..22bcc01b3 100644 --- a/resources/views/taskOverdueRemind.blade.php +++ b/resources/views/taskOverdueRemind.blade.php @@ -5,13 +5,15 @@ - -

用户您好, {{env('APP_NAME') }} 任务到期。

-

若需要重新设定账号密码,请点击下方链接:

-
- {{$url}} -
-

如果连接无法点击,请复制此URL然后贴入到您浏览器的地址栏中。

- +

用户您好, {{env('APP_NAME') }} 任务到期提醒。

+@if ($type == 1) +

+ 您有一个任务【{{$name}}】还有{{$time}}小时即将超时,请及时处理 +

+@else +

+ 您的任务【{{$name}}】已经超时{{$time}}小时,请及时处理 +

+@endif