feat: 任务加时功能 (模仿可见性的交互,任务延期和修改时间) - 70%

This commit is contained in:
weifashi 2023-11-16 19:22:22 +08:00
parent c0a594655d
commit ad494b86e3
4 changed files with 119 additions and 8 deletions

View File

@ -47,7 +47,7 @@ class UnclaimedTaskRemindTask extends AbstractTask
Project::whereNull('deleted_at')->whereNull('archived_at')->chunk(100,function($projects) { Project::whereNull('deleted_at')->whereNull('archived_at')->chunk(100,function($projects) {
foreach ($projects as $project) { foreach ($projects as $project) {
// //
$count = ProjectTask::query() $projectTasks = ProjectTask::select('project_tasks.id','project_tasks.name')
->leftJoin('project_task_users', function ($query) { ->leftJoin('project_task_users', function ($query) {
$query->on('project_tasks.id', '=', 'project_task_users.task_id'); $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.deleted_at')
->whereNull('project_tasks.archived_at') ->whereNull('project_tasks.archived_at')
->whereNull('project_task_users.id') ->whereNull('project_task_users.id')
->count(); ->limit(10)
if($count > 0){ ->get();
//
if( !$projectTasks->isEmpty() ){
$botUser = User::botGetOrCreate('task-alert'); $botUser = User::botGetOrCreate('task-alert');
if (empty($botUser)) { if (empty($botUser)) {
return; return;
@ -65,8 +67,13 @@ class UnclaimedTaskRemindTask extends AbstractTask
$project->joinProject($botUser->userid); $project->joinProject($botUser->userid);
$project->syncDialogUser(); $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', [ WebSocketDialogMsg::sendMsg(null, $project->dialog_id , 'text', [
'text' => "当前存在{$count}个未领取任务" 'text' => $taskHtml
], $botUser->userid); ], $botUser->userid);
} }
} }

View File

@ -168,7 +168,7 @@ services:
ai: ai:
container_name: "dootask-ai-${APP_ID}" container_name: "dootask-ai-${APP_ID}"
image: "kuaifan/dooai:0.0.7" image: "kuaifan/dooai:0.0.8"
networks: networks:
extnetwork: extnetwork:
ipv4_address: "${APP_IPPR}.12" ipv4_address: "${APP_IPPR}.12"

View File

@ -1394,4 +1394,8 @@ APP推送
开启后,键盘上的发送按钮会被替换成换行 开启后,键盘上的发送按钮会被替换成换行
仅我的 仅我的
未领任务提醒 未领任务提醒
开启后每天按设定的提醒时间在项目群聊中发送未领取任务通知。 开启后每天按设定的提醒时间在项目群聊中发送未领取任务通知。
延期时长
延期备注
请输入时长
必须大于0

View File

@ -245,11 +245,28 @@
</FormItem> </FormItem>
<FormItem v-if="taskDetail.end_at || timeForce"> <FormItem v-if="taskDetail.end_at || timeForce">
<div class="item-label" slot="label"> <div class="item-label" slot="label">
<i class="taskfont">&#xe6e8;</i>{{$L('截止时间')}} <i class="taskfont">&#xe6e8;</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> </div>
<ul class="item-content"> <ul class="item-content">
<li> <li>
<DatePicker <DatePicker
disabled
v-model="timeValue" v-model="timeValue"
:open="timeOpen" :open="timeOpen"
:options="timeOptions" :options="timeOptions"
@ -261,7 +278,21 @@
@on-ok="timeOk" @on-ok="timeOk"
transfer> transfer>
<div class="picker-time"> <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"> <template v-if="!taskDetail.complete_at && taskDetail.end_at">
<Tag v-if="within24Hours(taskDetail.end_at)" color="blue"><i class="taskfont">&#xe71d;</i>{{expiresFormat(taskDetail.end_at)}}</Tag> <Tag v-if="within24Hours(taskDetail.end_at)" color="blue"><i class="taskfont">&#xe71d;</i>{{expiresFormat(taskDetail.end_at)}}</Tag>
<Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag> <Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag>
@ -270,6 +301,7 @@
</DatePicker> </DatePicker>
</li> </li>
</ul> </ul>
</FormItem> </FormItem>
<FormItem v-if="(taskDetail.loop && taskDetail.loop != 'never') || loopForce"> <FormItem v-if="(taskDetail.loop && taskDetail.loop != 'never') || loopForce">
<div class="item-label" slot="label"> <div class="item-label" slot="label">
@ -453,6 +485,30 @@
<div v-if="!taskDetail.id" class="task-load"><Loading/></div> <div v-if="!taskDetail.id" class="task-load"><Loading/></div>
<!-- 提示 --> <!-- 提示 -->
<TaskExistTips ref="taskExistTipsRef" @onAdd="updateData('times', updateParams)"/> <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> </div>
</template> </template>
@ -564,6 +620,21 @@ export default {
], ],
updateParams: {}, 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() { updateVisible() {
this.updateData(['visibility', 'visibility_appointor']) this.updateData(['visibility', 'visibility_appointor'])
} }