API FMCustomers/Create — dùng để thêm khách mời vào một sự kiện (Event) có sẵn trong hệ thống.
1. Tóm tắt nhanh
- Lấy ID sự kiện của sự kiện muốn thêm khách — đây chính là
key. - Gửi request POST dạng form-data tới
/FMCustomers/Create, tối thiểu cókeyvàFullName. - Muốn khách check-in bằng khuôn mặt thì gửi thêm
image(ảnh chân dung) vàCheckInFace=1. - Xem field
isSuccesstrong kết quả:truelà tạo thành công,falsethì đọcmessageđể biết lỗi.
isSuccess.
2. Key là gì?
key chính là ID sự kiện mà bạn muốn thêm khách vào (xem ở màn hình Event). Nó vừa dùng để xác thực, vừa để biết khách thuộc sự kiện nào.
Hệ thống sẽ kiểm tra:
keycó đúng định dạng GUID không (vd:3fa85f64-5717-4562-b3fc-2c963f66baa6).- Sự kiện đó có tồn tại và đang được bật (chưa bị vô hiệu hoá) không.
Nếu một trong hai điều trên không đạt → API báo lỗi và không tạo khách.
key.
3. Các trường dữ liệu gửi lên
Trường bắt buộc
| Tên field | Kiểu | Ý nghĩa |
|---|---|---|
key Bắt buộc |
GUID | ID sự kiện |
FullName Bắt buộc |
Chuỗi | Họ tên khách mời |
Trường tuỳ chọn (có thể bỏ trống)
| Tên field | Kiểu | Ý nghĩa / Ví dụ |
|---|---|---|
DearName |
Chuỗi | Danh xưng: Anh, Chị, Ông, Bà… |
NickName |
Chuỗi | Tên gọi tắt / tên hiển thị |
Email |
Chuỗi | Email khách |
Phone |
Chuỗi | Số điện thoại — dùng để chống trùng (xem mục 5) |
JobPosition |
Chuỗi | Chức vụ |
Department |
Chuỗi | Phòng ban |
Company |
Chuỗi | Công ty / đơn vị |
Location |
Chuỗi | Khu vực / địa điểm |
MemberGroup |
Chuỗi | Nhóm khách: VIP, Customer, Staff… |
ExtraParameter |
Chuỗi | Thông tin mở rộng, tuỳ nghiệp vụ |
Birthday |
Ngày | Định dạng yyyy-MM-dd, vd: 1990-05-20 |
LuckyDraw |
Chuỗi | Số may rủi. Bỏ trống để hệ thống tự sinh (xem mục 4) |
image |
File | Ảnh chân dung (jpg, png…) |
CheckInFace |
"1" / "0" | 1 = dùng ảnh để check-in bằng khuôn mặt. Chỉ có tác dụng khi có gửi image |
Trường KHÔNG cần gửi
| Tên field | Ghi chú |
|---|---|
Code Tự sinh |
Hệ thống luôn tự tạo. Có gửi lên cũng bị bỏ qua. |
Id, ImageUrl, CreateDate, UpdateDate, IsEnabled, TaskId |
Hệ thống tự xử lý. |
4. Mã khách & Số may rủi được sinh thế nào
Mã khách (Code)
Luôn do hệ thống tự sinh: một chuỗi ngẫu nhiên 20 ký tự (lấy từ GUID bỏ dấu gạch ngang), ví dụ 25ada1d56ef04200976c. Client không điền được.
Số may rủi (LuckyDraw)
| Trường hợp | Hệ thống xử lý |
|---|---|
| Bỏ trống (khuyên dùng) |
Tự sinh số ngẫu nhiên, không trùng trong cùng sự kiện. Độ dài số tuỳ theo số khách hiện có:
|
| Tự điền | Nếu số đó chưa ai dùng trong cùng sự kiện → hợp lệ. Nếu đã có người dùng → báo lỗi, không tạo khách. |
5. Quy tắc chống trùng
Hệ thống chỉ kiểm tra trùng theo Số điện thoại, và chỉ trong cùng một sự kiện.
| Tình huống | Kết quả |
|---|---|
| Phone trùng với 1 khách đã có trong cùng sự kiện | ❌ Báo lỗi, không tạo mới, không cập nhật khách cũ |
| Phone trùng nhưng ở sự kiện khác | ✅ Tạo bình thường |
| Không gửi Phone | ✅ Tạo bình thường (không dò trùng được) |
| Email trùng | ✅ Tạo bình thường (không kiểm tra Email) |
0909123456 và 0909 123 456 sẽ được coi là hai số khác nhau — nên chuẩn hoá số điện thoại trước khi gửi.
6. Ảnh và Check-in bằng khuôn mặt
Khi có gửi ảnh (image)
- Ảnh được lưu chung với hệ thống Portal.FaceMatching, đặt tên theo mã khách:
/Content/{TaskId}/FaceID/{Code}.png - Kết quả trả về sẽ có
imageUrllà link đầy đủ, mở được ngay, ví dụ:
https://facematching.aievent.vn/Content/{TaskId}/FaceID/{Code}.png
Không gửi ảnh → imageUrl là chuỗi rỗng "".
Khi bật CheckInFace=1
- Hệ thống đăng ký khuôn mặt trong ảnh lên AWS Rekognition để dùng khi check-in.
- Nếu ảnh có nhiều người, chỉ giữ khuôn mặt lớn nhất.
7. Ví dụ gọi API
Ví dụ tối thiểu
curl -X POST "https://<host-api-portal>/FMCustomers/Create" \
-F "key=3fa85f64-5717-4562-b3fc-2c963f66baa6" \
-F "FullName=Nguyễn Văn A"
Ví dụ đầy đủ (có ảnh + check-in khuôn mặt)
curl -X POST "https://<host-api-portal>/FMCustomers/Create" \
-F "key=3fa85f64-5717-4562-b3fc-2c963f66baa6" \
-F "FullName=Nguyễn Văn A" \
-F "DearName=Anh" \
-F "Email=nguyenvana@example.com" \
-F "Phone=0909123456" \
-F "Company=Công ty ABC" \
-F "JobPosition=Trưởng phòng" \
-F "MemberGroup=VIP" \
-F "CheckInFace=1" \
-F "image=@/duong/dan/anh.jpg"
Ví dụ JavaScript (fetch)
const form = new FormData();
form.append("key", "3fa85f64-5717-4562-b3fc-2c963f66baa6");
form.append("FullName", "Nguyễn Văn A");
form.append("Phone", "0909123456");
form.append("CheckInFace", "1");
form.append("image", fileInput.files[0]); // file ảnh từ <input type="file">
// Không tự set header Content-Type, trình duyệt sẽ tự thêm boundary
const res = await fetch("https://<host-api-portal>/FMCustomers/Create", {
method: "POST",
body: form
});
const data = await res.json();
if (data.isSuccess) {
console.log("Tạo thành công. Mã khách:", data.result.code,
"- Số may rủi:", data.result.luckyDraw);
} else {
console.error("Lỗi:", data.message);
}
8. Đọc kết quả trả về
Mọi kết quả đều có 4 field: statusCode, message, isSuccess, result.
✅ Thành công
{
"statusCode": 200,
"message": "",
"isSuccess": true,
"result": {
"id": 123,
"taskId": "3fa85f64-5717-4562-b3fc-2c963f66baa6",
"code": "25ada1d56ef04200976c", // mã khách, hệ thống tự sinh
"luckyDraw": "482", // số may rủi (3 hoặc 4 chữ số)
"fullName": "Nguyễn Văn A",
"email": "nguyenvana@example.com",
"phone": "0909123456",
"imageUrl": "https://facematching.aievent.vn/Content/3fa85f64-.../FaceID/25ada1d56ef04200976c.png",
...
"checkInFace": "1"
}
}
❌ Thất bại
{
"statusCode": 500,
"message": "Key không hợp lệ hoặc sự kiện không tồn tại",
"isSuccess": false,
"result": null
}
isSuccess để biết thành công hay thất bại.
9. Các lỗi thường gặp & cách xử lý
Thông báo lỗi (message) |
Nguyên nhân | Cách xử lý |
|---|---|---|
| Key không hợp lệ | key bị bỏ trống hoặc không đúng định dạng GUID |
Kiểm tra lại giá trị key, copy đúng ID sự kiện |
| Key không hợp lệ hoặc sự kiện không tồn tại | Không có sự kiện nào ứng với key này, hoặc sự kiện đã bị tắt | Kiểm tra sự kiện trên màn hình Event, đảm bảo sự kiện đang bật |
| Khách mời đã tồn tại (trùng Số điện thoại) trong sự kiện này | Số điện thoại đã có khách khác dùng trong cùng sự kiện | Kiểm tra xem khách đã được tạo trước đó chưa, hoặc dùng số khác |
| Số may rủi (LuckyDraw) đã tồn tại trong sự kiện này | Số LuckyDraw tự điền đã có người dùng | Đổi số khác, hoặc bỏ trống để hệ thống tự sinh |
| Lỗi thiếu thông tin | Thiếu FullName hoặc trường bắt buộc khác theo nghiệp vụ |
Kiểm tra lại dữ liệu gửi lên |