/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:DKIBOSSPRDLogic.cs * 2.功能描述:系统登录相关处理。 * 编辑履历: * 作者 日期 版本 修改内容 * 张国印 2014/09/16 1.00 新建 *******************************************************************************/ using System; using System.Data; using System.IO; using Dongke.IBOSS.PRD.Basics.BaseResources; using Dongke.IBOSS.PRD.Basics.DataAccess; using Dongke.IBOSS.PRD.Basics.Library; using Dongke.IBOSS.PRD.Service.DataModels; using Dongke.IBOSS.PRD.WCF.DataModels; using Oracle.ManagedDataAccess.Client; namespace Dongke.IBOSS.PRD.Service.DKIBOSSPRDLogic { /// /// 系统登录相关处理 /// public static class DKIBOSSPRDLogic { /// /// 升级文件读取时,用的统一锁。 /// private static object _downloadUpgradeFile = new object(); #region 用户登录相关 /// /// 用户登录-刷新菜单 /// /// /// 0:PC端;2:移动端 /// LoginResultEntity对象 public static LoginResultEntity DoLoginRefresh(LoginRequestEntity requestEntity, string actionType) { LoginResultEntity resultEntity = new LoginResultEntity(); IDBConnection oracleConn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString); try { // 读取License文件数据 if (DataManager.LicDataSet != null) { resultEntity.LicenseInfo = new DataSet("LIC"); resultEntity.LicenseInfo.Merge(DataManager.LicDataSet.Tables["Info"]); } #region 形成需要执行的SQL语句 string strSql = "PRO_SYS_DoLogin"; OracleParameter[] paras = new OracleParameter[] { new OracleParameter("in_AccountCode",requestEntity.AccountCode), new OracleParameter("in_UserCode",requestEntity.UserCode), new OracleParameter("in_UserPassword",requestEntity.Password), new OracleParameter("in_MAC",requestEntity.MACAddress), new OracleParameter("in_SessionKey",requestEntity.SessionKey), new OracleParameter("in_ComputerName",requestEntity.ComputerName), new OracleParameter("in_IP",requestEntity.IPAddress), new OracleParameter("in_IMEI",requestEntity.IMEI), new OracleParameter("in_LoginType",actionType), new OracleParameter("out_LoginStatus",OracleDbType.Int16, ParameterDirection.Output), new OracleParameter("out_UserOrganization",OracleDbType.RefCursor, ParameterDirection.Output), new OracleParameter("out_Navigation",OracleDbType.RefCursor, ParameterDirection.Output), //用户导航菜单 new OracleParameter("out_UserRightData",OracleDbType.RefCursor, ParameterDirection.Output), //用户功能权限 new OracleParameter("out_UserRangeRightData",OracleDbType.RefCursor, ParameterDirection.Output), //用户范围权限 new OracleParameter("out_Function",OracleDbType.RefCursor, ParameterDirection.Output) //系统功能菜单 }; #endregion oracleConn.Open(); int loginStatus = 0; DataSet returnDataSet = oracleConn.ExecStoredProcedure(strSql, paras); foreach (Constant.SysCacheTable itemEnum in Enum.GetValues(typeof(Constant.SysCacheTable))) { string strSysConfig = "Select * From " + itemEnum.ToString(); DataTable dtTemp = oracleConn.GetSqlResultToDt(strSysConfig); dtTemp.TableName = itemEnum.ToString(); if (resultEntity.SysParameter == null) resultEntity.SysParameter = new DataSet(); resultEntity.SysParameter.Tables.Add(dtTemp); } oracleConn.Close(); if (returnDataSet != null && 5 <= returnDataSet.Tables.Count) { DataRow dataRow = returnDataSet.Tables[0].Rows[0]; #region 给用户实体赋值 resultEntity.CurrentUserEntity.UserID = Convert.ToInt16(dataRow["UserID"].ToString().Trim()); resultEntity.CurrentUserEntity.UserCode = dataRow["UserCode"].ToString().Trim(); resultEntity.CurrentUserEntity.UserName = dataRow["UserName"].ToString().Trim(); resultEntity.CurrentUserEntity.AccountID = Convert.ToInt16(dataRow["AccountID"].ToString().Trim()); resultEntity.CurrentUserEntity.AccountCode = dataRow["AccountCode"].ToString().Trim(); resultEntity.CurrentUserEntity.AccountName = dataRow["AccountName"].ToString().Trim(); resultEntity.CurrentUserEntity.Password = dataRow["Password"].ToString().Trim(); resultEntity.CurrentUserEntity.OrganizationID = Convert.ToInt16(dataRow["OrganizationID"].ToString().Trim()); resultEntity.CurrentUserEntity.OrganizationCode = dataRow["OrganizationCode"].ToString().Trim(); resultEntity.CurrentUserEntity.SessionKey = dataRow["SessionKey"].ToString().Trim(); resultEntity.CurrentUserEntity.ValueFlag = Convert.ToInt16(dataRow["ValueFlag"].ToString().Trim()); resultEntity.CurrentUserEntity.LimitMAC = dataRow["LimitMAC"].ToString().Trim(); resultEntity.CurrentUserEntity.CanSmartLogin = Convert.ToInt16(dataRow["CanSmartLogin"].ToString().Trim()); resultEntity.CurrentUserEntity.Remarks = dataRow["Remarks"].ToString().Trim(); resultEntity.CurrentUserEntity.UserNavigationData = returnDataSet.Tables[1]; // 用户的主导航菜单数据 resultEntity.CurrentUserEntity.UserRightData = returnDataSet.Tables[2];// 用户的功能权限限制数据 resultEntity.CurrentUserEntity.UserRangeRightData = returnDataSet.Tables[3]; // 用户的范围权限限制数据 resultEntity.CurrentUserEntity.FunctionData = returnDataSet.Tables[4]; //系统功能菜单 #endregion } else if (paras[8] != null) { loginStatus = Convert.ToInt32(paras[8].Value.ToString()); } else { loginStatus = -1; } resultEntity.LoginStatus = loginStatus; return resultEntity; } finally { if (oracleConn.ConnState == ConnectionState.Open) { oracleConn.Close(); } } } /// /// 用户登录 /// /// 请求用户实例 /// 0:PC端;2:移动端 /// LoginResultEntity对象 public static LoginResultEntity DoLogin(LoginRequestEntity requestEntity, string actionType) { LoginResultEntity resultEntity = new LoginResultEntity(); IDBConnection oracleConn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString); try { #region 对License文件结果处理 返回异常信息 bool checkLic = false; if (checkLic) { lock (DataManager.LicLock) { string sql = "select a.ListCode from tp_mst_account a order by a.accountid"; string listCode = oracleConn.GetSqlResultToStr(sql); // 读取License文件数据 DataSet customer = null; string licString = null; int readLock = LockLicenseHandle.ReadLisenceFile(listCode, ref customer, out licString); if (readLock == -1) { resultEntity.LoginStatus = Constant.LOGIN_NOT_LICENSE; return resultEntity; } else if (readLock == -2) { resultEntity.LoginStatus = Constant.LOGIN_LICENSE_CONTENT_ERROR; return resultEntity; } else if (readLock == -3) { resultEntity.LoginStatus = Constant.LOGIN_LICENSE_BE_OVERDUE; return resultEntity; } // license文件数据不正确 if (customer == null || customer.Tables[0].Rows.Count < 1) { resultEntity.LoginStatus = Constant.LOGIN_LICENSE_CONTENT_ERROR; return resultEntity; } if (DataManager.LicString == null || DataManager.LicString != licString) { DataManager.LicString = licString; DataManager.LicDataSet = customer; } resultEntity.LicenseInfo = new DataSet("LIC"); resultEntity.LicenseInfo.Merge(DataManager.LicDataSet.Tables["Info"]); } } #endregion #region 形成需要执行的SQL语句 requestEntity.SessionKey = Guid.NewGuid().ToString(); string strSql = "PRO_SYS_DoLogin"; OracleParameter[] paras = new OracleParameter[] { new OracleParameter("in_AccountCode",requestEntity.AccountCode), new OracleParameter("in_UserCode",requestEntity.UserCode), new OracleParameter("in_UserPassword",requestEntity.Password), new OracleParameter("in_MAC",requestEntity.MACAddress==null ? " ":requestEntity.MACAddress),//wangx 2015/08/11 pda出现问题所修改 new OracleParameter("in_SessionKey",requestEntity.SessionKey), new OracleParameter("in_ComputerName",requestEntity.ComputerName), new OracleParameter("in_IP",requestEntity.IPAddress), new OracleParameter("in_IMEI",requestEntity.IMEI), new OracleParameter("in_LoginType",actionType), new OracleParameter("out_LoginStatus",OracleDbType.Int16, ParameterDirection.Output), new OracleParameter("out_UserOrganization",OracleDbType.RefCursor, ParameterDirection.Output), new OracleParameter("out_Navigation",OracleDbType.RefCursor, ParameterDirection.Output), //用户导航菜单 new OracleParameter("out_UserRightData",OracleDbType.RefCursor, ParameterDirection.Output), //用户功能权限 new OracleParameter("out_UserRangeRightData",OracleDbType.RefCursor, ParameterDirection.Output), //用户范围权限 new OracleParameter("out_Function",OracleDbType.RefCursor, ParameterDirection.Output) //系统功能菜单 }; #endregion oracleConn.Open(); int loginStatus = 0; DataSet returnDataSet = oracleConn.ExecStoredProcedure(strSql, paras); foreach (Constant.SysCacheTable itemEnum in Enum.GetValues(typeof(Constant.SysCacheTable))) { string strSysConfig = "Select * From " + itemEnum.ToString(); DataTable dtTemp = oracleConn.GetSqlResultToDt(strSysConfig); dtTemp.TableName = itemEnum.ToString(); if (resultEntity.SysParameter == null) resultEntity.SysParameter = new DataSet(); resultEntity.SysParameter.Tables.Add(dtTemp); } oracleConn.Close(); if (returnDataSet != null && 5 <= returnDataSet.Tables.Count) { DataRow dataRow = returnDataSet.Tables[0].Rows[0]; #region 给用户实体赋值 resultEntity.CurrentUserEntity.UserID = Convert.ToInt16(dataRow["UserID"].ToString().Trim()); resultEntity.CurrentUserEntity.UserCode = dataRow["UserCode"].ToString().Trim(); resultEntity.CurrentUserEntity.UserName = dataRow["UserName"].ToString().Trim(); resultEntity.CurrentUserEntity.AccountID = Convert.ToInt16(dataRow["AccountID"].ToString().Trim()); resultEntity.CurrentUserEntity.AccountCode = dataRow["AccountCode"].ToString().Trim(); resultEntity.CurrentUserEntity.AccountName = dataRow["AccountName"].ToString().Trim(); resultEntity.CurrentUserEntity.Password = dataRow["Password"].ToString().Trim(); resultEntity.CurrentUserEntity.OrganizationID = Convert.ToInt16(dataRow["OrganizationID"].ToString().Trim()); resultEntity.CurrentUserEntity.OrganizationCode = dataRow["OrganizationCode"].ToString().Trim(); resultEntity.CurrentUserEntity.SessionKey = dataRow["SessionKey"].ToString().Trim(); resultEntity.CurrentUserEntity.ValueFlag = Convert.ToInt16(dataRow["ValueFlag"].ToString().Trim()); resultEntity.CurrentUserEntity.LimitMAC = dataRow["LimitMAC"].ToString().Trim(); resultEntity.CurrentUserEntity.CanSmartLogin = Convert.ToInt16(dataRow["CanSmartLogin"].ToString().Trim()); resultEntity.CurrentUserEntity.Remarks = dataRow["Remarks"].ToString().Trim(); resultEntity.CurrentUserEntity.IsGroutingWorker = Convert.ToInt16(dataRow["IsGroutingWorker"].ToString()); resultEntity.CurrentUserEntity.UserNavigationData = returnDataSet.Tables[1]; // 用户的主导航菜单数据 resultEntity.CurrentUserEntity.UserRightData = returnDataSet.Tables[2];// 用户的功能权限限制数据 resultEntity.CurrentUserEntity.UserRangeRightData = returnDataSet.Tables[3]; // 用户的范围权限限制数据 resultEntity.CurrentUserEntity.FunctionData = returnDataSet.Tables[4]; //系统功能菜单 #endregion } else if (paras[8] != null) { loginStatus = Convert.ToInt32(paras[8].Value.ToString()); } else { loginStatus = -1; } resultEntity.LoginStatus = loginStatus; return resultEntity; } catch (Exception ex) { throw ex; } finally { if (oracleConn.ConnState == ConnectionState.Open) { oracleConn.Close(); } } } /// /// 退出登录 /// /// 用户ID /// 1:PC端;3:移动端 /// 用户基本信息 /// bool public static bool Logout(int userID, string actionType, SUserInfo userInfo) { IDBTransaction oracleTrConn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString); try { oracleTrConn.Connect(); #region SQL语句形成 string sqlString1 = "UPDATE TP_MST_UserLogin SET " + " IsLogin = '0'," + " SessionKey = NULL," + " LastLogoutTime = sysdate" + " WHERE IsLogin = '1'" + " AND SessionKey = :SessionKey" + " AND UserID = :userID"; OracleParameter[] parmeters1 = new OracleParameter[] { new OracleParameter(":SessionKey",userInfo.SessionKey), new OracleParameter(":userID",userID), }; #endregion int i = oracleTrConn.ExecuteNonQuery(sqlString1, parmeters1); #region SQL语句形成 string sqlString2 = "INSERT INTO TP_MST_UserLoginLog " + " (UserID" + " ,ActionTime" + " ,ActionType" + " ,MAC" + " ,ComputerName" + " ,IP) " + " VALUES " + " (:userID " + " ,systimestamp " + " ,:in_actionType" + " ,:in_MAC " + " ,:in_ComputerName " + " ,:in_IP) "; OracleParameter[] parmeters2 = new OracleParameter[] { new OracleParameter(":userID",userID) ,new OracleParameter(":in_actionType",actionType) ,new OracleParameter(":in_MAC",userInfo.MACAddress) ,new OracleParameter(":in_ComputerName",userInfo.ComputerName) ,new OracleParameter(":in_IP",userInfo.IPAddress) }; #endregion oracleTrConn.ExecuteNonQuery(sqlString2, parmeters2); oracleTrConn.Commit(); oracleTrConn.Disconnect(); return true; } catch (Exception ex) { if (oracleTrConn.ConnState == ConnectionState.Open) { oracleTrConn.Rollback(); } throw ex; } finally { if (oracleTrConn.ConnState == ConnectionState.Open) { oracleTrConn.Disconnect(); } } } /// /// 服务访问验证 /// /// 验证实体 /// 用户基本信息 /// string public static string AuthenticateRepeatLogin(LoginRequestEntity requestEntity, out SUserInfo userInfo) { userInfo = null; if (DataManager.LicDataSet != null) { DateTime vBegin = Convert.ToDateTime(DataManager.LicDataSet.Tables["Info"].Rows[0]["ValidityBegin"]); DateTime vEnd = Convert.ToDateTime(DataManager.LicDataSet.Tables["Info"].Rows[0]["ValidityEnd"]); DateTime n = DateTime.Now.Date; if (n < vBegin || n > vEnd) { return "3"; } } IDBConnection oracleConn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString); try { oracleConn.Open(); int loginStatus = 0; OracleParameter[] paras = new OracleParameter[]{ new OracleParameter("in_accountCode", OracleDbType.Varchar2, requestEntity.AccountCode,ParameterDirection.Input), new OracleParameter("in_userCode", OracleDbType.Varchar2, requestEntity.UserCode,ParameterDirection.Input), new OracleParameter("in_userPassword", OracleDbType.Varchar2, requestEntity.Password,ParameterDirection.Input), new OracleParameter("in_sessionKey", OracleDbType.Varchar2, requestEntity.SessionKey,ParameterDirection.Input), new OracleParameter("out_loginStatus", OracleDbType.Int32, ParameterDirection.Output), new OracleParameter("out_userInfo", OracleDbType.RefCursor, ParameterDirection.Output) }; DataSet dsUserInfo = oracleConn.ExecStoredProcedure("PRO_SYS_Authentication", paras); loginStatus = Convert.ToInt32(paras[4].Value.ToString()); if (loginStatus == 0) { if (dsUserInfo != null && dsUserInfo.Tables[0].Rows.Count > 0) { userInfo = new SUserInfo(); userInfo.UserID = System.Convert.ToInt32(dsUserInfo.Tables[0].Rows[0]["UserID"]); userInfo.UserCode = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["UserCode"]); userInfo.UserName = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["UserName"]); userInfo.OrganizationID = System.Convert.ToInt32(dsUserInfo.Tables[0].Rows[0]["OrganizationID"]); userInfo.OrganizationCode = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["OrganizationCode"]); userInfo.AccountID = System.Convert.ToInt32(dsUserInfo.Tables[0].Rows[0]["AccountID"]); userInfo.AccountCode = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["AccountCode"]); userInfo.MACAddress = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["MAC"]); userInfo.ComputerName = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["Computername"]); userInfo.IPAddress = System.Convert.ToString(dsUserInfo.Tables[0].Rows[0]["IP"]); userInfo.SessionKey = requestEntity.SessionKey; } else { return "1"; // wangxin 20150416 else后添加的 } } return loginStatus.ToString(); } finally { if (oracleConn.ConnState == ConnectionState.Open) { oracleConn.Close(); } } } #endregion #region 客户端升级 /// /// 客户端升级判断 /// /// 客户端版本号 /// NeedUpgradeResultEntity客户端是否需要更新信息 public static NeedUpgradeResultEntity IsNeedUpgrade(string version, string dllVersion) { string serverVersion = INIUtility.Instance(INIUtility.IniFile.Config).ReadIniData("VersionSetting", "ClientVersion");//ConfigurationManager.AppSettings["ServerVersion"]; NeedUpgradeResultEntity result = new NeedUpgradeResultEntity(); result.ServerVersion = serverVersion; result.UpgradeState = false; result.GradeInfo = ""; string[] versions = version.Split('.'); string[] serverVersions = serverVersion.Split('.'); if (versions == null || serverVersions == null || versions.Length != 4 || serverVersions.Length != 4) { result.UpgradeState = false; result.GradeInfo = "服务端版本信息获取异常,请联系系统管理员。"; return result; } //string dbVersion = null; //try //{ // IDBConnection oracleConn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString); // oracleConn.Open(); // dbVersion = oracleConn.GetSqlResultToStr("select Version from T_SYS_UpgradeRecord where releaseid=0"); //} //catch //{ // result.UpgradeState = false; // result.GradeInfo = "数据库版本信息获取异常,请联系系统管理员。"; // return result; //} //if (dbVersion == null) //{ // result.UpgradeState = false; // result.GradeInfo = "数据库版本信息获取异常,请联系系统管理员。"; // return result; //} //if (dbVersion != serverVersion || dbVersion != dllVersion) //{ // result.UpgradeState = false; // result.GradeInfo = string.Format("服务端版本信息不一致,请联系系统管理员。{3}服务INI版本【{0}】{3}服务DLL版本【{1}】{3}数据DBR版本【{2}】", // serverVersion, dllVersion, dbVersion, System.Environment.NewLine); // return result; //} if (versions[1] != "0" && versions[1] != serverVersions[1]) { result.UpgradeState = false; result.GradeInfo = string.Format("客户端[{0}]与服务端[{1}]的客户号(版本号第二位)不一致,此客户端不能连接服务器。", version, serverVersion); } for (int j = 0; j < versions.Length; j++) { int sv = Convert.ToInt32(serverVersions[j]); int cv = Convert.ToInt32(versions[j]); if (sv > cv) { result.UpgradeState = true; result.GradeInfo = LoadUpgradeInfo(version, serverVersion); break; } else if (sv < cv) { result.UpgradeState = false; result.GradeInfo = string.Format("客户端版本[{0}]比服务器版本[{1}]高,此客户端不能连接服务器。", version, serverVersion); } } return result; } /// /// 获取更新履历信息 /// /// 客户端版本号 /// 最新版本号 /// string升级信息 private static string LoadUpgradeInfo(string version, string serverVersion) { #region 查询字符串 //string sqlString = "SELECT UpgradeInfoID" // + ",VersionNo" // + ",UpgradeType" // + ",Content" // + ",CreateTime" // + " FROM T_SYS_UpgradeInfo" // + " WHERE UpgradeType = 0"; //if (!string.IsNullOrEmpty(serverVersion) && !string.IsNullOrEmpty(version)) //{ // sqlString = string.Format("{0} AND VersionNo > '{1}' AND VersionNo <= '{2}'", sqlString, version, serverVersion); // DataSet returnData = DataManager.ExecuteDataset(sqlString); //} #endregion return null; } /// /// 下载更新程序 /// /// byte[]更新程序 public static byte[] DownloadUpgradeFile(string flag = null) { string filePath = null; string fup = null; if (flag == "Public") { filePath = "UpgradePublicDownLoadPath"; fup = @"-UpgradePublic.up"; } else { filePath = "UpgradeDownLoadPath"; fup = @"-Upgrade.up"; } filePath = INIUtility.Instance(INIUtility.IniFile.Config).ReadIniData("PathSetting", filePath); //ConfigurationManager.AppSettings["UpgradeDownLoadPath"]; // 取得WEB服务器上的文件全路径 string fileFullPath = System.AppDomain.CurrentDomain.BaseDirectory + filePath; lock (_downloadUpgradeFile) { if (!Directory.Exists(fileFullPath)) { Directory.CreateDirectory(fileFullPath); } // zip 压缩 string zipPath = fileFullPath + fup; if (!File.Exists(zipPath)) { ZipFileClass.DirectoryToZip(fileFullPath, zipPath); } // 文件存在,则将文件读入文件流中返回 if (File.Exists(zipPath)) { using (FileStream fileStream = new FileStream(zipPath, FileMode.Open, FileAccess.Read)) { BinaryReader binaryReader = new BinaryReader(fileStream); return binaryReader.ReadBytes((int)fileStream.Length); } } } return null; } #endregion } }