我是微軟Dynamics 365 & Power Platform方面的工程師/顧問羅勇,也是2015年7月到2018年6月連續三年Dynamics CRM/Business Solutions方面的微軟最有價值專家(Microsoft MVP),歡迎關注我的微信公衆号 MSFTDynamics365erLuoYong ,回複461或者20211228可友善擷取本文,同時可以在第一間得到我釋出的最新博文資訊,follow me!
以前做項目的時候很希望有一個功能,進入Dynamics 365後發送一些通知給使用者,比如通知使用者某些Case快到期了需要盡快處理,以前或許隻能通過不是很好的曲線方式,比如每個Model-driven App都可以設定一個Welcome page,這是個HTML Web資源,可以用來展示想展示的内容,但是這個Welcome page使用者第一次看到後可以選中以後不再展示,這樣下次登入就看不到了。
最初寫作本文時候有個Preview Feature出來了,就是以前一直想要的通知功能,官方的介紹文檔見 Send in-app notifications within model-driven apps (preview) ,注意該功能不一定所有區域可用,我寫作本文時候包括中國大陸版本也是可以使用的,而且Preveiw Feature不是為生産準備的,一般不應用于生産環境。
2022年6月9日補充,該Feature已經在2022年5月份GA了,可以放心使用了。
首先需要為你想要展示應用内通知(in-app notification)的Model-driven App啟用這個功能,這個需要知道App的唯一名稱,可以通過在App Designer中打開這個app就可以看到,比如我這個app的唯一名稱是 Customerservicehub,
還可以通過将Model-driven app添加到解決方案中,Name列顯示的值便是app的唯一名稱。
然後我們進入該App的任何一個頁面,按F12打開開發者工具在Console這個Tab運作類似如下的代碼,運作結果顯示Promise不要緊,可以看Network該請求的結果,如果請求完成傳回 204就成功。
fetch(window.origin + "/api/data/v9.1/SaveSettingValue()",{
method: "POST",
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({AppUniqueName: "Customerservicehub", SettingName:"AllowNotificationsEarlyAccess", Value: "true"})
});
強制重新整理下頁面會看到右上角多了一個鈴铛一樣的圖示,這個就是我們需要的通知功能啟用了,點選下,目前顯示沒有通知。
GA後啟用應用内通知更簡單了,我這裡摘抄官方文檔的方法如下:
- Sign in to Power Apps.
- Open the solution that contains the model-driven app.
- Select the model-driven app and clickEdit split menu to open using the modern app designer
- OpenSettings and switch to Upcoming
- Enable "In-app notifications"
- ClickSave to save the settings change
- ClickPublish on the model-driven app
在講如何建立通知之前我們先講普通使用者如何才能接收通知,這裡我就不講普通使用者如何才能建立通知了,一般我們用高權限賬戶來建立,根據官方文檔,需要如下這些權限,這三個實體都在角色權限設定的【自定義實體】這個tab中。
實體邏輯名 | 英文顯示名 | 簡體中文顯示名 | 最低權限 |
appnotification | Notification | 通知 | 個人級别讀 |
settingdefinition | Setting Definition | 模型驅動應用使用者設定 | 建立 讀 寫 追加 |
appusersetting | Model-Driven App User Setting | 設定定義 | 讀 追加到 |
我這裡先講使用前端代碼建立的方法,示例如下,各個參數的含義和預設值我就不講解了,請參考官方文檔:
var systemuserid = "eb8a38b6-8a2a-ec11-b6e6-000d3a806b15";
var notificationRecord =
{
"title": "過年了,請趕緊處理完手裡的Case",
"body": "親,2022年就要來臨,您手裡還有未處理完的Case,請抓緊時間處理,預祝新年快樂!",
"[email protected]": "/systemusers(" + systemuserid + ")",
"data": JSON.stringify({
"actions": [
{
"title": "檢視案例",
"data": {
"url": "?pagetype=entitylist&etn=incident&viewid=00000000-0000-0000-00aa-000010001028&viewType=1039"
}
}
]
})
}
Xrm.WebApi.createRecord("appnotification", notificationRecord).
then(
function success(result) {
console.log(`通知建立成功,ID=${result.id}`);
},
function (error) {
console.log(error.message);
}
);
看到的效果如下圖,會自動展開一陣子,過一會兒會收起來,點選象征通知的鈴铛圖示又可以看到這個通知。點選通知右上角的關閉圖示可以清除這條消息,點選【Dismiss all】可以清除所有的消息,我在國際版本上測試,清除後就不顯示了,但是記錄并未從appnotification中删除,但是在中國大陸版本上,清除後過會兒或者重新登入還是會顯示。如果和我描述的不同,請以自己測試為準。
既然通過前端可以建立,那麼通過Cloud flow也開始可以建立的。我這裡用個手工觸發的Cloud flow示範下。在建立通知時候發現兩個同名的通知,選哪個?選前面哪個,如果記不住也沒有關系,兩個都嘗試下,如果顯示的列是通知相關的就八九不離十了。
當然更加靠譜的是檢視這個步驟的代碼,點選右上角的更多符号,選擇【Peek code】
如果entityName是 appnotifications 就說明選對了。
我這個建立通知的步驟設定如下:
注意如果Expiry (seconds)字段設定了值的話,建立消息經過這個指定的秒數之後這個通知記錄會自動删除。
展示的效果如下圖:
我就不示範通過組織服務來建立通知了,應該也是可以。最後,正如官方文檔指出的那樣,消息會推送給這個通知記錄的owner,别人看不到。如果要推送給一組人呢?目前沒有好的辦法,就是為每個要得到這個通知的使用者建立一條通知,每條通知的負責人就是通知的推送對象。
值得一體的是,通知的标題和正文都支援markdown:
Text Style | Markdown |
Bold | |
Italic | |
Bullet list | |
Numbered list | |