OrderCheckerFme.pas 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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;
  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. imgStatus: TImage;
  33. btnDelete: TCslButton;
  34. lblOrderCheckerMemo: TLabel;
  35. lblOrderCheckerTime: TLabel;
  36. procedure shpAddMouseDown(Sender: TObject; Button: TMouseButton;
  37. Shift: TShiftState; X, Y: Integer);
  38. procedure btnDeleteClick(Sender: TObject);
  39. private
  40. FUserID: Integer;
  41. FOrder: Integer;
  42. FUserName: string;
  43. FCheckerFrameType: TCheckerFrameType;
  44. FCheckStatus: TCheckStatus;
  45. FUserRole: string;
  46. FCheckerMemo: string;
  47. FCheckedTime: string;
  48. FCheckedOnline: Integer;
  49. procedure SetOrder(const Value: Integer);
  50. procedure SetCheckStatus(const Value: TCheckStatus);
  51. procedure SetCheckerMemo(const Value: string);
  52. procedure SetCheckedTime(const Value: string);
  53. procedure RightAlign(ALabel: TLabel);
  54. procedure SetCanDelete(const Value: Boolean);
  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. ACheckedTime: string; ACheckedOnLine: Integer);
  61. function IsMe(AID: Integer; AName: string): string;
  62. function IsChecking: Boolean;
  63. function IsFinished: Boolean;
  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. property CheckedTime: string read FCheckedTime write SetCheckedTime;
  72. property CheckedOnLine: Integer read FCheckedOnLine write FCheckedOnLine; // 0 线下审批(默认);1 线上审批。
  73. property CanDelete: Boolean write SetCanDelete;
  74. end;
  75. implementation
  76. uses FindUserFrm, CheckerFme, PHPWebDm, ProjectData, ProjectFme,
  77. UtilMethods, Globals;
  78. {$R *.dfm}
  79. { TOrderCheckerFrame }
  80. procedure TOrderCheckerFrame.Init(AType: TCheckerFrameType; AID: Integer;
  81. AName, ARole, ACompany, AImagePath, ACheckerMemo: string;
  82. ACheckStatus: TCheckStatus; ACheckedTime: string; ACheckedOnLine: Integer);
  83. var bAdd, bOwner: Boolean;
  84. sOnLine: string;
  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. lblOrderStatus.Visible := not bAdd;
  94. shpImage.Visible := not bAdd;
  95. lblOrderCheckerMemo.Visible := not bAdd;
  96. bOwner := AType = cftOwner;
  97. lblLast.Visible := bOwner;
  98. lblOrderCheckerNum.Visible := not bOwner;
  99. CheckerFrameType := AType;
  100. CheckStatus := ACheckStatus;
  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. case AType of
  108. cftChecker, cftOwner:
  109. begin
  110. UserID := AID;
  111. UserName := IsMe(AID, AName);
  112. UserRole := ARole;
  113. lblOrderCheckerName.Caption := UserName;
  114. lblOrderCheckerRole.Caption := ARole;
  115. lblOrderCheckerCompany.Caption := ACompany;
  116. if CheckStatus in [csFinished, csNotPass] then
  117. begin
  118. CheckedOnLine := ACheckedOnLine;
  119. if ACheckedOnLine = 0 then
  120. sOnLine := '线下审批'
  121. else if ACheckedOnLine = 1 then
  122. sOnLine := '线上审批';
  123. CheckedTime := Format('[%s][%s]', [ACheckedTime, sOnLine]);
  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. RightAlign(lblOrderStatus);
  161. vColor := CheckStatusColors[Value];
  162. lblOrderCheckerNum.Font.Color := vColor;
  163. lblOrderStatus.Font.Color := vColor;
  164. lblLast.Font.Color := vColor;
  165. lblOrderCheckerMemo.Font.Color := vColor;
  166. lblOrderCheckerTime.Font.Color := vColor;
  167. imgStatus.Visible := True;
  168. if FCheckerFrameType <> cftAdd then
  169. begin
  170. case Value of
  171. csNotBegin:
  172. imgStatus.Picture.LoadFromFile(GetAppFilePath + 'Data/img/avtra_border_gray.png');
  173. csChecking:
  174. imgStatus.Picture.loadFromFile(GetAppFilePath + 'Data/img/avtra_border_wait.png');
  175. csFinished:
  176. imgStatus.Picture.LoadFromFile(GetAppFilePath + 'Data/img/pass.png');
  177. csNotPass:
  178. imgStatus.Picture.loadFromFile(GetAppFilePath + 'Data/img/unpass.png');
  179. end;
  180. end;
  181. end;
  182. procedure TOrderCheckerFrame.SetOrder(const Value: Integer);
  183. begin
  184. FOrder := Value;
  185. lblOrderCheckerNum.Caption := IntToStr(FOrder);
  186. lblOrderCheckerNum.Update;
  187. end;
  188. procedure TOrderCheckerFrame.shpAddMouseDown(Sender: TObject;
  189. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  190. var
  191. FindUserForm: TFindUserForm;
  192. vPD: TProjectData;
  193. begin
  194. if (Button = mbLeft) and Assigned(Owner) then
  195. begin
  196. vPD := TProjectData(TCheckerFrame(Owner).ProjectData);
  197. FindUserForm := TFindUserForm.Create(Self, 0, [vPD.WebID, vPD.PhaseIndex]);
  198. try
  199. FindUserForm.ShowModal;
  200. finally
  201. FindUserForm.Free;
  202. end;
  203. end;
  204. end;
  205. procedure TOrderCheckerFrame.btnDeleteClick(Sender: TObject);
  206. var sURL: string;
  207. vProj: TProjectData;
  208. vArr: array of string;
  209. begin
  210. if Application.MessageBox('确定要删除该审批人吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  211. Exit;
  212. if not Assigned(Owner) then Exit;
  213. vProj := TProjectData(TCheckerFrame(Owner).ProjectData);
  214. sURL := Format('%suser/del/%d/%d/%d/audit', [PHPWeb.MeasureURL, Self.UserID,
  215. vProj.WebID, vProj.PhaseIndex]);
  216. vArr := VarArrayOf(['msg']);
  217. case PHPWeb.Search(sURL, [], [], vArr) of
  218. 1:
  219. begin
  220. // 这里直接调用Init方法会出问题,因为事件还没影响完就被释放了,运行出错。
  221. // 问题的根源在于触发事件的位置来自控件的内部(即使这里调用外部的方法来
  222. // 搞定它也不行),CS常规的设计方法是外部来控制它,而不是由自身来控制。
  223. // 这算是BS设计跟CS设计差异的一个体现吧。
  224. TCheckerFrame(Owner).tRefreshCheckers.Enabled := True;
  225. end;
  226. 0:
  227. begin
  228. Application.MessageBox(PChar(PHPWeb.PageError('无法删除审批人' + '[' + vArr[0] + ']')),
  229. '警告', MB_OK + MB_ICONWARNING);
  230. Exit;
  231. end;
  232. -1:
  233. begin
  234. Application.MessageBox(PChar(PHPWeb.NetError('无法删除审批人')),
  235. '警告', MB_OK + MB_ICONWARNING);
  236. end;
  237. end;
  238. end;
  239. procedure TOrderCheckerFrame.SetCheckerMemo(const Value: string);
  240. begin
  241. FCheckerMemo := Value;
  242. lblOrderCheckerMemo.Caption := ShortText(FCheckerMemo, 250);
  243. lblOrderCheckerMemo.Hint := CustomWidthText(FCheckerMemo, 300);
  244. lblOrderCheckerMemo.Update;
  245. end;
  246. procedure TOrderCheckerFrame.SetCheckedTime(const Value: string);
  247. begin
  248. FCheckedTime := Value;
  249. lblOrderCheckerTime.Caption := Value;
  250. lblOrderCheckerTime.Visible := (CheckStatus in [csFinished, csNotPass]);
  251. RightAlign(lblOrderCheckerTime);
  252. end;
  253. procedure TOrderCheckerFrame.RightAlign(ALabel: TLabel);
  254. begin
  255. ALabel.Left := btnDelete.Left + btnDelete.Width - ALabel.Width;
  256. end;
  257. procedure TOrderCheckerFrame.SetCanDelete(const Value: Boolean);
  258. begin
  259. if (Value) then
  260. begin
  261. btnDelete.PicMouseOver.LoadFromFile(GetAppFilePath + 'Data/img/remove-checker-over.bmp');
  262. btnDelete.PicMouseDown.LoadFromFile(GetAppFilePath + 'Data/img/remove-checker-down.bmp');
  263. btnDelete.PicNormal.LoadFromFile(GetAppFilePath + 'Data/img/remove-checker.bmp');
  264. end;
  265. btnDelete.Visible := Value;
  266. btnDelete.Paint;
  267. end;
  268. end.