OrderCheckerFme.pas 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. {*******************************************************************************
  2. 单元名称: OrderCheckerFme.pas
  3. 单元说明: 动态添加审核人。
  4. 作者时间: Chenshilong, 2014-07-11
  5. *******************************************************************************}
  6. unit OrderCheckerFme;
  7. interface
  8. uses
  9. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  10. Dialogs, ExtCtrls, StdCtrls, pngimage, CslButton, cxHint;
  11. type
  12. TCheckerFrameType = (cftChecker, cftOwner, cftAdd);
  13. TCheckStatus = (csNotBegin, csChecking, csFinished, csNotPass); // 末审核,审核中,审核完成,审核不通过
  14. const
  15. CheckStatusNames: array[TCheckStatus] of string = ('未审核', '审核中', '审核通过', '审核不通过');
  16. CheckStatusColors: array[TCheckStatus] of TColor = ($00B7B7B7, $000099FF, $000E9D00, clRed);
  17. type
  18. TOrderCheckerFrame = class(TFrame)
  19. pnlChecker: TPanel;
  20. shpImage: TShape;
  21. imgOrderCheckerPic: TImage;
  22. lblOrderCheckerName: TLabel;
  23. lblOrderCheckerRole: TLabel;
  24. lblOrderCheckerCompany: TLabel;
  25. shpBotom: TShape;
  26. lblOrderCheckerNum: TLabel;
  27. lblOrderStatus: TLabel;
  28. lblLast: TLabel;
  29. lblAdd: TLabel;
  30. lblAddHint: TLabel;
  31. shpAdd: TShape;
  32. imgChecking: TImage;
  33. imgNotBegin: TImage;
  34. imgFinish: TImage;
  35. imgNotPass: TImage;
  36. btnDelete: TCslButton;
  37. lblOrderCheckerMemo: TLabel;
  38. procedure shpAddMouseDown(Sender: TObject; Button: TMouseButton;
  39. Shift: TShiftState; X, Y: Integer);
  40. procedure btnDeleteClick(Sender: TObject);
  41. private
  42. FUserID: Integer;
  43. FOrder: Integer;
  44. FUserName: string;
  45. FOwner: TObject;
  46. FCheckerFrameType: TCheckerFrameType;
  47. FCheckStatus: TCheckStatus;
  48. FUserRole: string;
  49. FCheckerMemo: string;
  50. procedure SetOrder(const Value: Integer);
  51. procedure SetCheckStatus(const Value: TCheckStatus);
  52. procedure SetCheckerMemo(const Value: string);
  53. { Private declarations }
  54. public
  55. { Public declarations }
  56. procedure Init(AType: TCheckerFrameType; AID: Integer; AName, ARole,
  57. ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
  58. function IsMe(AID: Integer; AName: string): string;
  59. function IsChecking: Boolean;
  60. function IsFinished: Boolean;
  61. property Owner: TObject read FOwner write FOwner;
  62. property UserID: Integer read FUserID write FUserID;
  63. property UserName: string read FUserName write FUserName;
  64. property UserRole: string read FUserRole write FUserRole;
  65. property Order: Integer read FOrder write SetOrder;
  66. property CheckerFrameType: TCheckerFrameType read FCheckerFrameType write FCheckerFrameType; // 审核人类型
  67. property CheckStatus: TCheckStatus read FCheckStatus write SetCheckStatus; // 审核状态
  68. property CheckerMemo: string read FCheckerMemo write SetCheckerMemo; // 审核意见
  69. end;
  70. implementation
  71. uses FindUserFrm, CheckerFme, PHPWebDm, ProjectData, ProjectFme,
  72. UtilMethods;
  73. {$R *.dfm}
  74. { TOrderCheckerFrame }
  75. procedure TOrderCheckerFrame.Init(AType: TCheckerFrameType; AID: Integer;
  76. AName, ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
  77. var bAdd, bOwner: Boolean;
  78. begin
  79. bAdd := AType = cftAdd;
  80. shpAdd.Visible := bAdd;
  81. lblAdd.Visible := bAdd;
  82. lblAddHint.Visible := bAdd;
  83. lblOrderCheckerName.Visible := not bAdd;
  84. lblOrderCheckerRole.Visible := not bAdd;
  85. lblOrderCheckerCompany.Visible := not bAdd;
  86. lblOrderStatus.Visible := not bAdd;
  87. shpImage.Visible := not bAdd;
  88. lblOrderCheckerMemo.Visible := not bAdd;
  89. bOwner := AType = cftOwner;
  90. lblLast.Visible := bOwner;
  91. lblOrderCheckerNum.Visible := not bOwner;
  92. CheckerFrameType := AType;
  93. CheckStatus := ACheckStatus;
  94. case AType of
  95. cftChecker, cftOwner:
  96. begin
  97. UserID := AID;
  98. UserName := IsMe(AID, AName);
  99. UserRole := ARole;
  100. lblOrderCheckerName.Caption := UserName;
  101. lblOrderCheckerRole.Caption := ARole;
  102. lblOrderCheckerCompany.Caption := ACompany;
  103. CheckerMemo := RecoverCharsFromJson(ACheckerMemo);
  104. if FileExists(AImagePath) then
  105. imgOrderCheckerPic.Picture.LoadFromFile(AImagePath)
  106. else
  107. imgOrderCheckerPic.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'DefaultImage.jpg');
  108. end;
  109. cftAdd:
  110. begin
  111. UserID := -1;
  112. UserName := '';
  113. UserRole := '';
  114. end;
  115. end;
  116. end;
  117. function TOrderCheckerFrame.IsChecking: Boolean;
  118. begin
  119. Result := CheckStatus = csChecking;
  120. end;
  121. function TOrderCheckerFrame.IsFinished: Boolean;
  122. begin
  123. Result := CheckStatus = csFinished;
  124. end;
  125. function TOrderCheckerFrame.IsMe(AID: Integer; AName: string): string;
  126. begin
  127. if AID = PHPWeb.UserID then
  128. Result := AName + '(我)'
  129. else
  130. Result := AName;
  131. end;
  132. // 审核状态:状态名称、颜色(状态名称、终审、编号)、图像边框
  133. procedure TOrderCheckerFrame.SetCheckStatus(const Value: TCheckStatus);
  134. var vColor: TColor;
  135. begin
  136. FCheckStatus := Value;
  137. lblOrderStatus.Caption := CheckStatusNames[Value];
  138. vColor := CheckStatusColors[Value];
  139. lblOrderCheckerNum.Font.Color := vColor;
  140. lblOrderStatus.Font.Color := vColor;
  141. lblLast.Font.Color := vColor;
  142. lblOrderCheckerMemo.Font.Color := vColor;
  143. // cxHintStyleController1.HintStyle.Color := clWindow; 气泡Hint,很帅,但是有Bug,频繁操作时会出错,废弃不用,可惜!
  144. // cxHintStyleController1.HintStyle.Font.Color := vColor;
  145. imgNotBegin.Visible := False;
  146. imgChecking.Visible := False;
  147. imgFinish.Visible := False;
  148. imgNotPass.Visible := False;
  149. if FCheckerFrameType <> cftAdd then
  150. begin
  151. case Value of
  152. csNotBegin:
  153. imgNotBegin.Visible := True;
  154. csChecking:
  155. imgChecking.Visible := True;
  156. csFinished:
  157. imgFinish.Visible := True;
  158. csNotPass:
  159. imgNotPass.Visible := True;
  160. end;
  161. end;
  162. end;
  163. procedure TOrderCheckerFrame.SetOrder(const Value: Integer);
  164. begin
  165. FOrder := Value;
  166. lblOrderCheckerNum.Caption := IntToStr(FOrder);
  167. lblOrderCheckerNum.Update;
  168. end;
  169. procedure TOrderCheckerFrame.shpAddMouseDown(Sender: TObject;
  170. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  171. var
  172. FindUserForm: TFindUserForm;
  173. begin
  174. if Button = mbLeft then
  175. begin
  176. FindUserForm := TFindUserForm.Create(nil);
  177. FindUserForm.ProjectData := TCheckerFrame(Owner).ProjectData;
  178. FindUserForm.Owner := Self;
  179. try
  180. FindUserForm.ShowModal;
  181. finally
  182. FindUserForm.Free;
  183. end;
  184. end;
  185. end;
  186. procedure TOrderCheckerFrame.btnDeleteClick(Sender: TObject);
  187. var sURL: string;
  188. vProj: TProjectData;
  189. vArr: array of string;
  190. begin
  191. if Application.MessageBox('确定要删除该审核人吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  192. Exit;
  193. vProj := TProjectData(TCheckerFrame(Owner).ProjectData);
  194. sURL := Format('%suser/del/%d/%d/%d/audit', [PHPWeb.MeasureURL, Self.UserID,
  195. vProj.WebID, vProj.PhaseIndex]);
  196. vArr := VarArrayOf(['msg']);
  197. case PHPWeb.Search(sURL, [], [], vArr) of
  198. 1:
  199. begin
  200. // 这里直接调用Init方法会出问题,因为事件还没影响完就被释放了,运行出错。
  201. // 问题的根源在于触发事件的位置来自控件的内部(即使这里调用外部的方法来
  202. // 搞定它也不行),CS常规的设计方法是外部来控制它,而不是由自身来控制。
  203. // 这算是BS设计跟CS设计差异的一个体现吧。
  204. TCheckerFrame(Owner).tRefreshCheckers.Enabled := True;
  205. end;
  206. 0:
  207. begin
  208. Application.MessageBox(PChar(PHPWeb.PageError('无法删除审核人' + '[' + vArr[0] + ']')),
  209. '警告', MB_OK + MB_ICONWARNING);
  210. Exit;
  211. end;
  212. -1:
  213. begin
  214. Application.MessageBox(PChar(PHPWeb.NetError('无法删除审核人')),
  215. '警告', MB_OK + MB_ICONWARNING);
  216. end;
  217. end;
  218. end;
  219. procedure TOrderCheckerFrame.SetCheckerMemo(const Value: string);
  220. begin
  221. FCheckerMemo := Value;
  222. lblOrderCheckerMemo.Caption := ShortText(FCheckerMemo, 250);
  223. lblOrderCheckerMemo.Hint := CustomWidthText(FCheckerMemo, 300);
  224. lblOrderCheckerMemo.Update;
  225. end;
  226. end.