From 23c28e3c0437081a78a48e54dc066c87500fa8bc Mon Sep 17 00:00:00 2001
From: lss <2538410689@qq.com>
Date: 星期三, 30 七月 2025 17:30:05 +0800
Subject: [PATCH] 111

---
 HH.WCS.Mobox3 - 大车间/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs |  399 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 214 insertions(+), 185 deletions(-)

diff --git "a/HH.WCS.Mobox3 - \345\244\247\350\275\246\351\227\264/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs" "b/HH.WCS.Mobox3 - \345\244\247\350\275\246\351\227\264/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs"
index 63b788d..0a3fcad 100644
--- "a/HH.WCS.Mobox3 - \345\244\247\350\275\246\351\227\264/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs"
+++ "b/HH.WCS.Mobox3 - \345\244\247\350\275\246\351\227\264/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs"
@@ -1,11 +1,11 @@
-锘縰sing HH.WCS.JiaTong.api;
-using HH.WCS.JiaTong.core;
-using HH.WCS.JiaTong.device;
-using HH.WCS.JiaTong.dispatch;
-using HH.WCS.JiaTong.LISTA.models;
-using HH.WCS.JiaTong.LISTA.process;
-using HH.WCS.JiaTong.util;
-using HH.WCS.JiaTong.wms;
+锘縰sing HH.WCS.JiaTong_DCJ.api;
+using HH.WCS.JiaTong_DCJ.core;
+using HH.WCS.JiaTong_DCJ.device;
+using HH.WCS.JiaTong_DCJ.dispatch;
+using HH.WCS.JiaTong_DCJ.LISTA.models;
+using HH.WCS.JiaTong_DCJ.LISTA.process;
+using HH.WCS.JiaTong_DCJ.util;
+using HH.WCS.JiaTong_DCJ.wms;
 using Microsoft.Owin.BuilderProperties;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
@@ -19,10 +19,11 @@
 using System.Security.Cryptography;
 using System.Threading;
 using System.Threading.Tasks;
-using static HH.WCS.JiaTong.api.ApiModel;
-using static HH.WCS.JiaTong.LISTA.process.HttpModel;
+using static HH.WCS.JiaTong_DCJ.api.ApiModel;
+using static HH.WCS.JiaTong_DCJ.LISTA.process.HttpModel;
+using static System.Collections.Specialized.BitVector32;
 
