From 3cab868262d5e84cd1000851c07cce43a459f3ea Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期四, 29 八月 2024 20:49:54 +0800
Subject: [PATCH] 增加CS客户端登录逻辑

---
 Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs        |    9 
 Tiger.IBusiness/Common/ILogin.cs              |   34 +++
 Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs   |   56 ++++-
 Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs   |   28 ++
 Tiger.Api/Controllers/Base/LoginController.cs |   46 ++++
 Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs  |   12 +
 Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs   |   12 +
 Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs  |   28 ++
 Tiger.Business/SYS/Biz.SYS_CS_LOGIN.cs        |  172 +++++++++++++++++
 Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs   |  175 ++++++++++-------
 10 files changed, 462 insertions(+), 110 deletions(-)

diff --git a/Tiger.Api/Controllers/Base/LoginController.cs b/Tiger.Api/Controllers/Base/LoginController.cs
index 0344310..3dde641 100644
--- a/Tiger.Api/Controllers/Base/LoginController.cs
+++ b/Tiger.Api/Controllers/Base/LoginController.cs
@@ -17,6 +17,7 @@
     [ApiController]
     public class LoginController : ControllerBase
     {
+        #region BS
         /// <summary>
         /// 鐧诲綍
         /// </summary>
@@ -25,7 +26,7 @@
         [HttpPost]
         public async Task<IActionResult> LoginAsync([FromBody] ApiAction<UserInfo> action)
         {
-            return Ok(await DI.Resolve<ILogin>().Login(action));
+            return Ok(await DI.Resolve<ILogin>().BSLogin(action));
         }
         /// <summary>
         /// 鍒囨崲鎹偣
@@ -35,7 +36,7 @@
         [HttpGet]
         public async Task<IActionResult> SwitchOrgCode(string token, string org, string fty)
         {
-            return Ok(await DI.Resolve<ILogin>().SwitchOrgCode(token,org, fty));
+            return Ok(await DI.Resolve<ILogin>().BSSwitchOrgCode(token,org, fty));
         }
         /// <summary>
         /// 鑾峰彇鐧诲綍淇℃伅
@@ -46,7 +47,7 @@
         public async Task<IActionResult> GetLoginInfo(string token)
         {
             var _token =string.IsNullOrEmpty(token)?Request.Headers["Authorization"].ToString(): token;
-            return Ok(await DI.Resolve<ILogin>().GetLoginInfo(_token));
+            return Ok(await DI.Resolve<ILogin>().GetBSLoginInfo(_token));
         }
 
         /// <summary>
@@ -57,7 +58,44 @@
         [HttpPost]
         public async Task<IActionResult> LogoutAsync([FromBody] ApiAction action)
         {
-            return Ok(await DI.Resolve<ILogin>().Logout(action.Data?.ToString()));
+            return Ok(await DI.Resolve<ILogin>().BSLogout(action.Data?.ToString()));
         }
+        #endregion
+
+        #region CS
+        /// <summary>
+        /// 鐧诲綍
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> CSLoginAsync([FromBody] ApiAction<UserInfo> action)
+        {
+            return Ok(await DI.Resolve<ILogin>().CSLogin(action));
+        }
+
+        /// <summary>
+        /// 鑾峰彇鐧诲綍淇℃伅
+        /// </summary>
+        /// <param name="token"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> GetCSLoginInfo(string token)
+        {
+            var _token = string.IsNullOrEmpty(token) ? Request.Headers["Authorization"].ToString() : token;
+            return Ok(await DI.Resolve<ILogin>().GetCSLoginInfo(_token));
+        }
+
+        /// <summary>
+        /// 娉ㄩ攢
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> CSLogoutAsync([FromBody] ApiAction action)
+        {
+            return Ok(await DI.Resolve<ILogin>().CSLogout(action.Data?.ToString()));
+        }
+        #endregion
     }
 }
\ No newline at end of file
diff --git a/Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs b/Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs
index 94dcb23..57eb9f7 100644
--- a/Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs
+++ b/Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs
@@ -19,7 +19,7 @@
         /// <param name="token"></param>
         /// <param name="Async"></param>
         /// <returns></returns>
