PHPWebDm.pas 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. {*******************************************************************************
  2. 单元名称: PHPWebDm.pas
  3. 单元说明: Delphi 同PHP web服务器通信接口。 计量的PHP比造价的PHP多了很多
  4. 作者时间: Chenshilong, 2012-5-13
  5. *******************************************************************************}
  6. unit PHPWebDm;
  7. interface
  8. uses
  9. SysUtils, Classes, IdBaseComponent, IdComponent, IdTCPConnection,
  10. IdTCPClient, IdHTTP, CslJson;
  11. type
  12. // Web连接成功、Web连接失败、登录失败、旧用户需要升级、资料不全
  13. TLoginType = (ltCon, ltDisCon, ltLoginFail, ltUpdate, ltIncomplete);
  14. TPHPWeb = class(TDataModule)
  15. procedure DataModuleCreate(Sender: TObject);
  16. private
  17. // 远程服务器上时间
  18. FServerDateTime: TDateTime;
  19. FUserID: Integer;
  20. FAccount: string;
  21. FRealName: string;
  22. FUserFlag: Integer; // 用户标志位,用于区分出一部分用户进行特殊控制。
  23. FMeasureURL: string; // http://d.jl.smartcost.com.cn/api/client/
  24. FLoginURL: string;
  25. FLoginBannerURL: string;
  26. FCheckOnLineURL: string;
  27. FPassportURL: string;
  28. FPwdURL: string;
  29. FRegURL: string;
  30. FWebLoginURL: string;
  31. FServerDateTimeURL: string;
  32. FWebSoftURL: string;
  33. FLogoutURL: string;
  34. FRole: string;
  35. FCompany: string;
  36. FUserImageURL: string;
  37. FLoginCloudURL: string;
  38. procedure SetUserID(const Value: Integer);
  39. procedure SetAccount(const Value: string);
  40. procedure SetRealName(const Value: string);
  41. {-------------------------------------------------------------------------------
  42. 方法: CustomSearch()
  43. 描述: 通用的查询接口,集各种复杂情况之大成,宇宙级牛B综合算法,哦耶! ^__^
  44. 【函数返回值】
  45. -1: 网络不通;
  46. 0: 网络通,但登录或查询出错、网页出错等,无法返回约定的
  47. Json格式,通常返回一篇乱码;
  48. 1: 成功(包括返回零记录)
  49. 【参数】
  50. AURL: 请求的网址。
  51. AInFields: 请求的键名字。
  52. AInValues: 请求的键值。
  53. AResultType: 返回值类型:0 返回一维数组;1 返回二维数组;2 两者都。
  54. AOutStrs: 用于存储返回的零散值。需要赋字段名传入。
  55. AOutRecords: 用于存储返回的多条记录、数据表。只需声明,无需定义大
  56. 小和赋值,返回Json的数组,数组的值为'info'对象的值。
  57. 【要求】
  58. ①返回的Json数据中必须有status、msg两个键名字(约定格式)。
  59. ②AResults至少有一个元素,用来存储当返回值为0时查询出错的原因。
  60. 作者: Chenshilong, 2014-07-13
  61. -------------------------------------------------------------------------------}
  62. function CustomSearch(AURL: string; AInFields, AInValues: array of string;
  63. AResultType: Integer; var AOutStrs: array of string;
  64. var AOutRecords: TOVArr): Integer;
  65. public
  66. function SystemDateTime: TDateTime;
  67. function Search(AURL: string; var AOutStrs: array of string): Integer; overload;
  68. function Search(AURL: string; var AOutRecords: TOVArr): Integer; overload;
  69. function Search(AURL: string; AInFields, AInValues: array of string; var AOutStrs: array of string): Integer; overload;
  70. function Search(AURL: string; AInFields, AInValues: array of string; var AOutRecords: TOVArr): Integer; overload;
  71. function Search(AURL: string; AInFields, AInValues: array of string; var AOutStrs: array of string ; var AOutRecords: TOVArr): Integer; overload;
  72. function Search(AURL: string; AInFields, AInValues: array of string; AResultType: Integer; var AOutStrs: array of string ; var AOutRecords: TOVArr): Integer; overload;
  73. // ALoginType, 登录类型,1 正常情况下的用户名密码;2 紫光平台调用仅用户名无密码
  74. function Login(AAccount, APW: string; ALoginType: Integer; var AInfo, ANewExeURL: string): TLoginType;
  75. function ConnectServer(AIP: string; var ACompanyName: string): Integer; // 新装软件,先弹出设置IP窗口
  76. function UpDataFile(AUserID, ATenderID, APhaseNo: Integer; AFile, AMD5_JL: string;
  77. AIsSubmit: Boolean; var AResultStr: string; ACheckPassed: Boolean; ACheckerMemo: string): Boolean;
  78. function UpAttachment(AUperID, AWebID, ABillID, APhase: Integer; AFile, ACategory, AMemo: string; var ANewFileName, AFileID, ADownURL: string): Boolean;
  79. function UpAttachmentOnLine(AWebID, ABillID, APhase: Integer; AIDAry: array of string): Boolean;
  80. function DeleteAttachment(AFileID: Integer): Integer;
  81. function GetAttachmentList(AWebID: Integer; var vArr: TOVArr): Boolean;
  82. function zip(AFileArr: array of string): string;
  83. function CheckZip(AZipFile: string; AFileCount: Integer): Boolean; // 检测zip是否能够正确解压出所有文件。
  84. function TempName(ALength: Integer = 12): string;
  85. function WebPath: string;
  86. function UserPath: string;
  87. // 下载文件:源文件网址;存储到本地的位置
  88. function DownFile(ASourceURL: string; var ALocalFile: string): Boolean;
  89. // 用于调试输出值,解决灵异现象(有些现象调试环境正常,运行环境时有时无)
  90. procedure Debug(AFileName, AStr: string); overload;
  91. procedure Debug(AFileName: string; AInFields, AInValues: array of string); overload;
  92. function NetError(AMid: string): string;
  93. function PageError(AMid: string): string;
  94. function ExistInServer(AWebID: Integer): Boolean;
  95. function GetNameFromURLProtocol(AURLProtocol: string): string;
  96. function UploadFile(AUrl: string; AInFields, AInValues: array of string;
  97. AFileName: string; var ErrorMessage: string): Boolean;
  98. function UploadFiles(AUrl: string; AInFields, AInValues: array of string;
  99. AUpFileFields, AUpFileNames: array of string; var ErrorMessage: string): Boolean;
  100. function UrlGet(AUrl: string; APostParam: TStrings; var AResult: string): Integer; overload;
  101. function UrlGet(AUrl: string; APostParam: TStrings; var AResult: TStrings): Integer; overload;
  102. procedure ReadIniValues;
  103. function RepalceSpecChars(AFileName: string): string;
  104. property Account: string read FAccount write SetAccount;
  105. property UserID: Integer read FUserID write SetUserID;
  106. property RealName: string read FRealName write SetRealName;
  107. property UserFlag: Integer read FUserFlag write FUserFlag;
  108. property Company: string read FCompany write FCompany;
  109. property Role: string read FRole write FRole;
  110. property MeasureURL: string read FMeasureURL;
  111. property WebSoftURL: string read FWebSoftURL;
  112. property PassportURL: string read FPassportURL;
  113. property LoginURL: string read FLoginURL;
  114. property WebLoginURL: string read FWebLoginURL;
  115. property LoginBannerURL: string read FLoginBannerURL;
  116. property LogoutURL: string read FLogoutURL;
  117. property RegURL: string read FRegURL;
  118. property PwdURL: string read FPwdURL;
  119. property CheckOnLineURL: string read FCheckOnLineURL;
  120. property ServerDateTimeURL: string read FServerDateTimeURL;
  121. property UserImageURL: string read FUserImageURL write FUserImageURL;
  122. property LoginCloudURL: string read FLoginCloudURL write FLoginCloudURL;
  123. end;
  124. function PHPWeb: TPHPWeb;
  125. // 全国 广东 标后预算 定额排版 港口水工 内河航运 疏浚 清单编制
  126. function ExeCategoryName: string;
  127. implementation
  128. uses
  129. MD5Unit, IdMultipartFormData, VCLUnZip, VCLZip, Globals,
  130. IniFiles, Forms, UtilMethods, Variants, ConstUnit, ScUtils, superobject;{, Controls, Windows}
  131. var g_PHPWeb: TPHPWeb;
  132. {$R *.dfm}
  133. { TPHPWeb }
  134. function PHPWeb: TPHPWeb;
  135. begin
  136. if g_PHPWeb = nil then
  137. g_PHPWeb := TPHPWeb.Create(nil);
  138. Result := g_PHPWeb;
  139. end;
  140. function ExeCategoryName: string;
  141. begin
  142. Result := 'JLZF';
  143. end;
  144. function TPHPWeb.Login(AAccount, APW: string; ALoginType: Integer; var AInfo, ANewExeURL: string): TLoginType;
  145. var vArr: array of string;
  146. begin
  147. vArr := VarArrayOf(['uid', 'name', 'email', 'ucompany', 'jobtitle', 'avatar', 'msg']);
  148. case Search(FMeasureURL + 'signin', ['v4name', 'v4pass', 'version', 'logintype'],
  149. [AnsiToUtf8(AAccount), APW, GetVersion{'0.0.0.0'}, IntToStr(ALoginType)], vArr) of
  150. -1: Result := ltDisCon;
  151. 0:
  152. begin
  153. AInfo := vArr[0];
  154. Result := ltLoginFail;
  155. end;
  156. 1:
  157. begin
  158. FUserID := StrToInt(vArr[0]);
  159. FRealName := vArr[1];
  160. FAccount := AAccount; // vArr[2]
  161. FCompany := vArr[3];
  162. FRole := vArr[4];
  163. FUserImageURL := vArr[5];
  164. AInfo := vArr[6];
  165. Result := ltCon;
  166. end;
  167. 2:
  168. begin
  169. AInfo := '版本有更新,请点击“确定”下载新版本。';
  170. ANewExeURL := vArr[1];
  171. Result := ltUpdate;
  172. end;
  173. end;
  174. end;
  175. procedure TPHPWeb.SetUserID(const Value: Integer);
  176. begin
  177. FUserID := Value;
  178. end;
  179. procedure TPHPWeb.SetAccount(const Value: string);
  180. begin
  181. FAccount := Value;
  182. end;
  183. procedure TPHPWeb.DataModuleCreate(Sender: TObject);
  184. begin
  185. FServerDateTime := -1;
  186. ReadIniValues;
  187. end;
  188. procedure TPHPWeb.SetRealName(const Value: string);
  189. begin
  190. FRealName := Value;
  191. end;
  192. function TPHPWeb.zip(AFileArr: array of string): string;
  193. var vZip: TVCLZip;
  194. sAppFile, sZipFile: string;
  195. i: Integer;
  196. begin
  197. Result := 'Error';
  198. sAppFile := AFileArr[Low(AFileArr)];
  199. sZipFile := ExtractFilePath(sAppFile) + ExtractFileNameWithoutExt(sAppFile) + '.up';
  200. if FileExists(sZipFile) then
  201. DeleteFile(sZipFile);
  202. vZip := TVCLZip.Create(nil);
  203. try
  204. for i := Low(AFileArr) to High(AFileArr) do
  205. begin
  206. if FileExists(AFileArr[i]) then
  207. vZip.FilesList.Add(AFileArr[i]);
  208. end;
  209. vZip.ZipName := sZipFile;
  210. // PHP不支持解压加密zip文件
  211. //vZip.Password := 'jlzf.Sc.2014';
  212. vZip.Recurse := True;
  213. vZip.ZipComment := '纵横计量支付';
  214. vZip.OverwriteMode := Always;
  215. vZip.Zip;
  216. Result := sZipFile;
  217. for i := Low(AFileArr) to High(AFileArr) do
  218. DeleteFile(AFileArr[i]);
  219. finally
  220. vZip.Free;
  221. end;
  222. end;
  223. function TPHPWeb.CheckZip(AZipFile: string; AFileCount: Integer): Boolean;
  224. var vUnZip: TVCLUnZip;
  225. begin
  226. vUnZip := TVCLUnZip.Create(nil);
  227. try
  228. vUnZip.ZipName := AZipFile;
  229. vUnZip.DestDir := 'C:\Temp\MeasureTemp\';
  230. vUnZip.DoAll := True;
  231. vUnZip.RecreateDirs := True;
  232. vUnZip.RetainAttributes := True;
  233. vUnZip.OverwriteMode := Always;
  234. Result := (AFileCount = vUnZip.UnZip);
  235. finally
  236. DeleteFolder(vUnZip.DestDir);
  237. vUnZip.Free;
  238. end;
  239. end;
  240. function TPHPWeb.UpDataFile(AUserID, ATenderID, APhaseNo: Integer; AFile, AMD5_JL: string;
  241. AIsSubmit: Boolean; var AResultStr: string; ACheckPassed: Boolean; ACheckerMemo: string): Boolean;
  242. var
  243. IdDataStream: TIdMultiPartFormDataStream;
  244. sResult, sURL: string;
  245. J: TCslJson;
  246. sZipMD5: string;
  247. vIdHttp: TIdHTTP;
  248. begin
  249. Result := False;
  250. if not FileExists(AFile) then Exit;
  251. IdDataStream := TIdMultiPartFormDataStream.Create;
  252. vIdHTTP := TIdHTTP.Create(nil);
  253. try
  254. if ACheckPassed then // 审核通过
  255. begin
  256. if AIsSubmit then
  257. begin
  258. sURL := Format('%speriod/%d/%d/%d/creat', [FMeasureURL, AUserID, ATenderID, APhaseNo])
  259. end
  260. else
  261. begin
  262. sURL := FMeasureURL + 'user/audit/measure';
  263. IdDataStream.AddFormField('userid', IntToStr(AUserID));
  264. IdDataStream.AddFormField('tenderid', IntToStr(ATenderID));
  265. IdDataStream.AddFormField('phaseno', IntToStr(APhaseNo));
  266. IdDataStream.AddFormField('CheckerMemo', ReplaceCharsForJson(ACheckerMemo));
  267. end;
  268. end
  269. else // 审核不通过
  270. begin
  271. sURL := Format('%suser/set/%d/%d/%d/checkno', [FMeasureURL, AUserID, ATenderID, APhaseNo]);
  272. IdDataStream.AddFormField('CheckerMemo', ReplaceCharsForJson(ACheckerMemo));
  273. end;
  274. IdDataStream.AddFile('upfile', AFile, 'text/plain');
  275. IdDataStream.AddFormField('upfile', AFile);
  276. IdDataStream.AddFormField('MD5_JL', AMD5_JL);
  277. sZipMD5 := MD5_File(AFile);
  278. IdDataStream.AddFormField('MD5_Zip', sZipMD5);
  279. IdDataStream.Position := 0;
  280. try
  281. sResult := vIdHTTP.Post(sURL, IdDataStream);
  282. except
  283. Abort;
  284. end;
  285. finally
  286. IdDataStream.Free;
  287. vIdHttp.Free;
  288. DeleteFile(AFile);
  289. end;
  290. J := TCslJson.Create;
  291. try
  292. J.Text := Utf8ToAnsi(sResult);
  293. if SameText(J.Value['status'], 'true') then
  294. Result := True
  295. else
  296. begin
  297. Result := False;
  298. AResultStr := J.Value['msg'];
  299. end;
  300. finally
  301. J.Free;
  302. end;
  303. end;
  304. function TPHPWeb.Search(AURL: string; AInFields, AInValues: array of string; var AOutStrs: array of string): Integer;
  305. var vA: TOVArr;
  306. begin
  307. Result := CustomSearch(AURL, AInFields, AInValues, 0, AOutStrs, vA);
  308. end;
  309. function TPHPWeb.Search(AURL: string; AInFields, AInValues: array of string; var AOutRecords: TOVArr): Integer;
  310. var vA: array of string;
  311. begin
  312. Result := CustomSearch(AURL, AInFields, AInValues, 1, vA, AOutRecords);
  313. end;
  314. function TPHPWeb.Search(AURL: string; AInFields, AInValues: array of string; var AOutStrs: array of string; var AOutRecords: TOVArr): Integer;
  315. begin
  316. Result := CustomSearch(AURL, AInFields, AInValues, 2, AOutStrs, AOutRecords);
  317. end;
  318. function TPHPWeb.Search(AURL: string; AInFields, AInValues: array of string; AResultType: Integer; var AOutStrs: array of string; var AOutRecords: TOVArr): Integer;
  319. begin
  320. Result := CustomSearch(AURL, AInFields, AInValues, 3, AOutStrs, AOutRecords);
  321. end;
  322. function TPHPWeb.TempName(ALength: Integer): string;
  323. const
  324. CodedBuf: array[0..35] of Char = ('0', '1', '2', '3', '4', '5',
  325. '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
  326. 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
  327. 'W', 'X', 'Y', 'Z');
  328. begin
  329. Result := '';
  330. Randomize;
  331. while Length(Result) < ALength do
  332. Result := Result + CodedBuf[Random(36)];
  333. end;
  334. function TPHPWeb.WebPath: string;
  335. begin
  336. Result := ExtractFilePath(Application.ExeName) + 'Web\';
  337. if not DirectoryExists(Result) then
  338. ForceDirectories(Result);
  339. end;
  340. function TPHPWeb.UserPath: string;
  341. begin
  342. Result := ExtractFilePath(Application.ExeName) + 'Web\Users\' + IntToStr(FUserID) + '\';
  343. if not DirectoryExists(Result) then
  344. ForceDirectories(Result);
  345. end;
  346. function TPHPWeb.DownFile(ASourceURL: string; var ALocalFile: string): Boolean;
  347. var
  348. vStream: TMemoryStream;
  349. iFlag: Integer;
  350. bOK: Boolean;
  351. vIdHTTP: TIdHTTP;
  352. procedure SafeDownFile(ASourceURL: string; var ALocalFile: string);
  353. begin
  354. Inc(iFlag);
  355. bOK := False;
  356. try
  357. vIdHTTP.Get(ASourceURL, vStream);
  358. vStream.SaveToFile(ALocalFile);
  359. bOK := True;
  360. except
  361. bOK := False;
  362. end;
  363. end;
  364. begin
  365. iFlag := 0;
  366. bOK := False;
  367. Result := False;
  368. if Trim(ASourceURL) = '' then Exit;
  369. if Trim(ALocalFile) = '' then Exit;
  370. if (ExtractFileExt(ALocalFile) = '.rmf') and FileExists(ALocalFile) then
  371. DeleteFile(ALocalFile);
  372. vStream := TMemoryStream.Create;
  373. vIdHTTP := TIdHTTP.Create(nil);
  374. try
  375. while (not bOK) and (iFlag < 2) do // 尝试2次
  376. SafeDownFile(ASourceURL, ALocalFile);
  377. Result := bOK;
  378. finally
  379. vStream.Free;
  380. vIdHTTP.Free;
  381. end;
  382. end;
  383. function TPHPWeb.CustomSearch(AURL: string; AInFields,
  384. AInValues: array of string; AResultType: Integer;
  385. var AOutStrs: array of string; var AOutRecords: TOVArr): Integer;
  386. var
  387. i: Integer;
  388. postList: TStrings;
  389. ssResponse: TStringStream;
  390. bDone: Boolean;
  391. vJson: TCslJson;
  392. vIdHTTP: TIdHTTP;
  393. begin
  394. MeasureLog.AppendLogTo(AURL);
  395. Result := -1;
  396. postList := TStringList.Create;
  397. ssResponse := TStringStream.Create('');
  398. vIdHTTP := TIdHTTP.Create(nil);
  399. try
  400. try
  401. for i := Low(AInFields) to High(AInFields) do
  402. postList.Add(Format('%s=%s', [AInFields[i], AInValues[i]]));
  403. vIdHTTP.Post(AURL, postList, ssResponse);
  404. bDone := True;
  405. except
  406. bDone := False;
  407. end;
  408. if (bDone) and (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then // 网络已通
  409. begin
  410. vJson := TCslJson.Create;
  411. try
  412. vJson.Text := Utf8ToAnsi(ssResponse.DataString);
  413. if SameText(vJson.Value['status'], 'true') then // 数据读取成功
  414. begin
  415. case AResultType of
  416. 0:
  417. begin
  418. for i := Low(AOutStrs) to High(AOutStrs) do
  419. AOutStrs[i] := vJson.Value[AOutStrs[i]];
  420. end;
  421. 1:
  422. begin
  423. AOutRecords := vJson.ArrayValues('info');
  424. end;
  425. 2:
  426. begin
  427. for i := Low(AOutStrs) to High(AOutStrs) do
  428. AOutStrs[i] := vJson.Value[AOutStrs[i]];
  429. AOutRecords := vJson.ArrayValues('info');
  430. end;
  431. 3:
  432. begin
  433. vJson.ChildValues('info', AOutStrs);
  434. AOutRecords := vJson.ArrayValues('auditinfo');
  435. end;
  436. end;
  437. Result := 1;
  438. end
  439. else if SameText(vJson.Value['status'], 'false') then // 数据读取失败
  440. begin
  441. case AResultType of
  442. 0:
  443. begin
  444. AOutStrs[Low(AOutStrs)] := vJson.Value['msg'];
  445. end;
  446. 1:
  447. begin
  448. SetLength(AOutRecords, 1, 1);
  449. AOutRecords[0, 0] := vJson.Value['msg'];
  450. end;
  451. 2, 3:
  452. begin
  453. AOutStrs[Low(AOutStrs)] := vJson.Value['msg'];
  454. SetLength(AOutRecords, 1, 1);
  455. AOutRecords[0, 0] := vJson.Value['msg'];
  456. end;
  457. end;
  458. Result := 0;
  459. end
  460. else if SameText(vJson.Value['status'], 'upgrade') then
  461. begin
  462. AOutStrs[Low(AOutStrs)] := vJson.Value['msg'];
  463. AOutStrs[Low(AOutStrs) + 1] := vJson.Value['url'];
  464. Result := 2;
  465. end;
  466. finally
  467. vJson.Free;
  468. end;
  469. end;
  470. finally
  471. postList.Free;
  472. ssResponse.Free;
  473. vIdHTTP.Free;
  474. end;
  475. end;
  476. function TPHPWeb.SystemDateTime: TDateTime;
  477. begin
  478. Result := Now;
  479. end;
  480. function TPHPWeb.NetError(AMid: string): string;
  481. begin
  482. Result := Format('当前网络状态较差(-1),%s,请重新尝试或重新登录后再尝试!', [AMid]);
  483. end;
  484. function TPHPWeb.PageError(AMid: string): string;
  485. begin
  486. Result := Format('Web页返回错误(000J),%s,请重新尝试或联系纵横客服。', [AMid]);
  487. end;
  488. procedure TPHPWeb.Debug(AFileName, AStr: string);
  489. var vSL: TStringList;
  490. sAdd: string;
  491. begin
  492. vSL := TStringList.Create;
  493. try
  494. sAdd := Format('%s%d %s %s', [#10#13#10#13#10#13#10#13#10#13,
  495. UserID, RealName, Account]);
  496. vSL.Add(AStr + sAdd);
  497. if Pos('Debug_', AFileName) = 0 then
  498. AFileName := 'Debug_' + AFileName;
  499. vSL.SaveToFile(WebPath + AFileName + '.txt');
  500. finally
  501. vSL.Free;
  502. end;
  503. end;
  504. procedure TPHPWeb.Debug(AFileName: string; AInFields, AInValues: array of string);
  505. var vSL: TStringList;
  506. sAdd: string;
  507. i: Integer;
  508. begin
  509. if G_IsTest then
  510. begin
  511. vSL := TStringList.Create;
  512. try
  513. sAdd := Format('%s%d %s %s', [#10#13#10#13#10#13#10#13#10#13, UserID, RealName, Account]);
  514. for i := Low(AInFields) to High(AInFields) do
  515. vSL.Add(AInFields[i] + #9#9 + AInValues[i]);
  516. vSL.Add(sAdd);
  517. if Pos('Debug_', AFileName) = 0 then
  518. AFileName := 'Debug_' + AFileName;
  519. vSL.SaveToFile(WebPath + AFileName + '.txt');
  520. finally
  521. vSL.Free;
  522. end;
  523. end;
  524. end;
  525. function TPHPWeb.ConnectServer(AIP: string; var ACompanyName: string): Integer;
  526. var vArr: array of string;
  527. sURL: string;
  528. begin
  529. sURL := Format('http://%s/api/client/software/title', [AIP]);
  530. vArr := VarArrayOf(['msg']);
  531. Result := Search(sURL, [], [], vArr);
  532. case Result of
  533. -1: ACompanyName := '地址不存在';
  534. 0: ACompanyName := '服务器Web页错误';
  535. 1: ACompanyName := vArr[0];
  536. end;
  537. end;
  538. function TPHPWeb.UpAttachment(AUperID, AWebID, ABillID, APhase: Integer; AFile,
  539. ACategory, AMemo: string; var ANewFileName, AFileID, ADownURL: string): Boolean;
  540. var
  541. vMPFDS: TIdMultiPartFormDataStream;
  542. sResult, sURL: string;
  543. J: TCslJson;
  544. vArr: array of string;
  545. vIdHTTP: TIdHTTP;
  546. begin
  547. Result := False;
  548. if not FileExists(AFile) then
  549. begin
  550. // Application.MessageBox(PChar(AFile + ' 文件不存在!'), '错误', MB_OK + MB_ICONERROR);
  551. Exit;
  552. end;
  553. vMPFDS := TIdMultiPartFormDataStream.Create;
  554. vIdHTTP := TIdHTTP.Create(nil);
  555. try
  556. sURL := Format('%stender/attachment/%d/%d/upload', [FMeasureURL, AWebID, AUperID]);
  557. // 如果文件已被打开,这里会报错。
  558. try
  559. vMPFDS.AddFile('upitem', AFile, 'text/plain');
  560. except
  561. MessageHint(0, '当前文件处于打开状态,请关闭文件,重新上传。');
  562. Exit;
  563. end;
  564. vMPFDS.AddFormField('itemid', IntToStr(ABillID));
  565. vMPFDS.AddFormField('category', ACategory);
  566. vMPFDS.AddFormField('memo', ReplaceCharsForJson(AMemo));
  567. vMPFDS.AddFormField('phase', IntToStr(APhase));
  568. vMPFDS.Position := 0;
  569. try
  570. sResult := vIdHTTP.Post(sURL, vMPFDS);
  571. except
  572. Abort;
  573. end;
  574. finally
  575. vMPFDS.Free;
  576. vIdHTTP.Free;
  577. end;
  578. J := TCslJson.Create;
  579. try
  580. J.Text := Utf8ToAnsi(sResult);
  581. if SameText(J.Value['status'], 'true') then
  582. begin
  583. Result := True;
  584. vArr := VarArrayOf(['onlinefilename', 'imnid', 'fileurl']);
  585. J.ChildValues('iteminfo', vArr);
  586. ANewFileName := vArr[0];
  587. AFileID := vArr[1];
  588. ADownURL := vArr[2];
  589. end
  590. else
  591. begin
  592. Result := False;
  593. end;
  594. finally
  595. J.Free;
  596. end;
  597. end;
  598. function TPHPWeb.GetAttachmentList(AWebID: Integer; var vArr: TOVArr): Boolean;
  599. var sURL: string;
  600. begin
  601. sURL := Format('%stender/attachment/%d/list', [FMeasureURL, AWebID]);
  602. Result := Search(sURL, [], [], vArr) = 1;
  603. end;
  604. function TPHPWeb.ExistInServer(AWebID: Integer): Boolean;
  605. var vArr: array of string;
  606. iResult: Integer;
  607. sSearchURL: string;
  608. begin
  609. sSearchURL := Format('%stender/get/%d/exist', [PHPWeb.MeasureURL, AWebID]);
  610. vArr := VarArrayOf(['id', 'name']);
  611. iResult := PHPWeb.Search(sSearchURL, [''], [''], vArr);
  612. if (iResult = 1) and (High(vArr) >= 0) then
  613. Result := True
  614. else
  615. Result := False;
  616. end;
  617. // 格式为 Measure:chen
  618. function TPHPWeb.GetNameFromURLProtocol(AURLProtocol: string): string;
  619. begin
  620. if Trim(AURLProtocol) = '' then
  621. Result := ''
  622. else
  623. Result := Copy(AURLProtocol, 9, Length(AURLProtocol) - 8);
  624. end;
  625. function TPHPWeb.DeleteAttachment(AFileID: Integer): Integer;
  626. var sURL: string;
  627. vArr: array of string;
  628. begin
  629. vArr := VarArrayOf(['msg']);
  630. sURL := Format('%stender/attachment/%d/del', [FMeasureURL, AFileID]);
  631. Result := Search(sURL, [], [], vArr);
  632. end;
  633. function TPHPWeb.UpAttachmentOnLine(AWebID, ABillID, APhase: Integer; AIDAry: array of string): Boolean;
  634. //var
  635. // vMPFDS: TIdMultiPartFormDataStream;
  636. // sResult, sURL: string;
  637. // J: TCslJson;
  638. // vArr: array of string;
  639. begin
  640. { Result := False;
  641. vMPFDS := TIdMultiPartFormDataStream.Create;
  642. try
  643. sURL := Format('%stender/attachment/%d/%d/upload', [FMeasureURL, AWebID, PHPWeb.UserID]);
  644. vMPFDS.AddFormField('itemid', IntToStr(ABillID));
  645. vMPFDS.AddFormField('phase', IntToStr(APhase));
  646. vMPFDS.Position := 0;
  647. try
  648. sResult := IdHTTP.Post(sURL, vMPFDS);
  649. except
  650. Abort;
  651. end;
  652. finally
  653. vMPFDS.Free;
  654. end;
  655. J := TCslJson.Create;
  656. try
  657. J.Text := Utf8ToAnsi(sResult);
  658. if SameText(J.Value['status'], 'true') then
  659. begin
  660. Result := True;
  661. vArr := VarArrayOf(['onlinefilename']);
  662. J.ChildValues('iteminfo', vArr);
  663. ANewFileName := vArr[0];
  664. end
  665. else
  666. begin
  667. Result := False;
  668. end;
  669. finally
  670. J.Free;
  671. end; }
  672. end;
  673. function TPHPWeb.UploadFile(AUrl: string; AInFields,
  674. AInValues: array of string; AFileName: string; var ErrorMessage: string): Boolean;
  675. var
  676. IdDataStream: TIdMultiPartFormDataStream;
  677. i: Integer;
  678. sPostResult: string;
  679. J: TCslJson;
  680. vIdHttp: TIdHTTP;
  681. begin
  682. Result := False;
  683. if not FileExists(AFileName) then Exit;
  684. IdDataStream := TIdMultiPartFormDataStream.Create;
  685. vIdHTTP := TIdHTTP.Create(nil);
  686. try
  687. for i := Low(AInFields) to High(AInFields) do
  688. IdDataStream.AddFormField(AInFields[i], AInValues[i]);
  689. IdDataStream.AddFile('upfile', AFileName, 'text/plain');
  690. IdDataStream.Position := 0;
  691. try
  692. sPostResult := vIdHTTP.Post(MeasureURL + AUrl, IdDataStream);
  693. J := TCslJson.Create;
  694. J.Text := Utf8ToAnsi(sPostResult);
  695. Result := SameText(J.Value['status'], 'true');
  696. if not Result then
  697. ErrorMessage := J.Value['msg'];
  698. finally
  699. J.Free;
  700. end;
  701. finally
  702. IdDataStream.Free;
  703. vIdHttp.Free;
  704. end;
  705. end;
  706. function TPHPWeb.UploadFiles(AUrl: string; AInFields, AInValues,
  707. AUpFileFields, AUpFileNames: array of string;
  708. var ErrorMessage: string): Boolean;
  709. var
  710. IdDataStream: TIdMultiPartFormDataStream;
  711. i: Integer;
  712. sPostResult: string;
  713. J: TCslJson;
  714. vIdHttp: TIdHTTP;
  715. begin
  716. Result := False;
  717. for i := Low(AUpFileNames) to High(AUpFileNames) do
  718. if not FileExists(AUpFileNames[i]) then Exit;
  719. IdDataStream := TIdMultiPartFormDataStream.Create;
  720. vIdHTTP := TIdHTTP.Create(nil);
  721. try
  722. for i := Low(AInFields) to High(AInFields) do
  723. IdDataStream.AddFormField(AInFields[i], AInValues[i]);
  724. for i := Low(AUpFileFields) to High(AUpFileFields) do
  725. IdDataStream.AddFile(AUpFileFields[i], AUpFileNames[i], 'text/plain');
  726. IdDataStream.Position := 0;
  727. J := TCslJson.Create;
  728. try
  729. sPostResult := vIdHTTP.Post(MeasureURL + AUrl, IdDataStream);
  730. J.Text := Utf8ToAnsi(sPostResult);
  731. Result := SameText(J.Value['status'], 'true');
  732. if not Result then
  733. ErrorMessage := J.Value['msg'];
  734. finally
  735. J.Free;
  736. end;
  737. finally
  738. IdDataStream.Free;
  739. vIdHttp.Free;
  740. end;
  741. end;
  742. function TPHPWeb.UrlGet(AUrl: string; APostParam: TStrings;
  743. var AResult: TStrings): Integer;
  744. var
  745. i: Integer;
  746. postList: TStrings;
  747. ssResponse: TStringStream;
  748. bDone: Boolean;
  749. vJson: TCslJson;
  750. vIdHTTP: TIdHTTP;
  751. begin
  752. Result := -1;
  753. ssResponse := TStringStream.Create('');
  754. vIdHTTP := TIdHTTP.Create(nil);
  755. try
  756. vIdHTTP.Post(AUrl, APostParam, ssResponse);
  757. if (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then
  758. begin
  759. // Analyse Result Json
  760. vJson := TCslJson.Create;
  761. try
  762. vJson.Text := Utf8ToAnsi(ssResponse.DataString);
  763. if SameText(vJson.Value['status'], 'true') then
  764. begin
  765. vJson.ValueStrings('info', AResult);
  766. Result := 1;
  767. end
  768. else if SameText(vJson.Value['status'], 'false') then
  769. begin
  770. AResult.Add(vJson.Value['msg']);
  771. Result := 0;
  772. end
  773. else
  774. begin
  775. AResult.Add('查询数据出错, 请重试');
  776. Result := 0;
  777. end;
  778. finally
  779. vJson.Free;
  780. end;
  781. end;
  782. finally
  783. vIdHTTP.Free;
  784. ssResponse.Free;
  785. end;
  786. end;
  787. function TPHPWeb.UrlGet(AUrl: string; APostParam: TStrings;
  788. var AResult: string): Integer;
  789. var
  790. i: Integer;
  791. ssResponse: TStringStream;
  792. vJ: ISuperObject;
  793. vIdHTTP: TIdHTTP;
  794. begin
  795. Result := -1;
  796. AResult := '';
  797. ssResponse := TStringStream.Create('');
  798. vIdHTTP := TIdHTTP.Create(nil);
  799. try
  800. vIdHTTP.Post(AUrl, APostParam, ssResponse);
  801. if (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then
  802. begin
  803. // Analyse Result Json
  804. try
  805. vJ := SO(Utf8ToAnsi(ssResponse.DataString));
  806. if SameText(vJ['status'].AsString, 'true') then
  807. begin
  808. if Assigned(vJ['info']) then
  809. AResult := vJ['info'].AsString
  810. else
  811. AResult := vJ['msg'].AsString;
  812. Result := 1;
  813. end
  814. else if SameText(vJ['status'].AsString, 'false') then
  815. begin
  816. AResult := vJ['msg'].AsString;
  817. Result := 0;
  818. end
  819. else
  820. begin
  821. AResult := '查询数据出错, 请重试';
  822. Result := 0;
  823. end;
  824. finally
  825. vJ := nil;
  826. end;
  827. end;
  828. finally
  829. vIdHTTP.Free;
  830. ssResponse.Free;
  831. end;
  832. end;
  833. function TPHPWeb.Search(AURL: string; var AOutStrs: array of string): Integer;
  834. var vA: TOVArr;
  835. begin
  836. Result := CustomSearch(AURL, [], [], 0, AOutStrs, vA);
  837. end;
  838. function TPHPWeb.Search(AURL: string; var AOutRecords: TOVArr): Integer;
  839. var vA: array of string;
  840. begin
  841. Result := CustomSearch(AURL, [], [], 1, vA, AOutRecords);
  842. end;
  843. procedure TPHPWeb.ReadIniValues;
  844. var ini: TIniFile;
  845. begin
  846. ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Cloud.ini');
  847. try
  848. // FMeasureURL := ini.ReadString('URL', 'MeasureURL', '');
  849. FMeasureURL := 'http://' + ini.ReadString('URL', 'Server', '') +
  850. ini.ReadString('URL', 'MeasureURL', '');
  851. FWebSoftURL := ini.ReadString('URL', 'WebSoftURL', '');
  852. FPassportURL := ini.ReadString('URL', 'PassportURL', '');
  853. FLoginCloudURL := ini.ReadString('URL', 'LoginCloudURL', '');
  854. FLoginURL := FWebSoftURL + ini.ReadString('URL', 'LoginURL', '');
  855. FWebLoginURL := FWebSoftURL + ini.ReadString('URL', 'FWebLoginURL', '');
  856. FLoginBannerURL := FWebSoftURL + ini.ReadString('URL', 'LoginBannerURL', '');
  857. FLogoutURL := FWebSoftURL + ini.ReadString('URL', 'LogoutURL', '');
  858. FRegURL := FPassportURL + ini.ReadString('URL', 'RegURL', '');
  859. FPwdURL := FPassportURL + ini.ReadString('URL', 'PwdURL', '');
  860. FCheckOnLineURL := FWebSoftURL + ini.ReadString('URL', 'CheckOnLineURL', '');
  861. FServerDateTimeURL := FWebSoftURL + ini.ReadString('URL', 'ServerDateTimeURL', '');
  862. finally
  863. ini.Free;
  864. end;
  865. end;
  866. function TPHPWeb.RepalceSpecChars(AFileName: string): string;
  867. const
  868. BefChar: array [0..10] of Char = ('(', ')', '[', ']', '{', '}', ':', '"', '''', ',', ';');
  869. AftChar: array [0..10] of string = ('(', ')', '【', '】', '『', '』', ':', '”', '”', ',', ';');
  870. var
  871. I: Integer;
  872. begin
  873. AFileName := Trim(AFileName);
  874. for I := low(BefChar) to High(BefChar) do
  875. begin
  876. if Pos(BefChar[I], AFileName) > 0 then
  877. AFileName := StringReplace(AFileName, BefChar[I], AftChar[I], [rfReplaceAll]);
  878. end;
  879. Result := AFileName;
  880. end;
  881. initialization
  882. finalization
  883. if g_PHPWeb <> nil then
  884. g_PHPWeb.Free;
  885. end.