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) { // 已存在则删除原数据,判断改变已存在的数据 $row->owner = max($row->owner, $item->owner); $row->save(); $item->delete(); } else { // 不存在则改变原数据 $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(); } }