mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 03:01:12 +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) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -1394,4 +1394,8 @@ APP推送
|
|||||||
开启后,键盘上的发送按钮会被替换成换行
|
开启后,键盘上的发送按钮会被替换成换行
|
||||||
仅我的
|
仅我的
|
||||||
未领任务提醒
|
未领任务提醒
|
||||||
开启后每天按设定的提醒时间在项目群聊中发送未领取任务通知。
|
开启后每天按设定的提醒时间在项目群聊中发送未领取任务通知。
|
||||||
|
延期时长
|
||||||
|
延期备注
|
||||||
|
请输入时长
|
||||||
|
必须大于0
|
||||||
|
|||||||
@ -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"></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>
|
</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"></i>{{expiresFormat(taskDetail.end_at)}}</Tag>
|
<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>
|
<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'])
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user