no message

This commit is contained in:
kuaifan 2022-05-06 16:32:44 +08:00
parent b3286c8f74
commit c1b218c133
23 changed files with 119 additions and 59 deletions

View File

@ -99,7 +99,7 @@ class SystemController extends AbstractController
* *
* @apiParam {String} type * @apiParam {String} type
* - get: 获取(默认) * - get: 获取(默认)
* - save: 保存设置(参数:['smtp_server', 'port', 'account', 'password', 'reg_verify', 'notice', 'task_remind_hours', 'task_remind_hours2', 'notice_msg', 'msg_unread_user_minute', 'msg_unread_group_minute'] * - save: 保存设置(参数:['smtp_server', 'port', 'account', 'password', 'reg_verify', 'notice', 'task_start_minute', 'task_remind_hours', 'task_remind_hours2', 'notice_msg', 'msg_unread_user_minute', 'msg_unread_group_minute']
* @apiSuccess {Number} ret 返回状态码1正确、0错误 * @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据 * @apiSuccess {Object} data 返回数据
@ -122,6 +122,7 @@ class SystemController extends AbstractController
'password', 'password',
'reg_verify', 'reg_verify',
'notice', 'notice',
'task_start_minute',
'task_remind_hours', 'task_remind_hours',
'task_remind_hours2', 'task_remind_hours2',
'notice_msg', 'notice_msg',
@ -142,11 +143,12 @@ class SystemController extends AbstractController
$setting['password'] = $setting['password'] ?: ''; $setting['password'] = $setting['password'] ?: '';
$setting['reg_verify'] = $setting['reg_verify'] ?: 'close'; $setting['reg_verify'] = $setting['reg_verify'] ?: 'close';
$setting['notice'] = $setting['notice'] ?: 'close'; $setting['notice'] = $setting['notice'] ?: 'close';
$setting['task_remind_hours'] = floatval($setting['task_remind_hours']) ?: 0; $setting['task_start_minute'] = intval($setting['task_start_minute']);
$setting['task_remind_hours2'] = floatval($setting['task_remind_hours2']) ?: 0; $setting['task_remind_hours'] = floatval($setting['task_remind_hours']);
$setting['task_remind_hours2'] = floatval($setting['task_remind_hours2']);
$setting['notice_msg'] = $setting['notice_msg'] ?: 'close'; $setting['notice_msg'] = $setting['notice_msg'] ?: 'close';
$setting['msg_unread_user_minute'] = floatval($setting['msg_unread_user_minute']) ?: 0; $setting['msg_unread_user_minute'] = intval($setting['msg_unread_user_minute']);
$setting['msg_unread_group_minute'] = floatval($setting['msg_unread_group_minute']) ?: 0; $setting['msg_unread_group_minute'] = intval($setting['msg_unread_group_minute']);
// //
return Base::retSuccess('success', $setting ?: json_decode('{}')); return Base::retSuccess('success', $setting ?: json_decode('{}'));
} }

View File

@ -14,7 +14,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property int|null $userid 用户id * @property int|null $userid 用户id
* @property int|null $task_id 任务id * @property int|null $task_id 任务id
* @property string|null $email 电子邮箱 * @property string|null $email 电子邮箱
* @property int|null $type 提醒类型:1第一次任务提醒2第二次任务超期提醒 * @property int|null $type 提醒类型:0 任务开始提醒1 距离到期提醒2到期超时提醒
* @property int|null $is_send 邮件发送是否成功0否1是 * @property int|null $is_send 邮件发送是否成功0否1是
* @property string|null $send_error 邮件发送错误详情 * @property string|null $send_error 邮件发送错误详情
* @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $created_at

View File

