owner === self::OWNER_PRIMARY; } /** * 是否副负责人(owner=2) */ public function isDeputyOwner(): bool { return (int)$this->owner === self::OWNER_DEPUTY; } /** * 是否负责人(主或副) */ public function isOwner(): bool { return $this->isPrimaryOwner() || $this->isDeputyOwner(); } /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function project(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(Project::class, 'id', 'project_id'); } /** * 移交项目身份 * @param $originalUserid * @param $newUserid * @return void */ public static function transfer($originalUserid, $newUserid) { $projectIds = []; // 移交项目身份 self::whereUserid($originalUserid)->chunkById(100, function ($list) use ($originalUserid, $newUserid, &$projectIds) { /** @var self $item */ foreach ($list as $item) { $row = self::whereProjectId($item->project_id)->whereUserid($newUserid)->first(); if ($row) { // 已存在:仅当离职用户是主(owner=1)时把接收人升为主; // 离职用户是副(owner=2)时不传副给接收人(spec:副不替补) if ((int)$item->owner === self::OWNER_PRIMARY) { $row->owner = self::OWNER_PRIMARY; } // owner=2/0:保留接收人原有 owner 值不变 $row->save(); $item->delete(); } else { // 不存在:转移时如果离职用户是副,降级为普通成员(不带副身份过户给接收人) if ((int)$item->owner === self::OWNER_DEPUTY) { $item->owner = self::OWNER_MEMBER; } $item->userid = $newUserid; $item->save(); } if ($item->project) { if ($item->project->personal) { $name = User::userid2nickname($originalUserid) ?: ('ID:' . $originalUserid); $item->project->name = "【{$name}】{$item->project->name}"; $item->project->save(); } $item->project->addLog("移交项目身份", [ 'change' => [ [ 'type' => 'user', 'data' => $originalUserid ], [ 'type' => 'user', 'data' => $newUserid ], ], ]); $item->project->syncDialogUser(); $projectIds[] = $item->project_id; } } }); // 移交工作流状态负责人 if ($projectIds) { ProjectFlowItem::whereIn('project_id', $projectIds)->chunkById(100, function ($list) use ($originalUserid, $newUserid) { /** @var ProjectFlowItem $item */ foreach ($list as $item) { if (in_array($originalUserid, $item->userids)) { $userids = array_values(array_diff($item->userids, [$originalUserid])); $item->userids = Base::array2json(array_merge($userids, [$newUserid])); $item->save(); } } }); } } /** * 退出项目 */ public function exitProject() { ProjectTaskUser::whereProjectId($this->project_id) ->whereUserid($this->userid) ->chunk(100, function ($list) { $tastIds = []; /** @var ProjectTaskUser $item */ foreach ($list as $item) { $item->delete(); if (!in_array($item->task_pid, $tastIds)) { $tastIds[] = $item->task_pid; $item->projectTask?->syncDialogUser(); } } }); $this->delete(); } }