{ ============================================================================== 方法名稱:CheckRule2OMRErrInfo 引用相依: 方法描述:將檢核規則清單(CHECK_RULE_INF_List)中的資料轉換為內部的 OMRErrInfo R ecord 陣列,設定各項規則的顯示類型(Display)、是否可忽略(Ignore)及提示 訊息與掃瞄模式。 ============================================================================== } Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo; //檢核規則填入OMRErrINFo Record var i : Integer; CheckNo : String; begin for I := 1 to 11 do begin CheckNo := Add_Zoo(i,3); if FindSQLData(CHECK_RULE_INF_List,'MESG_SHOW_TYPE,MESG_DISP_TYPE,CHECK_MESG,SCAN_MODE','CHECK_NO',CheckNo,0,FindResult) then begin if GetFindResult('MESG_SHOW_TYPE') = '1' then OMRErrInfo[i].Display := True //顯示 Else if GetFindResult('MESG_SHOW_TYPE') = '2' then OMRErrInfo[i].Display := False; //不顯示 if GetFindResult('MESG_DISP_TYPE') = '1' then OMRErrInfo[i].Ignore := True //可忽略 Else if GetFindResult('MESG_DISP_TYPE') = '2' then OMRErrInfo[i].Ignore := False; //不可忽略 OMRErrInfo[i].Info := GetFindResult('CHECK_MESG'); OMRErrInfo[i].Mode := GetFindResult('SCAN_MODE'); end; end; end; { ============================================================================== 方法名稱:DistinctFormCode 引用相依:LoadFromFile, LoadFileGetMD5 方法描述:從案件的 Context.dat 檔案中提取不重複的表單代碼(FormCode)並存入 OMRF ileList。程序會遍歷上傳目錄下的所有檔案,檢查檔案是否存在且未被處理過。 接著比對 OMRFileList 中已有的表單代碼,若為新出現的表單代碼且檔案有效 ,則將其加入清單中,用於後續 OMR 處理。 ============================================================================== } Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁 var i,n : Integer; LForm,OForm : String; Addok : Boolean; S : TStringlist; begin S := TStringlist.Create; try S.LoadFromFile(ImageSavePath + CaseID+'\upload\Context.dat'); for i := 0 to S.Count - 1 do begin LogFile1.LogToFile(logTimeString+S.Strings[i]+' ISExistImg='+BoolToStr(ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[i]),true)); LogFile1.LogToFile(logTimeString+S.Strings[i]+' reSizeExistImgList='+BoolToStr(reSizeExistImgList.IndexOf(LoadFileGetMD5(ImageSavePath+CaseID+'\upload\'+S.Strings[i]))<>-1,true)); if FWH_category='N' then begin if (ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[i])) or (reSizeExistImgList.IndexOf(LoadFileGetMD5(ImageSavePath+CaseID+'\upload\'+S.Strings[i]))<>-1) then begin Continue; end; end; LForm := FileName2FormCode(S.Strings[i]); AddOk := True; for n := 0 to OMRFileList.Count - 1 do begin OForm := FileName2FormCode(OMRFileList.Strings[n]); if (LForm <> '') and (LForm = OForm) then begin AddOk := False; Break; end; end; if AddOk then begin OMRFileList.Add(S.Strings[i]); end; end; finally S.Free; end; end; { ============================================================================== 方法名稱: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。最終返回案件是否通過所有檢 核規則。 ============================================================================== } Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核 var i,n,m,v,v1 : Integer; XT,RelaXT,ValueXT : TXmltool; OMRFormCode,OMRFile,OMRFormName,ColEName,ColCName,Site : String; Pixel : Integer; RelaFormCode,RelaFile,RelaFormName,RelaColEName,RelaColCName,RelaSite : String; RelaDocNo,RelaDocName : string; RelaPixel : Integer; s : String; nodename : String; OMROK : Boolean; CaseOk : Boolean; ErrStr : String; SiteRec,RelaSiteRec : String; //多組位置記錄 OMRValue : String; MainFormID,MainDocNo,MainVersion : String; //主FormID MainFormPage,CaseFormPage : Integer; //主要文件需要的頁數 NeedDocNoStr,NoDocNoStr : String; //相依 互斥文件字串 List : TStringlist; FormCode : String; FormDataPages : Integer; NoSite : Boolean; //未定位 Anchor,Anchor1 : String; OMROkCount : Integer; //Casecheck : Boolean; //是否要做檢核 //AllCheck : Boolean; //是否要做完整檢核 ISB8W,ISB8H:integer; begin ///OMRErrInfo 1: 必要文件 2:相依文件 3:互斥文件 4:必填 5:欄位有值附文件 6:欄位有值不附文件 /// 7: 欄位有值相關欄位也要有值 8:欄位有值要寫備註 9:停用日期 10:最大頁數 //Casecheck := True; //Allcheck := True; //if (FMode = 'ISCAN') then //Allcheck := False; CaseOk := True; //if Casecheck then //begin DeleteFile(ImageSavePath+CaseID+'\upload\Checkerr.ini'); DeleteFile(ImageSavePath+CaseID+'\upload\CheckMemo.dat'); //DeleteFile(ImageSavePath+CaseID+'\upload\ReSize.dat'); DeleteFile(ImageSavePath+CaseID+'\upload\RemoveMemo.dat'); DeleteFile(ImageSavePath+CaseID+'\upload\OMRCheckOk.dat'); Memo1.Lines.Clear; OMRFileList.Clear; MainFormID := GetCaseFormID(ImageSavePath+CaseID+'\upload\'); List := TStringlist.Create; try //if AllCheck then //begin if GetCasePage(ImageSavePath,CaseID) =0 then begin end; //ShowMessage('MainFormID='+MainFormID); LogFile1.LogToFile(logTimeString+' '+FModeName+' '+CaseID+' '+'MainFormID='+MainFormID); if MainFormID = ''then begin //20131203 yuu說不檢查這個,先拿掉 20170315 楷琳說未歸類要擋 20170726 因此有檢查必要FormID 所以 可以拿掉 {if FCheck_main_form='Y' then begin if (FMode <> 'SSCAN') AND (FMode<>'ESCAN') then //簽署章件會換主FormID,先跳過 20170629 ESCAN 也不檢查 begin ErrStr:=_Msg('找不到分案文件'); //找不到主文件 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,False,True); CaseOk := false; //ShowMessage('AAAAA'); end; end; } end Else begin //////主要非主要文件////// DistinctDocinCase(ImageSavePath+CaseID+'\upload\'); //ShowMessage(DocNo_VerinCase.Text); //DocNo_VerinCase.Add('31A00101_1706A'); LogFile1.LogToFile(logTimeString+' '+CaseID+' '+'DocNo_VerinCase.Text='+DocNo_VerinCase.Text); if ModeNeedCheck(OMRErrInfo[1].Mode,FMode) then //是否要檢核 begin for i := 0 to DocNo_VerinCase.Count - 1 do begin v := Pos('_', DocNo_VerinCase.Strings[i]); v1 := length(DocNo_VerinCase.Strings[i]); MainDocNo := Copy(DocNo_VerinCase.Strings[i],1,v-1); //FormCode2DocNo(MainFormID); MainVersion :=Copy(DocNo_VerinCase.Strings[i],v+1,v1-v); //FormCode2Version(MainFormID); MainFormPage := GetDataDocNoPage(MainDocNo,MainVersion); //資料庫記錄主文件頁數 CaseFormPage := CheckCaseDocNoPage(CaseID,MainDocNo,MainVersion,MainFormPage); //案件主文件的頁數 LogFile1.LogToFile(logTimeString+CaseID+',MainDocNo='+MainDocNo+',MainVersion='+MainVersion+',MainFormPage='+IntToStr(MainFormPage)+',CaseFormPage='+IntToStr(CaseFormPage)); //CheckFirstDocNoPage IF (MainFormPage > 0) and (MainFormPage <> CaseFormPage) then begin ErrStr:=MainDocNo+Format(OMRErrInfo[1].Info,[Inttostr(MainFormPage),Inttostr(CaseFormPage)]); //主要文件需有XX頁僅附XX頁 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[1].Ignore,OMRErrInfo[1].Display); if OMRErrInfo[1].Display then CaseOk := false; end; end; end; //////主要非主要文件///// //showmessage(MainFormID); MainDocNo := FormCode2DocNo(MainFormID); MainVersion := FormCode2Version(MainFormID); if FindSQLData(DM_FORM_INF_List,'DEPE_FORM_ID,MUTEX_FORM_ID','MAIN_FORM_ID,DOC_VERSION',MainDocNo+','+MainVersion,0,FindResult) then begin NeedDocNoStr := GetFindResult('DEPE_FORM_ID'); NoDocNoStr := GetFindResult('MUTEX_FORM_ID'); end Else if FindSQLData(DM_FORM_INF_List,'DEPE_FORM_ID,MUTEX_FORM_ID','MAIN_FORM_ID,DOC_VERSION',MainDocNo+','+MainVersion,0,FindResult) then begin NeedDocNoStr := GetFindResult('DEPE_FORM_ID'); NoDocNoStr := GetFindResult('MUTEX_FORM_ID'); end; //////相依文件///// if ModeNeedCheck(OMRErrInfo[2].Mode,FMode) then //是否要檢核 begin List.CommaText := NeedDocNoStr; for I := 0 to List.Count - 1 do begin if not Case_DocNoExists(CaseID,List.Strings[i]) then //沒附相依文件 begin if FWH_category='N' then begin if ISExistImg(ImageSavePath+CaseID+'\upload\'+List.Strings[i]) then begin Continue; end; end; ErrStr:=Format(OMRErrInfo[2].Info,[DocNo2DocName(CaseID,List.Strings[i])]); //沒附相依文件 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[2].Ignore,OMRErrInfo[2].Display); if OMRErrInfo[2].Display then CaseOk := false; end; end; end; //////相依文件///// //////互斥文件///// if ModeNeedCheck(OMRErrInfo[3].Mode,FMode) then //是否要檢核 begin List.CommaText := NoDocNoStr; for I := 0 to List.Count - 1 do begin if Case_DocNoExists(CaseID,List.Strings[i]) then //附了互斥文件 begin if FWH_category='N' then begin if ISExistImg(ImageSavePath+CaseID+'\upload\'+List.Strings[i]) then begin Continue; end; end; ErrStr:=Format(OMRErrInfo[3].Info,[DocNo2DocName(CaseID,List.Strings[i])]); //有附互斥文件 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[3].Ignore,OMRErrInfo[3].Display); if OMRErrInfo[3].Display then CaseOk := false; end; end; end; //////互斥文件///// end; //MainFormID結束 //end; List.LoadFromFile(ImageSavePath + CaseID+'\upload\Context.dat'); for i := 0 to List.Count - 1 do begin FormCode := FileName2FormCode(List.Strings[i]); /////未歸類/// {IF FormCode = 'Attach' Then //20140211 yuu說不檢查了 begin ErrStr:=_Msg('尚有文件未歸類'); OMRErr2ini(CaseID,ErrStr,'','','','','','',False,False,True); CaseOk := false; end; } /////未歸類////// /////未註冊文件///// {IF not FormIDExists(FormCode,False) then //未註冊文件 begin ErrStr:=FormCode+_Msg('不為此業務的表單代碼'); OMRErr2ini(CaseID,ErrStr,'','','','',False,False,True); CaseOk := false; end } /////未註冊文件///// //////停用文件// {Else} IF ModeNeedCheck(OMRErrInfo[9].Mode,FMode) and (not FormIDExists(FormCode,True,0)) and (not checkFormCodeIsCustom(ImageSavePath + CaseID+'\upload\',FormCode)) then //有停用的文件 begin //ShowMessage('AAAA'); ErrStr:=Format(OMRErrInfo[9].Info,[FormCode2FormName(CaseID,FormCode)]); //有停用文件 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[9].Ignore,OMRErrInfo[9].Display); //ShowMessage('ErrStr='+ErrStr); if OMRErrInfo[9].Display then CaseOk := false; end; //////停用文件//// end; finally List.Free; end; //if AllCheck then //begin //////最大頁數/// LogFile1.LogToFile(logTimeString+'最大頁數A段 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text); DistinctFormCode(CaseID); if ModeNeedCheck(OMRErrInfo[10].Mode,FMode) then //是否要檢核 begin //ShowMessage('AAA'+OMRFileList.Text); LogFile1.LogToFile(logTimeString+'最大頁數B段 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text); For i := 0 to OMRFileList.Count - 1 do begin if FModeName=_Msg('異動件') then Continue; if FWH_category='N' then begin if ISExistImg(ImageSavePath+CaseID+'\upload\'+OMRFileList.Strings[i]) then begin Continue; end; end; FormCode := FileName2FormCode(OMRFileList.Strings[i]); FormDataPages := GetDataFormCodePages(FormCode); IF (FormCode <> '') and (FormDataPages > 0) and (FindFormCodePages(CaseID,FormCode) > FormDataPages) then //有超過最大頁數的文件 begin ErrStr:=Format(OMRErrInfo[10].Info,[FormCode2FormName(CaseID,FormCode),inttostr(FormDataPages)]); //有超過最大頁數文件 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[10].Ignore,OMRErrInfo[10].Display); if OMRErrInfo[10].Display then CaseOk := false; end; end; end; /////最大頁數///// //end; ImageScrollBox1.FileName := ''; //if FWork_No = 'CW' then //理賠就不做下面的檢核了 //begin //////OMR檢核/////// ContextList.LoadFromFile(ImageSavePath+CaseID+'\upload\Context.dat'); DistinctFormCode(CaseID); ValueXT := TXmltool.Create; Try //ShowMessage('必填'+OMRFileList.Text); LogFile1.LogToFile(logTimeString+'必填 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text); For i := 0 to OMRFileList.Count - 1 do begin //ShowMessage('OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]); if CheckRequiredColumnValues(FWork_NO,CaseID) then Continue; OMRFile := OMRFileList.Strings[i]; OMRFormCode := FileName2FormCode(OMRFileList.Strings[i]); OMRFormName := FormCode2FormName(CaseID,OMRFormCode); Anchor := FormID2Anchor(OMRFormCode); ///依十字定位點縮放//// ImageReSize_FormID(CaseID,OMRFile); ////依十字定位點縮放/// //Display1.Lines.Add('OMRFile='+OMRFile+',OMRFormCode='+OMRFormCode+',OMRFormName='+OMRFormName); LogFile1.LogToFile(logTimeString+'OMRFile='+OMRFile+',OMRFormCode='+OMRFormCode+',OMRFormName='+OMRFormName); //ShowMessage('KKKKK'); if not FileExists(CheckXmlPath+FWork_no+'\'+OMRFormCode+'.xml') then //沒有Xml就不用檢核 Continue; //ShowMessage('11638 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]); XT := TXmltool.Create(CheckXmlPath+FWork_no+'\'+OMRFormCode+'.xml'); RelaXT := TXmltool.Create; //ShowMessage('ModeNeedCheck='+BoolToStr(ModeNeedCheck(OMRErrInfo[4].Mode,FMode),true)); try //*******必填******** if ModeNeedCheck(OMRErrInfo[4].Mode,FMode) then //是否要檢核 begin if XT.SubNodes['/form/settype1/'].First then Repeat OMROK := False; SiteRec := ''; //清掉 ColEName := XT.SubNodes['/form/settype1/'].NodeName; ColCName := XT.Node['/form/settype1/'+ColEName+'/'].Attributes['coldesc']; ColCName := Copy(ColCName,1,length(ColCName)-6); if XT.SubNodes['/form/settype1/'+ColEName+'/'].First then Repeat nodename := XT.SubNodes['/form/settype1/'+ColEName+'/'].NodeName; If nodename <> '@coldesc' then begin Pixel := Strtoint(XT.Node['/form/settype1/'+ColEName+'/'+nodename+'/'].Attributes['pixel']); Site := XT.Node['/form/settype1/'+ColEName+'/'+nodename+'/'].Attributes['colxy']; if SiteRec= '' then //記錄位置 SiteRec := Site else SiteRec := SiteRec+'@'+Site; //有填就ok //Showmessage(ColCName +','+ inttostr(OMRMpsV1.GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site))+','+inttostr(Pixel + SafePixel)); //SafePixel:=90000; Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); //FindPoint(ISB_BW.Graphic,UpLPoint,UpRPoint,DownLPoint,ANCHOR); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin //Showmessage('oh'); OMROK := True; Break; end; end Else begin //ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/']; end; Until not XT.SubNodes['/form/settype1/'+ColEName+'/'].Next; if not OMROk then begin ErrStr:=Format(OMRErrInfo[4].Info,[ColCName]); //XX欄位未填寫 OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[4].Ignore,OMRErrInfo[4].Display); if OMRErrInfo[4].Display then CaseOk := false; end; Until not XT.SubNodes['/form/settype1/'].Next ; end; //*******必填******** //ShowMessage('11692 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]); //if AllCheck then //begin //*******有值相關文件的欄位也要有值******* if ModeNeedCheck(OMRErrInfo[7].Mode,FMode) then //是否要檢核 begin if XT.SubNodes['/form/settype3/'].First then Repeat SiteRec := ''; RelaSiteRec := ''; ColEName := XT.SubNodes['/form/settype3/'].NodeName; ColCName := XT.Node['/form/settype3/'+ColEName+'/'].Attributes['coldesc']; ColCName := Copy(ColCName,1,length(ColCName)-6); Site := XT.Node['/form/settype3/'+ColEName+'/'].Attributes['colxy']; if SiteRec= '' then //記錄位置 SiteRec := Site else SiteRec := SiteRec+'@'+Site; Pixel := XT.Node['/form/settype3/'+ColEName+'/'].Attributes['pixel']; Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin ////有填寫//// if XT.SubNodes['/form/settype3/'+ColEName+'/'].First then Repeat RelaSiteRec := ''; nodename := XT.SubNodes['/form/settype3/'+ColEName+'/'].NodeName; If (nodename <> '@coldesc') and (not XT.SubNodes['/form/settype3/'+ColEName+'/'].NodeIsAttr) then begin RelaFormCode := XT.node['/form/settype3/'+ColEName+'/'+nodename+'/'].Attributes['relaformid']; RelaColEName := XT.node['/form/settype3/'+ColEName+'/'+nodename+'/'].Attributes['rela_col_name']; RelaColCName := XT.node['/form/settype3/'+ColEName+'/'+nodename+'/'].Attributes['relacoldesc']; RelaColCName := Copy(RelaColCName,1,length(RelaColCName)-6); RelaFile := FormCode2FileName(RelaFormCode,ContextList); RelaFormName := FormCode2FormName(CaseID,RelaFormCode); Anchor1 := FormID2Anchor(RelaFormCode); RelaXT.LoadFromFile(CheckXmlPath+FWork_no+'\'+RelaFormCode+'.xml'); Display1.Lines.Add(RelaFile+','+RelaFormName); //ShowMessage(RelaFile); //ShowMessage(ImageSavePath+CaseID+'\upload\'+RelaFile); if RelaFile<>'' then begin ISB8.LoadFromFile(ImageSavePath+CaseID+'\upload\'+RelaFile,1); //20170815 ISB8W:= ISB8.Graphic.Width; ISB8H:= ISB8.Graphic.Height; FindPoint(ISB8.Graphic,UpLPoint,UpRPoint,DownLPoint,ISB8W,ISB8H,ANCHOR); //20170815 抓相關然欄位所在圖檔的定位 end; OMROK := False; //OMROK := False; //if RelaXT.SubNodes['/form/settype2/'].First then //Repeat NoSite := True; if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Count >0 then NoSite := False; if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].First then Repeat nodename := RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].NodeName; If nodename <> '@coldesc' then begin RelaPixel := Strtoint(RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['pixel']); RelaSite := RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['colxy']; if RelaSiteRec= '' then //記錄位置 RelaSiteRec := RelaSite else RelaSiteRec := RelaSiteRec+'@'+RelaSite; if FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then begin Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSite,Bt) > (RelaPixel + SafePixel) then begin OMROK := True; Break; end; ///依十字定位點縮放//// ImageReSize_FormID(CaseID,OMRFile); //20170815 重新抓定位 ////依十字定位點縮放//// end; end; Until not RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Next; if not OMROk then begin if not FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('未附')+RelaFormName+')' //XX欄位填寫時,XX欄位未填寫 Else if NoSite then ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('未定位')+')' Else ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName]); //XX欄位填寫時,XX欄位未填寫 OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSiteRec,Anchor,Anchor1,False,OMRErrInfo[7].Ignore,OMRErrInfo[7].Display); if OMRErrInfo[7].Display then CaseOk := false; end; //Until not RelaXT.SubNodes['/form/settype2/'].Next ; end; Until not XT.SubNodes['/form/settype3/'+ColEName+'/'].Next; end; Until not XT.SubNodes['/form/settype3/'].Next ; end; //*******有值相關文件的欄位也要有值******* //ShowMessage('11788 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]); //*******有值相關文件的欄位不能有值******* if ModeNeedCheck(OMRErrInfo[11].Mode,FMode) then //是否要檢核 begin if XT.SubNodes['/form/settype8/'].First then Repeat SiteRec := ''; RelaSiteRec := ''; OMROkCount := 0; ColEName := XT.SubNodes['/form/settype8/'].NodeName; ColCName := XT.Node['/form/settype8/'+ColEName+'/'].Attributes['coldesc']; ColCName := Copy(ColCName,1,length(ColCName)-6); Site := XT.Node['/form/settype8/'+ColEName+'/'].Attributes['colxy']; if SiteRec= '' then //記錄位置 SiteRec := Site else SiteRec := SiteRec+'@'+Site; Pixel := XT.Node['/form/settype8/'+ColEName+'/'].Attributes['pixel']; Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin ////有填寫// // inc(OMROkCount); end; if XT.SubNodes['/form/settype8/'+ColEName+'/'].First then Repeat RelaSiteRec := ''; nodename := XT.SubNodes['/form/settype8/'+ColEName+'/'].NodeName; If (nodename <> '@coldesc') and (not XT.SubNodes['/form/settype8/'+ColEName+'/'].NodeIsAttr) then begin RelaFormCode := XT.node['/form/settype8/'+ColEName+'/'+nodename+'/'].Attributes['relaformid']; RelaColEName := XT.node['/form/settype8/'+ColEName+'/'+nodename+'/'].Attributes['rela_col_name']; RelaColCName := XT.node['/form/settype8/'+ColEName+'/'+nodename+'/'].Attributes['relacoldesc']; RelaColCName := Copy(RelaColCName,1,length(RelaColCName)-6); RelaFile := FormCode2FileName(RelaFormCode,ContextList); RelaFormName := FormCode2FormName(CaseID,RelaFormCode); Anchor1 := FormID2Anchor(RelaFormCode); RelaXT.LoadFromFile(CheckXmlPath+FWork_no+'\'+RelaFormCode+'.xml'); if RelaFile<>'' then begin ISB8.LoadFromFile(ImageSavePath+CaseID+'\upload\'+RelaFile,1); //20170815 ISB8W:= ISB8.Graphic.Width; ISB8H:= ISB8.Graphic.Height; FindPoint(ISB8.Graphic,UpLPoint,UpRPoint,DownLPoint,ISB8W,ISB8H,ANCHOR); //20170815 抓相關然欄位所在圖檔的定位 end; OMROK := False; //OMROK := False; //if RelaXT.SubNodes['/form/settype2/'].First then //Repeat NoSite := True; if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Count >0 then NoSite := False; if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].First then Repeat nodename := RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].NodeName; If nodename <> '@coldesc' then begin RelaPixel := Strtoint(RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['pixel']); RelaSite := RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['colxy']; if RelaSiteRec= '' then //記錄位置 RelaSiteRec := RelaSite else RelaSiteRec := RelaSiteRec+'@'+RelaSite; if FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then begin Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSite,Bt) > (RelaPixel + SafePixel) then begin inc(OMROkCount); //OMROK := True; //Break; end; ///依十字定位點縮放//// ImageReSize_FormID(CaseID,OMRFile); ////依十字定位點縮放//// end; end; //Else //begin //ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/']; //end; Until not RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Next; if OMROkCount > 1 then begin if not FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('未附')+RelaFormName+')' //XX欄位填寫時,XX欄位也填寫 Else if NoSite then ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('未定位')+')' Else ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName]); //XX欄位填寫時,XX欄位也填寫 OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSiteRec,Anchor,Anchor1,False,OMRErrInfo[7].Ignore,OMRErrInfo[7].Display); if OMRErrInfo[11].Display then CaseOk := false; end; //Until not RelaXT.SubNodes['/form/settype2/'].Next ; end; Until not XT.SubNodes['/form/settype8/'+ColEName+'/'].Next; Until not XT.SubNodes['/form/settype8/'].Next ; end; //*******有值相關文件的欄位不能有值******* //ShowMessage('11889 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]); //*******有值相依文件******* if ModeNeedCheck(OMRErrInfo[5].Mode,FMode) then //是否要檢核 begin if XT.SubNodes['/form/settype4/'].First then Repeat SiteRec := ''; RelaSiteRec := ''; ColEName := XT.SubNodes['/form/settype4/'].NodeName; ColCName := XT.Node['/form/settype4/'+ColEName+'/'].Attributes['coldesc']; ColCName := Copy(ColCName,1,length(ColCName)-6); Site := XT.Node['/form/settype4/'+ColEName+'/'].Attributes['colxy']; if SiteRec= '' then //記錄位置 SiteRec := Site else SiteRec := SiteRec+'@'+Site; Pixel := XT.Node['/form/settype4/'+ColEName+'/'].Attributes['pixel']; Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin ////有填寫//// if XT.SubNodes['/form/settype4/'+ColEName+'/'].First then Repeat nodename := XT.SubNodes['/form/settype4/'+ColEName+'/'].NodeName; If (nodename <> 'coldesc') and (not XT.SubNodes['/form/settype4/'+ColEName+'/'].NodeIsAttr) then begin {RelaFormCode := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformid']; RelaFile := FormCode2FileName(RelaFormCode); RelaFormName := FormCode2FormName(RelaFormCode); } RelaDocNo := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformid']; RelaFile := DocNo2FileName(RelaDocNo,ContextList); RelaDocName := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformname']; if RelaFile='' then begin ErrStr:=Format(OMRErrInfo[5].Info,[ColCName,RelaDocName]); //XX文件XX欄位填寫時,需附XX文件 OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[5].Ignore,OMRErrInfo[5].Display); if OMRErrInfo[5].Display then CaseOk := false; end; end; Until not XT.SubNodes['/form/settype4/'+ColEName+'/'].Next; end; Until not XT.SubNodes['/form/settype4/'].Next ; end; //*******有值相依文件******* //*******有值互斥文件******* if ModeNeedCheck(OMRErrInfo[6].Mode,FMode) then //是否要檢核 begin if XT.SubNodes['/form/settype5/'].First then Repeat SiteRec := ''; RelaSiteRec := ''; ColEName := XT.SubNodes['/form/settype5/'].NodeName; ColCName := XT.Node['/form/settype5/'+ColEName+'/'].Attributes['coldesc']; ColCName := Copy(ColCName,1,length(ColCName)-6); Site := XT.Node['/form/settype5/'+ColEName+'/'].Attributes['colxy']; if SiteRec= '' then //記錄位置 SiteRec := Site else SiteRec := SiteRec+'@'+Site; Pixel := XT.Node['/form/settype5/'+ColEName+'/'].Attributes['pixel']; Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin ////有填寫//// if XT.SubNodes['/form/settype5/'+ColEName+'/'].First then Repeat nodename := XT.SubNodes['/form/settype5/'+ColEName+'/'].NodeName; If (nodename <> 'coldesc') and (not XT.SubNodes['/form/settype5/'+ColEName+'/'].NodeIsAttr) then begin {RelaFormCode := XT.Node['/form/settype5/'+ColEName+'/'+nodename+'/'].Attributes['relaformid']; RelaFile := FormCode2FileName(RelaFormCode); RelaFormName := FormCode2FormName(RelaFormCode);} RelaDocNo := XT.Node['/form/settype5/'+ColEName+'/'+nodename+'/'].Attributes['relaformid']; RelaFile := DocNo2FileName(RelaDocNo,ContextList); RelaDocName := XT.Node['/form/settype5/'+ColEName+'/'+nodename+'/'].Attributes['relaformname']; if RelaFile<>'' then //有附 20130604看到(='')改的(未測) begin ErrStr:=Format(OMRErrInfo[6].Info,[ColCName,RelaDocName]); //XX文件XX欄位填寫時,不能附XX文件 OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[6].Ignore,OMRErrInfo[6].Display); if OMRErrInfo[6].Display then CaseOk := false; end; end; Until not XT.SubNodes['/form/settype5/'+ColEName+'/'].Next; end; Until not XT.SubNodes['/form/settype5/'].Next ; end; //*******有值互斥文件******* //*******有值寫備註******* if ModeNeedCheck(OMRErrInfo[8].Mode,FMode) then //是否要檢核 begin if XT.SubNodes['/form/settype6/'].First then Repeat SiteRec := ''; ColEName := XT.SubNodes['/form/settype6/'].NodeName; ColCName := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['coldesc']; ColCName := Copy(ColCName,1,length(ColCName)-6); Site := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['colxy']; Pixel := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['pixel']; if SiteRec= '' then //記錄位置 SiteRec := Site else SiteRec := SiteRec+'@'+Site; Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin ////有填寫//// if not FileExists(ImageSavePath+CaseID+'ScanMemo.dat') then begin ErrStr:=Format(OMRErrInfo[8].Info,[ColCName]); //XX文件XX欄位填寫時,需寫備註 OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[8].Ignore,OMRErrInfo[8].Display); if OMRErrInfo[8].Display then CaseOk := false; end; end; Until not XT.SubNodes['/form/settype6/'].Next ; end; //*******有值寫備註******* //*******OMR帶值******** if XT.SubNodes['/form/settype7/'].First then Repeat ColEName := XT.SubNodes['/form/settype7/'].NodeName; ValueXT['/content/'+ColEName+'/@savevalue'] := ''; //先給預設空白 if XT.SubNodes['/form/settype7/'+ColEName+'/'].First then Repeat nodename := XT.SubNodes['/form/settype7/'+ColEName+'/'].NodeName; If nodename <> '@coldesc' then begin Pixel := Strtoint(XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['pixel']); Site := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['colxy']; OMRValue := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['getvalue']; //有填就ok Display1.Lines.Add(ColEName+' '+ColCName+' 圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel))); if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then begin ValueXT['/content/'+ColEName+'/@savevalue'] := OMRValue; //有填就換成設定的值 Break; end; end; Until not XT.SubNodes['/form/settype7/'+ColEName+'/'].Next; Until not XT.SubNodes['/form/settype7/'].Next ; //*******OMR帶值******** //end; Finally if (OMRValue <> '') then ValueXT.SaveToFile(ImageSavePath+CaseID+'/GetValue.xml'); XT.Free; RelaXT.Free; end; end; //必填迴圈結束 Finally ValueXT.Free; end; //end; //end; Result := CaseOk; end; { ============================================================================== 方法名稱:OMRErr2ini 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:紀錄 OMR 檢核失敗的詳細資訊。方法根據 Display 旗標決定紀錄方式:若為 T rue,則在案件目錄下的 Checkerr.ini 中建立新的錯誤序號區段,詳細紀錄失 敗原因、檔案路徑、OMR 座標點、關聯檔案及定位點類型,用於後續 UI 呈現;若 為 False,則僅將錯誤原因字串附加於 CheckMemo.dat 純文字日誌中,作為背 景紀錄之用。 ============================================================================== } Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini var ini : Tinifile; Errcount : Integer; S : TStringlist; begin if Display then begin ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini'); try Errcount := ini.ReadInteger('OMRCount','Count',0); //透過Errcount來對應 inc(ErrCount); ini.WriteString(inttostr(ErrCount),'Reason',Reason); ini.WriteBool(inttostr(ErrCount),'Ingnore',Ingnore); ini.writeString(inttostr(ErrCount),'FileName',FileName); ini.WriteString(inttostr(ErrCount),'Site',Site); ini.WriteString(inttostr(ErrCount),'RelaFileName',RelaFileName); ini.WriteString(inttostr(ErrCount),'RelaSite',RelaSite); ini.WriteString(inttostr(ErrCount),'Anchor',Anchor); ini.WriteString(inttostr(ErrCount),'RelaAnchor',Anchor1); ini.WriteBool(inttostr(ErrCount),'Del',Del); ini.WriteInteger('OMRCount','Count',ErrCount); finally ini.Free; end; end Else begin S := TStringlist.Create; try if FileExists(ImageSavePath + CaseID+'\CheckMemo.dat') then S.LoadFromFile(ImageSavePath + CaseID+'\CheckMemo.dat'); S.Add(Reason); S.SaveToFile(ImageSavePath + CaseID+'\CheckMemo.dat'); finally S.Free; end; end; end; { ============================================================================== 方法名稱:OMRErrini2List 引用相依: 方法描述:將檢核失敗紀錄從 INI 設定檔載入至 UI 介面。方法會讀取 Checkerr.ini,遍 歷所有錯誤紀錄,並過濾掉已標記為刪除 (Del) 的項目。將符合條件的錯誤原 因填入 ErrlistForm 中的 ListView 元件,供使用者查看與修正。若清單中仍 存在錯誤,會同步停用介面上的上傳按鈕以防止不合規案件送出。 ============================================================================== } Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView var ini : Tinifile; Errcount : Integer; Del : Boolean; i : Integer; begin ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini'); try Errcount := ini.ReadInteger('OMRCount','Count',0); for i := 1 to ErrCount do begin Del := ini.ReadBool(inttostr(i),'Del',False); //是否被移除了 if Not Del then begin With ErrlistForm.ErrListLV.Items.Add do begin Caption := ini.ReadString(inttostr(i),'Reason',''); SubItems.Add(inttostr(i)); end; end; end; if Errlistform.ErrListLV.Items.Count > 0 then Errlistform.ImmediateBt.Enabled := False; finally ini.Free; end; end; { ============================================================================== 方法名稱:OMRErrini2List 引用相依: 方法描述:將 OMR 檢核失敗的記錄從 Checkerr.ini 讀取並顯示在 ListView 中。程序會 開啟指定案件目錄下的設定檔,讀取錯誤總數後逐一檢查每筆記錄是否已被移 除(Del 標記)。若記錄有效,則將錯誤原因及索引值新增至傳入的 ErrlistForm 中的 ErrListLV 列表。 ============================================================================== } Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView var ini : Tinifile; Errcount : Integer; Del : Boolean; i : Integer; begin ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini'); try Errcount := ini.ReadInteger('OMRCount','Count',0); for i := 1 to ErrCount do begin Del := ini.ReadBool(inttostr(i),'Del',False); //是否被移除了 if Not Del then begin With ErrlistForm.ErrListLV.Items.Add do begin Caption := ini.ReadString(inttostr(i),'Reason',''); SubItems.Add(inttostr(i)); end; end; end; if Errlistform.ErrListLV.Items.Count > 0 then Errlistform.ImmediateBt.Enabled := False; finally ini.Free; end; end; { ============================================================================== 方法名稱:OMRErrini2ListForLog 引用相依:LoadFromFile 方法描述:彙整系統中所有活動案件的 OMR 檢核錯誤訊息。方法讀取全域的 CaseList.da t,依次遍歷每個案件子目錄下的 Checkerr.ini,收集所有未被移除的錯誤原因 ,並將其合併為一個完整的文字區塊返回。此功能主要用於產生系統運行日誌, 方便追蹤與審查多案件的檢核狀態。 ============================================================================== } function TCB_IMGPSScanX.OMRErrini2ListForLog(CaseID: String): String; var ini : Tinifile; Errcount : Integer; Del : Boolean; i,j : Integer; ST,CaseList:TStringList; begin Result:=''; //CaseList.dat ST:=TStringList.Create; CaseList:=TStringList.Create; CaseList.LoadFromFile(ImageSavePath+'CaseList.dat'); for I := 0 to CaseList.Count - 1 do begin ini := Tinifile.Create(ImageSavePath + CaseList.Strings[i]+'\upload\Checkerr.ini'); try Errcount := ini.ReadInteger('OMRCount','Count',0); for j := 1 to ErrCount do begin Del := ini.ReadBool(inttostr(j),'Del',False); //是否被移除了 if Not Del then begin ST.Add(ini.ReadString(inttostr(j),'Reason','')) ; end; end; finally ini.Free; end; end; Result:=ST.Text; ST.Free; CaseList.Free; end;