mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-11 18:42:54 +00:00
feat: 任务加时功能 (模仿可见性的交互,任务延期和修改时间) - 70%
This commit is contained in:
parent
c0a594655d
commit
ad494b86e3
@ -47,7 +47,7 @@ class UnclaimedTaskRemindTask extends AbstractTask
|
||||
Project::whereNull('deleted_at')->whereNull('archived_at')->chunk(100,function($projects) {
|
||||
foreach ($projects as $project) {
|
||||
//
|
||||
$count = ProjectTask::query()
|
||||
$projectTasks = ProjectTask::select('project_tasks.id','project_tasks.name')
|
||||
->leftJoin('project_task_users', function ($query) {
|
||||
$query->on('project_tasks.id', '=', 'project_task_users.task_id');
|
||||
})
|
||||
@ -55,8 +55,10 @@ class UnclaimedTaskRemindTask extends AbstractTask
|
||||
->whereNull('project_tasks.deleted_at')
|
||||
->whereNull('project_tasks.archived_at')
|
||||
->whereNull('project_task_users.id')
|
||||
->count();
|
||||
if($count > 0){
|
||||
->limit(10)
|
||||
->get();
|
||||
//
|
||||
if( !$projectTasks->isEmpty() ){
|
||||
$botUser = User::botGetOrCreate('task-alert');
|
||||
if (empty($botUser)) {
|
||||
return;
|
||||
@ -65,8 +67,13 @@ class UnclaimedTaskRemindTask extends AbstractTask
|
||||
$project->joinProject($botUser->userid);
|
||||
$project->syncDialogUser();
|
||||
}
|
||||
//
|
||||
$taskHtml = '<span style="line-height: 26px;">任务待领取</span> <br/>';
|
||||
foreach($projectTasks as $projectTask){
|
||||
$taskHtml .= "<span class=\"mention task\" style=\"line-height: 26px;\" data-id=\"{$projectTask->id}\">#{$projectTask->name}</span> <br/>";
|
||||
}
|
||||
WebSocketDialogMsg::sendMsg(null, $project->dialog_id , 'text', [
|
||||
'text' => "当前存在{$count}个未领取任务"
|
||||
'text' => $taskHtml
|
||||
], $botUser->userid);
|
||||
}
|
||||
}
|
||||
|
||||
@ -168,7 +168,7 @@ services:
|
||||
|
||||
ai:
|
||||
container_name: "dootask-ai-${APP_ID}"
|
||||
image: "kuaifan/dooai:0.0.7"
|
||||
image: "kuaifan/dooai:0.0.8"
|
||||
networks:
|
||||
extnetwork:
|
||||
ipv4_address: "${APP_IPPR}.12"
|
||||
|
||||
@ -1394,4 +1394,8 @@ APP推送
|
||||
开启后,键盘上的发送按钮会被替换成换行
|
||||
仅我的
|
||||
未领任务提醒
|
||||
开启后每天按设定的提醒时间在项目群聊中发送未领取任务通知。
|
||||
开启后每天按设定的提醒时间在项目群聊中发送未领取任务通知。
|
||||
延期时长
|
||||
延期备注
|
||||
请输入时长
|
||||
必须大于0
|
||||
|
||||
@ -245,11 +245,28 @@
|
||||
</FormItem>
|
||||
<FormItem v-if="taskDetail.end_at || timeForce">
|
||||
<div class="item-label" slot="label">
|
||||
<i class="taskfont"></i>{{$L('截止时间')}}
|
||||
<i class="taskfont"></i>
|
||||
<EDropdown ref="eDeadlineRef" trigger="click" placement="bottom" @command="dropDeadline">
|
||||
<span class="visibility-text color">{{$L('截止时间')}}
|
||||
</span>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
<EDropdownItem :command="1">
|
||||
<div class="task-menu-icon" >
|
||||
{{$L('任务延期')}}
|
||||
</div>
|
||||
</EDropdownItem>
|
||||
<EDropdownItem :command="2">
|
||||
<div class="task-menu-icon" >
|
||||
{{$L('修改时间')}}
|
||||
</div>
|
||||
</EDropdownItem>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
</div>
|
||||
<ul class="item-content">
|
||||
<li>
|
||||
<DatePicker
|
||||
disabled
|
||||
v-model="timeValue"
|
||||
:open="timeOpen"
|
||||
:options="timeOptions"
|
||||
@ -261,7 +278,21 @@
|
||||
@on-ok="timeOk"
|
||||
transfer>
|
||||
<div class="picker-time">
|
||||
<div @click="openTime" class="time">{{taskDetail.end_at ? cutTime : '--'}}</div>
|
||||
<EDropdown ref="eDeadlineRef" trigger="click" placement="bottom" @command="dropDeadline">
|
||||
<div @click="timeOpen = false" class="time">{{taskDetail.end_at ? cutTime : '--'}}</div>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
<EDropdownItem :command="1">
|
||||
<div class="task-menu-icon" >
|
||||
{{$L('任务延期')}}
|
||||
</div>
|
||||
</EDropdownItem>
|
||||
<EDropdownItem :command="2">
|
||||
<div class="task-menu-icon" >
|
||||
{{$L('修改时间')}}
|
||||
</div>
|
||||
</EDropdownItem>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
<template v-if="!taskDetail.complete_at && taskDetail.end_at">
|
||||
<Tag v-if="within24Hours(taskDetail.end_at)" color="blue"><i class="taskfont"></i>{{expiresFormat(taskDetail.end_at)}}</Tag>
|
||||
<Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag>
|
||||
@ -270,6 +301,7 @@
|
||||
</DatePicker>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</FormItem>
|
||||
<FormItem v-if="(taskDetail.loop && taskDetail.loop != 'never') || loopForce">
|
||||
<div class="item-label" slot="label">
|
||||
@ -453,6 +485,30 @@
|
||||
<div v-if="!taskDetail.id" class="task-load"><Loading/></div>
|
||||
<!-- 提示 -->
|
||||
<TaskExistTips ref="taskExistTipsRef" @onAdd="updateData('times', updateParams)"/>
|
||||
<!--任务延期-->
|
||||
<Modal
|
||||
v-model="delayTaskShow"
|
||||
:title="$L('任务延期')"
|
||||
:mask-closable="false"
|
||||
:styles="{
|
||||
width: '90%',
|
||||
maxWidth: '450px'
|
||||
}"
|
||||
@on-ok="onDelay"
|
||||
>
|
||||
<Form ref="formDelayTaskRef" :model="delayTaskForm" :rules="delayTaskRule" label-position="left" label-width="auto" @submit.native.prevent>
|
||||
<FormItem :label="$L('延期时长')" prop="time">
|
||||
<Input type="number" v-model="delayTaskForm.time" :placeholder="$L('请输入时长')" >
|
||||
<template #append>
|
||||
{{$L('时')}}
|
||||
</template>
|
||||
</Input>
|
||||
</FormItem>
|
||||
<FormItem :label="$L('延期备注')" prop="remark">
|
||||
<Input type="textarea" v-model="delayTaskForm.remark" :placeholder="$L('请输入修改备注')"></Input>
|
||||
</FormItem>
|
||||
</Form>
|
||||
</Modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -564,6 +620,21 @@ export default {
|
||||
],
|
||||
|
||||
updateParams: {},
|
||||
|
||||
delayTaskLoading: false,
|
||||
delayTaskShow: false,
|
||||
delayTaskForm: {
|
||||
time: 12,
|
||||
remark: ''
|
||||
},
|
||||
delayTaskRule: {
|
||||
time: [
|
||||
{ required: true, message: this.$L('请输入时长'), trigger: 'blur' },
|
||||
],
|
||||
remark: [
|
||||
{ required: true, message: this.$L('请输入备注'), trigger: 'blur' },
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -1607,6 +1678,35 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
dropDeadline(command) {
|
||||
switch (command) {
|
||||
case 1:
|
||||
this.delayTaskShow = true;
|
||||
break;
|
||||
case 2:
|
||||
this.openTime()
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
onDeforeClose(){
|
||||
return new Promise((resolve, reject) => {})
|
||||
},
|
||||
|
||||
onDelay(){
|
||||
this.delayTaskShow = true
|
||||
// this.delayTaskLoading = true;
|
||||
this.$refs['formDelayTaskRef'].validate((valid) => {
|
||||
if (valid) {
|
||||
this.$Message.success('Success!');
|
||||
} else {
|
||||
this.$Message.error('Fail!');
|
||||
}
|
||||
// this.delayTaskLoading = false;
|
||||
})
|
||||
return true
|
||||
},
|
||||
|
||||
updateVisible() {
|
||||
this.updateData(['visibility', 'visibility_appointor'])
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user