N
NolimitHub / docs
internal feature spec
v0.1 · Draft
NolimitHub / Internal Modules / Task Management / FT-TASK-MGMT-01 — Triển khai vòng đời, phân phối, task con, chat & thông báo
Last reviewed · 08/06/2026
Feature ID · FT-TASK-MGMT-01 Priority · P1 High Status · Draft

Tài liệu Yêu cầu Triển khai
Hệ thống Quản lý Task Nội bộ

Vòng đời · Phân phối · Task con · Chat & Thông báo — module Quản lý công việc được xây ngay trên nền tảng NolimitHub, tận dụng tài khoản người dùng và hạ tầng thông báo sẵn có thay vì dựng app rời.

Owner / PO
CTO
Hệ thống chủ
NolimitHub
Ngày tạo
08/06/2026
Cập nhật cuối
08/06/2026
i
Info · Phạm vi triển khai

Bổ sung module Quản lý công việc (Task) vào NolimitHub: tạo task, giao trực tiếp hoặc qua người phân phối, task con (parent–child), chat theo task, lịch sử & log, thông báo có gộp.

!
Danger · KHÔNG nằm trong phạm vi

KHÔNG xây nền tảng quản lý dự án đầy đủ kiểu Jira/Asana — không Gantt, không timesheet, không workflow builder tự do. Chỉ đúng các trạng thái & hành vi mô tả trong tài liệu này.

§ 02

Bối cảnh & Mục tiêu

⭐ Đây là 2 mục quan trọng nhất. Dev đọc kỹ phần này để hiểu đúng vấn đề và phạm vi trước khi nghĩ tới cách làm. Toàn bộ thiết kế kỹ thuật (API/DB/cronjob/cấu trúc code) dev tự lo.

2.1 · Bối cảnh hiện tại

Hiện tại việc giao và theo dõi công việc nội bộ chủ yếu diễn ra rời rạc — qua tin nhắn chat, trao đổi miệng, hoặc mỗi người tự ghi chú riêng. Không có một nơi tập trung để biết: ai đang làm gì, task đang ở bước nào, bao giờ hết hạn, đã xong và được duyệt hay chưa.

Trước
Giao việc rời rạc
Tin nhắn chat trôi đi
Trao đổi miệng không lưu
Ghi chú cá nhân, mỗi người một kiểu
Không nghiệm thu, không log
Sau
Module Task tập trung
1 nơi tạo · giao · theo dõi
Vòng đời trạng thái rõ ràng
Chat & lịch sử gắn theo task
Thông báo gộp, log khi đóng

Hệ quả của trạng thái hiện tại

01
Thất lạc / bỏ sót

Việc giao qua chat dễ bị trôi, không ai nhận rõ ràng → công việc rơi mà không ai hay biết.

02
Không rõ trách nhiệm

Một việc không biết chính xác ai là người làm, ai là người giao / điều phối.

03
Không theo dõi được tiến độ & hạn

Không nhìn ra task nào đang chờ, đang làm, hay đã quá hạn.

04
Thiếu bước nghiệm thu

Làm xong là coi như xong, không có bước review trước khi đóng → chất lượng không kiểm soát được.

05
Không truy vết

Không biết task đã bị đổi gì, ai đổi, khi nào; không lưu vết lúc đóng task.

06
Nhiễu thông báo

Trao đổi quanh một việc nằm tản mát, mỗi tin nhắn là một thông báo riêng → loạn, dễ bỏ lỡ tin quan trọng.

Warning · Nguyên nhân gốc

Chưa có một hệ thống quản lý task tập trung với vòng đời rõ ràng, cơ chế giao – điều phối, và truy vết. Mọi thứ đang phụ thuộc thao tác thủ công & trí nhớ.

Tính năng cần bổ sung: xây module Quản lý Task nội bộ gồm các khối nghiệp vụ dưới đây (mô tả ở mức nghiệp vụ — cách hiện thực do dev tự thiết kế).

(a)

Vòng đời của task lớn

Các trạng thái và ý nghĩa được khoá cứng theo mô tả nghiệp vụ. Không thêm trạng thái ngoài danh sách dưới đây.

