table('user') ->select('id', 'account', 'realname', 'dept') ->where('deleted', '0') ->orderBy('realname') ->get(); return $users->map(function ($user) { return [ 'id' => $user->id, 'account' => $user->account, 'realname' => $user->realname ?: $user->account, 'dept' => $user->dept, ]; })->toArray(); } catch (\Exception $e) { throw new \Exception('连接禅道数据库失败: ' . $e->getMessage()); } } /** * 获取指定用户本周完成的任务 */ public function getWeeklyTasks(string $account, ?string $startDate = null, ?string $endDate = null): array { // 默认本周 $start = $startDate ? Carbon::parse($startDate)->format('Y-m-d') . ' 00:00:00' : Carbon::now()->startOfWeek()->format('Y-m-d') . ' 00:00:00'; $end = $endDate ? Carbon::parse($endDate)->format('Y-m-d') . ' 23:59:59' : Carbon::now()->endOfWeek()->format('Y-m-d') . ' 23:59:59'; try { // 查询本周完成的任务 - 根据finishedDate完成时间判断 $tasks = DB::connection('zentao') ->table('task') ->leftJoin('project', 'task.project', '=', 'project.id') ->select( 'task.id', 'task.name', 'task.desc', 'task.status', 'task.finishedDate', 'task.finishedBy', 'task.assignedTo', 'task.estimate', 'task.consumed', 'task.pri', 'project.name as projectName' ) ->where('task.deleted', '0') ->where(function ($query) use ($account) { // 任务完成人或指派人是该用户 $query->where('task.finishedBy', $account) ->orWhere('task.assignedTo', $account); }) ->where(function ($query) use ($start, $end) { // 本周完成的任务(根据完成时间判断) $query->where(function ($q) use ($start, $end) { $q->whereIn('task.status', ['done', 'closed']) ->where('task.finishedDate', '>=', $start) ->where('task.finishedDate', '<=', $end) ->where('task.finishedDate', '!=', '0000-00-00 00:00:00'); }); }) ->orderBy('task.finishedDate', 'desc') ->get(); return $tasks->map(function ($task) { return [ 'id' => $task->id, 'name' => $task->name, 'description' => $this->formatTaskDescription($task), 'status' => $this->translateStatus($task->status), 'projectName' => $task->projectName ?: '未分类', 'finishedDate' => $task->finishedDate, 'consumed' => $task->consumed, ]; })->toArray(); } catch (\Exception $e) { throw new \Exception('获取任务失败: ' . $e->getMessage()); } } /** * 获取指定用户下周的任务(已分配但未完成) */ public function getNextWeekTasks(string $account, ?string $startDate = null): array { // 下周开始时间 $nextWeekStart = $startDate ? Carbon::parse($startDate)->addWeek()->startOfWeek() : Carbon::now()->addWeek()->startOfWeek(); try { // 查询未完成的任务作为下周计划 $tasks = DB::connection('zentao') ->table('task') ->leftJoin('project', 'task.project', '=', 'project.id') ->select( 'task.id', 'task.name', 'task.desc', 'task.status', 'task.deadline', 'task.estimate', 'task.pri', 'project.name as projectName' ) ->where('task.assignedTo', $account) ->where('task.deleted', '0') ->whereIn('task.status', ['wait', 'doing', 'pause']) ->orderBy('task.pri') ->orderBy('task.deadline') ->limit(20) ->get(); return $tasks->map(function ($task) { return [ 'id' => $task->id, 'name' => $task->name, 'description' => $this->formatNextWeekTaskDescription($task), 'status' => $this->translateStatus($task->status), 'projectName' => $task->projectName ?: '未分类', 'deadline' => $task->deadline, 'estimate' => $task->estimate, ]; })->toArray(); } catch (\Exception $e) { throw new \Exception('获取下周任务失败: ' . $e->getMessage()); } } /** * 格式化任务描述 */ private function formatTaskDescription($task): string { $desc = $task->name; if ($task->projectName) { $desc = "[{$task->projectName}] {$desc}"; } return $desc; } /** * 格式化下周任务描述 */ private function formatNextWeekTaskDescription($task): string { $desc = $task->name; if ($task->projectName) { $desc = "[{$task->projectName}] {$desc}"; } return $desc; } /** * 翻译任务状态 */ private function translateStatus(string $status): string { $map = [ 'wait' => '未开始', 'doing' => '进行中', 'done' => '已完成', 'pause' => '已暂停', 'cancel' => '已取消', 'closed' => '已关闭', ]; return $map[$status] ?? $status; } /** * 测试数据库连接 */ public function testConnection(): bool { try { DB::connection('zentao')->getPdo(); return true; } catch (\Exception $e) { return false; } } }