-        public async Task<SYS_BS_LOGIN> GetLoginInfo(string token, bool Async = true)
+        public async Task<SYS_BS_LOGIN> GetBSLoginInfo(string token, bool Async = true)
         {
             SYS_BS_LOGIN query = null;
             try
@@ -70,7 +70,7 @@
         /// <param name="action"></param>
         /// <param name="Async"></param>
         /// <returns></returns>
-        public async Task<ApiAction<SYS_BS_LOGIN>> Login(ApiAction<UserInfo> action, bool Async = true)
+        public async Task<ApiAction<SYS_BS_LOGIN>> BSLogin(ApiAction<UserInfo> action, bool Async = true)
         {
             var res = new ApiAction<SYS_BS_LOGIN>();
             try
@@ -169,13 +169,14 @@
             }
             return await Task.FromResult(res);
         }
+
         /// <summary>
         /// 鍒囨崲鎹偣
         /// </summary>
         /// <param name="action"></param>
         /// <param name="Async"></param>
         /// <returns></returns>
-        public async Task<ApiAction> SwitchOrgCode(string token,string org, string fty)
+        public async Task<ApiAction> BSSwitchOrgCode(string token,string org, string fty)
         {
             var action = new ApiAction();
             try
@@ -209,7 +210,7 @@
         /// </summary>
         /// <param name="token"></param>
         /// <returns></returns>
-        public async Task<ApiAction> Logout(string token)
+        public async Task<ApiAction> BSLogout(string token)
         {
             var res = new ApiAction();
             try
diff --git a/Tiger.Business/SYS/Biz.SYS_CS_LOGIN.cs b/Tiger.Business/SYS/Biz.SYS_CS_LOGIN.cs
new file mode 100644
index 0000000..d49ca2a
--- /dev/null
+++ b/Tiger.Business/SYS/Biz.SYS_CS_LOGIN.cs
@@ -0,0 +1,172 @@
+锘縰sing Tiger.Model;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+using Rhea.Common;
+using Tiger.IBusiness;
+using Dm.filter.log;
+
+namespace Tiger.Business
+{
+    public partial class Biz : ILogin
+    {
+        /// <summary>
+        /// 鑾峰彇CS鐧诲綍淇℃伅
+        /// </summary>
+        /// <param name="token"></param>
+        /// <param name="Async"></param>
+        /// <returns></returns>
+        public async Task<SYS_CS_LOGIN> GetCSLoginInfo(string token, bool Async = true)
+        {
+            SYS_CS_LOGIN query = null;
+            try
+            {
+                query = Db.Queryable<SYS_CS_LOGIN>().Where(x => x.TOKEN == token).First();
+                if (query != null)
+                {
+                    //瓒呰繃8灏忔椂鍒犻櫎鐧诲綍
+                    if ((DateTime.Now - query.LAST_ACCESS).Hours > 4)
+                    {
+                        Db.Deleteable(query).ExecuteCommand();
+                        return null;
+                    }
+                }
+            }
+            catch (System.Exception ex)
+            {
+
+            }
+            return await Task.FromResult(query);
+        }
+
+        /// <summary>
+        /// CS鐧诲綍
+        /// </summary>
+        /// <param name="action"></param>
+        /// <param name="Async"></param>
+        /// <returns></returns>
+        public async Task<ApiAction<SYS_CS_LOGIN>> CSLogin(ApiAction<UserInfo> action, bool Async = true)
+        {
+            var res = new ApiAction<SYS_CS_LOGIN>();
+            try
+            {
+                UserInfo userInfo = action.Data;
+                var user = Db.Queryable<SYS_USER>().Where(x => x.USER_ID == userInfo.USER_CODE && x.USER_PWD == userInfo.PASSWORD).First();
+                if (user != null)
+                {
+                    if (user.STATUS_CODE == "ENABLE")
+                    {
+                        MES_FACTORY _factory = Db.Queryable<MES_FACTORY>()
+                                                .WhereIF(!userInfo.FTY_CODE.IsNullOrEmpty(),x => x.FTY_CODE == userInfo.FTY_CODE)
+                                                .First();
+
+                        SYS_CS_LOGIN logininfo = new SYS_CS_LOGIN
+                        {
+                            USER_ID = user.USER_ID,
+                            USER_NAME = user.USER_NAME,
+                            LAST_ACCESS = DateTime.Now,
+                            CREATE_TIME = DateTime.Now,
+                            STATUS_CODE = user.STATUS_CODE,
+                            CLIENT_IP = userInfo?.ip,
+                            TOKEN = userInfo.Token ?? Guid.NewGuid().ToString("N"),
+                            ID = Guid.NewGuid().ToString("N"),
+                            ACCOUNT_TYPE = 0,
+                            ORG_CODE = userInfo.ORG_CODE,
+                            PROD_CODE = _factory?.FTY_CODE,
+                        };
+                        var org_code=Db.Queryable<V_USER_ORG>().Where(q=>q.USER_ID == userInfo.USER_CODE && q.ORG_CODE==userInfo.ORG_CODE).First();
+                        if (org_code != null)
+                        {
+                            logininfo.ORG_CODE = org_code.ORG_CODE;
+                        }
+                        else
+                        {
+                            var prod_code = Db.Queryable<V_USER_PROD>().Where(q => q.USER_ID == userInfo.USER_CODE && q.PROD_CODE == userInfo.PROD_CODE).First();
+                            if (prod_code != null)
+                            {
+                                logininfo.PROD_CODE = prod_code.PROD_CODE;
+                            }
+                            else
+                            {
+                                res.IsSuccessed = false;
+                                res.Data = null;
+                                res.LocaleMsg = L("SYS.Login.isNotOrgCode");//鐢ㄦ埛娌℃湁璇ユ嵁鐐圭殑鏉冮檺 }
+                            }
+                        }
+                        LOG_CS_LOGIN loginlog = new()
+                        {
+                            USER_ID = user.USER_ID,
+                            LOGIN_FROM = $"{userInfo?.ad_info?.nation}->{userInfo?.ad_info?.province}->{userInfo?.ad_info?.city};IP:{userInfo?.ip}",
+                            LOGIN_TIME = DateTime.Now,
+                            ORG_CODE = userInfo.ORG_CODE,
+                            PROD_CODE = _factory?.FTY_CODE,
+                        };
+                        //淇濆瓨鐧诲綍鏃ュ織
+                        var db = Business.Biz.Db;
+                        var dbTran = db.UseTran(() =>
+                        {
+                            db.Insertable(loginlog).ExecuteCommand();
+
+                            if (logininfo != null)
+                            {
+                                var deres = db.Storageable(logininfo).ExecuteCommand();
+                            }
+                            res.Data = logininfo;
+                        });
+                        if (!dbTran.IsSuccess)
+                        {
+                            res.IsSuccessed = false;
+                            res.Data = null;
+                            res.LocaleMsg = L("SYS.Login.dbTranError");
+                        }
+                        res.Data = logininfo;
+                    }
+                    else
+                    {
+                        res.IsSuccessed = false;
+                        res.Data = null;
+                        res.LocaleMsg = L("SYS.Login.dbTranError");//鐢ㄦ埛宸茬鐢�
+                    }
+                }
+                else
+                {
+                    res.IsSuccessed = false;
+                    res.Data = null;
+                    res.LocaleMsg = L("SYS.Login.errMsg401");//鐢ㄦ埛娌℃湁鏉冮檺锛堜护鐗屻�佺敤鎴峰悕銆佸瘑鐮侀敊璇級!
+                }
+            }
+            catch (Exception ex)
+            {
+                res.CatchExceptionWithLog(ex, "鐧诲綍寮傚父");
+            }
+            return await Task.FromResult(res);
+        }
+
+        /// <summary>
+        /// CS鐧诲嚭
+        /// </summary>
+        /// <param name="token"></param>
+        /// <returns></returns>
+        public async Task<ApiAction> CSLogout(string token)
+        {
+            var res = new ApiAction();
+            try
+            {
+                var query = Db.Queryable<SYS_CS_LOGIN>().Where(x => x.TOKEN == token).First();
+                if (query != null)
+                {
+                    Db.Deleteable(query).ExecuteCommand();
+                    return res;
+                }
+            }
+            catch (Exception ex)
+            {
+                res.CatchExceptionWithLog(ex, "娉ㄩ攢鐧诲綍寮傚父");
+            }
+            return await Task.FromResult(res);
+        }
+    }
+}
diff --git a/Tiger.IBusiness/Common/ILogin.cs b/Tiger.IBusiness/Common/ILogin.cs
index 2f16b02..b5651cc 100644
--- a/Tiger.IBusiness/Common/ILogin.cs
+++ b/Tiger.IBusiness/Common/ILogin.cs
@@ -11,13 +11,14 @@
 {
     public interface ILogin
     {
+        #region BS
         /// <summary>
         /// 鑾峰彇鐧诲綍淇℃伅
         /// </summary>
         /// <param name="token"></param>
         /// <param name="Async"></param>
         /// <returns></returns>
-        public Task<SYS_BS_LOGIN> GetLoginInfo(string token, bool Async = true);
+        public Task<SYS_BS_LOGIN> GetBSLoginInfo(string token, bool Async = true);
 
         /// <summary>
         /// 娣诲姞璁板綍
@@ -33,21 +34,46 @@
         /// <param name="action"></param>
         /// <param name="Async"></param>
         /// <returns></returns>
-        public Task<ApiAction<SYS_BS_LOGIN>> Login(ApiAction<UserInfo> action, bool Async = true);
+        public Task<ApiAction<SYS_BS_LOGIN>> BSLogin(ApiAction<UserInfo> action, bool Async = true);
         /// <summary>
         /// 鍒囨崲鎹偣
         /// </summary>
         /// <param name="action"></param>
         /// <param name="Async"></param>
         /// <returns></returns>
-        public Task<ApiAction> SwitchOrgCode(string token, string org, string fty);
+        public Task<ApiAction> BSSwitchOrgCode(string token, string org, string fty);
 
         /// <summary>
         /// 娉ㄩ攢
         /// </summary>
         /// <param name="token"></param>
         /// <returns></returns>
-        public Task<ApiAction> Logout(string token);
+        public Task<ApiAction> BSLogout(string token);
+        #endregion
 
+        #region CS
+        /// <summary>
+        /// 鑾峰彇鐧诲綍淇℃伅
+        /// </summary>
+        /// <param name="token"></param>
+        /// <param name="Async"></param>
+        /// <returns></returns>
+        public Task<SYS_CS_LOGIN> GetCSLoginInfo(string token, bool Async = true);
+
+        /// <summary>
+        /// 鐧诲綍
+        /// </summary>
+        /// <param name="action"></param>
+        /// <param name="Async"></param>
+        /// <returns></returns>
+        public Task<ApiAction<SYS_CS_LOGIN>> CSLogin(ApiAction<UserInfo> action, bool Async = true);
+
+        /// <summary>
+        /// 娉ㄩ攢
+        /// </summary>
+        /// <param name="token"></param>
+        /// <returns></returns>
+        public Task<ApiAction> CSLogout(string token);
+        #endregion
     }
 }
diff --git a/Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs b/Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs
index fa9465c..ef76a09 100644
--- a/Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs
+++ b/Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs
@@ -6,96 +6,121 @@
 
 namespace Tiger.Model
 {
-    /// <summary>
-    /// 瀹炰綋锛欱S鐧诲綍鏃ュ織
-    /// </summary>
-    [Description("Primary:ID")]
-    [Serializable]
-    [SugarTable("LOG_BS_LOGIN")]
-    public class LOG_BS_LOGIN : DbEntityOnlyID
-    {
-        #region 鏋勯�犲嚱鏁�
-        /// <summary>
-        /// 瀹炰綋锛欱S鐧诲綍鏃ュ織
-        /// </summary>
-        public LOG_BS_LOGIN() { }
-        #endregion
+	/// <summary>
+	/// 实体:BS登录日志
+	/// </summary>
+	[Description("Primary:ID")]
+	[DisplayName("BS登录日志")]
+	[Serializable]
+	[SugarTable("LOG_BS_LOGIN")]
+	public class LOG_BS_LOGIN : DbEntityOnlyID
+	{
+		#region 构造函数
+		/// <summary>
+		/// 实体:BS登录日志
+		/// </summary>
+		public LOG_BS_LOGIN() {}
+		#endregion
 
-        #region 鍏叡灞炴��
-        /// <summary>
-        /// SessionID
-        /// </summary>
-        public string SESSION_ID { get; set; }
-        /// <summary>
-        /// 宸ュ巶
-        /// </summary>
-        public string FACTORY { get; set; }
-        /// <summary>
-        /// 鐢ㄦ埛ID
-        /// </summary>
-        public string USER_ID { get; set; }
-        /// <summary>
-        /// 鐧诲綍淇℃伅
-        /// </summary>
-        public string LOGIN_FROM { get; set; }
-        /// <summary>
-        /// 鐧诲綍Channel
-        /// </summary>
-        public string LOGIN_CHANNEL { get; set; }
-        /// <summary>
-        /// 鐧诲綍URL
-        /// </summary>
-        public string LOGIN_URL { get; set; }
-        /// <summary>
-        /// 鐧诲綍鏃堕棿
-        /// </summary>
-        public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
-        /// <summary>
-        /// 鐧诲嚭URL
-        /// </summary>
-        public string LOGOUT_URL { get; set; }
-        /// <summary>
-        /// 鐧诲嚭鏃堕棿
-        /// </summary>
-        public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
-        #endregion
+		#region 公共属性
+		/// <summary>
+		/// SessionID
+		/// </summary>
+		[DisplayName("SessionID")]
+		public string SESSION_ID { get; set; }
+		/// <summary>
+		/// 工厂
+		/// </summary>
+		[DisplayName("工厂")]
+		public string FACTORY { get; set; }
+		/// <summary>
+		/// 用户ID
+		/// </summary>
+		[DisplayName("用户ID")]
+		public string USER_ID { get; set; }
+		/// <summary>
+		/// 登录信息
+		/// </summary>
+		[DisplayName("登录信息")]
+		public string LOGIN_FROM { get; set; }
+		/// <summary>
+		/// 登录Channel
+		/// </summary>
+		[DisplayName("登录Channel")]
+		public string LOGIN_CHANNEL { get; set; }
+		/// <summary>
+		/// 登录URL
+		/// </summary>
+		[DisplayName("登录URL")]
+		public string LOGIN_URL { get; set; }
+		/// <summary>
+		/// 登录时间
+		/// </summary>
+		[DisplayName("登录时间")]
+		public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
+		/// <summary>
+		/// 登出URL
+		/// </summary>
+		[DisplayName("登出URL")]
+		public string LOGOUT_URL { get; set; }
+		/// <summary>
+		/// 登出时间
+		/// </summary>
+		[DisplayName("登出时间")]
+		public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
+		/// <summary>
+		/// 组织编码
+		/// </summary>
+		[DisplayName("组织编码")]
+		public string ORG_CODE { get; set; }
+		/// <summary>
+		/// 生产单元编码
+		/// </summary>
+		[DisplayName("生产单元编码")]
+		public string PROD_CODE { get; set; }
+		/// <summary>
+		/// 仓库单元编码
+		/// </summary>
+		[DisplayName("仓库单元编码")]
+		public string WH_CODE { get; set; }
+		#endregion
 
-        #region 铏氭嫙灞炴��
-        /*渚嬪瓙
+		#region 虚拟属性
+		/*例子
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-        #endregion
+		#endregion
 
-        #region 澶栭敭灞炴��
-        /*渚嬪瓙
-		//涓�瀵逛竴澶栭敭瀵艰埅
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疞OG_BS_LOGIN绫婚噷闈㈢殑澶栭敭ID瀛楁
-		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
-		//涓�瀵瑰澶栭敭瀵艰埅
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.LOG_BS_LOGINId))]//ClassA琛ㄤ腑鐨凩OG_BS_LOGINId
-		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
-		//澶氬澶氬閿鑸�
-		[Navigate(typeof(MappingClass), nameof(MappingClass.LOG_BS_LOGINId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
-		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		#region 外键属性
+		/*例子
+		//一对一外键导航
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是LOG_BS_LOGIN类里面的外键ID字段
+		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
+		//一对多外键导航
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.LOG_BS_LOGINId))]//ClassA表中的LOG_BS_LOGINId
+		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
+		//多对多外键导航
+		[Navigate(typeof(MappingClass), nameof(MappingClass.LOG_BS_LOGINId), nameof(MappingClass.ClassAId))]//注意顺序
+		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
 		*/
-        #endregion
+		#endregion
 
-        #region 鏋氫妇鍙橀噺
-        /*渚嬪瓙
+		#region 枚举变量
+		/*例子
 		public enum FieldNames
 		{
-			[Description("鏋氫妇鎻忚堪0")]
+			[Description("枚举描述0")]
 			Enum0,
-			[Description("鏋氫妇鎻忚堪1")]
+			[Description("枚举描述1")]
 			Enum1,
 		}
 		*/
-        #endregion
+		#endregion
 
-        #region 鍏叡鏂规硶
+		#region 公共方法
 
-        #endregion
+		#endregion
 
-    }//endClass
+	}//endClass
 }
\ No newline at end of file
diff --git a/Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs b/Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs
index 8d10ae5..11b7169 100644
--- a/Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs
+++ b/Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs
@@ -10,6 +10,7 @@
 	/// 实体:CS登录日志
 	/// </summary>
 	[Description("Primary:ID")]
+	[DisplayName("CS登录日志")]
 	[Serializable]
 	[SugarTable("LOG_CS_LOGIN")]
 	public class LOG_CS_LOGIN : DbEntityOnlyID
@@ -25,39 +26,58 @@
 		/// <summary>
 		/// SessionID
 		/// </summary>
+		[DisplayName("SessionID")]
 		public string SESSION_ID { get; set; }
-		/// <summary>
-		/// 工厂
-		/// </summary>
-		public string FACTORY { get; set; }
 		/// <summary>
 		/// 用户ID
 		/// </summary>
+		[DisplayName("用户ID")]
 		public string USER_ID { get; set; }
 		/// <summary>
 		/// 登录信息
 		/// </summary>
+		[DisplayName("登录信息")]
 		public string LOGIN_FROM { get; set; }
 		/// <summary>
 		/// 登录Channel
 		/// </summary>
+		[DisplayName("登录Channel")]
 		public string LOGIN_CHANNEL { get; set; }
 		/// <summary>
 		/// 登录URL
 		/// </summary>
+		[DisplayName("登录URL")]
 		public string LOGIN_URL { get; set; }
 		/// <summary>
 		/// 登录时间
 		/// </summary>
+		[DisplayName("登录时间")]
 		public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
 		/// 登出URL
 		/// </summary>
+		[DisplayName("登出URL")]
 		public string LOGOUT_URL { get; set; }
 		/// <summary>
 		/// 登出时间
 		/// </summary>
+		[DisplayName("登出时间")]
 		public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
+		/// <summary>
+		/// 组织编码
+		/// </summary>
+		[DisplayName("组织编码")]
+		public string ORG_CODE { get; set; }
+		/// <summary>
+		/// 生产单元编码
+		/// </summary>
+		[DisplayName("生产单元编码")]
+		public string PROD_CODE { get; set; }
+		/// <summary>
+		/// 仓库单元编码
+		/// </summary>
+		[DisplayName("仓库单元编码")]
+		public string WH_CODE { get; set; }
 		#endregion
 
 		#region 虚拟属性
diff --git a/Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs b/Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs
index 177affd..e4b396a 100644
--- a/Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs
+++ b/Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs
@@ -10,6 +10,7 @@
 	/// 实体:PDA登录日志
 	/// </summary>
 	[Description("Primary:ID")]
+	[DisplayName("PDA登录日志")]
 	[Serializable]
 	[SugarTable("LOG_PDA_LOGIN")]
 	public class LOG_PDA_LOGIN : DbEntityOnlyID
@@ -25,39 +26,58 @@
 		/// <summary>
 		/// SessionID
 		/// </summary>
+		[DisplayName("SessionID")]
 		public string SESSION_ID { get; set; }
-		/// <summary>
-		/// 工厂
-		/// </summary>
-		public string FACTORY { get; set; }
 		/// <summary>
 		/// 用户ID
 		/// </summary>
+		[DisplayName("用户ID")]
 		public string USER_ID { get; set; }
 		/// <summary>
 		/// 登录信息
 		/// </summary>
+		[DisplayName("登录信息")]
 		public string LOGIN_FROM { get; set; }
 		/// <summary>
 		/// 登录Channel
 		/// </summary>
+		[DisplayName("登录Channel")]
 		public string LOGIN_CHANNEL { get; set; }
 		/// <summary>
 		/// 登录URL
 		/// </summary>
+		[DisplayName("登录URL")]
 		public string LOGIN_URL { get; set; }
 		/// <summary>
 		/// 登录时间
 		/// </summary>
+		[DisplayName("登录时间")]
 		public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
 		/// 登出URL
 		/// </summary>
+		[DisplayName("登出URL")]
 		public string LOGOUT_URL { get; set; }
 		/// <summary>
 		/// 登出时间
 		/// </summary>
+		[DisplayName("登出时间")]
 		public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
+		/// <summary>
+		/// 组织编码
+		/// </summary>
+		[DisplayName("组织编码")]
+		public string ORG_CODE { get; set; }
+		/// <summary>
+		/// 生产单元编码
+		/// </summary>
+		[DisplayName("生产单元编码")]
+		public string PROD_CODE { get; set; }
+		/// <summary>
+		/// 仓库单元编码
+		/// </summary>
+		[DisplayName("仓库单元编码")]
+		public string WH_CODE { get; set; }
 		#endregion
 
 		#region 虚拟属性
diff --git a/Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs b/Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs
index 02c1fa4..a9bc85d 100644
--- a/Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs
+++ b/Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs
@@ -10,6 +10,7 @@
 	/// 实体:BS登录信息
 	/// </summary>
 	[Description("Primary:ID")]
+	[DisplayName("BS登录信息")]
 	[Serializable]
 	[SugarTable("SYS_BS_LOGIN")]
 	public class SYS_BS_LOGIN : DbEntity
@@ -25,58 +26,83 @@
 		/// <summary>
 		/// 登录TOKEN
 		/// </summary>
+		[DisplayName("登录TOKEN")]
 		public string TOKEN { get; set; }
 		/// <summary>
 		/// 最后登录时间
 		/// </summary>
+		[DisplayName("最后登录时间")]
 		public DateTime LAST_ACCESS { get; set; } = DateTime.MinValue;
 		/// <summary>
 		/// 用户ID
 		/// </summary>
+		[DisplayName("用户ID")]
 		public string USER_ID { get; set; }
 		/// <summary>
 		/// 用户名
 		/// </summary>
+		[DisplayName("用户名")]
 		public string USER_NAME { get; set; }
 		/// <summary>
 		/// 权限
 		/// </summary>
+		[DisplayName("权限")]
 		public string PERMISSION { get; set; }
 		/// <summary>
 		/// IP地址
 		/// </summary>
+		[DisplayName("IP地址")]
 		public string CLIENT_IP { get; set; }
 		/// <summary>
 		/// 账号类型
 		/// </summary>
+		[DisplayName("账号类型")]
 		public int ACCOUNT_TYPE { get; set; }
 		/// <summary>
-		/// 工厂代码
+		/// 工厂编码
 		/// </summary>
+		[DisplayName("工厂编码")]
 		public string FTY_CODE { get; set; }
 		/// <summary>
 		/// 工厂描述
 		/// </summary>
+		[DisplayName("工厂描述")]
 		public string FTY_NAME { get; set; }
 		/// <summary>
 		/// 用户状态
 		/// </summary>
+		[DisplayName("用户状态")]
 		public string STATUS_CODE { get; set; }
-        /// <summary>
-        /// 组织编码
-        /// </summary>
-        public string ORG_CODE { get; set; }
-        #endregion
+		/// <summary>
+		/// 组织编码
+		/// </summary>
+		[DisplayName("组织编码")]
+		public string ORG_CODE { get; set; }
+		#endregion
 
-        #region 虚拟属性
-        /*例子
+		#region 虚拟属性
+		/*例子
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-        #endregion
+		#endregion
 
-        #region 枚举变量
-        /*例子
+		#region 外键属性
+		/*例子
+		//一对一外键导航
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是SYS_BS_LOGIN类里面的外键ID字段
+		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
+		//一对多外键导航
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.SYS_BS_LOGINId))]//ClassA表中的SYS_BS_LOGINId
+		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
+		//多对多外键导航
+		[Navigate(typeof(MappingClass), nameof(MappingClass.SYS_BS_LOGINId), nameof(MappingClass.ClassAId))]//注意顺序
+		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+		*/
+		#endregion
+
+		#region 枚举变量
+		/*例子
 		public enum FieldNames
 		{
 			[Description("枚举描述0")]
@@ -85,11 +111,11 @@
 			Enum1,
 		}
 		*/
-        #endregion
+		#endregion
 
-        #region 公共方法
+		#region 公共方法
 
-        #endregion
+		#endregion
 
-    }//endClass
+	}//endClass
 }
