no message

This commit is contained in:
kuaifan 2025-04-14 15:21:15 +08:00
parent 79f256976e
commit 9e522091c6
7 changed files with 69 additions and 23 deletions

View File

@ -735,8 +735,10 @@ class ProjectTask extends AbstractModel
if (count($older) == 0 && count($array) == 1 && $array[0] == User::userid()) {
$this->addLog("认领{任务}");
} else {
if (array_merge(array_diff($array, $older), array_diff($older, $array))) {
$this->addLog("修改{任务}负责人", ['userid' => $array]);
}
}
$this->taskPush(array_values(array_diff($array, $older)), 0);
}
$rows = ProjectTaskUser::whereTaskId($this->id)->whereOwner(1)->whereNotIn('userid', $array)->get();
@ -890,6 +892,7 @@ class ProjectTask extends AbstractModel
}
// 协助人员
if (Arr::exists($data, 'assist')) {
$older = $this->taskUser->where('owner', 0)->pluck('userid')->toArray();
$array = [];
$assist = is_array($data['assist']) ? $data['assist'] : [$data['assist']];
if (count($assist) > 10) {
@ -910,8 +913,10 @@ class ProjectTask extends AbstractModel
$array[] = $uid;
}
if ($array) {
if (array_merge(array_diff($array, $older), array_diff($older, $array))) {
$this->addLog("修改{任务}协助人员", ['userid' => $array]);
}
}
$rows = ProjectTaskUser::whereTaskId($this->id)->whereOwner(0)->whereNotIn('userid', $array)->get();
if ($rows->isNotEmpty()) {
$this->addLog("删除{任务}协助人员", ['userid' => $rows->pluck('userid')]);
@ -1349,6 +1354,9 @@ class ProjectTask extends AbstractModel
$addMsg = $this->parent_id == 0 && $this->dialog_id > 0;
if ($complete_at === null) {
// 标记未完成
if (!$this->complete_at) {
return; // 本来就未完成
}
$this->complete_at = null;
$this->addLog("标记{任务}未完成");
if ($addMsg) {
@ -1358,6 +1366,9 @@ class ProjectTask extends AbstractModel
}
} else {
// 标记已完成
if ($this->complete_at) {
return; // 本来就已完成
}
if ($this->parent_id == 0) {
if (self::whereParentId($this->id)->whereCompleteAt(null)->exists()) {
throw new ApiException('子任务未完成', [
@ -1848,6 +1859,12 @@ class ProjectTask extends AbstractModel
AbstractModel::transaction(function () use ($projectId, $columnId, $flowItemId, $owner, $assist, $completeAt) {
$newTaskUser = array_merge($owner, $assist);
//
$oldProject = Project::find($this->project_id);
$newProject = $this->project_id != $projectId ? Project::find($projectId) : $oldProject;
if (!$oldProject || !$newProject) {
throw new ApiException('项目不存在');
}
//
$this->project_id = $projectId;
$this->column_id = $columnId;
// 任务内容
@ -1883,6 +1900,7 @@ class ProjectTask extends AbstractModel
]);
//
if ($flowItemId) {
// 更新任务流程
$flowItem = projectFlowItem::whereProjectId($projectId)->whereId($flowItemId)->first();
$this->flow_item_id = $flowItemId;
$this->flow_item_name = $flowItem->status . "|" . $flowItem->name;
@ -1892,17 +1910,25 @@ class ProjectTask extends AbstractModel
$this->completeTask(null);
}
} else {
// 没有流程只更新状态
$this->flow_item_id = 0;
$this->flow_item_name = '';
}
//
if ($completeAt) {
$this->complete_at = $completeAt;
$this->completeTask(Carbon::parse($completeAt));
} else {
$this->completeTask(null);
}
}
//
$this->save();
//
$this->addLog("移动{任务}");
$log = $this->addLog("移动{任务}", [
'change' => [$oldProject->name, $newProject->name]
]);
if ($this->dialog_id) {
$notice = $oldProject->id != $newProject->id ? "{$oldProject->name}」移动至「{$newProject->name}" : $log->detail;
WebSocketDialogMsg::sendMsg(null, $this->dialog_id, 'notice', ['notice' => $notice], User::userid(), true, true);
}
});
$this->pushMsg('update');
return true;

View File

@ -352,6 +352,7 @@ LDAP 用户禁止修改邮箱
移交子任务身份
任务取消归档
自动任务归档
任务自动归档
任务归档
创建任务来自周期任务ID(*)
已创建新的周期任务ID(*),此任务关闭周期
@ -844,3 +845,4 @@ AI机器人不存在
请输入删除备注
删除备注长度限制(*)个字
系统机器人不能删除
「(*)」移动至「(*)」

View File

@ -2044,3 +2044,6 @@ AI开启新会话
AI开启新会话失败
打开会话窗口
转为已完成
转为未完成
「(*)」移动至「(*)」

View File

@ -22440,7 +22440,7 @@
"ru": "Задача не архивирована"
},
{
"key": "自动任务归档",
"key": "任务自动归档",
"zh": "",
"zh-CHT": "自動任務歸檔",
"en": "Automatic task archiving",

View File

@ -44,6 +44,10 @@ export default {
type: String,
default: 'small'
},
placement: {
type: String,
default: 'bottom'
},
icon: {
type: String,
default: 'md-radio-button-off'
@ -83,6 +87,7 @@ export default {
updateBefore: this.updateBefore,
disabled: this.disabled,
size: this.size,
placement: this.placement,
projectId: this.projectId,
onUpdate: data => {
this.$emit("on-update", data)

View File

@ -15,8 +15,10 @@
<div class="task-move-title">{{ $L('移动前') }}</div>
<div class="task-move-row">
<span class="label">{{$L('状态')}}:</span>
<div v-if="task.flow_item_name" class="flow">
<span :class="task.flow_item_status">{{task.flow_item_name}}</span>
<div class="flow">
<span v-if="task.flow_item_name" :class="task.flow_item_status">{{task.flow_item_name}}</span>
<span v-else-if="task.complete_at" class="end">{{$L('已完成')}}</span>
<span v-else class="start">{{$L('未完成')}}</span>
</div>
</div>
<div class="task-move-row" :class="{'not-flex': windowPortrait}">
@ -51,8 +53,8 @@
:color-show="false"
:operation-show="false"
:load-status="task.loading === true"
@on-update="onStatusUpdate"
/>
placement="bottom-start"
@on-update="onStatusUpdate"/>
<div v-if="updateData.flow.flow_item_name" class="flow">
<span :class="updateData.flow.flow_item_status" @click.stop="openMenu($event, tasks)">{{updateData.flow.flow_item_name}}</span>
</div>
@ -290,8 +292,14 @@ export default {
},
onStatusUpdate(val) {
if (val.complete_at && !val.flow_item_id) {
val.flow_item_name = this.$L('已完成');
if (!val.flow_item_id) {
if (this.updateData.flow.flow_item_name) {
val.flow_item_status = "";
val.flow_item_name = "";
} else {
val.flow_item_status = val.complete_at ? 'end' : 'start';
val.flow_item_name = this.$L(val.complete_at ? '转为已完成' : '转为未完成');
}
}
this.tasks.flow_item_id = val.flow_item_id;
this.updateData.flow = val

View File

@ -5,9 +5,9 @@
trigger="click"
:disabled="disabled"
:size="size"
:placement="placement"
:style="styles"
class="general-operation-dropdown"
placement="bottom"
@command="dropTask"
@visible-change="visibleChange">
<div ref="icon" class="general-operation-icon"></div>
@ -127,6 +127,7 @@ export default {
updateBefore: false,
disabled: false,
size: 'small',
placement: 'bottom',
projectId: 0,
onUpdate: null,
@ -193,6 +194,7 @@ export default {
this.updateBefore = typeof data.updateBefore === "undefined" ? false : data.updateBefore;
this.disabled = typeof data.disabled === "undefined" ? false : data.disabled;
this.size = typeof data.size === "undefined" ? "small" : data.size;
this.placement = typeof data.placement === "undefined" ? "bottom" : data.placement;
this.projectId = typeof data.projectId === "undefined" ? 0 : data.projectId;
this.onUpdate = typeof data.onUpdate === "function" ? data.onUpdate : null;
//