-namespace HH.WCS.JiaTong.process
+namespace HH.WCS.JiaTong_DCJ.process
 {
     internal class TaskProcess
     {
@@ -116,52 +117,89 @@
 
                 if (TN_Task != null)
                 {
-                    int type = 0;
+                    //璇锋眰鍙栬揣锛�              
+
+                    int type = 1;
                     string loc = "";
                     if (model.state == 1101)
                     {
-
-                        //璇锋眰鍙栬揣锛�              
+                        type = 1;
                         loc = TN_Task.S_START_LOC;
+                        if (name == "Mes")
+                        {
+                            if (OperateReqByPostMes(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
 
-                        if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
-                        {
-                            NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                         }
-                    }
-                    if (model.state == 1102)
-                    {
-                        type = 3;
-                        if (TN_Task.Z_TYPE == 4)//鍘熸潗鏂欏簱鍥借嚜瀹夊叏浜や簰
+                        else
                         {
-                            loc = TN_Task.S_START_LOC;
                             if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
                             {
-                               // NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                             }
                         }
 
                     }
+                    if (model.state == 1102)
+                    {
+                        type = 1;
+                        loc = TN_Task.S_START_LOC;
+                        if (name == "Mes")
+                        {
+                            if (OperateReqByPostMes(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                // NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
+                        }
+                        else
+                        {
+                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                // NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
+                        }
+                    }
                     if (model.state == 1103)
                     {
                         //璇锋眰鍗歌揣
-
+                        type = 2;
                         loc = TN_Task.S_END_LOC;
-
-                        if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                        if (name == "Mes")
                         {
-                            NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            if (OperateReqByPostMes(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
                         }
-
+                        else
+                        {
+                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
+                        }
                     }
                     if (model.state == 1104)
                     {
-
+                        type = 2;
                         loc = TN_Task.S_END_LOC;
-                        if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                        if (name == "Mes")
                         {
-                            //NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            if (OperateReqByPostMes(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                //NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
                         }
+                        else
+                        {
+                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
+                            {
+                                //NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
+                            }
+                        }
+
                     }
                 }
 
@@ -189,9 +227,12 @@
             bool permit = false;
             try
             {
-                //RequestList<TaskAccess> requestList = new RequestList<TaskAccess>();
+                LogHelper.Info($"寮�绔嬪簱瀹夊叏璇锋眰");
+                Request<TaskAccess> request = new Request<TaskAccess>();
+                var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
                 TaskAccess taskAccess = new TaskAccess() { taskNum = tasknum, orderNum = ordernum, station = station, type = type, taskStatus = taskStatus };
-                // requestList.data.Add(taskAccess);
+                request.data = taskAccess;
                 HttpHelper httpHelper = new HttpHelper();
                 Result result = new Result();
                 string date = JsonConvert.SerializeObject(taskAccess);
@@ -220,7 +261,63 @@
 
 
         }
-  
+        /// <summary>
+        /// MES瀹夊叏浜や簰
+        /// </summary>
+        /// <param name="url"></param>
+        /// <param name="tasknum"></param>
+        /// <param name="ordernum"></param>
+        /// <param name="station"></param>
+        /// <param name="type"></param>
+        /// <param name="taskStatus"></param>
+        public static bool OperateReqByPostMes(string url, string tasknum, string ordernum, string station, int type, int taskStatus, string name)
+        {
+            bool permit = false;
+            try
+            {
+                LogHelper.Info($"寮�mes瀹夊叏璇锋眰");
+                Request<MesTaskAccess> request = new Request<MesTaskAccess>();
+                var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                request.RequestId = "鏉弶AGV" + time;
+
+                StatusArrive statusArrive = new StatusArrive();
+                request.UseToken = "iFQ5fExGrLYLXliHYWzs";
+                MesTaskAccess taskAccess = new MesTaskAccess() { taskNumber = tasknum, status = station };
+                request.data = taskAccess;
+                HttpHelper httpHelper = new HttpHelper();
+                MesResult<MesStatus> result = new MesResult<MesStatus>();
+                string date = JsonConvert.SerializeObject(request);
+                // string url = Settings.tableUrls.Find(a => a.id == 2).url;
+                LogHelper.Info($"瀹夊叏璇锋眰锛氬湴鍧�{url}锛屽唴瀹癸細{date}");
+                var r = httpHelper.MesWebPost(url, date);
+                result = JsonConvert.DeserializeObject<MesResult<MesStatus>>(r);
+                if (result.icode == "200")
+                {
+                    LogHelper.Info($"鎺ュ彛璇锋眰鎴愬姛");
+                    if (result.idata.status == "0")
+                    {
+                        LogHelper.Info($"瀹夊叏浜や簰鎴愬姛");
+                        permit = true;
+                    }
+
+                }
+                else
+                {
+                    LogHelper.Info($"瀹夊叏璇锋眰澶辫触=>msg:{result.imsg}");
+                    ApiHelper.AddErrorInfo("瀹夊叏浜や簰澶辫触", result.imsg, "", tasknum);
+                }
+                ApiHelper.AddInfo(name, "瀹夊叏璇锋眰", date, JsonConvert.SerializeObject(result), "Post", url);
+                return permit;
+            }
+            catch (Exception)
+            {
+
+                return permit;
+            }
+
+
+        }
+
         /// <summary>
         /// 浠诲姟鎷︽埅
         /// </summary>
@@ -229,17 +326,17 @@
         internal static bool Intercept(WCSTask mst)
         {
             var result = true;
-            var db = new SqlHelper<object>().GetInstance();
-            //鏍规嵁璧风偣浠撳簱缂栫爜鍒ゆ柇鏄惁鍙互鎺ㄩ�
-            var taskLimit = db.Queryable<TASK_LIMIT>().Where(a => a.S_WH_CODE == mst.S_START_WH && a.OPEN == "1").First();
-            if (taskLimit != null)
-            {
-                Console.WriteLine($"浠诲姟锛歿mst.S_CODE},璧风偣浠撳簱锛歿mst.S_START_WH}宸茬粡绂佺敤鎺ㄩ�");
-                return false;
-            }
+            //var db = new SqlHelper<object>().GetInstance();
+            ////鏍规嵁璧风偣浠撳簱缂栫爜鍒ゆ柇鏄惁鍙互鎺ㄩ�
+            //var taskLimit = db.Queryable<TASK_LIMIT>().Where(a => a.S_WH_CODE == mst.S_START_WH && a.OPEN == "1").First();
+            //if (taskLimit != null)
+            //{
+            //    Console.WriteLine($"浠诲姟锛歿mst.S_CODE},璧风偣浠撳簱锛歿mst.S_START_WH}宸茬粡绂佺敤鎺ㄩ�");
+            //    return false;
+            //}
 
-           
-          
+
+
             return result;
         }
 
@@ -304,110 +401,61 @@
             var list = db.Queryable<Location>().ToList().Count;
 
             // if (mst.N_B_STATE == 0) {
-            if (mst.N_SCHEDULE_TYPE == 1)
+
+            LogHelper.Info($"浠诲姟鎺ㄩ�鏁版嵁锛歿JsonConvert.SerializeObject(mst)}");
+            if (string.IsNullOrEmpty(mst.S_START_LOC) || string.IsNullOrEmpty(mst.S_END_LOC))
             {
-                LogHelper.Info($"浠诲姟鎺ㄩ�鏁版嵁锛歿JsonConvert.SerializeObject(mst)}");
-                if (string.IsNullOrEmpty(mst.S_START_LOC) || string.IsNullOrEmpty(mst.S_END_LOC))
-                {
-                    LogHelper.Info($"浠诲姟{mst.S_CODE},璧风偣缁堢偣鏈夌┖鍙傛暟锛屼笉鎺ㄩ�浠诲姟");
-                }
-
-
-                start = LocationHelper.GetAgvSite(mst.S_START_LOC);
-                end = LocationHelper.GetAgvSite(mst.S_END_LOC);
-                //if (mst.N_START_LAYER > 1)
-                //{
-                //    start = LocationHelper.GetAgvSite(mst.S_START_LOC, mst.N_START_LAYER.ToString()).ToString();
-                //}
-                if (mst.N_END_LAYER > 1)
-                {
-                    end = LocationHelper.GetAgvSite(mst.S_END_LOC, mst.N_END_LAYER.ToString()).ToString();
-                    LogHelper.Info($"浠诲姟鎺ㄩ�锛氱粓鐐瑰眰鏁颁负{mst.N_END_LAYER}锛屾帹閫佺珯鐐逛负:{end}");
-                }
-                Console.WriteLine($"SendTask {mst.S_CODE}");
-                Console.WriteLine("start=" + start);
-                Console.WriteLine("end= " + end);
-                var dic = new List<param>();
-                dic.Add(new param() { name = "From", value = start.ToString() });
-                dic.Add(new param() { name = "To", value = end.ToString() });
-                dic.Add(new param() { name = "FUNC", value = "0" });
-                dic.Add(new param() { name = "DATA", value = "0" });
-                dic.Add(new param() { name = "Ctype", value = "0" });
-
-
-                var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�-                                                                    //dic.Add("Pri", mst.N_PRIORITY.ToString());
-                                                                    //dic.Add("From", start.ToString());
-                                                                    //dic.Add("To", end.ToString());
-                                                                    //dic.Add("task_no", mst.S_CODE.Trim());// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
-                                                                    //var res = NDC.AddNewOrder(1, dic);
-
-
-
-                if (res != null && (res.err_code == 0 || res.err_code == 50009))
-                {
-                    //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
-                    mst.N_B_STATE = 1;
-                    mst.S_B_STATE = WCSTask.GetStateStr(1);
-                    WCSHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
-                    result = true;
-                    LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
-                    if (mst.S_TYPE.Contains("鐢垫1"))
-                    {
-                        var device = Settings.deviceInfos.Where(a => a.TN_Location == mst.S_END_LOC).FirstOrDefault();
-                        var loc = LocationHelper.GetLocByLoc(mst.S_START_LOC);
-                        if (device == null)
-                        {
-                            LogHelper.Info($"鏍规嵁浠诲姟缁堢偣:{mst.S_END_LOC},鏈壘鍒板搴旂數姊厤缃枃浠�);
-                        }
-                        if (loc == null)
-                        {
-                            LogHelper.Info($"鏍规嵁浠诲姟璧风偣:{mst.S_START_LOC},鏈壘鍒板搴旇揣浣�);
-                        }
-                        int value = 0;
-                        if (loc.N_LAYER == 1) value = 1;
-                        else if (loc.N_LAYER == 2) value = 3;
-                        else if (loc.N_LAYER == 3) value = 5;
-
-                        ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024);
-                        ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
-
-
-                    }
-                }
-                else
-                {
-                    LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
-                }
+                LogHelper.Info($"浠诲姟{mst.S_CODE},璧风偣缁堢偣鏈夌┖鍙傛暟锛屼笉鎺ㄩ�浠诲姟");
             }
-            //else if (mst.N_SCHEDULE_TYPE == 5) {
-            //    //璋冪涓夋柟鎺ュ彛
-            //    var model = new HanAo.TaskInfoModel
-            //    {
-            //        requestPk = mst.S_CODE,
-            //        frmPos = mst.S_START_LOC,
-            //        toPos = mst.S_END_LOC,
-            //        trkType = mst.S_OP_NAME == "鍏ュ簱" ? "1" : "2",
-            //        contNo = mst.S_CNTR_CODE
-            //    };
-            //    if (HanAo.CreateOrder(model)) {
-            //        mst.N_B_STATE = 1;
-            //        WCSHelper.UpdateStatus(mst);
-            //    }
-            //}
-            //else if (mst.N_SCHEDULE_TYPE == 3) {
-            //    var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
-            //    if (code > 0) {
-            //        //鏇存柊浠诲姟鐘舵�
-            //        mst.N_B_STATE = 1;
-            //        mst.S_EQ_TASK_CODE = code.ToString();
-            //        WCSHelper.UpdateStatus(mst);
-            //        WCSHelper.UpdateEQNo(mst);
 
-            //    }
-            //}
 
-            //  }
+            start = LocationHelper.GetAgvSite(mst.S_START_LOC);
+            end = LocationHelper.GetAgvSite(mst.S_END_LOC);
+            //if (mst.N_START_LAYER > 1)
+            //{
+            //    start = LocationHelper.GetAgvSite(mst.S_START_LOC, mst.N_START_LAYER.ToString()).ToString();
+            //}
+            if (mst.N_END_LAYER > 1)
+            {
+                end = LocationHelper.GetAgvSite(mst.S_END_LOC, mst.N_END_LAYER.ToString()).ToString();
+                LogHelper.Info($"浠诲姟鎺ㄩ�锛氱粓鐐瑰眰鏁颁负{mst.N_END_LAYER}锛屾帹閫佺珯鐐逛负:{end}");
+            }
+            Console.WriteLine($"SendTask {mst.S_CODE}");
+            Console.WriteLine("start=" + start);
+            Console.WriteLine("end= " + end);
+            var dic = new List<param>();
+            dic.Add(new param() { name = "From", value = start.ToString() });
+            dic.Add(new param() { name = "To", value = end.ToString() });
+            dic.Add(new param() { name = "FUNC", value = "0" });
+            dic.Add(new param() { name = "DATA", value = "0" });
+            dic.Add(new param() { name = "Ctype", value = "0" });
+
+
+            var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�+                                                                //dic.Add("Pri", mst.N_PRIORITY.ToString());
+                                                                //dic.Add("From", start.ToString());
+                                                                //dic.Add("To", end.ToString());
+                                                                //dic.Add("task_no", mst.S_CODE.Trim());// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
+                                                                //var res = NDC.AddNewOrder(1, dic);
+
+
+
+            if (res != null && (res.err_code == 0 || res.err_code == 50009))
+            {
+                //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                mst.N_B_STATE = 1;
+                mst.S_B_STATE = WCSTask.GetStateStr(1);
+                WCSHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
+                result = true;
+                LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
+          
+            }
+            else
+            {
+                LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
+            }
+
+
             return result;
         }
         /// <summary>
@@ -584,53 +632,34 @@
             try
             {
                 //鍥炴姤鏁版嵁鑾峰彇
-                Request<StatusArrive> statusarrive = new Request<StatusArrive>();
+                //  Request<StatusArrive> statusarrive = new Request<StatusArrive>();
                 //鑾峰彇鏃堕棿鎴�+
+                Request<MesTaskAccess> request = new Request<MesTaskAccess>();
                 var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                statusarrive.RequestId = "鏉弶AGV" + time;
-                string info = "";
-                switch (status)
-                {
-                    case 1:
-                        info = "agv宸叉帴鍙楀師鏂欏簱涓嬪彂鐨勪换鍔�;
-                        break;
-                    case 4:
-                        info = "agv宸插彇璐у畬鎴�;
-                        break;
-                    case 6:
-                        info = "agv宸插嵏璐у埌鎸囧畾浣嶇疆";
-                        break;
-                    case 2:
-                        info = "agv宸插畬鎴愰�鏂欎换鍔�;
-                        break;
-                }
-                string message = "1";
-                if (status == 7) { message = "agv浠诲姟宸插彇娑�; }
-                int flag = 0;
-                if (mst.S_NOTE == "绮夋枡")
-                {
-                    flag = 1;
-                }
-                //List<StatusArrive> statusArrives = new List<StatusArrive>();
+                request.RequestId = "鏉弶AGV" + time;
+
                 StatusArrive statusArrive = new StatusArrive();
-                statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs";
-                statusArrive.TaskNumber = mst.S_EQ_NO;
-                statusArrive.LocationNum = mst.S_END_LOC;
-                statusArrive.ArricalTime = DateTime.Now.ToString();
-                statusArrive.Status = status.ToString();
-                statusArrive.Rfid = mst.S_CNTR_CODE;
-                var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault();
-                if (cntritem!=null)
-                {
-                    statusArrive.PartNumber = cntritem.S_ITEM_CODE;
-                    statusArrive.PartDesc = cntritem.S_ITEM_NAME;
-                }
+                request.UseToken = "iFQ5fExGrLYLXliHYWzs";
+                MesTaskAccess taskAccess = new MesTaskAccess() { taskNumber = mst.S_EQ_NO, status = status.ToString() };
+                request.data = taskAccess;
+                //statusArrive.TaskNumber = mst.S_EQ_NO;
+                //statusArrive.LocationNum = mst.S_END_LOC;
+                //statusArrive.ArricalTime = DateTime.Now.ToString();
+                //statusArrive.Status = status.ToString();
+                //statusArrive.Rfid = mst.S_CNTR_CODE;
+                //var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault();
+                //if (cntritem != null)
+                //{
+                //    statusArrive.PartNumber = cntritem.S_ITEM_CODE;
+                //    statusArrive.PartDesc = cntritem.S_ITEM_NAME;
+                //}
                 //statusArrives.Add(statusArrive);
-                statusarrive.data = statusArrive;
+
                 //寮�鍥炴姤
                 HttpHelper httpHelper = new HttpHelper();
                 MesResult result = new MesResult();
-                string date = JsonConvert.SerializeObject(statusarrive);
+                string date = JsonConvert.SerializeObject(request);
 
                 LogHelper.Info($"浠诲姟鍥炴姤锛氬湴鍧�{url}锛屽唴瀹癸細{date}");
                 var r = httpHelper.MesWebPost(url, date);

--
Gitblit v1.9.1