\ No newline at end of file
diff --git a/Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs b/Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs
index 6f61f0e..82f589f 100644
--- a/Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs
+++ b/Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs
@@ -10,6 +10,7 @@
 	/// 实体:CS登录信息
 	/// </summary>
 	[Description("Primary:ID")]
+	[DisplayName("CS登录信息")]
 	[Serializable]
 	[SugarTable("SYS_CS_LOGIN")]
 	public class SYS_CS_LOGIN : DbEntityWithAuth
@@ -25,46 +26,57 @@
 		/// <summary>
 		/// 登录TOKEN
 		/// </summary>
+		[DisplayName("登录TOKEN")]
 		public string TOKEN { get; set; }
 		/// <summary>
 		/// 最后登录时间
 		/// </summary>
+		[DisplayName("最后登录时间")]
 		public DateTime LAST_ACCESS { get; set; } = DateTime.MinValue;
 		/// <summary>
 		/// 用户ID
 		/// </summary>
+		[DisplayName("用户ID")]
 		public string USER_ID { get; set; }
 		/// <summary>
 		/// 用户名
 		/// </summary>
+		[DisplayName("用户名")]
 		public string USER_NAME { get; set; }
 		/// <summary>
 		/// 权限
 		/// </summary>
+		[DisplayName("权限")]
 		public string PERMISSION { get; set; }
 		/// <summary>
 		/// IP地址
 		/// </summary>
