Workflow (luồng công việc) là một tập hợp các hoạt động, công việc hoặc quy trình liên quan mà người hoặc hệ thống thực hiện để hoàn thành một nhiệm vụ cụ thể. Nó mô tả các bước cần thiết và quy trình thực hiện các công việc từ đầu đến cuối, bao gồm các loại công việc (dạng tuyến tính, dạng tree, dạng xử lý song song).
Ý tưởng chính : Một luồng công việc hay một luồng nghiệp vụ có thể cọi là một workflow, để giải quyết công việc đó ta cần làm nhiều công việc nhỏ gọi là task.Mỗi nghiệp vụ sẽ được chia làm 3 dạng cơ bản nhất, nó bao gồm
- linear : dạng tuyến tính
- tree : dạng cây
- parallel : dạng song song ( đối với dạng này không đề xuất template chung, phải dựa vào kinh nghiệm thực tế và kĩ năng của lập trình viên)
Linear workflow
Linear workflow (luồng công việc tuyến tính) là một loại workflow trong đó các hoạt động được thực hiện theo một trình tự tuyến tính, từ bước này đến bước khác, không có sự rẽ nhánh và không có sự trùng lặp. Nghĩa là, sau khi hoàn thành một hoạt động, tiếp theo sẽ là hoạt động tiếp theo trong trình tự.
Trong linear workflow, mỗi hoạt động được thực hiện sau khi hoạt động trước đó hoàn thành. Không có sự nhánh hoặc lựa chọn giữa các hoạt động khác nhau. Ví dụ, nếu có một linear workflow cho quy trình xử lý đơn hàng, các bước có thể là: Xác nhận đơn hàng, Xử lý thanh toán, đóng gói sản phẩm và Gửi hàng. Các hoạt động này sẽ được thực hiện theo một trình tự tuyến tính, với mỗi hoạt động chỉ bắt đầu khi hoạt động trước đó hoàn thành.
Linear workflow thường được sử dụng trong các quy trình đơn giản và tuyến tính, trong đó không có sự phụ thuộc phức tạp giữa các hoạt động và không có nhu cầu nhánh hoặc lựa chọn. Nó giúp đơn giản hóa quy trình và dễ dàng hiểu và theo dõi. Tuy nhiên, linear workflow có thể không phù hợp cho các quy trình phức tạp hơn, trong đó có các quyết định, nhánh hoặc lựa chọn phải được thực hiện.
sample
Ví dụ cho nghiệp vụ tạo 1 tài khoản:
@Component
@AllArgsConstructor
public class CreateNewAccountScenario {
final InputAccountTask inputAccountTask;
final AutoApproveAccountTask autoApproveAccountTask;
final NotiTask notiTask;
public AccountResponse doCreate(AccountContext context) {
// Bước 1 : Tạo tài khoản cá nhân
context.addTask(inputAccountTask);
// Bước 2 : Tự động duyệt thông tin
context.addTask(autoApproveAccountTask)
// Bước 3 : Gửi thông báo
context.addTask(notiTask);
context.serialRun();
return context.dataModel.fullContext (AccountResponse.class.getSimpleName(), AccountResponse.class);
}
}
Tree workflow
Preorder Traversal
Tree workflow (luồng công việc cây) là một loại workflow trong đó các hoạt động được tổ chức thành một cấu trúc cây, với các nhánh và nút lá.
Mỗi nút trong cây đại diện cho một hoạt động cụ thể trong quy trình, và các nhánh chỉ ra các mối quan hệ và trình tự giữa các hoạt động.
Nó cung cấp một cấu trúc linh hoạt và dễ dàng mở rộng để quản lý các quy trình phức tạp và đảm bảo sự theo dõi và kiểm soát hiệu quả.
Ví dụ về nghiệp vụ duyệt tài khoản
@Component
@AllArgsConstructor
public class ApproveScenario {
final DetectAccountLiveTask detectAccountLiveTask; // Kiểm tra account có thỏa mãn để được duyệt
final RejectTask rejectTask; // Task từ chối
final WriteHistoryTask writeHistoryTask; // Task ghi lịch sử
final NotiTask notiTask; // Task thông báo kết quả (sms,noti...)
public AccountResponse doApprove(AccountContext context) {
// Bước 1 : khởi tạo các node cho tree và node cho subtree , task đầu tiên được gọi là root task
var rootTask = new TreeNodeTask<>(detectAccountLiveTask);
var notiTreeTask = new TreeNodeTask<>(notiTask);
// case xử lý nghiệp vụ từ chối
var rejectTreeTask = new TreeNodeTask<>(rejectTask);
// Sau khi từ chối thì gửi thông báo
rejectTask.setRight(notiTask);
// case xử lý ghi nhật kí thành công
var writeHistoryTreeTask = new TreeNodeTask<>(writeHistoryTask);
// Gửi thông báo sau khi duyệt thành công
writeHisTask.setRight(notiTask);
// Bước 2 : Tạo kịch bản xử lý
// Nếu account thỏa mãn thì chạy case ghi nhật kí
rootTask.setRight(writeHisTask);
// Nếu account không thỏa mãn thì chạy case từ chối
rootTask.setLeft(rejectTask);
var treeWorkFlow = new TreeWorkFlow<AccountContext>();
// Bước 3 : Chạy mô hình
treeWorkFlow.runOneTreeTask(rootTask, context);
return context.dataModel.fullContext (AccountResponse.class.getSimpleName(),
AccountResponse.class);
}
}
source code : https://github.com/esga1102/workflow-template
Top comments (0)