Chương 11. Tự động hóa quy trình
Back To BlogsChương 11. Tự động hóa quy trình
📚 Mục lục sáchMột trong những giá trị lớn nhất của một nền tảng số không chỉ là hiển thị thông tin, mà là tự động làm việc thay bạn. Chương này giới thiệu cách EzyPlatform giúp bạn tự động hóa các quy trình lặp lại: từ gửi email, nhắc lịch, đến phản ứng tự động khi có sự kiện xảy ra. Trong EzyPlatform có rất nhiều các tính năng tự động mà cuốn sách này không thể liệt kê hết được. Chúng ta cùng tìm hiểu một số tính năng tự động mà bạn hay sử dụng nhất nhé.
Tự động gửi email thông tin đơn hàng
Khi người dùng mua sản phẩm — ví dụ là bánh mà chúng ta đã đề cập ở các chương trước — bạn sẽ cần gửi email thông báo cho khách hàng. Việc gửi thủ công gần như bất khả thi: bạn không thể biết trước khi nào khách mua để ngồi soạn email, mà nếu thông báo chậm trễ thì trải nghiệm mua hàng cũng mất đi sự chuyên nghiệp. Chính vì thế mô đun E-Commerce đã tích hợp sẵn tính năng tự động này: mỗi khi trạng thái đơn hàng thay đổi, một email tương ứng sẽ tự động được gửi đến khách hàng mà bạn không cần can thiệp gì thêm.
Những email nào được gửi tự động cho khách hàng
Mỗi trạng thái đơn hàng ứng với một mẫu thư riêng, để khách hàng luôn biết đơn của mình đang ở đâu trong quy trình. Sơ đồ dưới đây thể hiện đúng thứ tự các email được gửi, tương ứng với từng hành động của khách hàng hoặc cửa hàng:
flowchart TD
A["Khách đặt hàng"] --> B["Chờ thanh toán<br/>📧 order_created"]
B -- "Khách thanh toán<br/>(chuyển khoản / QR)" --> C["Chờ xác nhận<br/>📧 order_reviewing"]
B -- "Quá hạn vẫn chưa thanh toán" --> R["Nhắc thanh toán<br/>📧 order_payment_request"]
R -.->|"Chờ khách thanh toán tiếp"| B
B -- "Thanh toán qua cổng bị lỗi" --> E["Bị từ chối<br/>📧 order_rejected"]
C -- "Cửa hàng đối soát,<br/>xác nhận đã nhận tiền" --> D["Đã thanh toán<br/>📧 order_approved"]
D -.->|"Xác nhận tiền về<br/>(đối soát thủ công)"| P["📧 email xác nhận thanh toán"]
C -- "Cửa hàng từ chối đơn" --> E
classDef start fill:#3b82f6,stroke:#1d4ed8,color:#ffffff;
classDef pending fill:#f59e0b,stroke:#b45309,color:#ffffff;
classDef success fill:#10b981,stroke:#047857,color:#ffffff;
classDef fail fill:#ef4444,stroke:#b91c1c,color:#ffffff;
class A start;
class B,C,R pending;
class D,P success;
class E fail;
linkStyle default stroke:#94a3b8,stroke-width:1.5px;
Hai trạng thái "Đã huỷ" và "Không hợp lệ" không xuất hiện trong sơ đồ vì đây là hai trường hợp duy nhất không kích hoạt email nào (xem lý do ở phần dưới).
| Trạng thái đơn hàng | Mẫu thư | Khi nào được gửi |
|---|---|---|
| Chờ thanh toán | order_created |
Ngay khi khách đặt hàng thành công — xác nhận đơn đã được ghi nhận. |
| Chờ xác nhận | order_reviewing |
Khi đơn chuyển sang chờ cửa hàng đối soát, thường gặp với hình thức chuyển khoản. |
| Đã thanh toán | order_approved |
Khi đơn được duyệt hoặc xác nhận đã thanh toán thành công — email khách mong chờ nhất. |
| Lỗi thanh toán / Bị từ chối | order_rejected |
Khi thanh toán thất bại hoặc cửa hàng từ chối đơn. |
| Chờ thanh toán quá lâu | order_payment_request |
Nhắc khách hoàn tất thanh toán khi đơn vẫn đang ở trạng thái chờ thanh toán. |
Lý do EzyPlatform bỏ qua hai trạng thái này là để tránh làm phiền khách hàng với những thông tin họ không cần biết — huỷ đơn hay đơn không hợp lệ thường do lỗi hệ thống hoặc thao tác nội bộ, không liên quan đến trải nghiệm mua hàng của khách. Mỗi email đều kèm một liên kết dẫn thẳng đến trang chi tiết đơn hàng trên website của bạn, để khách hàng xem lại đơn mình đã đặt mà không cần đăng nhập.
Bật/tắt gửi email thông báo đơn hàng
Truy cập menu cài đặt E-Commerce, hoặc theo đường dẫn {đường dẫn admin của bạn}/ecommerce/settings, bạn sẽ thấy tuỳ chọn Cho phép gửi email thông báo đơn hàng. Tắt tuỳ chọn này nếu bạn muốn tự xử lý việc thông báo theo cách khác. Còn nội dung từng email — tiêu đề, câu chữ, giao diện HTML — bạn tuỳ chỉnh ở phần ngay sau đây.
Email tổng hợp đơn hàng mới cho người quản lý
Song song với email gửi cho khách, E-Commerce còn tự động gửi một email tổng hợp cho đội ngũ quản lý cửa hàng, liệt kê số đơn mới và số đơn đang chờ xác nhận trong một khoảng thời gian, kèm liên kết vào trang quản trị để xử lý ngay. Đây là email gửi theo đợt — không phải theo từng đơn riêng lẻ — để tránh làm ngập hộp thư của bạn mỗi khi có nhiều đơn dồn dập.
Bạn cấu hình email này ngay tại trang cài đặt E-Commerce: khai báo Các email quản lý đơn hàng (tối đa 15 địa chỉ) và Chu kỳ thông báo có đơn hàng mới — mặc định 15 phút một lần. Nếu để trống danh sách email quản lý, tính năng này sẽ tự động không gửi.
Chỉnh sửa các mẫu email thông tin đơn hàng
Vào menu Các mẫu thư trên trang quản trị để sửa trực tiếp là cách nhanh nhất, nhưng nếu bạn đang ngồi sẵn trong VS Code với AI Assistant — đúng tinh thần vibe coding của cuốn sách này — bạn có thể chỉnh các mẫu thư ngay trên máy tính bằng extension EzyArticle đã cài đặt từ Chương 3, thay vì mở trình duyệt qua lại.
Extension đồng bộ mỗi mẫu thư với một thư mục con trong mail-templates, đặt đúng tên mẫu thư đã liệt kê ở bảng trên:
mail-templates/
└── order_approved/
├── title.html (tiêu đề email)
├── content.html (nội dung email)
└── meta.json (trạng thái, loại nội dung, tham số xem trước)
Cách thực hiện:
- 1. Tạo thư mục: trong
mail-templates, tạo thư mục con đặt đúng tên mẫu thư bạn muốn sửa, ví dụorder_approved. - 2. Đồng bộ từ máy chủ: chuột phải vào thư mục vừa tạo, chọn Đồng Bộ Thư Mục Mail Template — extension sẽ tải về đúng
title.html,content.html,meta.jsonhiện có trên máy chủ, không phải tạo lại từ đầu. - 3. Nhờ AI chỉnh sửa: mở
content.html, nhờ AI viết lại giọng văn — chỉ cần dặn AI giữ nguyên các biến(ví dụ,,) vì đó là nơi hệ thống điền dữ liệu thật vào khi gửi. - 4. Xem trước: chuột phải vào thư mục hoặc file, chọn Xem Trước Mail Template để mở trình duyệt xem email sẽ trông như thế nào trước khi phát hành.
- 5. Xuất bản: ưng ý rồi thì chuột phải chọn Xuất Bản Nội Dung Lên Máy Chủ để ghi đè lên mẫu thư đang chạy thật.
Đọc file mail-templates/order_approved/content.html giúp tôi và viết lại theo giọng văn thân thiện, gần gũi, có lời cảm ơn khách đã mua bánh. Giữ nguyên toàn bộ các biến dạng , chỉ thay đổi câu chữ xung quanh.
Cách làm này đặc biệt hữu ích khi bạn muốn chỉnh đồng loạt nhiều mẫu thư cùng lúc (ví dụ đổi giọng văn toàn bộ 5 email đơn hàng cho đồng nhất), hoặc muốn lưu lại lịch sử chỉnh sửa bằng git — những việc mà thao tác từng mẫu trên giao diện quản trị không làm được.
Marketing tự động
Gửi email thông báo đơn hàng là tự động hóa "phản ứng" — có sự kiện thì mới gửi. Nhưng marketing thì khác: bạn cần tự động hóa cả việc chủ động tìm đúng khách hàng để gửi (ví dụ khách lâu ngày chưa quay lại mua bánh) và chuỗi hành động sẽ thực hiện với họ (gửi email nào, khi nào). Cài đặt thêm plugin Marketing (EzyMarketing — xem lại hướng dẫn cài đặt plugin cho EzyPlatform nếu cần) để có tính năng này.
EzyMarketing xoay quanh ba khái niệm, ghép lại với nhau theo đúng thứ tự bạn sẽ cấu hình:
| Khái niệm | Là gì | Cấu hình ở đâu |
|---|---|---|
| Chiến dịch (Campaign) | "Vỏ bọc" đặt tên cho một đợt marketing, có thời gian bắt đầu/kết thúc. | {đường dẫn admin của bạn}/ezymarketing/campaigns |
| Nhóm đối tượng tham gia (Participant Segment) | Danh sách người nhận — cố định hoặc tự động lọc bằng một truy vấn. | {đường dẫn admin của bạn}/ezymarketing/participant-segments |
| Luồng công việc (Workflow) | Chuỗi bước tự động (ví dụ gửi email) chạy lần lượt cho từng người trong nhóm. | {đường dẫn admin của bạn}/ezymarketing/workflows |
flowchart LR
CAMP["Chiến dịch<br/>(tên, thời gian chạy)"] --> SEG["Nhóm đối tượng tham gia<br/>(ai sẽ nhận)"]
SEG --> RUN["Lượt chạy luồng công việc<br/>(khi nào chạy — cron)"]
RUN --> WF["Luồng công việc<br/>(làm gì — các bước tuần tự)"]
classDef campaign fill:#3b82f6,stroke:#1d4ed8,color:#ffffff;
classDef segment fill:#f59e0b,stroke:#b45309,color:#ffffff;
classDef run fill:#8b5cf6,stroke:#6d28d9,color:#ffffff;
classDef workflow fill:#10b981,stroke:#047857,color:#ffffff;
class CAMP campaign;
class SEG segment;
class RUN run;
class WF workflow;
linkStyle default stroke:#94a3b8,stroke-width:1.5px;
Bạn gắn một hoặc nhiều nhóm đối tượng vào một chiến dịch, rồi gắn một lượt chạy (có lịch riêng) nối nhóm đối tượng đó với một luồng công việc cụ thể. Ba phần dưới đây đi vào chi tiết từng khái niệm.
Tự động tìm đúng khách hàng bằng truy vấn JPQL
Nhóm đối tượng tham gia có hai loại: cố định (bạn tự chọn từng người) và tự động — hệ thống tự lọc người tham gia dựa trên một câu truy vấn JPQL mà bạn khai báo trong ô Kịch bản lấy danh sách đối tượng tham gia. Vì đây là JPQL thật chạy thẳng trên cơ sở dữ liệu (mặc định truy vấn trên bảng người dùng), bạn có thể lọc theo bất kỳ điều kiện nào hệ thống lưu được — ví dụ khách đã mua hàng nhưng hơn 30 ngày chưa quay lại.
Với nhóm đối tượng tự động, hệ thống không chỉ lọc một lần: mỗi khi luồng công việc chạy, nó sẽ chạy lại truy vấn để tìm thêm người mới thoả điều kiện (dựa trên id của lần quét trước) rồi bổ sung vào danh sách — nghĩa là một chiến dịch "chào mừng khách hàng mới" chỉ cần cấu hình một lần, sau đó tự động nhận thêm khách mới liên tục mà bạn không cần đụng tay lại.
Dạng đơn giản nhất của kịch bản này trông như sau:
SELECT e.id, e.email FROM User e WHERE e.id > ?0 AND e.email IS NOT NULL
Trong đó ?0 chính là id của lần quét trước — hệ thống tự truyền giá trị này vào mỗi lần chạy lại truy vấn, nên bạn luôn phải giữ đúng điều kiện e.id > ?0 để làm điều kiện phân trang; điều kiện e.email IS NOT NULL đảm bảo không lấy nhầm những tài khoản chưa có email để gửi. Từ mẫu nền này, bạn có thể nhờ AI bổ sung thêm điều kiện lọc theo đúng nghiệp vụ của mình, như prompt mẫu dưới đây.
Hãy tra cứu schema của entity User trên EzyPlatform giúp tôi (dùng MCP Server), rồi viết một câu JPQL để lọc những người dùng đã đăng ký nhưng hơn 30 ngày qua chưa có đơn hàng nào — tôi sẽ dùng câu này làm kịch bản lấy đối tượng tham gia cho chiến dịch "Nhắc khách quay lại mua bánh".
Lưu ý là EzyPlatform không kiểm tra trước cú pháp JPQL khi bạn lưu — câu sai chỉ lộ ra khi hệ thống thực sự chạy. Vì vậy sau khi dán truy vấn vào, luôn bấm nút Xem trước để chắc chắn danh sách trả về đúng người bạn muốn, trước khi gắn nhóm đối tượng này vào một chiến dịch thật.
Thiết kế luồng công việc
Một luồng công việc gồm nhiều bước, chạy tuần tự theo đúng thứ tự bạn sắp xếp — lần lượt cho từng người trong nhóm đối tượng, hết bước này mới sang bước kế tiếp. Ví dụ dưới đây là một luồng công việc thật, dùng để tự động gửi mail cho khách hàng mỗi khi cửa hàng bánh có sản phẩm mới:
EzyMarketing có sẵn hai kiểu bước dựng sẵn:
send_email_to_one_user— gửi một mẫu thư (giống các mẫu thư đơn hàng ở phần trước) tới từng người trong nhóm đối tượng.send_product_rating_email_to_one_user— gửi email mời đánh giá sản phẩm, lấy sẵn dữ liệu từ E-Commerce; rất hợp để nối tiếp sau khi khách đã nhận được emailorder_approvedvài ngày.
Nếu cần một hành động khác ngoài hai kiểu trên, bạn nhờ lập trình viên đăng ký thêm một loại bước mới, hoặc dùng bước dạng kịch bản JavaScript tự viết. Cũng cần lưu ý là luồng công việc hiện chưa có sẵn bước "chờ N ngày" hay "rẽ nhánh theo điều kiện" — muốn có khoảng nghỉ giữa các bước, cách đơn giản nhất là tách thành nhiều lượt chạy riêng, mỗi lượt cách nhau đúng khoảng thời gian mong muốn (xem phần lên lịch bên dưới).
Lên lịch chạy bằng biểu thức cron
Mỗi lượt chạy (workflow run) — cầu nối giữa một nhóm đối tượng và một luồng công việc — có một biểu thức cron riêng quyết định khi nào nó được thực thi: chạy một lần duy nhất, hoặc lặp lại định kỳ (ví dụ mỗi sáng thứ Hai). Nếu bạn chưa quen viết cron, hãy nhờ AI dịch giúp từ câu miêu tả bình thường.
Hãy viết giúp tôi một biểu thức cron cho EzyPlatform: chạy vào 8 giờ sáng thứ Hai hàng tuần.
Hệ thống tự kiểm tra các lượt chạy đến hạn mỗi vài giây và chỉ thực thi trên máy chủ chính (để tránh gửi trùng khi bạn chạy nhiều máy chủ song song); khi chiến dịch đã hết thời gian, lượt chạy tự động dừng lại mà không cần bạn tắt tay. Điều kiện tiên quyết duy nhất: công tắc tổng Trình thực thi luồng công việc marketing trong trang cài đặt của plugin Marketing phải đang bật — tắt công tắc này thì mọi lượt chạy, dù đến giờ, cũng sẽ không được thực thi.
📌 Tóm tắt chương
- E-Commerce tự động gửi email theo từng trạng thái đơn hàng (
order_created,order_reviewing,order_approved,order_rejected,order_payment_request) — bật/tắt và tuỳ chỉnh nội dung được qua trang quản trị hoặc trực tiếp trong VS Code. - Email tổng hợp đơn hàng mới cho người quản lý được gửi theo đợt định kỳ, không phải theo từng đơn, để tránh làm ngập hộp thư.
- Marketing tự động (EzyMarketing) xoay quanh ba khái niệm: Chiến dịch, Nhóm đối tượng tham gia (lọc bằng truy vấn JPQL, tự mở rộng theo thời gian) và Luồng công việc (các bước chạy tuần tự).
- Lượt chạy luồng công việc được lên lịch bằng biểu thức cron — bạn có thể nhờ AI viết cả truy vấn JPQL lẫn biểu thức cron thay vì tự mò cú pháp.
Young Monkeys - Founder