Skip to content

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

RoutePathMục đích
ROUTE_PROJECT/p/projectWorkspace chính của project board và my-task
ROUTE_PROJECT_CREATE/p/project/createTạo project
ROUTE_PROJECT_CLONE/p/project/create/:idClone project
ROUTE_PROJECT_CLONE_TASK_QUICK_VIEW/p/project/create/:id/task/:taskIdXem nhanh task trong lúc clone
ROUTE_PROJECT_UPDATE/p/project/:id/editSửa project
ROUTE_PROJECT_DETAIL/p/project/:idChi tiết project
ROUTE_PROJECT_UPDATE_IN_DETAIL/p/project/:id/update-in-detailSửa project khi đang ở detail
ROUTE_PROJECT_TASK_CREATE/p/project/:id/task/createTạo task
ROUTE_PROJECT_TASK_CREATE_FROM_COLUMN/p/project/:id/task/create-from-columnTạo task từ cột trên board
ROUTE_PROJECT_TASK_UPDATE/p/project/:id/task/:taskId/editSửa task
ROUTE_PROJECT_TASK_UPDATE_IN_DETAIL/p/project/:id/task/:taskId/update-in-detailSửa task khi đang ở detail
ROUTE_PROJECT_TASK_DETAIL/p/project/:id/task/:taskIdXem chi tiết task
ROUTE_MY_TASK_DETAIL/p/project/:id/my-task/:taskIdXem chi tiết task từ tab my-task
ROUTE_PROJECT_TASK_DETAIL_QUICK_VIEW/p/project/:id/task/view/:taskIdQuick view task
ROUTE_ORDER_TASK_DETAIL_QUICK_VIEW/p/project/:id/task/view/:taskId/order-serviceQuick view task dạng order-service
ROUTE_ORDER_TASK_UPDATE/p/project/:id/task/:taskId/edit/order-serviceSửa task dạng order-service
ItemGiá trị
MODULE_PROJECTp
Shared moduleIdtask_management
Main module permissionsITLeader, ITStaff, BranchPOS, AccountantStaff, HRStaff, HRCheck, WarehouseRoles
Edit/detail task permissionsHẹp hơn, chủ yếu ITLeader, ITStaff, BranchPOS; riêng task detail có thêm WarehouseRoles
Navigation anomalyCó thêm menu Hoàn Tiền trỏ sang ROUTE_WITHDRAW_REQUEST ngay trong module projects

FE Pages (6)

PageFileVai trò
Projectpages/Project.tsxWorkspace root với tab listmy-task
ProjectCreatepages/ProjectCreate.tsxTạo/sửa/clone project
ProjectDetailpages/ProjectDetail.tsxVùng board/detail của một project
TaskCreatepages/TaskCreate.tsxTạo/sửa task, subtask, gift task, doctor task
TaskDetailpages/TaskDetail.tsxDetail task với Comments + General
QuickViewTaskDetailpages/QuickViewTaskDetail.tsxDialog xem nhanh task và đổi trạng thái

FE Components / Areas

Component/AreaVai trò
ProjectTableBảng danh sách project hoặc board entry
MyTaskMàn hình công việc cá nhân
CommentsLuồng bình luận task
GeneralMetadata task và action chính
TaskAssigneeSelectChọ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

OperationMục đích
GetProjectLấy danh sách project
GetSearchProjectTìm kiếm project
GetProjectByPkLấy chi tiết project
CreateProjectTạo project
UpdateProjectUpdate project theo where
UpdateProjectByPKUpdate project by pk
DeleteProjectSoft delete project
UpdateProjectMemberCập nhật thành viên project
DeleteProjectMemberXóa thành viên project
GetProjectOfManagerUserLấy project theo user quản lý

Task / board card

OperationMục đích
GetTasksLấy task theo filter
GetMyTasksLấy task cá nhân
GetTaskCardsLấy card view cho board
GetTaskByPkChi tiết task
CreateTaskTạo task
UpdateProjectTaskByPKUpdate nhanh task
UpdateTaskByPkUpdate task đầy đủ
MoveTaskDi chuyển task/cập nhật trạng thái
UpdateTasksBulk update tasks
ChangeTaskDueDateByPkĐổi hạn task
ChangeTaskStatusByPkĐổi trạng thái task
DeleteTaskByPkXóa task
ListTaskIDLấy danh sách ID task theo filter

Assignee / label / file / comment

OperationMục đích
InsertTaskAssigneeThêm assignee cho task
UpdateTaskAssigneesReplace toàn bộ assignees
DeleteTaskAssigneeXóa assignee
DeleteTaskLabelXóa label khỏi task
DeleteTaskFileXóa file task
GetCommentsLấy comment task
SendCommentGửi comment
UpdateCommentSửa comment
DeleteCommentXóa comment
InsertCommentReactionThêm reaction
UpdateCommentReactionSửa reaction

Subtask / labels / reporting

OperationMục đích
GetSubtasksLấy subtasks
GetSubTaskByPkChi tiết subtask
DeleteSubTaskXóa subtask
UpdateSubTaskTagByPkĐổi tag cho subtask
CreateLabelsTạo label mới
AddLabelForTaskGắn label vào task
GetTasksByLabelLấy task theo label
GetTaskLabelsLấy danh sách labels
GetTaskLabelPagingPaging labels
GetTourIncomeReportTableBáo cáo tour income dạng bảng
GetTourIncomeReportAggregateTổng hợp báo cáo tour income
GetTourIncomeReportExcelXuất Excel báo cáo tour income
GetDashBoardTourIncomeReportDataset dashboard

