IPEasyUtility.cs 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Dynamic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading;
  10. using System.Xml.Linq;
  11. using NPOI.HPSF;
  12. using OpenQA.Selenium;
  13. using OpenQA.Selenium.Chrome;
  14. using OpenQA.Selenium.Interactions;
  15. using OpenQA.Selenium.Support.Extensions;
  16. using OpenQA.Selenium.Support.UI;
  17. namespace wispro.sp.utility
  18. {
  19. public class IPEasyUtility
  20. {
  21. static string strFileSavePath = ConfigHelper.GetSectionValue("IPEasySetting:DownloadFileSavePath");
  22. static string Account = ConfigHelper.GetSectionValue("IPEasySetting:Account");
  23. static string Password = ConfigHelper.GetSectionValue("IPEasySetting:Password");
  24. static bool WaitForFileDownload(string downloadDir, string fileName, TimeSpan timeout)
  25. {
  26. DateTime startTime = DateTime.Now;
  27. while (DateTime.Now - startTime < timeout)
  28. {
  29. string filePath = Path.Combine(downloadDir, fileName);
  30. if (File.Exists(filePath))
  31. {
  32. // 检查文件是否完成写入(文件大小是否稳定)
  33. long previousSize = 0;
  34. long currentSize = new FileInfo(filePath).Length;
  35. while (previousSize != currentSize)
  36. {
  37. Thread.Sleep(1000); // 等待一段时间
  38. previousSize = currentSize;
  39. currentSize = new FileInfo(filePath).Length;
  40. }
  41. return true; // 文件下载完成
  42. }
  43. Thread.Sleep(1000); // 等待文件出现
  44. }
  45. return false; // 超时,文件未下载完成
  46. }
  47. static IWebElement waitGetElementById(WebDriverWait wait,string id,IWebElement parentElement =null)
  48. {
  49. return wait.Until((d) =>
  50. {
  51. try
  52. {
  53. if (parentElement == null)
  54. {
  55. return d.FindElement(By.Id(id));
  56. }
  57. else
  58. {
  59. return parentElement.FindElement(By.Id(id));
  60. }
  61. }
  62. catch {
  63. return null;
  64. }
  65. });
  66. }
  67. static IWebElement waitGetElementByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  68. {
  69. return wait.Until((d) =>
  70. {
  71. try
  72. {
  73. if (parentElement == null)
  74. {
  75. return d.FindElement(By.Name(name));
  76. }
  77. else
  78. {
  79. return parentElement.FindElement(By.Name(name));
  80. }
  81. }
  82. catch
  83. {
  84. return null;
  85. }
  86. });
  87. }
  88. static IWebElement waitGetElementByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  89. {
  90. return wait.Until((d) =>
  91. {
  92. try
  93. {
  94. if (parentElement == null)
  95. {
  96. return d.FindElement(By.TagName(name));
  97. }
  98. else
  99. {
  100. return parentElement.FindElement(By.TagName(name));
  101. }
  102. }
  103. catch
  104. {
  105. return null;
  106. }
  107. });
  108. }
  109. static ReadOnlyCollection<IWebElement> waitGetElementsByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  110. {
  111. return wait.Until((d) =>
  112. {
  113. try
  114. {
  115. if (parentElement == null)
  116. {
  117. return d.FindElements(By.Name(name));
  118. }
  119. else
  120. {
  121. return parentElement.FindElements(By.Name(name));
  122. }
  123. }
  124. catch
  125. {
  126. return null;
  127. }
  128. });
  129. }
  130. static ReadOnlyCollection<IWebElement> waitGetElementsByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  131. {
  132. return wait.Until((d) =>
  133. {
  134. try
  135. {
  136. if (parentElement == null)
  137. {
  138. return d.FindElements(By.TagName(name));
  139. }
  140. else
  141. {
  142. return parentElement.FindElements(By.TagName(name));
  143. }
  144. }
  145. catch
  146. {
  147. return null;
  148. }
  149. });
  150. }
  151. static IWebElement waitGetElementByClassName(WebDriverWait wait, string name, IWebElement parentElement = null)
  152. {
  153. return wait.Until((d) =>
  154. {
  155. try
  156. {
  157. if (parentElement == null)
  158. {
  159. return d.FindElement(By.ClassName(name));
  160. }
  161. else
  162. {
  163. return parentElement.FindElement(By.ClassName(name));
  164. }
  165. }
  166. catch
  167. {
  168. return null;
  169. }
  170. });
  171. }
  172. /// <summary>
  173. /// 获取指定案号的专利申请案的基本信息和初稿文件、定稿文件和第一次返稿文件
  174. /// </summary>
  175. /// <param name="caseNo"></param>
  176. /// <returns></returns>
  177. /// <exception cref="Exception"></exception>
  178. public static dynamic DownloadCaseFiles(string caseNo)
  179. {
  180. dynamic retObject = new ExpandoObject();
  181. retObject.CaseNo = caseNo.Trim();
  182. using (IWebDriver driver = CreateChromeDriver())
  183. {
  184. try
  185. {
  186. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
  187. Login(driver, wait);
  188. //点击顶部菜单栏中的案件管理菜单
  189. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  190. linkCaseManager.Click();
  191. IWebElement linkCaseSearch = wait.Until((d) =>
  192. {
  193. try
  194. {
  195. return driver.FindElement(By.LinkText("案件查询"));
  196. }
  197. catch
  198. {
  199. return null;
  200. }
  201. });
  202. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  203. //linkCaseSearch.Click();
  204. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  205. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  206. //patentSearch.Click();
  207. driver.SwitchTo().Frame(1);
  208. var inputSearch = waitGetElementById(wait, "case_volume");//driver.FindElement(By.Id("case_volume"));
  209. inputSearch.SendKeys(caseNo.Trim());
  210. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  211. driver.ExecuteJavaScript("arguments[0].click();",btnSearch);
  212. //btnSearch.Click();
  213. try
  214. {
  215. var caseLink = wait.Until((d) =>
  216. {
  217. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  218. });
  219. driver.ExecuteJavaScript("arguments[0].click();", caseLink);
  220. }
  221. catch(Exception ex)
  222. {
  223. if(ex.Message.Contains("no such element: Unable to locate element"))
  224. {
  225. return retObject;
  226. }
  227. }
  228. System.Threading.Thread.Sleep(1000);
  229. driver.SwitchTo().ParentFrame();
  230. driver.SwitchTo().Frame(2);
  231. //案件名称
  232. retObject.CaseName = waitGetElementById(wait, "p_case_info__case_name").GetAttribute("value");
  233. //我方文号
  234. retObject.CaseNo = waitGetElementById(wait, "p_case_info__case_volume").GetAttribute("value");
  235. //案件类型
  236. retObject.CaseType = waitGetElementById(wait, "p_case_info__case_type_id").GetAttribute("value");
  237. //申请类型
  238. var selectElement = waitGetElementById(wait, "p_case_info__apply_type_id");
  239. retObject.ApplicationType = new SelectElement(selectElement).SelectedOption.Text;
  240. //客户
  241. retObject.Customer = waitGetElementById(wait, "p_case_info__customer_id").GetAttribute("value").Replace("(null)", "");
  242. //申请国家
  243. retObject.Country = waitGetElementById(wait, "p_case_info__country_id").GetAttribute("value");
  244. var table = waitGetElementById(wait, "table_ProcList");
  245. var rows = waitGetElementsByTagName(wait, "tr", table);// table.FindElements(By.TagName("tr"));
  246. foreach (var row in rows)
  247. {
  248. var cells = row.FindElements(By.TagName("td"));
  249. if (cells[1].Text == "新申请")
  250. {
  251. var bthEdit = waitGetElementByClassName(wait, "tbedit", cells[12]);
  252. driver.ExecuteJavaScript("arguments[0].click();", bthEdit);
  253. break;
  254. }
  255. }
  256. driver.SwitchTo().ParentFrame().SwitchTo().Frame(0);
  257. //案件阶段
  258. var caseStage = waitGetElementById(wait, "select2-p_proc_info__review_stage-container");
  259. if (caseStage != null && caseStage.Text != "--请选择--")
  260. {
  261. retObject.CaseStage = caseStage.Text;
  262. }
  263. //内部期限
  264. retObject.InternalDate = waitGetElementById(wait, "p_proc_info__int_due_date").GetAttribute("value");
  265. //处理事项系数
  266. var DICoe = waitGetElementById(wait, "p_proc_info__proc_coefficient_id");
  267. retObject.DoItemCoefficient = new SelectElement(DICoe).SelectedOption.Text;
  268. if (retObject.DoItemCoefficient == "请选择")
  269. {
  270. retObject.DoItemCoefficient = "";
  271. }
  272. retObject.DoPersons = waitGetElementById(wait, "pic_list").GetAttribute("value"); //处理人
  273. retObject.Reviewer = waitGetElementById(wait, "rev_list").GetAttribute("value"); //核稿人
  274. //第一次初稿日
  275. retObject.FirstDraftDate = waitGetElementById(wait, "p_proc_info__first_doc_date").GetAttribute("value");
  276. //客户期限
  277. retObject.CustomerLimitDate = waitGetElementById(wait, "p_proc_info__cus_due_date").GetAttribute("value");
  278. //配案日
  279. retObject.CaseAssigmentDate = waitGetElementById(wait, "p_proc_info__allocate_date").GetAttribute("value");
  280. //返稿日
  281. retObject.ReturnDate = waitGetElementById(wait, "p_proc_info__back_date").GetAttribute("value");
  282. //定稿日
  283. retObject.FinalizationDate = waitGetElementById(wait, "p_proc_info__finish_doc_date").GetAttribute("value");
  284. //点击附件信息Tab
  285. var lifile = driver.FindElement(By.Id("lifile"));
  286. driver.ExecuteJavaScript("arguments[0].click();", lifile);
  287. //添加从文件清单中获取“新申请第一次内审 (初稿)、 新申请第一次返稿(第一次发客户文档)、新申请文档(定稿文档)”
  288. var table_filelist = waitGetElementById(wait, "table_filelist");
  289. //定稿文件
  290. try
  291. {
  292. Download(retObject, driver, wait, table_filelist, "新申请文档");
  293. }
  294. catch { }
  295. //新申请第一次返稿文件
  296. try
  297. {
  298. Download(retObject, driver, wait, table_filelist, "新申请第一次返稿");
  299. }
  300. catch { }
  301. //初稿文件
  302. try
  303. {
  304. waitGetElementById(wait, "draftfiletoggle").Click();
  305. var table_draffilelist = waitGetElementById(wait, "table_draftfilelist");// driver.FindElement(By.Id("table_draftfilelist"));
  306. Download(retObject, driver, wait, table_draffilelist, "新申请第一次内审");
  307. }
  308. catch { }
  309. }
  310. catch (Exception ex)
  311. {
  312. throw new Exception(ex.Message, ex);
  313. }
  314. finally
  315. {
  316. driver.Quit();
  317. killChromProcess();
  318. }
  319. }
  320. return retObject;
  321. }
  322. /// <summary>
  323. /// 获取当前为递交中或前一天完成的新申请案件清单
  324. /// </summary>
  325. /// <param name="type">类型0:递交中、1:前一天完成</param>
  326. /// <returns></returns>
  327. /// <exception cref="Exception"></exception>
  328. public static DataTable GetFinished3FilesCases(int type)
  329. {
  330. DataTable retObject = new DataTable();
  331. using (IWebDriver driver = CreateChromeDriver())
  332. {
  333. try
  334. {
  335. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
  336. Login(driver, wait);
  337. //点击顶部菜单栏中的案件管理菜单
  338. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  339. linkCaseManager.Click();
  340. IWebElement linkCaseSearch = wait.Until((d) =>
  341. {
  342. try
  343. {
  344. return driver.FindElement(By.LinkText("案件查询"));
  345. }
  346. catch
  347. {
  348. return null;
  349. }
  350. });
  351. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  352. //linkCaseSearch.Click();
  353. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  354. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  355. //patentSearch.Click();
  356. driver.SwitchTo().Frame(1);
  357. //var inputSearch = waitGetElementById(wait, "case_volume");//driver.FindElement(By.Id("case_volume"));
  358. //inputSearch.SendKeys(caseNo.Trim());
  359. #region 添加检索条件
  360. #endregion
  361. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  362. driver.ExecuteJavaScript("arguments[0].click();", btnSearch);
  363. #region 导出检索结果
  364. #endregion
  365. }
  366. catch (Exception ex)
  367. {
  368. throw new Exception(ex.Message, ex);
  369. }
  370. finally
  371. {
  372. driver.Quit();
  373. killChromProcess();
  374. }
  375. }
  376. return retObject;
  377. }
  378. private static void Download(dynamic retObject, IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType)
  379. {
  380. var tBody = waitGetElementByTagName(wait, "tbody", table_filelist);
  381. var finallyFile = wait.Until((d) =>
  382. {
  383. try {
  384. return tBody.FindElement(By.XPath($".//td[@colname='file_desc'][normalize-space()='{fileType}']"));
  385. }
  386. catch
  387. {
  388. return null;
  389. }
  390. });
  391. if(finallyFile == null)
  392. {
  393. switch (fileType)
  394. {
  395. case "新申请文档":
  396. retObject.finallyFile = null;
  397. break;
  398. case "新申请第一次返稿":
  399. retObject.firstReturnFile = null;
  400. break;
  401. case "新申请第一次内审":
  402. retObject.draftFile = null;
  403. break;
  404. }
  405. return;
  406. }
  407. var tdfileName = wait.Until((d) =>
  408. {
  409. try
  410. {
  411. return finallyFile.FindElement(By.XPath("preceding-sibling::*[2]"));
  412. }
  413. catch
  414. {
  415. return null;
  416. }
  417. });
  418. string fileName = tdfileName.Text;
  419. while (string.IsNullOrEmpty(fileName))
  420. {
  421. System.Threading.Thread.Sleep(100);
  422. fileName = tdfileName.Text;
  423. }
  424. string filePath = System.IO.Path.Combine(strFileSavePath, fileName);
  425. if (System.IO.File.Exists(filePath))
  426. {
  427. System.IO.File.Delete(filePath);
  428. }
  429. switch (fileType)
  430. {
  431. case "新申请文档":
  432. retObject.finallyFile = filePath;
  433. break;
  434. case "新申请第一次返稿":
  435. retObject.firstReturnFile = filePath;
  436. break;
  437. case "新申请第一次内审":
  438. retObject.draftFile = filePath;
  439. break;
  440. }
  441. var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]"));
  442. btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload);
  443. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  444. WaitForFileDownload(strFileSavePath, fileName, TimeSpan.FromMinutes(5));
  445. }
  446. private static void Login(IWebDriver driver, WebDriverWait wait)
  447. {
  448. //进入登录界面
  449. driver.Navigate().GoToUrl(ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb"));
  450. //输入用户名和密码
  451. waitGetElementById(wait, "txtUser").SendKeys(Account);
  452. waitGetElementById(wait, "txtPwd").SendKeys(Password);
  453. //点击登录按钮
  454. waitGetElementById(wait, "btnLogin").Click();
  455. //关闭提示遮罩层
  456. waitGetElementById(wait, "jpwClose").Click();
  457. }
  458. public static void DownloadReport(string strId,string filename)
  459. {
  460. using (IWebDriver driver = CreateChromeDriver())
  461. {
  462. try
  463. {
  464. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  465. Login(driver, wait);
  466. //点击顶部菜单栏中的报表管理菜单
  467. waitGetElementById(wait, "970d33d5-c728-41b8-a060-4330610706b9").Click();
  468. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")).Click();
  469. //点击左侧 自定义报表 菜单
  470. waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b").Click();
  471. //driver.FindElement(By.Name("642fa96f-1e1f-46fd-aaa4-cb461ee8df5b")).Click();
  472. //切换到自定义报表Frame
  473. driver.SwitchTo().Frame(1);
  474. //调用报表导出JS
  475. ((IJavaScriptExecutor)driver).ExecuteScript($"Report.Export('{strId}');");
  476. //切换到弹出的导出报表窗口,点击导出按钮
  477. driver.SwitchTo().DefaultContent();
  478. var ihg_export = waitGetElementByName(wait, "ihg_export"); //driver.FindElement(By.Name("ihg_export"));
  479. driver.SwitchTo().Frame(ihg_export);
  480. waitGetElementById(wait, "btnSubmit").Click();
  481. //driver.FindElement(By.Id("btnSubmit")).Click();
  482. WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5));
  483. }
  484. catch (Exception ex)
  485. {
  486. throw new Exception(ex.Message);
  487. }
  488. finally
  489. {
  490. driver.Quit();
  491. driver.Dispose();
  492. killChromProcess();
  493. }
  494. }
  495. }
  496. private static void Log(string strMessage)
  497. {
  498. StreamWriter sw = File.AppendText("c:\\temp\\log.txt");
  499. sw.WriteLine($"{strMessage}");
  500. sw.Flush();
  501. sw.Close();
  502. sw.Dispose();
  503. }
  504. private static OpenQA.Selenium.Chrome.ChromeDriver CreateChromeDriver()
  505. {
  506. bool isheadless = (ConfigHelper.GetSectionValue("IPEasySetting:isHeadless") == "true");
  507. var options = new OpenQA.Selenium.Chrome.ChromeOptions();
  508. options.AddUserProfilePreference("profile.default_content_settings.popups", 0);
  509. options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
  510. options.AddUserProfilePreference("download.prompt_for_download", false); // 禁止下载提示
  511. options.AddUserProfilePreference("download.default_directory", strFileSavePath);
  512. options.AddUserProfilePreference("intl.accept_languages", "nl");
  513. options.AddUserProfilePreference("disable-popup-blocking", "true");
  514. options.AddUserProfilePreference("safebrowsing.enabled", true);
  515. options.AddArgument($"--unsafely-treat-insecure-origin-as-secure={ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb").Replace("/Login.aspx", "")}");//替换自己的域名,多域名可用逗号分隔。
  516. if (isheadless)
  517. {
  518. options.AddArgument("headless");
  519. }
  520. var driver = new OpenQA.Selenium.Chrome.ChromeDriver(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"), options);
  521. driver.Manage().Window.Maximize();
  522. driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50);
  523. driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(100);
  524. return driver;
  525. }
  526. /// <summary>
  527. /// 根据报表名称导出报表
  528. /// </summary>
  529. /// <param name="ReportName">报告名称</param>
  530. /// <param name="isModifyDate">是否手动修改日期范围</param>
  531. public static DataTable DownloadReport(string ReportName,bool isModifyDate)
  532. {
  533. Log($"{DateTime.Now}\t开始下载:{ReportName}");
  534. DataTable retDatatable;
  535. Log($"{DateTime.Now}\t开始启动Chrome");
  536. using (IWebDriver driver = CreateChromeDriver())
  537. {
  538. try
  539. {
  540. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  541. Login(driver, wait);
  542. //点击顶部菜单栏中的报表管理菜单
  543. Log($"{DateTime.Now}\t点击顶部菜单栏中的报表管理菜单");
  544. var reportMenu = waitGetElementByName(wait, "970d33d5-c728-41b8-a060-4330610706b9");
  545. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9"));
  546. driver.ExecuteJavaScript("arguments[0].click();", reportMenu);
  547. //点击左侧 自定义报表 菜单
  548. Log($"{DateTime.Now}\t点击左侧 自定义报表 菜单");
  549. var customerReportMenu = waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b");
  550. driver.ExecuteJavaScript("arguments[0].click();", customerReportMenu);
  551. //切换到自定义报表Frame
  552. Log($"{DateTime.Now}\t切换到自定义报表Frame");
  553. driver.SwitchTo().Frame(1);
  554. Log($"{DateTime.Now}\t开始搜索报告");
  555. var inputSearch = waitGetElementById(wait,"customizedList_TxtSheetSearchKey");
  556. Log($"{DateTime.Now}\t在搜索框中输入报告名称");
  557. inputSearch.SendKeys(ReportName);
  558. Log($"{DateTime.Now}\t点击搜索按钮");
  559. var btnSearch = waitGetElementByClassName(wait,"btn-search");
  560. btnSearch.Click();
  561. Log($"{DateTime.Now}\t选中报告");
  562. var reportRecord = wait.Until((d) =>
  563. {
  564. try
  565. {
  566. return d.FindElement(By.XPath($"//td[contains(text(),'{ReportName}')]"));
  567. }
  568. catch
  569. {
  570. return null;
  571. }
  572. });
  573. reportRecord.Click();
  574. if (isModifyDate)
  575. {
  576. Log($"{DateTime.Now}\t点击编辑");
  577. var btnEdit = waitGetElementByClassName(wait,"edit");
  578. btnEdit.Click();
  579. Log($"{DateTime.Now}\t清除以选择的处理事项完成日条件");
  580. try
  581. {
  582. var doItemFinished = wait.Until((d) => {
  583. return d.FindElement(By.XPath("//span[contains(@objcvalue,'_date') and contains(@id,'ST;')]"));
  584. });
  585. doItemFinished.Click();
  586. }
  587. catch { }
  588. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  589. var startDate = wait.Until((d) => {
  590. return d.FindElement(By.XPath("//input[contains(@id,'dt_s_')]"));
  591. });
  592. startDate.Click();
  593. startDate.SendKeys(new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1).ToString("yyyy-MM-dd"));
  594. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  595. var endDate = wait.Until((d) =>
  596. {
  597. try
  598. {
  599. return d.FindElement(By.XPath("//input[contains(@id,'dt_e_')]"));//.Id("dt_e_4F8FE88D-9040-45F1-9723-45699BCD4CAF"));
  600. }
  601. catch
  602. {
  603. return null;
  604. }
  605. });
  606. endDate.Click();
  607. endDate.SendKeys(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1).ToString("yyyy-MM-dd"));
  608. Log($"{DateTime.Now}\t添加处理事项检索条件");
  609. var addDate = wait.Until((d) =>
  610. {
  611. try
  612. {
  613. return d.FindElement(By.XPath("//a[contains(@onclick,'ReportSub.ConditionDTSelect')]"));
  614. }
  615. catch
  616. {
  617. return null;
  618. }
  619. });
  620. addDate.Click();
  621. //System.Threading.Thread.Sleep(500);
  622. Log($"{DateTime.Now}\t保存检索条件");
  623. var btnSave = waitGetElementById(wait, "save"); // driver.FindElement(By.Id("save"));
  624. btnSave.Click();
  625. //System.Threading.Thread.Sleep(3000);
  626. }
  627. Log($"{DateTime.Now}\t点击导出Excel链接");
  628. var linkExport = wait.Until((d) =>
  629. {
  630. try
  631. {
  632. return d.FindElement(By.XPath("//a[contains(@onclick,'-') and @class='tbexcel']"));
  633. }
  634. catch
  635. {
  636. return null;
  637. }
  638. });
  639. linkExport.Click();
  640. //切换到弹出的导出报表窗口,点击导出按钮
  641. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  642. driver.SwitchTo().DefaultContent();
  643. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  644. driver.SwitchTo().Frame(ihg_export);
  645. waitGetElementById(wait, "btnSubmit").Click();
  646. //切换到弹出的下载报表界面,点击下载按钮
  647. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  648. //System.Threading.Thread.Sleep(3000);
  649. driver.SwitchTo().DefaultContent();
  650. var frameDownload = waitGetElementByName(wait,"DownloadList");
  651. driver.SwitchTo().Frame(frameDownload);
  652. var firstTr = waitGetElementByTagName(wait,"tr");
  653. var tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  654. string strStatus = tdStatus.Text;
  655. while (strStatus.Trim() != "导出成功!")
  656. {
  657. if (strStatus.Trim() == "导出失败,请稍后重试!")
  658. {
  659. return null;
  660. }
  661. System.Threading.Thread.Sleep(5000);
  662. firstTr = waitGetElementByTagName(wait, "tr");
  663. tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  664. strStatus = tdStatus.Text;
  665. }
  666. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  667. firstTr = waitGetElementByTagName(wait, "tr");
  668. firstTr.FindElement(By.XPath(".//td/a[@title='下载']")).Click();
  669. //System.Threading.Thread.Sleep(5000);
  670. //btnDownload.Click();
  671. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  672. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5));
  673. //删除下载记录
  674. Log($"{DateTime.Now}\t删除下载记录");
  675. firstTr = waitGetElementByTagName(wait, "tr");// driver.FindElement(By.TagName("tr"));
  676. firstTr.FindElement(By.XPath(".//td/a[@title='删除']")).Click();
  677. //System.IO.FileInfo file = new System.IO.FileInfo(strFilePath.Replace("~", "_"));
  678. retDatatable = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true);
  679. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  680. }
  681. catch (Exception ex)
  682. {
  683. Log(ex.ToString());
  684. throw new Exception(ex.Message, ex);
  685. }
  686. finally
  687. {
  688. Log("关闭Chrome");
  689. driver.Quit();
  690. driver.Dispose();
  691. killChromProcess();
  692. }
  693. }
  694. Log($"{DateTime.Now}\t返回数据");
  695. return retDatatable;
  696. }
  697. /// <summary>
  698. /// 获取案件基本信息
  699. /// </summary>
  700. /// <param name="caseNo">我方文号</param>
  701. /// <returns></returns>
  702. public static dynamic GetCaseInfo(string caseNo)
  703. {
  704. dynamic retObject = new ExpandoObject();
  705. retObject.CaseNo = caseNo.Trim();
  706. using (IWebDriver driver = CreateChromeDriver())
  707. {
  708. try
  709. {
  710. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  711. Login(driver, wait);
  712. //点击顶部菜单栏中的案件管理菜单
  713. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  714. //点击左侧 查询 菜单
  715. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  716. //切换到自定义报表Frame
  717. driver.SwitchTo().Frame(1);
  718. var inputSearch = waitGetElementById(wait,"case_volume");
  719. inputSearch.SendKeys(caseNo.Trim());
  720. var btnSearch = waitGetElementById(wait, "btn_Search");
  721. btnSearch.Click();
  722. var caseLink = wait.Until((d) => {
  723. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  724. });
  725. caseLink.Click();
  726. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  727. //等待页面上ID属性值为submitButton的元素加载完成
  728. IWebElement myElement = wait.Until((d) =>
  729. {
  730. try
  731. {
  732. return d.FindElement(By.Id("libase"));
  733. }
  734. catch {
  735. return null;
  736. }
  737. });
  738. myElement.Click();
  739. //driver.FindElement(By.Id("libase")).Click();
  740. retObject.CaseName = driver.FindElement(By.Id("p_case_info__case_name")).GetAttribute("value"); //案件名称
  741. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  742. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  743. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  744. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  745. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  746. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  747. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  748. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  749. //select[@id='p_case_info__case_coefficient_id']
  750. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  751. }
  752. catch (Exception ex)
  753. {
  754. throw new Exception(ex.Message, ex);
  755. }
  756. finally
  757. {
  758. driver.Quit();
  759. killChromProcess();
  760. }
  761. }
  762. return retObject;
  763. }
  764. public static dynamic GetPerformanceRecord(string caseNo, List<string> doItemNames)
  765. {
  766. dynamic retObject = new ExpandoObject();
  767. retObject.CaseNo = caseNo.Trim();
  768. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  769. {
  770. Service.Start();
  771. using (IWebDriver driver = CreateChromeDriver())
  772. {
  773. try
  774. {
  775. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  776. Login(driver,wait);
  777. //点击顶部菜单栏中的案件管理菜单
  778. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  779. //点击左侧 查询 菜单
  780. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  781. driver.SwitchTo().Frame(1);
  782. var inputSearch = wait.Until((d) =>
  783. {
  784. try
  785. {
  786. //切换到自定义报表Frame
  787. return d.FindElement(By.Id("case_volume"));
  788. }
  789. catch
  790. {
  791. return null;
  792. }
  793. });
  794. inputSearch.SendKeys(caseNo.Trim());
  795. var btnSearch = waitGetElementById(wait,"btn_Search");
  796. btnSearch.Click();
  797. var caseLink = wait.Until((d) =>
  798. {
  799. try
  800. {
  801. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  802. }
  803. catch
  804. {
  805. return null;
  806. }
  807. });
  808. caseLink = driver.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  809. caseLink.Click();
  810. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  811. IWebElement temDoItemLink = null;
  812. string temFinishedDate = "";
  813. foreach (string doItemName in doItemNames)
  814. {
  815. var DoItemLinks = wait.Until((d) =>
  816. {
  817. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  818. });
  819. if (DoItemLinks.Count > 0)
  820. {
  821. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  822. if (string.IsNullOrEmpty(temFinishedDate))
  823. {
  824. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  825. temDoItemLink = DoItemLink;
  826. }
  827. else
  828. {
  829. if (DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text.CompareTo(temFinishedDate) > 0)
  830. {
  831. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  832. temDoItemLink = DoItemLink;
  833. }
  834. }
  835. }
  836. }
  837. if(temDoItemLink != null)
  838. {
  839. retObject.CaseStage = temDoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  840. retObject.DoItemState = temDoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  841. retObject.InternalDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  842. retObject.CustomerLimitDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  843. retObject.FinishedDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  844. retObject.DoPersons = temDoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  845. retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  846. retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  847. retObject.DoItem = temDoItemLink.Text;
  848. //temDoItemLink = DoItemLink;
  849. temDoItemLink.Click();
  850. }
  851. else
  852. {
  853. throw new ApplicationException("处理事项不存在!");
  854. }
  855. var p_proc_finish_doc_date = wait.Until((d) =>
  856. {
  857. try
  858. {
  859. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  860. }
  861. catch
  862. {
  863. return null;
  864. }
  865. });
  866. //System.Threading.Thread.Sleep(500);
  867. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  868. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  869. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  870. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  871. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  872. driver.FindElement(By.Id("libase")).Click();
  873. var p_case_info__case_name = wait.Until((d) =>
  874. {
  875. try
  876. {
  877. return d.FindElement(By.Id("p_case_info__case_name"));
  878. }
  879. catch
  880. {
  881. return null;
  882. }
  883. });
  884. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  885. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  886. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  887. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  888. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  889. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  890. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  891. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  892. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  893. //select[@id='p_case_info__case_coefficient_id']
  894. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  895. }
  896. catch (Exception ex)
  897. {
  898. throw new Exception(ex.Message, ex);
  899. }
  900. finally
  901. {
  902. driver.Quit();
  903. killChromProcess();
  904. }
  905. }
  906. Service.Dispose();
  907. }
  908. return retObject;
  909. }
  910. /// <summary>
  911. /// 获取案件处理事项记录
  912. /// </summary>
  913. /// <param name="caseNo">我方文号</param>
  914. /// <param name="doItemName">处理事项</param>
  915. /// <returns></returns>
  916. public static dynamic GetPerformanceRecord(string caseNo,string doItemName,string caseStage=null)
  917. {
  918. if (caseNo.StartsWith("APCN"))
  919. {
  920. //商标
  921. return GetAPCNPerformanceRecord(caseNo, doItemName, caseStage);
  922. }
  923. dynamic retObject = new ExpandoObject();
  924. retObject.CaseNo = caseNo.Trim();
  925. retObject.DoItem = doItemName;
  926. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  927. {
  928. Service.Start();
  929. using (IWebDriver driver = CreateChromeDriver())
  930. {
  931. try
  932. {
  933. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  934. Login(driver, wait);
  935. //点击顶部菜单栏中的案件管理菜单
  936. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  937. //点击左侧 查询 菜单
  938. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  939. driver.SwitchTo().Frame(1);
  940. var inputSearch = wait.Until((d) =>
  941. {
  942. try
  943. {
  944. return d.FindElement(By.Id("case_volume"));
  945. }
  946. catch
  947. {
  948. return null;
  949. }
  950. });
  951. inputSearch.SendKeys(caseNo.Trim());
  952. var btnSearch = waitGetElementById(wait,"btn_Search");
  953. btnSearch.Click();
  954. var caseLink = wait.Until((d) =>
  955. {
  956. try
  957. {
  958. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  959. }
  960. catch
  961. {
  962. return null;
  963. }
  964. });
  965. caseLink.Click();
  966. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  967. var DoItemLinks = wait.Until((d) => {
  968. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  969. });
  970. if (DoItemLinks.Count > 0)
  971. {
  972. if (!string.IsNullOrEmpty(caseStage))
  973. {
  974. foreach (var DoItemLink in DoItemLinks)
  975. {
  976. var temCaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text;
  977. if (temCaseStage == caseStage)
  978. {
  979. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  980. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  981. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  982. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  983. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  984. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  985. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  986. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  987. DoItemLink.Click();
  988. break;
  989. }
  990. }
  991. }
  992. else
  993. {
  994. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  995. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  996. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  997. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  998. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  999. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1000. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1001. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1002. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1003. DoItemLink.Click();
  1004. }
  1005. }
  1006. var p_proc_finish_doc_date = wait.Until((d) =>
  1007. {
  1008. try
  1009. {
  1010. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1011. }
  1012. catch
  1013. {
  1014. return null;
  1015. }
  1016. });
  1017. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1018. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1019. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1020. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1021. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1022. waitGetElementById(wait, "libase").Click();
  1023. var p_case_info__case_name = wait.Until((d) =>
  1024. {
  1025. try
  1026. {
  1027. return d.FindElement(By.Id("p_case_info__case_name"));
  1028. }
  1029. catch
  1030. {
  1031. return null;
  1032. }
  1033. });
  1034. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1035. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1036. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1037. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1038. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1039. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1040. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1041. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1042. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1043. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1044. }
  1045. catch (Exception ex)
  1046. {
  1047. throw new Exception(ex.Message, ex);
  1048. }
  1049. finally
  1050. {
  1051. driver.Quit();
  1052. killChromProcess();
  1053. }
  1054. }
  1055. Service.Dispose();
  1056. }
  1057. return retObject;
  1058. }
  1059. private static dynamic GetAPCNPerformanceRecord(string caseNo, string doItemName, string caseStage = null)
  1060. {
  1061. dynamic retObject = new ExpandoObject();
  1062. retObject.CaseNo = caseNo.Trim();
  1063. retObject.DoItem = doItemName;
  1064. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1065. {
  1066. Service.Start();
  1067. using (IWebDriver driver = CreateChromeDriver())
  1068. {
  1069. try
  1070. {
  1071. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1072. Login(driver, wait);
  1073. //点击顶部菜单栏中的案件管理菜单
  1074. driver.FindElement(By.Name("71A7CC35-F597-40E1-9FEF-BE622A3A3B63")).Click();
  1075. System.Threading.Thread.Sleep(500);
  1076. //点击左侧 查询 菜单
  1077. driver.FindElement(By.Name("FF4E1FF9-FE36-4F0F-99DF-81E60817722E")).Click();
  1078. driver.SwitchTo().Frame(1);
  1079. var inputSearch = wait.Until((d) =>
  1080. {
  1081. try
  1082. {
  1083. //切换到自定义报表Frame
  1084. return d.FindElement(By.Id("case_volume"));
  1085. }
  1086. catch
  1087. {
  1088. return null;
  1089. }
  1090. });
  1091. inputSearch.SendKeys(caseNo.Trim());
  1092. var btnSearch = waitGetElementById(wait,"btn_Search");
  1093. btnSearch.Click();
  1094. var caseLink = wait.Until((d) =>
  1095. {
  1096. try
  1097. {
  1098. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1099. }
  1100. catch
  1101. {
  1102. return null;
  1103. }
  1104. });
  1105. caseLink.Click();
  1106. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1107. var DoItemLinks = wait.Until((d) => {
  1108. return driver.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1109. });
  1110. if (DoItemLinks.Count > 0)
  1111. {
  1112. if (!string.IsNullOrEmpty(caseStage))
  1113. {
  1114. foreach (var DoItemLink in DoItemLinks)
  1115. {
  1116. var temCaseStage = wait.Until((d) => {
  1117. return DoItemLink.FindElement(By.XPath("following-sibling::td[1]"));
  1118. }).Text;
  1119. if (temCaseStage == caseStage)
  1120. {
  1121. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1122. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1123. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1124. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1125. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1126. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1127. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1128. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1129. DoItemLink.Click();
  1130. //driver.ExecuteJavaScript("$(arguments[0]).click()", DoItemLink);
  1131. break;
  1132. }
  1133. }
  1134. }
  1135. else
  1136. {
  1137. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1138. //retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1139. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态
  1140. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限
  1141. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限
  1142. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日
  1143. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人
  1144. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注
  1145. //retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1146. DoItemLink.Click();
  1147. //new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(DoItemLink)).Click();
  1148. }
  1149. }
  1150. var p_proc_finish_doc_date = wait.Until((d) =>
  1151. {
  1152. try
  1153. {
  1154. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1155. }
  1156. catch
  1157. {
  1158. return null;
  1159. }
  1160. });
  1161. //System.Threading.Thread.Sleep(500);
  1162. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1163. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1164. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1165. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1166. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1167. waitGetElementById(wait,"libase").Click();
  1168. var p_case_info__case_name = wait.Until((d) =>
  1169. {
  1170. try
  1171. {
  1172. return d.FindElement(By.Id("p_case_info__case_name"));
  1173. }
  1174. catch
  1175. {
  1176. return null;
  1177. }
  1178. });
  1179. //System.Threading.Thread.Sleep(500);
  1180. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1181. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1182. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1183. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1184. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1185. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1186. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1187. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1188. //driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1189. //select[@id='p_case_info__case_coefficient_id']
  1190. //retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1191. }
  1192. catch (Exception ex)
  1193. {
  1194. throw new Exception(ex.Message, ex);
  1195. }
  1196. finally
  1197. {
  1198. driver.Quit();
  1199. killChromProcess();
  1200. }
  1201. }
  1202. Service.Dispose();
  1203. }
  1204. return retObject;
  1205. }
  1206. private static void killChromProcess()
  1207. {
  1208. try
  1209. {
  1210. Process[] workers = Process.GetProcessesByName("Chrome");
  1211. foreach (Process worker in workers)
  1212. {
  1213. worker.Kill();
  1214. worker.WaitForExit();
  1215. worker.Dispose();
  1216. }
  1217. workers = Process.GetProcessesByName("Chromedriver");
  1218. foreach (Process worker in workers)
  1219. {
  1220. worker.Kill();
  1221. worker.WaitForExit();
  1222. worker.Dispose();
  1223. }
  1224. }
  1225. catch { }
  1226. }
  1227. private static string GetSelectText(IWebElement element)
  1228. {
  1229. var strValue = element.GetAttribute("value");
  1230. if (string.IsNullOrEmpty(strValue))
  1231. {
  1232. return null;
  1233. }
  1234. var ops = element.FindElements(By.TagName("option"));
  1235. foreach (var op in ops)
  1236. {
  1237. if (op.GetAttribute("value") == strValue)
  1238. {
  1239. return op.Text;
  1240. }
  1241. }
  1242. return null;
  1243. }
  1244. }
  1245. }