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