feat: expose legacy login runtime for WPF host
This commit is contained in:
@@ -10,6 +10,8 @@ namespace Lskj.Main.Hosting
|
|||||||
{
|
{
|
||||||
bool IsOpen { get; }
|
bool IsOpen { get; }
|
||||||
|
|
||||||
|
DialogResult ShowLoginDialog(object loginRuntime);
|
||||||
|
|
||||||
DialogResult ShowDialog();
|
DialogResult ShowDialog();
|
||||||
|
|
||||||
void RequestRelogin();
|
void RequestRelogin();
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using DevExpress.LookAndFeel;
|
||||||
|
using Lskj.Business;
|
||||||
|
using Lskj.Business.Impl;
|
||||||
|
using Lskj.Control.Model;
|
||||||
|
using Lskj.Core;
|
||||||
|
using Lskj.Data;
|
||||||
using Lskj.Main.Model;
|
using Lskj.Main.Model;
|
||||||
|
using Lskj.Model;
|
||||||
|
using Lskj.Util;
|
||||||
|
|
||||||
namespace Lskj.Main.Hosting
|
namespace Lskj.Main.Hosting
|
||||||
{
|
{
|
||||||
@@ -26,4 +38,402 @@ namespace Lskj.Main.Hosting
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 向外部 WPF 登录页提供旧账套、用户、认证和会话状态写入能力。
|
||||||
|
/// 该类型不创建 WinForms 控件,也不引用 WPF。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class LegacyLoginRuntime
|
||||||
|
{
|
||||||
|
private DataTable _ledgerTable;
|
||||||
|
|
||||||
|
public LegacyLoginRuntime()
|
||||||
|
{
|
||||||
|
ERPInfo.Instance.LoginResult = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SelectedLedgerName { get; private set; }
|
||||||
|
|
||||||
|
public string LoginName
|
||||||
|
{
|
||||||
|
get { return DBConfig.Instance.LoginName ?? string.Empty; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RememberPasswordEnabled
|
||||||
|
{
|
||||||
|
get { return !SystemInfo.Instance.DisableRememberPassword; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataTable LoadLedgers()
|
||||||
|
{
|
||||||
|
_ledgerTable = MainImpl.GetLedgerList() ?? new DataTable("Ledgers");
|
||||||
|
SelectedLedgerName = ResolveSelectedLedgerName(_ledgerTable);
|
||||||
|
return _ledgerTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataTable LoadUsers()
|
||||||
|
{
|
||||||
|
DataTable users = SystemInfo.Instance.DisplayUserCode
|
||||||
|
? MainImpl.GetEmployeeListNew()
|
||||||
|
: MainImpl.GetEmployeeList();
|
||||||
|
return users ?? new DataTable("Users");
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataTable SelectLedger(string ledgerName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(ledgerName))
|
||||||
|
throw new InvalidOperationException("请选择账套。");
|
||||||
|
if (_ledgerTable == null)
|
||||||
|
LoadLedgers();
|
||||||
|
|
||||||
|
DataRow ledger = _ledgerTable.Rows.Cast<DataRow>().FirstOrDefault(
|
||||||
|
row => string.Equals(
|
||||||
|
Value(row, "ShowName"),
|
||||||
|
ledgerName,
|
||||||
|
StringComparison.OrdinalIgnoreCase));
|
||||||
|
if (ledger == null)
|
||||||
|
throw new InvalidOperationException("未找到所选账套,请重新选择。");
|
||||||
|
|
||||||
|
string serverName = Value(ledger, "IP");
|
||||||
|
string database = Value(ledger, "DBName");
|
||||||
|
string dataBook = Value(ledger, "ShowName");
|
||||||
|
if (string.IsNullOrWhiteSpace(serverName) ||
|
||||||
|
string.IsNullOrWhiteSpace(database))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException(ResourceKeys.UnSetServerAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
string oldServerName = DBConfig.Instance.ServerName;
|
||||||
|
string oldDatabase = DBConfig.Instance.DataBase;
|
||||||
|
string oldDataBook = DBConfig.Instance.DataBook;
|
||||||
|
string oldSelectedLedgerName = SelectedLedgerName;
|
||||||
|
string oldAccountBook = ERPInfo.Instance.AccountBook;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DBConfig.Instance.ServerName = serverName;
|
||||||
|
DBConfig.Instance.DataBase = database;
|
||||||
|
DBConfig.Instance.DataBook = dataBook;
|
||||||
|
|
||||||
|
if (!DBConfig.Instance.CreateConnection(DBConfig.Instance.Connection))
|
||||||
|
throw new InvalidOperationException(ResourceKeys.ServerAddressFault);
|
||||||
|
if (!DBConfig.Instance.ServerType.Equals("达梦数据库") &&
|
||||||
|
DelphiHelper.Delphi_Init(new StringBuilder(
|
||||||
|
DBConfig.Instance.GetDelphiConnection(
|
||||||
|
DBConfig.Instance.dephiConnection))) == 0)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException(
|
||||||
|
ResourceKeys.UnConnectServer + "[By Delphi]");
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemInfo.RefreshSystemParam();
|
||||||
|
DataTable users = LoadUsers();
|
||||||
|
|
||||||
|
SelectedLedgerName = dataBook;
|
||||||
|
ERPInfo.Instance.AccountBook = dataBook;
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
catch (Exception switchException)
|
||||||
|
{
|
||||||
|
DBConfig.Instance.ServerName = oldServerName;
|
||||||
|
DBConfig.Instance.DataBase = oldDatabase;
|
||||||
|
DBConfig.Instance.DataBook = oldDataBook;
|
||||||
|
SelectedLedgerName = oldSelectedLedgerName;
|
||||||
|
ERPInfo.Instance.AccountBook = oldAccountBook;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DBConfig.Instance.CreateConnection(DBConfig.Instance.Connection);
|
||||||
|
if (!DBConfig.Instance.ServerType.Equals("达梦数据库"))
|
||||||
|
{
|
||||||
|
DelphiHelper.Delphi_Init(new StringBuilder(
|
||||||
|
DBConfig.Instance.GetDelphiConnection(
|
||||||
|
DBConfig.Instance.dephiConnection)));
|
||||||
|
}
|
||||||
|
SystemInfo.RefreshSystemParam();
|
||||||
|
}
|
||||||
|
catch (Exception restoreException)
|
||||||
|
{
|
||||||
|
LogHelper.Instance.WriteError(restoreException);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogHelper.Instance.WriteError(switchException);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string LoadRememberedPassword(string loginName)
|
||||||
|
{
|
||||||
|
if (!RememberPasswordEnabled || string.IsNullOrWhiteSpace(loginName))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string encrypted = IniHelper.Read(
|
||||||
|
DBConfig.Instance.ServerName + loginName);
|
||||||
|
if (string.IsNullOrWhiteSpace(encrypted))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
string[] parts = AESUtil.Decrypt(encrypted).Split('^');
|
||||||
|
bool remember;
|
||||||
|
if (parts.Length < 2 ||
|
||||||
|
!bool.TryParse(parts[0], out remember) ||
|
||||||
|
!remember)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Join("^", parts.Skip(1).ToArray());
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Login(
|
||||||
|
string loginName,
|
||||||
|
string password,
|
||||||
|
bool rememberPassword)
|
||||||
|
{
|
||||||
|
ERPInfo.Instance.LoginResult = false;
|
||||||
|
if (string.IsNullOrWhiteSpace(loginName))
|
||||||
|
return ResourceKeys.UserNameNotNull;
|
||||||
|
if (password == null)
|
||||||
|
password = string.Empty;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DataTable users = MainImpl.GetEmployeeList();
|
||||||
|
string displayColumn = ResolveDisplayColumn(users);
|
||||||
|
List<DataRow> matches = users.Rows.Cast<DataRow>()
|
||||||
|
.Where(row =>
|
||||||
|
string.Equals(
|
||||||
|
Value(row, displayColumn),
|
||||||
|
loginName,
|
||||||
|
StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
string.Equals(
|
||||||
|
Value(row, "UserCode"),
|
||||||
|
loginName,
|
||||||
|
StringComparison.OrdinalIgnoreCase))
|
||||||
|
.ToList();
|
||||||
|
if (matches.Count == 0)
|
||||||
|
return ResourceKeys.NameOrPasswordError;
|
||||||
|
if (matches.Count > 1)
|
||||||
|
return ResourceKeys.DuplicatedNameError;
|
||||||
|
|
||||||
|
DataRow user = matches[0];
|
||||||
|
string userId = Value(user, "UserId");
|
||||||
|
string userName = Value(user, "UserName");
|
||||||
|
string loginAccount = Value(user, "UserCode");
|
||||||
|
if (string.IsNullOrWhiteSpace(userId))
|
||||||
|
return ResourceKeys.UserNotFound;
|
||||||
|
|
||||||
|
ERPInfo.Instance.LoginResult = false;
|
||||||
|
if (SystemInfo.Instance.MacEnabled)
|
||||||
|
{
|
||||||
|
int macResult = MainImpl.CheckMacAddress(
|
||||||
|
ERPInfo.Instance.MacAddress,
|
||||||
|
userId);
|
||||||
|
MainImpl.LoginAfterRegister(
|
||||||
|
ERPInfo.Instance.MacAddress,
|
||||||
|
userId);
|
||||||
|
if (macResult == 0)
|
||||||
|
return ResourceKeys.LoginFault + ResourceKeys.UnKownMacAddress;
|
||||||
|
if (macResult == -1)
|
||||||
|
return ResourceKeys.LoginFault + ResourceKeys.UnKownMacAddressTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
string keyError = VerifyEncryptionKey();
|
||||||
|
if (!string.IsNullOrEmpty(keyError))
|
||||||
|
return keyError;
|
||||||
|
|
||||||
|
if (!MainImpl.CheckingMacAddress(userId))
|
||||||
|
return ResourceKeys.MacAddressError +
|
||||||
|
",当前地址:" + ERPInfo.Instance.MacAddress;
|
||||||
|
|
||||||
|
int loginResult = MainImpl.Login(userId, password, false);
|
||||||
|
if (loginResult != 0)
|
||||||
|
return LoginError(loginResult);
|
||||||
|
|
||||||
|
CompleteLogin(
|
||||||
|
userId,
|
||||||
|
userName,
|
||||||
|
loginAccount,
|
||||||
|
loginName,
|
||||||
|
password,
|
||||||
|
rememberPassword);
|
||||||
|
ERPInfo.Instance.LoginResult = true;
|
||||||
|
LogUtil.WriteDebug("", "登录软件", "进入操作", "系统登录");
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
ERPInfo.Instance.LoginResult = false;
|
||||||
|
LogUtil.WriteError(ResourceKeys.UserLogin, exception);
|
||||||
|
return ResourceKeys.LoginFault;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string VerifyEncryptionKey()
|
||||||
|
{
|
||||||
|
if (!SystemInfo.Instance.IsEncrypt)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
int[] keyHandles = ERPInfo.Instance.keyHandles = new int[8];
|
||||||
|
int[] keyNumbers = ERPInfo.Instance.keyNumber = new int[8];
|
||||||
|
SmartX1Api.SmartX1Find(DBConfig.Instance.ServerName, keyHandles, keyNumbers);
|
||||||
|
|
||||||
|
int keyHandle = keyHandles[0];
|
||||||
|
int pin1 = Convert.ToInt32("0x987F6BCD", 16);
|
||||||
|
int pin2 = Convert.ToInt32("0xE193C5B2", 16);
|
||||||
|
int pin3 = Convert.ToInt32("0xD507CC28", 16);
|
||||||
|
int pin4 = Convert.ToInt32("0x4B125AF6", 16);
|
||||||
|
return SmartX1Api.SmartX1Open(keyHandle, pin1, pin2, pin3, pin4) == 0
|
||||||
|
? string.Empty
|
||||||
|
: "U盾数据获取失败,请重试或联系管理员";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CompleteLogin(
|
||||||
|
string userId,
|
||||||
|
string userName,
|
||||||
|
string loginAccount,
|
||||||
|
string enteredLoginName,
|
||||||
|
string password,
|
||||||
|
bool rememberPassword)
|
||||||
|
{
|
||||||
|
if (!MainImpl.HasExistsColumn("p_employeetab", "MacAdress"))
|
||||||
|
BaseImpl.ExecSqlValue("alter table p_employeetab add MacAdress varchar(100)");
|
||||||
|
BaseImpl.ExecSqlValue(string.Format(
|
||||||
|
"update p_employeetab set MacAdress = '{0}' where employeeid='{1}'",
|
||||||
|
(ERPInfo.Instance.MacAddress ?? string.Empty).Replace("'", "''"),
|
||||||
|
userId.Replace("'", "''")));
|
||||||
|
|
||||||
|
if (!MainImpl.HasExistsColumn("p_employeetab", "ClientIp"))
|
||||||
|
BaseImpl.ExecSqlValue("alter table p_employeetab add ClientIp varchar(100)");
|
||||||
|
BaseImpl.ExecSqlValue(string.Format(
|
||||||
|
"update p_employeetab set ClientIp = '{0}' where employeeid='{1}'",
|
||||||
|
(ERPInfo.Instance.LoginIPV4 ?? string.Empty).Replace("'", "''"),
|
||||||
|
userId.Replace("'", "''")));
|
||||||
|
|
||||||
|
if (SystemInfo.Instance.AutoSystemDataFormat)
|
||||||
|
{
|
||||||
|
FormatSystemDatetime formatter = new FormatSystemDatetime();
|
||||||
|
formatter.SetDateTimeFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
string skinName = MainImpl.GetUserSkin(userId);
|
||||||
|
skinName = string.IsNullOrEmpty(skinName)
|
||||||
|
? ERPInfo.Instance.SkinName
|
||||||
|
: skinName;
|
||||||
|
UserLookAndFeel.Default.SetSkinStyle(skinName);
|
||||||
|
|
||||||
|
IniHelper.Write(
|
||||||
|
DBConfig.Instance.ServerName + enteredLoginName,
|
||||||
|
AESUtil.Encrypt(rememberPassword + "^" + password));
|
||||||
|
|
||||||
|
ERPInfo.Instance.SeriesId = SystemInfo.Instance.seriesid;
|
||||||
|
ERPInfo.Instance.UserLinkPhone = MainImpl.GetUserPhone(userId);
|
||||||
|
ERPInfo.Instance.UserId = userId;
|
||||||
|
ERPInfo.Instance.UserName = userName;
|
||||||
|
ERPInfo.Instance.Password = SHAHelper.EncryptPassword(password);
|
||||||
|
ERPInfo.Instance.SkinName = skinName;
|
||||||
|
string accountBook = string.IsNullOrWhiteSpace(SelectedLedgerName)
|
||||||
|
? DBConfig.Instance.DataBook
|
||||||
|
: SelectedLedgerName;
|
||||||
|
ERPInfo.Instance.AccountBook = accountBook;
|
||||||
|
ERPInfo.Instance.LoginAccount = loginAccount;
|
||||||
|
ERPInfo.Instance.InPassWord = password;
|
||||||
|
ERPInfo.Instance.PrimitiveBrowser = SystemInfo.Instance.PrimitiveBrowser;
|
||||||
|
|
||||||
|
DBConfig.Instance.LoginName = enteredLoginName;
|
||||||
|
DBConfig.Instance.NoticeUserID = userId;
|
||||||
|
DBConfig.Instance.NoticeUserName = userName;
|
||||||
|
DBConfig.Instance.DataBook = accountBook;
|
||||||
|
DBConfig.Instance.WriteConfig();
|
||||||
|
|
||||||
|
if (userName.Equals("管理员") &&
|
||||||
|
!string.IsNullOrWhiteSpace(loginAccount))
|
||||||
|
{
|
||||||
|
ERPInfo.Instance.Password = SqlHelper.ExecuteString(
|
||||||
|
"Password",
|
||||||
|
"select Password from P_EmployeeTab where LoginAccount='" +
|
||||||
|
loginAccount.Replace("'", "''") + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
ERPInfo.Instance.LanguageName = "中文";
|
||||||
|
LanguageTranslation.GetLanguageComparisonTable();
|
||||||
|
TrySetDelphiParameters();
|
||||||
|
PubUtil.ClearFilesInDirectory(PubUtil.ImageDownloadPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TrySetDelphiParameters()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DelphiHelper.Delphi_SetParams(
|
||||||
|
Convert.ToInt32(ERPInfo.Instance.UserId),
|
||||||
|
string.IsNullOrWhiteSpace(ERPInfo.Instance.SubSysId)
|
||||||
|
? 0
|
||||||
|
: Convert.ToInt32(ERPInfo.Instance.SubSysId),
|
||||||
|
new StringBuilder(ERPInfo.Instance.UserName),
|
||||||
|
new StringBuilder(ERPInfo.Instance.WindowName),
|
||||||
|
new StringBuilder(ERPInfo.Instance.SkinName));
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
LogHelper.Instance.WriteError(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string LoginError(int loginResult)
|
||||||
|
{
|
||||||
|
switch (loginResult)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return ResourceKeys.NameOrPasswordError;
|
||||||
|
case 2:
|
||||||
|
return ResourceKeys.AlreadyLogin;
|
||||||
|
case -2:
|
||||||
|
return ResourceKeys.MultiFailedLogin;
|
||||||
|
default:
|
||||||
|
return ResourceKeys.LoginFault;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ResolveSelectedLedgerName(DataTable ledgers)
|
||||||
|
{
|
||||||
|
DataRow selected = ledgers.Rows.Cast<DataRow>().FirstOrDefault(
|
||||||
|
row => string.Equals(
|
||||||
|
Value(row, "DBName"),
|
||||||
|
DBConfig.Instance.DataBase,
|
||||||
|
StringComparison.OrdinalIgnoreCase));
|
||||||
|
if (selected == null && !string.IsNullOrWhiteSpace(DBConfig.Instance.DataBook))
|
||||||
|
{
|
||||||
|
selected = ledgers.Rows.Cast<DataRow>().FirstOrDefault(
|
||||||
|
row => string.Equals(
|
||||||
|
Value(row, "ShowName"),
|
||||||
|
DBConfig.Instance.DataBook,
|
||||||
|
StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
if (selected == null)
|
||||||
|
selected = ledgers.Rows.Cast<DataRow>().FirstOrDefault();
|
||||||
|
|
||||||
|
return selected == null ? string.Empty : Value(selected, "ShowName");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ResolveDisplayColumn(DataTable users)
|
||||||
|
{
|
||||||
|
string configured = SystemInfo.Instance.LoginUsername;
|
||||||
|
return !string.IsNullOrWhiteSpace(configured) &&
|
||||||
|
users.Columns.Contains(configured)
|
||||||
|
? configured
|
||||||
|
: "UserName";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string Value(DataRow row, string columnName)
|
||||||
|
{
|
||||||
|
return row != null && row.Table.Columns.Contains(columnName)
|
||||||
|
? row[columnName] + string.Empty
|
||||||
|
: string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -675,6 +675,9 @@ namespace Lskj.Main.Model
|
|||||||
/// <returns>DialogResult.</returns>
|
/// <returns>DialogResult.</returns>
|
||||||
private static DialogResult RunLoginForm()
|
private static DialogResult RunLoginForm()
|
||||||
{
|
{
|
||||||
|
if (ExternalMainShell != null)
|
||||||
|
return ExternalMainShell.ShowLoginDialog(new LegacyLoginRuntime());
|
||||||
|
|
||||||
FrmLogin frmLogin = new FrmLogin();
|
FrmLogin frmLogin = new FrmLogin();
|
||||||
return frmLogin.ShowDialog();
|
return frmLogin.ShowDialog();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user