From d037f94e6047d6ed3e41e29301620e2ffabf106f Mon Sep 17 00:00:00 2001
From: yl <ykxkd@outlook.com>
Date: 星期三, 15 六月 2022 14:17:31 +0800
Subject: [PATCH] 组织架构、用户清单接口开发提交(不包含导入导出)

---
 VueWebApi/DLL/DAL/BasicSettingDAL.cs |  521 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 512 insertions(+), 9 deletions(-)

diff --git a/VueWebApi/DLL/DAL/BasicSettingDAL.cs b/VueWebApi/DLL/DAL/BasicSettingDAL.cs
index d0214c6..c9b4b59 100644
--- a/VueWebApi/DLL/DAL/BasicSettingDAL.cs
+++ b/VueWebApi/DLL/DAL/BasicSettingDAL.cs
@@ -21,7 +21,7 @@
         public static SqlParameter[] parameters; //瀹氫箟鍏ㄥ眬SqlParameter鍙傛暟鏁扮粍
 
         #region [缁勭粐鏋舵瀯鏁版嵁鏌ヨ]
-        public static ToMessage OrganizationSearch(string orgCode, string orgName, string orgType, string userName,int startNum,int endNum,string prop,string order)
+        public static ToMessage OrganizationSearch(string orgCode, string orgName, string orgType, string userName, int startNum, int endNum, string prop, string order)
         {
             var dynamicParams = new DynamicParameters();
             string search = "";
@@ -66,7 +66,7 @@
                             parent.lm_date
                             from TOrganization as parent 
                             left join TOrganization as child on parent.parent_id=child.id where parent.is_delete<>1 " + search;
-                var data = DapperHelper.GetPageList<object>(sql, dynamicParams,prop,order, startNum, endNum, out total);
+                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                 mes.code = "200";
                 mes.Message = "鏌ヨ鎴愬姛!";
                 mes.count = total;
@@ -81,8 +81,63 @@
         }
         #endregion
 
+        #region [缁勭粐鏋舵瀯鏌ユ壘涓婄骇鍗曚綅]
+        public static ToMessage PrentOrganization(string orgcode)
+        {
+            var dynamicParams = new DynamicParameters();
+            string search = "";
+            try
+            {
+                switch (orgcode)
+                {
+                    case "F":  //宸ュ巶
+                        orgcode = "";
+                        search += "and description=@orgcode ";
+                        dynamicParams.Add("@orgcode", orgcode);
+                        break;
+                    case "D":  //閮ㄩ棬
+                        orgcode = "F";
+                        search += "and description=@orgcode ";
+                        dynamicParams.Add("@orgcode", orgcode);
+                        break;
+                    case "W":  //杞﹂棿
+                        orgcode = "D";
+                        search += "and description=@orgcode ";
+                        dynamicParams.Add("@orgcode", orgcode);
+                        break;
+                    case "K":  //绉戝
+                        orgcode = "W";
+                        search += "and description=@orgcode ";
+                        dynamicParams.Add("@orgcode", orgcode);
+                        break;
+                    case "L":  //浜х嚎
+                        orgcode = "K";
+                        search += "and description=@orgcode ";
+                        dynamicParams.Add("@orgcode", orgcode);
+                        break;
+                    default:
+                        break;
+                }
+                var sql = @"select roletype_code,roletype_name 
+                            from TRoleType 
+                            where  A.is_delete<>'1' " + search;
+
+                var data = DapperHelper.selectdata(sql, dynamicParams);
+                mes.code = "200";
+                mes.Message = "鏌ヨ鎴愬姛!";
+                mes.data = data;
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
         #region[鏂板缂栬緫缁勭粐鏋舵瀯]
-        public static ToMessage AddUpdateOrganization(string organType, string organCode, string organName,string Operator, int supUnit, string operType)
+        public static ToMessage AddUpdateOrganization(string organType, string organCode, string organName, string Operator, int supUnit, string operType)
         {
             var dynamicParams = new DynamicParameters();
             try
@@ -109,7 +164,7 @@
                         mes.Message = "鏂板鎿嶄綔澶辫触!";
                     }
                 }
-                if (operType == "Update") 
+                if (operType == "Update")
                 {
                     var sql = @"update TOrganization set description=@organType,org_name=@organName,parent_id=@supUnit,lm_user=@Operator,lm_date=@CreateDate where org_code=@organCode";
                     dynamicParams.Add(@"organCode", organCode);
@@ -129,7 +184,7 @@
                         mes.code = "300";
                         mes.Message = "淇敼鎿嶄綔澶辫触!";
                     }
-                } 
+                }
             }
             catch (Exception e)
             {
@@ -236,8 +291,70 @@
         }
         #endregion
 
