Chế độ Push Server
Phạm vi áp dụng
✅ Bravo 8 · ✅ Bravo 10
Ý nghĩa
Push server (máy chủ đẩy thông báo) phục vụ liên lạc real-time giữa các máy trạm:
- Tự động tải và hiển thị thông báo đẩy (push notification)
- Theo dõi danh sách trạng thái người dùng online
- Gửi nhận tin nhắn văn bản với nhau
| Hỗ trợ đầy đủ từ | v4.5.6 |
Cấu hình
Push server cần được cài đặt ở máy chủ. Địa chỉ khai báo ở B00Config với VarKey = M_PushServerUrl.
| Giá trị | Hành vi |
|---|---|
| (bỏ trắng) | Máy trạm thử kết nối tới địa chỉ LAN của máy chủ SQL hoặc địa chỉ máy chủ DataServiceLayer với kết nối WCF, qua cổng ngầm định 80 |
* | Máy chủ thông báo cũng là địa chỉ máy chủ Database |
1. Chat giữa các user online
- Danh sách người dùng online ở thanh trạng thái, cho phép gửi tin nhắn trực tiếp
- Người nhận có thể gõ trả lời ngay; người dùng offline không nhận được tin nhắn
Ảnh avatar: nếu có cột Image trong vB00UserList thì dùng làm avatar — kích cỡ vuông (nên là 64×64). Nếu không có, chương trình thử lấy ảnh người dùng của Windows 10.
Giới hạn hiện tại
- Nội dung chat không được lưu
- Chỉ định hướng tính năng chat nhanh
- Không support gửi file
- Người dùng có thể dùng Icon mặc định của Windows (
Windows + .)
2. Chế độ đẩy thông báo
Đẩy thông báo đến người dùng hoặc nhóm user.
Cách 1 — qua Editor
Nhập trực tiếp vào danh mục “Gửi thông báo tới người sử dụng”.
Bảng B00PushData — lưu nội dung thông báo:
| Cột | Nội dung |
|---|---|
Text | Nội dung thông báo, theo định dạng như HTML đơn giản. VD: <h>GIỚI THIỆU TÍNH NĂNG MỚI</h><b>Phòng Công nghệ Bravo</b> ... <i>phiên bản 4.5.1</i> |
Text_English… | Nội dung ở ngôn ngữ khác — hiện chỉ hiển thị tiếng Việt |
EffectiveDate / ExpiredDate | Thời điểm hiệu lực và kết thúc của thông báo |
Bảng B00PushUser — lưu user và role nhận thông báo:
| Cột | Nội dung |
|---|---|
UserId | Danh sách User (Id) nhận thông báo. Gửi tất cả → UserId của <everyone> hoặc -1 |
RoleId | Danh sách vai trò người dùng nhận thông báo |
CustomFlag | Trạng thái theo từng người dùng: • NULL — chưa đọc• 1 — đã đọc• 2 — đã đọc và tắt hiển thị |
Note
Nếu khai báo
UserId = <Everyone>/-1hay thông báo theoRoleId→ mỗi lần có 1 user nhận thông báo, chương trình tự động insert vào bảng này 1 dòng.
Cách 2 — qua Evaluator từ màn hình khác
Bài toán duyệt chứng từ
Gửi thông báo cho user phải duyệt ở bước tiếp theo.
<Eval_PushData>
<ClassName>BravoSendDataChange</ClassName>
<DataMember>B00PushData</DataMember>
<Value>IdListPush</Value>
</Eval_PushData>Trong thủ tục duyệt, thêm đoạn xử lý insert dữ liệu vào bảng lưu nội dung thông báo.
Hành vi hiển thị
- Click vào popup → đóng popup và mở
DataExplorer(CommandKey=PushNotification) hoặcDataEditor(CommandKey=EDIT_PushNotification) - Số lượng thông báo hiển thị tối đa 20. Nhiều hơn 20 thì mỗi khi một thông báo được tích đã đọc, các thông báo chờ sẽ được tiếp nhận tiếp
- Hỗ trợ link trong nội dung thông báo để mở command — VD click vào command trong nội dung để mở trực tiếp chứng từ và duyệt tiếp
Ba trạng thái thông báo
| Trạng thái | Hành vi |
|---|---|
Unread | Tự động query và hiển thị |
Shown | Sau khi hiển thị, tự động chuyển sang. Vẫn được query nhưng không tự động hiển thị nữa |
Read | Khi người dùng đánh dấu đã đọc. Không được query và hiển thị |
Note
Popup tin nhắn chỉ tự động đánh dấu đã đọc khi người dùng không ở trạng thái idle trong 5 giây, và tự đóng sau 1 phút nếu không còn tin nhắn chưa đọc.
3. Cơ chế Auto Refresh
Tự động refresh dữ liệu các màn hình khi có sự thay đổi.
Trên Editor
Khi người dùng nhập liệu và lưu từ DataEditor, chương trình đẩy thông báo qua push server cho các máy trạm khác.
| Trạng thái form nhận thông báo | Hành vi |
|---|---|
| Dữ liệu đang sửa chưa có thay đổi | Tự động query lại từ CSDL |
| Dữ liệu đã có thay đổi | Hiển thị hộp thoại cảnh báo |
| Thẻ | Nội dung |
|---|---|
bAllowOverwriteUpdate | False → không cho ghi đè CSDL khi có sự thay đổi |
bSendDataChangeNotification | DataEditor / DataExplorer — có tự động gửi thông báo cho các máy trạm khác mỗi khi lưu thành công hay không |
zRefreshDataChangeName | Tên dữ liệu cần theo dõi để auto refresh (phân cách bởi ,, hỗ trợ toán tử LIKE) |
nRefreshIntervalDelay | Thời gian autorefresh — mặc định 5s (từ v4.5.7) |
Với các màn hình khác
Cần khai báo cơ chế gửi thông tin thay đổi bằng BravoSendDataChange.
Dashboard
Riêng với Dashboard thì cơ chế luôn luôn refresh. Từ v4.5.7 hỗ trợ
nRefreshIntervalDelayvàzRefreshDataChangeName.
Cải tiến chống nghẽn — từ v4.6.2.0
flowchart TD A["Nhận thông báo dữ liệu thay đổi"] --> B["Chờ nNotificationDelay = 5s<br/>gộp các thông báo liên tiếp"] B --> C["Yêu cầu các BravoLayoutForm tải lại"] C --> D["Mỗi form chờ NGẪU NHIÊN<br/>nMinimumNotificationDelay=1s → nMaximumNotificationDelay=10s"] D --> E["Gửi yêu cầu lên máy chủ CSDL"]
Vì sao chờ ngẫu nhiên?
Nhằm phân bổ ngẫu nhiên các kết nối, hạn chế nghẽn đường truyền và máy chủ CSDL do nhiều kết nối cùng một thời điểm.
- DataExplorer kiểm tra dữ liệu từ thông báo bằng tên bảng/view VÀ cả FilterKey (nếu có) → tránh ảnh hưởng chung giữa các loại chứng từ / đơn vị cơ sở khác nhau
- Nếu không trùng tên bảng/view nhưng vẫn cần auto refresh → phải khai báo
zRefreshDataChangeName - Reporter cũng hỗ trợ auto refresh nếu có khai báo
zRefreshDataChangeName - Các widget tự động refresh với delay ngẫu nhiên từ
nInitIntervalDelay=1sđếnnRefreshIntervalDelay=5s
Liên quan
BravoSendDataChange · Bắt đầu với Dashboard · Bắt đầu với Explorer · Cài đặt máy chủ WCF · B00 - Bảng hệ thống