process/TaskProcess.cs
@@ -14,6 +14,7 @@
using System.Threading.Tasks;
using static HH.WCS.Mobox3.pinggao.models.SapRoot.WcReturnRoot;
using static HH.WCS.Mobox3.pinggao.api.OtherModel;
using NLog.Fluent;
namespace HH.WCS.Mobox3.pinggao.process
{
@@ -80,14 +81,65 @@
        /// <param name="forkliftNo">车号</param>
        /// <param name="extData">重量</param>
        /// <param name="Ext1">高度</param>
        internal static void OperateReq(WCSTask TN_Task, int state, string forkliftNo, string extData,string Ext1)
        internal static void OperateReq(WCSTask TN_Task, int state, string forkliftNo, string extData)
        {
            if (state == 1002)//信号
            {
                LogHelper.Info($"称重分配入库终点货位高度重量{extData},高度{Ext1}");
            }
            else if (state == 2000)//信号
            {
                var db = new SqlHelper<object>().GetInstance();
                var WMStask= db.Queryable<WMSTask>().Where(s=>s.S_CODE==TN_Task.S_OP_CODE).First();
                if (WMStask==null)
                TN_Task.S_EQ_TASK_CODE = extData;//高度
                db.Updateable<WCSTask>(TN_Task).UpdateColumns(a => new { a.S_EQ_TASK_CODE }).ExecuteCommand();
                db.CommitTran();
                if (!string.IsNullOrEmpty(TN_Task.S_STATE_PRE) && !string.IsNullOrEmpty(TN_Task.S_EQ_TASK_CODE))
                {
                    if (TN_Task.S_START_LOC == TN_Task.S_END_LOC)
                    {
                        weight(TN_Task);
                    }
                }
            }
            else if (state == 2001)//信号
            {
                var db = new SqlHelper<object>().GetInstance();
                TN_Task.S_STATE_PRE = extData;//高度
                db.Updateable<WCSTask>(TN_Task).UpdateColumns(a => new { a.S_STATE_PRE }).ExecuteCommand();
                db.CommitTran();
                if (!string.IsNullOrEmpty(TN_Task.S_STATE_PRE) && !string.IsNullOrEmpty(TN_Task.S_EQ_TASK_CODE))
                {
                    if (TN_Task.S_START_LOC == TN_Task.S_END_LOC)
                    {
                        weight(TN_Task);
                    }
                }
            }
            if (state == 1103)
            {
                //大铁框叉走以后通知,我们要通知输送线
            }
        }
        internal static void weight(WCSTask TN_Task)
        {
            if (!string.IsNullOrEmpty(TN_Task.S_STATE_PRE) && !string.IsNullOrEmpty(TN_Task.S_EQ_TASK_CODE))
            {
                string extData = TN_Task.S_STATE_PRE;
                string Ext1 = TN_Task.S_EQ_TASK_CODE;
                LogHelper.Info($"称重分配入库终点货位高度重量{extData},高度{Ext1},容器{TN_Task.S_CNTR_CODE}");
                var db = new SqlHelper<object>().GetInstance();
                var WMStask = db.Queryable<WMSTask>().Where(s => s.S_CODE == TN_Task.S_OP_CODE).First();
                if (WMStask == null)
                {
                    LogHelper.Info($"未找到此任务对应的作业");
                }
@@ -101,25 +153,30 @@
                    //获取集合
                    var locklist = db.Queryable<Location>();
                    if (TN_Task.S_CNTR_CODE.Substring(0, 2) == "TP")//托盘
                    {
                        var endlist = locklist
                                   .Where(it => it.N_CURRENT_NUM < it.N_CAPACITY && it.N_LAYER < 3 && it.S_AREA_CODE == "HJQ")
                                   .Where(it => it.N_CURRENT_NUM < it.N_CAPACITY && it.N_LAYER < 3 && it.N_LOCK_STATE == 0 && it.S_AREA_CODE == "HJQ")
                                   .OrderBy(it => it.N_COL)
                                   .PartitionBy(it => it.N_ROW)
                                   .PartitionBy(it => it.N_LAYER)
                                   .Take(1)
                                   .ToList();
                        if (TN_Task.N_ERR == 2)//前移车
                        {
                            endlist = endlist.Where(s => s.N_LAYER < 7).ToList();
                        }
                        foreach (var item in endlist)
                        {
                            LogHelper.Info($"重量{decimal.Parse(extData)}");
                            //大于800kg
                            if (decimal.Parse(extData) > 800)
                            if (decimal.Parse(extData) > 1)
                            {
                                LogHelper.Info($"高度{decimal.Parse(Ext1)}");
                                LogHelper.Info($"高度{Ext1}");
                                //高度大于1050mm 只放在第一层
                                if (decimal.Parse(Ext1) <= 1050)
                                if (decimal.Parse(Ext1) <= 3)
                                {
                                    var lockinfo = locklist.Where(it => it.N_LOCK_STATE != 0 && it.N_LOCK_STATE != 0 && it.N_ROW == item.N_ROW
                                                    && it.N_LAYER == 1).First();
@@ -128,38 +185,41 @@
                                        result = item;
                                        break;
                                    }
                                    else {
                                    else
                                    {
                                        LogHelper.Info($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        //throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                    }
                                }
                                else
                                {
                                    LogHelper.Info($"高度{decimal.Parse(Ext1)}过高 联系人工处理");
                                    throw new Exception($"高度{decimal.Parse(Ext1)}过高 联系人工处理");
                                }
                            }
                            else//不超重 即 不超过800kg
                            {
                                //高度<450mm 2-9层
                                if (decimal.Parse(Ext1) < 450)
                                if (decimal.Parse(Ext1) < 2)
                                {
                                    LogHelper.Info($"高度<450mm 2-9层");
                                    var lockinfo = locklist.Where(it => it.N_LOCK_STATE != 0 && it.N_ROW == item.N_ROW
                                                    && it.N_LAYER == 2).First();
                                                        && it.N_LAYER == 2).First();
                                    if (lockinfo == null)
                                    {
                                        result = item;
                                        break;
                                    }
                                    else {
                                    else
                                    {
                                        LogHelper.Info($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        //throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                    }
                                }
                                else if (decimal.Parse(Ext1) >= 450 && decimal.Parse(Ext1) < 1050)
                                else if (decimal.Parse(Ext1) >= 2 && decimal.Parse(Ext1) < 4)
                                {
                                    var lockinfo = locklist.Where(it => it.N_LOCK_STATE != 0 && it.N_ROW == item.N_ROW
                                                   && it.N_LAYER >= 1 && it.N_LAYER <= 2).First();
@@ -175,14 +235,14 @@
                                    else
                                    {
                                        LogHelper.Info($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        //throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                    }
                                }
                                else
                                {
                                    LogHelper.Info($"托盘高度{decimal.Parse(Ext1)}过高 联系人工处理");
                                    throw new Exception($"托盘高度{decimal.Parse(Ext1)}过高 联系人工处理");
                                }
                            }
                        }
@@ -191,24 +251,28 @@
                    { //容器为料箱 则放到3-9层
                        var endlist = locklist
                                   .Where(it => it.N_CURRENT_NUM < it.N_CAPACITY && it.N_LAYER >=3&&it.S_AREA_CODE== "HJQ")
                                   .Where(it => it.N_CURRENT_NUM < it.N_CAPACITY && it.N_LAYER >= 3 && it.N_LOCK_STATE == 0 && it.S_AREA_CODE == "HJQ")
                                   .OrderBy(it => it.N_COL)
                                   .PartitionBy(it => it.N_ROW)
                                   .PartitionBy(it => it.N_LAYER)
                                   .Take(1)
                                   .ToList();
                        if (TN_Task.N_ERR == 2)//前移车
                        {
                            endlist = endlist.Where(s => s.N_LAYER < 7).ToList();
                        }
                        foreach (var item in endlist)
                        {
                            LogHelper.Info($"重量{decimal.Parse(extData)}");
                            //大于800kg
                            if (decimal.Parse(extData) > 800)
                            if (decimal.Parse(extData) > 1)
                            {
                                LogHelper.Info($"料箱重量超过800kg");
                                throw new Exception($"料箱重量超过800kg");
                            }
                            else
                            {
                                if (decimal.Parse(Ext1) < 1050)
                                if (decimal.Parse(Ext1) < 4)
                                {
                                    var lockinfo = locklist.Where(it => it.N_LOCK_STATE != 0 && it.N_LOCK_STATE != 0 && it.S_AREA_CODE == item.S_AREA_CODE && it.N_ROW == item.N_ROW
                                                   && it.N_LAYER >= 3 && it.N_LAYER <= 9).First();
@@ -220,7 +284,8 @@
                                        break;
                                    }
                                    else {
                                    else
                                    {
                                        LogHelper.Info($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                        throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用");
                                    }
@@ -235,41 +300,68 @@
                    }
                    if (result==null)
                    if (result == null)
                    {
                        LogHelper.Info($"小车回调未找到可用库位");
                        throw new Exception($"小车回调未找到可用库位");
                    }
                    //var lcrList = db.Queryable<LocCntrRel>().Includes(a => a.Container).Where(a => a.S_LOC_CODE == TN_Task.S_CNTR_CODE).ToList();
                    //if (lcrList.Count == 0) {
                    TN_Task.S_END_LOC = result.S_CODE;
                    TN_Task.S_END_AREA = result.S_AREA_CODE;
                    TN_Task.S_END_WH = result.S_WH_CODE;
                    db.Updateable<WCSTask>(TN_Task).UpdateColumns(a => new { a.S_END_LOC, a.S_END_AREA, a.S_END_WH }).ExecuteCommand();
                    WMStask.S_END_LOC = result.S_CODE;
                    WMStask.S_END_AREA = result.S_AREA_CODE;
                    WMStask.S_END_WH = result.S_WH_CODE;
                    db.Updateable<WMSTask>(WMStask).UpdateColumns(a => new { a.S_END_LOC, a.S_END_AREA, a.S_END_WH }).ExecuteCommand();
                    //}
                    //请求卸货,
                    var S_AGV_SITE = "";
                    if (TN_Task.N_ERR == 1)//前移车
                    {
                        //前移车
                        S_AGV_SITE = LocationHelper.GetAgvSite(TN_Task.S_END_LOC);
                    }
                    else //堆垛车
                    {
                        //堆垛车
                        S_AGV_SITE = db.Queryable<TN_Location_Ext>().Where(a => a.S_LOC_CODE == TN_Task.S_END_LOC).First()?.S_AGV_SITE;
                    }
                    var dic = new Dictionary<string, string>();
                    dic.Add("No", TN_Task.S_CODE);
                    dic.Add("ParamNo", "2");
                    dic.Add("Param1", TN_Task.S_END_LOC);
                    dic.Add("Param1", S_AGV_SITE);
                    //dic.Add("Pri", TN_Task.N_PRIORITY.ToString());
                    //dic.Add("No", TN_Task.S_CODE.Trim());
                    //dic.Add("From", TN_Task.S_START_LOC);
                    //dic.Add("To", TN_Task.S_END_LOC);
                    //dic.Add("Func", "0");
                    //dic.Add("Data", "512");
                    //dic.Add("FRow", "0");
                    var res = NDC.ChangeOrder(dic);
                    LogHelper.Info($"修改终点货位"+ JsonConvert.SerializeObject(res));
                    LogHelper.Info($"修改终点货位" + JsonConvert.SerializeObject(res));
                    if (res.Res.ErrCode != -1)
                    {
                        var dics = new Dictionary<string, string>();
                        dics.Add("No", TN_Task.S_CODE);
                        dics.Add("ParamNo", "6");
                        dics.Add("Param1", "2");
                      var ss=  NDC.ChangeOrder(dics);
                        var ss = NDC.ChangeOrder(dics);
                        LogHelper.Info($"小车前往新库位" + JsonConvert.SerializeObject(ss));
                        //if (lcrList.Count()==0)
                        //{
                        LocationHelper.BindingLoc(TN_Task.S_END_LOC, TN_Task.S_CNTR_CODE.Split(',').ToList());
                        LocationHelper.LockLoc(TN_Task.S_END_LOC, 1);
                        //}
                    }
                    db.CommitTran();
                }
                catch (Exception)
@@ -277,14 +369,10 @@
                    db.RollbackTran();
                    throw;
                }
            }
            }
            if (state == 1103)
            {
                //大铁框叉走以后通知,我们要通知输送线
            }
        }
        internal static void UpdateAgvNo(WCSTask mst, string forkliftNo)
        {
@@ -479,6 +567,26 @@
        }
        public static bool SendCd() {
             var result=false;
                var dic = new Dictionary<string, string>();
                var dic1 = new Dictionary<string, string>();
                dic.Add("ExtDeviceNo", "1");
                //判断
                var res = NDC.OrderAdd(99, dic, dic1);
                if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
                {
                result = true;
                }
            return result;
        }
        /// <summary>
        /// 推送任务
        /// </summary>
@@ -490,7 +598,7 @@
            var taskType = mst.S_TYPE.Trim();
            try
            {
                LogHelper.Info($"推送任务{ mst.S_CODE}");
                LogHelper.Info($"推送任务{mst.S_CODE}");
                Console.WriteLine("推送任务", mst.S_CODE);
                //前移车
                var startlocs = LocationHelper.GetAgvSite(mst.S_START_LOC);
@@ -499,18 +607,18 @@
                var db = new SqlHelper<object>().GetInstance();
                var dstart = db.Queryable<TN_Location_Ext>().Where(a => a.S_LOC_CODE == mst.S_START_LOC).First()?.S_AGV_SITE;
                var dend = db.Queryable<TN_Location_Ext>().Where(a => a.S_LOC_CODE == mst.S_END_LOC).First()?.S_AGV_SITE;
                LogHelper.Info($"获取库位{mst.S_START_LOC}{ mst.S_END_LOC}||{mst.N_B_STATE}");
                LogHelper.Info($"获取库位{mst.S_START_LOC}{mst.S_END_LOC}||{mst.N_B_STATE}");
                LogHelper.Info($"站点数据信息{dstart}/{dend}||{startlocs}/{endlocs}");
                if (mst.N_B_STATE == 0)
                {
                    //堆垛车去站点表找
                    if (mst.S_SCHEDULE_TYPE == "NDC")
                    {
                        var startloc = LocationHelper.GetLoc(mst.S_START_LOC);
                        var endloc = LocationHelper.GetLoc(mst.S_END_LOC);
                        LogHelper.Info($"获取站点{startloc.N_LAYER}");
                        if (startloc.N_LAYER > 7 || endloc.N_LAYER > 7)//大于七层 找有无 前移车的任务 有 不推 无推送
                        if (mst.S_TYPE.Contains("入库"))
                        {
                            var task = WCSHelper.GetWaitingTaskGoList();//查询是否有前移车正在执行的任务
                            if (task.Count() == 0)
@@ -519,29 +627,66 @@
                                start = startlocs;
                                end = endlocs;
                            }
                        }
                        else //小于
                        {
                            LogHelper.Info($"小于7");
                            var task = WCSHelper.GetWaitingTaskGoBackList();//查询是否有堆垛车正在执行的任务、
                            LogHelper.Info($"count{task.Count()}");
                            if (task.Count() == 0)
                            {      //堆垛车 去 站点表去查
                                mst.N_ERR = 2;
                                start = dstart;
                                end = dend;
                            }
                            else
                            {
                                var task1 = WCSHelper.GetWaitingTaskGoList();///查询是否有前移车正在执行的任务
                                LogHelper.Info($"查询是否有前移车正在执行的任务count{task1.Count()}");
                                if (task1.Count() == 0)
                                var task12 = WCSHelper.GetWaitingTaskGoBackList();//查询是否有堆垛车正在执行的任务、
                                LogHelper.Info($"count{task12.Count()}");
                                if (task12.Count() == 0)
                                {      //堆垛车 去 站点表去查
                                    mst.N_ERR = 2;
                                    start = dstart;
                                    end = dend;
                                }
                                else
                                {
                                    var task1 = WCSHelper.GetWaitingTaskGoList();///查询是否有前移车正在执行的任务
                                    LogHelper.Info($"查询是否有前移车正在执行的任务count{task1.Count()}");
                                    if (task1.Count() == 0)
                                    {
                                        mst.N_ERR = 1;
                                        start = startlocs;
                                        end = endlocs;
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (startloc.N_LAYER > 7 || endloc.N_LAYER > 7)//大于七层 找有无 前移车的任务 有 不推 无推送
                            {
                                var task = WCSHelper.GetWaitingTaskGoList();//查询是否有前移车正在执行的任务
                                if (task.Count() == 0)
                                {
                                    mst.N_ERR = 1;
                                    start = startlocs;
                                    end = endlocs;
                                }
                            }
                            else //小于
                            {
                                LogHelper.Info($"小于7");
                                var task = WCSHelper.GetWaitingTaskGoBackList();//查询是否有堆垛车正在执行的任务、
                                LogHelper.Info($"count{task.Count()}");
                                if (task.Count() == 0)
                                {      //堆垛车 去 站点表去查
                                    mst.N_ERR = 2;
                                    start = dstart;
                                    end = dend;
                                }
                                else
                                {
                                    var task1 = WCSHelper.GetWaitingTaskGoList();///查询是否有前移车正在执行的任务
                                    LogHelper.Info($"查询是否有前移车正在执行的任务count{task1.Count()}");
                                    if (task1.Count() == 0)
                                    {
                                        mst.N_ERR = 1;
                                        start = startlocs;
                                        end = endlocs;
                                    }
                                }
                            }
                        }
                        LogHelper.Info($"站点{start}/{end}");
                        if (!string.IsNullOrEmpty(start) && !string.IsNullOrEmpty(end))
@@ -555,7 +700,7 @@
                            dic1.Add("Func", "0");
                            if (mst.S_TYPE.Contains("入库"))
                            {
                                dic1.Add("Data", "0x200");
                                dic1.Add("Data", "512");
                            }
                            else
                            {