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