FE Runtime logic

Project.tsx

LogicGhi chú
Workspace tabsTách listmy-task
Nested detailNếu route detail/my-task detail khớp thì render RouterView

ProjectDetail.tsx

LogicGhi chú
Detail tabstaskdetail
State syncNạp currentProject vào useProjectStore
Master dataRefresh project workflows + project master data khi vào màn hình

TaskCreate.tsx

LogicGhi chú
ModesCreate, update, subtask, gift task, doctor task
Status bootstrapBoard automate mặc định new_branch; board thường dùng status đầu workflow
POS session fieldsGắn session_created_by, session_updated_by
Cleanup old relationsCó thể delete assignee/label/file cũ khi update
Post-create navigationCó thể mở task mới trong tab detail/quick view

TaskDetail.tsx

LogicGhi chú
Main layoutComments + General
Board-aware layoutThứ tự pane thay đổi theo quick view và project.automate

QuickViewTaskDetail.tsx

LogicGhi chú
Dialog wrapperRender TaskDetail trong popup
Inline transitionGọi changeTaskByPk để đổi status
GuardChặn đổi status nếu thiếu main_assignee

useProject.ts

LogicGhi chú
CRUD facadeGộp các query/mutation của project/task
Workflow helperscompletedTask, isReopenStatus
Permission helpercanEditAssigner cho assigner/creator/board leader
Gift-aware updatesUpdate task hỗ trợ is_gift, gifted_from

useProjectTaskPermission.ts

LogicGhi chú
Full scopeITLeader hoặc board leader
Limited scopeChỉ task do mình tạo, được giao, hoặc subtasks liên quan

useProjectTaskWhereBuilder.ts

LogicGhi chú
Filter dimensionsproject, priority, notDone, assignees, assigner, label, missed, date, keyword
POS ruleLuôn thêm project.automate = true
Non-admin scopeChỉ thấy task assigned-to-me hoặc created-by-me
Date overlapBoard thường lọc theo overlap created_atdue_date

Core constants / workflow model

ConstantGiá trị / Ý nghĩa
POSITION_NEED_TO_COMPLETE_TODAYneed_to_complete_today
POSITION_MAIN_ASSIGNEEmain_assignee
POSITION_ASSIGNERposition_assigner
POSITION_SUPORTORsupportor
POSITION_SUPERVISORsupervisor
CANNOT_MOVE_ON_STATUSES_TEMPLETEwaiting, accepted, new
AUTOMATIC_TASK_STATUS_NEWnew_branch
AUTOMATIC_TASK_STATUS_WAITINGwaiting_branch
AUTOMATIC_TASK_STATUS_ACCEPTEDaccepted_branch
AUTOMATIC_TASK_STATUS_INPROGRESSinprogress_branch
AUTOMATIC_TASK_STATUS_DONEdone_branch
AUTOMATIC_TASK_STATUS_CENCELEDcanceled_branch
MY_TASK_STATUESnew, reopen, inprogress, reviewing, completed, cancelled, missed

Backend Services

ServiceVai trò
controllerCRUD GraphQL cho project, project_task, comments, labels, reports
ecommerce-apiEvent trigger side-effects cho task insert/update/comment

Backend Events

project_task_insert

StepVai trò
Task logGọi HandleTaskLogUpdate với assigneeVersion
Doctor commissionTính surgery_money, so với order.paid_amount
Request creation/updateUpsert request_working_schedule loại doctor_commission
Status escalationCó thể chuyển new_branch -> waiting_branch
Parent syncGọi updateTaskCapture(parentID)
Order syncĐồng bộ order_code, order_id, gift info từ parent/manual flow

project_task_update_1

StepVai trò
updateAllCustomerVisitsDời/tạo/xóa all_customer_visits khi done_at đổi
updateEcommerTaskLogĐồng bộ ecommerce_task_log khi task sang done_branch
ProjectTaskCustomerVisitInsertUpdateUpsert visit record cho task_service hoàn thành

project_task_comment_insert

StepVai trò
Comment historyInsert comment_action_history với insert/pin
Mention notifyGửi notification cho tagged users
Reply owner notifyGửi notification cho chủ comment cha
Assignee notifyGửi notification cho assignees liên quan
PayloadKèm task_id, avatar, project_id

Data model / domain objects

ObjectVai trò
projectBoard hoặc container của task
project_memberThành viên project
project_taskThực thể trung tâm của module
project_task_assigneeVai trò người tham gia task
project_task_commentBình luận task
project_task_fileFile đính kèm task
project_task_labelNhãn gắn task
task_labelDanh mục nhãn
ecommerce_task_logLog đồng bộ sang ecommerce/report
request_working_scheduleRequest commission bác sĩ phát sinh từ task
all_customer_visitsDữ liệu lượt ghé bị ảnh hưởng khi service task done

Domain coupling

Module/DomainKiểu liên kết
ecommerceTask gắn order, service, doctor commission, visit log
notificationComment task phát notification theo trigger
reportTour income report và dashboard đọc từ project/task domain
userAssignee, creator, board member, leader
settingsWorkflow status, labels, cấu hình master data

Rủi ro / Findings kỹ thuật

#Note
1module.ts đang khai báo lặp các child routes ROUTE_PROJECT_TASK_DETAIL_QUICK_VIEWROUTE_PROJECT_UPDATE_IN_DETAIL trong nhánh task detail.
2Quyề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.
3POS 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.
4Quick 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.
5Backend 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.