在完成 Extraction Rules 活動的設定之後,我們可以新增業務規則來驗證與正規化欄位值。
首先,我們要先調整 “Doctor ID” 欄位的屬性。Extraction Rules 活動使用的是預先識別的結果,其中可能包含 OCR 錯誤和不必要的字元。在找到欄位區域後,我們可以進一步在欄位屬性中指定正規表示式,以調整欄位值。資料會重新擷取,並藉此消除 OCR 錯誤。
- 按一下 skill 名稱,然後前往 Fields 分頁。
- 展開 “Doctor” 群組,並按一下其旁邊的設定圖示,開啟 “Doctor ID” 欄位設定。
- 在欄位屬性的 Value 區段中,按一下 Regular expression 選項旁邊的新增圖示。
- 將下列表達式貼到 Regular Expression Editor 中:
[0-9]{1}[\/.-]{1}[0-9]{5}[\/.-]{1}[0-9]{2}[\/.-]{1}[0-9]{3}
此編輯器使用的通用標記法與 Extraction Rules Activity Editor 使用的標記法不同。若需更多資訊,請在 Regular Expression Editor 中按一下 Syntax help。
- 按一下 Save 關閉 Regular Expression Editor,然後再按一下 Save 關閉欄位屬性。
病患應該在首次生病後 3 天內收到病假證明。這表示開立日期必須不晚於生病開始日期後的第 3 天。
若要檢查此條件,我們需要設定一個腳本規則。
- 按一下資料表單下方的新增圖示,會開啟 New Rule 對話方塊。
如果看不到新增圖示,請切換到文件影像上方的 Reference 區段。
- 選取 Advanced Script Rule,然後按一下 Next。
- 將規則重新命名為「Check validity」。
- 在欄位清單中選取 “Date”、“Start Date” 和 “End Date” 欄位。
- 按一下 Next。
- 將下列腳本貼到腳本編輯器中:
// 建立您要存取的所有欄位的變數
var dateField = Context.GetField("Date");
var startField = Context.GetField("Start Date");
var endField = Context.GetField("End Date");
var issueDate = dateField.Value;
var startDate = startField.Value;
//檢查文件中是否找到「Start Date」欄位
if (startDate && issueDate)
{
//檢查開立日期是否不超過開始日期後的 3 天
if ((issueDate.getTime() - startDate.getTime()) / 3600000 / 24 > 3)
{
Context.CheckSucceeded = false;
Context.ErrorMessage = "病假單簽發時間過晚";
}
}
- 按一下 Save,然後檢視此規則在該集合中不同文件上的運作方式。若要檢查規則如何處理錯誤,您可以在資料表單中的欄位中手動輸入測試值。每次您變更欄位值時,規則都會重新套用。
我們將使用病假開始與結束日期來計算病假期間。如果文件中指定了期間,我們會檢查它是否等於計算得出的期間。如果文件中沒有包含期間,我們會將計算值寫入對應的欄位中。
- 按一下資料表單下方的新增 icon 來建立規則。
- 選擇 Advanced Script Rule,然後按一下 Next。
- 將規則重新命名為「Check duration」。
- 在欄位清單中選擇「Start Date」、「End Date」及「Duration」欄位。務必在兩欄中都選擇這些欄位,因為我們不僅要讀取欄位值,也會在必要時更正它們。
- 按一下 Next。
- 將以下指令碼貼入指令碼編輯器中:
// 為所有要存取的欄位建立變數
var startField = Context.GetField("Start Date") ;
var endField = Context.GetField("End Date");
var durationField = Context.GetField("Duration");
var startDate = startField.Value;
var endDate = endField.Value;
//檢查文件上是否找到「Start Date」和「End Date」欄位
if (endField && endDate && startField && startDate)
{
//計算病假天數
var length = (1 + (endDate.getTime() - startDate.getTime()) / 3600000 / 24);
//如果未找到 duration 欄位或無法解析為數字,則將計算值傳遞給該欄位
if (!durationField.Value)
durationField.Value = length;
//如果找到 duration 欄位,則將其值與計算的天數進行比較
else if (durationField.Value != length)
{
Context.CheckSucceeded = false;
Context.ErrorMessage = "「Duration」欄位的值與實際病假天數不符";
durationField.AddSuggestion(length.toString());
}
}
- 按一下 Save,並檢查此規則在該集合中不同文件上的運作方式。若要檢查規則如何處理錯誤,可以在資料表單上的欄位中手動輸入測試值。每次變更欄位值時,系統都會重新套用該規則。