@ -26,9 +26,23 @@ class EmailNoticeTask extends AbstractTask
$setting = Base::setting('emailSetting'); $setting = Base::setting('emailSetting');
// 任务通知 // 任务通知
if ($setting['notice'] === 'open') { if ($setting['notice'] === 'open') {
$start = intval($setting['task_start_minute']);
$hours = floatval($setting['task_remind_hours']); $hours = floatval($setting['task_remind_hours']);
$hours2 = floatval($setting['task_remind_hours2']); $hours2 = floatval($setting['task_remind_hours2']);
if ($hours > 0) { if ($start > -1) {
ProjectTask::whereNull("complete_at")
->whereNull("archived_at")
->whereBetween("start_at", [
Carbon::now()->subMinutes($start * 60 + 10),
Carbon::now()->subMinutes($start * 60)
])->chunkById(100, function ($tasks) {
/** @var ProjectTask $task */
foreach ($tasks as $task) {
$this->taskEmail($task, 0);
}
});
}
if ($hours > -1) {
ProjectTask::whereNull("complete_at") ProjectTask::whereNull("complete_at")
->whereNull("archived_at") ->whereNull("archived_at")
->whereBetween("end_at", [ ->whereBetween("end_at", [
@ -37,11 +51,11 @@ class EmailNoticeTask extends AbstractTask
])->chunkById(100, function ($tasks) { ])->chunkById(100, function ($tasks) {
/** @var ProjectTask $task */ /** @var ProjectTask $task */
foreach ($tasks as $task) { foreach ($tasks as $task) {
$this->overdueBeforeAfterEmail($task, true); $this->taskEmail($task, 1);
} }
}); });
} }
if ($hours2 > 0) { if ($hours2 > -1) {
ProjectTask::whereNull("complete_at") ProjectTask::whereNull("complete_at")
->whereNull("archived_at") ->whereNull("archived_at")
->whereBetween("end_at", [ ->whereBetween("end_at", [
@ -50,16 +64,16 @@ class EmailNoticeTask extends AbstractTask
])->chunkById(100, function ($tasks) { ])->chunkById(100, function ($tasks) {
/** @var ProjectTask $task */ /** @var ProjectTask $task */
foreach ($tasks as $task) { foreach ($tasks as $task) {
$this->overdueBeforeAfterEmail($task, false); $this->taskEmail($task, 2);
} }
}); });
} }
} }
// 消息通知 // 消息通知
if ($setting['notice_msg'] === 'open') { if ($setting['notice_msg'] === 'open') {
$userMinute = floatval($setting['msg_unread_user_minute']); $userMinute = intval($setting['msg_unread_user_minute']);
$groupMinute = floatval($setting['msg_unread_group_minute']); $groupMinute = intval($setting['msg_unread_group_minute']);
if ($userMinute > 0) { if ($userMinute > -1) {
WebSocketDialogMsg::select(['web_socket_dialog_msgs.*', 'r.id as r_id', 'r.userid as r_userid']) WebSocketDialogMsg::select(['web_socket_dialog_msgs.*', 'r.id as r_id', 'r.userid as r_userid'])
->join('web_socket_dialog_msg_reads as r', 'web_socket_dialog_msgs.id', '=', 'r.msg_id') ->join('web_socket_dialog_msg_reads as r', 'web_socket_dialog_msgs.id', '=', 'r.msg_id')
->where("web_socket_dialog_msgs.dialog_type", "user") ->where("web_socket_dialog_msgs.dialog_type", "user")
@ -72,7 +86,7 @@ class EmailNoticeTask extends AbstractTask
$this->unreadMsgEmail($rows, "user"); $this->unreadMsgEmail($rows, "user");
}); });
} }
if ($groupMinute > 0) { if ($groupMinute > -1) {
WebSocketDialogMsg::select(['web_socket_dialog_msgs.*', 'r.id as r_id', 'r.userid as r_userid']) WebSocketDialogMsg::select(['web_socket_dialog_msgs.*', 'r.id as r_id', 'r.userid as r_userid'])
->join('web_socket_dialog_msg_reads as r', 'web_socket_dialog_msgs.id', '=', 'r.msg_id') ->join('web_socket_dialog_msg_reads as r', 'web_socket_dialog_msgs.id', '=', 'r.msg_id')
->where("web_socket_dialog_msgs.dialog_type", "group") ->where("web_socket_dialog_msgs.dialog_type", "group")
@ -91,10 +105,10 @@ class EmailNoticeTask extends AbstractTask
/** /**
* 任务过期前、超期后提醒 * 任务过期前、超期后提醒
* @param ProjectTask $task * @param ProjectTask $task
* @param $isBefore * @param int $type
* @return void * @return void
*/ */
private function overdueBeforeAfterEmail(ProjectTask $task, $isBefore) private function taskEmail(ProjectTask $task, int $type)
{ {
$userids = $task->taskUser->where('owner', 1)->pluck('userid')->toArray(); $userids = $task->taskUser->where('owner', 1)->pluck('userid')->toArray();
if (empty($userids)) { if (empty($userids)) {
@ -110,7 +124,7 @@ class EmailNoticeTask extends AbstractTask
/** @var User $user */ /** @var User $user */
foreach ($users as $user) { foreach ($users as $user) {
$data = [ $data = [
'type' => $isBefore ? 1 : 2, 'type' => $type,
'userid' => $user->userid, 'userid' => $user->userid,
'task_id' => $task->id, 'task_id' => $task->id,
]; ];
@ -122,13 +136,13 @@ class EmailNoticeTask extends AbstractTask
if (!Base::isEmail($user->email)) { if (!Base::isEmail($user->email)) {
throw new \Exception("User email '{$user->email}' address error"); throw new \Exception("User email '{$user->email}' address error");
} }
if ($isBefore) { $subject = match ($type) {
$subject = env('APP_NAME') . " 任务提醒"; 1 => env('APP_NAME') . " 任务提醒",
} else { 2 => env('APP_NAME') . " 任务过期提醒",
$subject = env('APP_NAME') . " 任务过期提醒"; default => env('APP_NAME') . " 任务开始提醒",
} };
$content = view('email.task', [ $content = view('email.task', [
'type' => $isBefore ? 'before' : 'after', 'type' => str_replace([0, 1, 2], ['start', 'before', 'after'], $type),
'user' => $user, 'user' => $user,
'task' => $task, 'task' => $task,
'setting' => $setting, 'setting' => $setting,

View File

@ -18,7 +18,7 @@ class CreateProjectTaskMailLogsTable extends Migration
$table->bigInteger('userid')->nullable()->default(0)->comment('用户id'); $table->bigInteger('userid')->nullable()->default(0)->comment('用户id');
$table->integer('task_id')->nullable()->default(0)->comment('任务id'); $table->integer('task_id')->nullable()->default(0)->comment('任务id');
$table->string('email')->nullable()->default('')->comment('电子邮箱'); $table->string('email')->nullable()->default('')->comment('电子邮箱');
$table->tinyInteger('type')->nullable()->default(0)->comment('提醒类型:1第一次任务提醒2第二次任务超期提醒'); $table->tinyInteger('type')->nullable()->default(0)->comment('提醒类型:0 任务开始提醒1 距离到期提醒2到期超时提醒');
$table->tinyInteger('is_send')->nullable()->default(0)->comment('邮件发送是否成功0否1是'); $table->tinyInteger('is_send')->nullable()->default(0)->comment('邮件发送是否成功0否1是');
$table->timestamps(); $table->timestamps();
}); });

2
public/css/app.css vendored

File diff suppressed because one or more lines are too long

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
/*! /*!
* The buffer module from node.js, for the browser. * The buffer module from node.js, for the browser.
* *
* @author Feross Aboukhadijeh <https://feross.org> * @author Feross Aboukhadijeh <http://feross.org>
* @license MIT * @license MIT
*/ */

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
/*! /*!
* The buffer module from node.js, for the browser. * The buffer module from node.js, for the browser.
* *
* @author Feross Aboukhadijeh <https://feross.org> * @author Feross Aboukhadijeh <http://feross.org>
* @license MIT * @license MIT
*/ */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
/*! /*!
* The buffer module from node.js, for the browser. * The buffer module from node.js, for the browser.
* *
* @author Feross Aboukhadijeh <https://feross.org> * @author Feross Aboukhadijeh <http://feross.org>
* @license MIT * @license MIT
*/ */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
/*! /*!
* The buffer module from node.js, for the browser. * The buffer module from node.js, for the browser.
* *
* @author Feross Aboukhadijeh <https://feross.org> * @author Feross Aboukhadijeh <http://feross.org>
* @license MIT * @license MIT
*/ */

View File

@ -1 +1 @@
6a920b027ebf78a4 19f9a906c4027927

View File

@ -37,15 +37,25 @@
<Radio label="close">{{ $L('关闭') }}</Radio> <Radio label="close">{{ $L('关闭') }}</Radio>
</RadioGroup> </RadioGroup>
<Form v-if="formData.notice == 'open'" @submit.native.prevent> <Form v-if="formData.notice == 'open'" @submit.native.prevent>
<FormItem :label="$L('任务开始')" prop="task_start_minute">
<div class="input-number-box">
<InputNumber v-model="formData.task_start_minute" :min="0" :step="1"/>
<label>{{ $L('分钟') }}</label>
</div>
</FormItem>
<FormItem :label="$L('距离到期')" prop="task_remind_hours"> <FormItem :label="$L('距离到期')" prop="task_remind_hours">
<InputNumber v-model="formData.task_remind_hours" :min="0" :step="0.5" @on-change="hoursChange($event, 'task_remind_hours')"/> <div class="input-number-box">
<label>{{ $L('小时') }}</label> <InputNumber v-model="formData.task_remind_hours" :min="0" :step="0.5" @on-change="hoursChange($event, 'task_remind_hours')"/>
<label>{{ $L('小时') }}</label>
</div>
</FormItem> </FormItem>
<FormItem :label="$L('超时')" prop="task_remind_hours2"> <FormItem :label="$L('到期超时')" prop="task_remind_hours2">
<InputNumber v-model="formData.task_remind_hours2" :min="0" :step="0.5" @on-change="hoursChange($event, 'task_remind_hours2')"/> <div class="input-number-box">
<label>{{ $L('小时') }}</label> <InputNumber v-model="formData.task_remind_hours2" :min="0" :step="0.5" @on-change="hoursChange($event, 'task_remind_hours2')"/>
<label>{{ $L('小时') }}</label>
</div>
</FormItem> </FormItem>
<div class="form-tip">{{$L('填写0则不通知误差±10分钟')}}</div> <div class="form-tip">{{$L('填写-1则不通知误差±10分钟')}}</div>
</Form> </Form>
</FormItem> </FormItem>
<FormItem :label="$L('消息提醒')" prop="notice_msg"> <FormItem :label="$L('消息提醒')" prop="notice_msg">
@ -55,14 +65,18 @@
</RadioGroup> </RadioGroup>
<Form v-if="formData.notice_msg == 'open'" @submit.native.prevent> <Form v-if="formData.notice_msg == 'open'" @submit.native.prevent>
<FormItem :label="$L('未读个人消息')" prop="msg_unread_user_minute"> <FormItem :label="$L('未读个人消息')" prop="msg_unread_user_minute">
<InputNumber v-model="formData.msg_unread_user_minute" :min="0" :step="1"/> <div class="input-number-box">
<label>{{ $L('分钟') }}</label> <InputNumber v-model="formData.msg_unread_user_minute" :min="0" :step="1"/>
<label>{{ $L('分钟') }}</label>
</div>
</FormItem> </FormItem>
<FormItem :label="$L('未读群聊消息')" prop="msg_unread_group_minute"> <FormItem :label="$L('未读群聊消息')" prop="msg_unread_group_minute">
<InputNumber v-model="formData.msg_unread_group_minute" :min="0" :step="1"/> <div class="input-number-box">
<label>{{ $L('分钟') }}</label> <InputNumber v-model="formData.msg_unread_group_minute" :min="0" :step="1"/>
<label>{{ $L('分钟') }}</label>
</div>
</FormItem> </FormItem>
<div class="form-tip">{{$L('填写0则不通知误差±10分钟')}}</div> <div class="form-tip">{{$L('填写-1则不通知误差±10分钟')}}</div>
</Form> </Form>
</FormItem> </FormItem>
</div> </div>
@ -87,11 +101,12 @@ export default {
password: '', password: '',
reg_verify: 'colse', reg_verify: 'colse',
notice: 'open', notice: 'open',
task_remind_hours: 0, task_start_minute: -1,
task_remind_hours2: 0, task_remind_hours: -1,
task_remind_hours2: -1,
notice_msg: 'open', notice_msg: 'open',
msg_unread_user_minute: 0, msg_unread_user_minute: -1,
msg_unread_group_minute: 0, msg_unread_group_minute: -1,
}, },
ruleData: {}, ruleData: {},
} }

View File

@ -7,6 +7,35 @@ body {
padding: 5px 0; padding: 5px 0;
} }
.input-number-box {
display: flex;
align-items: center;
border: 1px solid #dcdee2;
border-radius: 4px;
.ivu-input-number {
width: 72px;
margin: 0;
border: 0;
}
> label {
color: #515a6e;
text-align: center;
background-color: #f8f8f9;
padding: 0 7px;
font-weight: 400;
&:first-child {
border-left: 1px solid transparent;
border-right: 1px solid #dcdee2;
border-radius: 4px 0 0 4px;
}
&:last-child {
border-left: 1px solid #dcdee2;
border-right: 1px solid transparent;
border-radius: 0 4px 4px 0;
}
}
}
.ivu-input, .ivu-input,
.ivu-select-selection { .ivu-select-selection {
border-color: #e8e8e8; border-color: #e8e8e8;

View File

@ -241,9 +241,6 @@
.ivu-form-item-content { .ivu-form-item-content {
display: flex; display: flex;
align-items: center; align-items: center;
.ivu-input-number {
margin: 0 8px;
}
} }
} }
} }

View File

@ -1,5 +1,8 @@
<p>{{ $user->nickname }} 您好:</p>
@if ($type === 'before') @if ($type === 'before')
<p>{{ $user->nickname }} 您好:</p><p>您有一个任务【{{ $task->name }}】还有{{ $setting['task_remind_hours'] }}小时即将超时,请及时处理。</p> <p>您有一个任务【{{ $task->name }}】还有{{ $setting['task_remind_hours'] }}小时即将超时,请及时处理。</p>
@elseif ($type === 'after')
<p>您的任务【{{ $task->name }}】已经超时{{ $setting['task_remind_hours2'] }}小时,请及时处理。</p>
@else @else
<p>{{ $user->nickname }} 您好:</p><p>您的任务【{{ $task->name }}】已经超时{{ $setting['task_remind_hours2'] }}小时,请及时处理。</p> <p>您有一个新任务【{{ $task->name }}】已开始,请及时处理。</p>
@endif @endif