OrderCheckerFme.pas 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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. lblOrderCheckerTime: TLabel;
  39. procedure shpAddMouseDown(Sender: TObject; Button: TMouseButton;
  40. Shift: TShiftState; X, Y: Integer);
  41. procedure btnDeleteClick(Sender: TObject);
  42. private
  43. FUserID: Integer;
  44. FOrder: Integer;
  45. FUserName: string;
  46. FOwner: TObject;
  47. FCheckerFrameType: TCheckerFrameType;
  48. FCheckStatus: TCheckStatus;
  49. FUserRole: string;
  50. FCheckerMemo: string;
  51. FCheckeOnLine: Integer;
  52. FCheckeTime: string;
  53. procedure SetOrder(const Value: Integer);
  54. procedure SetCheckStatus(const Value: TCheckStatus);
  55. procedure SetCheckerMemo(const Value: string);
  56. { Private declarations }
  57. public
  58. { Public declarations }
  59. procedure Init(AType: TCheckerFrameType; AID: Integer; AName, ARole,
  60. ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus;
  61. ACheckeTime: string; ACheckeOnLine: Integer);
  62. function IsMe(AID: Integer; AName: string): string;
  63. function IsChecking: Boolean;
  64. function IsFinished: Boolean;
  65. property Owner: TObject read FOwner write FOwner;
  66. property UserID: Integer read FUserID write FUserID;
  67. property UserName: string read FUserName write FUserName;
  68. property UserRole: string read FUserRole write FUserRole;
  69. property Order: Integer read FOrder write SetOrder;
  70. property CheckerFrameType: TCheckerFrameType read FCheckerFrameType write FCheckerFrameType; // 审核人类型
  71. property CheckStatus: TCheckStatus read FCheckStatus write SetCheckStatus; // 审核状态
  72. property CheckerMemo: string read FCheckerMemo write SetCheckerMemo; // 审核意见
  73. property CheckeTime: string read FCheckeTime write FCheckeTime;
  74. property CheckeOnLine: Integer read FCheckeOnLine write FCheckeOnLine; // 0 线下审批(默认);1 线上审批。
  75. end;
  76. implementation
  77. uses FindUserFrm, CheckerFme, PHPWebDm, ProjectData, ProjectFme,
  78. UtilMethods;
  79. {$R *.dfm}
  80. { TOrderCheckerFrame }
  81. procedure TOrderCheckerFrame.Init(AType: TCheckerFrameType; AID: Integer;
  82. AName, ARole, ACompany, AImagePath, ACheckerMemo: string;
  83. ACheckStatus: TCheckStatus; ACheckeTime: string; ACheckeOnLine: Integer);
  84. var bAdd, bOwner: Boolean;
  85. sOnLine: string;
  86. begin
  87. bAdd := AType = cftAdd;
  88. shpAdd.Visible := bAdd;
  89. lblAdd.Visible := bAdd;
  90. lblAddHint.Visible := bAdd;
  91. lblOrderCheckerName.Visible := not bAdd;
  92. lblOrderCheckerRole.Visible := not bAdd;
  93. lblOrderCheckerCompany.Visible := not bAdd;
  94. lblOrderStatus.Visible := not bAdd;
  95. shpImage.Visible := not bAdd;
  96. lblOrderCheckerMemo.Visible := not bAdd;
  97. bOwner := AType = cftOwner;
  98. lblLast.Visible := bOwner;
  99. lblOrderCheckerNum.Visible := not bOwner;
  100. CheckerFrameType := AType;
  101. CheckStatus := ACheckStatus;
  102. if lblOrderStatus.Visible then
  103. lblOrderStatus.Left := btnDelete.Left + btnDelete.Width - lblOrderStatus.Width;
  104. lblOrderCheckerTime.Visible := (not bAdd) and (CheckStatus in [csFinished, csNotPass]);
  105. case AType of
  106. cftChecker, cftOwner:
  107. begin
  108. UserID := AID;
  109. UserName := IsMe(AID, AName);
  110. UserRole := ARole;
  111. lblOrderCheckerName.Caption := UserName;
  112. lblOrderCheckerRole.Caption := ARole;
  113. lblOrderCheckerCompany.Caption := ACompany;
  114. if CheckStatus in [csFinished, csNotPass] then
  115. begin
  116. CheckeTime := ACheckeTime;
  117. CheckeOnLine := ACheckeOnLine;
  118. if ACheckeOnLine = 0 then
  119. sOnLine := '线下审核'
  120. else if ACheckeOnLine = 1 then
  121. sOnLine := '线上审核';
  122. lblOrderCheckerTime.Caption := Format('[%s][%s]', [ACheckeTime, sOnLine]);
  123. lblOrderCheckerTime.Left := btnDelete.Left + btnDelete.Width - lblOrderCheckerTime.Width;
  124. end;
  125. CheckerMemo := RecoverCharsFromJson(ACheckerMemo);
  126. if FileExists(AImagePath) then
  127. imgOrderCheckerPic.Picture.LoadFromFile(AImagePath)
  128. else
  129. imgOrderCheckerPic.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'DefaultImage.jpg');
  130. end;
  131. cftAdd:
  132. begin
  133. UserID := -1;
  134. UserName := '';
  135. UserRole := '';
  136. end;
  137. end;
  138. end;
  139. function TOrderCheckerFrame.IsChecking: Boolean;
  140. begin
  141. Result := CheckStatus = csChecking;
  142. end;
  143. function TOrderCheckerFrame.IsFinished: Boolean;
  144. begin
  145. Result := CheckStatus = csFinished;
  146. end;
  147. function TOrderCheckerFrame.IsMe(AID: Integer; AName: string): string;
  148. begin
  149. if AID = PHPWeb.UserID then
  150. Result := AName + '(我)'
  151. else
  152. Result := AName;
  153. end;
  154. // 审核状态:状态名称、颜色(状态名称、终审、编号)、图像边框
  155. procedure TOrderCheckerFrame.SetCheckStatus(const Value: TCheckStatus);
  156. var vColor: TColor;
  157. begin
  158. FCheckStatus := Value;
  159. lblOrderStatus.Caption := CheckStatusNames[Value];
  160. vColor := CheckStatusColors[Value];
  161. lblOrderCheckerNum.Font.Color := vColor;
  162. lblOrderStatus.Font.Color := vColor;
  163. lblLast.Font.Color := vColor;
  164. lblOrderCheckerMemo.Font.Color := vColor;
  165. lblOrderCheckerTime.Font.Color := vColor;
  166. // cxHintStyleController1.HintStyle.Color := clWindow; 气泡Hint,很帅,但是有Bug,频繁操作时会出错,废弃不用,可惜!
  167. // cxHintStyleController1.HintStyle.Font.Color := vColor;
  168. imgNotBegin.Visible := False;
  169. imgChecking.Visible := False;
  170. imgFinish.Visible := False;
  171. imgNotPass.Visible := False;
  172. if FCheckerFrameType <> cftAdd then
  173. begin
  174. case Value of
  175. csNotBegin:
  176. imgNotBegin.Visible := True;
  177. csChecking:
  178. imgChecking.Visible := True;
  179. csFinished:
  180. imgFinish.Visible := True;
  181. csNotPass:
  182. imgNotPass.Visible := True;
  183. end;
  184. end;
  185. end;
  186. procedure TOrderCheckerFrame.SetOrder(const Value: Integer);
  187. begin
  188. FOrder := Value;
  189. lblOrderCheckerNum.Caption := IntToStr(FOrder);
  190. lblOrderCheckerNum.Update;
  191. end;
  192. procedure TOrderCheckerFrame.shpAddMouseDown(Sender: TObject;
  193. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  194. var
  195. FindUserForm: TFindUserForm;
  196. begin
  197. if Button = mbLeft then
  198. begin
  199. FindUserForm := TFindUserForm.Create(nil);
  200. FindUserForm.ProjectData := TCheckerFrame(Owner).ProjectData;
  201. FindUserForm.Owner := Self;
  202. try
  203. FindUserForm.ShowModal;
  204. finally
  205. FindUserForm.Free;
  206. end;
  207. end;
  208. end;
  209. procedure TOrderCheckerFrame.btnDeleteClick(Sender: TObject);
  210. var sURL: string;
  211. vProj: TProjectData;
  212. vArr: array of string;
  213. begin
  214. if Application.MessageBox('确定要删除该审核人吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  215. Exit;
  216. vProj := TProjectData(TCheckerFrame(Owner).ProjectData);
  217. sURL := Format('%suser/del/%d/%d/%d/audit', [PHPWeb.MeasureURL, Self.UserID,
  218. vProj.WebID, vProj.PhaseIndex]);
  219. vArr := VarArrayOf(['msg']);
  220. case PHPWeb.Search(sURL, [], [], vArr) of
  221. 1:
  222. begin
  223. // 这里直接调用Init方法会出问题,因为事件还没影响完就被释放了,运行出错。
  224. // 问题的根源在于触发事件的位置来自控件的内部(即使这里调用外部的方法来
  225. // 搞定它也不行),CS常规的设计方法是外部来控制它,而不是由自身来控制。
  226. // 这算是BS设计跟CS设计差异的一个体现吧。
  227. TCheckerFrame(Owner).tRefreshCheckers.Enabled := True;
  228. end;
  229. 0:
  230. begin
  231. Application.MessageBox(PChar(PHPWeb.PageError('无法删除审核人' + '[' + vArr[0] + ']')),
  232. '警告', MB_OK + MB_ICONWARNING);
  233. Exit;
  234. end;
  235. -1:
  236. begin
  237. Application.MessageBox(PChar(PHPWeb.NetError('无法删除审核人')),
  238. '警告', MB_OK + MB_ICONWARNING);
  239. end;
  240. end;
  241. end;
  242. procedure TOrderCheckerFrame.SetCheckerMemo(const Value: string);
  243. begin
  244. FCheckerMemo := Value;
  245. lblOrderCheckerMemo.Caption := ShortText(FCheckerMemo, 250);
  246. lblOrderCheckerMemo.Hint := CustomWidthText(FCheckerMemo, 300);
  247. lblOrderCheckerMemo.Update;
  248. end;
  249. end.