Brak opisu

WxLoginController.cs 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. using CallCenter.Utility;
  2. using CallCenterApi.DB;
  3. using CallCenterApi.Interface.Controllers.Base;
  4. using CallCenterApi.Interface.App_Start;
  5. using CallCenterAPI.WechatSDK;
  6. using CallCenterAPI.WechatSDK.Models;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Data;
  10. using System.Linq;
  11. using System.Web;
  12. using System.Web.Mvc;
  13. using System.Transactions;
  14. using System.IO;
  15. namespace CallCenterApi.Interface.Controllers.weixin
  16. {
  17. public class WxLoginController : BaseController
  18. {
  19. private readonly BLL.T_Sys_UserAccount userAccountBLL = new BLL.T_Sys_UserAccount();
  20. private readonly BLL.T_Ask_PagerInfo pagerInfoBLL = new BLL.T_Ask_PagerInfo();
  21. private readonly BLL.T_Ask_Question questionBLL = new BLL.T_Ask_Question();
  22. private readonly BLL.T_Ask_QuestionItems questionItemBLL = new BLL.T_Ask_QuestionItems();
  23. /// <summary>
  24. /// 绑定微信号
  25. /// </summary>
  26. /// <param name="login"></param>
  27. /// <returns></returns>
  28. [WechatActionFilter]
  29. public ActionResult Login(WxLoginDto login)
  30. {
  31. Dictionary<string, string> paras = new Dictionary<string, string>();
  32. string sql = " select * from T_Sys_UserAccount where F_UserCode=@F_UserCode and F_PassWord=@F_PassWord ";
  33. paras.Add("@F_UserCode", login.UserCode);
  34. paras.Add("@F_PassWord", login.Password);
  35. var dt = DbHelperSQL.Query(sql, paras).Tables[0];
  36. if (dt != null)
  37. {
  38. var user = userAccountBLL.GetModel(login.UserCode);
  39. user.F_WxOpenId = login.OpenId;
  40. if (userAccountBLL.Update(user))
  41. {
  42. return Success("绑定成功");
  43. }
  44. else
  45. {
  46. return Error("绑定失败");
  47. }
  48. }
  49. else
  50. {
  51. return Error("账号或密码错误,请重新登录");
  52. }
  53. }
  54. /// <summary>
  55. /// 获取微信openid
  56. /// </summary>
  57. /// <param name="login"></param>
  58. /// <returns></returns>
  59. public ActionResult GetOpenId(WxLoginDto wld)
  60. {
  61. wld.RedirectUrl = RequestString.GetUrlReferrer();
  62. if (string.IsNullOrEmpty(wld.OpenId))
  63. {
  64. var temp = WxHelper.GetOpenId(wld);
  65. if (string.IsNullOrWhiteSpace(temp.OpenId))
  66. {
  67. return Redirect("请求", temp.RedirectUrl);
  68. }
  69. wld.OpenId = temp.OpenId;
  70. //获取是否绑定用户表
  71. var usertemp = new BLL.T_Sys_UserAccount().GetModelByOpenid(wld.OpenId);
  72. if (usertemp != null)
  73. {
  74. wld.UserCode = usertemp.F_UserCode;
  75. }
  76. else
  77. {
  78. wld.UserCode = "";
  79. }
  80. }
  81. var model = new BLL.T_Sys_Users().GetModel(wld.OpenId);
  82. if (model == null)
  83. {
  84. model = new Model.T_Sys_Users();
  85. model.F_OpenId = wld.OpenId;
  86. model.F_Type = 1;
  87. model.F_CreateTime = DateTime.Now;
  88. new BLL.T_Sys_Users().Add(model);
  89. }
  90. var newobj = new
  91. {
  92. openid = wld.OpenId,
  93. usercode = wld.UserCode,
  94. };
  95. return Success("成功", newobj);
  96. }
  97. #region 工单相关
  98. /// <summary>
  99. /// 获取工单列表
  100. /// </summary>
  101. /// <returns></returns>
  102. [WechatActionFilter]
  103. public ActionResult GetList()
  104. {
  105. DataTable dt = new DataTable();
  106. //string sql = " and IsDel=0 ";
  107. string stropenid = HttpUtility.UrlDecode(RequestString.GetQueryString("openid"));
  108. string strstate = HttpUtility.UrlDecode(RequestString.GetQueryString("state"));//状态 0待处理 1已处理
  109. string strname = HttpUtility.UrlDecode(RequestString.GetQueryString("name"));//联系人
  110. string strtel = HttpUtility.UrlDecode(RequestString.GetQueryString("tel"));//联系电话
  111. string strkey = HttpUtility.UrlDecode(RequestString.GetQueryString("key"));//关键字
  112. string strstarttime = HttpUtility.UrlDecode(RequestString.GetQueryString("starttime"));
  113. string strendtime = HttpUtility.UrlDecode(RequestString.GetQueryString("endtime"));
  114. string strworkid = HttpUtility.UrlDecode(RequestString.GetQueryString("workid"));//工单编号
  115. string strusercode = HttpUtility.UrlDecode(RequestString.GetQueryString("usercode"));//创建人工号
  116. string source = HttpUtility.UrlDecode(RequestString.GetQueryString("source"));//工单来源
  117. string infotype = HttpUtility.UrlDecode(RequestString.GetQueryString("infotype"));//信息分类
  118. string strpageindex = RequestString.GetQueryString("page");
  119. int pageindex = 1;
  120. string strpagesize = RequestString.GetQueryString("pagesize");
  121. int pagesize = 10;
  122. #region sql 语句相关处理
  123. //根据openid获取所有工单号
  124. var wxuser = new BLL.T_Sys_Users().GetModelList(" F_OpenId='" + stropenid.Trim() + "' and F_Type=1 ").FirstOrDefault();
  125. string sql = " and IsDel=0 and id in (select distinct F_WorkOrderID from T_WO_UserWorkOrder where F_UserId='" + wxuser.F_Id + "') ";
  126. if (strstate.Trim() != "" && strstate != "undefined")
  127. {
  128. if (strstate.Trim() == "0")
  129. {
  130. sql += " and State in(0,1) ";
  131. }
  132. else
  133. {
  134. sql += " and State =2 ";
  135. }
  136. //sql += " and State = '" + strstate.Trim() + "' ";
  137. }
  138. if (strworkid.Trim() != "" && strworkid != "undefined")
  139. {
  140. sql += " and WorkOrderID like '%" + strworkid + "%' ";
  141. }
  142. if (strname.Trim() != "" && strname != "undefined")
  143. {
  144. sql += " and Customer like '%" + strname + "%' ";
  145. }
  146. if (strtel.Trim() != "" && strtel != "undefined")
  147. {
  148. sql += " and (CustomerTel like '%" + strtel + "%' ) ";
  149. }
  150. if (strkey.Trim() != "" && strkey != "undefined")
  151. {
  152. sql += " and (Title like '%" + strkey + "%' or Detail like '%" + strkey + "%') ";
  153. }
  154. if (strusercode.Trim() != "" && strusercode != "undefined")
  155. {
  156. sql += " and CreateUser = '" + strusercode + "' ";
  157. }
  158. if (infotype.Trim() != "" && infotype != "undefined")
  159. {
  160. sql += " and InfoTypeID = " + infotype + " ";
  161. }
  162. if (source.Trim() != "" && source != "undefined")
  163. {
  164. sql += " and Source = '" + source + "' ";
  165. }
  166. if (strstarttime.Trim() != "" && strstarttime != "undefined")
  167. {
  168. sql += " and datediff(day,CreateTime,'" + strstarttime + "')<=0 ";
  169. }
  170. if (strendtime.Trim() != "" && strendtime != "undefined")
  171. {
  172. sql += " and datediff(day,CreateTime,'" + strendtime + "')>=0 ";
  173. }
  174. #endregion
  175. if (strpageindex.Trim() != "")
  176. {
  177. pageindex = Convert.ToInt32(strpageindex);
  178. }
  179. if (strpagesize.Trim() != "")
  180. {
  181. pagesize = Convert.ToInt32(strpagesize);
  182. }
  183. string cols = "*,dbo.GetUserName(CreateUser) as UserName";
  184. int recordCount = 0;
  185. dt = BLL.PagerBLL.GetListPager(
  186. "T_Wo_WorkOrder",
  187. "WorkOrderID",
  188. cols,
  189. sql,
  190. "ORDER BY CreateTime DESC",
  191. pagesize,
  192. pageindex,
  193. true,
  194. out recordCount);
  195. var obj = new
  196. {
  197. state = "success",
  198. message = "成功",
  199. rows = dt,
  200. total = recordCount
  201. };
  202. return Content(obj.ToJson());
  203. }
  204. /// <summary>
  205. /// 新增工单
  206. /// </summary>
  207. /// <returns></returns>
  208. [WechatActionFilter]
  209. public ActionResult AddWorkOrder()
  210. {
  211. DataTable dt = new DataTable();
  212. string cusname = HttpUtility.UrlDecode(RequestString.GetFormString("cusname"));
  213. string cusphone = RequestString.GetFormString("cusphone");//GetFormString
  214. string country = HttpUtility.UrlDecode(RequestString.GetFormString("country"));
  215. string address = HttpUtility.UrlDecode(RequestString.GetFormString("address"));
  216. string content = HttpUtility.UrlDecode(RequestString.GetFormString("content"));
  217. string files = RequestString.GetFormString("files");
  218. string stropenid = HttpUtility.UrlDecode(RequestString.GetFormString("openid"));
  219. var wxuser = new BLL.T_Sys_Users().GetModelList(" F_OpenId='" + stropenid.Trim() + "' and F_Type=1 ").FirstOrDefault();
  220. workorder.WorkOrderController wo = new workorder.WorkOrderController();
  221. string workorderid = wo.AddWorkOrders(cusname, cusphone,country,address, content, files);
  222. if (string.IsNullOrEmpty(workorderid))
  223. {
  224. return Error("新增失败");
  225. }
  226. else
  227. {
  228. Model.T_WO_UserWorkOrder tbu = new Model.T_WO_UserWorkOrder();
  229. tbu.F_UserId = wxuser.F_Id;
  230. tbu.F_WorkOrderId = workorderid;
  231. new BLL.T_WO_UserWorkOrder().Add(tbu);
  232. return Success("新增成功", workorderid);
  233. }
  234. }
  235. /// <summary>
  236. /// 处理工单
  237. /// </summary>
  238. /// <returns></returns>
  239. [WechatActionFilter]
  240. public ActionResult DealWorkOrder()
  241. {
  242. DataTable dt = new DataTable();
  243. string orderid = RequestString.GetFormString("orderid");//GetFormString
  244. string customer= HttpUtility.UrlDecode(RequestString.GetFormString("customer"));
  245. string inqtime = HttpUtility.UrlDecode(RequestString.GetFormString("inqtime"));
  246. string inquser = HttpUtility.UrlDecode(RequestString.GetFormString("inquser"));
  247. string country = HttpUtility.UrlDecode(RequestString.GetFormString("country"));
  248. string address = HttpUtility.UrlDecode(RequestString.GetFormString("address"));
  249. string detail = HttpUtility.UrlDecode(RequestString.GetFormString("detail"));
  250. string cont = HttpUtility.UrlDecode(RequestString.GetFormString("cont"));
  251. string answer = HttpUtility.UrlDecode(RequestString.GetFormString("answer"));
  252. string remark = HttpUtility.UrlDecode(RequestString.GetFormString("remark"));
  253. string infotype = HttpUtility.UrlDecode(RequestString.GetFormString("infotype"));
  254. string unit = HttpUtility.UrlDecode(RequestString.GetFormString("unit"));
  255. int issend = RequestString.GetFormInt("issend", 0);
  256. //int infotypeid = RequestString.GetFormInt("infotypeid", 0);
  257. //int unitid = RequestString.GetFormInt("unitid", 0);
  258. string stropenid = HttpUtility.UrlDecode(RequestString.GetFormString("openid"));
  259. workorder.WorkOrderController wo = new workorder.WorkOrderController();
  260. bool res = wo.DealWorkOrders(orderid,issend, customer,inqtime,inquser,country,address,detail,detail,answer,remark, infotype, unit, stropenid);
  261. if (res)
  262. {
  263. return Success("操作成功");
  264. }
  265. else
  266. {
  267. return Error("操作失败");
  268. }
  269. }
  270. /// <summary>
  271. /// 获取工单详情
  272. /// </summary>
  273. /// <returns></returns>
  274. [WechatActionFilter]
  275. public ActionResult GetWorkOrder()
  276. {
  277. string strworkorderid = HttpUtility.UrlDecode(RequestString.GetQueryString("workorderid"));
  278. string stropenid = HttpUtility.UrlDecode(RequestString.GetQueryString("openid"));
  279. var wxuser = new BLL.T_Sys_Users().GetModelList(" F_OpenId='" + stropenid.Trim() + "' and F_Type=1 ").FirstOrDefault();
  280. var tbu = new BLL.T_WO_UserWorkOrder().GetList(" F_UserId='" + wxuser.F_Id + "' and F_WorkOrderId=" + strworkorderid + " ").Tables[0];
  281. if (tbu.Rows.Count > 0)
  282. {
  283. string sql = "select *,dbo.GetUserName(CreateUser) as CreateUserName "
  284. + " from T_Wo_WorkOrder where id =" + strworkorderid + " ";
  285. var dt = DbHelperSQL.Query(sql).Tables[0];
  286. if (dt.Rows.Count > 0)
  287. {
  288. var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
  289. var configfj = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='FileUrlPath' ").FirstOrDefault();
  290. if (configfj != null)
  291. {
  292. dt = BindFileData(dt, configfj.F_ParamValue);
  293. }
  294. string gcsql = "select *,dbo.GetUserName(CreateUser) as UserName "
  295. + "from T_Wo_WorkOrderItem where IsDel=0 and WorkOrderID ='" + dt.Rows[0]["WorkOrderId"] + "'";
  296. var gcdt = DbHelperSQL.Query(gcsql).Tables[0];
  297. dt.Columns.Add("FilePath", typeof(string));
  298. if (configfj != null || config != null)
  299. {
  300. foreach (DataRow bldr in dt.Rows)
  301. {
  302. if (bldr["CallID"] != null && config != null)
  303. {
  304. bldr["FilePath"] = GetCallPath(bldr["CallID"].ToString(), config.F_ParamValue);
  305. }
  306. }
  307. }
  308. var obj = new
  309. {
  310. data = dt,
  311. item = gcdt
  312. };
  313. return Success("查询成功", obj);
  314. }
  315. else
  316. {
  317. return Error("查询失败");
  318. }
  319. }
  320. else
  321. {
  322. return Error("查询失败");
  323. }
  324. }
  325. #endregion
  326. #region 问卷相关
  327. /// <summary>
  328. /// 获取问卷
  329. /// </summary>
  330. /// <returns></returns>
  331. [WechatActionFilter]
  332. public ActionResult GetPagers()
  333. {
  334. var model = pagerInfoBLL.GetModel(8);
  335. if (model != null)
  336. {
  337. var qlist = questionBLL.GetModelList(" F_DeleteFlag=0 and F_QuestionId in (select F_QuestionId from T_Ask_PagerItems where F_PagerId=8) order by F_QuestionId ");
  338. var qilist = questionItemBLL.GetModelList(" F_QuestionId in (select F_QuestionId from T_Ask_PagerItems where F_PagerId=8) order by F_ItemId ");
  339. var newmodel = new
  340. {
  341. F_Title = model.F_Title,
  342. F_StartText = model.F_StartText,
  343. F_EndText = model.F_EndText,
  344. F_Remark = model.F_Remark,
  345. F_Questions = qlist.Select(q =>
  346. {
  347. return new
  348. {
  349. quesid = q.F_QuestionId,
  350. questitle = q.F_Title,
  351. questype = q.F_Type,
  352. quescontent = q.F_Content,
  353. quesremark = q.F_Remark,
  354. quesitems = qilist.Where(qq => qq.F_QuestionId == q.F_QuestionId).Select(qi =>
  355. {
  356. return new
  357. {
  358. itemid = qi.F_ItemId,
  359. itemname = qi.F_ItemName,
  360. itemremark = qi.F_Remark,
  361. };
  362. })
  363. };
  364. })
  365. };
  366. return Success("获取问卷试题信息成功", newmodel);
  367. }
  368. return Error("获取问卷试题信息失败");
  369. }
  370. /// <summary>
  371. /// 提交问卷
  372. /// </summary>
  373. /// <returns></returns>
  374. [WechatActionFilter]
  375. public ActionResult AddPagers(string openid, string[] ans, string cusname,
  376. string telphone,string phone,string countryid,string address)
  377. {
  378. var wxuser = new BLL.T_Sys_Users().GetModelList(" F_OpenId='" + openid + "' and F_Type=1 ").FirstOrDefault();
  379. bool res = new callout.PagerAnswerWXController().AnswersWX(telphone, openid, ans, cusname, phone, countryid, address);
  380. string msg = "";
  381. if (ans != null)
  382. {
  383. foreach (var item in ans)
  384. {
  385. msg += item + ";**;";
  386. }
  387. }
  388. else
  389. {
  390. msg = "ans为空";
  391. }
  392. if (res)
  393. {
  394. return Success("问卷提交成功:::" + msg);
  395. }
  396. else
  397. {
  398. return Error("问卷提交失败:::" + msg);
  399. }
  400. }
  401. #endregion
  402. #region 获取下拉框
  403. /// <summary>
  404. /// 获取信息分类列表
  405. /// </summary>
  406. /// <returns></returns>
  407. [WechatActionFilter]
  408. public ActionResult GetTypeList()
  409. {
  410. string sql = "select * from T_Sys_DictionaryValue where F_DictionaryFlag='XXFL' and F_State=1 ";
  411. var dt = DbHelperSQL.Query(sql).Tables[0];
  412. return Success("列表加载成功", dt);
  413. }
  414. /// <summary>
  415. /// 获取交办单位列表
  416. /// </summary>
  417. /// <returns></returns>
  418. [WechatActionFilter]
  419. public ActionResult GetAreaList()
  420. {
  421. string sql = "select * from T_Sys_DictionaryValue where F_DictionaryFlag='JBDW' and F_State=1 ";
  422. var dt = DbHelperSQL.Query(sql).Tables[0];
  423. return Success("列表加载成功", dt);
  424. }
  425. #endregion
  426. #region 附件和语音文件
  427. /// <summary>
  428. /// 获取留言路径
  429. /// </summary>
  430. /// <param name="lid">留言id</param>
  431. /// <param name="prefix">前缀</param>
  432. /// <returns></returns>
  433. public string GetLeavePath(string lid, string prefix)
  434. {
  435. string path = string.Empty;
  436. var liuyan = new BLL.T_Call_LeaveRecord().GetModelList(" F_Id='" + lid + "' ").FirstOrDefault();
  437. if (liuyan != null)
  438. {
  439. if (!string.IsNullOrEmpty(liuyan.F_RecFileUrl))
  440. {
  441. path = prefix + liuyan.F_RecFileUrl;
  442. }
  443. }
  444. return path;
  445. }
  446. /// <summary>
  447. /// 获取通话录音路径
  448. /// </summary>
  449. /// <param name="cid">通话id</param>
  450. /// <param name="prefix">前缀</param>
  451. /// <returns></returns>
  452. public string GetCallPath(string cid, string prefix)
  453. {
  454. string path = string.Empty;
  455. var luyin = new BLL.T_Call_CallRecords().GetModelList(" callid='" + cid + "' ").FirstOrDefault();
  456. if (luyin != null)
  457. {
  458. if (!string.IsNullOrEmpty(luyin.FilePath))
  459. {
  460. var ym = prefix;
  461. ym = ym.Substring(0, ym.Length - 1);
  462. path = ym + luyin.FilePath.Substring(luyin.FilePath.IndexOf(':') + 1).Replace('\\', '/');
  463. }
  464. }
  465. return path;
  466. }
  467. /// <summary>
  468. /// 获取附件数据
  469. /// </summary>
  470. /// <param name="ids">附件id,多个用英文逗号,隔开</param>
  471. /// <param name="prefix">前缀</param>
  472. /// <returns></returns>
  473. public DataTable GetFileData(string ids, string prefix)
  474. {
  475. DataTable dt = DbHelperSQL.Query("select * from T_Sys_Accessories where F_FileId in (" + ids + ")").Tables[0];
  476. foreach (DataRow dr in dt.Rows)
  477. {
  478. dr["F_FileUrl"] = prefix + dr["F_FileUrl"].ToString();
  479. }
  480. return dt;
  481. }
  482. /// <summary>
  483. /// 绑定附件信息
  484. /// </summary>
  485. /// <param name="dt"></param>
  486. /// <param name="prefix"></param>
  487. /// <returns></returns>
  488. public DataTable BindFileData(DataTable dt, string prefix)
  489. {
  490. dt.Columns.Add("File", typeof(object));
  491. foreach (DataRow dr in dt.Rows)
  492. {
  493. if (dr["Files"] != null && dr["Files"].ToString() != "")
  494. {
  495. dr["File"] = GetFileData(dr["Files"].ToString(), prefix);
  496. }
  497. }
  498. return dt;
  499. }
  500. #endregion
  501. #region
  502. /// <summary>
  503. /// 上传附件
  504. /// </summary>
  505. /// <returns></returns>
  506. public ActionResult UpLoadProcess(string id, string name, string type, string lastModifiedDate, int size, HttpPostedFileBase file)
  507. {
  508. try
  509. {
  510. string stropenid = HttpUtility.UrlDecode(RequestString.GetFormString("openid"));
  511. string filePathName = string.Empty;
  512. string path = "/Upload/Files/" + DateTime.Now.ToString("yyyy/MM/dd") + "/";
  513. string localPath = Server.MapPath(Path.Combine(HttpRuntime.AppDomainAppPath, path));
  514. if (Request.Files.Count == 0)
  515. {
  516. return Error("保存失败");
  517. }
  518. string ex = Path.GetExtension(file.FileName);
  519. filePathName = DateTime.Now.ToString("yyyyMMddHHmmssmsfff") + "_" + Guid.NewGuid().ToString("N") + ex;
  520. if (!System.IO.Directory.Exists(localPath))
  521. {
  522. System.IO.Directory.CreateDirectory(localPath);
  523. }
  524. file.SaveAs(Path.Combine(localPath, filePathName));
  525. #region 添加日志
  526. Model.T_Sys_Accessories model_T_Sys_Accessories = new Model.T_Sys_Accessories();
  527. model_T_Sys_Accessories.F_AddTime = DateTime.Now;//上传时间
  528. model_T_Sys_Accessories.F_FileName = filePathName;//附件名称
  529. model_T_Sys_Accessories.F_FileType = type;//附件类型
  530. model_T_Sys_Accessories.F_FileUrl = path + filePathName;//附件地址
  531. model_T_Sys_Accessories.F_Size = size;
  532. model_T_Sys_Accessories.F_UserCode = stropenid;//上传人
  533. int fid = new BLL.T_Sys_Accessories().Add(model_T_Sys_Accessories);
  534. #endregion
  535. if (fid > 0)
  536. {//返回附件的ID
  537. return Success("文件日志都成功", fid);
  538. }
  539. else
  540. return Success("文件成功");
  541. }
  542. catch (Exception ex)
  543. {
  544. return Error(ex.Message);
  545. }
  546. }
  547. #endregion
  548. }
  549. }