/*******************************************************************************
* 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[9] != null)
{
loginStatus = Convert.ToInt32(paras[9].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[9] != null)
{
loginStatus = Convert.ToInt32(paras[9].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
}
}