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 @@
用户您好, {{env('APP_NAME') }} 任务到期。
-若需要重新设定账号密码,请点击下方链接:
-如果连接无法点击,请复制此URL然后贴入到您浏览器的地址栏中。
- +用户您好, {{env('APP_NAME') }} 任务到期提醒。
+@if ($type == 1) ++ 您有一个任务【{{$name}}】还有{{$time}}小时即将超时,请及时处理 +
+@else ++ 您的任务【{{$name}}】已经超时{{$time}}小时,请及时处理 +
+@endif