+		[DisplayName("IP地址")]
 		public string CLIENT_IP { get; set; }
 		/// <summary>
 		/// 账号类型
 		/// </summary>
+		[DisplayName("账号类型")]
 		public int ACCOUNT_TYPE { get; set; }
 		/// <summary>
 		/// 用户状态
 		/// </summary>
+		[DisplayName("用户状态")]
 		public string STATUS_CODE { get; set; }
 		/// <summary>
 		/// 组织编码
 		/// </summary>
+		[DisplayName("组织编码")]
 		public string ORG_CODE { get; set; }
 		/// <summary>
 		/// 生产单元编码
 		/// </summary>
+		[DisplayName("生产单元编码")]
 		public string PROD_CODE { get; set; }
 		/// <summary>
 		/// 仓库单元编码
 		/// </summary>
+		[DisplayName("仓库单元编码")]
 		public string WH_CODE { get; set; }
 		#endregion
 
diff --git a/Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs b/Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs
index 5798ff4..5400b94 100644
--- a/Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs
+++ b/Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs
@@ -10,6 +10,7 @@
 	/// 实体:PDA登录信息
 	/// </summary>
 	[Description("Primary:ID")]
+	[DisplayName("PDA登录信息")]
 	[Serializable]
 	[SugarTable("SYS_PDA_LOGIN")]
 	public class SYS_PDA_LOGIN : DbEntityWithAuth