S0
Tạo
Task vừa được khởi tạo.
S1
Chờ giao
Đã tạo nhưng chưa xác định người làm → chờ người phân phối giao. (Chỉ xuất hiện ở luồng đi qua người phân phối.)
S2
Chờ làm
Đã có người nhận, chờ bắt đầu.
S3
Đang làm
Người nhận đang thực hiện.
S3*
Quá hạn (nếu có)
Quá thời gian hết hạn mà task chưa xong — đánh dấu cảnh báo, có thể chồng lên "Chờ làm" / "Đang làm".
S4
Hoàn thành, chờ review
Người làm báo đã xong, chờ người có thẩm quyền nghiệm thu.
S5
Đóng task
Review đạt → task kết thúc (ghi log lúc đóng).
Cần làm lại
Review không đạt → task quay lại "Chờ làm".
Diagram · Lifecycle flow
Tạo S0 Chờ giao S1 · cách 2 Chờ làm S2 Đang làm S3 Hoàn thành chờ review · S4 Đóng task S5 · ghi log Cách 1 · giao thẳng người làm Quá hạn · chồng lên S2 / S3 Cần làm lại · trả về Chờ làm ↩
Tóm tắt vòng đời
Tạo → Chờ giao → Chờ làm → Đang làm → (Quá hạn) → Hoàn thành, chờ review → Đóng task
// hoặc
Cần làm lại ↩ Chờ làm
(b)

Thông tin một task lớn

Mỗi task lớn mang các trường thông tin sau. Đây là danh sách trường nghiệp vụ; kiểu dữ liệu / bảng / index do dev tự thiết kế.

# Trường Ghi chú Bắt buộc
01 Tên task Tiêu đề ngắn gọn của công việc. required
02 Mô tả Chi tiết công việc, yêu cầu, bối cảnh. required
03 Tài liệu đính kèm File / link tham chiếu (nếu có). optional
04 Thời gian tạo Timestamp khi task được khởi tạo. auto
05 Người tạo Tài khoản NolimitHub khởi tạo task. required
06 Người phân phối Chỉ có ở luồng "cách 2". conditional
07 Thời gian hết hạn Deadline; vượt qua → trạng thái "Quá hạn". required
08 Mức độ ưu tiên Priority do người tạo gán. required
09 Trạng thái Một trong các giá trị ở vòng đời (a). auto
10 Danh sách người nhận Có thể nhiều người ở cấp task lớn. conditional
11 Đoạn chat của task Xem mục (e). embedded
12 Danh sách task con Xem mục (d). embedded
13 Lịch sử thay đổi Xem mục (f). embedded
task.entity.pseudo
pseudo-code
// Entity gợi ý — schema thực do dev tự thiết kế
Task {
  id              : UUID
  name            : String        // Tên task
  description     : Text          // Mô tả
  attachments     : List<File>    // Tài liệu đính kèm
  createdAt       : Timestamp
  createdBy       : User          // Người tạo
  dispatcher      : User?         // Người phân phối (cách 2)
  dueAt           : Timestamp     // Thời gian hết hạn
  priority        : Priority
  status          : LifecycleStatus // Tạo / Chờ giao / Chờ làm / ...
  assignees       : List<User>    // Người nhận — có thể nhiều
  chat            : Thread        // Chat gắn theo task lớn (e)
  subtasks        : List<SubTask> // Task con (d)
  history         : List<Change>  // Lịch sử thay đổi (f)
  closeLog        : CloseLog?     // Log ghi khi đóng task
}
(c)

Tạo & phân phối task — 2 cách đưa việc

Khi tạo: nhập Tên, Mô tả, đính kèm tài liệu (nếu có), mức ưu tiên, thời gian hết hạn. Sau đó chọn 1 trong 2 cách.

Cách 1 đã xác định người làm
Giao thẳng người nhận

Chọn luôn người nhận → task vào thẳng trạng thái "Chờ làm" (bỏ qua "Chờ giao").

flow Tạo Chờ làm
Cách 2 chưa xác định người làm
Qua người phân phối / tự nhận

Chọn người phân phối → task ở "Chờ giao". Người phân phối giao cho người phù hợp; hoặc ai phù hợp có thể tự nhận. Có người nhận → chuyển "Chờ làm".

flow Tạo Chờ giao Chờ làm
Ma trận quyết định khi tạo task
decision-matrix
if
action
result
Người tạo đã biết ai làm
Chọn người nhận trực tiếp
→ vào "Chờ làm"
Chưa biết ai làm
Chọn người phân phối
→ vào "Chờ giao"
Task đang ở "Chờ giao"
Người phân phối giao / có người tự nhận
→ chuyển "Chờ làm"
(d)

Task con (sub-task)

Một task lớn có thể chứa nhiều task con bên trong. Đây là quan hệ parent–child bắt buộc trong tài liệu này.

