curtis
14小時前 3af5c004b4f2d2005d22ee85dccc2c80a66b1556
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
{ ==============================================================================
  方法名稱:GetServerDate
  引用相依:ProcessServlet_Get
  方法描述:從伺服器獲取伺服器時間。透過 HTTPS 請求取得時間字串,解析日期與時間,並
            計算 Server 與本機的時間差(Balance)供後續校時使用。
============================================================================== }
Function TCB_IMGPSScanX.GetServerDate : Boolean;
begin
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/servertimeforocx','',FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    ServerDate := memo1.Lines.Strings[1];
    ServerTime := Copy(ServerDate,9,6);
    ServerDate := Copy(ServerDate,1,8);
    Balance := GetBalance(ServerTime); //Server 跟Local的時間差
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
 
end;
 
 
{ ==============================================================================
  方法名稱:GetSampleInf
  引用相依:ProcessServlet_Get
  方法描述:從伺服器獲取已註冊的範本表單 ID 清單,並存入 SampleFormIDList。
============================================================================== }
Function TCB_IMGPSScanX.GetSampleInf : Boolean;
var
  str:String;
begin
  Result := False;
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/serversampleforocx','work_no='+FWork_no,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    str := memo1.Lines.Strings[1];
    SampleFormIDList.CommaText:=str;
    
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
 
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf1
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 DOC_INF 資料表資訊(模式 1)。方法會加密目前伺服器時間戳記
            並發送 HTTP GET 請求。若成功取得資料(狀態碼 '0'),則利用 SetSQLData 將
            結果解析並存入本地快取 Doc_Inf_List;若發生通訊錯誤或 Session 逾時(偵
            測到登入頁面標籤),則會記錄對應的 HttpErrStr 並返回 False。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf1 : Boolean; //取系統設定資訊Mode1 DOC_INF
Var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT %s FROM DOC_INF WHERE WORK_NO = '%s' ORDER BY DOC_TYPE, DOC_NO, DOC_VERSION"
 
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
 
  ColumeStr := 'WORK_NO,DOC_NO,DOC_U_DESC,DOC_TYPE,DOC_VERSION,FORM_PAGES,START_DATE,STOP_DATE,IS_DOC_DIV,IS_IN_WH';
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=1&col='+Doc_Inf_Colume+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
 
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=1&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
 
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,Doc_Inf_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf2
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 DM_FORM_INF 表單關聯資訊(模式 2)。流程包含加密請求參數與
            發送 GET 請求。此方法負責取得表單間的主從關係、相依性以及互斥規則,並將
            回傳的資料行解析後存入本地的 DM_FORM_INF_List。若通訊失敗或 Session 
            過期,會設定錯誤訊息並中斷流程。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf2 : Boolean; //取系統設定資訊Mode2  DM_FORM_INF
var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT %s FROM DM_FORM_INF
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
  ColumeStr := 'WORK_NO,MAIN_FORM_ID,DOC_VERSION,DEPE_FORM_ID,MUTEX_FORM_ID';
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=2&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=2&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,DM_FORM_INF_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf3
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 FORM_INF 表單詳細資料(模式 3)。方法會取得包含表單名稱、說
            明、分類、定位點類型(ANCHOR/FRAME)、最大頁數及預設高寬等中繼數據。取得的
            資料會被快取至 FORM_INF_List,作為影像處理(如自動縮放與 OMR 檢核)的重
            要依據。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf3 : Boolean; //取系統設定資訊mode3  FORM_INF
