OrderCheckerFme.pas 9.0 KB

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