您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

244 行
10.0KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using OpenQA.Selenium;
  6. using OpenQA.Selenium.Chrome;
  7. using CSVDownloader.Code;
  8. using CSVDownloader.Store.CreditCSVData;
  9. using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions;
  10. namespace CSVDownloader.Web {
  11. class ZeusController : WebController {
  12. private readonly String url_ = "https://linkpt.cardservice.co.jp/merchant/";
  13. private readonly int max_download_num_ = 20;
  14. private enum XpathKey {
  15. INPUT_LOGIN_USERNAME,
  16. INPUT_LOGIN_PASSWORD,
  17. BUTTON_CREDIT_KESSAI,
  18. CHECK_PARKING,
  19. RADIO_TARGET_SPAN,
  20. SELECT_TARGET_FROM_YYYY,
  21. SELECT_TARGET_FROM_MM,
  22. SELECT_TARGET_FROM_DD,
  23. SELECT_TARGET_TO_YYYY,
  24. SELECT_TARGET_TO_MM,
  25. SELECT_TARGET_TO_DD,
  26. BUTTON_DOWNLOAD_CSV,
  27. BUTTON_LOGOUT,
  28. SUBJECT,
  29. FRAME_MENU,
  30. FRAME_CONTENTS,
  31. };
  32. private static String search_form_xpath = "//*[@id='deny_double_click']";
  33. private IDictionary<XpathKey, string> xpath_map_ = new Dictionary<XpathKey, string>()
  34. {
  35. {XpathKey.INPUT_LOGIN_USERNAME,"//form[@name='loginForm']//input[@name='ID']" },
  36. {XpathKey.INPUT_LOGIN_PASSWORD,"//*[@id='password']"},
  37. {XpathKey.BUTTON_CREDIT_KESSAI,"//a[contains(@href,'batch_download_face')]" },
  38. {XpathKey.CHECK_PARKING,$"{search_form_xpath}//input[@name='bang_list']" },
  39. {XpathKey.RADIO_TARGET_SPAN,$"{search_form_xpath}//input[@name='date' and @value='period']" },
  40. {XpathKey.SELECT_TARGET_FROM_YYYY,$"{search_form_xpath}//select[@name='spfy']" },
  41. {XpathKey.SELECT_TARGET_FROM_MM,$"{search_form_xpath}//select[@name='spfm']" },
  42. {XpathKey.SELECT_TARGET_FROM_DD,$"{search_form_xpath}//select[@name='spfd']" },
  43. {XpathKey.SELECT_TARGET_TO_YYYY,$"{search_form_xpath}//select[@name='epfy']" },
  44. {XpathKey.SELECT_TARGET_TO_MM,$"{search_form_xpath}//select[@name='epfm']" },
  45. {XpathKey.SELECT_TARGET_TO_DD,$"{search_form_xpath}//select[@name='epfd']" },
  46. {XpathKey.BUTTON_DOWNLOAD_CSV,$"{search_form_xpath}//input[@type='submit']" },
  47. {XpathKey.BUTTON_LOGOUT,"//a[contains(@href,'logout')]" },
  48. {XpathKey.FRAME_MENU,"//frame[@name='MENULIST']" },
  49. {XpathKey.FRAME_CONTENTS,"//frame[@name='CONTENTS']" },
  50. };
  51. public ZeusController(ChromeDriver driver) : base(driver) {
  52. agent_ = CreditAgent.Zeus;
  53. }
  54. public override void SetParkingDic(IDictionary<String, String> dic) {
  55. dic_ = new Dictionary<String, String>();
  56. // IPコードと駐車場名を分離。プログラムではIPコードのみ利用する。
  57. foreach (var ele in dic) {
  58. if (ele.Key == "") {
  59. logger_.Warn($"検索キーが空白のためスキップ {ele.Value}");
  60. continue;
  61. }
  62. String parking_name = ele.Key.Split(" ")[0].Trim();
  63. dic_.Add(parking_name, ele.Value);
  64. }
  65. }
  66. public override ResultCode Login(LoginInfo info) {
  67. bool enter = true;
  68. try {
  69. driver_.Navigate().GoToUrl(url_);
  70. Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name);
  71. Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password, enter);
  72. // ログイン後の「端末決済データダウンロード」が表示されることを確認する。
  73. SwitchToFrame(xpath_map_[XpathKey.FRAME_MENU]);
  74. wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI])));
  75. SwitchToFrame();
  76. } catch (Exception e) {
  77. logger_.Error(e.Message);
  78. return ResultCode.NG;
  79. }
  80. return ResultCode.OK;
  81. }
  82. public override ResultCode Download(DateTime from, DateTime to) {
  83. // クレジットカード承認結果一覧画面に移行
  84. SwitchToFrame(xpath_map_[XpathKey.FRAME_MENU]);
  85. Click(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]);
  86. SwitchToFrame();
  87. //期間のFrom-Toを入力
  88. SwitchToFrame(xpath_map_[XpathKey.FRAME_CONTENTS]);
  89. Click(xpath_map_[XpathKey.RADIO_TARGET_SPAN]);
  90. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_YYYY], from.ToString("yyyy"));
  91. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_MM], from.ToString("%M"));
  92. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_DD], from.ToString("%d"));
  93. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_YYYY], to.ToString("yyyy"));
  94. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_MM], to.ToString("%M"));
  95. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_DD], to.ToString("%d"));
  96. // 駐車場一覧を取得
  97. var parking_list = driver_.FindElementsByXPath(xpath_map_[XpathKey.CHECK_PARKING]);
  98. var tmp_list = new List<IWebElement>();
  99. int count = 0;
  100. // 一定件数ごとにダウンロード
  101. foreach (var parking in parking_list) {
  102. tmp_list.Add(parking);
  103. if (!parking.Selected) {
  104. parking.Click();
  105. }
  106. if (tmp_list.Count == max_download_num_) {
  107. // ダウンロード処理
  108. String filename = $"zeus_{count}.csv";
  109. Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]);
  110. WaitForDownload(filename);
  111. // チェックを戻す
  112. foreach (var check in tmp_list) {
  113. if (check.Selected) {
  114. check.Click();
  115. }
  116. }
  117. // クリアー処理
  118. count++;
  119. tmp_list.Clear();
  120. }
  121. }
  122. if (tmp_list.Count != 0) {
  123. String filename = $"zeus_{count}.csv";
  124. Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]);
  125. WaitForDownload(filename);
  126. tmp_list.Clear();
  127. }
  128. SwitchToFrame();
  129. return ResultCode.OK;
  130. }
  131. public override ResultCode Logout() {
  132. SwitchToFrame(xpath_map_[XpathKey.FRAME_MENU]);
  133. Click(xpath_map_[XpathKey.BUTTON_LOGOUT]);
  134. return ResultCode.OK;
  135. }
  136. public override List<CreditCSVData> GetCreditCSVDataList() {
  137. var result_list = new List<CreditCSVData>();
  138. // csvファイルパスの取得
  139. var config = new CSVConfig() {
  140. header = true,
  141. };
  142. var dir = new DirectoryInfo(DriverFactory.GetDownloadDir());
  143. var sjis_enc = Encoding.GetEncoding("Shift-JIS");
  144. var list = new List<String[]>();
  145. foreach (var file in dir.GetFiles()) {
  146. var result = ReadCsv(file.FullName, config, sjis_enc);
  147. list.AddRange(result);
  148. }
  149. bool failed_flg = false;
  150. var failed_parking_name_hs_table = new HashSet<String>();
  151. foreach (var line in list) {
  152. // 決済金額は「-」でセットされている場合があるので
  153. // その際は0とする。
  154. var parking_name = line[(int)CreditCSVDataZeus.ColName.IP];
  155. try {
  156. int amount = 0;
  157. int.TryParse(line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Amount], out amount);
  158. result_list.Add(new Store.CreditCSVData.CreditCSVDataZeus() {
  159. spot_id = GetSpotID(line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.IP]),
  160. use_datetime = DateTime.Parse(line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.UseDatetime]),
  161. ip = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.IP],
  162. device_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.DeviceNo],
  163. receipt_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.ReceiptNo],
  164. certificate_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.CertificateNo],
  165. status = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Status],
  166. error_message = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.ErrorMessage],
  167. amount = amount,
  168. card_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.CardNo],
  169. expiration_date = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.ExpirationDate],
  170. brand = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Brand],
  171. payment_type = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.PaymentType],
  172. jis_info = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.JISInfo],
  173. test = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.Test],
  174. order_no = line[(int)Store.CreditCSVData.CreditCSVDataZeus.ColName.OrderNo],
  175. });
  176. } catch (ArgumentException) {
  177. failed_parking_name_hs_table.Add(parking_name);
  178. failed_flg = true;
  179. continue;
  180. }
  181. if (failed_flg) {
  182. logger_.Error("失敗駐車場名");
  183. foreach (var ele in failed_parking_name_hs_table) {
  184. logger_.Error($"駐車場 \"{ele}\"");
  185. }
  186. throw new Exception("データ作成失敗");
  187. }
  188. }
  189. return result_list;
  190. }
  191. }
  192. }