var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT distinct %s FROM FORM_INF T1 LEFT JOIN DOC_INF T2 ON T2.DOC_NO = T1.DOC_NO AND T1.DOC_VERSION = T2.DOC_VERSION AND T1.WORK_NO = T2.WORK_NO WHERE T2.IS_USE = 'Y' AND T2.WORK_NO = %s
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
  //ColumeStr := 'T1.WORK_NO,T1.FORM_ID,T1.DOC_KIND,T1.DOC_NO,T1.DOC_VERSION,T1.FORM_NAME,T1.FORM_DESC,T1.DIVISION,T1.ANCHOR,T1.MAX_PAGE,T1.FORM_HEIGHT,T1.FORM_WIDTH,T1.MERGE_IMAGE,T1.CC_FORM_ID,T1.CC_MERGE_FORMID,T2.DOC_TYPE'; {T1.CC_FORM_ID,T1.CC_MERGE_FORMID,}
  ColumeStr := 'T1.WORK_NO,T1.FORM_ID,T1.DOC_NO,T1.DOC_VERSION,T1.FORM_NAME,T1.FORM_DESC,T1.DIVISION,T1.ANCHOR,T1.MAX_PAGE,T1.FORM_HEIGHT,T1.FORM_WIDTH,T1.IS_PRINT,T2.DOC_TYPE'; {T1.CC_FORM_ID,T1.CC_MERGE_FORMID,}
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=3&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=3&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,FORM_INF_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf4
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 CHECK_RULE_INF 檢核規則資訊(模式 4)。此方法取得包含檢核
            代號、描述及顯示類型在內的驗證規則,並將其儲存於 CHECK_RULE_INF_List。
            最後會呼叫 CheckRule2OMRErrInfo,將取得的規則同步更新至 OMR 錯誤資訊
            記錄中,以確保前端檢核邏輯與伺服器同步。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf4 : Boolean; //取系統設定資訊mode4  CHECK_RULE_INF
var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT %s FROM CHECK_RULE_INF WHERE CHECK_TYPE = 'S'
 
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
  ColumeStr := 'WORK_NO,CHECK_NO,CHECK_RULE_DESC,MESG_SHOW_TYPE,MESG_DISP_TYPE,CHECK_MESG,SCAN_MODE';
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=4&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=4&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,CHECK_RULE_INF_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
  CheckRule2OMRErrInfo;
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf5
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 MEMO_INF 註記資訊(模式 5)。方法會取得預設的註記內容及其
            對應的類型名稱,並將其快取至 MEMO_INF_List。這些資料通常用於 UI 上的註
            記選擇選單,方便掃瞄人員在影像處理過程中快速標註預設的說明文字。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf5 : Boolean; //取系統設定資訊mode5  MEMO_INF
  var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT %s FROM MEMO_INF T1 LEFT JOIN MEMO_TYPE_INF T2 ON T2.MEMO_TYPE_NO = T1.MEMO_TYPE WHERE T1.MEMO_SOURCE = '01'
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
  ColumeStr := 'T1.WORK_NO,T1.MEMO_TYPE,T1.MEMO_CONTENT,T2.MEMO_TYPE_NAME';
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=5&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=5&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,MEMO_INF_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf6
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 WORK_INF 工作參數資訊(模式 6)。此方法取得當前工作項目的
            全域參數(如 PARA_NO 與 PARA_CONTENT),並儲存於 WORK_INF_List。這些參數
            控制了掃瞄器的預設行為(如 DPI、雙面掃瞄等),是系統初始化環境設定的關鍵
            步驟。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf6 : Boolean; //取系統設定資訊mode5  WORK_INF
var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT %s FROM WORK_INF
 
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
  ColumeStr := 'WORK_NO,PARA_NO,PARA_CONTENT';
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=5&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=6&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,WORK_INF_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:GetSetInf7
  引用相依:En_DecryptionStr_Base64, ProcessServlet_Get
  方法描述:向伺服器請求 LASTEST_FORM_INF 最新表單版本資訊(模式 7)。方法會獲取各
            文件編號對應的最新表單 ID 與版本號,並儲存於 LASTEST_FORM_INF_List。此
            資訊用於確保使用者掃瞄的是最新版表單,或是用於舊案件轉檔時的版本對照。
============================================================================== }
Function TCB_IMGPSScanX.GetSetInf7 : Boolean; //取系統設定資訊mode5  LASTEST_FORM_INF
var
  ColumeStr : String;
  S : TStringlist;
  EnCodeDateTime : String;
