From 524eea3312ebc07fd6e1dc94594d33c6a69d5ef5 Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期二, 31 三月 2026 09:32:51 +0800
Subject: [PATCH] fix: 型別更新 1) 新增 TShape, TMemo, TMenuItem, TImageScrollBox 2) 理清 Delphi 相依使用: IISUnit, MPSBarcode, IISImageProcess 3) 方法說明/Mermaid 生成
---
reassemble/CB_IMGPSScanImp.omr.pas | 148 ++++++++++++++++++++++++++++++++++++-------------
1 files changed, 109 insertions(+), 39 deletions(-)
diff --git a/reassemble/CB_IMGPSScanImp.omr.pas b/reassemble/CB_IMGPSScanImp.omr.pas
index a4dd812..5faf5ef 100644
--- a/reassemble/CB_IMGPSScanImp.omr.pas
+++ b/reassemble/CB_IMGPSScanImp.omr.pas
@@ -1,9 +1,80 @@
{ ==============================================================================
+ 方法名稱:GetSiteOMR
+ 引用相依:CM_Str2Rect, Get_OMR, ISB_BW, UpLPoint, ClearLine
+ 方法描述:【指定區域 OMR 辨識】
+ 在影像的特定座標區域執行填塗辨識。
+ 1. 影像準備:若傳入檔名與目前載入不同,則重新載入影像。
+ 2. 預處理:呼叫 ClearLine 移除表格橫線,避免干擾辨識,並強制重繪。
+ 3. 座標轉換:利用 CM_Str2Rect 將 XML 定義的相對座標(毫米或像素)結合
+ 影像 DPI 與定位基準點 (UpLPoint) 轉換為實體 Rect。
+ 4. 邊界校正:執行邊界檢查,確保 Rect 不超出影像實體寬高。
+ 5. 辨識執行:呼叫核心 Get_OMR 演算法計算填塗黑點比例,回傳辨識結果。
+============================================================================== }
+function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;
+var
+ OMRRect : TRect;
+ Xdpi,Ydpi : Integer;
+ W,H : Integer;
+begin
+ Result := 0;
+//ShowMessage('GetSiteOMR');
+
+ IF (ImageScrollBox1.FileName <> FileName) and (FileName <> '') then
+ begin
+//ShowMessage('11111'+ImageScrollBox1.FileName+#10#13+FileName);
+ ImageScrollBox1.LoadFromFile(FileName,1);
+{
+ShowMessage('UpLPoint='+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+#10#13+
+'UpRPoint='+IntToStr(UpRPoint.X)+','+IntToStr(UpRPoint.Y)+#10#13+
+'DownLPoint='+IntToStr(DownLPoint.X)+','+IntToStr(DownLPoint.Y)+#10#13+
+'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y));
+ FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,'');
+ShowMessage('UpLPoint='+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+#10#13+
+'UpRPoint='+IntToStr(UpRPoint.X)+','+IntToStr(UpRPoint.Y)+#10#13+
+'DownLPoint='+IntToStr(DownLPoint.X)+','+IntToStr(DownLPoint.Y)+#10#13+
+'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y));
+}
+ ClearLine(ISB_BW.Graphic,bt);
+ ISB_BW.Redraw(True);
+ Application.ProcessMessages;
+ end;
+ If ImageScrollBox1.FileName <> '' Then
+ begin
+
+//ShowMessage('22222'+ImageScrollBox1.FileName);
+ Xdpi := ImagescrollBox1.Graphic.XDotsPerInch;
+ Ydpi := ImagescrollBox1.Graphic.YDotsPerInch;
+ H := ImageScrollBox1.Graphic.Height;
+ W := ImageScrollBox1.Graphic.Width;
+//ShowMessage('Xdpi='+IntToStr(Xdpi)+#10#13+'Ydpi='+IntToStr(Ydpi)+#10#13+'H='+IntToStr(H)+#10#13+'W='+IntToStr(W)+#10#13);
+//ShowMessage('Site='+Site);
+ OMRRect := CM_Str2Rect(Site,Xdpi,UpLPoint);
+Display1.Lines.Add('UpLPoint=('+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+');'+Site+';'+IntToStr(OMRRect.Left)+','+IntToStr(OMRRect.top)+','+IntToStr(OMRRect.Right)+','+IntToStr(OMRRect.Bottom));
+ if OMRRect.Left < 0 then
+ OMRRect.Left := 0;
+ if OMRRect.Top < 0 then
+ OMRRect.Top := 0;
+ if OMRRect.Right > ImageScrollBox1.Graphic.Width then
+ OMRRect.Right := ImageScrollBox1.Graphic.Width;
+ if OMRRect.Bottom > ImageScrollBox1.Graphic.Height then
+ OMRRect.Bottom := ImageScrollBox1.Graphic.Height;
+
+ result := Get_OMR(ISB_BW.Graphic,OMRRect);
+//ShowMessage('result='+IntToStr(result));
+
+ end;
+end;
+
+
+{ ==============================================================================
方法名稱:CheckRule2OMRErrInfo
- 引用相依:
- 方法描述:將檢核規則清單(CHECK_RULE_INF_List)中的資料轉換為內部的 OMRErrInfo R
- ecord 陣列,設定各項規則的顯示類型(Display)、是否可忽略(Ignore)及提示
- 訊息與掃瞄模式。
+ 引用相依:CHECK_RULE_INF_List, OMRErrInfo
+ 方法描述:【檢核規則元數據映射】
+ 將從伺服器取得的 SQL 檢核規則(共 11 項)轉換為內部的 Record 結構。
+ 1. 狀態映射:將 MESG_SHOW_TYPE (1:顯示, 2:隱藏) 轉為布林值。
+ 2. 權限映射:將 MESG_DISP_TYPE (1:可忽略, 2:強制的) 轉為 Ignore 標記。
+ 3. 內容填充:填入錯誤提示字串與該規則適用的掃瞄模式 (Mode)。
+ 此方法確保前端 UI 與檢核引擎能依據伺服器下達的最新政策執行驗證。
============================================================================== }
Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo; //檢核規則填入OMRErrINFo Record
var i : Integer;
@@ -36,11 +107,13 @@
{ ==============================================================================
方法名稱:DistinctFormCode
- 引用相依:LoadFromFile, LoadFileGetMD5
- 方法描述:從案件的 Context.dat 檔案中提取不重複的表單代碼(FormCode)並存入 OMRF
- ileList。程序會遍歷上傳目錄下的所有檔案,檢查檔案是否存在且未被處理過。
- 接著比對 OMRFileList 中已有的表單代碼,若為新出現的表單代碼且檔案有效
- ,則將其加入清單中,用於後續 OMR 處理。
+ 引用相依:reSizeExistImgList, ISExistImg, Context.dat
+ 方法描述:【提取待檢核表單清單】
+ 從案件中篩選出不重複且需執行 OMR 的表單代碼。
+ 1. 補件過濾:在補件模式 (FWH_category='N') 下,透過實體檔案存在性與
+ MD5 排除清單 (reSizeExistImgList) 自動跳過歷史影像。
+ 2. 去重邏輯:針對新掃入的影像,僅提取每種表單 ID 的第一頁 (Index 0),
+ 避免對多頁重複執行相同的表單級檢核。
============================================================================== }
Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁
var
@@ -91,20 +164,19 @@
{ ==============================================================================
方法名稱:OMRCheckCase
- 引用相依:ImageReSize_FormID, GetSiteOMR, FindPoint, LoadFromFile, FileExists,
- SaveToFile
- 方法描述:執行案件的自動化 OMR 規則檢核,這是確保掃瞄案件合規性的核心邏輯。程序
- 流程:
- 1. 初始化檢核日誌。
- 2. 識別主文件並驗證必要文件是否缺漏、相依與互斥文件是否衝突、以及表單
- 是否已停用。
- 3. 檢查各文件類型是否超過預設的最大頁數。
- 4. 針對案件內每張影像,執行十字定位點縮放 (ImageReSize_FormID) 後,載
- 入對應表單的 XML 規則檔。
- 5. 執行欄位級檢核,包含必填項 (settype1)、跨文件欄位關聯 (settype3/set
- type8)、相依文件需求 (settype4) 及備註填寫要求 (settype6) 等。
- 6. 將所有檢核失敗原因紀錄至 Checkerr.ini。最終返回案件是否通過所有檢
- 核規則。
+ 引用相依:XML 規則檔, ImageReSize_FormID, OMRErr2ini, 檢核子系統
+ 方法描述:【案件自動化合規性總檢核】
+ 此為系統最核心的檢核引擎,負責串接所有驗證邏輯:
+ 1. 檔案層級檢核:驗證主文件是否存在、頁數是否符合規格 (GetDataDocNoPage)、
+ 檢查相依文件需求與互斥文件衝突。
+ 2. 版本與效期:檢查是否有已停用 (STOP_DATE) 或未註冊的表單 ID。
+ 3. 表單級 OMR:
+ - 定位校正:對每張影像執行十字定位縮放 (ImageReSize_FormID)。
+ - 載入 XML:依據 FormID 載入對應的欄位座標與辨識規則。
+ - 欄位辨識:執行必填、跨文件關聯、相依文件欄位、及備註填寫要求等檢核。
+ 4. 結果輸出:將所有失敗原因即時寫入 Checkerr.ini (UI 顯示) 或
+ CheckMemo.dat (背景日誌)。
+ 回傳案件是否通過所有「強制性」檢核項。
============================================================================== }
Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核
var
@@ -805,12 +877,12 @@
{ ==============================================================================
方法名稱:OMRErr2ini
- 引用相依:FileExists, LoadFromFile, SaveToFile
- 方法描述:紀錄 OMR 檢核失敗的詳細資訊。方法根據 Display 旗標決定紀錄方式:若為 T
- rue,則在案件目錄下的 Checkerr.ini 中建立新的錯誤序號區段,詳細紀錄失
- 敗原因、檔案路徑、OMR 座標點、關聯檔案及定位點類型,用於後續 UI 呈現;若
- 為 False,則僅將錯誤原因字串附加於 CheckMemo.dat 純文字日誌中,作為背
- 景紀錄之用。
+ 引用相依:Checkerr.ini, CheckMemo.dat
+ 方法描述:【檢核錯誤持久化】
+ 將檢核失敗詳細資訊存檔。
+ - UI 模式 (Display=True):在 Checkerr.ini 建立錯誤區段,記錄錯誤原因、
+ 影像路徑、座標、關聯影像與定位點類型,供 ErrList 視窗點選定位。
+ - 靜默模式:將原因字串附加至 CheckMemo.dat,用於傳送案件時的背景描述。
============================================================================== }
Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini
var
@@ -855,11 +927,10 @@
{ ==============================================================================
方法名稱:OMRErrini2List
- 引用相依:
- 方法描述:將檢核失敗紀錄從 INI 設定檔載入至 UI 介面。方法會讀取 Checkerr.ini,遍
- 歷所有錯誤紀錄,並過濾掉已標記為刪除 (Del) 的項目。將符合條件的錯誤原
- 因填入 ErrlistForm 中的 ListView 元件,供使用者查看與修正。若清單中仍
- 存在錯誤,會同步停用介面上的上傳按鈕以防止不合規案件送出。
+ 引用相依:Checkerr.ini, ErrlistForm
+ 方法描述:【加載錯誤紀錄至 UI】
+ 讀取 Checkerr.ini,過濾已刪除項,將錯誤原因填入 ErrlistForm 的 ListView。
+ 若存在錯誤,則同步停用「立即上傳」按鈕以實施業務擋控。
============================================================================== }
Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView
var
@@ -933,11 +1004,10 @@
{ ==============================================================================
方法名稱:OMRErrini2ListForLog
- 引用相依:LoadFromFile
- 方法描述:彙整系統中所有活動案件的 OMR 檢核錯誤訊息。方法讀取全域的 CaseList.da
- t,依次遍歷每個案件子目錄下的 Checkerr.ini,收集所有未被移除的錯誤原因
- ,並將其合併為一個完整的文字區塊返回。此功能主要用於產生系統運行日誌,
- 方便追蹤與審查多案件的檢核狀態。
+ 引用相依:CaseList.dat, Checkerr.ini
+ 方法描述:【彙整所有待傳案件錯誤日誌】
+ 遍歷本地 CaseList.dat 所有活動案件,讀取其 Checkerr.ini 彙整所有
+ 未修正的錯誤原因,產出完整的文字報告供日誌記錄使用。
============================================================================== }
function TCB_IMGPSScanX.OMRErrini2ListForLog(CaseID: String): String;
var
--
Gitblit v1.8.0