You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

867 lines
37 KiB

3 years ago
  1. using EasyBL.WebApi.Common;
  2. using EasyBL.WebApi.Message;
  3. using EasyBL.WebApi.Models;
  4. using EasyNet;
  5. using Entity;
  6. using Entity.Sugar;
  7. using Newtonsoft.Json;
  8. using SqlSugar;
  9. using SqlSugar.Base;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Net.Http;
  14. using System.Web;
  15. using System.Net;
  16. using System.Web.Http;
  17. namespace EasyBL.WEBAPP
  18. {
  19. public class AuthorizeService : ServiceBase
  20. {
  21. public HttpResponseMessage GetLogin([FromBody]dynamic i_value, HttpRequestMessage i_rRequest)
  22. {
  23. string sRes = null;
  24. try
  25. {
  26. string pm = CmdService.DecodeParm(i_value);
  27. var crm = JsonConvert.DeserializeObject<RequestMessage>(pm);
  28. crm.ClientIP = GetClientIp(i_rRequest);
  29. var auth = new AuthorizeService();
  30. sRes = JsonConvert.SerializeObject(auth.Entry(crm));
  31. }
  32. catch (Exception ex)
  33. {
  34. var exCur = ex;
  35. while (null != exCur.InnerException)
  36. {
  37. exCur = exCur.InnerException;
  38. }
  39. sRes = JsonConvert.SerializeObject(new ErrorResponseMessage(exCur.Message));
  40. }
  41. return new HttpResponseMessage
  42. {
  43. Content = new StringContent(sRes, System.Text.Encoding.UTF8, @"application/json")
  44. };
  45. }
  46. //public static string MyToString<T>(T str)
  47. //{
  48. // throw new NotSupportedException("Can only be used in expressions");
  49. //}
  50. #region 系統登入
  51. /// <summary>
  52. /// 函式名稱:Login
  53. /// 函式說明:系統登入
  54. /// </summary>
  55. /// <param name="i_crm">todo: describe i_crm parameter on Login</param>
  56. /// <returns>
  57. /// 回傳 rm(Object)
  58. ///</returns>
  59. public ResponseMessage Login(RequestMessage i_crm)
  60. {
  61. ResponseMessage rm = null;
  62. string sError = null;
  63. var db = SugarBase.GetIntance();
  64. try
  65. {
  66. do
  67. {
  68. var sOrgID = _fetchString(i_crm, @"OrgID");
  69. var sUserID = _fetchString(i_crm, @"UserID");
  70. var sPassword = _fetchString(i_crm, @"Pwd");
  71. var bOutklook = _fetchBool(i_crm, @"Outklook");
  72. var bRelogin = _fetchBool(i_crm, @"Relogin");
  73. var sIP = i_crm.ClientIP;
  74. if (string.IsNullOrWhiteSpace(sOrgID))
  75. {
  76. sError = @"組織代號不能為空"; //組織代號不能為空
  77. break;
  78. }
  79. if (string.IsNullOrWhiteSpace(sUserID))
  80. {
  81. sError = @"帳號不能為空"; //帳號不能為空
  82. break;
  83. }
  84. if (string.IsNullOrWhiteSpace(sPassword))
  85. {
  86. sError = @"密碼不能為空"; //密碼不能為空
  87. break;
  88. }
  89. var oOrg = db.Queryable<OTB_SYS_Organization>().Single(x => x.OrgID == sOrgID);
  90. if (oOrg == null)
  91. {
  92. sError = @"組織代號不正確"; //組織代號不正確
  93. break;
  94. }
  95. if (oOrg.Effective != @"Y")
  96. {
  97. sError = @"該組織無效"; //該組織無效
  98. break;
  99. }
  100. var sEncryptPwd = SecurityUtil.Encrypt(sPassword);//將輸入之密碼轉換驗證格式
  101. //string sPwd1 = SecurityUtil.Decrypt("wTBo6uXVBlVH8Ms76xiE4w==");
  102. //string sPwd1 = SecurityUtil.Decrypt("3EOyqH52VBUg3pj5Wy0rwQ==");
  103. var oUser = db.Queryable<OTB_SYS_Members>().Single(x => x.OrgID == sOrgID && (x.MemberID == sUserID || x.Email == sUserID) && x.Password == sEncryptPwd);
  104. if (oUser == null)
  105. {
  106. sError = @"帳號或密碼不正確"; //帳號或密碼不正確
  107. break;
  108. }
  109. if (oUser.Effective != @"Y")
  110. {
  111. sError = @"該帳號無效"; //該帳號無效
  112. break;
  113. }
  114. if (bOutklook && string.IsNullOrWhiteSpace(oUser.OutlookAccount))
  115. {
  116. sError = @"Outlook帳號未設定,請管理員幫您設定Outlook帳號";
  117. break;
  118. }
  119. var sIsCheckNet = Common.GetAppSettings(@"IsCheckNet");
  120. if (sIsCheckNet == @"true")
  121. {
  122. var sUrl = HttpContext.Current.Request.Url.ToString();
  123. if (sUrl.IndexOf(@"localhost") == -1)
  124. {
  125. var sClientIP = sIP;
  126. if (!oUser.NetworkLogin)
  127. {
  128. var CheckList = new List<bool>();
  129. var LocalList = new List<IPAddressRange>()
  130. {
  131. new IPAddressRange(IPAddress.Parse("10.0.0.0"), IPAddress.Parse("10.255.255.255")),
  132. new IPAddressRange(IPAddress.Parse("172.16.0.0"), IPAddress.Parse("172.31.255.255")),
  133. new IPAddressRange(IPAddress.Parse("192.168.0.0"), IPAddress.Parse("192.168.255.255")),
  134. };
  135. foreach (var AddressRange in LocalList)
  136. {
  137. var PassThisRange = AddressRange.IsInRange(IPAddress.Parse(sClientIP));
  138. CheckList.Add(PassThisRange);
  139. }
  140. var Pass = CheckList.Any(c => c);
  141. if (!Pass)
  142. {
  143. sError = @"您的帳號不允許外網登錄"; //您的帳號不允許外網登錄
  144. break;
  145. }
  146. }
  147. }
  148. }
  149. var saOnlineUsers = db.Queryable<OTB_SYS_OnlineUsers>().Where(x => x.OrgID != sOrgID && x.UserID == oUser.MemberID).ToList();
  150. if (saOnlineUsers.Count > 0)
  151. {
  152. if (!bRelogin)
  153. {
  154. string sLocation = string.Empty;
  155. sError = @"Tips:此帳號已於";
  156. switch (saOnlineUsers.First().OrgID)
  157. {
  158. case "TE":
  159. sLocation = "台北奕達";
  160. break;
  161. case "TG":
  162. sLocation = "台北駒驛";
  163. break;
  164. case "SG":
  165. sLocation = "上海駒驛";
  166. break;
  167. case "SE":
  168. sLocation = "簡單平台";
  169. break;
  170. case "HY":
  171. sLocation = "好有創意";
  172. break;
  173. };
  174. //此帳號已於[上海駒驛]登入,請先登出該系統後再重新登入
  175. sError = $"{sError}{sLocation}登入,是否繼續登入當前賬號?";
  176. break;
  177. }
  178. else
  179. {
  180. db.Deleteable<OTB_SYS_OnlineUsers>(saOnlineUsers).ExecuteCommand();
  181. }
  182. }
  183. var ticket = new OTB_SYS_TicketAuth
  184. {
  185. OrgID = oOrg.OrgID,
  186. UserID = oUser.MemberID,
  187. UserName = oUser.MemberName,
  188. Token = SignExtension.CreateToken(),
  189. LoginIp = i_crm.ClientIP,
  190. LoginTime = DateTime.Now
  191. };
  192. var iExpireTime = 240;
  193. var sExpireTime = Common.GetSystemSetting(db, oOrg.OrgID, @"ExpireTime");
  194. if (!string.IsNullOrEmpty(sExpireTime))
  195. {
  196. iExpireTime = int.Parse(sExpireTime);
  197. }
  198. else
  199. {
  200. iExpireTime = int.Parse(Common.GetAppSettings(@"ExpireTime"));
  201. }
  202. ticket.ExpireTime = DateTime.Now.AddMinutes(iExpireTime); //30分钟过期
  203. ticket.IsVerify = @"Y";
  204. var oTicket = db.Queryable<OTB_SYS_TicketAuth>().Single(x => x.OrgID == sOrgID && x.UserID == oUser.MemberID);
  205. if (oTicket != null)
  206. {
  207. db.Updateable(ticket).IgnoreColumns(x => x.OutlookId).Where(x => x.NO == oTicket.NO).ExecuteCommand();
  208. }
  209. else
  210. {
  211. ticket.CreateTime = DateTime.Now;
  212. ticket = db.Insertable(ticket).ExecuteReturnEntity();
  213. }
  214. //記錄log日誌
  215. db.Insertable(new OTB_SYS_LoginLog
  216. {
  217. OrgId = ticket.OrgID,
  218. UserId = ticket.UserID,
  219. UserName = ticket.UserName,
  220. LoginIp = ticket.LoginIp,
  221. LoginTime = ticket.LoginTime
  222. }).ExecuteCommand();
  223. HttpRuntimeCache.Set(ticket.OrgID + ticket.UserID, ticket, iExpireTime * 60, true);
  224. HttpContext.Current.Session.Add(@"orgid", ticket.OrgID);
  225. HttpContext.Current.Session.Add(@"userid", ticket.UserID);
  226. HttpCookie cookie = new HttpCookie("EURO_COOKIE");//初始化並設置Cookie的名稱
  227. DateTime dt = DateTime.Now;
  228. TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//過期時間為1分鐘
  229. cookie.Expires = dt.Add(ts);//設置過期時間
  230. cookie.Values.Add("orgid", ticket.OrgID);
  231. cookie.Values.Add("userid", ticket.UserID);
  232. HttpContext.Current.Response.AppendCookie(cookie);
  233. var jo = new SetMap
  234. {
  235. { @"orgid", ticket.OrgID },
  236. { @"userid", ticket.UserID },
  237. { @"loginname", ticket.UserName },
  238. { @"usertype", @"inner" },
  239. { @"mode", oUser.SysShowMode },
  240. { @"token", ticket.Token },
  241. { @"outklook", bOutklook }
  242. };
  243. rm = new SuccessResponseMessage(null, i_crm);
  244. rm.DATA.Add(BLWording.REL, jo);
  245. } while (false);
  246. }
  247. catch (Exception ex)
  248. {
  249. sError = Util.GetLastExceptionMsg(ex);
  250. LogAndSendEmail(sError + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), nameof(Login), @"Login(系統登入)", @"", @"", @"");
  251. }
  252. finally
  253. {
  254. if (null != sError)
  255. {
  256. rm = new ErrorResponseMessage(sError, i_crm);
  257. }
  258. }
  259. return rm;
  260. }
  261. #endregion 系統登入
  262. #region 獲取個人信息
  263. /// <summary>
  264. /// 函式名稱:Login
  265. /// 函式說明:系統登入
  266. /// </summary>
  267. /// <param name="i_crm">todo: describe i_crm parameter on GetUserInfo</param>
  268. /// <returns>
  269. /// 回傳 rm(Object)
  270. ///</returns>
  271. public ResponseMessage GetUserInfo(RequestMessage i_crm)
  272. {
  273. ResponseMessage rm = null;
  274. string sError = null;
  275. var db = SugarBase.GetIntance();
  276. try
  277. {
  278. do
  279. {
  280. var userInfo = db.Queryable<OTB_SYS_Members, OTB_SYS_Departments, OTB_SYS_Jobtitle>((a, b, c) => new object[] {
  281. JoinType.Inner, a.OrgID==b.OrgID && a.DepartmentID==b.DepartmentID,
  282. JoinType.Inner, a.OrgID==c.OrgID && a.JobTitle==c.JobtitleID
  283. })
  284. .Where((a) => a.OrgID == i_crm.ORIGID && a.MemberID == i_crm.USERID)
  285. .Select((a, b, c) =>
  286. new UserInfo
  287. {
  288. MemberID = a.MemberID,
  289. MemberName = a.MemberName,
  290. Email = a.Email,
  291. OutlookAccount = a.OutlookAccount,
  292. DepartmentID = a.DepartmentID,
  293. Effective = a.Effective,
  294. CalColor = a.CalColor,
  295. MemberPic = a.MemberPic,
  296. SysShowMode = a.SysShowMode,
  297. Country = a.Country,
  298. ServiceCode = a.ServiceCode,
  299. Address = a.Address,
  300. DepartmentName = b.DepartmentName,
  301. JobtitleName = c.JobtitleName,
  302. Supervisors = a.ImmediateSupervisor + @","
  303. }).Single();
  304. if (userInfo != null)
  305. {
  306. var saRoles = db.Queryable<OTB_SYS_MembersToRule>()
  307. .Where(x => x.OrgID == i_crm.ORIGID && x.MemberID == i_crm.USERID)
  308. .Select(x => x.RuleID)
  309. .ToList();
  310. userInfo.roles = string.Join(@",", saRoles);
  311. var saDepartments = db.Queryable<OTB_SYS_Departments>()
  312. .Where(x => x.OrgID == i_crm.ORIGID && x.ChiefOfDepartmentID == i_crm.USERID)
  313. .Select(x => x.DepartmentID)
  314. .ToList();
  315. var saUsersDown = db.Queryable<OTB_SYS_Members>()
  316. .Where(x => x.OrgID == i_crm.ORIGID && saDepartments.Contains(x.DepartmentID))
  317. .Select(x => SqlFunc.IsNull(x.MemberID, @""))
  318. .ToList();
  319. userInfo.UsersDown = string.Join(@",", saUsersDown);
  320. var saUsersBranch = db.Queryable<OTB_SYS_Members>()
  321. .Where(x => x.OrgID == i_crm.ORIGID && x.ImmediateSupervisor == i_crm.USERID)
  322. .Select(x => SqlFunc.IsNull(x.MemberID, @""))
  323. .ToList();
  324. userInfo.UsersBranch = string.Join(@",", saUsersBranch);
  325. var oDepartments = db.Queryable<OTB_SYS_Departments>().Single(x => x.OrgID == i_crm.ORIGID && x.DepartmentID == userInfo.DepartmentID);
  326. userInfo.Supervisors += oDepartments.ChiefOfDepartmentID ?? @"";
  327. }
  328. rm = new SuccessResponseMessage(null, i_crm);
  329. rm.DATA.Add(BLWording.REL, userInfo);
  330. } while (false);
  331. }
  332. catch (Exception ex)
  333. {
  334. sError = Util.GetLastExceptionMsg(ex);
  335. LogAndSendEmail(sError + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), @"", @"GetUserInfo(獲取個人信息)", @"", @"", @"");
  336. }
  337. finally
  338. {
  339. if (null != sError)
  340. {
  341. rm = new ErrorResponseMessage(sError, i_crm);
  342. }
  343. }
  344. return rm;
  345. }
  346. #endregion 獲取個人信息
  347. #region 獲取程式權限
  348. /// <summary>
  349. /// 函式名稱:UpdataPsw
  350. /// 函式說明:獲取程式權限
  351. /// </summary>
  352. /// <param name="i_crm">todo: describe i_crm parameter on GetAuthorize</param>
  353. /// <returns>
  354. /// 回傳 rm(Object)
  355. ///</returns>
  356. public ResponseMessage GetAuthorize(RequestMessage i_crm)
  357. {
  358. ResponseMessage rm = null;
  359. string sMsg = null;
  360. var db = SugarBase.GetIntance();
  361. try
  362. {
  363. do
  364. {
  365. var sProgramID = _fetchString(i_crm, @"ProgramID");
  366. var sTopModuleID = _fetchString(i_crm, @"TopModuleID");
  367. var saRoles = db.Queryable<OTB_SYS_MembersToRule>()
  368. .Where(x => x.OrgID == i_crm.ORIGID && x.MemberID == i_crm.USERID)
  369. .Select(x => x.RuleID)
  370. .ToList();
  371. var oDepartments = db.Queryable<OTB_SYS_Members>().Single(x => x.OrgID == i_crm.ORIGID && x.MemberID == i_crm.USERID);
  372. var saAuthorize = db.UnionAll(
  373. db.Queryable<OTB_SYS_Authorize>()
  374. .Where(x => x.OrgID == i_crm.ORIGID && x.ProgramID == sProgramID && x.TopModuleID == sTopModuleID && x.AllowRight != @"")
  375. .Where(x => saRoles.Contains(x.RuleID))
  376. .Select(x => new AuthorizeInfo
  377. {
  378. RuleID = x.RuleID,
  379. ProgramID = x.ProgramID,
  380. AllowRight = x.AllowRight,
  381. TopModuleID = x.TopModuleID
  382. }),
  383. db.Queryable<OTB_SYS_AuthorizeForDept>()
  384. .Where(x => x.OrgID == i_crm.ORIGID && x.ProgramID == sProgramID && x.TopModuleID == sTopModuleID && x.AllowRight != @"" && x.DepartmentID == oDepartments.DepartmentID)
  385. .Select(x => new AuthorizeInfo
  386. {
  387. RuleID = x.DepartmentID,
  388. ProgramID = x.ProgramID,
  389. AllowRight = x.AllowRight,
  390. TopModuleID = x.TopModuleID
  391. }),
  392. db.Queryable<OTB_SYS_AuthorizeForMember>()
  393. .Where(x => x.OrgID == i_crm.ORIGID && x.ProgramID == sProgramID && x.TopModuleID == sTopModuleID && x.AllowRight != @"" && x.MemberID == i_crm.USERID)
  394. .Select(x => new AuthorizeInfo
  395. {
  396. RuleID = x.MemberID,
  397. ProgramID = x.ProgramID,
  398. AllowRight = x.AllowRight,
  399. TopModuleID = x.TopModuleID
  400. })
  401. ).ToList();
  402. rm = new SuccessResponseMessage(null, i_crm);
  403. rm.DATA.Add(BLWording.REL, saAuthorize);
  404. } while (false);
  405. }
  406. catch (Exception ex)
  407. {
  408. sMsg = Util.GetLastExceptionMsg(ex);
  409. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), @"", @"GetAuthorize(獲取程式權限)", @"", @"", @"");
  410. }
  411. finally
  412. {
  413. if (null != sMsg)
  414. {
  415. rm = new ErrorResponseMessage(sMsg, i_crm);
  416. }
  417. }
  418. return rm;
  419. }
  420. #endregion 獲取程式權限
  421. #region 修改個人密碼
  422. /// <summary>
  423. /// 函式名稱:UpdataPsw
  424. /// 函式說明:修改個人密碼
  425. /// </summary>
  426. /// <param name="i_crm">todo: describe i_crm parameter on UpdataPsw</param>
  427. /// <returns>
  428. /// 回傳 rm(Object)
  429. ///</returns>
  430. public ResponseMessage UpdataPsw(RequestMessage i_crm)
  431. {
  432. ResponseMessage rm = null;
  433. string sMsg = null;
  434. var db = SugarBase.GetIntance();
  435. try
  436. {
  437. do
  438. {
  439. var sUserName = _fetchString(i_crm, @"UserName");
  440. var sOldPsw = _fetchString(i_crm, @"OldPsw");
  441. var sNewPsw = _fetchString(i_crm, @"NewPsw");
  442. var sCalColor = _fetchString(i_crm, @"CalColor");
  443. var sMemberPic = _fetchString(i_crm, @"MemberPic");
  444. var oUser = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == i_crm.USERID);
  445. var dicUpdcols = new Dictionary<string, object>();
  446. var sNewPwd_Encrypt = @"";
  447. if (sOldPsw != @"" && sNewPsw != @"")
  448. {
  449. var sOldPwd = SecurityUtil.Encrypt(sOldPsw);//將輸入之密碼轉換驗證格式
  450. if (oUser.Password != sOldPwd) //舊密碼驗證失敗
  451. {
  452. sMsg = @"1";
  453. break;
  454. }
  455. sNewPwd_Encrypt = SecurityUtil.Encrypt(sNewPsw);//將輸入之密碼轉換驗證格式
  456. dicUpdcols.Add(OTB_SYS_Members.CN_PASSWORD, sNewPwd_Encrypt);
  457. }
  458. dicUpdcols.Add(OTB_SYS_Members.CN_MEMBERNAME, sUserName);
  459. dicUpdcols.Add(OTB_SYS_Members.CN_CALCOLOR, sCalColor);
  460. dicUpdcols.Add(OTB_SYS_Members.CN_MEMBERPIC, sMemberPic);
  461. var iRel = db.Updateable<OTB_SYS_Members>(dicUpdcols)
  462. .Where(x => x.OrgID == i_crm.ORIGID && x.MemberID == i_crm.USERID).ExecuteCommand();
  463. if (iRel <= 0)
  464. {
  465. sMsg = @"2";
  466. break;
  467. }
  468. rm = new SuccessResponseMessage(null, i_crm);
  469. } while (false);
  470. }
  471. catch (Exception ex)
  472. {
  473. sMsg = Util.GetLastExceptionMsg(ex);
  474. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), nameof(Login), @"UpdataPsw(修改個人資料)", @"", @"", @"");
  475. }
  476. finally
  477. {
  478. if (null != sMsg)
  479. {
  480. rm = new ErrorResponseMessage(sMsg, i_crm);
  481. }
  482. }
  483. return rm;
  484. }
  485. #endregion 修改個人密碼
  486. #region 驗證會員帳號
  487. /// <summary>
  488. /// 函式名稱:CheckMember
  489. /// 函式說明:驗證會員帳號
  490. /// </summary>
  491. /// <param name="i_crm">todo: describe i_crm parameter on CheckMember</param>
  492. /// <returns>
  493. /// 回傳 rm(Object)
  494. ///</returns>
  495. public ResponseMessage CheckMember(RequestMessage i_crm)
  496. {
  497. ResponseMessage rm = null;
  498. string sMsg = null;
  499. try
  500. {
  501. rm = SugarBase.ExecTran(db =>
  502. {
  503. do
  504. {
  505. var sOrgID = _fetchString(i_crm, @"OrgID");
  506. var sUserID = _fetchString(i_crm, @"UserID");
  507. //載入資訊
  508. var oUser = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == sOrgID && it.MemberID == sUserID);
  509. if (oUser == null) //驗證帳號或密碼是否正確
  510. {
  511. sMsg = @"1";
  512. break;
  513. }
  514. db.Deleteable<OTB_SYS_ForgetPassword>().Where(x => x.OrgID == sOrgID && x.MemberID == sUserID).ExecuteCommand();
  515. var sRomd = SecurityUtil.GetRandomString(6);
  516. var oForgetPasswordAdd = new OTB_SYS_ForgetPassword
  517. {
  518. OrgID = sOrgID,
  519. MemberID = sUserID,
  520. VerificationCode = SecurityUtil.Encrypt(sRomd),//將輸入之密碼轉換驗證格式
  521. ModifyDate = DateTime.Now
  522. };
  523. var oForgetPassword = db.Insertable(oForgetPasswordAdd).ExecuteReturnEntity();
  524. if (oForgetPassword == null) // 刪除或新增驗證碼成功與否
  525. {
  526. sMsg = @"2";
  527. break;//儲存失敗
  528. }
  529. //儲存驗證碼成功準備寄信
  530. var oEmailInfo = db.Queryable<OTB_SYS_Email>().Single(x => x.OrgID == sOrgID && x.EmailID == @"getNewPsw");
  531. if (oEmailInfo == null)
  532. {
  533. sMsg = @"系統找不到對應的郵件模版";
  534. break;//儲存失敗
  535. }
  536. var sEmailBody = @"";
  537. sEmailBody = oEmailInfo.BodyHtml.Replace(@"{{:UserName}}", oUser.MemberName).Replace(@"{{:MemberPwd}}", sRomd);
  538. var oEmail = new Emails();
  539. var saEmailTo = new List<EmailTo>();
  540. //收件人
  541. var oEmailTo = new EmailTo
  542. {
  543. ToUserID = oUser.MemberID,
  544. ToUserName = oUser.MemberName,
  545. ToEmail = oUser.Email,
  546. Type = @"to"
  547. };
  548. saEmailTo.Add(oEmailTo);
  549. oEmail.FromUserName = @"系統自動發送";//取fonfig
  550. oEmail.Title = @"驗證碼";//取fonfig
  551. oEmail.EmailBody = sEmailBody;
  552. oEmail.IsCCSelf = false;
  553. oEmail.Attachments = null;
  554. oEmail.EmailTo = saEmailTo;
  555. var bSend = new MailService(sOrgID).MailFactory(oEmail, out sMsg);
  556. if (sMsg != null)
  557. {
  558. break;
  559. }
  560. oForgetPassword.ModifyDate = DateTime.Now;
  561. db.Updateable(oForgetPassword).UpdateColumns(x => x.ModifyDate).ExecuteCommand();
  562. rm = new SuccessResponseMessage(null, i_crm);
  563. } while (false);
  564. return rm;
  565. });
  566. }
  567. catch (Exception ex)
  568. {
  569. sMsg = Util.GetLastExceptionMsg(ex);
  570. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), nameof(Login), @"CheckMember(驗證會員帳號)", @"", @"", @"");
  571. }
  572. finally
  573. {
  574. if (null != sMsg)
  575. {
  576. rm = new ErrorResponseMessage(sMsg, i_crm);
  577. }
  578. }
  579. return rm;
  580. }
  581. #endregion 驗證會員帳號
  582. #region 重設密碼
  583. /// <summary>
  584. /// 函式名稱:Check
  585. /// 函式說明:重設密碼
  586. /// </summary>
  587. /// <param name="i_crm">todo: describe i_crm parameter on ReSetPassword</param>
  588. /// <returns>
  589. /// 回傳 rm(Object)
  590. ///</returns>
  591. public ResponseMessage ReSetPassword(RequestMessage i_crm)
  592. {
  593. ResponseMessage rm = null;
  594. string sMsg = null;
  595. try
  596. {
  597. rm = SugarBase.ExecTran(db =>
  598. {
  599. do
  600. {
  601. var sOrgID = _fetchString(i_crm, @"OrgID");
  602. var sUserID = _fetchString(i_crm, @"UserID");
  603. var sVerificationCode = _fetchString(i_crm, @"VerificationCode");
  604. var sNewPsw = _fetchString(i_crm, @"NewPsw");
  605. var oUser = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == sOrgID && it.MemberID == sUserID);
  606. if (oUser.MemberID == null) //查無此會員資料或MemberID為空
  607. {
  608. sMsg = @"1";
  609. break;
  610. }
  611. var oForgetPassword = db.Queryable<OTB_SYS_ForgetPassword>().Single(x => x.OrgID == sOrgID && x.MemberID == oUser.MemberID);
  612. if (oForgetPassword == null)
  613. {
  614. sMsg = @"4";
  615. break;
  616. }
  617. var sEncryptVerificationCode = SecurityUtil.Encrypt(sVerificationCode);//將輸入之密碼轉換驗證格式
  618. if (oForgetPassword.MemberID != sUserID || oForgetPassword.VerificationCode != sEncryptVerificationCode)
  619. {
  620. sMsg = @"0";
  621. break;
  622. }
  623. var Time = DateTime.Now;
  624. var DataNow = new TimeSpan(Time.Ticks);
  625. var CeateDate = new TimeSpan(oForgetPassword.ModifyDate.Value.Ticks);
  626. var ts = DataNow - CeateDate;
  627. var ts5 = DataNow.Subtract(CeateDate);
  628. var RunTime = int.Parse(ts5.TotalSeconds.ToString().Split('.')[0].ToString());
  629. if (RunTime > 60) //驗證碼超出限制時間刪除該筆資料
  630. {
  631. var iDel = db.Deleteable<OTB_SYS_ForgetPassword>().Where(x => x.OrgID == sOrgID && x.MemberID == sUserID).ExecuteCommand();
  632. if (iDel > 0)
  633. {
  634. sMsg = @"2";
  635. break;
  636. }
  637. }
  638. var sNewPwd = SecurityUtil.Encrypt(sNewPsw);//將輸入之密碼轉換驗證格式
  639. var oMembers = new OTB_SYS_Members
  640. {
  641. Password = sNewPwd
  642. };
  643. var iRel = db.Updateable(oMembers).UpdateColumns(x => new { x.Password }).Where(x => x.OrgID == sOrgID && x.MemberID == sUserID).ExecuteCommand();
  644. if (iRel == 0) //更新資料失敗
  645. {
  646. sMsg = @"3";
  647. break;
  648. }
  649. var iDel2 = db.Deleteable<OTB_SYS_ForgetPassword>().Where(x => x.OrgID == sOrgID && x.MemberID == sUserID).ExecuteCommand();
  650. rm = new SuccessResponseMessage(null, i_crm);
  651. } while (false);
  652. return rm;
  653. });
  654. }
  655. catch (Exception ex)
  656. {
  657. sMsg = Util.GetLastExceptionMsg(ex);
  658. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), nameof(Login), @"Check(驗證碼時間檢驗)", @"", @"", @"");
  659. }
  660. finally
  661. {
  662. if (null != sMsg)
  663. {
  664. rm = new ErrorResponseMessage(sMsg, i_crm);
  665. }
  666. }
  667. return rm;
  668. }
  669. #endregion 重設密碼
  670. #region 新增帳號寄送初始密碼給新帳號人員
  671. /// <summary>
  672. /// 函式名稱:SendPswToNewMember
  673. /// 函式說明:新增帳號寄送初始密碼給新帳號人員
  674. /// </summary>
  675. /// <param name="i_crm">todo: describe i_crm parameter on SendPswToNewMember</param>
  676. /// <returns>
  677. /// 回傳 rm(Object)
  678. ///</returns>
  679. public ResponseMessage SendPswToNewMember(RequestMessage i_crm)
  680. {
  681. ResponseMessage rm = null;
  682. string sMsg = null;
  683. var db = SugarBase.GetIntance();
  684. try
  685. {
  686. do
  687. {
  688. var sOrgID = _fetchString(i_crm, @"OrgID");
  689. var sUserID = _fetchString(i_crm, @"UserID");
  690. var sEmailBody = @"";
  691. var oUser = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == i_crm.USERID);
  692. var oEmail_O = db.Queryable<OTB_SYS_Email>().Single(x => x.OrgID == sOrgID && x.EmailID == @"Member");
  693. if (oEmail_O == null)
  694. {
  695. sMsg = @"系統找不到對應的郵件模版";
  696. break;
  697. }
  698. sEmailBody = oEmail_O.BodyHtml
  699. .Replace(@"{{:UserName}}", oUser.MemberName)
  700. .Replace(@"{{:MemberPwd}}", SecurityUtil.Decrypt(oUser.Password));
  701. var oEmail = new Emails();
  702. var saEmailTo = new List<EmailTo>();
  703. //收件人
  704. var oEmailTo = new EmailTo
  705. {
  706. ToUserID = oUser.MemberID,
  707. ToUserName = oUser.MemberName,
  708. ToEmail = oUser.Email,
  709. Type = @"to"
  710. };
  711. saEmailTo.Add(oEmailTo);
  712. oEmail.FromUserName = @"系統自動發送";//取fonfig
  713. oEmail.Title = @"初始密碼";//取fonfig
  714. oEmail.EmailBody = sEmailBody;
  715. oEmail.IsCCSelf = false;
  716. oEmail.Attachments = null;
  717. oEmail.EmailTo = saEmailTo;
  718. var bSend = new MailService(i_crm.ORIGID).MailFactory(oEmail, out sMsg);
  719. if (sMsg != null)
  720. {
  721. break;
  722. }
  723. rm = new SuccessResponseMessage(null, i_crm);
  724. rm.DATA.Add(BLWording.REL, bSend);
  725. } while (false);
  726. }
  727. catch (Exception ex)
  728. {
  729. sMsg = Util.GetLastExceptionMsg(ex);
  730. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(AuthorizeService), nameof(Login), @"SendPswToNewMember(新增帳號寄送初始密碼給新帳號人員)", @"", @"", @"");
  731. }
  732. finally
  733. {
  734. if (null != sMsg)
  735. {
  736. rm = new ErrorResponseMessage(sMsg, i_crm);
  737. }
  738. }
  739. return rm;
  740. }
  741. #endregion 新增帳號寄送初始密碼給新帳號人員
  742. /// <summary>
  743. /// </summary>
  744. /// <param name="i_rRequest"></param>
  745. /// <returns></returns>
  746. public static string GetClientIp(HttpRequestMessage i_rRequest) => i_rRequest.Properties.ContainsKey(@"MS_HttpContext") ? ((HttpContextWrapper)i_rRequest.Properties[@"MS_HttpContext"]).Request.UserHostAddress : HttpContext.Current?.Request.UserHostAddress;
  747. private class UserInfo
  748. {
  749. public UserInfo()
  750. {
  751. roles = @"";
  752. Supervisors = @"";
  753. UsersDown = @"";
  754. UsersBranch = @"";
  755. }
  756. public string MemberID { get; set; }
  757. public string MemberName { get; set; }
  758. public string Email { get; set; }
  759. public string DepartmentID { get; set; }
  760. public string Effective { get; set; }
  761. public string CalColor { get; set; }
  762. public string MemberPic { get; set; }
  763. public string SysShowMode { get; set; }
  764. public string Country { get; set; }
  765. public string ServiceCode { get; set; }
  766. public string Address { get; set; }
  767. public string DepartmentName { get; set; }
  768. public string JobtitleName { get; set; }
  769. public string roles { get; set; }
  770. public string Supervisors { get; set; }
  771. public string UsersDown { get; set; }
  772. public string UsersBranch { get; set; }
  773. public string OutlookAccount { get; set; }
  774. }
  775. private class AuthorizeInfo
  776. {
  777. public string RuleID { get; set; }
  778. public string ProgramID { get; set; }
  779. public string AllowRight { get; set; }
  780. public string TopModuleID { get; set; }
  781. }
  782. }
  783. }