Appearance
Projects - Technical Map
Auto-generated bởi codebase-doc-generator ngày 2026-03-23 (verified từ code thực). Không chỉnh sửa thủ công.
Routes
| Route | Path | Mục đích |
|---|---|---|
ROUTE_PROJECT | /p/project | Workspace chính của project board và my-task |
ROUTE_PROJECT_CREATE | /p/project/create | Tạo project |
ROUTE_PROJECT_CLONE | /p/project/create/:id | Clone project |
ROUTE_PROJECT_CLONE_TASK_QUICK_VIEW | /p/project/create/:id/task/:taskId | Xem nhanh task trong lúc clone |
ROUTE_PROJECT_UPDATE | /p/project/:id/edit | Sửa project |
ROUTE_PROJECT_DETAIL | /p/project/:id | Chi tiết project |
ROUTE_PROJECT_UPDATE_IN_DETAIL | /p/project/:id/update-in-detail | Sửa project khi đang ở detail |
ROUTE_PROJECT_TASK_CREATE | /p/project/:id/task/create | Tạo task |
ROUTE_PROJECT_TASK_CREATE_FROM_COLUMN | /p/project/:id/task/create-from-column | Tạo task từ cột trên board |
ROUTE_PROJECT_TASK_UPDATE | /p/project/:id/task/:taskId/edit | Sửa task |
ROUTE_PROJECT_TASK_UPDATE_IN_DETAIL | /p/project/:id/task/:taskId/update-in-detail | Sửa task khi đang ở detail |
ROUTE_PROJECT_TASK_DETAIL | /p/project/:id/task/:taskId | Xem chi tiết task |
ROUTE_MY_TASK_DETAIL | /p/project/:id/my-task/:taskId | Xem chi tiết task từ tab my-task |
ROUTE_PROJECT_TASK_DETAIL_QUICK_VIEW | /p/project/:id/task/view/:taskId | Quick view task |
ROUTE_ORDER_TASK_DETAIL_QUICK_VIEW | /p/project/:id/task/view/:taskId/order-service | Quick view task dạng order-service |
ROUTE_ORDER_TASK_UPDATE | /p/project/:id/task/:taskId/edit/order-service | Sửa task dạng order-service |
Navigation & Permission
| Item | Giá trị |
|---|---|
MODULE_PROJECT | p |
Shared moduleId | task_management |
| Main module permissions | ITLeader, ITStaff, BranchPOS, AccountantStaff, HRStaff, HRCheck, WarehouseRoles |
| Edit/detail task permissions | Hẹp hơn, chủ yếu ITLeader, ITStaff, BranchPOS; riêng task detail có thêm WarehouseRoles |
| Navigation anomaly | Có thêm menu Hoàn Tiền trỏ sang ROUTE_WITHDRAW_REQUEST ngay trong module projects |
FE Pages (6)
| Page | File | Vai trò |
|---|---|---|
Project | pages/Project.tsx | Workspace root với tab list và my-task |
ProjectCreate | pages/ProjectCreate.tsx | Tạo/sửa/clone project |
ProjectDetail | pages/ProjectDetail.tsx | Vùng board/detail của một project |
TaskCreate | pages/TaskCreate.tsx | Tạo/sửa task, subtask, gift task, doctor task |
TaskDetail | pages/TaskDetail.tsx | Detail task với Comments + General |
QuickViewTaskDetail | pages/QuickViewTaskDetail.tsx | Dialog xem nhanh task và đổi trạng thái |
FE Components / Areas
| Component/Area | Vai trò |
|---|---|
ProjectTable | Bảng danh sách project hoặc board entry |
MyTask | Màn hình công việc cá nhân |
Comments | Luồng bình luận task |
General | Metadata task và action chính |
TaskAssigneeSelect | Chọn assignee theo role trong task |
TaskLabel* | Quản lý label của task |
TaskFile* | Quản lý file đính kèm |
TaskStatus* | Hiển thị/chuyển trạng thái task |
GraphQL Operations
File: diva-admin/src/modules/projects/graphql/project.graphql
Project / board
| Operation | Mục đích |
|---|---|
GetProject | Lấy danh sách project |
GetSearchProject | Tìm kiếm project |
GetProjectByPk | Lấy chi tiết project |
CreateProject | Tạo project |
UpdateProject | Update project theo where |
UpdateProjectByPK | Update project by pk |
DeleteProject | Soft delete project |
UpdateProjectMember | Cập nhật thành viên project |
DeleteProjectMember | Xóa thành viên project |
GetProjectOfManagerUser | Lấy project theo user quản lý |
Task / board card
| Operation | Mục đích |
|---|---|
GetTasks | Lấy task theo filter |
GetMyTasks | Lấy task cá nhân |
GetTaskCards | Lấy card view cho board |
GetTaskByPk | Chi tiết task |
CreateTask | Tạo task |
UpdateProjectTaskByPK | Update nhanh task |
UpdateTaskByPk | Update task đầy đủ |
MoveTask | Di chuyển task/cập nhật trạng thái |
UpdateTasks | Bulk update tasks |
ChangeTaskDueDateByPk | Đổi hạn task |
ChangeTaskStatusByPk | Đổi trạng thái task |
DeleteTaskByPk | Xóa task |
ListTaskID | Lấy danh sách ID task theo filter |
Assignee / label / file / comment
| Operation | Mục đích |
|---|---|
InsertTaskAssignee | Thêm assignee cho task |
UpdateTaskAssignees | Replace toàn bộ assignees |
DeleteTaskAssignee | Xóa assignee |
DeleteTaskLabel | Xóa label khỏi task |
DeleteTaskFile | Xóa file task |
GetComments | Lấy comment task |
SendComment | Gửi comment |
UpdateComment | Sửa comment |
DeleteComment | Xóa comment |
InsertCommentReaction | Thêm reaction |
UpdateCommentReaction | Sửa reaction |
Subtask / labels / reporting
| Operation | Mục đích |
|---|---|
GetSubtasks | Lấy subtasks |
GetSubTaskByPk | Chi tiết subtask |
DeleteSubTask | Xóa subtask |
UpdateSubTaskTagByPk | Đổi tag cho subtask |
CreateLabels | Tạo label mới |
AddLabelForTask | Gắn label vào task |
GetTasksByLabel | Lấy task theo label |
GetTaskLabels | Lấy danh sách labels |
GetTaskLabelPaging | Paging labels |
GetTourIncomeReportTable | Báo cáo tour income dạng bảng |
GetTourIncomeReportAggregate | Tổng hợp báo cáo tour income |
GetTourIncomeReportExcel | Xuất Excel báo cáo tour income |
GetDashBoardTourIncomeReport | Dataset dashboard |
FE Runtime logic
Project.tsx
| Logic | Ghi chú |
|---|---|
| Workspace tabs | Tách list và my-task |
| Nested detail | Nếu route detail/my-task detail khớp thì render RouterView |
ProjectDetail.tsx
| Logic | Ghi chú |
|---|---|
| Detail tabs | task và detail |
| State sync | Nạp currentProject vào useProjectStore |
| Master data | Refresh project workflows + project master data khi vào màn hình |
TaskCreate.tsx
| Logic | Ghi chú |
|---|---|
| Modes | Create, update, subtask, gift task, doctor task |
| Status bootstrap | Board automate mặc định new_branch; board thường dùng status đầu workflow |
| POS session fields | Gắn session_created_by, session_updated_by |
| Cleanup old relations | Có thể delete assignee/label/file cũ khi update |
| Post-create navigation | Có thể mở task mới trong tab detail/quick view |
TaskDetail.tsx
| Logic | Ghi chú |
|---|---|
| Main layout | Comments + General |
| Board-aware layout | Thứ tự pane thay đổi theo quick view và project.automate |
QuickViewTaskDetail.tsx
| Logic | Ghi chú |
|---|---|
| Dialog wrapper | Render TaskDetail trong popup |
| Inline transition | Gọi changeTaskByPk để đổi status |
| Guard | Chặn đổi status nếu thiếu main_assignee |
useProject.ts
| Logic | Ghi chú |
|---|---|
| CRUD facade | Gộp các query/mutation của project/task |
| Workflow helpers | Có completedTask, isReopenStatus |
| Permission helper | canEditAssigner cho assigner/creator/board leader |
| Gift-aware updates | Update task hỗ trợ is_gift, gifted_from |
useProjectTaskPermission.ts
| Logic | Ghi chú |
|---|---|
| Full scope | ITLeader hoặc board leader |
| Limited scope | Chỉ task do mình tạo, được giao, hoặc subtasks liên quan |
useProjectTaskWhereBuilder.ts
| Logic | Ghi chú |
|---|---|
| Filter dimensions | project, priority, notDone, assignees, assigner, label, missed, date, keyword |
| POS rule | Luôn thêm project.automate = true |
| Non-admin scope | Chỉ thấy task assigned-to-me hoặc created-by-me |
| Date overlap | Board thường lọc theo overlap created_at và due_date |
Core constants / workflow model
| Constant | Giá trị / Ý nghĩa |
|---|---|
POSITION_NEED_TO_COMPLETE_TODAY | need_to_complete_today |
POSITION_MAIN_ASSIGNEE | main_assignee |
POSITION_ASSIGNER | position_assigner |
POSITION_SUPORTOR | supportor |
POSITION_SUPERVISOR | supervisor |
CANNOT_MOVE_ON_STATUSES_TEMPLETE | waiting, accepted, new |
AUTOMATIC_TASK_STATUS_NEW | new_branch |
AUTOMATIC_TASK_STATUS_WAITING | waiting_branch |
AUTOMATIC_TASK_STATUS_ACCEPTED | accepted_branch |
AUTOMATIC_TASK_STATUS_INPROGRESS | inprogress_branch |
AUTOMATIC_TASK_STATUS_DONE | done_branch |
AUTOMATIC_TASK_STATUS_CENCELED | canceled_branch |
MY_TASK_STATUES | new, reopen, inprogress, reviewing, completed, cancelled, missed |
Backend Services
| Service | Vai trò |
|---|---|
controller | CRUD GraphQL cho project, project_task, comments, labels, reports |
ecommerce-api | Event trigger side-effects cho task insert/update/comment |
Backend Events
project_task_insert
| Step | Vai trò |
|---|---|
| Task log | Gọi HandleTaskLogUpdate với assigneeVersion |
| Doctor commission | Tính surgery_money, so với order.paid_amount |
| Request creation/update | Upsert request_working_schedule loại doctor_commission |
| Status escalation | Có thể chuyển new_branch -> waiting_branch |
| Parent sync | Gọi updateTaskCapture(parentID) |
| Order sync | Đồng bộ order_code, order_id, gift info từ parent/manual flow |
project_task_update_1
| Step | Vai trò |
|---|---|
updateAllCustomerVisits | Dời/tạo/xóa all_customer_visits khi done_at đổi |
updateEcommerTaskLog | Đồng bộ ecommerce_task_log khi task sang done_branch |
ProjectTaskCustomerVisitInsertUpdate | Upsert visit record cho task_service hoàn thành |
project_task_comment_insert
| Step | Vai trò |
|---|---|
| Comment history | Insert comment_action_history với insert/pin |
| Mention notify | Gửi notification cho tagged users |
| Reply owner notify | Gửi notification cho chủ comment cha |
| Assignee notify | Gửi notification cho assignees liên quan |
| Payload | Kèm task_id, avatar, project_id |
Data model / domain objects
| Object | Vai trò |
|---|---|
project | Board hoặc container của task |
project_member | Thành viên project |
project_task | Thực thể trung tâm của module |
project_task_assignee | Vai trò người tham gia task |
project_task_comment | Bình luận task |
project_task_file | File đính kèm task |
project_task_label | Nhãn gắn task |
task_label | Danh mục nhãn |
ecommerce_task_log | Log đồng bộ sang ecommerce/report |
request_working_schedule | Request commission bác sĩ phát sinh từ task |
all_customer_visits | Dữ liệu lượt ghé bị ảnh hưởng khi service task done |
Domain coupling
| Module/Domain | Kiểu liên kết |
|---|---|
ecommerce | Task gắn order, service, doctor commission, visit log |
notification | Comment task phát notification theo trigger |
report | Tour income report và dashboard đọc từ project/task domain |
user | Assignee, creator, board member, leader |
settings | Workflow status, labels, cấu hình master data |
Rủi ro / Findings kỹ thuật
| # | Note |
|---|---|
| 1 | module.ts đang khai báo lặp các child routes ROUTE_PROJECT_TASK_DETAIL_QUICK_VIEW và ROUTE_PROJECT_UPDATE_IN_DETAIL trong nhánh task detail. |
| 2 | Quyền route ROUTE_PROJECT rộng hơn đáng kể so với create/update/detail, nên user có thể nhìn thấy workspace nhưng không chắc sửa được project/task. |
| 3 | POS bị ép chỉ làm việc với project.automate = true, đây là rule ở FE query builder chứ không phải chỉ ở UI. |
| 4 | Quick view không cho đổi trạng thái nếu thiếu main_assignee, nên dữ liệu assignee không đầy đủ sẽ chặn thao tác vận hành. |
| 5 | Backend projects side-effects thực chất nằm trong ecommerce-api, cho thấy ranh giới domain giữa project và ecommerce chưa tách thật sạch. |