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ộtNội dung
TextNộ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 / ExpiredDateThờ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ộtNội dung
UserIdDanh sách User (Id) nhận thông báo. Gửi tất cả → UserId của <everyone> hoặc -1
RoleIdDanh sách vai trò người dùng nhận thông báo
CustomFlagTrạ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> / -1 hay thông báo theo RoleId → 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ặc DataEditor (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áiHành vi
UnreadTự động query và hiển thị
ShownSau khi hiển thị, tự động chuyển sang. Vẫn được query nhưng không tự động hiển thị nữa
ReadKhi 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áoHành vi
Dữ liệu đang sửa chưa có thay đổiTự động query lại từ CSDL
Dữ liệu đã có thay đổiHiển thị hộp thoại cảnh báo
ThẻNội dung
bAllowOverwriteUpdateFalse → không cho ghi đè CSDL khi có sự thay đổi
bSendDataChangeNotificationDataEditor / 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
zRefreshDataChangeNameTên dữ liệu cần theo dõi để auto refresh (phân cách bởi ,, hỗ trợ toán tử LIKE)
nRefreshIntervalDelayThờ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ợ nRefreshIntervalDelay và 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 đến nRefreshIntervalDelay=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