@@ -25,46 +26,57 @@
 		/// <summary>
 		/// 登录TOKEN
 		/// </summary>
+		[DisplayName("登录TOKEN")]
 		public string TOKEN { get; set; }
 		/// <summary>
 		/// 最后登录时间
 		/// </summary>
+		[DisplayName("最后登录时间")]
 		public DateTime LAST_ACCESS { get; set; } = DateTime.MinValue;
 		/// <summary>
 		/// 用户ID
 		/// </summary>
+		[DisplayName("用户ID")]
 		public string USER_ID { get; set; }
 		/// <summary>
 		/// 用户名
 		/// </summary>
+		[DisplayName("用户名")]
 		public string USER_NAME { get; set; }
 		/// <summary>
 		/// 权限
 		/// </summary>
+		[DisplayName("权限")]
 		public string PERMISSION { get; set; }
 		/// <summary>
 		/// IP地址
 		/// </summary>
+		[DisplayName("IP地址")]
 		public string CLIENT_IP { get; set; }
 		/// <summary>
 		/// 账号类型
 		/// </summary>
+		[DisplayName("账号类型")]
 		public int ACCOUNT_TYPE { get; set; }
 		/// <summary>
 		/// 用户状态
 		/// </summary>
+		[DisplayName("用户状态")]
 		public string STATUS_CODE { get; set; }
 		/// <summary>
 		/// 组织编码
 		/// </summary>
+		[DisplayName("组织编码")]
 		public string ORG_CODE { get; set; }
 		/// <summary>
 		/// 生产单元编码
 		/// </summary>
+		[DisplayName("生产单元编码")]
 		public string PROD_CODE { get; set; }
 		/// <summary>
 		/// 仓库单元编码
 		/// </summary>
+		[DisplayName("仓库单元编码")]
 		public string WH_CODE { get; set; }
 		#endregion
 

--
Gitblit v1.9.3