using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Web; using PMS.BusinessModels; using PMS.BusinessModels.Account; using PMS.Interface; using PMS.Interface.SysManager; using QWPlatform.SystemLibrary.LogManager; using QWPlatform.SystemLibrary.Security; using QWPlatform.SystemLibrary.Utils; using QWPlatform.SystemLibrary.Web; using PMS.BusinessModels.MobileProblem; using PMS.BusinessModels.SysManager; using System.Web.Http; using System.Net.Http; using System.Text; using Newtonsoft.Json.Linq; using PMS.BusinessModels.SMS; using System.Web.Script.Serialization; using PMS.Interface.Product; namespace PMS.WebUI { public class SysCom { ICPWTJLModel CPWTJL_obj = InterfaceFactory.CreateBusinessInstance(); //存储每个url 对应的授权码 private ConcurrentDictionary _dictAuthkeys = new ConcurrentDictionary(); //存放token private ConcurrentDictionary token_cache = new ConcurrentDictionary(); /// /// 创 建 人:王海洋 /// 创建日期:2018-12-19 /// 功能描述:系统公共接口 /// IAccount account_obj = InterfaceFactory.CreateBusinessInstance(); //配置服务 ISysConfig sys_config = InterfaceFactory.CreateBusinessInstance(); //附件服务器地址 private string ftpServerAddress = string.Empty; //短信服务器地址 private string SMSServerAddress = string.Empty; /// /// 文件地址IP /// private string GetFileUrl = string.Empty; //单例模式 private static SysCom _obj; /// /// 当前实例对象 /// public static SysCom Instance { get { if (_obj == null) _obj = new SysCom(); return _obj; } } /// /// 获取到当前账户的登录信息 /// /// public UserInfo GetCurrentAccount() { //判断是否登录或是否用权限,如果有那么就进行相应的操作,否则跳转到登录页或者授权页面 var userkey = CookiesHelper.GetCookieValue("UserID"); string s_accountId = ""; if (!string.IsNullOrEmpty(userkey.Trim())) {//获取解密后的用户ID s_accountId = DESEncrypt.DesDecrypt(userkey); } int accountid = 0; if (int.TryParse(s_accountId, out accountid)) {//从业务层读取用户信息 //var account_objs = new PMS.BusinessService.SysManager.AccountBLLService(); //return account_objs.GetAccountInfo(accountid); return account_obj.GetAccountInfo(accountid); } return null; } /// /// 退出登录时清空用户缓存 /// /// 账户ID public void ClearAccountCache(int id) { account_obj.RemoveCacheUser(id); } #region 文件上传下载(FTP) /// /// 上传附件到FTP服务器 /// /// 文件内容字节 /// 文件名称(不带扩展名) /// /// public FtpUploadResult UploadFileToFtp(byte[] filedata, string fileName, string filetype) { try { if (string.IsNullOrEmpty(ftpServerAddress)) {//如果ftpserv没有获取值,则获取 ftpServerAddress = System.Configuration.ConfigurationManager.AppSettings["ftpServer"]; } var objs = new List(); objs.Add(filedata); objs.Add(fileName); objs.Add(filetype); var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "upload", objs.ToArray()); //判断上传是否成功 var rstr = r.ToString(); return Strings.JsonToModel(rstr); } catch (Exception ex) { Logger.Instance.Error("文件上传到FTP服务异常,fileName:" + fileName, ex); return null; } } /// /// 获取FTP文件的url /// /// 多个文件逗号隔开 /// /// public FtpUrlResult GetFtpUrl( string fileId, string filetype) { try { if (string.IsNullOrEmpty(ftpServerAddress)) {//如果ftpserv没有获取值,则获取 ftpServerAddress = System.Configuration.ConfigurationManager.AppSettings["ftpServer"]; } var objs = new List(); objs.Add(fileId); objs.Add(filetype); var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "GetFileUrl", objs.ToArray()); //判断上传是否成功 var rstr = r.ToString(); return Strings.JsonToModel(rstr); } catch (Exception ex) { Logger.Instance.Error("获取文件地址,FTP服务异常,fileName:" + fileId, ex); return null; } } /// /// 返回文件字节内容 /// /// 文件ID /// o原图,s缩略图,m大图 /// 文件的具体内容 public byte[] DownloadFileBytesFromFtp(string fileId, string imageType) { try { if (string.IsNullOrEmpty(ftpServerAddress)) {//如果ftpserv没有获取值,则获取 ftpServerAddress = System.Configuration.ConfigurationManager.AppSettings["ftpServer"]; } string[] arr = { fileId, imageType }; var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "getNewFileData", arr); if (r != null) { return r as byte[]; } return null; } catch (Exception ex) { Logger.Instance.Error("从FTP服务获取文件内容异常,文件ID:" + fileId, ex); return null; } } /// /// 下载文件,返回对象 /// /// 文件ID /// o原图,s缩略图,m大图 /// 返回一个对象结果 public FtpDownloadResult DownloadFileBase64FromFtp(string fileId, string imageType) { try { if (string.IsNullOrEmpty(ftpServerAddress)) {//如果ftpserv没有获取值,则获取 GetFileUrl = System.Configuration.ConfigurationManager.AppSettings["GetFileUrl"]; } string[] arr = { fileId, imageType }; var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(ftpServerAddress, "", "getNewBase64File", arr); if (r != null) { return Strings.JsonToModel(r.ToString()); } return null; } catch (Exception ex) { Logger.Instance.Error("从FTP服务获取文件内容异常,文件ID:" + fileId, ex); return null; } } #endregion //调用家医必须使用的授权码 public string ZlsoftAppServiceAuthkey(string url) { var authkey = ""; if (!string.IsNullOrEmpty(url)) { if (_dictAuthkeys.ContainsKey(url)) { //缓存获取 _dictAuthkeys.TryGetValue(url, out authkey); } else {//重新生成一个新的key if (url.IndexOf("://") >= 0) { var beginIndex = url.IndexOf("://") + 3; url = url.Substring(beginIndex, url.Length - beginIndex); } if (url.IndexOf("/Services") >= 0) url = url.Substring(0, url.IndexOf("/Services")); authkey = "zlsoft_" + DESEncrypt.DesEncrypt(url + "?source=062"); //添加到缓存中 _dictAuthkeys.TryAdd(url, authkey); } } return authkey; } #region 短信验证码 /// ///短信验证【阿里云短信】 /// /// /// [HttpPost] public string ZlsoftAppSms(string phone) { try { var token = ""; var client = new HttpClient(); client.DefaultRequestHeaders.Add("AccessKeyId", "6BCF42181F4F3818571D72D0C93F515E"); client.DefaultRequestHeaders.Add("AccessKeySecret", "960F4DB5EBD5C8445E6A8CE5FB6423DF"); var url = string.Format("https://www.fdisp.cn:4433/api/WebApi/SystemAPI/GetAccessToken?siteid={0}&sms_account={1}&sms_password={2}", "11", "0dbc7eadde335d4b22d8799d5cb91b475aa01", "0F4D624DD8058583CCA2F635D4BB0EB9"); var content = new StringContent("", Encoding.UTF8, "text/json"); //判断缓存中是否有值 if (token_cache.ContainsKey("vcode")) { //缓存获取 token_cache.TryGetValue("vcode", out token); string[] tokentime = token.Split('|'); var time1 = Convert.ToDateTime(tokentime[1]); var time2 = Convert.ToDateTime(CPWTJL_obj.GetDatabaseTime().ToString()); TimeSpan ts = time2 - time1; if (ts.TotalHours < 2) { token = tokentime[0]; } else { //重新生成一个新的token var result = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result; JObject jObject = JObject.Parse(result); if (jObject["code"].ToString() == "100") { token = jObject["data"].ToString(); } else { return null; } //添加到缓存中 string time = CPWTJL_obj.GetDatabaseTime().ToString(); token_cache.TryAdd("vcode", token + "|" + time); } } else { //重新生成一个新的token var result = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result; JObject jObject = JObject.Parse(result); if (jObject["code"].ToString() == "100") { token = jObject["data"].ToString(); } else { return null; } //添加到缓存中 string time = CPWTJL_obj.GetDatabaseTime().ToString(); token_cache.TryAdd("vcode", token + "|" + time); } var smsurl = string.Format("https://www.fdisp.cn:4433/api/WebApi/SystemAPI/SendingSMS"); client.DefaultRequestHeaders.Add("token", token); //签名参数字符串 SMSBusinessModel sms = new SMSBusinessModel(); smstemplate smstemp = new smstemplate(); smstemp.code = Str(); sms.noncestr = Guid.NewGuid().ToString(); sms.timestamp = GetUnixTime(CPWTJL_obj.GetDatabaseTime()).ToString(); sms.phone_numbers = phone; sms.template_code = "SMS_134210153"; sms.paramates = smstemp;//验证码 sms.sign_name = "筷子家医"; sms.org_id = "9630";//机构id sms.sms_account = "0dbc7eadde335d4b22d8799d5cb91b475aa01";//账号 sms.sms_password = "0F4D624DD8058583CCA2F635D4BB0EB9";//密码 SmsBaseBuinessModel baseSMS = new SmsBaseBuinessModel(); baseSMS.send_type = 1; baseSMS.source_mode = 4; baseSMS.siteid = "11"; baseSMS.sign_parm_string = sms.ToJson();//数字签名字符串 baseSMS.sign_string = GetSHA1(Transform(baseSMS.sign_parm_string));//签名参数字符串 var incontent = baseSMS.ToJson().Replace("\\\\\\", "\\").Replace("\\\\", "\\").Replace("\\r\\n", "").Replace(" ", ""); incontent = incontent.Replace("\\r\\n", ""); content = new StringContent(incontent, Encoding.UTF8, "text/json"); var state = client.PostAsync(smsurl, content).Result.Content.ReadAsStringAsync().Result; SmsErrorBuinessModel errorModel = Strings.JsonToModel(state); if (errorModel.code == 100) { return smstemp.code; } else { Logger.Instance.Error(errorModel.errormessage); } return null; } catch (Exception ex) { Logger.Instance.Error("调用ZlsoftAppSms时发生异常错误", ex); return null; } } private string Transform(string sign) { JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary obj = (Dictionary)serializer.DeserializeObject(sign); var parameters = obj.ToString(); return parameters; } public bool CheckSign(string sign_parm_string, string signign_string, ref string msg) { JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary obj = (Dictionary)serializer.DeserializeObject(sign_parm_string); var parameters = obj; //var parameters = Tools.JsonToDictionary(sign_parm_string); var Sha1String = parameters.ToString(); if (GetSHA1(Sha1String) == signign_string) { return true; } else { msg = "签名错误!"; return false; } } //签名字符串 public static string GetSHA1(string strSource) { string strResult = ""; //Create System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create(); byte[] bytResult = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource)); for (int i = 0; i < bytResult.Length; i++) { strResult = strResult + bytResult[i].ToString("X2"); } return strResult; } /// /// 获取时间戳 /// /// 当前时间 /// 时间戳(type:long) static long GetUnixTime(DateTime nowTime) { DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0)); return (long)Math.Round((nowTime - startTime).TotalSeconds, MidpointRounding.AwayFromZero); } /// /// 生成随机字母与数字 /// /// 生成长度 /// 是否要在生成前将当前线程阻止以避免重复 public static string Str() { System.Threading.Thread.Sleep(3); char[] Pattern = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; string result = ""; int n = Pattern.Length; System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks)); for (int i = 0; i < 4; i++) { int rnd = random.Next(0, n); result += Pattern[rnd]; } return result; } #endregion /// /// 短信发送接口 /// /// /// /// public bool ZLsoftSMSCodeSend(string telephone,string code) { try { if (string.IsNullOrEmpty(SMSServerAddress)) {//如果SMSServerAddress没有获取值,则获取 SMSServerAddress = System.Configuration.ConfigurationManager.AppSettings["SMSServer"]; } TelephoneMessegeModel MessegeModel = new TelephoneMessegeModel(); MessegeModel.PhoneNumbers = telephone; Dictionary param = new Dictionary(); param.Add("code", code); MessegeModel.Paramates = param; MessegeModel.TemplateCode = "SMS_134210153"; MessegeModel.SignName = ""; var objs = new List(); objs.Add("zlsoft"); objs.Add("zlsoft2018"); objs.Add(Strings.ObjectToJson(MessegeModel)); objs.Add("2017"); var r = QWPlatform.SystemLibrary.Service.DynamicCallWebService.InvokeWebService(SMSServerAddress, "", "SendAliSMS", objs.ToArray(), ZlsoftAppServiceAuthkey(SMSServerAddress)); return Convert.ToBoolean(r); } catch (Exception ex) { Logger.Instance.Error("短信发送接口错误", ex); return false; } } /// /// 获取邮件服务器的配置 /// /// 返回配置信息 public emailConfig GetSysEmailConfig() { return sys_config.GetEmailConfig(); } } }