From f4fa0cd3ae3b6f4e67671cdb1fe8ed52259341fb Mon Sep 17 00:00:00 2001 From: yangle <admin@YINMOU> Date: 星期五, 19 八月 2022 14:48:05 +0800 Subject: [PATCH] 用户关联 --- WebAPI/ListModels.cs | 48 +++++ WebAPI/Controllers/BLL/Xt_UserController.cs | 410 +++++++++++++++++++++++++++++++++++++++++++++ WebAPI/WebAPI.csproj | 2 WebAPI/Controllers/BaseSet/Gy_WarehouseController.cs | 22 - WebAPI/Controllers/基础资料/基础资料/Gy_WorkStationBillController.cs | 58 ++++++ 5 files changed, 524 insertions(+), 16 deletions(-) diff --git a/WebAPI/Controllers/BLL/Xt_UserController.cs b/WebAPI/Controllers/BLL/Xt_UserController.cs index e3701a6..e7bf010 100644 --- a/WebAPI/Controllers/BLL/Xt_UserController.cs +++ b/WebAPI/Controllers/BLL/Xt_UserController.cs @@ -360,5 +360,415 @@ } } #endregion + + #region 鏍规嵁鐢ㄦ埛缂栫爜鏌ユ壘宸插垎閰嶇粍缁囧垪琛� + [Route("Xt_User/UserByOrgPlaylist")] + [HttpGet] + public object UserByOrgPlaylist(string HUserID) + { + try + { + + ds = oCN.RunProcReturn("select HOrgID HItemID,瀵瑰簲缁勭粐浠g爜 HNumber,瀵瑰簲缁勭粐鍚嶇О HName from h_v_Gy_UserByOrgRelationList where 鐢ㄦ埛缂栫爜='" + HUserID + "' ", "h_v_Gy_UserByOrgRelationList"); + if (ds == null || ds.Tables[0].Rows.Count == 0) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "鏃犵粍缁囦俊鎭紒"; + objJsonResult.data = null; + return objJsonResult; + } + else + { + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; + } + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "Exception锛�" + e.ToString(); + objJsonResult.data = null; + return objJsonResult; + } + } + #endregion + + #region 鐢ㄦ埛鍏宠仈缁勭粐淇濆瓨 + [Route("Xt_User/SaveUserByOrg")] + [HttpPost] + public object SaveUserByOrg([FromBody] JObject msg) + { + var _value = msg["msg"].ToString(); + string msg1 = _value.ToString(); + string[] sArray = msg1.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + string msg2 = sArray[0].ToString(); + string msg3 = sArray[1].ToString(); + + ListModels oListModels = new ListModels(); + try + { + List<Models.Xt_ORGANIZATIONS> lsmain = new List<Models.Xt_ORGANIZATIONS>(); + msg2 = msg2.Substring(1, msg2.Length - 2); + msg2 = msg2.Replace("\\", ""); + msg2 = msg2.Replace("\n", ""); //\n + lsmain = oListModels.getObjectByJson_Xt_ORGANIZATIONS(msg2); + oCN.BeginTran(); + //鍒犻櫎宸茬粡鍏宠仈鐨勬暟鎹� + oCN.RunProc("Delete From Gy_UserByOrgRelation where HUserID='" + msg3.ToString() + "'"); + foreach (Models.Xt_ORGANIZATIONS oItem in lsmain) + { + //閲嶆柊鍐欏叆鍏宠仈鏁版嵁 + oCN.RunProc("insert into Gy_UserByOrgRelation (HOrgID,HBillType,HUserID) values ('" + oItem.HItemID + "','','" + msg3.ToString() + "')"); + } + oCN.Commit(); + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "淇濆瓨鎴愬姛锛�"; + objJsonResult.data = 1; + return objJsonResult; + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "淇濆瓨澶辫触锛�" + e.ToString(); + objJsonResult.data = 1; + return objJsonResult; + } + } + #endregion + + #region 鏍规嵁鐢ㄦ埛缂栫爜鏌ユ壘宸插垎閰嶄粨搴撳垪琛� + [Route("Xt_User/UserStocklistPlaylist")] + [HttpGet] + public object UserStocklistPlaylist(string HUserID) + { + try + { + + ds = oCN.RunProcReturn("select HWHID HItemID,浠撳簱浠g爜 HNumber,浠撳簱鍚嶇О HName from h_v_Gy_UserStockRelationList where HUserID='" + HUserID + "' ", "h_v_Gy_UserStockRelationList"); + if (ds == null || ds.Tables[0].Rows.Count == 0) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "鏃犱粨搴撲俊鎭紒"; + objJsonResult.data = null; + return objJsonResult; + } + else + { + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; + } + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "Exception锛�" + e.ToString(); + objJsonResult.data = null; + return objJsonResult; + } + } + #endregion + + #region 鐢ㄦ埛鍏宠仈浠撳簱淇濆瓨 + [Route("Xt_User/SaveUserStock")] + [HttpPost] + public object SaveUserStock([FromBody] JObject msg) + { + var _value = msg["msg"].ToString(); + string msg1 = _value.ToString(); + string[] sArray = msg1.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + string msg2 = sArray[0].ToString(); + string msg3 = sArray[1].ToString(); + + ListModels oListModels = new ListModels(); + try + { + List<Models.Warehouse> lsmain = new List<Models.Warehouse>(); + msg2 = msg2.Substring(1, msg2.Length - 2); + msg2 = msg2.Replace("\\", ""); + msg2 = msg2.Replace("\n", ""); //\n + lsmain = oListModels.getObjectByJson_Warehouse(msg2); + oCN.BeginTran(); + //鍒犻櫎宸茬粡鍏宠仈鐨勬暟鎹� + oCN.RunProc("Delete From Gy_UserStockRelation where HUserID='" + msg3.ToString() + "'"); + foreach (Models.Warehouse oItem in lsmain) + { + //閲嶆柊鍐欏叆鍏宠仈鏁版嵁 + oCN.RunProc("insert into Gy_UserStockRelation (HWHID,HUserID) values ('" + oItem.HItemID + "','" + msg3.ToString() + "')"); + } + oCN.Commit(); + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "淇濆瓨鎴愬姛锛�"; + objJsonResult.data = 1; + return objJsonResult; + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "淇濆瓨澶辫触锛�" + e.ToString(); + objJsonResult.data = 1; + return objJsonResult; + } + } + #endregion + + #region 鏍规嵁鐢ㄦ埛缂栫爜鏌ユ壘宸插垎閰嶇彮缁勫垪琛� + [Route("Xt_User/UserGrouplistPlaylist")] + [HttpGet] + public object UserGrouplistPlaylist(string HUserID) + { + try + { + + ds = oCN.RunProcReturn("select HGroupID HItemID,鐝粍浠g爜 HNumber,鐝粍鍚嶇О HName from h_v_Gy_UserGroupRelationList where HUserID='" + HUserID + "' ", "h_v_Gy_UserGroupRelationList"); + if (ds == null || ds.Tables[0].Rows.Count == 0) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "鏃犵彮缁勪俊鎭紒"; + objJsonResult.data = null; + return objJsonResult; + } + else + { + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; + } + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "Exception锛�" + e.ToString(); + objJsonResult.data = null; + return objJsonResult; + } + } + #endregion + + #region 鐢ㄦ埛鍏宠仈鐝粍淇濆瓨 + [Route("Xt_User/SaveUserGroup")] + [HttpPost] + public object SaveUserGroup([FromBody] JObject msg) + { + var _value = msg["msg"].ToString(); + string msg1 = _value.ToString(); + string[] sArray = msg1.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + string msg2 = sArray[0].ToString(); + string msg3 = sArray[1].ToString(); + + ListModels oListModels = new ListModels(); + try + { + List<Models.Gy_Group> lsmain = new List<Models.Gy_Group>(); + msg2 = msg2.Substring(1, msg2.Length - 2); + msg2 = msg2.Replace("\\", ""); + msg2 = msg2.Replace("\n", ""); //\n + lsmain = oListModels.getObjectByJson_Gy_Group(msg2); + oCN.BeginTran(); + //鍒犻櫎宸茬粡鍏宠仈鐨勬暟鎹� + oCN.RunProc("Delete From Gy_UserGroupRelation where HUserID='" + msg3.ToString() + "'"); + foreach (Models.Gy_Group oItem in lsmain) + { + //閲嶆柊鍐欏叆鍏宠仈鏁版嵁 + oCN.RunProc("insert into Gy_UserGroupRelation (HGroupID,HUserID) values ('" + oItem.HItemID + "','" + msg3.ToString() + "')"); + } + oCN.Commit(); + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "淇濆瓨鎴愬姛锛�"; + objJsonResult.data = 1; + return objJsonResult; + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "淇濆瓨澶辫触锛�" + e.ToString(); + objJsonResult.data = 1; + return objJsonResult; + } + } + #endregion + + #region 鏍规嵁鐢ㄦ埛缂栫爜鏌ユ壘宸插垎閰嶉儴闂ㄥ垪琛� + [Route("Xt_User/UserDeptlistPlaylist")] + [HttpGet] + public object UserDeptlistPlaylist(string HUserID) + { + try + { + + ds = oCN.RunProcReturn("select HDeptID HItemID,閮ㄩ棬浠g爜 HNumber,閮ㄩ棬鍚嶇О HName from h_v_Gy_UserDeptRelationList where HUserID='" + HUserID + "' ", "h_v_Gy_UserDeptRelationList"); + if (ds == null || ds.Tables[0].Rows.Count == 0) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "鏃犻儴闂ㄤ俊鎭紒"; + objJsonResult.data = null; + return objJsonResult; + } + else + { + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; + } + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "Exception锛�" + e.ToString(); + objJsonResult.data = null; + return objJsonResult; + } + } + #endregion + + #region 鐢ㄦ埛鍏宠仈閮ㄩ棬淇濆瓨 + [Route("Xt_User/SaveUserDept")] + [HttpPost] + public object SaveUserDept([FromBody] JObject msg) + { + var _value = msg["msg"].ToString(); + string msg1 = _value.ToString(); + string[] sArray = msg1.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + string msg2 = sArray[0].ToString(); + string msg3 = sArray[1].ToString(); + + ListModels oListModels = new ListModels(); + try + { + List<Models.Department> lsmain = new List<Models.Department>(); + msg2 = msg2.Substring(1, msg2.Length - 2); + msg2 = msg2.Replace("\\", ""); + msg2 = msg2.Replace("\n", ""); //\n + lsmain = oListModels.getObjectByJson_Department(msg2); + oCN.BeginTran(); + //鍒犻櫎宸茬粡鍏宠仈鐨勬暟鎹� + oCN.RunProc("Delete From Gy_UserDeptRelation where HUserID='" + msg3.ToString() + "'"); + foreach (Models.Department oItem in lsmain) + { + //閲嶆柊鍐欏叆鍏宠仈鏁版嵁 + oCN.RunProc("insert into Gy_UserDeptRelation (HDeptID,HUserID) values ('" + oItem.HItemID + "','" + msg3.ToString() + "')"); + } + oCN.Commit(); + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "淇濆瓨鎴愬姛锛�"; + objJsonResult.data = 1; + return objJsonResult; + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "淇濆瓨澶辫触锛�" + e.ToString(); + objJsonResult.data = 1; + return objJsonResult; + } + } + #endregion + + #region 鏍规嵁鐢ㄦ埛缂栫爜鏌ユ壘宸插垎閰嶅伐浣嶅垪琛� + [Route("Xt_User/UserByWorkStationlistPlaylist")] + [HttpGet] + public object UserByWorkStationlistPlaylist(string HUserID) + { + try + { + + ds = oCN.RunProcReturn("select HWorkStationID HItemID,宸ヤ綅浠g爜 HNumber,宸ヤ綅鍚嶇О HName from h_v_Gy_UserByWorkStationList where HUserID='" + HUserID + "' ", "h_v_Gy_UserByWorkStationList"); + if (ds == null || ds.Tables[0].Rows.Count == 0) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "鏃犲伐浣嶄俊鎭紒"; + objJsonResult.data = null; + return objJsonResult; + } + else + { + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; + } + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "Exception锛�" + e.ToString(); + objJsonResult.data = null; + return objJsonResult; + } + } + #endregion + + #region 鐢ㄦ埛鍏宠仈宸ヤ綅淇濆瓨 + [Route("Xt_User/SaveUserByWorkStation")] + [HttpPost] + public object SaveUserByWorkStation([FromBody] JObject msg) + { + var _value = msg["msg"].ToString(); + string msg1 = _value.ToString(); + string[] sArray = msg1.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + string msg2 = sArray[0].ToString(); + string msg3 = sArray[1].ToString(); + + ListModels oListModels = new ListModels(); + try + { + List<Models.Department> lsmain = new List<Models.Department>(); + msg2 = msg2.Substring(1, msg2.Length - 2); + msg2 = msg2.Replace("\\", ""); + msg2 = msg2.Replace("\n", ""); //\n + lsmain = oListModels.getObjectByJson_Department(msg2); + oCN.BeginTran(); + //鍒犻櫎宸茬粡鍏宠仈鐨勬暟鎹� + oCN.RunProc("Delete From Gy_UserByWorkStationRelation where HUserID='" + msg3.ToString() + "'"); + foreach (Models.Department oItem in lsmain) + { + //閲嶆柊鍐欏叆鍏宠仈鏁版嵁 + oCN.RunProc("insert into Gy_UserByWorkStationRelation (HWorkStationID,HUserID) values ('" + oItem.HItemID + "','" + msg3.ToString() + "')"); + } + oCN.Commit(); + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "淇濆瓨鎴愬姛锛�"; + objJsonResult.data = 1; + return objJsonResult; + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "淇濆瓨澶辫触锛�" + e.ToString(); + objJsonResult.data = 1; + return objJsonResult; + } + } + #endregion } } \ No newline at end of file diff --git a/WebAPI/Controllers/BaseSet/Gy_WarehouseController.cs b/WebAPI/Controllers/BaseSet/Gy_WarehouseController.cs index 1ebe765..20e354a 100644 --- a/WebAPI/Controllers/BaseSet/Gy_WarehouseController.cs +++ b/WebAPI/Controllers/BaseSet/Gy_WarehouseController.cs @@ -49,22 +49,12 @@ ds = oCN.RunProcReturn(sql, "h_v_IF_WareHouseList"); } - //if (ds == null || ds.Tables[0].Rows.Count == 0) - //{ - // objJsonResult.code = "0"; - // objJsonResult.count = 0; - // objJsonResult.Message = "false锛�"; - // objJsonResult.data = null; - // return objJsonResult; - //} - //else - //{ - objJsonResult.code = "1"; - objJsonResult.count = 1; - objJsonResult.Message = "Sucess锛�"; - objJsonResult.data = ds.Tables[0]; - return objJsonResult; - //} + + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; } catch (Exception e) { diff --git "a/WebAPI/Controllers/\345\237\272\347\241\200\350\265\204\346\226\231/\345\237\272\347\241\200\350\265\204\346\226\231/Gy_WorkStationBillController.cs" "b/WebAPI/Controllers/\345\237\272\347\241\200\350\265\204\346\226\231/\345\237\272\347\241\200\350\265\204\346\226\231/Gy_WorkStationBillController.cs" new file mode 100644 index 0000000..9d3cc2e --- /dev/null +++ "b/WebAPI/Controllers/\345\237\272\347\241\200\350\265\204\346\226\231/\345\237\272\347\241\200\350\265\204\346\226\231/Gy_WorkStationBillController.cs" @@ -0,0 +1,58 @@ +锘縰sing Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; +using WebAPI.Models; + +namespace WebAPI.Controllers.鍩虹璧勬枡.鍩虹璧勬枡 +{ + public class Gy_WorkStationBillController : ApiController + { + private json objJsonResult = new json(); + public DataSet ds = new DataSet(); + public SQLHelper.ClsCN oCN = new SQLHelper.ClsCN(); + + #region 宸ヤ綅鍒楄〃 + [Route("Gy_WorkStationBill/Gy_WorkStationList")] + [HttpGet] + public object Gy_WorkStationList(string sWhere, string user) + { + try + { + //缂栬緫鏉冮檺 + if (!DBUtility.ClsPub.Security_Log_second("Gy_WorkStation_Query", 1, false, user)) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "鏃犳煡鐪嬫潈闄愶紒"; + objJsonResult.data = null; + return objJsonResult; + } + + string sql1 = string.Format(@"select * from h_v_Gy_WorkStationList where 1=1 "); + + ds = oCN.RunProcReturn(sql1 + sWhere + " order by 宸ヤ綅浠g爜 ", "h_v_Gy_WorkStationList"); + + + objJsonResult.code = "1"; + objJsonResult.count = 1; + objJsonResult.Message = "Sucess锛�"; + objJsonResult.data = ds.Tables[0]; + return objJsonResult; + } + catch (Exception e) + { + objJsonResult.code = "0"; + objJsonResult.count = 0; + objJsonResult.Message = "Exception锛�" + e.ToString(); + objJsonResult.data = null; + return objJsonResult; + } + } + #endregion + } +} \ No newline at end of file diff --git a/WebAPI/ListModels.cs b/WebAPI/ListModels.cs index cbb9302..fee1e90 100644 --- a/WebAPI/ListModels.cs +++ b/WebAPI/ListModels.cs @@ -1782,6 +1782,54 @@ } /// <summary> + /// 鐢ㄦ埛缁勭粐鍏崇郴淇℃伅琛ㄧ殑json + /// </summary> + /// <param name="jsonString"></param> + /// <returns></returns> + public List<Models.Xt_ORGANIZATIONS> getObjectByJson_Xt_ORGANIZATIONS(string jsonString) + { + jsonString = "[" + jsonString.ToString() + "]"; + List<Models.Xt_ORGANIZATIONS> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Models.Xt_ORGANIZATIONS>>(jsonString); + return list; + } + + /// <summary> + /// 鐢ㄦ埛浠撳簱鍏崇郴淇℃伅琛ㄧ殑json + /// </summary> + /// <param name="jsonString"></param> + /// <returns></returns> + public List<Models.Warehouse> getObjectByJson_Warehouse(string jsonString) + { + jsonString = "[" + jsonString.ToString() + "]"; + List<Models.Warehouse> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Models.Warehouse>>(jsonString); + return list; + } + + /// <summary> + /// 鐢ㄦ埛鐝粍鍏崇郴淇℃伅琛ㄧ殑json + /// </summary> + /// <param name="jsonString"></param> + /// <returns></returns> + public List<Models.Gy_Group> getObjectByJson_Gy_Group(string jsonString) + { + jsonString = "[" + jsonString.ToString() + "]"; + List<Models.Gy_Group> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Models.Gy_Group>>(jsonString); + return list; + } + + /// <summary> + /// 鐢ㄦ埛閮ㄩ棬鍏崇郴淇℃伅琛ㄧ殑json + /// </summary> + /// <param name="jsonString"></param> + /// <returns></returns> + public List<Models.Department> getObjectByJson_Department(string jsonString) + { + jsonString = "[" + jsonString.ToString() + "]"; + List<Models.Department> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Models.Department>>(jsonString); + return list; + } + + /// <summary> /// 鍏憡鍒楄〃涓昏〃鐨刯son /// </summary> /// <param name="jsonString"></param> diff --git a/WebAPI/WebAPI.csproj b/WebAPI/WebAPI.csproj index 49aabbb..7fb7eee 100644 --- a/WebAPI/WebAPI.csproj +++ b/WebAPI/WebAPI.csproj @@ -429,6 +429,7 @@ <Compile Include="Controllers\浠撳瓨绠$悊\楠屾敹鍏ュ簱\Kf_StepFoldinBillController.cs" /> <Compile Include="Controllers\鍗氭棩鑷姩鎵爜绾縗ScanlineAPIController.cs" /> <Compile Include="Controllers\鍩虹璧勬枡\鍩虹璧勬枡\Gy_StockCheckItemBillController.cs" /> + <Compile Include="Controllers\鍩虹璧勬枡\鍩虹璧勬枡\Gy_WorkStationBillController.cs" /> <Compile Include="Controllers\宸ヨ祫绠$悊\Pay_MonthlySalaryReportController.cs" /> <Compile Include="Controllers\宸ヨ祫绠$悊\Pay_PieceRateWageReportController.cs" /> <Compile Include="Controllers\宸ヨ祫绠$悊\Gy_ClassTimePrjBillController.cs" /> @@ -835,6 +836,7 @@ <Folder Include="Views\Gy_EquipType\" /> <Folder Include="Views\Gy_ICBomBill\" /> <Folder Include="Views\Gy_RoutingGroup\" /> + <Folder Include="Views\Gy_WorkStation\" /> <Folder Include="Views\JIT_DayPlanPlatFormBill\" /> <Folder Include="Views\JIT_DayPlanPlatFormImport\" /> <Folder Include="Views\JIT_ICMOSortBillList\" /> -- Gitblit v1.9.1