IPEasyUtility.cs 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632
  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. //“新申请第一次内审(初稿)、
  289. //新申请第一次返稿(第一次发客户文档)、
  290. //新申请文档(定稿文档)”
  291. var table_filelist = waitGetElementById(wait, "table_filelist");
  292. //定稿文件
  293. try
  294. {
  295. Download(retObject, driver, wait, table_filelist, "新申请文档");
  296. }
  297. catch { }
  298. //新申请第一次返稿文件
  299. try
  300. {
  301. Download(retObject, driver, wait, table_filelist, "新申请第一次返稿");
  302. }
  303. catch { }
  304. //初稿文件
  305. try
  306. {
  307. waitGetElementById(wait, "draftfiletoggle").Click();
  308. var table_draffilelist = waitGetElementById(wait, "table_draftfilelist");// driver.FindElement(By.Id("table_draftfilelist"));
  309. Download(retObject, driver, wait, table_draffilelist, "新申请第一次内审");
  310. }
  311. catch { }
  312. }
  313. catch (Exception ex)
  314. {
  315. throw new Exception(ex.Message, ex);
  316. }
  317. finally
  318. {
  319. driver.Quit();
  320. killChromProcess();
  321. }
  322. }
  323. return retObject;
  324. }
  325. /// <summary>
  326. /// 获取当前为递交中或前一天完成的新申请案件清单
  327. /// </summary>
  328. /// <param name="type">类型0:递交中、1:前一天完成</param>
  329. /// <returns></returns>
  330. /// <exception cref="Exception"></exception>
  331. public static DataTable GetFinished3FilesCases(int type)
  332. {
  333. DataTable retObject = new DataTable();
  334. using (IWebDriver driver = CreateChromeDriver())
  335. {
  336. try
  337. {
  338. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
  339. Login(driver, wait);
  340. //点击顶部菜单栏中的案件管理菜单
  341. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  342. linkCaseManager.Click();
  343. IWebElement linkCaseSearch = wait.Until((d) =>
  344. {
  345. try
  346. {
  347. return driver.FindElement(By.LinkText("案件查询"));
  348. }
  349. catch
  350. {
  351. return null;
  352. }
  353. });
  354. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  355. //linkCaseSearch.Click();
  356. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  357. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  358. //patentSearch.Click();
  359. driver.SwitchTo().Frame(1);
  360. #region 添加检索条件
  361. var chkDoItem = waitGetElementById(wait, "is_proc");
  362. chkDoItem.Click();
  363. var ictrlproc = waitGetElementById(wait, "i_ctrl_proc");
  364. ictrlproc.Click();
  365. var chkXSQ = waitGetElementById(wait, "ctrl_proc_id_3_check");
  366. chkXSQ.Click();
  367. var btnOk = waitGetElementById(wait, "ctrl_proc_ida_ok");
  368. btnOk.Click();
  369. waitGetElementById(wait,"proc_status").Click();
  370. if (type == 0)
  371. {
  372. waitGetElementById(wait, "procstatus_5_check").Click();
  373. waitGetElementById(wait, "procstatusa_ok").Click() ;
  374. }
  375. else
  376. {
  377. if(type == 1)
  378. {
  379. waitGetElementById(wait, "procstatus_12_check").Click();
  380. waitGetElementById(wait, "procstatusa_ok").Click();
  381. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  382. var startDate = wait.Until((d) => {
  383. return d.FindElement(By.Id("finish_date_start"));
  384. });
  385. startDate.Click();
  386. startDate.SendKeys(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"));
  387. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  388. var endDate = wait.Until((d) =>
  389. {
  390. try
  391. {
  392. return d.FindElement(By.Id("finish_date_end"));
  393. }
  394. catch
  395. {
  396. return null;
  397. }
  398. });
  399. endDate.Click();
  400. endDate.SendKeys(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"));
  401. }
  402. }
  403. waitGetElementById(wait,"procstatusa_ok").Click();
  404. #endregion
  405. #region 导出检索结果
  406. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  407. driver.ExecuteJavaScript("arguments[0].click();", btnSearch);
  408. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  409. var btnExport = waitGetElementById(wait, "btn_Export");
  410. driver.ExecuteJavaScript("arguments[0].click();", btnExport);
  411. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  412. driver.SwitchTo().DefaultContent();
  413. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  414. driver.SwitchTo().Frame(ihg_export);
  415. waitGetElementById(wait, "btnSubmit").Click();
  416. //切换到弹出的下载报表界面,点击下载按钮
  417. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  418. //System.Threading.Thread.Sleep(3000);
  419. driver.SwitchTo().DefaultContent();
  420. var frameDownload = waitGetElementByName(wait, "DownloadList");
  421. driver.SwitchTo().Frame(frameDownload);
  422. //driver.FindElement(By.CssSelector("table tbody tr:first-child"));
  423. var firstTr = wait.Until((d) => {
  424. return d.FindElement(By.CssSelector("table tbody tr"));
  425. });
  426. var tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  427. string strStatus = tdStatus.Text;
  428. while (strStatus.Trim() != "导出成功!")
  429. {
  430. if (strStatus.Trim() == "导出失败,请稍后重试!")
  431. {
  432. return null;
  433. }
  434. System.Threading.Thread.Sleep(5000);
  435. firstTr = wait.Until((d) => {
  436. return d.FindElement(By.CssSelector("table tbody tr"));
  437. });
  438. tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  439. strStatus = tdStatus.Text;
  440. }
  441. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  442. firstTr = wait.Until((d) => {
  443. return d.FindElement(By.CssSelector("table tbody tr"));
  444. });
  445. wait.Until((d)=>{
  446. return firstTr.FindElement(By.XPath(".//td/a[@title='下载']"));
  447. }).Click();
  448. var ReportName = $"案件清单({DateTime.Now.ToString("yyyy年MM月dd日")})";
  449. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  450. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5));
  451. //删除下载记录
  452. Log($"{DateTime.Now}\t删除下载记录");
  453. firstTr = wait.Until((d) => {
  454. return d.FindElement(By.CssSelector("table tbody tr"));
  455. });
  456. wait.Until((d) => {
  457. return firstTr.FindElement(By.XPath(".//td/a[@title='删除']"));
  458. }).Click();
  459. #endregion
  460. #region 将下载的excel档转换成Datatable
  461. retObject = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true,true,1);
  462. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  463. #endregion
  464. }
  465. catch (Exception ex)
  466. {
  467. throw new Exception(ex.Message, ex);
  468. }
  469. finally
  470. {
  471. driver.Quit();
  472. killChromProcess();
  473. }
  474. }
  475. return retObject;
  476. }
  477. private static void Download(dynamic retObject, IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType)
  478. {
  479. var tBody = waitGetElementByTagName(wait, "tbody", table_filelist);
  480. var finallyFile = wait.Until((d) =>
  481. {
  482. try {
  483. return tBody.FindElement(By.XPath($".//td[@colname='file_desc'][normalize-space()='{fileType}']"));
  484. }
  485. catch
  486. {
  487. return null;
  488. }
  489. });
  490. if(finallyFile == null)
  491. {
  492. switch (fileType)
  493. {
  494. case "新申请文档":
  495. retObject.finallyFile = null;
  496. break;
  497. case "新申请第一次返稿":
  498. retObject.firstReturnFile = null;
  499. break;
  500. case "新申请第一次内审":
  501. retObject.draftFile = null;
  502. break;
  503. }
  504. return;
  505. }
  506. var tdfileName = wait.Until((d) =>
  507. {
  508. try
  509. {
  510. return finallyFile.FindElement(By.XPath("preceding-sibling::*[2]"));
  511. }
  512. catch
  513. {
  514. return null;
  515. }
  516. });
  517. string fileName = tdfileName.Text;
  518. while (string.IsNullOrEmpty(fileName))
  519. {
  520. System.Threading.Thread.Sleep(100);
  521. fileName = tdfileName.Text;
  522. }
  523. string filePath = System.IO.Path.Combine(strFileSavePath, fileName);
  524. if (System.IO.File.Exists(filePath))
  525. {
  526. System.IO.File.Delete(filePath);
  527. }
  528. switch (fileType)
  529. {
  530. case "新申请文档":
  531. retObject.finallyFile = filePath;
  532. break;
  533. case "新申请第一次返稿":
  534. retObject.firstReturnFile = filePath;
  535. break;
  536. case "新申请第一次内审":
  537. retObject.draftFile = filePath;
  538. break;
  539. }
  540. var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]"));
  541. btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload);
  542. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  543. WaitForFileDownload(strFileSavePath, fileName, TimeSpan.FromMinutes(5));
  544. }
  545. private static void Login(IWebDriver driver, WebDriverWait wait)
  546. {
  547. //进入登录界面
  548. driver.Navigate().GoToUrl(ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb"));
  549. //输入用户名和密码
  550. waitGetElementById(wait, "txtUser").SendKeys(Account);
  551. waitGetElementById(wait, "txtPwd").SendKeys(Password);
  552. //点击登录按钮
  553. waitGetElementById(wait, "btnLogin").Click();
  554. //关闭提示遮罩层
  555. waitGetElementById(wait, "jpwClose").Click();
  556. }
  557. public static void DownloadReport(string strId,string filename)
  558. {
  559. using (IWebDriver driver = CreateChromeDriver())
  560. {
  561. try
  562. {
  563. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  564. Login(driver, wait);
  565. //点击顶部菜单栏中的报表管理菜单
  566. waitGetElementById(wait, "970d33d5-c728-41b8-a060-4330610706b9").Click();
  567. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")).Click();
  568. //点击左侧 自定义报表 菜单
  569. waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b").Click();
  570. //driver.FindElement(By.Name("642fa96f-1e1f-46fd-aaa4-cb461ee8df5b")).Click();
  571. //切换到自定义报表Frame
  572. driver.SwitchTo().Frame(1);
  573. //调用报表导出JS
  574. ((IJavaScriptExecutor)driver).ExecuteScript($"Report.Export('{strId}');");
  575. //切换到弹出的导出报表窗口,点击导出按钮
  576. driver.SwitchTo().DefaultContent();
  577. var ihg_export = waitGetElementByName(wait, "ihg_export"); //driver.FindElement(By.Name("ihg_export"));
  578. driver.SwitchTo().Frame(ihg_export);
  579. waitGetElementById(wait, "btnSubmit").Click();
  580. //driver.FindElement(By.Id("btnSubmit")).Click();
  581. WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5));
  582. }
  583. catch (Exception ex)
  584. {
  585. throw new Exception(ex.Message);
  586. }
  587. finally
  588. {
  589. driver.Quit();
  590. driver.Dispose();
  591. killChromProcess();
  592. }
  593. }
  594. }
  595. private static void Log(string strMessage)
  596. {
  597. StreamWriter sw = File.AppendText("c:\\temp\\log.txt");
  598. sw.WriteLine($"{strMessage}");
  599. sw.Flush();
  600. sw.Close();
  601. sw.Dispose();
  602. }
  603. private static OpenQA.Selenium.Chrome.ChromeDriver CreateChromeDriver()
  604. {
  605. bool isheadless = (ConfigHelper.GetSectionValue("IPEasySetting:isHeadless") == "true");
  606. var options = new OpenQA.Selenium.Chrome.ChromeOptions();
  607. options.AddUserProfilePreference("profile.default_content_settings.popups", 0);
  608. options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
  609. options.AddUserProfilePreference("download.prompt_for_download", false); // 禁止下载提示
  610. options.AddUserProfilePreference("download.default_directory", strFileSavePath);
  611. options.AddUserProfilePreference("intl.accept_languages", "nl");
  612. options.AddUserProfilePreference("disable-popup-blocking", "true");
  613. options.AddUserProfilePreference("safebrowsing.enabled", true);
  614. options.AddArgument($"--unsafely-treat-insecure-origin-as-secure={ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb").Replace("/Login.aspx", "")}");//替换自己的域名,多域名可用逗号分隔。
  615. if (isheadless)
  616. {
  617. options.AddArgument("headless");
  618. }
  619. var driver = new OpenQA.Selenium.Chrome.ChromeDriver(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"), options);
  620. driver.Manage().Window.Maximize();
  621. driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50);
  622. driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(100);
  623. return driver;
  624. }
  625. /// <summary>
  626. /// 根据报表名称导出报表
  627. /// </summary>
  628. /// <param name="ReportName">报告名称</param>
  629. /// <param name="isModifyDate">是否手动修改日期范围</param>
  630. public static DataTable DownloadReport(string ReportName,bool isModifyDate)
  631. {
  632. Log($"{DateTime.Now}\t开始下载:{ReportName}");
  633. DataTable retDatatable;
  634. Log($"{DateTime.Now}\t开始启动Chrome");
  635. using (IWebDriver driver = CreateChromeDriver())
  636. {
  637. try
  638. {
  639. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  640. Login(driver, wait);
  641. //点击顶部菜单栏中的报表管理菜单
  642. Log($"{DateTime.Now}\t点击顶部菜单栏中的报表管理菜单");
  643. var reportMenu = waitGetElementByName(wait, "970d33d5-c728-41b8-a060-4330610706b9");
  644. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9"));
  645. driver.ExecuteJavaScript("arguments[0].click();", reportMenu);
  646. //点击左侧 自定义报表 菜单
  647. Log($"{DateTime.Now}\t点击左侧 自定义报表 菜单");
  648. var customerReportMenu = waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b");
  649. driver.ExecuteJavaScript("arguments[0].click();", customerReportMenu);
  650. //切换到自定义报表Frame
  651. Log($"{DateTime.Now}\t切换到自定义报表Frame");
  652. driver.SwitchTo().Frame(1);
  653. Log($"{DateTime.Now}\t开始搜索报告");
  654. var inputSearch = waitGetElementById(wait,"customizedList_TxtSheetSearchKey");
  655. Log($"{DateTime.Now}\t在搜索框中输入报告名称");
  656. inputSearch.SendKeys(ReportName);
  657. Log($"{DateTime.Now}\t点击搜索按钮");
  658. var btnSearch = waitGetElementByClassName(wait,"btn-search");
  659. btnSearch.Click();
  660. Log($"{DateTime.Now}\t选中报告");
  661. var reportRecord = wait.Until((d) =>
  662. {
  663. try
  664. {
  665. return d.FindElement(By.XPath($"//td[contains(text(),'{ReportName}')]"));
  666. }
  667. catch
  668. {
  669. return null;
  670. }
  671. });
  672. reportRecord.Click();
  673. if (isModifyDate)
  674. {
  675. Log($"{DateTime.Now}\t点击编辑");
  676. var btnEdit = waitGetElementByClassName(wait,"edit");
  677. btnEdit.Click();
  678. Log($"{DateTime.Now}\t清除以选择的处理事项完成日条件");
  679. try
  680. {
  681. var doItemFinished = wait.Until((d) => {
  682. return d.FindElement(By.XPath("//span[contains(@objcvalue,'_date') and contains(@id,'ST;')]"));
  683. });
  684. doItemFinished.Click();
  685. }
  686. catch { }
  687. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  688. var startDate = wait.Until((d) => {
  689. return d.FindElement(By.XPath("//input[contains(@id,'dt_s_')]"));
  690. });
  691. startDate.Click();
  692. startDate.SendKeys(new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1).ToString("yyyy-MM-dd"));
  693. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  694. var endDate = wait.Until((d) =>
  695. {
  696. try
  697. {
  698. return d.FindElement(By.XPath("//input[contains(@id,'dt_e_')]"));//.Id("dt_e_4F8FE88D-9040-45F1-9723-45699BCD4CAF"));
  699. }
  700. catch
  701. {
  702. return null;
  703. }
  704. });
  705. endDate.Click();
  706. endDate.SendKeys(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1).ToString("yyyy-MM-dd"));
  707. Log($"{DateTime.Now}\t添加处理事项检索条件");
  708. var addDate = wait.Until((d) =>
  709. {
  710. try
  711. {
  712. return d.FindElement(By.XPath("//a[contains(@onclick,'ReportSub.ConditionDTSelect')]"));
  713. }
  714. catch
  715. {
  716. return null;
  717. }
  718. });
  719. addDate.Click();
  720. //System.Threading.Thread.Sleep(500);
  721. Log($"{DateTime.Now}\t保存检索条件");
  722. var btnSave = waitGetElementById(wait, "save"); // driver.FindElement(By.Id("save"));
  723. btnSave.Click();
  724. //System.Threading.Thread.Sleep(3000);
  725. }
  726. Log($"{DateTime.Now}\t点击导出Excel链接");
  727. var linkExport = wait.Until((d) =>
  728. {
  729. try
  730. {
  731. return d.FindElement(By.XPath("//a[contains(@onclick,'-') and @class='tbexcel']"));
  732. }
  733. catch
  734. {
  735. return null;
  736. }
  737. });
  738. linkExport.Click();
  739. //切换到弹出的导出报表窗口,点击导出按钮
  740. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  741. driver.SwitchTo().DefaultContent();
  742. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  743. driver.SwitchTo().Frame(ihg_export);
  744. waitGetElementById(wait, "btnSubmit").Click();
  745. //切换到弹出的下载报表界面,点击下载按钮
  746. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  747. //System.Threading.Thread.Sleep(3000);
  748. driver.SwitchTo().DefaultContent();
  749. var frameDownload = waitGetElementByName(wait,"DownloadList");
  750. driver.SwitchTo().Frame(frameDownload);
  751. var firstTr = waitGetElementByTagName(wait,"tr");
  752. var tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  753. string strStatus = tdStatus.Text;
  754. while (strStatus.Trim() != "导出成功!")
  755. {
  756. if (strStatus.Trim() == "导出失败,请稍后重试!")
  757. {
  758. return null;
  759. }
  760. System.Threading.Thread.Sleep(5000);
  761. firstTr = waitGetElementByTagName(wait, "tr");
  762. tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  763. strStatus = tdStatus.Text;
  764. }
  765. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  766. firstTr = waitGetElementByTagName(wait, "tr");
  767. firstTr.FindElement(By.XPath(".//td/a[@title='下载']")).Click();
  768. //System.Threading.Thread.Sleep(5000);
  769. //btnDownload.Click();
  770. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  771. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5));
  772. //删除下载记录
  773. Log($"{DateTime.Now}\t删除下载记录");
  774. firstTr = waitGetElementByTagName(wait, "tr");// driver.FindElement(By.TagName("tr"));
  775. firstTr.FindElement(By.XPath(".//td/a[@title='删除']")).Click();
  776. //System.IO.FileInfo file = new System.IO.FileInfo(strFilePath.Replace("~", "_"));
  777. retDatatable = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true);
  778. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  779. }
  780. catch (Exception ex)
  781. {
  782. Log(ex.ToString());
  783. throw new Exception(ex.Message, ex);
  784. }
  785. finally
  786. {
  787. Log("关闭Chrome");
  788. driver.Quit();
  789. driver.Dispose();
  790. killChromProcess();
  791. }
  792. }
  793. Log($"{DateTime.Now}\t返回数据");
  794. return retDatatable;
  795. }
  796. /// <summary>
  797. /// 获取案件基本信息
  798. /// </summary>
  799. /// <param name="caseNo">我方文号</param>
  800. /// <returns></returns>
  801. public static dynamic GetCaseInfo(string caseNo)
  802. {
  803. dynamic retObject = new ExpandoObject();
  804. retObject.CaseNo = caseNo.Trim();
  805. using (IWebDriver driver = CreateChromeDriver())
  806. {
  807. try
  808. {
  809. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  810. Login(driver, wait);
  811. //点击顶部菜单栏中的案件管理菜单
  812. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  813. //点击左侧 查询 菜单
  814. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  815. //切换到自定义报表Frame
  816. driver.SwitchTo().Frame(1);
  817. var inputSearch = waitGetElementById(wait,"case_volume");
  818. inputSearch.SendKeys(caseNo.Trim());
  819. var btnSearch = waitGetElementById(wait, "btn_Search");
  820. btnSearch.Click();
  821. var caseLink = wait.Until((d) => {
  822. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  823. });
  824. caseLink.Click();
  825. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  826. //等待页面上ID属性值为submitButton的元素加载完成
  827. IWebElement myElement = wait.Until((d) =>
  828. {
  829. try
  830. {
  831. return d.FindElement(By.Id("libase"));
  832. }
  833. catch {
  834. return null;
  835. }
  836. });
  837. myElement.Click();
  838. //driver.FindElement(By.Id("libase")).Click();
  839. retObject.CaseName = driver.FindElement(By.Id("p_case_info__case_name")).GetAttribute("value"); //案件名称
  840. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  841. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  842. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  843. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  844. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  845. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  846. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  847. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  848. //select[@id='p_case_info__case_coefficient_id']
  849. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  850. }
  851. catch (Exception ex)
  852. {
  853. throw new Exception(ex.Message, ex);
  854. }
  855. finally
  856. {
  857. driver.Quit();
  858. killChromProcess();
  859. }
  860. }
  861. return retObject;
  862. }
  863. public static dynamic GetPerformanceRecord(string caseNo, List<string> doItemNames)
  864. {
  865. dynamic retObject = new ExpandoObject();
  866. retObject.CaseNo = caseNo.Trim();
  867. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  868. {
  869. Service.Start();
  870. using (IWebDriver driver = CreateChromeDriver())
  871. {
  872. try
  873. {
  874. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  875. Login(driver,wait);
  876. //点击顶部菜单栏中的案件管理菜单
  877. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  878. //点击左侧 查询 菜单
  879. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  880. driver.SwitchTo().Frame(1);
  881. var inputSearch = wait.Until((d) =>
  882. {
  883. try
  884. {
  885. //切换到自定义报表Frame
  886. return d.FindElement(By.Id("case_volume"));
  887. }
  888. catch
  889. {
  890. return null;
  891. }
  892. });
  893. inputSearch.SendKeys(caseNo.Trim());
  894. var btnSearch = waitGetElementById(wait,"btn_Search");
  895. btnSearch.Click();
  896. var caseLink = wait.Until((d) =>
  897. {
  898. try
  899. {
  900. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  901. }
  902. catch
  903. {
  904. return null;
  905. }
  906. });
  907. caseLink = driver.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  908. caseLink.Click();
  909. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  910. IWebElement temDoItemLink = null;
  911. string temFinishedDate = "";
  912. foreach (string doItemName in doItemNames)
  913. {
  914. var DoItemLinks = wait.Until((d) =>
  915. {
  916. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  917. });
  918. if (DoItemLinks.Count > 0)
  919. {
  920. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  921. if (string.IsNullOrEmpty(temFinishedDate))
  922. {
  923. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  924. temDoItemLink = DoItemLink;
  925. }
  926. else
  927. {
  928. if (DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text.CompareTo(temFinishedDate) > 0)
  929. {
  930. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  931. temDoItemLink = DoItemLink;
  932. }
  933. }
  934. }
  935. }
  936. if(temDoItemLink != null)
  937. {
  938. retObject.CaseStage = temDoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  939. retObject.DoItemState = temDoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  940. retObject.InternalDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  941. retObject.CustomerLimitDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  942. retObject.FinishedDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  943. retObject.DoPersons = temDoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  944. retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  945. retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  946. retObject.DoItem = temDoItemLink.Text;
  947. //temDoItemLink = DoItemLink;
  948. temDoItemLink.Click();
  949. }
  950. else
  951. {
  952. throw new ApplicationException("处理事项不存在!");
  953. }
  954. var p_proc_finish_doc_date = wait.Until((d) =>
  955. {
  956. try
  957. {
  958. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  959. }
  960. catch
  961. {
  962. return null;
  963. }
  964. });
  965. //System.Threading.Thread.Sleep(500);
  966. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  967. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  968. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  969. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  970. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  971. driver.FindElement(By.Id("libase")).Click();
  972. var p_case_info__case_name = wait.Until((d) =>
  973. {
  974. try
  975. {
  976. return d.FindElement(By.Id("p_case_info__case_name"));
  977. }
  978. catch
  979. {
  980. return null;
  981. }
  982. });
  983. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  984. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  985. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  986. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  987. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  988. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  989. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  990. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  991. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  992. //select[@id='p_case_info__case_coefficient_id']
  993. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  994. }
  995. catch (Exception ex)
  996. {
  997. throw new Exception(ex.Message, ex);
  998. }
  999. finally
  1000. {
  1001. driver.Quit();
  1002. killChromProcess();
  1003. }
  1004. }
  1005. Service.Dispose();
  1006. }
  1007. return retObject;
  1008. }
  1009. /// <summary>
  1010. /// 获取案件处理事项记录
  1011. /// </summary>
  1012. /// <param name="caseNo">我方文号</param>
  1013. /// <param name="doItemName">处理事项</param>
  1014. /// <returns></returns>
  1015. public static dynamic GetPerformanceRecord(string caseNo,string doItemName,string caseStage=null)
  1016. {
  1017. if (caseNo.StartsWith("APCN"))
  1018. {
  1019. //商标
  1020. return GetAPCNPerformanceRecord(caseNo, doItemName, caseStage);
  1021. }
  1022. dynamic retObject = new ExpandoObject();
  1023. retObject.CaseNo = caseNo.Trim();
  1024. retObject.DoItem = doItemName;
  1025. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1026. {
  1027. Service.Start();
  1028. using (IWebDriver driver = CreateChromeDriver())
  1029. {
  1030. try
  1031. {
  1032. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1033. Login(driver, wait);
  1034. //点击顶部菜单栏中的案件管理菜单
  1035. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  1036. //点击左侧 查询 菜单
  1037. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  1038. driver.SwitchTo().Frame(1);
  1039. var inputSearch = wait.Until((d) =>
  1040. {
  1041. try
  1042. {
  1043. return d.FindElement(By.Id("case_volume"));
  1044. }
  1045. catch
  1046. {
  1047. return null;
  1048. }
  1049. });
  1050. inputSearch.SendKeys(caseNo.Trim());
  1051. var btnSearch = waitGetElementById(wait,"btn_Search");
  1052. btnSearch.Click();
  1053. var caseLink = wait.Until((d) =>
  1054. {
  1055. try
  1056. {
  1057. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1058. }
  1059. catch
  1060. {
  1061. return null;
  1062. }
  1063. });
  1064. caseLink.Click();
  1065. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1066. var DoItemLinks = wait.Until((d) => {
  1067. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1068. });
  1069. if (DoItemLinks.Count > 0)
  1070. {
  1071. if (!string.IsNullOrEmpty(caseStage))
  1072. {
  1073. foreach (var DoItemLink in DoItemLinks)
  1074. {
  1075. var temCaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text;
  1076. if (temCaseStage == caseStage)
  1077. {
  1078. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1079. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1080. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1081. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1082. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1083. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1084. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1085. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1086. DoItemLink.Click();
  1087. break;
  1088. }
  1089. }
  1090. }
  1091. else
  1092. {
  1093. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1094. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1095. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1096. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1097. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1098. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1099. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1100. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1101. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1102. DoItemLink.Click();
  1103. }
  1104. }
  1105. var p_proc_finish_doc_date = wait.Until((d) =>
  1106. {
  1107. try
  1108. {
  1109. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1110. }
  1111. catch
  1112. {
  1113. return null;
  1114. }
  1115. });
  1116. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1117. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1118. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1119. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1120. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1121. waitGetElementById(wait, "libase").Click();
  1122. var p_case_info__case_name = wait.Until((d) =>
  1123. {
  1124. try
  1125. {
  1126. return d.FindElement(By.Id("p_case_info__case_name"));
  1127. }
  1128. catch
  1129. {
  1130. return null;
  1131. }
  1132. });
  1133. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1134. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1135. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1136. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1137. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1138. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1139. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1140. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1141. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1142. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1143. }
  1144. catch (Exception ex)
  1145. {
  1146. throw new Exception(ex.Message, ex);
  1147. }
  1148. finally
  1149. {
  1150. driver.Quit();
  1151. killChromProcess();
  1152. }
  1153. }
  1154. Service.Dispose();
  1155. }
  1156. return retObject;
  1157. }
  1158. private static dynamic GetAPCNPerformanceRecord(string caseNo, string doItemName, string caseStage = null)
  1159. {
  1160. dynamic retObject = new ExpandoObject();
  1161. retObject.CaseNo = caseNo.Trim();
  1162. retObject.DoItem = doItemName;
  1163. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1164. {
  1165. Service.Start();
  1166. using (IWebDriver driver = CreateChromeDriver())
  1167. {
  1168. try
  1169. {
  1170. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1171. Login(driver, wait);
  1172. //点击顶部菜单栏中的案件管理菜单
  1173. driver.FindElement(By.Name("71A7CC35-F597-40E1-9FEF-BE622A3A3B63")).Click();
  1174. System.Threading.Thread.Sleep(500);
  1175. //点击左侧 查询 菜单
  1176. driver.FindElement(By.Name("FF4E1FF9-FE36-4F0F-99DF-81E60817722E")).Click();
  1177. driver.SwitchTo().Frame(1);
  1178. var inputSearch = wait.Until((d) =>
  1179. {
  1180. try
  1181. {
  1182. //切换到自定义报表Frame
  1183. return d.FindElement(By.Id("case_volume"));
  1184. }
  1185. catch
  1186. {
  1187. return null;
  1188. }
  1189. });
  1190. inputSearch.SendKeys(caseNo.Trim());
  1191. var btnSearch = waitGetElementById(wait,"btn_Search");
  1192. btnSearch.Click();
  1193. var caseLink = wait.Until((d) =>
  1194. {
  1195. try
  1196. {
  1197. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1198. }
  1199. catch
  1200. {
  1201. return null;
  1202. }
  1203. });
  1204. caseLink.Click();
  1205. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1206. var DoItemLinks = wait.Until((d) => {
  1207. return driver.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1208. });
  1209. if (DoItemLinks.Count > 0)
  1210. {
  1211. if (!string.IsNullOrEmpty(caseStage))
  1212. {
  1213. foreach (var DoItemLink in DoItemLinks)
  1214. {
  1215. var temCaseStage = wait.Until((d) => {
  1216. return DoItemLink.FindElement(By.XPath("following-sibling::td[1]"));
  1217. }).Text;
  1218. if (temCaseStage == caseStage)
  1219. {
  1220. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1221. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1222. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1223. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1224. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1225. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1226. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1227. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1228. DoItemLink.Click();
  1229. //driver.ExecuteJavaScript("$(arguments[0]).click()", DoItemLink);
  1230. break;
  1231. }
  1232. }
  1233. }
  1234. else
  1235. {
  1236. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1237. //retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1238. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态
  1239. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限
  1240. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限
  1241. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日
  1242. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人
  1243. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注
  1244. //retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1245. DoItemLink.Click();
  1246. //new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(DoItemLink)).Click();
  1247. }
  1248. }
  1249. var p_proc_finish_doc_date = wait.Until((d) =>
  1250. {
  1251. try
  1252. {
  1253. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1254. }
  1255. catch
  1256. {
  1257. return null;
  1258. }
  1259. });
  1260. //System.Threading.Thread.Sleep(500);
  1261. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1262. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1263. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1264. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1265. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1266. waitGetElementById(wait,"libase").Click();
  1267. var p_case_info__case_name = wait.Until((d) =>
  1268. {
  1269. try
  1270. {
  1271. return d.FindElement(By.Id("p_case_info__case_name"));
  1272. }
  1273. catch
  1274. {
  1275. return null;
  1276. }
  1277. });
  1278. //System.Threading.Thread.Sleep(500);
  1279. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1280. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1281. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1282. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1283. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1284. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1285. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1286. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1287. //driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1288. //select[@id='p_case_info__case_coefficient_id']
  1289. //retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1290. }
  1291. catch (Exception ex)
  1292. {
  1293. throw new Exception(ex.Message, ex);
  1294. }
  1295. finally
  1296. {
  1297. driver.Quit();
  1298. killChromProcess();
  1299. }
  1300. }
  1301. Service.Dispose();
  1302. }
  1303. return retObject;
  1304. }
  1305. private static void killChromProcess()
  1306. {
  1307. try
  1308. {
  1309. Process[] workers = Process.GetProcessesByName("Chrome");
  1310. foreach (Process worker in workers)
  1311. {
  1312. worker.Kill();
  1313. worker.WaitForExit();
  1314. worker.Dispose();
  1315. }
  1316. workers = Process.GetProcessesByName("Chromedriver");
  1317. foreach (Process worker in workers)
  1318. {
  1319. worker.Kill();
  1320. worker.WaitForExit();
  1321. worker.Dispose();
  1322. }
  1323. }
  1324. catch { }
  1325. }
  1326. private static string GetSelectText(IWebElement element)
  1327. {
  1328. var strValue = element.GetAttribute("value");
  1329. if (string.IsNullOrEmpty(strValue))
  1330. {
  1331. return null;
  1332. }
  1333. var ops = element.FindElements(By.TagName("option"));
  1334. foreach (var op in ops)
  1335. {
  1336. if (op.GetAttribute("value") == strValue)
  1337. {
  1338. return op.Text;
  1339. }
  1340. }
  1341. return null;
  1342. }
  1343. }
  1344. }