Thông tin task con

field 01
Tên
field 02
Mô tả
field 03
Trạng thái
field 04 · unique
Người làm (duy nhất 1)
field 05
Thời gian hết hạn

Vòng đời task con

Chờ làm Đang làm (Quá hạn) Hoàn thành, chờ review Đóng | Cần làm lại ↩ Chờ làm
1

Mỗi task con chỉ 1 người thực hiện.

2

Task lớn tự chuyển "Hoàn thành" khi TẤT CẢ task con đã được Đóng.

?
Cần chốt

Với task lớn không có task con thì chính người nhận báo hoàn thành → review → đóng như vòng đời ở mục (a).

Diagram · Parent ↔ Child rollup
PARENT Task lớn — "Triển khai module Task"
Hoàn thành, chờ review
auto-completed khi 3/3 child = Đóng
Child #1 — Vẽ DB schema
assignee: 1 dev
Đóng
Child #2 — Cài vòng đời S0–S5
assignee: 1 dev
Đóng
Child #3 — UI & notification
assignee: 1 dev
Đóng
(e)

Chat theo task

Mỗi task lớn có một đoạn chat riêng để trao đổi xoay quanh task đó. Chat gắn ở cấp task lớntask con dùng chung chat của task lớn, không có thread riêng cho task con.

Chat · Task ABC
cấp · task lớn
PO
CTO · 14:02
Mn tập trung làm vòng đời S0–S5 trước nhé, UI để sau.
D1
Dev 1 · 14:05
Đã nắm. Em handle child #1 (DB schema).
D2
Dev 2 · 14:07
Em đính kèm tài liệu spec NolimitHub auth ở trên cùng nhé.
Quy tắc
  • 1 task lớn = 1 thread chat duy nhất.
  • Task con không có chat riêng — dùng chung chat của task lớn.
  • Mọi tin nhắn liên quan đến task (kể cả thuộc 1 task con) đều nằm gọn ở thread này.
  • Là nguồn cho cơ chế gộp thông báo tin nhắn ở mục (g).
(f)

Lịch sử & log

f.1 · Change history
Lịch sử thay đổi của task

Mỗi task lưu lịch sử thay đổi để biết task đã được đổi gì, khi nào.

đổi trạng thái
đổi người nhận
đổi hạn
đổi ưu tiên
...
f.2 · Close log
Ghi log khi đóng task

Khi task chuyển sang trạng thái Đóng, hệ thống ghi 1 bản log riêng.

· ai đóng
· khi nào
· kết quả review
Ví dụ · Timeline thay đổi của 1 task
history.example
  1. 08/06/2026 · 09:14
    CTO đã tạo task → trạng thái Tạo
  2. 08/06/2026 · 09:14
    Trạng thái: Tạo → Chờ giao · gán người phân phối PM A
  3. 08/06/2026 · 10:32
    PM A giao cho Dev 1, Dev 2 · trạng thái Chờ giao → Chờ làm
  4. 08/06/2026 · 14:00
    Trạng thái Chờ làm → Đang làm
  5. 10/06/2026 · 17:40
    3/3 task con đã Đóng → tự chuyển Hoàn thành, chờ review
  6. 10/06/2026 · 18:05
    CTO review đạt · trạng thái Đóng task · close log ghi
(g)

Thông báo

g.1 · Thông báo trạng thái

Báo cho người liên quan khi task có diễn biến để mọi người nắm được tình hình. Các tình huống bắn thông báo:

được giao
được nhận
đổi trạng thái
sắp / đã quá hạn
chờ review
bị trả về làm lại
đóng task
… các diễn biến khác

g.2 · Thông báo tin nhắn — phải GỘP theo task lớn

Khi có tin nhắn mới trong một task, cộng dồn vào một thông báo của chính task đóKHÔNG tạo thông báo mới cho từng tin nhắn. Khi người dùng mở / đọc task thì reset bộ đếm.

✗ Sai cách KHÔNG được làm
Tin nhắn mới trong task ABC
Tin nhắn mới trong task ABC
Tin nhắn mới trong task ABC
Tin nhắn mới trong task ABC
Tin nhắn mới trong task ABC
→ 5 thông báo riêng = nhiễu
✓ Đúng gộp theo task
5
5 tin nhắn mới trong task ABC
CTO, Dev 1, Dev 2 · 2 phút trước
→ 1 thông báo duy nhất, đếm cộng dồn
notification.rules.pseudo
rule
// Khi có chat mới trong taskId
on newChatMessage(taskId, message) {
  for recipient in task.participants {
    notif = findExisting(recipient, taskId, "chat")
    if notif exists {
      notif.unreadCount += 1                // CỘNG DỒN, không tạo mới
      notif.text = "Có {n} tin nhắn mới trong task ABC"
    } else {
      create(recipient, taskId, type="chat", count=1)
    }
  }
}

