| | |
| | | using System.Threading.Tasks; |
| | | using static HH.WCS.Mobox3.pinggao.models.SapRoot.WcReturnRoot; |
| | | using static HH.WCS.Mobox3.pinggao.api.OtherModel; |
| | | using NLog.Fluent; |
| | | using System.Xml.Linq; |
| | | |
| | | namespace HH.WCS.Mobox3.pinggao.process |
| | | { |
| | |
| | | /// <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($"未找到此任务对应的作业"); |
| | | } |
| | |
| | | //获取集合 |
| | | 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(); |
| | |
| | | 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(); |
| | |
| | | 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)}过高 联系人工处理"); |
| | | |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | { //容器为料箱 则放到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(); |
| | |
| | | |
| | | break; |
| | | } |
| | | else { |
| | | else |
| | | { |
| | | LogHelper.Info($"货位{lockinfo.S_CODE} 有锁 当排层不可使用"); |
| | | throw new Exception($"货位{lockinfo.S_CODE} 有锁 当排层不可使用"); |
| | | } |
| | |
| | | } |
| | | |
| | | |
| | | 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) |
| | |
| | | db.RollbackTran(); |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | if (state == 1103) |
| | | { |
| | | //大铁框叉走以后通知,我们要通知输送线 |
| | | } |
| | | } |
| | | |
| | | |
| | | internal static void UpdateAgvNo(WCSTask mst, string forkliftNo) |
| | | { |
| | |
| | | |
| | | |
| | | } |
| | | public static DateTime? ParseCustomFormatDate(string dateStr) |
| | | { |
| | | // 假设日期格式是 yy:mm |
| | | if (DateTime.TryParseExact(dateStr, "HH:mm", null, System.Globalization.DateTimeStyles.None, out DateTime result)) |
| | | { |
| | | return result; |
| | | } |
| | | return null; |
| | | } |
| | | public static bool SendCd() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var dstart = db.Queryable<TN_CD>().Where(s => s.N_STATE == 0).First(); |
| | | |
| | | var result = false; |
| | | if (dstart != null) |
| | | { |
| | | DateTime currentDate = DateTime.Now; |
| | | // 格式化输出时分部分 |
| | | string currentHourMinute = currentDate.ToString("HH:mm"); |
| | | |
| | | if (dstart.S_TIME == currentHourMinute) |
| | | { |
| | | var dic = new Dictionary<string, string>(); |
| | | var dic1 = new Dictionary<string, string>(); |
| | | var no = WMSHelper.GenerateTaskNo(); |
| | | dic.Add("No", no); |
| | | dic.Add("Pri", "0"); |
| | | dic1.Add("ExtDeviceNo", "1"); |
| | | |
| | | //判断 |
| | | var res = NDC.OrderAdd(99, dic, dic1); |
| | | if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) |
| | | { |
| | | // dstart.N_STATE = 1; |
| | | // db.Updateable<TN_CD>(dstart).UpdateColumns(a => new { a.N_STATE }).ExecuteCommand(); |
| | | |
| | | // result = true; |
| | | } |
| | | |
| | | |
| | | var dic12 = new Dictionary<string, string>(); |
| | | var dic11 = new Dictionary<string, string>(); |
| | | var no1 = WMSHelper.GenerateTaskNo(); |
| | | dic12.Add("No", no1); |
| | | dic12.Add("Pri", "0"); |
| | | dic11.Add("ExtDeviceNo", "2"); |
| | | |
| | | //判断 |
| | | var res1 = NDC.OrderAdd(99, dic12, dic11); |
| | | if (res1 != null && (res1.Res.ErrCode == 0 || res1.Res.ErrCode == 50009)) |
| | | { |
| | | dstart.N_STATE = 1; |
| | | db.Updateable<TN_CD>(dstart).UpdateColumns(a => new { a.N_STATE }).ExecuteCommand(); |
| | | |
| | | result = true; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | public static bool SendCZ() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var dstart = db.Queryable<TN_CD>().Where(s => s.N_STATE == 1).First(); |
| | | |
| | | var result = false; |
| | | if (dstart != null) |
| | | { |
| | | DateTime currentDate = DateTime.Now; |
| | | // 格式化输出时分部分 |
| | | string currentHourMinute = currentDate.ToString("HH:mm"); |
| | | if (currentHourMinute == "00:00") |
| | | { |
| | | |
| | | dstart.N_STATE = 0; |
| | | db.Updateable<TN_CD>(dstart).UpdateColumns(a => new { a.N_STATE }).ExecuteCommand(); |
| | | } |
| | | result = true; |
| | | |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | /// <summary> |
| | | /// 推送任务 |
| | | /// </summary> |
| | |
| | | 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); |
| | |
| | | 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) |
| | |
| | | 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)) |
| | |
| | | dic1.Add("Func", "0"); |
| | | if (mst.S_TYPE.Contains("入库")) |
| | | { |
| | | dic1.Add("Data", "0x200"); |
| | | dic1.Add("Data", "512"); |
| | | } |
| | | else |
| | | { |