IPEasyUtility.cs 67 KB

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