From 50f54028acb8191f18552d5b54a958ff9ce9afc8 Mon Sep 17 00:00:00 2001
From: yxj <yxj@hz-kingdee.com>
Date: 星期一, 26 六月 2023 09:10:42 +0800
Subject: [PATCH] 新增销售出库二次校验功能(原单据为扫码生成,审核时对原扫描的条码进行核对)

---
 WebAPI/Controllers/WebAPIController.cs |  477 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 470 insertions(+), 7 deletions(-)

diff --git a/WebAPI/Controllers/WebAPIController.cs b/WebAPI/Controllers/WebAPIController.cs
index e7bb55d..905fee0 100644
--- a/WebAPI/Controllers/WebAPIController.cs
+++ b/WebAPI/Controllers/WebAPIController.cs
@@ -26,6 +26,7 @@
         private json objjson = new json();
         private json objJsonResult = new json();
         SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+        Pub_Class.ClsXt_SystemParameter oSystemParameter = new Pub_Class.ClsXt_SystemParameter();
         //public static string sUrl = "http://183.129.128.86:9090/WEBS-WMSTest/WebService1.asmx";
         //  private POInStockBillServices oclscg_poinstockbillmain = new POInStockBillServices();
         /// <summary>
@@ -201,7 +202,7 @@
         public object GetUser(string UserName, string PassWord, string HOrgName)
         {
             try
-            {
+            {                              
                 DataSet ds = null;
                 ClsCN oCnLoc = new ClsCN();
                 DAL.ClsUser oUser = new DAL.ClsUser();
@@ -239,6 +240,49 @@
                 objjson.code = "0";
                 objjson.count = 0;
                 objjson.Message = "鐧诲綍寮傚父锛�" + e.Message;
+                objjson.data = null;
+                return objjson; ;
+            }
+        }
+        /// <summary>
+        /// 鑿滃崟鏍�
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/MenuBar")]
+        [HttpGet]
+        public object MenuBar(string UserName)
+        {
+            try
+            {
+                //鑾峰彇绯荤粺鍙傛暟
+                string Ret = "";
+                if (oSystemParameter.ShowBill(ref Ret))
+                {
+                    //鍒ゆ柇瀹㈡埛涓洪緳灞辨苯閰�
+                    if (oSystemParameter.omodel.WMS_CampanyName == "榫欏北姹介厤")
+                    {
+                        //鍒ゆ柇鏄惁鏈夋煡璇㈡潈闄�
+                        if (!DBUtility.ClsPub.Security_Log("Xt_MenuBar_Unfold", 1, false, UserName))
+                        {
+                            objjson.code = "0";
+                            objjson.count = 0;
+                            objjson.Message = "鏃犲睍寮�鑿滃崟鏍忔潈闄�!";
+                            objjson.data = null;
+                            return objjson;
+                        }
+                    }
+                }                
+                objjson.code = "0";
+                objjson.count = 1;
+                objjson.Message = "灞曞紑鎴愬姛锛�";
+                objjson.data = 1;
+                return objjson;
+            }
+            catch (Exception e)
+            {
+                objjson.code = "0";
+                objjson.count = 0;
+                objjson.Message = "寮傚父锛�" + e.Message;
                 objjson.data = null;
                 return objjson; ;
             }
@@ -384,6 +428,16 @@
             try
             {
                 ds = webserver.GetKf_PonderationBillMain_TempList(HBillType, sWhere);
+
+                List<object> columnNameList = new List<object>();
+                //娣诲姞鍒楀悕
+                foreach (DataColumn col in ds.Tables[0].Columns)
+                {
+                    Type dataType = col.DataType;
+                    string ColmString = "{\"ColmCols\":\"" + col.ColumnName + "\",\"ColmType\":\"" + dataType.Name + "\"}";
+                    columnNameList.Add(JsonConvert.DeserializeObject(ColmString));//鑾峰彇鍒癉ataColumn鍒楀璞$殑鍒楀悕
+                }
+
                 if (ds == null || ds.Tables[0].Rows.Count <= 0)
                 {
 
@@ -400,6 +454,7 @@
                     objJsonResult.count = 1;
                     objJsonResult.Message = "鑾峰彇淇℃伅鎴愬姛锛�";
                     objJsonResult.data = ds.Tables[0];
+                    objJsonResult.list = columnNameList;
                     return objJsonResult;
                 }
             }
@@ -833,6 +888,72 @@
         }
 
 
+        ///// <summary>
+        ///// 鑾峰彇浠撲綅鍒楄〃
+        ///// </summary>
+        ///// <returns></returns>
+        //[Route("Web/GetStockPlaceList_Json_NEW")]
+        //[HttpGet]
+        //public object GetStockPlaceList_Json_NEW(string StockPlace, Int64 HWhID, Int64 HOrgID)
+        //{
+        //    WebS.WebService1 oWeb = new WebS.WebService1();
+        //    sWhere = " Where HStopFlag=0  and HEndFlag=1 and HUSEORGID = " + HOrgID + "";
+        //    //sWhere = " Where HStopFlag=0  and HEndFlag=1  and HUSEORGID = " + DBUtility.ClsPub.HORGANIZATIONSID.ToString();
+        //    if (HWhID == 0)
+        //    {
+        //        if (StockPlace != "")
+        //        {
+        //            sWhere = " Where HStopFlag=0 and HUSEORGID = " + HOrgID + "  and ( HNumber like '%" + StockPlace + "%' or HName like '%" + StockPlace + "%' ) ";
+        //        }
+        //        else
+        //        {
+        //            sWhere = " Where HStopFlag=0 ";
+        //        }
+        //    }
+        //    else
+        //    {
+        //        if (StockPlace != "")
+        //        {
+        //            sWhere = " Where HStopFlag=0 and HWHID=" + HWhID.ToString() + " and HWHID=" + HWhID.ToString() + " and ( HNumber like '%" + StockPlace + "%' or HName like '%" + StockPlace + "%' ) ";
+        //        }
+        //        else
+        //        {
+        //            sWhere = " Where HStopFlag=0 and HWHID=" + HWhID.ToString();
+        //        }
+        //    }
+        //    try
+        //    {
+        //        //ds = webserver.GetStockPlaceList(sWhere, ref DBUtility.ClsPub.sErrInfo);
+        //        ds = oWeb.GetStockPlaceList(sWhere, ref DBUtility.ClsPub.sErrInfo);
+        //        if (ds == null || ds.Tables[0].Rows.Count <= 0)
+        //        {
+        //            objjson.code = "0";
+        //            objjson.count = 0;
+        //            objjson.Message = "鑾峰彇澶辫触" + DBUtility.ClsPub.sErrInfo;
+        //            objjson.data = null;
+        //            return objjson;
+        //        }
+        //        else
+        //        {
+        //            objjson.code = "0";
+        //            objjson.count = 1;
+        //            objjson.Message = "鑾峰彇鎴愬姛!";
+        //            objjson.data = ds.Tables[0];
+        //            return objjson;
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+
+        //        objjson.code = "0";
+        //        objjson.count = 0;
+        //        objjson.Message = "鑾峰彇澶辫触" + ex.ToString();
+        //        objjson.data = null;
+        //        return objjson;
+        //    }
+        //}
+
+
         /// <summary>
         /// 鑾峰彇浠撲綅鍒楄〃
         /// </summary>
@@ -955,7 +1076,7 @@
             //sWhere = " Where HStopFlag=0  and HEndFlag=1  and HUSEORGID = " + DBUtility.ClsPub.HORGANIZATIONSID.ToString();
             if (Supplier != "")
             {
-                sWhere = sWhere + " and ( HNumber like '%" + Supplier + "%' or HName like '%" + Supplier + "%' or HUSEORGID like '%" + Supplier + "%' ) ";
+                sWhere = sWhere + " and ( HNumber like '%" + Supplier + "%' or HName like '%" + Supplier + "%' or HUSEORGID like '%" + HOrgID + "%' ) ";
             }
             try
             {
@@ -1345,6 +1466,168 @@
         }
 
         /// <summary>
+        /// 鑾峰彇閿�鍞柟寮忓垪琛�
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/GetSellStyleList_Json")]
+        [HttpGet]
+        public object GetSellStyleList_Json(string SellStyle)
+        {
+            if (SellStyle != "")
+            {
+                sWhere = sWhere + " and ( HNumber like '%" + SellStyle + "%' or HName like '%" + SellStyle + "%' ) ";
+            }
+            try
+            {
+                SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+                if (sWhere == null || sWhere.Equals(""))
+                {
+                    ds = oCN.RunProcReturn("Select HItemID,HNumber ,HName  from Gy_SellStyle where HStopflag=0 Order by HItemID ", "Gy_SellStyle");
+                }
+                else
+                {
+                    string sql1 = "Select HItemID,HNumber ,HName  from Gy_SellStyle where HStopflag=0 and HEndFlag=1 ";
+                    string sql = sql1 + sWhere;
+                    ds = oCN.RunProcReturn(sql, "Gy_SellStyle");
+                }              
+
+                if (ds == null || ds.Tables[0].Rows.Count <= 0)
+                {
+                    objjson.code = "0";
+                    objjson.count = 0;
+                    objjson.Message = "鑾峰彇澶辫触" + DBUtility.ClsPub.sErrInfo;
+                    objjson.data = null;
+                    return objjson;
+                }
+                else
+                {
+                    objjson.code = "0";
+                    objjson.count = 1;
+                    objjson.Message = "鑾峰彇鎴愬姛!";
+                    objjson.data = ds.Tables[0];
+                    return objjson;
+                }
+            }
+            catch (Exception ex)
+            {
+
+                objjson.code = "0";
+                objjson.count = 0;
+                objjson.Message = "鑾峰彇澶辫触" + ex.ToString();
+                objjson.data = null;
+                return objjson;
+            }         
+        }
+
+        /// <summary>
+        /// 鑾峰彇缁撶畻鏂瑰紡鍒楄〃
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/GetSettleStyleList_Json")]
+        [HttpGet]
+        public object GetSettleStyleList_Json(string SettleStyle)
+        {
+            if (SettleStyle != "")
+            {
+                sWhere = sWhere + " and ( HNumber like '%" + SettleStyle + "%' or HName like '%" + SettleStyle + "%' ) ";
+            }
+            try
+            {
+                SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+                if (sWhere == null || sWhere.Equals(""))
+                {
+                    ds = oCN.RunProcReturn("Select HItemID,HNumber ,HName  from Gy_SettleStyle where HStopflag=0 Order by HItemID ", "Gy_SettleStyle");
+                }
+                else
+                {
+                    string sql1 = "Select HItemID,HNumber ,HName  from Gy_SettleStyle where HStopflag=0 and HEndFlag=1 ";
+                    string sql = sql1 + sWhere;
+                    ds = oCN.RunProcReturn(sql, "Gy_SettleStyle");
+                }
+
+                if (ds == null || ds.Tables[0].Rows.Count <= 0)
+                {
+                    objjson.code = "0";
+                    objjson.count = 0;
+                    objjson.Message = "鑾峰彇澶辫触" + DBUtility.ClsPub.sErrInfo;
+                    objjson.data = null;
+                    return objjson;
+                }
+                else
+                {
+                    objjson.code = "0";
+                    objjson.count = 1;
+                    objjson.Message = "鑾峰彇鎴愬姛!";
+                    objjson.data = ds.Tables[0];
+                    return objjson;
+                }
+            }
+            catch (Exception ex)
+            {
+
+                objjson.code = "0";
+                objjson.count = 0;
+                objjson.Message = "鑾峰彇澶辫触" + ex.ToString();
+                objjson.data = null;
+                return objjson;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇閲囪喘鏂瑰紡鍒楄〃
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/GetPoStockStyleList_Json")]
+        [HttpGet]
+        public object GetPoStockStyleList_Json(string PoStockStyle)
+        {
+            if (PoStockStyle != "")
+            {
+                sWhere = sWhere + " and ( HNumber like '%" + PoStockStyle + "%' or HName like '%" + PoStockStyle + "%' ) ";
+            }
+            try
+            {
+                SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+                if (sWhere == null || sWhere.Equals(""))
+                {
+                    ds = oCN.RunProcReturn("Select HItemID,HNumber ,HName  from Gy_PoStockStyle where HStopflag=0 Order by HItemID ", "Gy_PoStockStyle");
+                }
+                else
+                {
+                    string sql1 = "Select HItemID,HNumber ,HName  from Gy_PoStockStyle where HStopflag=0 and HEndFlag=1 ";
+                    string sql = sql1 + sWhere;
+                    ds = oCN.RunProcReturn(sql, "Gy_PoStockStyle");
+                }
+
+                if (ds == null || ds.Tables[0].Rows.Count <= 0)
+                {
+                    objjson.code = "0";
+                    objjson.count = 0;
+                    objjson.Message = "鑾峰彇澶辫触" + DBUtility.ClsPub.sErrInfo;
+                    objjson.data = null;
+                    return objjson;
+                }
+                else
+                {
+                    objjson.code = "0";
+                    objjson.count = 1;
+                    objjson.Message = "鑾峰彇鎴愬姛!";
+                    objjson.data = ds.Tables[0];
+                    return objjson;
+                }
+            }
+            catch (Exception ex)
+            {
+
+                objjson.code = "0";
+                objjson.count = 0;
+                objjson.Message = "鑾峰彇澶辫触" + ex.ToString();
+                objjson.data = null;
+                return objjson;
+            }
+        }
+
+        /// <summary>
         /// 鑾峰彇瀹㈡埛鍒楄〃
         /// </summary>
         /// <returns></returns>
@@ -1404,12 +1687,12 @@
             //sWhere = " Where HStopFlag=0  and HEndFlag=1  and HUSEORGID = " + DBUtility.ClsPub.HORGANIZATIONSID.ToString();
             if (sWhere != "")
             {
-                sWhere = " and ( HNumber like '%" + sWhere + "%' or HName like '%" + sWhere + "%' ) ";
+                sWhere = " and ( p.HNumber like '%" + sWhere + "%' or p.HName like '%" + sWhere + "%' ) ";
             }
             try
             {
                 SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
-                ds = oCN.RunProcReturn("Select HItemID,HNumber 宸ュ簭浠g爜,HName 宸ュ簭 from Gy_Process where HStopflag=0 " + sWhere + " Order by HItemID ", "Gy_Process");
+                ds = oCN.RunProcReturn("Select p.HItemID,p.HNumber 宸ュ簭浠g爜,p.HName 宸ュ簭,w.HItemID 宸ヤ綔涓績ID,w.HNumber 宸ヤ綔涓績浠g爜,w.HName 宸ヤ綔涓績,d.HItemID 閮ㄩ棬ID,d.HNumber 閮ㄩ棬浠g爜,d.HName 閮ㄩ棬 from Gy_Process p left join Gy_WorkCenter w on p.HWorkCenterID = w.HItemID left join Gy_Department d on p.HDeptID = d.HItemID where p.HStopflag = 0 " + sWhere + " Order by HItemID ", "Gy_Process");
                 if (ds == null || ds.Tables[0].Rows.Count <= 0)
                 {
                     objjson.code = "0";
@@ -2626,6 +2909,124 @@
         }
 
         /// <summary>
+        /// 鑾峰彇璁惧涓绘。鍒楄〃
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/GetGy_EquipFileBillMainList_Json")]
+        [HttpGet]
+        public object GetGy_EquipFileBillMainList_Json(string EquipFileBill)
+        {
+            //sWhere = " Where HStopFlag=0  and HEndFlag=1";
+            //sWhere = " Where HStopFlag=0  and HEndFlag=1  and HUSEORGID = " + DBUtility.ClsPub.HORGANIZATIONSID.ToString();
+            if (EquipFileBill != "")
+            {
+                sWhere = sWhere + " and ( HEquipFileNumber like '%" + EquipFileBill + "%' or HName like '%" + EquipFileBill + "%' ) ";
+            }
+            try
+            {
+                SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+                if (sWhere == null || sWhere.Equals(""))
+                {
+                    ds = oCN.RunProcReturn("Select HInterID,HEquipFileNumber,HName  from Gy_EquipFileBillMain where 0=0 Order by HInterID ", "Gy_EquipFileBillMain");
+                }
+                else
+                {
+                    string sql1 = "Select HInterID,HEquipFileNumber,HName  from Gy_EquipFileBillMain where 0=0  ";
+                    string sql = sql1 + sWhere;
+                    ds = oCN.RunProcReturn(sql, "Gy_EquipFileBillMain");
+                }
+
+                //ds = webserver.GetUnitList(sWhere, ref DBUtility.ClsPub.sErrInfo);
+
+
+                if (ds == null || ds.Tables[0].Rows.Count <= 0)
+                {
+                    objjson.code = "0";
+                    objjson.count = 0;
+                    objjson.Message = "鑾峰彇澶辫触" + DBUtility.ClsPub.sErrInfo;
+                    objjson.data = null;
+                    return objjson;
+                }
+                else
+                {
+                    objjson.code = "0";
+                    objjson.count = 1;
+                    objjson.Message = "鑾峰彇鎴愬姛!";
+                    objjson.data = ds.Tables[0];
+                    return objjson;
+                }
+            }
+            catch (Exception ex)
+            {
+
+                objjson.code = "0";
+                objjson.count = 0;
+                objjson.Message = "鑾峰彇澶辫触" + ex.ToString();
+                objjson.data = null;
+                return objjson;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍣ㄥ叿鍒楄〃
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/GetGy_MouldFileMainList_Json")]
+        [HttpGet]
+        public object GetGy_MouldFileMainList_Json(string MouldFileMain)
+        {
+            //sWhere = " Where HStopFlag=0  and HEndFlag=1";
+            //sWhere = " Where HStopFlag=0  and HEndFlag=1  and HUSEORGID = " + DBUtility.ClsPub.HORGANIZATIONSID.ToString();
+            if (MouldFileMain != "")
+            {
+                sWhere = sWhere + " and ( HNumber like '%" + MouldFileMain + "%' or HName like '%" + MouldFileMain + "%' ) ";
+            }
+            try
+            {
+                SQLHelper.ClsCN oCN = new SQLHelper.ClsCN();
+                if (sWhere == null || sWhere.Equals(""))
+                {
+                    ds = oCN.RunProcReturn("Select HInterID,HNumber,HName from Gy_MouldFileMain where 0=0 Order by HInterID ", "Gy_MouldFileMain");
+                }
+                else
+                {
+                    string sql1 = "Select HInterID,HNumber,HName from Gy_MouldFileMain where 0=0  ";
+                    string sql = sql1 + sWhere;
+                    ds = oCN.RunProcReturn(sql, "Gy_MouldFileMain");
+                }
+
+                //ds = webserver.GetUnitList(sWhere, ref DBUtility.ClsPub.sErrInfo);
+
+
+                if (ds == null || ds.Tables[0].Rows.Count <= 0)
+                {
+                    objjson.code = "0";
+                    objjson.count = 0;
+                    objjson.Message = "鑾峰彇澶辫触" + DBUtility.ClsPub.sErrInfo;
+                    objjson.data = null;
+                    return objjson;
+                }
+                else
+                {
+                    objjson.code = "0";
+                    objjson.count = 1;
+                    objjson.Message = "鑾峰彇鎴愬姛!";
+                    objjson.data = ds.Tables[0];
+                    return objjson;
+                }
+            }
+            catch (Exception ex)
+            {
+
+                objjson.code = "0";
+                objjson.count = 0;
+                objjson.Message = "鑾峰彇澶辫触" + ex.ToString();
+                objjson.data = null;
+                return objjson;
+            }
+        }
+
+        /// <summary>
         /// 鑾峰彇鐐规椤圭洰鍒楄〃
         /// </summary>
         /// <returns></returns>
@@ -3518,7 +3919,7 @@
             {
                 List<Menu> mu = new List<Menu>();
                 SQLHelper.ClsCN oCn = new SQLHelper.ClsCN();
-                ds = oCn.RunProcReturn("Select * from Gy_Menu Order by HItemID ", "Gy_Menu");
+                ds = oCn.RunProcReturn("Select * from Gy_Menu_1 Order by HItemID ", "Gy_Menu");
                 //List<Menu> mu1 = ds.Tables[0].AsEnumerable().Select(t => new Menu()).ToList();
                 //List<Menu> users = ModelConvertHelper<Menu>.ConvertToModel(ds.Tables[0]);
                 //var dd = ToHierarchy.ToHierarchyList(users);
@@ -3638,6 +4039,68 @@
             }
         }
 
+        /// <summary>
+        /// 浜у搧鍏ュ簱缂撳瓨鍒楄〃鍒锋柊淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        [Route("Web/chanpinruk1")]
+        [HttpGet]
+        public object chanpinruk1(string HBillType, string sHMaker, Int64 HOrgID)
+        {
+            WebS.WebService1 oWebs = new WebS.WebService1();
+            try
+            {
+                ds = oWebs.GetKf_PonderationBillMain_TempList_New(HBillType, sHMaker, HOrgID);
+
+                if (ds == null)
+                {
+                    objJsonResult.code = "0";
+                    objJsonResult.count = 0;
+                    objJsonResult.count = 0;
+                    objJsonResult.Message = "娌℃湁杩斿洖浠讳綍璁板綍锛�";
+                    objJsonResult.data = null;
+                    return objJsonResult;
+
+                }
+
+                List<object> columnNameList = new List<object>();
+                //娣诲姞鍒楀悕
+                foreach (DataColumn col in ds.Tables[0].Columns)
+                {
+                    Type dataType = col.DataType;
+                    string ColmString = "{\"ColmCols\":\"" + col.ColumnName + "\",\"ColmType\":\"" + dataType.Name + "\"}";
+                    columnNameList.Add(JsonConvert.DeserializeObject(ColmString));//鑾峰彇鍒癉ataColumn鍒楀璞$殑鍒楀悕
+                }
+
+                if (ds == null || ds.Tables[0].Rows.Count <= 0)
+                {
+                    objJsonResult.code = "0";
+                    objJsonResult.count = 0;
+                    objJsonResult.Message = "娌℃湁杩斿洖浠讳綍璁板綍锛�";
+                    objJsonResult.data = null;
+                    return objJsonResult;
+                    //DBUtility.ClsPub.MessageBeep((int)DBUtility.ClsPub.BeepType.Warning);
+                }
+                else
+                {
+                    objJsonResult.code = "0";
+                    objJsonResult.count = 1;
+                    objJsonResult.Message = "鑾峰彇淇℃伅鎴愬姛锛�";
+                    objJsonResult.data = ds.Tables[0];
+                    objJsonResult.list = columnNameList;
+                    return objJsonResult;
+                }
+            }
+            catch (Exception e)
+            {
+                objJsonResult.code = "0";
+                objJsonResult.count = 0;
+                objJsonResult.Message = "娌℃湁杩斿洖浠讳綍璁板綍锛�" + e.ToString();
+                objJsonResult.data = null;
+                return objJsonResult;
+            }
+        }
+
 
         #region PDA鍏朵粬鍏ュ簱鍒楄〃妯″潡
         /// <summary>
@@ -3703,12 +4166,12 @@
         /// <returns></returns>
         [Route("Web/GetProcNoList")]
         [HttpGet]
-        public object GetProcNoList(int HInterID,string sWhere)
+        public object GetProcNoList(int HInterID,string sWhere,string UserID)
         {
             List<object> columnNameList = new List<object>();
             try
             {
-                ds = oCN.RunProcReturn("exec h_p_Sc_ProcNoList '" + HInterID + "','" + sWhere + "'", "h_p_Sc_ProcNoList");
+                ds = oCN.RunProcReturn("exec h_p_Sc_ProcNoList '" + HInterID + "','" + sWhere + "','" + UserID + "'" , "h_p_Sc_ProcNoList");
 
                 objJsonResult.code = "1";
                 objJsonResult.count = 1;

--
Gitblit v1.9.1