OrderCheckerFme.pas 9.1 KB

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