refactor: replace old agent logic with orchestrator-based routing, intent classification, and workflow execution for campaign and rule management.
This commit is contained in:
@@ -24,37 +24,72 @@ public class CampaignRuleService {
|
||||
|
||||
public Result<List<CampaignRule>> getAll(CampaignRuleCriteria criteria) {
|
||||
List<CampaignRule> rules = campaignRuleClient.getAll(criteria, Pageable.ofSize(10));
|
||||
return Result.of(rules, "Format these campaign rules as a markdown table with columns ID, Campaign ID, Rule Code, Status.");
|
||||
return Result.of(rules, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Không dùng markdown table.
|
||||
Hiển thị mỗi rule theo dạng danh sách đánh số:
|
||||
**[ruleName]** (`[ruleId]`) — Chiến dịch: [campaignId.description hoặc campaignId.code], Loại: [ruleType - dùng tên tiếng Việt], Hiệu lực: [effectiveFrom] → [effectiveTo]
|
||||
Mô tả: [description, tóm tắt nếu quá dài, hoặc "Chưa có"]
|
||||
Nếu không tìm thấy kết quả, thông báo nhẹ nhàng và gợi ý thử từ khóa khác.
|
||||
Luôn kết thúc bằng câu gợi mở (ví dụ: xem chi tiết rule, xem chiến dịch gốc).
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<Long> count(CampaignRuleCriteria criteria) {
|
||||
Long count = campaignRuleClient.count(criteria);
|
||||
return Result.of(count, "Present the campaign rule count.");
|
||||
return Result.of(count, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Ví dụ: "Có [count] thể lệ [phù hợp với điều kiện tìm kiếm]."
|
||||
Nếu count = 0, gợi ý người dùng thử từ khóa khác hoặc tạo rule mới.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<CampaignRule> findActiveById(String id) {
|
||||
CampaignRule rule = campaignRuleClient.findActiveById(id);
|
||||
return Result.of(rule, "Format this campaign rule as a markdown table with its details.");
|
||||
return Result.of(rule, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Trình bày chi tiết rule một cách rõ ràng:
|
||||
- Thông tin cơ bản: Tên, Mã Rule, Loại rule (tên tiếng Việt), Chiến dịch liên kết
|
||||
- Thời gian hiệu lực, Mô tả
|
||||
- Cấu hình thưởng: Pool, Sub-Pool, Chính sách hết hạn (nếu có)
|
||||
- Formula đang dùng (liệt kê tên formula có giá trị, ví dụ: "Dùng Formula 1 + Formula 4")
|
||||
- Giới hạn thưởng (Award Limits), lịch trình (Schedule) nếu có
|
||||
- Kênh thông báo (SMS/Email/Notification) nếu được cấu hình
|
||||
Dùng bullet list hoặc key-value dễ đọc, KHÔNG dùng table.
|
||||
Gợi ý người dùng có thể quay lại xem chiến dịch gốc hoặc các rule khác.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<List<CampaignRule>> findActiveByIds(String ids) {
|
||||
List<String> idList = java.util.Arrays.asList(ids.split(",\\s*"));
|
||||
List<CampaignRule> rules = campaignRuleClient.findActiveByIds(idList);
|
||||
return Result.of(rules, "Format these campaign rules as a markdown table with columns ID, Campaign ID, Rule Code, Status.");
|
||||
return Result.of(rules, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Hiển thị danh sách rule theo dạng đánh số,
|
||||
mỗi rule ghi: Tên, Mã Rule, Chiến dịch, Loại rule, Trạng thái.
|
||||
Không dùng markdown table. Tóm tắt ngắn gọn nếu danh sách dài.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<String> generateId() {
|
||||
String id = campaignRuleClient.generateId();
|
||||
return Result.of(id, "Present the newly generated campaign rule ID.");
|
||||
return Result.of(id, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Ví dụ: "Mã rule mới đã được tạo: `[id]`."
|
||||
Gợi ý người dùng có thể dùng mã này để tạo rule mới cho chiến dịch.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<String> checkId(String id) {
|
||||
String checkResult = campaignRuleClient.checkId(id);
|
||||
return Result.of(checkResult, "Present the result of the campaign rule ID check.");
|
||||
return Result.of(checkResult, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Giải thích kết quả kiểm tra mã rule:
|
||||
- Nếu hợp lệ/khả dụng: thông báo tích cực, gợi ý tạo rule.
|
||||
- Nếu đã tồn tại/không hợp lệ: thông báo rõ ràng lý do, gợi ý tạo mã mới.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<OperationResult<CampaignRule>> create(CampaignRule dto) {
|
||||
OperationResult<CampaignRule> opResult = campaignRuleClient.create(dto);
|
||||
return Result.of(opResult, "Present the result of the campaign rule creation operation, formatting the created rule details if successful.");
|
||||
return Result.of(opResult, """
|
||||
Trả lời tự nhiên bằng tiếng Việt.
|
||||
- Nếu thành công: chúc mừng, hiển thị tóm tắt rule vừa tạo (Tên, ID, Chiến dịch, Loại, Thời gian), gợi ý bước tiếp (cấu hình formula, giới hạn thưởng, lịch trình).
|
||||
- Nếu lỗi: thông báo lỗi rõ ràng, giải thích nguyên nhân, gợi ý cách khắc phục.
|
||||
""");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,52 +24,70 @@ public class CampaignService {
|
||||
public Result<List<Campaign>> getAll(CampaignCriteria criteria) {
|
||||
List<Campaign> campaigns = campaignClient.getAll(criteria, Pageable.ofSize(5));
|
||||
return Result.of(campaigns, """
|
||||
Khi trả về danh sách chiến dịch, BẮT BUỘC KHÔNG dùng markdown table. Hãy định dạng theo cấu trúc sau:
|
||||
|
||||
1. **[Tên Chiến Dịch]** (ID: `[Mã ID]`)
|
||||
- 👤 Owner: [Tên Owner] (Nếu trống, ghi là: Không có)
|
||||
- 📝 Mô tả: [Mô tả] (Nếu trống, ghi là: Không có. Nếu dài hơn 100 ký tự, thêm "...")
|
||||
Ví dụ đầu ra ĐÚNG:
|
||||
1. **Happy Birthday!** (ID: `LACO`)
|
||||
- 👤 Owner: Không có
|
||||
- 📝 Mô tả: Không có
|
||||
2. **SummerSale GOTIT Campaign** (ID: `YZFG`)
|
||||
- 👤 Owner: Ngan Ha
|
||||
- 📝 Mô tả: Không có
|
||||
|
||||
Luôn kết thúc bằng một câu hỏi gợi mở để hướng dẫn người dùng bước tiếp theo.
|
||||
|
||||
Trả lời tự nhiên bằng tiếng Việt. Không dùng markdown table.
|
||||
Hiển thị mỗi chiến dịch theo dạng danh sách đánh số:
|
||||
**[Tên]** (`[campaignId]`) — Owner: [ownerName hoặc "Chưa có"], Loại: [campaignType], Hiệu lực: [effectiveFrom] → [effectiveTo], Số rule: [numOfRule]
|
||||
Mô tả: [description, tóm tắt nếu quá dài, hoặc "Chưa có"]
|
||||
Nếu không tìm thấy kết quả, thông báo nhẹ nhàng và gợi ý thử từ khóa khác.
|
||||
Luôn kết thúc bằng câu gợi mở hướng dẫn người dùng bước tiếp theo (ví dụ: xem chi tiết, xem rule, tạo mới).
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<Long> count(CampaignCriteria criteria) {
|
||||
Long count = campaignClient.count(criteria);
|
||||
return Result.of(count, "Present the campaign count.");
|
||||
return Result.of(count, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Ví dụ: "Hiện tại có [count] chiến dịch [phù hợp với điều kiện tìm kiếm]."
|
||||
Nếu count = 0, gợi ý người dùng thử từ khóa khác hoặc tạo chiến dịch mới.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<Campaign> findActiveById(String id) {
|
||||
Campaign campaign = campaignClient.findActiveById(id);
|
||||
return Result.of(campaign, "Format this campaign as a markdown table with its details.");
|
||||
return Result.of(campaign, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Trình bày thông tin chi tiết của chiến dịch một cách rõ ràng:
|
||||
- Tên, Mã ID, Loại chiến dịch, Owner
|
||||
- Thời gian hiệu lực (từ ngày → đến ngày)
|
||||
- Mô tả (nếu có)
|
||||
- Số lượng rule, Khách hàng mục tiêu, Target ATV (nếu có)
|
||||
- Trạng thái, Người cập nhật cuối
|
||||
Dùng bullet list hoặc dạng key-value dễ đọc, KHÔNG dùng table.
|
||||
Gợi ý người dùng có thể xem danh sách rule của chiến dịch này.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<List<Campaign>> findActiveByIds(String ids) {
|
||||
List<String> idList = java.util.Arrays.asList(ids.split(",\\s*"));
|
||||
List<Campaign> campaigns = campaignClient.findActiveByIds(idList);
|
||||
return Result.of(campaigns, "Format these campaigns as a markdown table with columns ID, Name, Start Date, End Date, Status.");
|
||||
return Result.of(campaigns, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Hiển thị danh sách chiến dịch theo dạng đánh số,
|
||||
mỗi chiến dịch ghi: Tên, Mã ID, Thời gian hiệu lực, Trạng thái.
|
||||
Không dùng markdown table. Tóm tắt ngắn gọn nếu danh sách dài.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<String> generateId() {
|
||||
String id = campaignClient.generateId();
|
||||
return Result.of(id, "Present the newly generated campaign ID.");
|
||||
return Result.of(id, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Ví dụ: "Mã chiến dịch mới đã được tạo: `[id]`."
|
||||
Gợi ý người dùng có thể dùng mã này để tạo chiến dịch mới.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<String> checkId(String id) {
|
||||
String checkResult = campaignClient.checkId(id);
|
||||
return Result.of(checkResult, "Present the result of the campaign ID check.");
|
||||
return Result.of(checkResult, """
|
||||
Trả lời tự nhiên bằng tiếng Việt. Giải thích kết quả kiểm tra mã chiến dịch:
|
||||
- Nếu hợp lệ/khả dụng: thông báo tích cực, gợi ý tạo chiến dịch.
|
||||
- Nếu đã tồn tại/không hợp lệ: thông báo rõ ràng lý do, gợi ý tạo mã mới.
|
||||
""");
|
||||
}
|
||||
|
||||
public Result<OperationResult<Campaign>> create(Campaign dto) {
|
||||
OperationResult<Campaign> opResult = campaignClient.create(dto);
|
||||
return Result.of(opResult, "Present the result of the campaign creation operation, formatting the created campaign details if successful.");
|
||||
return Result.of(opResult, """
|
||||
Trả lời tự nhiên bằng tiếng Việt.
|
||||
- Nếu thành công: chúc mừng người dùng, hiển thị tóm tắt chiến dịch vừa tạo (Tên, ID, Thời gian, Loại), gợi ý bước tiếp theo (thêm rule, cấu hình thể lệ).
|
||||
- Nếu lỗi: thông báo lỗi rõ ràng, giải thích nguyên nhân nếu có, gợi ý cách khắc phục.
|
||||
""");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,42 +19,46 @@ public class CampaignRuleTools {
|
||||
|
||||
private final CampaignRuleService campaignRuleService;
|
||||
|
||||
@McpTool(description = "Lấy danh sách các Campaign Rule (Thể lệ chiến dịch). Dùng tool này khi người dùng hỏi về rule, thể lệ, quy tắc, điều kiện của chiến dịch. Cho phép tìm kiếm với param search (ví dụ: nhập tên chiến dịch hoặc tên rule vào đây), hiển thị tối đa 10 bản ghi.")
|
||||
public Result<List<CampaignRule>> campaignRules(String search) {
|
||||
@McpTool(description = """
|
||||
TÌM KIẾM THỂ LỆ / RULE của chiến dịch. Trả về: tên rule, loại rule, chiến dịch gốc, công thức thưởng.
|
||||
Dùng khi người dùng hỏi: "thể lệ", "rule", "quy tắc", "điều kiện", "công thức thưởng", "cách tính điểm".
|
||||
KHÔNG dùng tool này khi người dùng chỉ hỏi về thông tin cơ bản chiến dịch (tên, owner, loại) → hãy dùng tool searchCampaigns.
|
||||
Hiển thị tối đa 10 bản ghi.""")
|
||||
public Result<List<CampaignRule>> searchRules(String search) {
|
||||
CampaignRuleCriteria criteria = new CampaignRuleCriteria();
|
||||
criteria.setSearch(search);
|
||||
return campaignRuleService.getAll(criteria);
|
||||
}
|
||||
|
||||
@McpTool(description = "Đếm số lượng Campaign Rule, cho phép tìm kiếm với param search")
|
||||
public Result<Long> countCampaignRules(String search) {
|
||||
@McpTool(description = "Đếm số lượng RULE/THỂ LỆ, không phải chiến dịch. Cho phép tìm kiếm với param search.")
|
||||
public Result<Long> countRules(String search) {
|
||||
CampaignRuleCriteria criteria = new CampaignRuleCriteria();
|
||||
criteria.setSearch(search);
|
||||
return campaignRuleService.count(criteria);
|
||||
}
|
||||
|
||||
@McpTool(description = "Lấy thông tin chi tiết một Campaign Rule theo ID")
|
||||
public Result<CampaignRule> getCampaignRuleById(String id) {
|
||||
@McpTool(description = "Lấy chi tiết MỘT RULE/THỂ LỆ theo ID. Bao gồm: công thức thưởng, giới hạn, lịch trình.")
|
||||
public Result<CampaignRule> getRuleById(String id) {
|
||||
return campaignRuleService.findActiveById(id);
|
||||
}
|
||||
|
||||
@McpTool(description = "Lấy thông tin nhiều Campaign Rule theo danh sách ID, phân tách bằng dấu phẩy")
|
||||
public Result<List<CampaignRule>> getCampaignRulesByIds(String ids) {
|
||||
@McpTool(description = "Lấy thông tin NHIỀU RULE/THỂ LỆ theo danh sách ID, phân tách bằng dấu phẩy.")
|
||||
public Result<List<CampaignRule>> getRulesByIds(String ids) {
|
||||
return campaignRuleService.findActiveByIds(ids);
|
||||
}
|
||||
|
||||
@McpTool(description = "Tạo một ID Campaign Rule mới")
|
||||
public Result<String> generateCampaignRuleId() {
|
||||
@McpTool(description = "Tạo một MÃ RULE mới (rule ID), không phải mã chiến dịch.")
|
||||
public Result<String> generateRuleId() {
|
||||
return campaignRuleService.generateId();
|
||||
}
|
||||
|
||||
@McpTool(description = "Kiểm tra trạng thái hoặc tính hợp lệ của một ID Campaign Rule")
|
||||
public Result<String> checkCampaignRuleId(String id) {
|
||||
@McpTool(description = "Kiểm tra tính hợp lệ của một MÃ RULE (rule ID).")
|
||||
public Result<String> checkRuleId(String id) {
|
||||
return campaignRuleService.checkId(id);
|
||||
}
|
||||
|
||||
@McpTool(description = "Tạo một Campaign Rule mới")
|
||||
public Result<OperationResult<CampaignRule>> createCampaignRule(CampaignRule dto) {
|
||||
@McpTool(description = "Tạo một RULE/THỂ LỆ mới cho chiến dịch. Cần có campaignId để liên kết.")
|
||||
public Result<OperationResult<CampaignRule>> createRule(CampaignRule dto) {
|
||||
return campaignRuleService.create(dto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,41 +19,44 @@ public class CampaignTools {
|
||||
|
||||
private final CampaignService campaignService;
|
||||
|
||||
@McpTool(description = "Lấy danh sách chiến dịch (Campaign), cho phép tìm kiếm với param search. CHỈ dùng tool này khi cần tìm thông tin về chính chiến dịch đó. NẾU người dùng hỏi về RULE / THỂ LỆ của chiến dịch, HÃY DÙNG tool campaignRules.")
|
||||
public Result<List<Campaign>> campaigns(String search) {
|
||||
@McpTool(description = """
|
||||
TÌM KIẾM CHIẾN DỊCH (Campaign). Trả về thông tin CƠ BẢN của chiến dịch: tên, mã, owner, loại, thời gian.
|
||||
Dùng khi người dùng hỏi: "danh sách chiến dịch", "tìm chiến dịch", "chiến dịch nào", "campaign nào".
|
||||
KHÔNG dùng tool này khi người dùng hỏi về: rule, thể lệ, quy tắc, điều kiện, công thức thưởng → hãy dùng tool searchRules.""")
|
||||
public Result<List<Campaign>> searchCampaigns(String search) {
|
||||
CampaignCriteria criteria = new CampaignCriteria();
|
||||
criteria.setSearch(search);
|
||||
return campaignService.getAll(criteria);
|
||||
}
|
||||
|
||||
@McpTool(description = "Đếm số lượng chiến dịch, cho phép tìm kiếm với param search")
|
||||
@McpTool(description = "Đếm số lượng CHIẾN DỊCH (Campaign), không phải rule. Cho phép tìm kiếm với param search.")
|
||||
public Result<Long> countCampaigns(String search) {
|
||||
CampaignCriteria criteria = new CampaignCriteria();
|
||||
criteria.setSearch(search);
|
||||
return campaignService.count(criteria);
|
||||
}
|
||||
|
||||
@McpTool(description = "Lấy thông tin chi tiết một chiến dịch theo ID")
|
||||
@McpTool(description = "Lấy chi tiết MỘT CHIẾN DỊCH theo ID. Trả về thông tin cơ bản của chiến dịch, KHÔNG bao gồm rule/thể lệ.")
|
||||
public Result<Campaign> getCampaignById(String id) {
|
||||
return campaignService.findActiveById(id);
|
||||
}
|
||||
|
||||
@McpTool(description = "Lấy thông tin nhiều chiến dịch theo danh sách ID, phân tách bằng dấu phẩy")
|
||||
@McpTool(description = "Lấy thông tin NHIỀU CHIẾN DỊCH theo danh sách ID, phân tách bằng dấu phẩy. Không bao gồm rule.")
|
||||
public Result<List<Campaign>> getCampaignsByIds(String ids) {
|
||||
return campaignService.findActiveByIds(ids);
|
||||
}
|
||||
|
||||
@McpTool(description = "Tạo một ID chiến dịch mới")
|
||||
@McpTool(description = "Tạo một MÃ CHIẾN DỊCH mới (campaign ID), không phải mã rule.")
|
||||
public Result<String> generateCampaignId() {
|
||||
return campaignService.generateId();
|
||||
}
|
||||
|
||||
@McpTool(description = "Kiểm tra trạng thái hoặc tính hợp lệ của một ID chiến dịch")
|
||||
@McpTool(description = "Kiểm tra tính hợp lệ của một MÃ CHIẾN DỊCH (campaign ID).")
|
||||
public Result<String> checkCampaignId(String id) {
|
||||
return campaignService.checkId(id);
|
||||
}
|
||||
|
||||
@McpTool(description = "Tạo một chiến dịch mới")
|
||||
@McpTool(description = "Tạo một CHIẾN DỊCH mới (Campaign). Sau khi tạo xong, cần thêm rule/thể lệ bằng tool createRule.")
|
||||
public Result<OperationResult<Campaign>> createCampaign(Campaign dto) {
|
||||
return campaignService.create(dto);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user