| | |
| | | using 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; |
| | | using Microsoft.Owin.BuilderProperties; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Diagnostics.Eventing.Reader; |
| | | using System.IdentityModel.Protocols.WSTrust; |
| | | using System.Linq; |
| | | using System.Net.NetworkInformation; |
| | | 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; |
| | | |
| | | namespace HH.WCS.JiaTong.process |
| | |
| | | var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1; |
| | | if (load) |
| | | { |
| | | Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | //Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | |
| | | if (!string.IsNullOrEmpty(mst.S_CNTR_CODE)) |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); |
| | | LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | // Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | |
| | | if (!string.IsNullOrEmpty(mst.S_CNTR_CODE)) |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); |
| | | LocationHelper.UnlockLoc(mst.S_END_LOC); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | { |
| | | //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。 |
| | | //终点绑定 |
| | | //物料到位通知 |
| | | if (mst.S_TYPE == "出平库" || mst.S_TYPE == "余料返回") |
| | | { |
| | | string urlitem = Settings.tableUrls.Find(a => a.id == 5).url; |
| | | TaskProcess.MESIteminfoback(mst, urlitem); |
| | | } |
| | | if ((mst.S_NOTE == "出库" || mst.S_NOTE == "异常库区入库") && !string.IsNullOrEmpty(mst.S_MES_NO)) |
| | | { |
| | | string urlitem = Settings.tableUrls.Find(a => a.id == 5).url; |
| | | TaskProcess.MESIteminfoback(mst, urlitem); |
| | | } |
| | | CacheBitUpdate(mst, false); |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | } |
| | | else |
| | | { |
| | | |
| | | //起点终点解锁 |
| | | LocationHelper.UnLockLoc(mst.S_START_LOC); |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 安全请求 |
| | | /// </summary> |
| | | /// <param name="no"></param> |
| | | /// <param name="state"></param> |
| | | /// <param name="forkliftNo"></param> |
| | | /// <param name="extData"></param> |
| | | internal static void OperateReq(string no, int state, string url, string forkliftNo, string extData, int Z_type) |
| | | /// <param name="model">请求参数</param> |
| | | /// <param name="url">地址</param> |
| | | /// <param name="TN_Task">任务</param> |
| | | internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task, string name) |
| | | { |
| | | try |
| | | { |
| | | LogHelper.Info($"-------开始安全请求------"); |
| | | var TN_Task = WCSHelper.GetTask(no); |
| | | |
| | | if (TN_Task != null) |
| | | { |
| | | int type = 0; |
| | | string loc = ""; |
| | | if (state == 1101) |
| | | if (model.state == 1101) |
| | | { |
| | | |
| | | //请求取货, |
| | | type = 1; |
| | | loc = TN_Task.S_START_LOC; |
| | | if (Z_type == 4) |
| | | if (TN_Task.S_TYPE.Contains("电梯2")) |
| | | { |
| | | var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); |
| | | var EndLoc = LocationHelper.GetLocByLoc(TN_Task.S_END_LOC); |
| | | if (device == null) |
| | | { |
| | | LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应电梯配置文件"); |
| | | } |
| | | if (EndLoc == null) |
| | | { |
| | | LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应货位"); |
| | | } |
| | | var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024); |
| | | var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024); |
| | | if (value[0] == EndLoc.N_LAYER && value2[0] == 2) |
| | | { |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | else |
| | | { |
| | | int layerValue = 0; |
| | | if (EndLoc.N_LAYER == 1) layerValue = 1; |
| | | else if (EndLoc.N_LAYER == 2) layerValue = 3; |
| | | else if (EndLoc.N_LAYER == 3) layerValue = 5; |
| | | ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | | } |
| | | |
| | | } |
| | | else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, state)) |
| | | //井松叠盘机安全交互 |
| | | if (TN_Task.S_NOTE == "空托回库") |
| | | { |
| | | // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); |
| | | if (Device != null) |
| | | { |
| | | if (S7Helper.WriteDpj(Device.address, 1002, 1)) |
| | | { |
| | | int value = S7Helper.ReadDpj(Device.address, 2004, S7.Net.VarType.Byte); |
| | | if (value == 1) |
| | | { |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("叠盘机安全交互失败,读取VB2004的值为{2004}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("叠盘机安全交互失败,写入VB1002值1失败"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件"); |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name)) |
| | | { |
| | | // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | if (state == 1102) |
| | | if (model.state == 1102) |
| | | { |
| | | type = 3; |
| | | if (Z_type == 4) |
| | | if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | loc = TN_Task.S_START_LOC; |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | |
| | | //NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | } |
| | | } |
| | | if (TN_Task.S_NOTE == "空托回库") |
| | | { |
| | | var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); |
| | | if (Device != null) |
| | | { |
| | | //写入失败重新写入 |
| | | if (!S7Helper.WriteDpj(Device.address, 1001, 1)) |
| | | { |
| | | Task.Run(() => |
| | | { |
| | | while (!S7Helper.WriteDpj(Device.address, 1001, 1)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | } |
| | | }); |
| | | } |
| | | if (!S7Helper.WriteDpj(Device.address, 1002, 0)) |
| | | { |
| | | Task.Run(() => |
| | | { |
| | | while (!S7Helper.WriteDpj(Device.address, 1002, 0)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件"); |
| | | } |
| | | } |
| | | } |
| | | if (state == 1103) |
| | | if (model.state == 1103) |
| | | { |
| | | //请求卸货 |
| | | type = 2; |
| | | loc = TN_Task.S_END_LOC; |
| | | if (Z_type == 4) |
| | | if (TN_Task.S_TYPE.Contains("电梯1")) |
| | | { |
| | | loc = TN_Task.S_END_LOC; |
| | | var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault(); |
| | | var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC); |
| | | if (device == null) |
| | | { |
| | | LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件"); |
| | | } |
| | | if (startloc == null) |
| | | { |
| | | LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应货位"); |
| | | } |
| | | var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024); |
| | | var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024); |
| | | if (value[0] == startloc.N_LAYER && value2[0] == 2) |
| | | { |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | else |
| | | { |
| | | int layerValue = 0; |
| | | if (startloc.N_LAYER == 1) layerValue = 1; |
| | | else if (startloc.N_LAYER == 2) layerValue = 3; |
| | | else if (startloc.N_LAYER == 3) layerValue = 5; |
| | | ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | | } |
| | | |
| | | } |
| | | else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | |
| | | // loc = TN_Task.S_END_LOC; |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | | { |
| | | // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1103, 18); |
| | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, state)) |
| | | 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 (state == 1104) |
| | | if (model.state == 1104) |
| | | { |
| | | type = 4; |
| | | if (Z_type == 4) |
| | | if (TN_Task.S_TYPE.Contains("电梯1")) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault(); |
| | | var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == TN_Task.S_EQ_NO && a.S_TYPE.Contains("电梯2")).First(); |
| | | if (mstbyEqno != null) |
| | | { |
| | | var Endloc = LocationHelper.GetLocByLoc(mstbyEqno.S_END_LOC); |
| | | // var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC); |
| | | if (device == null) |
| | | { |
| | | LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件"); |
| | | } |
| | | if (Endloc == null) |
| | | { |
| | | LogHelper.Info($"根据任务终点:{mstbyEqno.S_END_LOC},未找到对应货位"); |
| | | } |
| | | int value = 0; |
| | | if (Endloc.N_LAYER == 1) value = 1; |
| | | else if (Endloc.N_LAYER == 2) value = 3; |
| | | else if (Endloc.N_LAYER == 3) value = 5; |
| | | ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"根据任务来源:{TN_Task.S_EQ_NO},未找到电梯2任务"); |
| | | } |
| | | |
| | | } |
| | | else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | loc = TN_Task.S_END_LOC; |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"安全请求==》根据任务号{no}未找到对应任务"); |
| | | } |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | LogHelper.Info($"OperateReq Error ==》{ex.ToString()}"); |
| | | } |
| | | |
| | |
| | | /// <param name="type"></param> |
| | | /// <param name="taskStatus"></param> |
| | | /// <returns></returns> |
| | | internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus) |
| | | internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus, string name) |
| | | { |
| | | bool permit = false; |
| | | try |
| | |
| | | else |
| | | { |
| | | LogHelper.Info($"安全请求失败=>msg:{result.msg}"); |
| | | ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum); |
| | | } |
| | | ApiHelper.AddInfo(name, "安全请求", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | return permit; |
| | | } |
| | | catch (Exception) |
| | |
| | | else |
| | | { |
| | | LogHelper.Info($"安全请求失败=>msg:{result.err_msg}"); |
| | | ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no); |
| | | } |
| | | ApiHelper.AddInfo("YCL", "安全请求", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | return permit; |
| | | } |
| | | catch (Exception) |
| | |
| | | { |
| | | 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 mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList(); |
| | | if (mstbyEqno.Count() == 1) |
| | | { |
| | |
| | | else if (mst.S_TYPE == "电梯2") |
| | | { |
| | | var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯1").First(); |
| | | if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成") |
| | | if (mst2 == null) |
| | | { |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成") |
| | | { |
| | | return result; |
| | | } |
| | | result = false; |
| | | } |
| | | } |
| | |
| | | } |
| | | private static object locLocker = new object(); |
| | | |
| | | /// <summary> |
| | | /// 堆叠库区出入库任务申请 |
| | | /// </summary> |
| | | /// <param name="ls"></param> |
| | | /// <param name="cntrs"></param> |
| | | /// <param name="area"></param> |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="itemBatch"></param> |
| | | /// <param name="taskType"></param> |
| | | /// <param name="insStock"></param> |
| | | /// <returns></returns> |
| | | internal static bool ApplyTN_Task(Location ls, ref List<string> cntrs, string area, string itemCode, string itemBatch, string taskType, bool insStock = true) |
| | | { |
| | | var result = false; |
| | | lock (locLocker) |
| | | { |
| | | try |
| | | { |
| | | if (insStock) |
| | | { |
| | | Console.WriteLine($"MoboxHelperCreateTask: {area}-{itemCode}-{itemBatch}-{taskType}"); |
| | | var endTN_Location = GetLocation4In(area, itemCode, itemBatch, 3); |
| | | if (endTN_Location != null) |
| | | { |
| | | var endLayer = endTN_Location.N_CURRENT_NUM == 0 ? 1 : 2; |
| | | var taskNo = DateTime.Now.Ticks.ToString(); |
| | | result = TaskProcess.CreateTransport(ls.S_CODE, endTN_Location.S_CODE, taskType, cntrs, 1, endLayer, 3, 70); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"MoboxHelperCreateTask: 未找到终点货位"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var startTN_Location = GetLocation4Out(area, itemCode, itemBatch, 3); |
| | | if (startTN_Location != null) |
| | | { |
| | | var startLayer = startTN_Location.N_CURRENT_NUM <= 3 ? 1 : 2; |
| | | var taskNo = DateTime.Now.Ticks.ToString(); |
| | | var carryCount = startTN_Location.N_CURRENT_NUM > 3 ? startTN_Location.N_CURRENT_NUM - 3 : startTN_Location.N_CURRENT_NUM; |
| | | //出库要从起点获取托盘 |
| | | var cntrList = LocationHelper.GetLocCntr(startTN_Location.S_CODE); |
| | | if (cntrList.Count == startTN_Location.N_CURRENT_NUM) |
| | | { |
| | | cntrs = cntrList.OrderByDescending(a => a.T_CREATE).Take(carryCount).Select(a => a.S_CNTR_CODE.Trim()).ToList(); |
| | | result = TaskProcess.CreateTransport(startTN_Location.S_CODE, ls.S_CODE, taskType, cntrs, startLayer, 1, carryCount, 65); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】"); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | Console.WriteLine("MoboxHelperCreateTask:" + ex.Message); |
| | | LogHelper.Error("MoboxHelperCreateTask:" + ex.Message, ex); |
| | | } |
| | | } |
| | | return result; |
| | | |
| | | |
| | | } |
| | | |
| | | private static Location GetLocation4Out(string area, string itemCode, string itemBatch, int v) |
| | | { |
| | | throw new NotImplementedException(); |
| | | } |
| | | |
| | | private static Location GetLocation4In(string area, string itemCode, string itemBatch, int v) |
| | | { |
| | | throw new NotImplementedException(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 普通货架区的出入库申请 |
| | | /// </summary> |
| | | /// <param name="ls"></param> |
| | | /// <param name="cntrs"></param> |
| | | /// <param name="area"></param> |
| | | /// <param name="taskType"></param> |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="insStock"></param> |
| | | /// <returns></returns> |
| | | internal static bool ApplyNormalTN_Task(Location ls, ref List<string> cntrs, string area, string taskType, string itemCode, bool insStock = true) |
| | | { |
| | | var result = false; |
| | | lock (locLocker) |
| | | { |
| | | try |
| | | { |
| | | if (insStock) |
| | | { |
| | | Console.WriteLine($"MoboxHelperCreateTask: {area}-{taskType}"); |
| | | var endTN_Location = new Location(); |
| | | if (endTN_Location != null) |
| | | { |
| | | var taskNo = DateTime.Now.Ticks.ToString(); |
| | | result = TaskProcess.CreateTransport(ls.S_CODE, endTN_Location.S_CODE, taskType, cntrs, 70); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"MoboxHelperCreateTask: 未找到终点货位"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var startTN_Location = new Location(); |
| | | if (startTN_Location != null) |
| | | { |
| | | //出库要从起点获取托盘 |
| | | var cntrList = LocationHelper.GetLocCntr(startTN_Location.S_CODE); |
| | | if (cntrList.Count == startTN_Location.N_CURRENT_NUM) |
| | | { |
| | | result = TaskProcess.CreateTransport(startTN_Location.S_CODE, ls.S_CODE, taskType, new List<string> { cntrList[0].S_CNTR_CODE }, 65); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】"); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | Console.WriteLine("MoboxHelperCreateTask:" + ex.Message); |
| | | LogHelper.Error("MoboxHelperCreateTask:" + ex.Message, ex); |
| | | } |
| | | } |
| | | return result; |
| | | |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 推送任务 |
| | | /// </summary> |
| | |
| | | internal static bool SendTask(WCSTask mst) |
| | | { |
| | | |
| | | |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var result = false; |
| | | var start = "0"; var end = "0"; |
| | | var taskType = mst.S_TYPE.Trim(); |
| | | 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($"任务{mst.S_CODE},起点终点有空参数,不推送任务"); |
| | | } |
| | | |
| | | |
| | | start = LocationHelper.GetAgvSite(mst.S_START_LOC); |
| | | end = LocationHelper.GetAgvSite(mst.S_END_LOC); |
| | | //if (mst.N_START_LAYER > 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 |
| | | { |
| | |
| | | // } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 空托等待任务 超时5分组直接推送 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | internal static void WaitSend(WCSTask mst) |
| | | { |
| | | // 计算与当前时间的差值 |
| | | TimeSpan timeDifference = DateTime.Now - mst.T_CREATE; |
| | | if (timeDifference.TotalMinutes > 5) |
| | | { |
| | | var db = new SqlHelper<WCSTask>().GetInstance(); |
| | | mst.S_B_STATE = "等待"; |
| | | db.Updateable(mst).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand(); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 任务状态回报 |
| | | /// </summary> |
| | |
| | | /// <param name="orderNum">单号</param> |
| | | /// <param name="taskStatus">任务状态</param> |
| | | /// <param name="url">上报接口</param> |
| | | public static void Reportback(string taskNum, string orderNum, int taskStatus, string url) |
| | | public static void Reportback(string taskNum, string orderNum, int taskStatus, string url, string ly) |
| | | { |
| | | LogHelper.Info($"------------开始任务回报-----------"); |
| | | try |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败=>msg:{result.msg}"); |
| | | } |
| | | ApiHelper.AddInfo(ly, "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败="); |
| | | } |
| | | ApiHelper.AddInfo("Wms", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败=>msg:{result.err_msg}"); |
| | | } |
| | | ApiHelper.AddInfo("YCL", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | //获取时间戳 |
| | | 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>(); |
| | | StatusArrive statusArrive = new StatusArrive(); |
| | | statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs"; |
| | |
| | | statusArrive.LocationNum = mst.S_END_LOC; |
| | | statusArrive.Time = DateTime.Now.ToString(); |
| | | statusArrive.Status = status.ToString(); |
| | | statusArrive.Rfid = mst.S_CNTR_CODE; |
| | | statusArrive.Flag = flag; |
| | | statusArrive.Info = info; |
| | | statusArrive.Message = message; |
| | | |
| | | //statusArrives.Add(statusArrive); |
| | | statusarrive.data = statusArrive; |
| | | //开始回报 |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败=>msg:{result.imsg}"); |
| | | } |
| | | ApiHelper.AddInfo("Mes", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// <summary> |
| | | /// mes物料到位同步 |
| | | /// </summary> |
| | | /// <param name="taskNum"></param> |
| | | /// <param name="orderNum"></param> |
| | | /// <param name="taskStatus"></param> |
| | | /// <param name="mst">任务</param> |
| | | /// <param name="url">地址</param> |
| | | public static void MESIteminfoback(WCSTask mst, string url) |
| | | { |
| | | LogHelper.Info($"------------开始物料信息回报-----------"); |
| | |
| | | { |
| | | var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault(); |
| | | //回报数据 |
| | | Request<iteminfoArrive> statusarrive = new Request<iteminfoArrive>(); |
| | | List<LotListh> lotLists = new List<LotListh>(); |
| | | string TaskNumber = mst.S_EQ_NO; |
| | | if (!string.IsNullOrEmpty(mst.S_WMS_NO)) |
| | | Request<MesItemBackModel> request = new Request<MesItemBackModel>(); |
| | | List<MesItemBackInfoModel> list = new List<MesItemBackInfoModel>(); |
| | | string MesNo = mst.S_EQ_NO; |
| | | if (!string.IsNullOrEmpty(mst.S_MES_NO)) |
| | | { |
| | | TaskNumber = mst.S_WMS_NO; |
| | | MesNo = mst.S_MES_NO; |
| | | } |
| | | //粉料回库不需要回报 |
| | | if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X")) |
| | | { |
| | | LogHelper.Info("粉料回库不需要到位发送物料到位"); |
| | | return; |
| | | } |
| | | //获取时间戳 |
| | | var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); |
| | | //物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分 |
| | | statusarrive.RequestId = "杭叉AGV" + time + "1"; |
| | | statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs"; |
| | | request.RequestId = "杭叉AGV" + time + "1"; |
| | | request.UseToken = "iFQ5fExGrLYLXliHYWzs"; |
| | | |
| | | iteminfoArrive iteminfoArrive = new iteminfoArrive(); |
| | | iteminfoArrive.TaskNumber = TaskNumber; |
| | | iteminfoArrive.LocationNum = mst.S_END_LOC; |
| | | iteminfoArrive.Rfid = mst.S_CNTR_CODE; |
| | | iteminfoArrive.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd"); |
| | | MesItemBackModel mesItemBackModel = new MesItemBackModel(); |
| | | |
| | | mesItemBackModel.TaskNumber = MesNo; |
| | | mesItemBackModel.WmsTaskNumber = mst.S_WMS_NO; |
| | | mesItemBackModel.Rfid = mst.S_CNTR_CODE; |
| | | mesItemBackModel.LocationNum = mst.S_END_LOC; |
| | | mesItemBackModel.Result = "1"; |
| | | mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); |
| | | |
| | | if (cntritem != null) |
| | | { |
| | | lotLists.Add(new LotListh() { LotNumber = cntritem.S_BATCH_NO, Weight = double.Parse(cntritem.F_WEIGHT) }); |
| | | iteminfoArrive.PartDesc = cntritem.S_ITEM_NAME; |
| | | iteminfoArrive.PartNumber = cntritem.S_ITEM_CODE; |
| | | string curBagNum = null; |
| | | string weightBag = null; |
| | | string initBagNum = null; |
| | | if ((int)cntritem.F_QTY > 0) |
| | | { |
| | | curBagNum = cntritem.F_QTY.ToString(); |
| | | } |
| | | if (!string.IsNullOrEmpty(cntritem.F_WEIGHT1) && int.Parse(cntritem.F_WEIGHT1) > 0) |
| | | { |
| | | weightBag = cntritem.F_WEIGHT1; |
| | | } |
| | | if (!string.IsNullOrEmpty(cntritem.F_QTY1) && int.Parse(cntritem.F_QTY1) > 0) |
| | | { |
| | | initBagNum = cntritem.F_QTY1; |
| | | } |
| | | list.Add(new MesItemBackInfoModel() |
| | | { |
| | | |
| | | LotNumber = cntritem.S_BATCH_NO, |
| | | PartNumber = cntritem.S_ITEM_CODE, |
| | | Subpool = cntritem.Subpool, |
| | | ReceiveLot = cntritem.ReceiveLot, |
| | | Supplier = cntritem.S_SUPPLIER_NO, |
| | | TyreType = cntritem.TyreType, |
| | | ProduceTime = cntritem.D_PRD_DATE, |
| | | Rfid = cntritem.S_CNTR_CODE, |
| | | Qty = cntritem.F_WEIGHT, |
| | | PartLevel = cntritem.LEV, |
| | | WmsLot = cntritem.WmsLot, |
| | | WeightBag = weightBag, |
| | | CurBagNum = curBagNum, |
| | | InitBagNum = initBagNum |
| | | }); |
| | | |
| | | |
| | | } |
| | | iteminfoArrive.LotList = lotLists; |
| | | statusarrive.data = iteminfoArrive; |
| | | |
| | | mesItemBackModel.List = list; |
| | | request.data = mesItemBackModel; |
| | | |
| | | //任务上报 |
| | | 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); |
| | |
| | | { |
| | | LogHelper.Info($"物料到位回报失败=>msg:{result.imsg}"); |
| | | } |
| | | ApiHelper.AddInfo("Mes", "物料到位回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 创建搬运任务 |
| | | /// </summary> |
| | |
| | | return result; |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | |
| | | } |
| | | } |