SysCom.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web;
  6. using PMS.BusinessModels;
  7. using PMS.BusinessModels.Account;
  8. using PMS.Interface;
  9. using PMS.Interface.SysManager;
  10. using QWPlatform.SystemLibrary.LogManager;
  11. using QWPlatform.SystemLibrary.Security;
  12. using QWPlatform.SystemLibrary.Utils;
  13. using QWPlatform.SystemLibrary.Web;
  14. using PMS.BusinessModels.MobileProblem;
  15. using PMS.BusinessModels.SysManager;
  16. using System.Web.Http;
  17. using System.Net.Http;
  18. using System.Text;
  19. using Newtonsoft.Json.Linq;
  20. using PMS.BusinessModels.SMS;
  21. using System.Web.Script.Serialization;
  22. using PMS.Interface.Product;
  23. namespace PMS.WebUI
  24. {
  25. public class SysCom
  26. {
  27. ICPWTJLModel CPWTJL_obj = InterfaceFactory.CreateBusinessInstance<ICPWTJLModel>();
  28. //存储每个url 对应的授权码
  29. private ConcurrentDictionary<string, string> _dictAuthkeys = new ConcurrentDictionary<string, string>();
  30. //存放token
  31. private ConcurrentDictionary<string, string> token_cache = new ConcurrentDictionary<string, string>();
  32. /// <summary>
  33. /// 创 建 人:王海洋
  34. /// 创建日期:2018-12-19
  35. /// 功能描述:系统公共接口
  36. /// </summary>
  37. IAccount account_obj = InterfaceFactory.CreateBusinessInstance<IAccount>();
  38. //配置服务
  39. ISysConfig sys_config = InterfaceFactory.CreateBusinessInstance<ISysConfig>();
  40. //附件服务器地址
  41. private string ftpServerAddress = string.Empty;
  42. //短信服务器地址
  43. private string SMSServerAddress = string.Empty;
  44. /// <summary>
  45. /// 文件地址IP
  46. /// </summary>
  47. private string GetFileUrl = string.Empty;
  48. //单例模式
  49. private static SysCom _obj;
  50. /// <summary>
  51. /// 当前实例对象
  52. /// </summary>
  53. public static SysCom Instance
  54. {
  55. get
  56. {
  57. if (_obj == null)
  58. _obj = new SysCom();
  59. return _obj;
  60. }
  61. }
  62. /// <summary>
  63. /// 获取到当前账户的登录信息
  64. /// </summary>
  65. /// <returns></returns>
  66. public UserInfo GetCurrentAccount()
  67. {
  68. //判断是否登录或是否用权限,如果有那么就进行相应的操作,否则跳转到登录页或者授权页面
  69. var userkey = CookiesHelper.GetCookieValue("UserID");
  70. string s_accountId = "";
  71. if (!string.IsNullOrEmpty(userkey.Trim()))
  72. {//获取解密后的用户ID
  73. s_accountId = DESEncrypt.DesDecrypt(userkey);
  74. }
  75. int accountid = 0;
  76. if (int.TryParse(s_accountId, out accountid))
  77. {//从业务层读取用户信息
  78. //var account_objs = new PMS.BusinessService.SysManager.AccountBLLService();
  79. //return account_objs.GetAccountInfo(accountid);
  80. return account_obj.GetAccountInfo(accountid);
  81. }
  82. return null;
  83. }
  84. /// <summary>
  85. /// 退出登录时清空用户缓存
  86. /// </summary>
  87. /// <param name="id">账户ID</param>
  88. public void ClearAccountCache(int id)
  89. {
  90. account_obj.RemoveCacheUser(id);
  91. }
  92. #region 文件上传下载(FTP)
  93. /// <summary>
  94. /// 上传附件到FTP服务器
  95. /// </summary>
  96. /// <param name="filedata">文件内容字节</param>
  97. /// <param name="fileName">文件名称(不带扩展名)</param>
  98. /// <param name="filetype"></param>
  99. /// <returns></returns>
  100. public FtpUploadResult UploadFileToFtp(byte[] filedata, string fileName, string filetype)
  101. {
  102. try
  103. {
  104. if (string.IsNullOrEmpty(ftpServerAddress))
  105. {//如果ftpserv没有获取值,则获取
  106. ftpServerAddress = System.Configuration.ConfigurationManager.AppSettings["ftpServer"];
  107. }
  108. var objs = new List<object>();
  109. objs.Add(filedata);
  110. objs.Add(fileName);
  111. objs.Add(filetype);
  112. var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "upload", objs.ToArray());
  113. //判断上传是否成功
  114. var rstr = r.ToString();
  115. return Strings.JsonToModel<FtpUploadResult>(rstr);
  116. }
  117. catch (Exception ex)
  118. {
  119. Logger.Instance.Error("文件上传到FTP服务异常,fileName:" + fileName, ex);
  120. return null;
  121. }
  122. }
  123. /// <summary>
  124. /// 获取FTP文件的url
  125. /// </summary>
  126. /// <param name="fileId">多个文件逗号隔开</param>
  127. /// <param name="filetype"></param>
  128. /// <returns></returns>
  129. public FtpUrlResult GetFtpUrl( string fileId, string filetype)
  130. {
  131. try
  132. {
  133. if (string.IsNullOrEmpty(ftpServerAddress))
  134. {//如果ftpserv没有获取值,则获取
  135. ftpServerAddress = System.Configuration.ConfigurationManager.AppSettings["ftpServer"];
  136. }
  137. var objs = new List<object>();
  138. objs.Add(fileId);
  139. objs.Add(filetype);
  140. var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "GetFileUrl", objs.ToArray());
  141. //判断上传是否成功
  142. var rstr = r.ToString();
  143. return Strings.JsonToModel<FtpUrlResult>(rstr);
  144. }
  145. catch (Exception ex)
  146. {
  147. Logger.Instance.Error("获取文件地址,FTP服务异常,fileName:" + fileId, ex);
  148. return null;
  149. }
  150. }
  151. /// <summary>
  152. /// 返回文件字节内容
  153. /// </summary>
  154. /// <param name="fileId">文件ID</param>
  155. /// <param name="imageType">o原图,s缩略图,m大图</param>
  156. /// <returns>文件的具体内容</returns>
  157. public byte[] DownloadFileBytesFromFtp(string fileId, string imageType)
  158. {
  159. try
  160. {
  161. if (string.IsNullOrEmpty(ftpServerAddress))
  162. {//如果ftpserv没有获取值,则获取
  163. ftpServerAddress = System.Configuration.ConfigurationManager.AppSettings["ftpServer"];
  164. }
  165. string[] arr = { fileId, imageType };
  166. var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "getNewFileData", arr);
  167. if (r != null)
  168. {
  169. return r as byte[];
  170. }
  171. return null;
  172. }
  173. catch (Exception ex)
  174. {
  175. Logger.Instance.Error("从FTP服务获取文件内容异常,文件ID:" + fileId, ex);
  176. return null;
  177. }
  178. }
  179. /// <summary>
  180. /// 下载文件,返回对象
  181. /// </summary>
  182. /// <param name="fileId">文件ID</param>
  183. /// <param name="imageType">o原图,s缩略图,m大图</param>
  184. /// <returns>返回一个对象结果</returns>
  185. public FtpDownloadResult DownloadFileBase64FromFtp(string fileId, string imageType)
  186. {
  187. try
  188. {
  189. if (string.IsNullOrEmpty(ftpServerAddress))
  190. {//如果ftpserv没有获取值,则获取
  191. GetFileUrl = System.Configuration.ConfigurationManager.AppSettings["GetFileUrl"];
  192. }
  193. string[] arr = { fileId, imageType };
  194. var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "getNewBase64File", arr);
  195. if (r != null)
  196. {
  197. return Strings.JsonToModel<FtpDownloadResult>(r.ToString());
  198. }
  199. return null;
  200. }
  201. catch (Exception ex)
  202. {
  203. Logger.Instance.Error("从FTP服务获取文件内容异常,文件ID:" + fileId, ex);
  204. return null;
  205. }
  206. }
  207. #endregion
  208. //调用家医必须使用的授权码
  209. public string ZlsoftAppServiceAuthkey(string url)
  210. {
  211. var authkey = "";
  212. if (!string.IsNullOrEmpty(url))
  213. {
  214. if (_dictAuthkeys.ContainsKey(url))
  215. { //缓存获取
  216. _dictAuthkeys.TryGetValue(url, out authkey);
  217. }
  218. else
  219. {//重新生成一个新的key
  220. if (url.IndexOf("://") >= 0)
  221. {
  222. var beginIndex = url.IndexOf("://") + 3;
  223. url = url.Substring(beginIndex, url.Length - beginIndex);
  224. }
  225. if (url.IndexOf("/Services") >= 0)
  226. url = url.Substring(0, url.IndexOf("/Services"));
  227. authkey = "zlsoft_" + DESEncrypt.DesEncrypt(url + "?source=062");
  228. //添加到缓存中
  229. _dictAuthkeys.TryAdd(url, authkey);
  230. }
  231. }
  232. return authkey;
  233. }
  234. #region 短信验证码
  235. /// <summary>
  236. ///短信验证【阿里云短信】
  237. /// </summary>
  238. /// <param name="requestJObject"></param>
  239. /// <returns></returns>
  240. [HttpPost]
  241. public string ZlsoftAppSms(string phone)
  242. {
  243. try
  244. {
  245. var token = "";
  246. var client = new HttpClient();
  247. client.DefaultRequestHeaders.Add("AccessKeyId", "6BCF42181F4F3818571D72D0C93F515E");
  248. client.DefaultRequestHeaders.Add("AccessKeySecret", "960F4DB5EBD5C8445E6A8CE5FB6423DF");
  249. var url = string.Format("https://www.fdisp.cn:4433/api/WebApi/SystemAPI/GetAccessToken?siteid={0}&sms_account={1}&sms_password={2}", "11", "0dbc7eadde335d4b22d8799d5cb91b475aa01", "0F4D624DD8058583CCA2F635D4BB0EB9");
  250. var content = new StringContent("", Encoding.UTF8, "text/json");
  251. //判断缓存中是否有值
  252. if (token_cache.ContainsKey("vcode"))
  253. {
  254. //缓存获取
  255. token_cache.TryGetValue("vcode", out token);
  256. string[] tokentime = token.Split('|');
  257. var time1 = Convert.ToDateTime(tokentime[1]);
  258. var time2 = Convert.ToDateTime(CPWTJL_obj.GetDatabaseTime().ToString());
  259. TimeSpan ts = time2 - time1;
  260. if (ts.TotalHours < 2)
  261. {
  262. token = tokentime[0];
  263. }
  264. else
  265. {
  266. //重新生成一个新的token
  267. var result = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;
  268. JObject jObject = JObject.Parse(result);
  269. if (jObject["code"].ToString() == "100")
  270. {
  271. token = jObject["data"].ToString();
  272. }
  273. else
  274. {
  275. return null;
  276. }
  277. //添加到缓存中
  278. string time = CPWTJL_obj.GetDatabaseTime().ToString();
  279. token_cache.TryAdd("vcode", token + "|" + time);
  280. }
  281. }
  282. else
  283. {
  284. //重新生成一个新的token
  285. var result = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;
  286. JObject jObject = JObject.Parse(result);
  287. if (jObject["code"].ToString() == "100")
  288. {
  289. token = jObject["data"].ToString();
  290. }
  291. else
  292. {
  293. return null;
  294. }
  295. //添加到缓存中
  296. string time = CPWTJL_obj.GetDatabaseTime().ToString();
  297. token_cache.TryAdd("vcode", token + "|" + time);
  298. }
  299. var smsurl = string.Format("https://www.fdisp.cn:4433/api/WebApi/SystemAPI/SendingSMS");
  300. client.DefaultRequestHeaders.Add("token", token);
  301. //签名参数字符串
  302. SMSBusinessModel sms = new SMSBusinessModel();
  303. smstemplate smstemp = new smstemplate();
  304. smstemp.code = Str();
  305. sms.noncestr = Guid.NewGuid().ToString();
  306. sms.timestamp = GetUnixTime(CPWTJL_obj.GetDatabaseTime()).ToString();
  307. sms.phone_numbers = phone;
  308. sms.template_code = "SMS_134210153";
  309. sms.paramates = smstemp;//验证码
  310. sms.sign_name = "筷子家医";
  311. sms.org_id = "9630";//机构id
  312. sms.sms_account = "0dbc7eadde335d4b22d8799d5cb91b475aa01";//账号
  313. sms.sms_password = "0F4D624DD8058583CCA2F635D4BB0EB9";//密码
  314. SmsBaseBuinessModel baseSMS = new SmsBaseBuinessModel();
  315. baseSMS.send_type = 1;
  316. baseSMS.source_mode = 4;
  317. baseSMS.siteid = "11";
  318. baseSMS.sign_parm_string = sms.ToJson();//数字签名字符串
  319. baseSMS.sign_string = GetSHA1(Transform(baseSMS.sign_parm_string));//签名参数字符串
  320. var incontent = baseSMS.ToJson().Replace("\\\\\\", "\\").Replace("\\\\", "\\").Replace("\\r\\n", "").Replace(" ", "");
  321. incontent = incontent.Replace("\\r\\n", "");
  322. content = new StringContent(incontent, Encoding.UTF8, "text/json");
  323. var state = client.PostAsync(smsurl, content).Result.Content.ReadAsStringAsync().Result;
  324. SmsErrorBuinessModel errorModel = Strings.JsonToModel<SmsErrorBuinessModel>(state);
  325. if (errorModel.code == 100)
  326. {
  327. return smstemp.code;
  328. }
  329. else
  330. {
  331. Logger.Instance.Error(errorModel.errormessage);
  332. }
  333. return null;
  334. }
  335. catch (Exception ex)
  336. {
  337. Logger.Instance.Error("调用ZlsoftAppSms时发生异常错误", ex);
  338. return null;
  339. }
  340. }
  341. private string Transform(string sign)
  342. {
  343. JavaScriptSerializer serializer = new JavaScriptSerializer();
  344. Dictionary<string, object> obj = (Dictionary<string, object>)serializer.DeserializeObject(sign);
  345. var parameters = obj.ToString();
  346. return parameters;
  347. }
  348. public bool CheckSign(string sign_parm_string, string signign_string, ref string msg)
  349. {
  350. JavaScriptSerializer serializer = new JavaScriptSerializer();
  351. Dictionary<string, object> obj = (Dictionary<string, object>)serializer.DeserializeObject(sign_parm_string);
  352. var parameters = obj;
  353. //var parameters = Tools.JsonToDictionary(sign_parm_string);
  354. var Sha1String = parameters.ToString();
  355. if (GetSHA1(Sha1String) == signign_string)
  356. {
  357. return true;
  358. }
  359. else
  360. {
  361. msg = "签名错误!";
  362. return false;
  363. }
  364. }
  365. //签名字符串
  366. public static string GetSHA1(string strSource)
  367. {
  368. string strResult = "";
  369. //Create
  370. System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create();
  371. byte[] bytResult = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource));
  372. for (int i = 0; i < bytResult.Length; i++)
  373. {
  374. strResult = strResult + bytResult[i].ToString("X2");
  375. }
  376. return strResult;
  377. }
  378. /// <summary>
  379. /// 获取时间戳
  380. /// </summary>
  381. /// <param name="nowTime">当前时间</param>
  382. /// <returns>时间戳(type:long)</returns>
  383. static long GetUnixTime(DateTime nowTime)
  384. {
  385. DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0));
  386. return (long)Math.Round((nowTime - startTime).TotalSeconds, MidpointRounding.AwayFromZero);
  387. }
  388. /// <summary>
  389. /// 生成随机字母与数字
  390. /// </summary>
  391. /// <param name="Length">生成长度</param>
  392. /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
  393. public static string Str()
  394. {
  395. System.Threading.Thread.Sleep(3);
  396. char[] Pattern = new char[]
  397. {
  398. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
  399. 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
  400. };
  401. string result = "";
  402. int n = Pattern.Length;
  403. System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
  404. for (int i = 0; i < 4; i++)
  405. {
  406. int rnd = random.Next(0, n);
  407. result += Pattern[rnd];
  408. }
  409. return result;
  410. }
  411. #endregion
  412. /// <summary>
  413. /// 短信发送接口
  414. /// </summary>
  415. /// <param name="telephone"></param>
  416. /// <param name="code"></param>
  417. /// <returns></returns>
  418. public bool ZLsoftSMSCodeSend(string telephone,string code)
  419. {
  420. try
  421. {
  422. if (string.IsNullOrEmpty(SMSServerAddress))
  423. {//如果SMSServerAddress没有获取值,则获取
  424. SMSServerAddress = System.Configuration.ConfigurationManager.AppSettings["SMSServer"];
  425. }
  426. TelephoneMessegeModel MessegeModel = new TelephoneMessegeModel();
  427. MessegeModel.PhoneNumbers = telephone;
  428. Dictionary<string, string> param = new Dictionary<string, string>();
  429. param.Add("code", code);
  430. MessegeModel.Paramates = param;
  431. MessegeModel.TemplateCode = "SMS_134210153";
  432. MessegeModel.SignName = "";
  433. var objs = new List<object>();
  434. objs.Add("zlsoft");
  435. objs.Add("zlsoft2018");
  436. objs.Add(Strings.ObjectToJson(MessegeModel));
  437. objs.Add("2017");
  438. var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(SMSServerAddress, "", "SendAliSMS", objs.ToArray(), ZlsoftAppServiceAuthkey(SMSServerAddress));
  439. return Convert.ToBoolean(r);
  440. }
  441. catch (Exception ex)
  442. {
  443. Logger.Instance.Error("短信发送接口错误", ex);
  444. return false;
  445. }
  446. }
  447. /// <summary>
  448. /// 获取邮件服务器的配置
  449. /// </summary>
  450. /// <returns>返回配置信息</returns>
  451. public emailConfig GetSysEmailConfig()
  452. {
  453. return sys_config.GetEmailConfig();
  454. }
  455. }
  456. }