begin
  //SELECT FORM_ID,DOC_NO,DOC_VERSION FROM FORM_INF WHERE (DOC_NO,DOC_VERSION) in (SELECT DOC_NO, MAX(DOC_VERSION) FROM FORM_INF GROUP BY DOC_NO) ORDER BY DOC_NO
 
  Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
  ColumeStr := 'FORM_ID,DOC_NO';
  //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=5&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=7&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else IF memo1.Lines.Strings[0] = '0' Then
  begin
    S := TStringlist.Create;
    S.Text := Memo1.Lines.Text;
    SetSQLData(ColumeStr,S,LASTEST_FORM_INF_List);
    S.Free;
    Result := True;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:TransOldCaseFile
  引用相依:FileExists, upFile
  方法描述:處理舊件引用的檔案傳送。遍歷舊件清單,若發現有引用記錄,則透過 HTTPS 將
            引用資訊上傳至伺服器,並處理伺服器回傳狀態。
============================================================================== }
Function TCB_IMGPSScanX.TransOldCaseFile(Path:String):Boolean;
var
  i : Integer;
  OldCaseID,Year,Data,Verify:String;
  SendData : String;
  OldCaseInfoList,Caseinfolist : TStringlist;
  OldCasePath : String;
begin
  Result := True;
  OldCaseInfoList := TStringlist.Create;
  Caseinfolist := TStringlist.Create;
  try
    OldCaseInfoList.StrictDelimiter := True;
    OldCaseInfoList.Delimiter := #9;
    OldCaseInfoList.DelimitedText := FOldCaseInfo;
    for i := 0 to OldCaseInfoList.Count - 1 do
    begin
      Caseinfolist := SplitString('@#,',OldCaseInfoList.Strings[i]);
      //Caseinfolist.Delimiter := '_';
      //Caseinfolist.DelimitedText := OldCaseInfoList.Strings[i];
      OldCaseID := Caseinfolist.Strings[0];
      Year := Caseinfolist.Strings[1];
      Data := Caseinfolist.Strings[4];
      Verify := Caseinfolist.Strings[5];
      OldCasePath := Path+OldCaseID+'\';
      if FileExists(OldCasePath+'UseCase.dat') and FileExists(OldCasePath+'UseCase.ini') then
      begin
        //////壓檔/////
        //ZipMainFile(Path,Path,'Img.zip');
 
        ////上傳/////
        SendData:='data='+HTTPEncode(UTF8Encode(Data))+'&verify='+Verify+'&other_case_no='+OldCaseID;
        //Showmessage(FUrl+'service/slic/SLIC02/useOther?'+senddata);
        if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/useOther',SendData,'file',OldCasePath+'UseCase.ini',FReWrite,Memo1,False) then
        begin
          Showmessage(Format(_Msg('傳送舊件編號(%s)檔案時,網路發生錯誤!!'),[OldCaseID])+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
          Result := False;
          Exit;
        end;
        if memo1.Lines.Strings[0] = '1' then
        begin
          Showmessage(Format(_Msg('傳送舊件編號(%s)檔案時,網路發生錯誤!!'),[OldCaseID])+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
          Result := False;
          Exit;
        end
        Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
        begin
          Showmessage(Format(_Msg('傳送舊件編號(%s)檔案時,網路發生錯誤!!'),[OldCaseID])+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
          Result := False;
          Exit;
        end;
      end;
 
  ////上傳////
    end;
  finally
  OldCaseInfoList.Free;
  Caseinfolist.Free;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:Writelog
  引用相依:
  方法描述:透過 ProcessServlet 向伺服器發送列印日誌記錄。傳送案件編號與 FData 等
            參數,並檢查伺服器回傳是否成功或 Session 是否失效。
============================================================================== }
Function TCB_IMGPSScanX.Writelog(CaseID : String):Boolean;
var
  SendData : String;
begin
  Result := True;
  SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID;
  If not ProcessServlet(HTTPSClient,FURL+'service/imgpsc/IMGPSC06/printlog',SendData,FReWrite,Memo1,False) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:DownLanguage
  引用相依:dnFile, dnFile_Get
  方法描述:從伺服器下載多國語言設定檔 Language.Lng。使用 HTTPS 客戶端執行 GET 請
            求,下載至本地語系路徑。下載後會檢查回傳內容,驗證是否發生錯誤、伺服器回
            傳錯誤訊息,或是因為閒置過久導致 Session 過期被導向登入頁面,並設定對
            應的錯誤字串。
============================================================================== }
Function TCB_IMGPSScanX.DownLanguage:Boolean;  //下載多國語言檔
begin
  Result := True;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
  //dnFile(HTTPSClient,FUrl+'Language.Lng','','',LngPath+'Language.Lng',FReWrite.Text,Memo1,False,DownImgStatus)
  If not dnFile_Get(HTTPSClient,FUrl+'Language.Lng','','',LngPath+'Language.Lng',FReWrite,Memo1,False,DownImgStatus) Then
  begin
    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
    Result := False;
    Exit;
  end;
  IF memo1.Lines.Strings[0] = '1' Then
  begin
    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end
  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
  begin
    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
    Result := False;
    Exit;
  end;
  
end;
 
 
{ ==============================================================================
  方法名稱:GetOMRCheckSet
  引用相依:FileExists, LoadFromFile, SaveToFile, dnFile_Get, dnFile
  方法描述:從伺服器下載並更新 OMR 檢核設定檔(OMRSet.zip)。程序會檢查本地 LastDat
            eTime.dat 取得最後更新時間,並發送請求。若伺服器有新資料,則下載後解壓
            縮並更新本地時間戳記;若無更新則維持現狀,並包含完整的錯誤處理邏輯。
============================================================================== }
Function TCB_IMGPSScanX.GetOMRCheckSet : Boolean; //下載OMR檢核XML檔
var
  SendData : String;
  LastDateTime : String;
  S : TStringlist;
begin
  Result := True;
  S := TStringlist.Create;
  Try
    if FileExists(CheckXmlPath+'OMRSet.zip') then
      DeleteFile(CheckXmlPath+'OMRSet.zip');
 
    LastDateTime := '00000000000000';
    if FileExists(CheckXmlPath+'LastDateTime.dat') then
    begin
      S.LoadFromFile(CheckXmlPath+'LastDateTime.dat');
      LastDateTime := S.Strings[0];
    end;
 
    SendData := 'settype=3&lastupdate='+LastDateTime;
    if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC01/settings',SendData,CheckXmlPath+'OMRSet.zip',FReWrite,Memo1,False,DownImgStatus) then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := False;
      Exit;
    end;
    if FileExists(CheckXmlPath+'OMRSet.zip') then   //有更新
    begin
      ExecuteUnZip(CheckXmlPath+'OMRSet.zip',CheckXmlPath,True);
      S.Clear;
      S.Add(ServerDate+GetBalance2Time(Balance));
      S.SaveToFile(CheckXmlPath+'LastDateTime.dat');
    end
    Else
    begin
      if (Memo1.Lines.Strings[0] = 'nodata') Then   //沒更新
      begin
        Result := True;
      end
      Else if (Memo1.Lines.Strings[0] = '1') Then
      begin
        HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
        Result := False;
        Exit;
      end
      Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
      begin
        HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
        Result := False;
        Exit;
      end;
    end;
 
  Finally
  S.Free;
  End;
 
end;
 
 
{ ==============================================================================
  方法名稱:GetKeyinSet
  引用相依:FileExists, LoadFromFile, SaveToFile, dnFile_Get, dnFile
  方法描述:從伺服器下載並更新登打設定檔(KeyinSet.zip)。運作機制與 GetOMRCheckSet
             相同,透過比對時間戳記決定是否執行下載與解壓縮,確保本地的登打定位資
            訊與伺服器同步。
============================================================================== }
Function TCB_IMGPSScanX.GetKeyinSet : Boolean; //取登打設定
var
  SendData : String;
  LastDateTime : String;
  S : TStringlist;
begin
  Result := True;
  S := TStringlist.Create;
  Try
    if FileExists(SitePath+'KeyinSet.zip') then
      DeleteFile(SitePath+'KeyinSet.zip');
 
    LastDateTime := '00000000000000';
    if FileExists(SitePath+'LastDateTime.dat') then
    begin
      S.LoadFromFile(SitePath+'LastDateTime.dat');
      LastDateTime := S.Strings[0];
    end;
    SendData := 'settype=2&lastupdate='+LastDateTime;
    if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC01/settings',SendData,SitePath+'KeyinSet.zip',FReWrite,Memo1,False,DownImgStatus) then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := False;
      Exit;
    end;
    if FileExists(SitePath+'KeyinSet.zip') then  //有更新
    begin
      ExecuteUnZip(SitePath+'KeyinSet.zip',SitePath,True);
      S.Clear;
      S.Add(ServerDate+GetBalance2Time(Balance));
      S.SaveToFile(SitePath+'LastDateTime.dat');
    end
    Else
    begin
      if (Memo1.Lines.Strings[0] = 'nodata') Then   //沒更新
      begin
        Result := True;
      end
      Else if (Memo1.Lines.Strings[0] = '1') Then
      begin
        HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
        Result := False;
        Exit;
      end
      Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
      begin
        HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
        Result := False;
        Exit;
      end;
    end;
 
  Finally
  S.Free;
  End;
 
end;
 
 
 
{ ==============================================================================
  方法名稱:CaseAsk
  引用相依:ProcessServlet_Get
  方法描述:在上傳案件前,向伺服器詢問該案件是否可進行傳送。針對 NSCAN 或 DSCAN 模
            式,會封裝案件編號與加密驗證資訊發送至 IMGPSC05/isnew 服務。根據伺服器
            回傳結果(0 表示可上傳,1 表示重複),決定後續的上傳流程。
============================================================================== }
Function TCB_IMGPSScanX.CaseAsk(CaseID: string):Integer;
var
  SendData : String;
begin
//Memo1.Clear;
  SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID+'&work_no='+FWork_no;
  if (FMode = 'NSCAN') or (FMode = 'DSCAN') then
  begin
//ShowMessage('JJJJJ');
    If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC05/isnew',SendData,FReWrite,Memo1,False) Then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := -1;
      Exit;
    end;
  end;
//ShowMessage(SendData);
 
  IF memo1.Lines.Strings[0] <> '0' Then
  begin
    HttpErrStr := _Msg('')+memo1.Lines.Strings[1]+'。';
    Result := -1;
    Exit;
  end
  Else
  begin
    if (memo1.Lines.Count < 2) then
    begin
      HttpErrStr := _Msg('')+'OCX:Index Count error';
      Result := -1;
      Exit;
    end
    Else
    begin
      if memo1.Lines.Strings[1] = '0' then
      begin
        Result := 0;
      end
      Else if memo1.Lines.Strings[1] = '1' then
        Result := 1
      Else
      begin
        HttpErrStr := _Msg('')+'OCX:Value error';
        Result := -1;
        Exit;
      end;
    end;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:CaseComplete
  引用相依:FileExists, LoadFromFile, En_DecryptionStr_Base64
  方法描述:通知伺服器案件傳送完成。函式會收集案件的各項元數據,包含總頁數、主表單 
            ID、經辦資訊、被保人資料等,並根據不同的業務模式(如 NSCAN, ESCAN)格式化
            發送數據。若包含 OMR 檢核失敗資訊或備註,也會一併封裝傳送,最後根據伺服
            器回傳值判定作業是否成功。
============================================================================== }
Function TCB_IMGPSScanX.CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //通知傳送完成
var
  OMRValue,Batchnum,Usermemo,Checkmemo,UpformID,ReMoveMemo: String;
  Case_type,Handle_no,Format_id,Cen_Uid,Cen_Cliname,Cen_Platno,Cen_Apolyno,Case_priority : String;
  Pages : Integer;
  EnCodeDateTime : String;
  SendData : String;
  S : TStringlist;
  i,v,v1 : Integer;
  UpSortID : String;