+        #region [鐢ㄦ埛鎵�灞炵粍缁嘳
+        public static ToMessage UserOrganization()
+        {
+            var dynamicParams = new DynamicParameters();
+            string sql = "";
+            try
+            {
+                List<TreeDG> list = new List<TreeDG>();
+                sql = @"select id,parent_id,org_code,org_name,description  
+                      FROM TOrganization ";
+                var dt = DapperHelper.selectdata(sql, dynamicParams);
+                for (int i = 0; i < dt.Rows.Count; i++)   //杩欓噷鏄惊鐜墍鏈�
+                {
+                    if (string.IsNullOrEmpty(dt.Rows[i]["PARENT_ID"].ToString()) || dt.Rows[i]["PARENT_ID"].ToString() == "0")  //鍒ゆ柇鏄惁鏈�澶栧眰鏍硅妭鐐�
+                    {
+                        TreeDG tbj = new TreeDG();
+                        tbj.id = dt.Rows[i]["ID"].ToString();
+                        tbj.code = dt.Rows[i]["ORG_CODE"].ToString();
+                        tbj.name = dt.Rows[i]["ORG_NAME"].ToString();
+                        list.Add(tbj);
+                    }
+                }
+                digui(dt, list);
+                mes.code = "200";
+                mes.Message = "鍔犺浇瀹屾垚";
+                mes.data = list;
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.data = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+        #region銆愰�掑綊鏂规硶銆�
+        public static void digui(DataTable dt, List<TreeDG> tree)
+        {
+            for (int m = 0; m < tree.Count; m++)
+            {
+                tree[m].children = new List<TreeDG>();
+                for (int i = 0; i < dt.Rows.Count; i++)//绗竴娆″惊鐜紝寰楀埌鎵�鏈夋牴鑺傜偣鐨勫瓙闆�
+                {
+                    if (tree[m].id == dt.Rows[i]["PARENT_ID"].ToString() && dt.Rows[i]["ID"].ToString() != dt.Rows[i]["PARENT_ID"].ToString())
+                    {
+                        TreeDG tbjson = new TreeDG();
+                        tbjson.id = dt.Rows[i]["ID"].ToString();
+                        tbjson.code = dt.Rows[i]["ORG_CODE"].ToString();
+                        tbjson.name = dt.Rows[i]["ORG_NAME"].ToString();
+                        tree[m].children.Add(tbjson);
+                    }
+                }
+                for (int i = 0; i < tree[m].children.Count; i++)
+                {
+                    digui(dt, tree[m].children);//鍐嶆鐢ㄥ瓙闆嗗幓寰幆锛屾嬁鍑哄瓙闆嗙殑瀛愰泦
+                }
+            }
+        }
+
+        #endregion
+
         #region[鐢ㄦ埛娓呭崟鏂板缂栬緫]
-        public static ToMessage AddUpdateUser(string UserId, string UserCode, string UserName, string Enable, string StuOrg,string Mobile,string Email, string Operator, string OperType)
+        public static ToMessage AddUpdateUser(string UserId, string UserCode, string UserName, string Enable, string StuOrg, string Mobile, string Email, string Operator, string OperType)
         {
             var dynamicParams = new DynamicParameters();
             try
@@ -313,7 +430,7 @@
                 var data = DapperHelper.selectdata(sql, dynamicParams);
 
                 sql = @"update TUserRoleRelation set is_delete='1'  where user_code=@usercode";
-                dynamicParams.Add("@usercode",data.Rows[0]["USERCODE"].ToString());
+                dynamicParams.Add("@usercode", data.Rows[0]["USERCODE"].ToString());
                 list.Add(new { str = sql, parm = dynamicParams });
 
                 sql = @"update TUser set is_delete='1'  where id=@userid";
@@ -325,7 +442,7 @@
                     mes.code = "200";
                     mes.Message = "鍒犻櫎鐢ㄦ埛鎴愬姛!";
                 }
-                else 
+                else
                 {
                     mes.code = "300";
                     mes.Message = "鍒犻櫎鐢ㄦ埛澶辫触!";
@@ -366,7 +483,7 @@
                             where B.roletype_code=@roletype_code and  C.user_code=@usercode and B.is_delete='0'";
                     dynamicParams.Add("@roletype_code", data[i].code);
                     dynamicParams.Add("@usercode", usercode);
-                    var data0 = DapperHelper.select<TreeObejctCont>(sql, dynamicParams);
+                    var data0 = DapperHelper.select<TreeObejctCn>(sql, dynamicParams);
                     data[i].children = data0;
 
                 }
@@ -383,7 +500,172 @@
         }
         #endregion
 
+        #region[鐢ㄦ埛娓呭崟鍏宠仈瑙掕壊淇濆瓨]
+        public static ToMessage SaveUserAssoctRole(string usercode, List<RoleUserSubmit> json)
+        {
+            var sql = "";
+            List<object> list = new List<object>();
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                list.Clear();
+                if (json == null || json.Count <= 0)
+                {
+                    //娓呴櫎鐢ㄦ埛鍏宠仈瑙掕壊琛ㄦ暟鎹�
+                    sql = @"delete TUserRoleRelation where user_code=@usercode";
+                    dynamicParams.Add("@usercode", usercode);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                    //娓呴櫎鐢ㄦ埛琛ㄥ叧鑱旇鑹叉爣璇�
+                    sql = @"update TUser set is_role='N' where user_code=@usercode";
+                    dynamicParams.Add("@usercode", usercode);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                }
+                else
+                {
+                    //娓呴櫎鐢ㄦ埛鍏宠仈瑙掕壊琛ㄦ暟鎹�
+                    sql = @"delete TUserRoleRelation where user_code=@usercode";
+                    dynamicParams.Add("@usercode", usercode);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                    //寰幆鍐欏叆鐢ㄦ埛鍏宠仈瑙掕壊琛�
+                    for (int i = 0; i < json.Count; i++)
+                    {
+                        for (int j = 0; j < json[i].Data.Count; j++)
+                        {
+                            sql = @"insert into TUserRoleRelation(usercode,role_code) values(@usercode,@role_code)";
+                            dynamicParams.Add("@usercode", usercode);
+                            dynamicParams.Add("@role_code", json[i].Data[j]);
+                            list.Add(new { str = sql, parm = dynamicParams });
 
+                        }
+                    }
+                    //鏍囪鐢ㄦ埛琛ㄥ叧鑱旇鑹叉爣璇�
+                    sql = @"update TUser set is_role='Y' where user_code=@usercode";
+                    dynamicParams.Add("@usercode", usercode);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                }
+                bool aa = DapperHelper.DoTransaction(list);
+                if (aa)
+                {
+                    mes.code = "200";
+                    mes.Message = "鎿嶄綔鎴愬姛!";
+                }
+                else
+                {
+                    mes.code = "300";
+                    mes.Message = "鎿嶄綔澶辫触!";
+                }
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+
+
+        #region[瑙掕壊绫诲瀷鏌ヨ]
+        public static ToMessage RoleTypeSearch(int startNum, int endNum, string prop, string order)
+        {
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                // --------------鏌ヨ鎸囧畾鏁版嵁--------------
+                var total = 0; //鎬绘潯鏁�
+                var sql = @"select roletype_code,roletype_name 
+                            from TRoleType 
+                            where  A.is_delete<>'1' ";
+                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
+                mes.code = "200";
+                mes.Message = "鏌ヨ鎴愬姛!";
+                mes.count = total;
+                mes.data = data.ToList();
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+        #region[瑙掕壊绫诲瀷鏂板]
+        public static ToMessage RoleTypeAdd(List<ObjectData> json)
+        {
+            var sql = "";
+            List<object> list = new List<object>();
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                list.Clear();
+                //寰幆鍐欏叆瑙掕壊绫诲瀷琛�
+                for (int i = 0; i < json.Count; i++)
+                {
+                    sql = @"insert into TRoleType(roletypecode,roletypename) values(@roletypecode,@roletypename)";
+                    dynamicParams.Add("@roletypecode", json[i].code);
+                    dynamicParams.Add("@roletypename", json[i].name);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                }
+                bool aa = DapperHelper.DoTransaction(list);
+                if (aa)
+                {
+                    mes.code = "200";
+                    mes.Message = "鎿嶄綔鎴愬姛!";
+                }
+                else
+                {
+                    mes.code = "300";
+                    mes.Message = "鎿嶄綔澶辫触!";
+                }
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+        #region[瑙掕壊绫诲瀷鍒犻櫎]
+        public static ToMessage RoleTypeDelete(string roleTypeCode)
+        {
+            var sql = "";
+            List<object> list = new List<object>();
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                list.Clear();
+                sql = @"delete TRoleType where roletype_code=@roletypecode";
+                dynamicParams.Add("@roletypecode", roleTypeCode);
+                list.Add(new { str = sql, parm = dynamicParams });
+                sql = @"delete TRole where roletype_code=@roletypecode";
+                dynamicParams.Add("@roletypecode", roleTypeCode);
+                list.Add(new { str = sql, parm = dynamicParams });
+
+                bool aa = DapperHelper.DoTransaction(list);
+                if (aa)
+                {
+                    mes.code = "200";
+                    mes.Message = "鎿嶄綔鎴愬姛!";
+                }
+                else
+                {
+                    mes.code = "300";
+                    mes.Message = "鎿嶄綔澶辫触!";
+                }
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
 
         #region[瑙掕壊娓呭崟鏌ヨ]
         public static ToMessage RoleSearch(string RoleCode, string RoleName, string RoleTypeCode, string CreateUser, int startNum, int endNum, string prop, string order)
@@ -437,5 +719,226 @@
             return mes;
         }
         #endregion
+
+        #region[瑙掕壊娓呭崟鏂板缂栬緫]
+        public static ToMessage AddUpdateRole(string RoleId, string RoleCode, string RoleName, string RoleTypeCode, string description, string Usercode, string OperType)
+        {
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                if (OperType == "Add")
+                {
+                    var sql = @"insert into TRole(role_code,role_name,lm_user,lm_date,roletype_code,description) 
+                            values(@RoleCode,@RoleName,@Usercode,@CreateDate,@RoleTypeCode,@description)";
+                    dynamicParams.Add("@RoleCode", RoleCode);
+                    dynamicParams.Add("@RoleName", RoleName);
+                    dynamicParams.Add("@Usercode", Usercode);
+                    dynamicParams.Add("@CreateDate", DateTime.Now.ToString());
+                    dynamicParams.Add("@RoleTypeCode", RoleTypeCode);
+                    dynamicParams.Add("@description", description);
+                    int cont = DapperHelper.SQL(sql, dynamicParams);
+                    if (cont > 0)
+                    {
+                        mes.code = "200";
+                        mes.Message = "鏂板鎿嶄綔鎴愬姛!";
+                    }
+                    else
+                    {
+                        mes.code = "300";
+                        mes.Message = "鏂板鎿嶄綔澶辫触!";
+                    }
+                }
+                if (OperType == "Update")
+                {
+                    var sql = @"update TRole set role_name=@UserName,Usercode=@Usercode,CreateDate=@CreateDate,RoleTypeCode=@RoleTypeCode,description=@description where id=@RoleId";
+                    dynamicParams.Add("@RoleId", RoleId);
+                    dynamicParams.Add("@RoleName", RoleName);
+                    dynamicParams.Add("@Usercode", Usercode);
+                    dynamicParams.Add("@CreateDate", DateTime.Now.ToString());
+                    dynamicParams.Add("@RoleTypeCode", RoleTypeCode);
+                    dynamicParams.Add("@description", description);
+                    int cont = DapperHelper.SQL(sql, dynamicParams);
+                    if (cont > 0)
+                    {
+                        mes.code = "200";
+                        mes.Message = "淇敼鎿嶄綔鎴愬姛!";
+                    }
+                    else
+                    {
+                        mes.code = "300";
+                        mes.Message = "淇敼鎿嶄綔澶辫触!";
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+        #region[瑙掕壊娓呭崟鍒犻櫎]
+        public static ToMessage DeleteRole(string RoleCode)
+        {
+            var sql = "";
+            List<object> list = new List<object>();
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                //鏇存柊瑙掕壊琛ㄣ�佽鑹插叧鑱旂敤鎴锋爣璇嗗強鍒犻櫎鐘舵��
+                sql = @"update TRole set is_user='N',is_right='N',is_delete='1'  where role_code=@RoleCode";
+                dynamicParams.Add("@RoleCode", RoleCode);
+                list.Add(new { str = sql, parm = dynamicParams });
+
+                //鏇存柊瑙掕壊鍏宠仈鐢ㄦ埛琛ㄣ�佽鑹插叧鑱旂敤鎴锋爣璇嗗強鍒犻櫎鐘舵��
+                sql = @"update TUserRoleRelation set is_delete='1'  where role_code=@RoleCode";
+                dynamicParams.Add("@RoleCode", RoleCode);
+                list.Add(new { str = sql, parm = dynamicParams });
+
+                //鍒犻櫎(鏇存柊鐘舵��)瑙掕壊鍔熻兘琛�
+                sql = @"update TRoleRightRelation set is_delete='1'  where user_code=@RoleCode";
+                dynamicParams.Add("@RoleCode", RoleCode);
+                list.Add(new { str = sql, parm = dynamicParams });
+
+                bool aa = DapperHelper.DoTransaction(list);
+                if (aa)
+                {
+                    mes.code = "200";
+                    mes.Message = "鍒犻櫎鐢ㄦ埛鎴愬姛!";
+                }
+                else
+                {
+                    mes.code = "300";
+                    mes.Message = "鍒犻櫎鐢ㄦ埛澶辫触!";
+                }
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+        #region[瑙掕壊娓呭崟鍏宠仈鐢ㄦ埛鏌ヨ]
+        public static ToMessage RoleAssociationUser(string rolecode, string usercode, string username, string orgcode, string isrole, int startNum, int endNum, string prop, string order)
+        {
+            var dynamicParams = new DynamicParameters();
+            string search = "";
+            try
+            {
+                if (usercode != "" && usercode != null)
+                {
+                    search += "and A.usercode like '%'+@RoleCode+'%' ";
+                    dynamicParams.Add("@usercode", usercode);
+                }
+                if (username != "" && username != null)
+                {
+                    search += "and A.username like '%'+@RoleName+'%' ";
+                    dynamicParams.Add("@username", username);
+                }
+                if (orgcode != "" && orgcode != null)
+                {
+                    search += "and B.org_code=@orgcode ";
+                    dynamicParams.Add("@orgcode", orgcode);
+                }
+                if (isrole != "" && isrole != null)
+                {
+                    if (isrole == "Y")
+                    {
+                        search += "and C.user_code is not null ";
+                    }
+                    else
+                    {
+                        search += "and C.user_code is null ";
+                    }
+                }
+                if (search == "")
+                {
+                    search = "and 1=1 ";
+                }
+                //search = search.Substring(3);//鎴彇绱㈠紩2鍚庨潰鐨勫瓧绗�
+                // --------------鏌ヨ鎸囧畾鏁版嵁--------------
+                var total = 0; //鎬绘潯鏁�
+                var sql = @"select A.usercode,A.username,B.org_code,B.org_name,(case when C.user_code is not null  then 'Y' else 'N' end) as flag
+                             from TUser A
+                             left join TOrganization B on A.stu_torgcode=B.org_code
+                             left join (
+                                select distinct user_code  from TUserRoleRelation where role_code=@rolecode
+                             ) C on A.usercode=C.user_code" + search;
+                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
+                mes.code = "200";
+                mes.Message = "鏌ヨ鎴愬姛!";
+                mes.count = total;
+                mes.data = data.ToList();
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+        #region[瑙掕壊娓呭崟鍏宠仈鐢ㄦ埛淇濆瓨]
+        public static ToMessage SaveRoleAssociationUser(string rolecode, List<ObjectData> json)
+        {
+            var sql = "";
+            List<object> list = new List<object>();
+            var dynamicParams = new DynamicParameters();
+            try
+            {
+                list.Clear();
+                if (json == null || json.Count <= 0)
+                {
+                    mes.code = "300";
+                    mes.Message = "璇峰厛閫夋嫨鍏宠仈瑙掕壊鐨勭敤鎴蜂俊鎭�";
+                    return mes;
+                }
+                else
+                {
+                    //娓呴櫎鐢ㄦ埛鍏宠仈瑙掕壊琛ㄦ暟鎹�
+                    sql = @"delete TUserRoleRelation where role_code=@rolecode";
+                    dynamicParams.Add("@rolecode", rolecode);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                    //寰幆鍐欏叆鐢ㄦ埛鍏宠仈瑙掕壊琛�
+                    for (int i = 0; i < json.Count; i++)
+                    {
+                        sql = @"insert into TUserRoleRelation(usercode,role_code) values(@usercode,@role_code)";
+                        dynamicParams.Add("@usercode", json[i]);
+                        dynamicParams.Add("@role_code", rolecode);
+                        list.Add(new { str = sql, parm = dynamicParams });
+                    }
+                    //鏍囪瑙掕壊琛ㄥ叧鑱旂敤鎴锋爣璇�
+                    sql = @"update TRole set is_user='Y' where role_code=@rolecode";
+                    dynamicParams.Add("@rolecode", rolecode);
+                    list.Add(new { str = sql, parm = dynamicParams });
+                }
+                bool aa = DapperHelper.DoTransaction(list);
+                if (aa)
+                {
+                    mes.code = "200";
+                    mes.Message = "鎿嶄綔鎴愬姛!";
+                }
+                else
+                {
+                    mes.code = "300";
+                    mes.Message = "鎿嶄綔澶辫触!";
+                }
+            }
+            catch (Exception e)
+            {
+                mes.code = "300";
+                mes.Message = e.Message;
+            }
+            return mes;
+        }
+        #endregion
+
+
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3