SignOnlineReportsFrm.pas 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368
  1. unit SignOnlineReportsFrm;
  2. interface
  3. uses
  4. ProjectData, ReportManager, ReportConnection, ReportPrepare,
  5. PrintComTypeDefUnit, ADODB, DB, SignReports,
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, sdIDTree, sdDB, ComCtrls, ExtCtrls, VirtualTrees, PrintCom,
  8. PrintComXML, MScrollBox, StdCtrls, Buttons, PNGButton, ieview,
  9. imageenview, jpeg, ConditionalDefines;
  10. const
  11. crNext = -25;
  12. crPrevious = -26;
  13. offset = 150;
  14. type
  15. TUploadType = (utSign, utEpure);
  16. TSignOnlineReportsForm = class(TForm)
  17. tvReports: TTreeView;
  18. pnlBottom: TPanel;
  19. PreviewComXML: TPrintComXML;
  20. previewBox: TImage;
  21. msbReportsPreview: TMScrollBox;
  22. lblAlreadyUpload: TLabel;
  23. cbFillZero: TCheckBox;
  24. pnlPageControl: TPanel;
  25. btnPre: TButton;
  26. btnNext: TButton;
  27. lblPages: TLabel;
  28. pbGenerate: TPNGButton;
  29. ImageEnView1: TImageEnView;
  30. lblEpureHint: TLabel;
  31. procedure FormShow(Sender: TObject);
  32. procedure tvReportsClick(Sender: TObject);
  33. procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
  34. dataType: Integer; isReading: Boolean; DrawType: Integer;
  35. isPrinting: Boolean);
  36. procedure PreviewComXMLCrossTabLabelShow(valIDX: Integer; var ExLeft,
  37. ExRight: Double; var isShow: Boolean; CrsTabShowType: Integer);
  38. procedure PreviewComXMLGetDataConnection(var ADOCon: TADOConnection);
  39. procedure PreviewComXMLGetDatasetEvent(DatasetInfo: PDatasetInfoRec;
  40. var ADataset: TDataSet);
  41. procedure msbReportsPreviewMouseWheelDown(Sender: TObject;
  42. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  43. procedure msbReportsPreviewMouseWheelUp(Sender: TObject;
  44. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  45. procedure ScrollBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  46. MousePos: TPoint; var Handled: Boolean);
  47. procedure ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
  48. MousePos: TPoint; var Handled: Boolean);
  49. procedure btnPreClick(Sender: TObject);
  50. procedure btnNextClick(Sender: TObject);
  51. procedure pbGenerateClick(Sender: TObject);
  52. procedure cbFillZeroClick(Sender: TObject);
  53. private
  54. FWebProjectID: Integer;
  55. FWebTenderID: Integer;
  56. FSignPhase: Integer;
  57. FProjectData: TProjectData;
  58. // 数据库管理
  59. FReportCon: TReportConnection;
  60. // 报表数据准备
  61. FReportDataPrepare: TReportPrepare;
  62. FPreviewList: TList;
  63. FCurPage: Integer;
  64. FTempPath: string;
  65. FUploadType: TUploadType;
  66. FLoadListUrl: string;
  67. FPostedSignReports: TSignReports;
  68. procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  69. procedure OnViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  70. function SafeReportName(var AName: string): Boolean;
  71. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  72. procedure ExportReports(const AFileName: string);
  73. procedure ExportPdfReports(const AFileName: string);
  74. procedure GenerateSignReport;
  75. procedure GenerateEpureReport;
  76. procedure LoadReportTemplates;
  77. procedure PreviewPage(AImage: TImage; APageIndex: Integer);
  78. procedure InitPageSettings(APrintCom: TPrintComXML);
  79. procedure InitFont(APrintCom: TPrintComXML);
  80. procedure InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  81. procedure InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode = nil);
  82. procedure SaveAuditOpinion(ATemplate: TTemplateNode);
  83. procedure SaveReportInteractData(ATemplate: TTemplateNode);
  84. procedure LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  85. procedure LoadTemplateAndDisplay(ATemplate: TTemplateNode);
  86. procedure SetCurPage(const Value: Integer);
  87. public
  88. constructor Create(AOwner: TComponent); override;
  89. destructor Destroy; override;
  90. procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
  91. // 特性初始化
  92. procedure InitForSign;
  93. procedure InitForEpure;
  94. property ProjectData: TProjectData read FProjectData;
  95. property CurPage: Integer read FCurPage write SetCurPage;
  96. end;
  97. // 在线签署
  98. procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
  99. // 插入计量草图(中间计量)
  100. procedure EpureOnline(AProjectNode: TsdIDTreeNode; AEpurePhase: Integer);
  101. implementation
  102. uses
  103. UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
  104. ScFileArchiver, ZhAPI, PHPWebDm, imageenio, ReportPdfHelper,
  105. mProgressFrm, RenameSignReportFrm, Math, superobject, ProgressHintFrm;
  106. {$R *.dfm}
  107. procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
  108. var
  109. vSignForm: TSignOnlineReportsForm;
  110. begin
  111. vSignForm := TSignOnlineReportsForm.Create(nil);
  112. try
  113. vSignForm.Init(AProjectNode, ASignPhase);
  114. vSignForm.InitForSign;
  115. vSignForm.ShowModal;
  116. finally
  117. vSignForm.Free;
  118. end;
  119. end;
  120. procedure EpureOnline(AProjectNode: TsdIDTreeNode; AEpurePhase: Integer);
  121. var
  122. vEpureForm: TSignOnlineReportsForm;
  123. begin
  124. vEpureForm := TSignOnlineReportsForm.Create(nil);
  125. try
  126. vEpureForm.Init(AProjectNode, AEpurePhase);
  127. vEpureForm.InitForEpure;
  128. vEpureForm.ShowModal;
  129. finally
  130. vEpureForm.Free;
  131. end;
  132. end;
  133. { TSignOnlineReportsForm }
  134. destructor TSignOnlineReportsForm.Destroy;
  135. begin
  136. ClearObjects(FPreviewList);
  137. FPreviewList.Free;
  138. FReportCon.Free;
  139. FReportDataPrepare.Free;
  140. if Assigned(FProjectData) then
  141. FProjectData.Free;
  142. if DirectoryExists(FTempPath) then
  143. DeleteFileOrFolder(FTempPath);
  144. inherited;
  145. end;
  146. procedure TSignOnlineReportsForm.Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
  147. function getTopParent(ANode: TsdIDTreeNode): TsdIDTreeNode;
  148. begin
  149. if Assigned(ANode.Parent) then
  150. Result := getTopParent(ANode.Parent)
  151. else
  152. Result := ANode;
  153. end;
  154. function getName(ANode: TsdIDTreeNode): string;
  155. begin
  156. Result := ANode.Rec.ValueByName('Name').AsString;
  157. end;
  158. begin
  159. FWebProjectID := GetTopParent(AProjNode).Rec.ValueByName('WebID').AsInteger;
  160. FWebTenderID := AProjNode.Rec.ValueByName('WebID').AsInteger;
  161. FSignPhase := ASignPhase;
  162. FProjectData := TProjectData.Create;
  163. FProjectData.OpenForSignOnline(AProjNode.Rec, ASignPhase);
  164. FReportDataPrepare := TReportPrepare.Create(FProjectData);
  165. FReportCon := TReportConnection.Create(FProjectData);
  166. //Caption := Format('生成签署报表 %s-%s-第 %d 期', [getName(getTopParent(AProjectNode)), getName(AProjectNode), ASignPhase]);
  167. Caption := Format('生成签署报表 %s-第 %d 期', [getName(AProjNode), ASignPhase]);
  168. LoadReportTemplates;
  169. FTempPath := GetAppTempPath + IntToStr(AProjNode.ID) + '\';
  170. CreateDirectoryInDeep(FTempPath);
  171. end;
  172. procedure TSignOnlineReportsForm.LoadReportTemplates;
  173. var
  174. vHelper: TTemplateManagerHelper;
  175. begin
  176. vHelper := TTemplateManagerHelper.Create;
  177. try
  178. vHelper.ExportToTreeView(tvReports, ReportTemplateManager);
  179. finally
  180. vHelper.Free;
  181. end;
  182. end;
  183. procedure TSignOnlineReportsForm.FormShow(Sender: TObject);
  184. var
  185. vNode: TTreeNode;
  186. begin
  187. vNode := tvReports.Items.GetFirstNode;
  188. while Assigned(vNode) do
  189. begin
  190. vNode.Expand(True);
  191. vNode := vNode.getNextSibling;
  192. end;
  193. tvReports.Selected := tvReports.Items[0];
  194. end;
  195. procedure TSignOnlineReportsForm.tvReportsClick(Sender: TObject);
  196. var
  197. vTemplate: TTemplateNode;
  198. begin
  199. if Assigned(tvReports.Selected) then
  200. begin
  201. vTemplate := TTemplateNode(tvReports.Selected.Data);
  202. pbGenerate.Visible := Assigned(vTemplate);
  203. cbFillZero.Visible := Assigned(vTemplate);
  204. pnlPageControl.Visible := Assigned(vTemplate);
  205. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
  206. lblAlreadyUpload.Visible := Assigned(vTemplate) and Assigned(FPostedSignReports.FindSignReport(FSignPhase, vTemplate.TemplateName));
  207. ReportTemplateManager.Current := vTemplate;
  208. if Assigned(vTemplate) then
  209. LoadTemplateAndDisplay(vTemplate);
  210. tvReports.SetFocus;
  211. end;
  212. end;
  213. procedure TSignOnlineReportsForm.LoadTemplateAndDisplay(ATemplate: TTemplateNode);
  214. procedure WaringAndEmptyPreview(AStr: string);
  215. var
  216. OldBrushColor, OldPenColor: TColor;
  217. begin
  218. TipMessage(AStr, Handle);
  219. ClearObjects(FPreviewList);
  220. pnlPageControl.Visible := False;
  221. end;
  222. procedure ShowAllPages;
  223. const
  224. Indent = 5;
  225. var
  226. iPage: Integer;
  227. vPreviewImage: TImage;
  228. begin
  229. ClearObjects(FPreviewList);
  230. msbReportsPreview.HorzScrollBar.Range := 0;
  231. msbReportsPreview.HorzScrollBar.Position := 0;
  232. msbReportsPreview.VertScrollBar.Range := 0;
  233. msbReportsPreview.VertScrollBar.Position := 0;
  234. for iPage := 1 to PreviewComXML.TotalPages do
  235. begin
  236. vPreviewImage := TImage.Create(msbReportsPreview);
  237. vPreviewImage.Parent := msbReportsPreview;
  238. vPreviewImage.Top := (PreviewComXML.PrintHeight + Indent) * (iPage - 1);
  239. vPreviewImage.Left := 0;
  240. PreviewPage(vPreviewImage, iPage);
  241. FPreviewList.Add(vPreviewImage);
  242. end;
  243. msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
  244. msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight * PreviewComXML.TotalPages + 10 * (PreviewComXML.TotalPages - 1);
  245. end;
  246. procedure ShowCurPages;
  247. var
  248. vPreviewImage: TImage;
  249. begin
  250. ClearObjects(FPreviewList);
  251. msbReportsPreview.HorzScrollBar.Position := 0;
  252. msbReportsPreview.VertScrollBar.Position := 0;
  253. vPreviewImage := TImage.Create(msbReportsPreview);
  254. vPreviewImage.Parent := msbReportsPreview;
  255. vPreviewImage.Top := 0;
  256. vPreviewImage.Left := 0;
  257. FPreviewList.Add(vPreviewImage);
  258. msbReportsPreview.HorzScrollBar.Range := PreviewComXML.ReportSize.X;
  259. msbReportsPreview.VertScrollBar.Range := PreviewComXML.ReportSize.Y;
  260. vPreviewImage.OnMouseMove := OnViewMouseMove;
  261. vPreviewImage.OnMouseDown := OnViewMouseDown;
  262. CurPage := 1;
  263. end;
  264. procedure PreviewTemplet(AIsShowAllPages: Boolean);
  265. begin
  266. try
  267. if AIsShowAllPages then
  268. ShowAllPages
  269. else
  270. ShowCurPages;
  271. pnlPageControl.Visible := not AIsShowAllPages;
  272. msbReportsPreview.SetFocus;
  273. except
  274. WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');
  275. end;
  276. end;
  277. procedure LoadEmptyTempletAndDisplay;
  278. begin
  279. WaringAndEmptyPreview('报表无数据,请选择其他报表。');
  280. end;
  281. begin
  282. // 交互表
  283. if ATemplate.InteractFlag <> 0 then
  284. SaveReportInteractData(ATemplate);
  285. // 准备额外数据
  286. if ATemplate.DataPrepareFlag <> 0 then
  287. FReportDataPrepare.PrepareData(ATemplate.DataPrepareFlag);
  288. FReportCon.RefreshConnection(ATemplate);
  289. Screen.Cursor := crHourGlass;
  290. try
  291. LoadTemplet(ATemplate, PreviewComXML);
  292. if PreviewComXML.TotalPages > 0 then
  293. PreviewTemplet(False)
  294. else
  295. LoadEmptyTempletAndDisplay;
  296. finally
  297. Screen.Cursor := crDefault;
  298. end;
  299. end;
  300. procedure TSignOnlineReportsForm.LoadTemplet(ATemplate: TTemplateNode;
  301. APrintCom: TPrintComXML);
  302. var
  303. RptArchiverObj: TReportArchiver;
  304. Mem: TMemoryStream;
  305. begin
  306. RptArchiverObj := TReportArchiver.Create;
  307. if ATemplate.IsMulti then
  308. RptArchiverObj.FileName := ATemplate.MultiFileNames[FProjectData.PhaseIndex]
  309. else
  310. RptArchiverObj.FileName := ATemplate.FileName;
  311. Mem := RptArchiverObj.Extract;
  312. try
  313. // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式
  314. // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效
  315. // 读取报表模板
  316. if not APrintCom.ReadReportStream(Mem) then Exit;
  317. // 将报表设置中的数据覆盖掉原模板的数据
  318. InitReportSettings(APrintCom, ATemplate);
  319. // 保存
  320. APrintCom.SaveToStream(Mem);
  321. // 再次读取,使报表设置中的设置生效
  322. APrintCom.ReadReportStream(Mem);
  323. // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
  324. // To Do
  325. APrintCom.FillZero := cbFillZero.Checked;
  326. InitPageSettings(APrintCom);
  327. APrintCom.ReadDBData;
  328. APrintCom.AnalyseData(PreviewBox.Canvas);
  329. finally
  330. if Mem <> nil then
  331. Mem.Free;
  332. RptArchiverObj.Free;
  333. end;
  334. end;
  335. procedure TSignOnlineReportsForm.InitFont(APrintCom: TPrintComXML);
  336. procedure AssignFontRec(AFontRec: TFontRec; AFont: TFont);
  337. begin
  338. AFontRec.FontName := AFont.Name;
  339. AFontRec.FontHeight := Round(AFont.Size*4/3) ;
  340. AFontRec.FontBold := 400 + Integer(fsBold in AFont.Style)*200;
  341. AFontRec.FontItalic := Integer(fsItalic in AFont.Style);
  342. AFontRec.FontUnderLine := Integer(fsUnderLine in AFont.Style);
  343. end;
  344. procedure InitTitleFont;
  345. var
  346. TitleRec : PTitleRec;
  347. begin
  348. TitleRec := PreviewComXML.getTitleByID(1);
  349. if TitleRec <> nil then
  350. begin
  351. AssignFontRec(TitleRec.FontRec, ReportConfig.TitleFont);
  352. APrintCom.setTitleObj(TitleRec);
  353. end;
  354. end;
  355. procedure InitColumnFont;
  356. procedure InitColumnThick(AColumnRec: PColumnRec);
  357. begin
  358. if (ReportConfig.ReportCellLine > 0.2) then
  359. begin
  360. if (AColumnRec.LineInfo.LeftThick > 0.2) then
  361. AColumnRec.LineInfo.LeftThick := ReportConfig.ReportCellLine;
  362. if (AColumnRec.LineInfo.RightThick > 0.2) then
  363. AColumnRec.LineInfo.RightThick := ReportConfig.ReportCellLine;
  364. if (AColumnRec.LineInfo.TopThick > 0.2) then
  365. AColumnRec.LineInfo.TopThick := ReportConfig.ReportCellLine;
  366. if (AColumnRec.LineInfo.BottomThick > 0.2) then
  367. AColumnRec.LineInfo.BottomThick := ReportConfig.ReportCellLine;
  368. end;
  369. end;
  370. var
  371. i, j: Integer;
  372. ObjList: TList;
  373. ColumnRec : PColumnRec;
  374. AAR : PActiveAreaRec;
  375. SER : PShowElementRec;
  376. begin
  377. ObjList := TList.Create;
  378. try
  379. APrintCom.getAllColumnHeadObjs(ObjList);
  380. for i := 0 to ObjList.Count - 1 do
  381. begin
  382. ColumnRec := ObjList[i];
  383. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  384. InitColumnThick(ColumnRec);
  385. APrintCom.setColumnHeadTailObj(0, ColumnRec);
  386. end;
  387. APrintCom.getAllColumnTailObjs(ObjList);
  388. for i := 0 to ObjList.Count - 1 do
  389. begin
  390. ColumnRec := ObjList[i];
  391. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  392. InitColumnThick(ColumnRec);
  393. APrintCom.setColumnHeadTailObj(1,ColumnRec);
  394. end;
  395. APrintCom.getAllActAreaObjs(ObjList);
  396. for i := 0 to ObjList.Count - 1 do
  397. begin
  398. AAR := ObjList[i];
  399. for j := 0 to AAR.ElementList.Count - 1 do
  400. begin
  401. SER := AAR.ElementList[j];
  402. if (SER.ElementType = 7) then
  403. begin
  404. ColumnRec := SER.Data;
  405. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  406. InitColumnThick(ColumnRec);
  407. APrintCom.setActShowElementObj(SER);
  408. end;
  409. end;
  410. end;
  411. finally
  412. ObjList.Free;
  413. end;
  414. end;
  415. procedure InitContentAndGatherFont;
  416. var
  417. i, j: Integer;
  418. ObjList: TList;
  419. FlowContentRec : PContentRec;
  420. CrossContentRec : PCrossContentRec;
  421. SumRec : PSumRec;
  422. begin
  423. ObjList := TList.Create;
  424. try
  425. // 设置表正文
  426. APrintCom.getAllFlowShowContentObjs(ObjList);
  427. for i := 0 to ObjList.Count - 1 do
  428. begin
  429. FlowContentRec := ObjList[i];
  430. if not (FlowContentRec.Fixed) then
  431. begin
  432. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  433. APrintCom.setFlowContentObj(FlowContentRec);
  434. end;
  435. end;
  436. APrintCom.getAllBillShowContentObjs(ObjList);
  437. for i := 0 to ObjList.Count - 1 do
  438. begin
  439. FlowContentRec := ObjList[i];
  440. if not(FlowContentRec.Fixed) then
  441. begin
  442. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  443. APrintCom.setBillContentObj(FlowContentRec);
  444. end;
  445. end;
  446. APrintCom.getAllCrossContentObjs(ObjList);
  447. for i := 0 to ObjList.Count - 1 do
  448. begin
  449. CrossContentRec := ObjList[i];
  450. if not(CrossContentRec.CrossContent.Fixed) then
  451. begin
  452. AssignFontRec(CrossContentRec.CrossContent.FontRec, ReportConfig.ContentFont);
  453. APrintCom.setCrossContentObj(CrossContentRec);
  454. end;
  455. end;
  456. // 设置表合计
  457. for i := 0 to 2 do
  458. begin
  459. APrintCom.getAllSumObjs(i,ObjList);
  460. for j := 0 to ObjList.Count - 1 do
  461. begin
  462. SumRec := ObjList[j];
  463. AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);
  464. APrintCom.setSumObj(SumRec);
  465. end;
  466. end;
  467. finally
  468. ObjList.Free;
  469. end;
  470. end;
  471. procedure InitGridHeaderFont;
  472. var
  473. i: Integer;
  474. ObjList: TList;
  475. HeadTailRec : PHeadRec;
  476. begin
  477. ObjList := TList.Create;
  478. try
  479. APrintCom.getAllHeadObjs(ObjList);
  480. for i := 0 to ObjList.Count - 1 do
  481. begin
  482. HeadTailRec := ObjList[i];
  483. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  484. APrintCom.setHeadTailObj(0, HeadTailRec);
  485. end;
  486. APrintCom.getAllTailObjs(ObjList);
  487. for i := 0 to ObjList.Count - 1 do
  488. begin
  489. HeadTailRec := ObjList[i];
  490. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  491. APrintCom.setHeadTailObj(1, HeadTailRec);
  492. end;
  493. finally
  494. ObjList.Free;
  495. end;
  496. end;
  497. begin
  498. InitTitleFont;
  499. InitColumnFont;
  500. InitContentAndGatherFont;
  501. InitGridHeaderFont;
  502. end;
  503. procedure TSignOnlineReportsForm.InitPageSettings(APrintCom: TPrintComXML);
  504. begin
  505. // 设置页面大小
  506. APrintCom.setPageSize(ReportConfig.PageSize);
  507. if ReportConfig.PageSize = 'A3' then
  508. APrintCom.PrintPageSizeIdx := DMPAPER_A3
  509. else if ReportConfig.PageSize = 'A4' then
  510. APrintCom.PrintPageSizeIdx := DMPAPER_A4;
  511. // 设置边距
  512. APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
  513. APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
  514. APrintCom.setEdge(2, '', ReportConfig.UpEdge/10);
  515. APrintCom.setEdge(3, '', ReportConfig.DownEdge/10);
  516. end;
  517. procedure TSignOnlineReportsForm.InitPaperSettings(
  518. ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  519. procedure InitRepBorderLine;
  520. var
  521. i: Integer;
  522. ObjList : TList;
  523. ShapeRec : PPicRec;
  524. begin
  525. ObjList := TList.Create;
  526. try
  527. APrintCom.getAllShapeObjs(1, ObjList);
  528. for i := 0 to ObjList.Count - 1 do
  529. begin
  530. ShapeRec := ObjList[i];
  531. // 设置报表边框线粗
  532. ShapeRec.PenWidth := ReportConfig.BorderLine;
  533. // 设置是否绘制报表边框横线
  534. if (ShapeRec.ExArea.ExLeft <> ShapeRec.ExArea.ExRight) then
  535. begin
  536. if not ReportConfig.RepBorderUnderLine then
  537. ShapeRec.PenStyle := integer(psClear)
  538. else
  539. ShapeRec.PenStyle := integer(psSolid);
  540. end;
  541. // 设置是否绘制报表边框竖线
  542. if (ShapeRec.ExArea.ExTop <> ShapeRec.ExArea.ExBottom) and
  543. ((ShapeRec.ExArea.ExLeft = 0) or (ShapeRec.ExArea.ExLeft = 100)) then
  544. begin //这里的判断条件是约定好的
  545. if not ReportConfig.RepBorderVerLine then
  546. ShapeRec.PenStyle := integer(psClear)
  547. else
  548. ShapeRec.PenStyle := integer(psSolid)
  549. end;
  550. APrintCom.setShapeObj(ShapeRec);
  551. end;
  552. finally
  553. ObjList.Free;
  554. end;
  555. end;
  556. procedure InitRepCellLine;
  557. var
  558. i: Integer;
  559. ObjList : TList;
  560. ColumnRec : PColumnRec;
  561. FlowContentRec : PContentRec;
  562. CrossContentRec : PCrossContentRec;
  563. begin
  564. ObjList := TList.Create;
  565. try
  566. APrintCom.getAllFlowShowContentObjs(ObjList);
  567. // 设置报表表格横线
  568. for i := 0 to ObjList.Count - 1 do
  569. begin
  570. FlowContentRec := ObjList[i];
  571. FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  572. FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  573. APrintCom.setFlowContentObj(FlowContentRec);
  574. end;
  575. APrintCom.getAllCrossContentObjs(ObjList);
  576. for i := 0 to ObjList.Count - 1 do
  577. begin
  578. CrossContentRec := ObjList[i];
  579. CrossContentRec.CrossContent.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  580. CrossContentRec.CrossContent.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  581. APrintCom.setCrossContentObj(CrossContentRec);
  582. end;
  583. // 设置报表表格竖线
  584. APrintCom.getAllFlowShowContentObjs(ObjList);
  585. for i := 0 to ObjList.Count - 1 do
  586. begin
  587. FlowContentRec := ObjList[i];
  588. FlowContentRec.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  589. FlowContentRec.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  590. // 如果设置无表格边框线,则两端的表格竖线线粗为0
  591. if (not ReportConfig.RepBorderVerLine) then
  592. if (i = 0) then
  593. FlowContentRec.LineInfo.LeftThick := 0
  594. else if (i = ObjList.Count - 1) then
  595. FlowContentRec.LineInfo.RightThick := 0;
  596. APrintCom.setFlowContentObj(FlowContentRec);
  597. end;
  598. APrintCom.getAllCrossContentObjs(ObjList);
  599. for i := 0 to ObjList.Count - 1 do
  600. begin
  601. CrossContentRec := ObjList[i];
  602. CrossContentRec.CrossContent.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  603. CrossContentRec.CrossContent.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  604. ColumnRec := CrossContentRec.CrossContent.Column;
  605. //这里还要判断如果没有边框竖线的情况下,表格竖线边缘的线粗也为0
  606. //前提是所属表栏最右位置位于边缘
  607. if (not ReportConfig.RepBorderVerLine) and (ColumnRec<>nil) and
  608. ((ColumnRec.ExArea.ExRight = 100.0) or (ColumnRec.ExArea.ExLeft = 0.0)) then
  609. begin
  610. case CrossContentRec.CrossType of
  611. 0 : //交叉行
  612. begin
  613. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  614. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  615. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  616. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  617. end;
  618. 1 : //交叉列
  619. begin
  620. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  621. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  622. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  623. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  624. //(*
  625. if (CrossContentRec.CrossContent.isSpecialBorder) then
  626. begin
  627. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  628. CrossContentRec.CrossContent.SpecialLineInfo.RightThick := 0;
  629. end;
  630. //*)
  631. end;
  632. 2 : //显示数据
  633. begin
  634. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  635. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  636. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  637. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  638. end;
  639. 3 : //固定LABEL
  640. begin
  641. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  642. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  643. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  644. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  645. end;
  646. 4 : //序号
  647. begin
  648. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  649. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  650. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  651. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  652. end;
  653. 5 : //横向统计
  654. begin
  655. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  656. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  657. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  658. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  659. end;
  660. end;
  661. end;
  662. APrintCom.setCrossContentObj(CrossContentRec);
  663. end;
  664. finally
  665. ObjList.Free;
  666. end;
  667. end;
  668. procedure InitOtherArea;
  669. procedure SetPTRBorder(PTR : PTextRec);
  670. procedure SetLeftRightBorder;
  671. begin
  672. if PTR.ExArea.ExLeft = 0.0 then
  673. begin
  674. if BorderWidth = 0.0 then
  675. PTR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth;
  676. end;
  677. if PTR.ExArea.ExRight = 100.0 then
  678. begin
  679. if BorderWidth = 0.0 then
  680. PTR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth
  681. end;
  682. end;
  683. procedure SetHorLine;
  684. begin
  685. if (PTR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  686. PTR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  687. if (PTR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  688. PTR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  689. end;
  690. begin
  691. SetLeftRightBorder;
  692. SetHorLine;
  693. end;
  694. procedure SetPCRBorder(PCR : PColumnRec);
  695. procedure SetLeftRightBorder;
  696. begin
  697. if PCR.ExArea.ExLeft = 0.0 then
  698. begin
  699. if BorderWidth = 0.0 then
  700. PCR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth
  701. end;
  702. if PCR.ExArea.ExRight = 100.0 then
  703. begin
  704. if BorderWidth = 0.0 then
  705. PCR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth;
  706. end;
  707. end;
  708. procedure SetVerLine;
  709. begin
  710. if PCR.ExArea.ExLeft = 0.0 then
  711. PCR.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  712. if PCR.ExArea.ExRight = 100.0 then
  713. PCR.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  714. end;
  715. procedure SetHorLine;
  716. begin
  717. if (PCR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  718. PCR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  719. if (PCR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  720. PCR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  721. end;
  722. begin
  723. SetLeftRightBorder;
  724. SetVerLine;
  725. SetHorLine;
  726. end;
  727. var i,k : integer;
  728. ObjList : TList;
  729. ActAreaRec : PActiveAreaRec;
  730. PSR : PShowElementRec;
  731. begin
  732. ObjList := TList.Create;
  733. try
  734. ActAreaRec := nil;
  735. PreviewComXML.getAllActAreaObjs(ObjList);
  736. for i := 0 to ObjList.Count - 1 do
  737. begin
  738. ActAreaRec := ObjList[i];
  739. if (ActAreaRec.ShowType < 0) or (ActAreaRec.ShowType > 2) then Continue;
  740. if not Assigned(ActAreaRec.ElementList) then Continue;
  741. for k := 0 to ActAreaRec.ElementList.Count - 1 do
  742. begin
  743. PSR := PShowElementRec(ActAreaRec.ElementList[k]);
  744. case PSR.ElementType of
  745. 0..2 : SetPTRBorder(PSR.Data); //文本,参数,字段,表栏
  746. 7 : SetPCRBorder(PSR.Data) //Column
  747. end;
  748. APrintCom.setActShowElementObj(PSR);
  749. end;
  750. end;
  751. finally
  752. ObjList.Free;
  753. end;
  754. end;
  755. begin
  756. if not Assigned(ATemplate) or (ATemplate.SelfFormat = 0) then
  757. begin
  758. InitFont(APrintCom); // 各类字体
  759. InitRepBorderLine; // 报表边框
  760. InitRepCellLine; // 报表表格
  761. InitOtherArea; // 活动区域
  762. end;
  763. end;
  764. procedure TSignOnlineReportsForm.SaveAuditOpinion(
  765. ATemplate: TTemplateNode);
  766. var
  767. SelectForm: TAuditSelctForm;
  768. begin
  769. SelectForm := TAuditSelctForm.Create(FProjectData, ATemplate);
  770. try
  771. if SelectForm.ShowModal = mrOk then
  772. SelectForm.SaveAuditData;
  773. finally
  774. SelectForm.Free;
  775. end;
  776. end;
  777. procedure TSignOnlineReportsForm.SaveReportInteractData(
  778. ATemplate: TTemplateNode);
  779. begin
  780. case ATemplate.InteractFlag of
  781. 1: SaveAuditOpinion(ATemplate);
  782. end;
  783. end;
  784. procedure TSignOnlineReportsForm.InitReportSettings(
  785. APrintCom: TPrintComXML; ATemplate: TTemplateNode);
  786. begin
  787. InitPageSettings(APrintCom);
  788. InitPaperSettings(ATemplate, APrintCom);
  789. APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
  790. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;
  791. if FProjectData.ProjProperties.ReportShowState then
  792. begin
  793. if FProjectData.ProjProperties.ReportShowStateWithoutReply and
  794. ((FProjectData.ProjProperties.AuditStatus = -1) or (FProjectData.PhaseIndex < FProjectData.ProjProperties.PhaseCount)) then
  795. APrintCom.ShowBackgroundMark := False
  796. else
  797. APrintCom.ShowBackgroundMark := True;
  798. end
  799. else
  800. APrintCom.ShowBackgroundMark := False;
  801. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShowStateText;
  802. end;
  803. procedure TSignOnlineReportsForm.PreviewComXMLContentDisplay(
  804. var contentFontRec: TFontRec; dataType: Integer; isReading: Boolean;
  805. DrawType: Integer; isPrinting: Boolean);
  806. begin
  807. if ReportConfig.ContentIsNarrow then
  808. begin
  809. if (isReading) then
  810. begin
  811. begin
  812. contentFontRec.FontName := 'Arial Narrow';
  813. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  814. end;
  815. end else
  816. begin
  817. if (DrawType = 3) or (DrawType = 5) then
  818. begin
  819. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  820. end else if (isPrinting) then
  821. begin
  822. if (dataType = DATA_TYPE_DOUBLE) or (dataType = DATA_TYPE_FLOAT) then
  823. begin
  824. contentFontRec.FontName := 'Arial Narrow';
  825. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 7 div 6;
  826. end else
  827. begin
  828. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  829. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  830. end;
  831. end else
  832. begin
  833. if (dataType = DATA_TYPE_DOUBLE) or (dataType = DATA_TYPE_FLOAT) then
  834. begin
  835. contentFontRec.FontName := 'Arial Narrow';
  836. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  837. end else
  838. begin
  839. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  840. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  841. end;
  842. end;
  843. end;
  844. end;
  845. end;
  846. procedure TSignOnlineReportsForm.PreviewComXMLCrossTabLabelShow(
  847. valIDX: Integer; var ExLeft, ExRight: Double; var isShow: Boolean;
  848. CrsTabShowType: Integer);
  849. var
  850. field : PFieldRec;
  851. begin
  852. if (CrsTabShowType = -1) then exit;
  853. field := PreviewComXML.getFieldByID(6);
  854. if (field <> nil) then
  855. begin
  856. if (field.DataLen > valIDX) and (valIDX >= 0) then
  857. begin
  858. if (field.Value[valIDX] = 1.5) then
  859. begin
  860. case CrsTabShowType of
  861. 1 : begin
  862. isShow := false;
  863. end;
  864. 2 : begin
  865. ExLeft := 0;
  866. ExRight := 100;
  867. end;
  868. 3 : begin
  869. //
  870. end
  871. else
  872. begin
  873. //
  874. end;
  875. end;
  876. end;
  877. end;
  878. end;
  879. end;
  880. procedure TSignOnlineReportsForm.PreviewComXMLGetDataConnection(
  881. var ADOCon: TADOConnection);
  882. begin
  883. ADOCon := FReportCon.Connection;
  884. end;
  885. procedure TSignOnlineReportsForm.PreviewComXMLGetDatasetEvent(
  886. DatasetInfo: PDatasetInfoRec; var ADataset: TDataSet);
  887. begin
  888. if DatasetInfo.ID = 0 then
  889. ADataSet := MemoryReportManager.GetSqlResultDataSet(ReportTemplateManager.Current.InteractInfo.Sql, FProjectData)
  890. else
  891. ADataset := MemoryReportManager.GetMemoryDataSet(DatasetInfo.ID, FProjectData);
  892. end;
  893. procedure TSignOnlineReportsForm.PreviewPage(AImage: TImage;
  894. APageIndex: Integer);
  895. begin
  896. if Assigned(AImage) then
  897. begin
  898. AImage.Height := PreviewComXML.ReportSize.Y;
  899. AImage.Picture.Bitmap.Height := PreviewComXML.ReportSize.Y;
  900. AImage.Width := PreviewComXML.ReportSize.X;
  901. AImage.Picture.Bitmap.Width := PreviewComXML.ReportSize.X;
  902. PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
  903. end;
  904. end;
  905. constructor TSignOnlineReportsForm.Create(AOwner: TComponent);
  906. procedure LoadCursor(AIndex: Integer; const AFileName: string);
  907. var
  908. rst: Integer;
  909. begin
  910. rst := LoadCursorFromFile(PChar(AFileName));
  911. if rst <> 0 then
  912. Screen.Cursors[AIndex] := rst;
  913. end;
  914. begin
  915. inherited;
  916. FPreviewList := TList.Create;
  917. LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
  918. LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
  919. FPostedSignReports := TSignReports.Create;
  920. end;
  921. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
  922. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  923. var Handled: Boolean);
  924. begin
  925. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  926. end;
  927. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelUp(
  928. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  929. var Handled: Boolean);
  930. begin
  931. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  932. end;
  933. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelDown(Sender: TObject;
  934. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  935. begin
  936. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  937. end;
  938. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelUp(Sender: TObject;
  939. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  940. begin
  941. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  942. end;
  943. procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
  944. var
  945. ATempFolder: String;
  946. i: Integer;
  947. begin
  948. ATempFolder := GenerateTempFolder(GetTempFilePath);
  949. for i := 1 to PreviewComXML.TotalPages do
  950. begin
  951. ExportReportPage(i, Format('%s\%d.jpg', [ATempFolder, i]));
  952. end;
  953. ZipFolder(ATempFolder, AFileName);
  954. end;
  955. procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
  956. begin
  957. if CurPage > 1 then
  958. CurPage := CurPage - 1
  959. else
  960. WarningMessage('已经是最前了');
  961. end;
  962. procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
  963. begin
  964. if CurPage < PreviewComXML.TotalPages then
  965. CurPage := CurPage + 1
  966. else
  967. WarningMessage('已经是最后了');
  968. end;
  969. procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
  970. begin
  971. FCurPage := Value;
  972. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  973. lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
  974. end;
  975. procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
  976. begin
  977. if FUploadType = utSign then
  978. GenerateSignReport
  979. else if FUploadType = utEpure then
  980. GenerateEpureReport;
  981. end;
  982. procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
  983. Shift: TShiftState; X, Y: Integer);
  984. begin
  985. if (X < offset) and (CurPage > 1) then
  986. begin
  987. TControl(Sender).Cursor := crPrevious;
  988. end
  989. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  990. begin
  991. TControl(Sender).Cursor := crNext;
  992. end
  993. else
  994. begin
  995. TControl(Sender).Cursor := crDefault;
  996. end;
  997. end;
  998. procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
  999. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1000. begin
  1001. if (X < offset) and (CurPage > 1) then
  1002. begin
  1003. CurPage := CurPage - 1;
  1004. end
  1005. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  1006. begin
  1007. CurPage := CurPage + 1;
  1008. end;
  1009. end;
  1010. procedure TSignOnlineReportsForm.ExportPdfReports(const AFileName: string);
  1011. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  1012. var
  1013. imgEn: TImageEnView;
  1014. begin
  1015. imgEn := TImageEnView.Create(nil);
  1016. try
  1017. imgEn.Visible := False;
  1018. imgEn.Parent := Self;
  1019. imgEn.IO.CreatePDFFile(APageFileName);
  1020. imgEn.Bitmap.Height := PreviewComXML.ReportSize.X;
  1021. imgEn.Bitmap.Width := PreviewComXML.ReportSize.Y;
  1022. PreviewComXML.PrintPreviewCanvas(APage, 0, imgEn.Bitmap.Canvas, False);
  1023. imgEn.IO.SaveToPDF;
  1024. finally
  1025. imgEn.Free;
  1026. end;
  1027. end;
  1028. var
  1029. ATempFolder: String;
  1030. i: Integer;
  1031. begin
  1032. ATempFolder := GenerateTempFolder(GetTempFilePath);
  1033. for i := 1 to PreviewComXML.TotalPages do
  1034. begin
  1035. ExportReportPage(i, Format('%s\%d.pdf', [ATempFolder, i]));
  1036. end;
  1037. ZipFolder(ATempFolder, AFileName);
  1038. end;
  1039. function TSignOnlineReportsForm.SafeReportName(var AName: string): Boolean;
  1040. var
  1041. sOrgName: string;
  1042. iCount: Integer;
  1043. bHasQuest: Boolean;
  1044. begin
  1045. Result := False;
  1046. sOrgName := AName;
  1047. iCount := 0;
  1048. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
  1049. while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
  1050. begin
  1051. Inc(iCount);
  1052. AName := Format('%s(%d)', [sOrgName, iCount]);
  1053. end;
  1054. Result := SameText(sOrgName, AName);
  1055. if not Result then
  1056. Result := QuestRenameSignReport(AName, FSignPhase);
  1057. end;
  1058. procedure TSignOnlineReportsForm.cbFillZeroClick(Sender: TObject);
  1059. begin
  1060. PreviewComXML.FillZero := cbFillZero.Checked;
  1061. if Assigned(FPreviewList) and (FPreviewList.Count > 0) then
  1062. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  1063. end;
  1064. procedure TSignOnlineReportsForm.InitForEpure;
  1065. begin
  1066. Caption := '插入计量草图';
  1067. FUploadType := utEpure;
  1068. lblEpureHint.Visible := True;
  1069. FLoadListUrl := 'sign/list';
  1070. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
  1071. end;
  1072. procedure TSignOnlineReportsForm.InitForSign;
  1073. begin
  1074. Caption := '在线签署';
  1075. FUploadType := utSign;
  1076. lblEpureHint.Visible := False;
  1077. FLoadListUrl := 'sign/list';
  1078. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + FLoadListUrl, FWebTenderID, FSignPhase);
  1079. end;
  1080. procedure TSignOnlineReportsForm.GenerateEpureReport;
  1081. function CreateOnlineEpureReport(const AReportName: string; var AResult: string): Boolean;
  1082. var
  1083. sgsParam: TStrings;
  1084. sMessage: string;
  1085. iResult: Integer;
  1086. begin
  1087. Result := False;
  1088. sgsParam := TStringList.Create;
  1089. try
  1090. sgsParam.Add(Format('project=%d', [FWebProjectID]));
  1091. sgsParam.Add(Format('tender=%d', [FWebTenderID]));
  1092. sgsParam.Add(Format('phaseno=%d', [FSignPhase]));
  1093. sgsParam.Add(Format('name=%s', [AReportName]));
  1094. sgsParam.Add(Format('ownuid=%d', [PHPWeb.UserID]));
  1095. sgsParam.Add(Format('widhei=%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]));
  1096. sgsParam.Add(Format('totalnum=%d', [PreviewComXML.TotalPages]));
  1097. iResult := PHPWeb.UrlGet(PHPWeb.MeasureURL + 'intermediate/create', sgsParam, AResult);
  1098. case iResult of
  1099. 0: WarningMessage('网络错误:' + AResult);
  1100. -1: WarningMessage('网络错误:无法连接到云端');
  1101. end;
  1102. Result := (iResult = 1) and (AResult <> '');
  1103. finally
  1104. sgsParam.Free;
  1105. end;
  1106. end;
  1107. function UploadEpureReport(const ASignid, AMd5_sign: string): Boolean;
  1108. var
  1109. ATempFolder, sFileName, sMessage: String;
  1110. vInFields, vInValues: array [0..1] of string;
  1111. vUpFileFields, vUpFileNames: array [0..0] of string;
  1112. i: Integer;
  1113. begin
  1114. Result := False;
  1115. ATempFolder := GenerateTempFolder(GetTempFilePath);
  1116. vInFields[0] := 'signid';
  1117. vInValues[0] := ASignid;
  1118. vInFields[1] := 'md5_sign';
  1119. vInValues[1] := AMd5_sign;
  1120. ShowProgressHint('正在上传数据...', PreviewComXML.TotalPages);
  1121. try
  1122. for i := 1 to PreviewComXML.TotalPages do
  1123. begin
  1124. sFileName := Format('%s\%d.jpg', [ATempFolder, i]);
  1125. ExportReportPage(i, sFileName);
  1126. vUpFileFields[0] := 'imediate';
  1127. vUpFileNames[0] := sFileName;
  1128. if not PHPWeb.UploadFiles('intermediate/upload', vInFields, vInValues, vUpFileFields, vUpFileNames, sMessage) then
  1129. begin
  1130. WarningMessage(sMessage);
  1131. Abort;
  1132. end;
  1133. UpdateProgressPosition(i);
  1134. end;
  1135. Result := True;
  1136. finally
  1137. CloseProgressHint;
  1138. DeleteFileOrFolder(ATempFolder);
  1139. end;
  1140. end;
  1141. var
  1142. sReportName, sResult: string;
  1143. vJ: ISuperObject;
  1144. begin
  1145. sReportName := ReportTemplateManager.Current.TemplateName;
  1146. if SafeReportName(sReportName) then
  1147. begin
  1148. if CreateOnlineEpureReport(sReportName, sResult) then
  1149. begin
  1150. try
  1151. vJ := SO(sResult);
  1152. if UploadEpureReport(vJ['signid'].AsString, vJ['md5_sign'].AsString) then
  1153. TipMessage('上传完成。');
  1154. finally
  1155. FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, PHPWeb.UserID);
  1156. lblAlreadyUpload.Visible := True;
  1157. vJ := nil;
  1158. end;
  1159. end;
  1160. end;
  1161. end;
  1162. procedure TSignOnlineReportsForm.GenerateSignReport;
  1163. var
  1164. sReportName, sZipFile, sPdfFile, sErrorMessage: string;
  1165. vInFields, vInValues: array [0..5] of string;
  1166. vUpFileFields, vUpFileNames: array [0..1] of string;
  1167. begin
  1168. if not _IsDebugView and (PreviewComXML.TotalPages > 200) then
  1169. begin
  1170. TipMessage('该报表不支持在线签署功能。');
  1171. Exit;
  1172. end;
  1173. sReportName := ReportTemplateManager.Current.TemplateName;
  1174. if SafeReportName(sReportName) then
  1175. begin
  1176. CreateProgress('上传中,请等待...');
  1177. vInFields[0] := 'project';
  1178. vInValues[0] := IntToStr(FWebProjectID);
  1179. vInFields[1] := 'tender';
  1180. vInValues[1] := IntToStr(FWebTenderID);
  1181. vInFields[2] := 'phaseno';
  1182. vInValues[2] := IntToStr(FSignPhase);
  1183. vInFields[3] := 'name';
  1184. vInValues[3] := sReportName;
  1185. vInFields[4] := 'ownuid';
  1186. vInValues[4] := IntToStr(PHPWeb.UserID);
  1187. vInFields[5] := 'widhei';
  1188. vInValues[5] := Format('%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]);
  1189. vUpFileFields[0] := 'upfile';
  1190. vUpFileNames[0] := GetTempFileName(FTempPath, '.zip');
  1191. ExportReports(vUpFileNames[0]);
  1192. vUpFileFields[1] := 'upspdf';
  1193. vUpFileNames[1] := GetTempFileName(FTempPath, '.pdf');
  1194. PdfHelper.ExportAllPages(PreviewComXML, vUpFileNames[1]);
  1195. if PHPWeb.UploadFiles('sign/create', vInFields, vInValues, vUpFileFields, vUpFileNames, sErrorMessage) then
  1196. begin
  1197. FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, PHPWeb.UserID);
  1198. lblAlreadyUpload.Visible := True;
  1199. CloseProgress;
  1200. TipMessage('上传完成。');
  1201. end
  1202. else
  1203. begin
  1204. CloseProgress;
  1205. WarningMessage(Format('%s, 上传数据失败,请重试。', [sErrorMessage]));
  1206. end;
  1207. end;
  1208. end;
  1209. procedure TSignOnlineReportsForm.ExportReportPage(APage: Integer;
  1210. const APageFileName: string);
  1211. var
  1212. bmp, bmpCut: TBitmap;
  1213. img: TJPEGImage;
  1214. iCutHeight, iCutWidth, iCutTop, iCutLeft, iCutRight, iCutBottom: Integer;
  1215. begin
  1216. bmp := TBitmap.Create;
  1217. bmpCut := TBitmap.Create;
  1218. img := TJPEGImage.Create;
  1219. try
  1220. bmp.Height := PreviewComXML.ReportSize.Y;
  1221. bmp.Width := PreviewComXML.ReportSize.X;
  1222. PreviewComXML.PrintPreviewCanvas(APage, 0, bmp.Canvas, False);
  1223. iCutHeight := Round(PreviewComXML.ReportSize.Y / 200);
  1224. iCutWidth := Round(PreviewComXML.ReportSize.X / 200);
  1225. bmpCut.Height := PreviewComXML.ReportSize.Y - iCutHeight * 2;
  1226. bmpCut.Width := PreviewComXML.ReportSize.X - iCutWidth * 2;
  1227. bmpCut.Canvas.CopyRect(Rect(0, 0, bmpCut.Width, bmpCut.Height), bmp.Canvas, Rect(iCutWidth, iCutHeight, bmp.Width - iCutWidth, bmp.Height - iCutHeight));
  1228. img.Assign(bmpCut);
  1229. img.CompressionQuality := 100;
  1230. img.Compress;
  1231. img.SaveToFile(APageFileName);
  1232. finally
  1233. bmpCut.Free;
  1234. bmp.Free;
  1235. img.Free;
  1236. end;
  1237. end;
  1238. end.