using System; using ADODB; using log4net; using UFIDA.U8.Framework.Api.ControlObject.Entity; using UFSoft.U8.Framework.BizBase; using UFSoft.U8.Framework.ContextSrv; using UFSoft.U8.Framework.Login.UI; using UFSoft.U8.Framework.LoginContext; using NetLogin = UFSoft.U8.Framework.Login.UI.clsLogin; using ThreadContext = UFSoft.U8.Framework.ContextSrv.ThreadContext; using VBLogin = U8Login.clsLogin; // ReSharper disable IdentifierTypo // ReSharper disable InconsistentNaming // ReSharper disable CommentTypo // ReSharper disable FieldCanBeMadeReadOnly.Local // ReSharper disable UnusedMember.Global namespace UFIDA.U8.Framework.Api.ControlObject.U8M { /// /// 登录对象帮助类 /// public class BaseLogin { private ILog _logInfo = LogManager.GetLogger("logInfo"); /// /// 登录对象(NET) /// public NetLogin _netLogin; /// /// 登录对象(VB) /// public VBLogin _vbLogin; /// /// Net上下文 /// public ProductContext _productContext; /// /// 数据库连接对象(ADO) /// public Connection Connection; /// /// userToken /// public string userToken => _vbLogin.userToken; /// /// 业务库连接字符串(ADO) /// public string UfDbName => _vbLogin.UfDbName; /// /// 业务库连接字符串(ADO.Net) /// public string UFDataConnstringForNet => _vbLogin.UFDataConnstringForNet; /// /// 元数据库连接字符串(ADO) /// public string UfMetaName => _vbLogin.UfMetaName; /// /// 元数据库连接字符串(ADO.Net) /// public string UFMetaConnstringForNet => _vbLogin.UFMetaConnstringForNet; /// /// 系统库连接字符串(ADO) /// public string UfSystemDb => _vbLogin.UfSystemDb; /// /// 制造上下文 /// public IContextContainer callar { get; set; } /// /// 初始化生产制造上下文 /// /// 登录参数 /// /// /// /// public void Init(LoginParamter paramter, bool bMon = true, int traceTimes = 0) { if (traceTimes > 5) throw new Exception("U8登录异常"); try { //if (!string.IsNullOrWhiteSpace(ThreadContext.ServerToken)) //{ // ThreadContext.ServerToken = null; //} //if (!string.IsNullOrWhiteSpace(ThreadContext.U8LoginInfo!=null)) //{ // ThreadContext.U8LoginInfo = null; //} if (paramter == null) throw new ArgumentNullException(nameof(paramter)); if (!string.IsNullOrWhiteSpace(Cryptography.m_userToken)) { Cryptography.m_userToken = ""; } if (bMon) { #if DEBUG _vbLogin = new VBLogin(); _vbLogin.ClearError(); _logInfo.Debug($"VB--开始进行U8登录:{paramter.cSrv}--{paramter.pUserId}--{paramter.pAccId}"); if (!_vbLogin.Login(paramter.pSubId, paramter.pAccId, paramter.pYearId, paramter.pUserId, paramter.pPassword, paramter.pDate, paramter.cSrv, paramter.cSerial) && string.IsNullOrWhiteSpace(_vbLogin.userToken)) { throw new Exception($"VB--U8登录失败---{_vbLogin.ShareString}"); } _logInfo.Debug($"VB--开始创建连接对象:{_vbLogin.userToken}"); Connection = new Connection(); Connection.Open(_vbLogin.UfDbName); _logInfo.Debug("VB--完成登录进程"); _netLogin = new NetLogin(); _productContext= _netLogin.Login("DP", _vbLogin.userToken); if (_productContext == null) { _logInfo.Debug($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); if (!_netLogin.login(paramter.pSubId, paramter.pUserId, paramter.pPassword, paramter.cSrv, paramter.pDate, paramter.pAccId, paramter.cSerial) && string.IsNullOrWhiteSpace(_netLogin.userToken)) { //throw new Exception($"Net--U8登录失败---{_netLogin.ErrDescript}"); } _logInfo.Debug($"Net--开始进行上下文构建:{_netLogin.userToken}"); _productContext = _netLogin.SubLogin("DP") ?? _netLogin.Login("DP", _vbLogin.userToken); //throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 _logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); var info = U8LoginInfo.CreateInstance(_netLogin.userToken); U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); _logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); ThreadContext.SetLoginInfo(_netLogin.userToken); _logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); return; #else _netLogin = new NetLogin(); _logInfo.Debug($"Net--开始进行U8登录:{paramter.cSrv}--{paramter.pUserId}--{paramter.pAccId}"); if (!_netLogin.login(paramter.pSubId, paramter.pUserId, paramter.pPassword, paramter.cSrv, paramter.pDate, paramter.pAccId, paramter.cSerial) && string.IsNullOrWhiteSpace(_netLogin.userToken)) { throw new Exception($"Net--U8登录失败---{_netLogin.ErrDescript}"); } _logInfo.Debug($"Net--开始进行上下文构建:{_netLogin.userToken}"); _productContext = _netLogin.SubLogin("DP"); if (_productContext == null) { throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 //_logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); //var info = U8LoginInfo.CreateInstance(_netLogin.userToken); //U8LoginInfoPool.Add(_netLogin.userToken, info); //_logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); //_logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); //ThreadContext.SetLoginInfo(_netLogin.userToken); //_logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始设置线程信息:{_productContext.calledContext.token}"); //ThreadContext.SetLoginInfo(_netLogin.userToken); //_logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); //var info = U8LoginInfo.CreateInstance(_netLogin.userToken); //U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"Net--开始设置userToken:{_netLogin.userToken}"); Cryptography.m_userToken = _netLogin.userToken; _logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); return; #endif } if (_netLogin != null) { _vbLogin = new VBLogin(); _vbLogin.ClearError(); _logInfo.Debug($"VB--开始进行U8登录:{_netLogin.userToken}"); _vbLogin.ConstructLogin(_netLogin.userToken); } else if(_vbLogin==null) { _vbLogin = new VBLogin(); _vbLogin.ClearError(); _logInfo.Debug($"VB--开始进行U8登录:{paramter.cSrv}--{paramter.pUserId}--{paramter.pAccId}"); if (!_vbLogin.Login(paramter.pSubId, paramter.pAccId, paramter.pYearId, paramter.pUserId, paramter.pPassword, paramter.pDate, paramter.cSrv, paramter.cSerial) && string.IsNullOrWhiteSpace(_vbLogin.userToken)) { throw new Exception($"VB--U8登录失败---{_vbLogin.ShareString}"); } } var taskId = DateTime.Now.Ticks.ToString(); _logInfo.Debug($"VB--设置参数:{taskId}"); _vbLogin.set_TaskId(taskId); //_vbLogin.ClearError(); //_logInfo.Debug($"VB--开始进行U8登录:{paramter.cSrv}--{paramter.pUserId}--{paramter.pAccId}"); //if (!_vbLogin.Login(paramter.pSubId, paramter.pAccId, paramter.pYearId, paramter.pUserId, paramter.pPassword, paramter.pDate, paramter.cSrv, paramter.cSerial) && string.IsNullOrWhiteSpace(_vbLogin.userToken)) //{ // throw new Exception($"VB--U8登录失败---{_vbLogin.ShareString}"); //} _logInfo.Debug($"VB--开始创建连接对象:{_vbLogin.userToken}"); Connection = new Connection(); Connection.Open(_vbLogin.UfDbName); _logInfo.Debug("VB--完成登录进程"); #region 弃用 //if (!bMon) //{ // _logInfo.Debug("非生产制造模块无需下面操作"); // //Trace.WriteLine("非生产制造模块无需下面操作"); // return; //} //_logInfo.Debug($"U8版本:{_vbLogin.GetVersionInfo()}"); //_logInfo.Debug($"1--登录令牌:{_vbLogin.userToken}"); //if (!string.IsNullOrWhiteSpace(Cryptography.m_userToken)) //{ // Cryptography.m_userToken = ""; //} //_productContext = _netLogin.Login("DP", _vbLogin.userToken); //if (_productContext != null) //{ // _logInfo.Debug($"222--成功初始化上下文信息:{_vbLogin.userToken}"); // ClientUserContext.Instance.RefreshContext(); // //ThreadContext.ServerToken = _netLogin.userToken; // Connection = new Connection(); // Connection.Open(_vbLogin.UfDbName); // _logInfo.Debug($"333--完成局部构建:{_netLogin.userToken}"); // return; //} //if (_netLogin.login(paramter.pSubId, paramter.pUserId, paramter.pPassword, paramter.cSrv, paramter.pDate, paramter.pAccId, paramter.cSerial)) //{ // _productContext = _netLogin.SubLogin("AS"); // if (_productContext == null) // throw new Exception($"11--初始化U8登录上下文失败------{_netLogin.ErrDescript}"); // _logInfo.Debug($"22--登录令牌:{_netLogin.userToken}"); // //Trace.WriteLine($"2--上下文令牌:{_productContext.calledContext.token}"); // //_vbLogin.ClearError(); // //_vbLogin.ConstructLogin(_netLogin.userToken); // //var taskId = DateTime.Now.Ticks.ToString(); // //_vbLogin.set_TaskId(taskId); // _logInfo.Debug($"33--登录令牌:{_vbLogin.userToken}"); // _logInfo.Debug($"44--正在创建应用池:{_netLogin.userToken}"); // ClientUserContext.Instance.RefreshContext(); // //ThreadContext.ServerToken = _netLogin.userToken; // _logInfo.Debug($"55--完成局部构建:{_netLogin.userToken}"); // return; //} //_productContext = _netLogin.Login("AS", _vbLogin.userToken); //_logInfo.Debug($"3--上下文令牌:{_productContext.calledContext.token}"); //if (_productContext == null) // throw new Exception($"2--初始化U8登录上下文失败------{_netLogin.ErrDescript}"); //ClientUserContext.Instance.RefreshContext(); ////ThreadContext.ServerToken = _netLogin.userToken; //Connection = new Connection(); //Connection.Open(_vbLogin.UfDbName); #endregion } catch (Exception ex) { _logInfo.Error($"重试次数:{traceTimes},错误信息:{ex.Message}", ex); Init(paramter, bMon, traceTimes + 1); } } /// /// 初始化登录信息 /// /// /// /// /// /// public void Init(string token, bool bMon = true, int traceTimes = 0) { if (traceTimes > 5) throw new Exception("U8登录异常"); try { //if (!string.IsNullOrWhiteSpace(ThreadContext.ServerToken)) //{ // ThreadContext.ServerToken = null; //} //if (!string.IsNullOrWhiteSpace(ThreadContext.U8LoginInfo!=null)) //{ // ThreadContext.U8LoginInfo = null; //} if (string.IsNullOrWhiteSpace(token)) throw new ArgumentNullException(nameof(token)); if (!string.IsNullOrWhiteSpace(Cryptography.m_userToken)) { Cryptography.m_userToken = ""; } if (bMon) { #if DEBUG _vbLogin = new VBLogin(); _vbLogin.ClearError(); _logInfo.Debug($"VB--开始进行U8登录:{token}"); if (!_vbLogin.ConstructLogin(token)) { throw new Exception($"VB--U8登录失败---{_vbLogin.ShareString}"); } _netLogin = new NetLogin(); _productContext = _netLogin.Login("DP", _vbLogin.userToken); if (_productContext == null) { _logInfo.Debug($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); _logInfo.Debug($"Net--开始进行上下文构建:{_vbLogin.userToken}"); _productContext = _netLogin.Login("DP", _vbLogin.userToken); //throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 _logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); var info = U8LoginInfo.CreateInstance(_netLogin.userToken); U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); _logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); ThreadContext.SetLoginInfo(_netLogin.userToken); _logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); #else _netLogin = new NetLogin(); _logInfo.Debug($"Net--开始进行U8登录:{token}"); _productContext = _netLogin.Login("DP", token); if (_productContext == null) { throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 //_logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); //var info = U8LoginInfo.CreateInstance(_netLogin.userToken); //U8LoginInfoPool.Add(_netLogin.userToken, info); //_logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); //_logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); //ThreadContext.SetLoginInfo(_netLogin.userToken); //_logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); //Cryptography.m_userToken = _netLogin.userToken; //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); return; #endif } _vbLogin = new VBLogin(); _vbLogin.ClearError(); _logInfo.Debug($"VB--开始进行U8登录:{token}"); if (!_vbLogin.ConstructLogin(token)) { throw new Exception($"VB--U8登录失败---{_vbLogin.ShareString}"); } _logInfo.Debug($"VB--开始创建连接对象:{_vbLogin.userToken}"); Connection = new Connection(); Connection.Open(_vbLogin.UfDbName); _logInfo.Debug("VB--完成登录进程"); } catch (Exception ex) { _logInfo.Error($"重试次数:{traceTimes},错误信息:{ex.Message}", ex); if (ex.Message == "VB--U8登录失败---登录使用时间超过系统预置时间,请重新登录!") { throw new Exception("登录使用时间超过系统预置时间,请重新登录!"); } Init(token, bMon, traceTimes + 1); } } /// /// 校验制造上下文 /// /// public bool CheckCallar() { return callar != null; } /// /// 刷新制造上下文 /// /// public void RefreshCallar(LoginParamter paramter) { #if DEBUG _netLogin = new NetLogin(); _productContext= _netLogin.Login("DP", _vbLogin.userToken); if (_productContext == null) { _logInfo.Debug($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); if (!_netLogin.login(paramter.pSubId, paramter.pUserId, paramter.pPassword, paramter.cSrv, paramter.pDate, paramter.pAccId, paramter.cSerial) && string.IsNullOrWhiteSpace(_netLogin.userToken)) { //throw new Exception($"Net--U8登录失败---{_netLogin.ErrDescript}"); } _logInfo.Debug($"Net--开始进行上下文构建:{_netLogin.userToken}"); _productContext = _netLogin.SubLogin("DP") ?? _netLogin.Login("DP", _vbLogin.userToken); //throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 _logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); var info = U8LoginInfo.CreateInstance(_netLogin.userToken); U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); _logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); ThreadContext.SetLoginInfo(_netLogin.userToken); _logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); #else _netLogin = new NetLogin(); _logInfo.Debug($"Net--开始进行U8登录:{paramter.cSrv}--{paramter.pUserId}--{paramter.pAccId}"); if (!_netLogin.login(paramter.pSubId, paramter.pUserId, paramter.pPassword, paramter.cSrv, paramter.pDate, paramter.pAccId, paramter.cSerial) && string.IsNullOrWhiteSpace(_netLogin.userToken)) { throw new Exception($"Net--U8登录失败---{_netLogin.ErrDescript}"); } _logInfo.Debug($"Net--开始进行上下文构建:{_netLogin.userToken}"); _productContext = _netLogin.SubLogin("DP"); if (_productContext == null) { throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 _logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); var info = U8LoginInfo.CreateInstance(_netLogin.userToken); U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); _logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); ThreadContext.SetLoginInfo(_netLogin.userToken); _logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); return; #endif } /// /// 刷新制造上下文 /// /// public void RefreshCallar(string token) { #if DEBUG _netLogin = new NetLogin(); _productContext = _netLogin.Login("DP", token); if (_productContext == null) { _logInfo.Debug($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); _logInfo.Debug($"Net--开始进行上下文构建:{token}"); _productContext = _netLogin.Login("DP", token); //throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 _logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); var info = U8LoginInfo.CreateInstance(_netLogin.userToken); U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); _logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); ThreadContext.SetLoginInfo(_netLogin.userToken); _logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); //ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); #else _netLogin = new NetLogin(); _logInfo.Debug($"Net--开始进行U8登录:{token}"); _productContext = _netLogin.Login("DP", token); if (_productContext == null) { throw new Exception($"Net--U8上下文构建失败---{_netLogin.ErrDescript}"); } #region U8 18.0时需要取消注释 _logInfo.Debug($"U8M--正在创建应用池:{_netLogin.userToken}"); var info = U8LoginInfo.CreateInstance(_netLogin.userToken); U8LoginInfoPool.Add(_netLogin.userToken, info); _logInfo.Debug($"U8M--创建应用池:{info.U8LoginToken}"); _logInfo.Debug($"U8M--正在设置线程登录信息:{_netLogin.userToken}"); ThreadContext.SetLoginInfo(_netLogin.userToken); _logInfo.Debug($"U8M--设置线程登录信息:{_netLogin.userToken}"); #endregion #region U8 18.0时需要注释 //_logInfo.Debug($"Net--开始进行上下文刷新:{_productContext.calledContext.token}"); ClientUserContext.Instance.RefreshContext(); #endregion _logInfo.Debug("Net--完成生产制造登录进程"); callar = new DefaultContextContainer(); _logInfo.Debug("Net--构建制造上下文"); //_logInfo.Debug($"Net--构建制造上下文:{callar.context.calledContext.token}"); return; #endif } /// /// 注销登录对象 /// public void ShutDown() { U8LoginInfoPool.Remove(_netLogin.userToken); ThreadContext.ServerToken = null; _vbLogin?.ShutDown(); _productContext = null; _netLogin?.SubLogout("DP"); _netLogin?.ShutDown(); _netLogin?.Dispose(); _vbLogin = null; _netLogin = null; if (!string.IsNullOrWhiteSpace(Cryptography.m_userToken)) { Cryptography.m_userToken = ""; } } /// /// 校验当前账套 /// /// /// public bool CheckAccId(string cAccId) { return _vbLogin.get_cAcc_Id() == cAccId; } /// /// 清理登录上下文 /// public void ClearLoginInfoPool() { U8LoginInfoPool.Clear(); ThreadContext.ServerToken = null; _productContext = null; _netLogin?.SubLogout("DP"); _netLogin?.ShutDown(); _netLogin = null; } } }