begin
  Result := True;
  S := TStringlist.Create;
  try
    EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
 
    UpformID := GetCaseFormID(Path);
 
 
    Case_type := '0';
    if FileExists(Path+'Context.dat') then    //掃描頁數
    begin
      S.LoadFromFile(Path+'Context.dat');
      Pages := S.Count;
    end;
    if not FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then //如果沒這個檔就重產生預設值
    begin
      ClearCaseIndex;
      WriteCaseIndex(ImageSavePath+CaseID+'\');
    end;
    {if FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then
    begin
      S.LoadFromFile(ImageSavePath+CaseID+'\CaseIndex.dat');
 
      Handle_No := S.Strings[0];    //經辦代號
      Cen_Uid := S.Strings[1];      //被保人ID
      Cen_Cliname := S.Strings[2];  //被保人姓名
      Cen_Platno := S.Strings[3];   //車號
      Case_Priority := S.Strings[4];//案件等級
      if FMode = 'SSCAN' then  //簽署章件的時候一律傳Format_ID
      begin
        Format_ID := S.Strings[5];    //主鍵值 (報價單號or續保單號or保單號碼or保險證號)
      end
      Else
      begin
        if (Length(UpformID) = 12) and (UpformID[2] = '-') then
          Format_ID := S.Strings[5]    //主鍵值 (報價單號or續保單號or保單號碼or保險證號)
        else
          Cen_Apolyno := S.Strings[5]; //強制證號
      end;
      if (FMode = 'MSCAN') and (length(Format_ID) = 16) and (Copy(Format_ID,1,2) = '05') then
      begin
        Format_ID := Copy(Format_ID,3,14);   //20130606 yuu說監理站件的主鍵值為16碼且開開為05的要去掉
      end;
 
    end; }
    if FileExists(ImageSavePath+CaseID+'\GetValue.xml') then    //掃描帶值
    begin
      S.LoadFromFile(ImageSavePath+CaseID+'\GetValue.xml');
      OMRValue := Trim(S.Text);
    end;
    if MainCase then    //雙主約的主要案件
    begin
      if FileExists(ImageSavePath+CaseID+'\Batchnum.dat') then
      begin
        S.LoadFromFile(ImageSavePath+CaseID+'\Batchnum.dat');
        Batchnum := Trim(S.Text);
      end;
    end
    Else    //雙主約的第二案件
    begin
      if FileExists(ImageSavePath+CaseID+'\SecBatchnum.dat') then
      begin
        S.LoadFromFile(ImageSavePath+CaseID+'\SecBatchnum.dat');
        Batchnum := Trim(S.Text);
      end;
    end;
    if FileExists(ImageSavePath+CaseID+'\Scan_Memo.dat') then
    begin
      S.LoadFromFile(ImageSavePath+CaseID+'\Scan_Memo.dat');
      Usermemo := Trim(S.Text);
    end;
    if FileExists(ImageSavePath+CaseID+'\CheckMemo.dat') then
    begin
      S.LoadFromFile(ImageSavePath+CaseID+'\CheckMemo.dat');
      Checkmemo := Trim(S.Text);
    end;
 
    if FileExists(ImageSavePath+CaseID+'\RemoveMemo.dat') then
    begin
      S.LoadFromFile(ImageSavePath+CaseID+'\RemoveMemo.dat');
      ReMoveMemo := Trim(S.Text);
    end;
 
 
  finally
  S.Free;
  end;
  case_priority:='0';
  if (FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') then
  begin
    SendData := 'checktime='+EnCodeDateTime
                +'&work_no='+FWork_No                                  //作業別
                +'&case_id='+CaseID                                    //受理編號
                +'&form_id='+UpformID                                  //表單代號
                +'&scan_page='+inttostr(pages)                         //掃描頁數
                +'&scan_get_value='+HTTPEncode(UTF8Encode(OMRValue))   //掃描帶值
                +'&case_priority='+case_priority                       //案件等級
                +'&batch_no='+batchnum                                 //車隊批號
                +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))        //使用者註記
                +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))      //檢核註記
                +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))    //檢核移除註記
                +'&case_type='+Case_type                               //進件種類    進件0 歸檔1
                +'&handle_no='+Handle_no                               //經辦代號
                +'&format_id='+Format_id                               //案件主鍵值
                +'&cen_uid='+Cen_Uid                                   //被保人ID
                +'&cen_cliname='+HTTPEncode(UTF8Encode(Cen_Cliname))   //被保人姓名
                +'&cen_platno='+Cen_Platno                             //車牌
                +'&cen_apolyno='+Cen_Apolyno                           //強制證號
                +'&has_authorize='+Has_Authorize;                      //是否有授權書影像
                Showmessage(SendData);
    if not RejectCase then
    begin
      If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC05',SendData,FReWrite,Memo1,False) Then
      begin
        HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
        Result := False;
        Exit;
      end;
    end
    Else
    begin
      If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC06',SendData,FReWrite,Memo1,False) Then
      begin
        HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
        Result := False;
        Exit;
      end;
    end;
 
 
  end
  Else if FMode = 'ISCAN' then
  begin
    SendData := 'checktime='+EnCodeDateTime
                +'&work_no='+FWork_No
                +'&case_id='+CaseID
                +'&form_id='+UpformID
                +'&format_id='+Format_id
                +'&scan_page='+inttostr(pages)
                +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))
                +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))
                +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))
                +'&has_authorize='+Has_Authorize;    //是否有授權書影像
    //Showmessage(SendData);
    If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC08',SendData,FReWrite,Memo1,False) Then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := False;
      Exit;
    end;
  end
  Else if FMode = 'FSCAN' then
  begin
    SendData := 'checktime='+EnCodeDateTime
                +'&work_no='+FWork_No
                +'&case_id='+CaseID
                +'&scan_page='+inttostr(pages)
                +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))
                +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))
                +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))
                +'&has_authorize='+Has_Authorize;     //是否有授權書影像
    If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC09',SendData,FReWrite,Memo1,False) Then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := False;
      Exit;
    end;
  end
  Else if FMode = 'RSCAN' then
  begin
    SendData := 'checktime='+EnCodeDateTime
                +'&act=rescan'
                +'&workno='+FWork_No
                +'&caseid='+CaseID
                +'&formid='+UpformID
                +'&scanpage='+inttostr(pages)
               // +'&areano='+FUserArea
                +'&scangetvalue='+HTTPEncode(UTF8Encode(OMRValue))
                +'&usermemo='+HTTPEncode(UTF8Encode(usermemo))
                +'&checkmemo='+HTTPEncode(UTF8Encode(checkmemo))
                +'&removememo='+HTTPEncode(UTF8Encode(ReMoveMemo))
                +'&has_authorize='+Has_Authorize;        //是否有授權書影像
    If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC01',SendData,FReWrite,Memo1,False) Then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := False;
      Exit;
    end;
  end
  Else if FMode = 'ESCAN' then
  begin
    SendData := 'checktime='+EnCodeDateTime
                    +'&act=escan'
                    +'&workno='+FWork_No
                    +'&caseid='+CaseID
                    +'&formid='+UpformID
                    +'&scanpage='+inttostr(pages)
                    +'&batchnum='+batchnum
                    +'&usermemo='+HTTPEncode(UTF8Encode(usermemo))
                    +'&checkmemo='+HTTPEncode(UTF8Encode(checkmemo))
                    +'&removememo='+HTTPEncode(UTF8Encode(ReMoveMemo))
                    +'&has_authorize='+Has_Authorize;      //是否有授權書影像
    If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC01',SendData,FReWrite,Memo1,False) Then
    begin
      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
      Result := False;
      Exit;
    end;
  end;
 
  if Memo1.Lines.Strings[0] <> '0'then
  begin
    HttpErrStr := _Msg('錯誤原因:')+Memo1.Lines.Strings[1];
    Result := False;
    Exit;
  end;
end;