on userOpensTask(userId, taskId) {
  reset(userId, taskId, "chat")             // reset bộ đếm
}

2.2 · Mục tiêu & phạm vi

🎯
Phạm vi · chốt rõ để dev không làm quá tay

Chỉ hiện thực đúng các trạng thái & hành vi ở 2.1. KHÔNG workflow builder tự do, không hệ thống phân quyền / loại trạng thái phức tạp ngoài mô tả, không phình thành nền tảng PM đầy đủ. Giữ tính năng đơn giản, đúng nhu cầu.

Sau khi làm xong

O1

Mọi công việc nội bộ được tạo – giao – theo dõi trong một hệ thống tập trung; mỗi task luôn rõ: ai tạo, ai làm/điều phối, hạn khi nào, đang ở bước nào.

O2

Có đủ 2 cách đưa việc: giao thẳng người làm, hoặc qua người phân phối / để người phù hợp tự nhận.

O3

Task lớn chia được thành task con (mỗi task con 1 người); task lớn tự hoàn thành khi mọi task con đã đóng.

O4

bước review trước khi đóng; review trượt thì trả về làm lại.

O5

Mọi thay đổi được lưu lịch sử; lúc đóng task có log.

O6

Trao đổi của một task nằm gọn trong chat của task; thông báo tin nhắn được gộp theo task, không gây nhiễu.

Ngắn hạn — release đầu

scope · release 01
✓ Vòng đời task lớn
✓ Task con
✓ 2 cách giao
✓ Chat theo task lớn
✓ Lịch sử + log đóng
✓ Thông báo (trạng thái + gộp tin nhắn)
Channel Kênh thông báo tối thiểu: in-app.

Chỉ số đo lường thành công

5 KPI dưới đây để xác định module đã giải quyết đúng vấn đề ở mục 2.1.

KPI 1
Tập trung hóa

Tỷ lệ công việc nội bộ được quản lý qua hệ thống tăng dần tới phần lớn task đi qua hệ thống.

KPI 2
100%
Không còn task "vô chủ"

Có người làm hoặc người phân phối rõ ràng + có trạng thái + có hạn.

KPI 3
100%
Truy vết đầy đủ

Mọi thay đổi và mỗi lần đóng task đều có log.

KPI 4
Có nghiệm thu

Task chỉ Đóng sau khi đi qua "Hoàn thành, chờ review".

KPI 5
1 ↑
Thông báo gọn

Tin nhắn mới trong 1 task chỉ làm tăng bộ đếm của 1 thông báo, không sinh notif lẻ.

§ 03

Quick reference

Bảng tham chiếu nhanh — không phải spec kỹ thuật chính thức; thiết kế API do dev tự lo.

ref-01
Bảng trạng thái — Task lớn vs Task con
Code Trạng thái Task lớn Task con
S0Tạo
S1Chờ giao✓ (cách 2)
S2Chờ làm
S3Đang làm
S3*Quá hạn✓ (overlay)✓ (overlay)
S4Hoàn thành, chờ review✓ (auto từ con)
S5Đóng✓ (+log)
Cần làm lại→ S2→ S2
ref-02
Quan hệ số lượng người
Đối tượngSố lượng ngườiGhi chú
Task lớn · Người tạo1Người khởi tạo task
Task lớn · Người phân phối0 hoặc 1Chỉ có ở cách 2
Task lớn · Người nhận1..nCó thể nhiều người
Task con · Người làm1Duy nhất, không nhiều
Chat thread1 / task lớnTask con dùng chung
ref-03
Trigger thông báo & quy tắc gộp
EventLoại notifyGộp?
Được giao taskstatus
Được nhận taskstatus
Đổi trạng tháistatus
Sắp / đã quá hạnstatus
Chờ reviewstatus
Bị trả về làm lạistatus
Đóng taskstatus
Tin nhắn mới trong chatchat✓ GỘP theo task lớn
⚠ Out-of-scope · không làm
Gantt chart
Timesheet
Workflow builder tự do
Phân quyền phức tạp
Loại trạng thái ngoài mô tả
App tách rời NolimitHub