diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 955dd034a..50ecb4168 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -217,7 +217,7 @@ class SystemController extends AbstractController * * @apiParam {String} type * - get: 获取(默认) - * - save: 保存设置(参数:['push', 'ios_key', 'ios_secret', 'android_key', 'android_secret']) + * - save: 保存设置(参数:['push', 'ios_key', 'ios_secret', 'android_key', 'android_secret', 'push_msg', 'push_task', 'task_start_minute', 'task_remind_hours', 'task_remind_hours2']) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 @@ -238,7 +238,12 @@ class SystemController extends AbstractController 'ios_key', 'ios_secret', 'android_key', - 'android_secret' + 'android_secret', + 'push_msg', + 'push_task', + 'task_start_minute', + 'task_remind_hours', + 'task_remind_hours2' ])) { unset($all[$key]); } @@ -249,6 +254,11 @@ class SystemController extends AbstractController } // $setting['push'] = $setting['push'] ?: 'close'; + $setting['push_msg'] = $setting['push_msg'] ?: 'open'; + $setting['push_task'] = $setting['push_task'] ?: 'open'; + $setting['task_start_minute'] = intval($setting['task_start_minute']); + $setting['task_remind_hours'] = floatval($setting['task_remind_hours']); + $setting['task_remind_hours2'] = floatval($setting['task_remind_hours2']); // return Base::retSuccess('success', $setting ?: json_decode('{}')); } diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php index da65553f3..962fbbf58 100755 --- a/app/Http/Controllers/IndexController.php +++ b/app/Http/Controllers/IndexController.php @@ -6,6 +6,7 @@ use App\Models\File; use App\Module\Base; use App\Module\Ihttp; use App\Module\RandomColor; +use App\Tasks\AppPushTask; use App\Tasks\AutoArchivedTask; use App\Tasks\DeleteTmpTask; use App\Tasks\EmailNoticeTask; @@ -180,6 +181,8 @@ class IndexController extends InvokeController Task::deliver(new AutoArchivedTask()); // 邮件通知 Task::deliver(new EmailNoticeTask()); + // App推送 + Task::deliver(new AppPushTask()); // 删除过期的临时表数据 Task::deliver(new DeleteTmpTask('wg_tmp_msgs', 1)); Task::deliver(new DeleteTmpTask('tmp', 24)); diff --git a/app/Models/ProjectTaskPushLog.php b/app/Models/ProjectTaskPushLog.php new file mode 100644 index 000000000..25d562cfa --- /dev/null +++ b/app/Models/ProjectTaskPushLog.php @@ -0,0 +1,42 @@ + -1) { + ProjectTask::whereNull("complete_at") + ->whereNull("archived_at") + ->whereBetween("start_at", [ + Carbon::now()->subMinutes($start + 10), + Carbon::now()->subMinutes($start) + ])->chunkById(100, function ($tasks) { + /** @var ProjectTask $task */ + foreach ($tasks as $task) { + $this->taskPush($task, 0); + } + }); + } + if ($hours > -1) { + ProjectTask::whereNull("complete_at") + ->whereNull("archived_at") + ->whereBetween("end_at", [ + Carbon::now()->addMinutes($hours * 60), + Carbon::now()->addMinutes($hours * 60 + 10) + ])->chunkById(100, function ($tasks) { + /** @var ProjectTask $task */ + foreach ($tasks as $task) { + $this->taskPush($task, 1); + } + }); + } + if ($hours2 > -1) { + ProjectTask::whereNull("complete_at") + ->whereNull("archived_at") + ->whereBetween("end_at", [ + Carbon::now()->subMinutes($hours2 * 60 + 10), + Carbon::now()->subMinutes($hours2 * 60) + ])->chunkById(100, function ($tasks) { + /** @var ProjectTask $task */ + foreach ($tasks as $task) { + $this->taskPush($task, 2); + } + }); + } + } + + public function end() + { + foreach ($this->endArray as $task) { + Task::deliver($task); + } + } + + /** + * 任务过期前、超期后提醒 + * @param ProjectTask $task + * @param int $type + * @return void + */ + private function taskPush(ProjectTask $task, int $type) + { + $userids = $task->taskUser->where('owner', 1)->pluck('userid')->toArray(); + if (empty($userids)) { + return; + } + $users = User::whereIn('userid', $userids)->whereNull('disable_at')->get(); + if (empty($users)) { + return; + } + + $setting = Base::setting('appPushSetting'); + + /** @var User $user */ + foreach ($users as $user) { + $data = [ + 'type' => $type, + 'userid' => $user->userid, + 'task_id' => $task->id, + ]; + $pushLog = ProjectTaskPushLog::where($data)->exists(); + if ($pushLog) { + continue; + } + $title = match ($type) { + 1 => "任务提醒", + 2 => "任务过期提醒", + default => "任务开始提醒", + }; + $body = view('push.task', [ + 'type' => str_replace([0, 1, 2], ['start', 'before', 'after'], $type), + 'user' => $user, + 'task' => $task, + 'setting' => $setting, + ])->render(); + $this->endArray[] = new PushUmengMsg($data['userid'], [ + 'title' => $title, + 'body' => $body, + 'description' => "TID:{$data['task_id']}", + 'seconds' => 3600, + 'badge' => 1, + ]); + ProjectTaskPushLog::createInstance($data)->save(); + } + } +} diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index 8b6b0f702..df5e91de3 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -8,6 +8,7 @@ use App\Models\User; use App\Models\WebSocketDialog; use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsgRead; +use App\Module\Base; use Hhxsv5\LaravelS\Swoole\Task\Task; use Request; @@ -139,7 +140,9 @@ class WebSocketDialogMsgTask extends AbstractTask ]; } // umeng推送app - if (!$this->silence) { + $setting = Base::setting('appPushSetting'); + $pushMsg = $setting['push'] === 'open' && $setting['push_msg'] !== 'close'; + if (!$this->silence && $pushMsg) { $umengUserid = $array; if (isset($umengUserid[$msg->userid])) { unset($umengUserid[$msg->userid]); diff --git a/database/migrations/2022_11_09_144359_create_project_task_push_logs_table.php b/database/migrations/2022_11_09_144359_create_project_task_push_logs_table.php new file mode 100644 index 000000000..1fadb52b5 --- /dev/null +++ b/database/migrations/2022_11_09_144359_create_project_task_push_logs_table.php @@ -0,0 +1,34 @@ +id(); + $table->bigInteger('userid')->nullable()->default(0)->comment('用户id'); + $table->integer('task_id')->nullable()->default(0)->comment('任务id'); + $table->tinyInteger('type')->nullable()->default(0)->comment('提醒类型:0 任务开始提醒,1 距离到期提醒,2到期超时提醒'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('project_task_push_logs'); + } +} diff --git a/resources/assets/js/pages/manage/setting/components/SystemAppPush.vue b/resources/assets/js/pages/manage/setting/components/SystemAppPush.vue index 937383ca6..95653ff01 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemAppPush.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemAppPush.vue @@ -10,20 +10,54 @@ @@ -86,7 +120,17 @@ export default { }).finally(_ => { this.loadIng--; }); - } + }, + + hoursChange(e, key) { + let newNum = e * 10; + if (newNum % 5 !== 0) { + setTimeout(() => { + this.$set(this.formData, key, Math.round(e)) + }) + $A.messageError('任务提醒只能是0.5的倍数'); + } + }, } } diff --git a/resources/views/push/task.blade.php b/resources/views/push/task.blade.php new file mode 100755 index 000000000..68196cbef --- /dev/null +++ b/resources/views/push/task.blade.php @@ -0,0 +1,7 @@ +@if ($type === 'before') + 您有一个任务【{{ $task->name }}】还有{{ $setting['task_remind_hours'] }}小时即将超时,请及时处理。 +@elseif ($type === 'after') + 您的任务【{{ $task->name }}】已经超时{{ $setting['task_remind_hours2'] }}小时,请及时处理。 +@else + 您有一个新任务【{{ $task->name }}】已开始,请及时处理。 +@endif