| | |
| | | |
| | | public static object _Point = new object(); |
| | | /// <summary> |
| | | /// 入平库 |
| | | /// 点对点接口 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <param name="n_type">0:pda下发任务,5:mes下发任务</param> |
| | | /// <returns></returns> |
| | | internal static Result Point(PointModel model) |
| | | { |
| | | Result result = new Result() { code = "200", msg = "入平库任务下发成功" }; |
| | | string Source = "Mes"; |
| | | |
| | | |
| | | if (model == null) |
| | | { |
| | | result.code = "1"; |
| | |
| | | AddErrorInfo("参数为空", result.msg, Source); |
| | | return result; |
| | | } |
| | | //1.出平库,2入平库,3平库空工装呼叫,4平库余料回库,5粉料空托返回。 |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | Location loc = null; |
| | | string type = ""; |
| | | Location startloc = null; |
| | | Location endloc = null; |
| | | switch (model.Status) |
| | | { |
| | | case "1": |
| | | type = "出平库"; |
| | | break; |
| | | case "2": |
| | | type = "入平库"; |
| | | break; |
| | | case "3": |
| | | type = "平库空工装呼叫"; |
| | | break; |
| | | case "4": |
| | | type = "平库余料回库"; |
| | | break; |
| | | case "5": |
| | | type = "粉料空托返回"; |
| | | break; |
| | | } |
| | | if (string.IsNullOrEmpty(type)) |
| | | { |
| | | result.code = "1"; |
| | | result.msg = $"任务类型{model.Status},不在规定范围"; |
| | | AddErrorInfo("任务类型错误", result.msg, Source); |
| | | return result; |
| | | } |
| | | |
| | | string Start = model.InitialLocation; //起点货位 |
| | | string itemcode = model.PartNumber; //物料编码 |
| | | string areacode = ""; |
| | | try |
| | | { |
| | | lock (_Putin) |
| | | lock (_Point) |
| | | { |
| | | #region 入库检查托盘物料表有无数据 |
| | | var cntritem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == model.Rfid).First(); |
| | | if (cntritem == null) |
| | | startloc = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == model.InitialLocation).First(); |
| | | if (startloc == null) |
| | | { |
| | | result.code = "1"; |
| | | result.msg = $"创建任务失败,托盘:{model.Rfid}无绑定物料数据"; |
| | | LogHelper.Info($"ItemBack:{result.msg}"); |
| | | AddErrorInfo("托盘绑定物料数据为空", result.msg, Source); |
| | | result.msg = $"根据起点{model.InitialLocation},找不到对应货位,请检查货位表"; |
| | | AddErrorInfo("货位查找失败", result.msg, Source); |
| | | return result; |
| | | } |
| | | #endregion |
| | | |
| | | #region 判断托盘绑定货位是否和下发绑定起点相同,如果没绑定托盘则绑定托盘 |
| | | var CntrLoc = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE.Trim() == model.Rfid).First(); |
| | | if (CntrLoc != null) |
| | | { |
| | | if (CntrLoc.S_LOC_CODE != Start) |
| | | { |
| | | |
| | | result.code = "1"; |
| | | result.msg = $"创建任务失败,托盘:{model.Rfid}绑定位置不是起点:{Start}"; |
| | | LogHelper.Info($"ItemBack:{result.msg}"); |
| | | AddErrorInfo("托盘绑定位置不同", result.msg, Source); |
| | | return result; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LocationHelper.BindingLoc(Start, new List<string> { model.Rfid }); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 根据起点货位的仓库编码 获取平库编码,并计算入库货位 |
| | | string End = ""; |
| | | var startloc = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == Start).First(); |
| | | if (startloc != null) |
| | | { |
| | | //根据仓库 计算库区 |
| | | var whcode = Settings.wareLoc.Where(a => a.AreaCode == startloc.S_WH_CODE).FirstOrDefault(); |
| | | if (whcode != null) |
| | | //判断起点是否绑定其他托盘 |
| | | var CntrRel = LocationHelper.GetLocCntrRel(startloc.S_CODE).OrderBy(a => a.T_CREATE).FirstOrDefault(); |
| | | if (CntrRel != null) |
| | | { |
| | | areacode = whcode.PMK; |
| | | if (CntrRel.S_CNTR_CODE != model.Rfid) |
| | | { |
| | | result.code = "1"; |
| | | result.msg = $"根据起点:{model.InitialLocation}获取托盘:{CntrRel.S_CNTR_CODE}与下发托盘:{model.Rfid}不一致,请检查托盘码是否正确"; |
| | | AddErrorInfo("托盘码校检失败", result.msg, Source); |
| | | return result; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | result.code = "1"; |
| | | result.msg = $"根据起点仓库编码:{startloc.S_WH_CODE}未找到对应配置文件"; |
| | | LogHelper.Info($"Putin==> {result.msg}"); |
| | | AddErrorInfo("查找库区失败", result.msg, Source); |
| | | return result; |
| | | } |
| | | |
| | | |
| | | loc = StorageCompute(itemcode, areacode); |
| | | |
| | | if (loc != null) |
| | | { |
| | | End = loc.S_CODE; |
| | | } |
| | | else |
| | | { |
| | | |
| | | result.code = "1"; |
| | | result.msg = $"库区:{areacode}无可用货位"; |
| | | LogHelper.Info($"Putin==> {result.msg}"); |
| | | AddErrorInfo("查找库区失败", result.msg, Source); |
| | | return result; |
| | | LocationHelper.BindingLoc(startloc.S_CODE, new List<string> { model.Rfid }); |
| | | } |
| | | } |
| | | else |
| | | endloc = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == model.TargetLocation).First(); |
| | | if (endloc == null) |
| | | { |
| | | |
| | | result.code = "1"; |
| | | result.msg = $"任务起点:{Start}找不到对应货位,请检查货位表"; |
| | | LogHelper.Info($"Putin==> {result.msg}"); |
| | | AddErrorInfo("查找货位失败", result.msg, Source); |
| | | result.msg = $"根据终点{model.TargetLocation},找不到对应货位,请检查货位表"; |
| | | AddErrorInfo("货位查找失败", result.msg, Source); |
| | | return result; |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | #region 创建任务 |
| | | if (!string.IsNullOrEmpty(Start) && !string.IsNullOrEmpty(End)) |
| | | if (endloc != null && startloc != null) |
| | | { |
| | | if (startloc.N_LOCK_STATE != 0) |
| | | { |
| | | result.code = "1"; |
| | | result.msg = $"创建任务失败,起点:{Start}有锁"; |
| | | result.msg = $"创建任务失败,起点:{startloc.S_CODE}有锁"; |
| | | AddErrorInfo("货位有锁", result.msg, Source); |
| | | return result; |
| | | } |
| | |
| | | var wcsTask = new WCSTask |
| | | { |
| | | S_CODE = WCSHelper.GenerateTaskNo(), |
| | | S_TYPE = "入平库", |
| | | S_TYPE = type, |
| | | S_EQ_NO = model.TaskNumber, |
| | | S_START_LOC = Start, |
| | | S_END_LOC = End, |
| | | S_START_LOC = startloc.S_CODE, |
| | | S_END_LOC = endloc.S_CODE, |
| | | S_START_WH = startloc.S_WH_CODE, |
| | | S_START_AREA = startloc.S_AREA_CODE, |
| | | S_END_WH = loc.S_WH_CODE, |
| | | S_END_AREA = loc.S_AREA_CODE, |
| | | S_END_WH = endloc.S_WH_CODE, |
| | | S_END_AREA = endloc.S_AREA_CODE, |
| | | N_CNTR_COUNT = 1, |
| | | N_SCHEDULE_TYPE = 1, |
| | | S_CNTR_CODE = model.Rfid, |
| | | N_START_LAYER = 1, |
| | | N_END_LAYER = 1, |
| | | N_PRIORITY = 1, |
| | | Z_TYPE = n_type |
| | | Z_TYPE = 5 |
| | | }; |
| | | LogHelper.Info("创建入平库任务:" + JsonConvert.SerializeObject(wcsTask)); |
| | | LogHelper.Info("创建点对点任务:" + JsonConvert.SerializeObject(wcsTask)); |
| | | if (WCSHelper.CreateTask(wcsTask)) |
| | | { |
| | | //LocationHelper.LockLoc(Start, 2); |
| | | //LocationHelper.LockLoc(End, 1); |
| | | if (type == "平库余料回库") |
| | | { //创建任务成功 更新余料信息 |
| | | var CntrItem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == model.Rfid).First(); |
| | | if (CntrItem != null) |
| | | { |
| | | CntrItem.F_WEIGHT = model.Weight.ToString(); |
| | | CntrItem.S_BS_TYPE = "余料"; |
| | | //CntrItem.F_QTY = float.Parse(model.qty); |
| | | //CntrItem.S_ITEM_STATE = model..QualityStatus; |
| | | |
| | | db.Updateable(CntrItem).UpdateColumns(a => new { a.F_WEIGHT, a.S_BS_TYPE }).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | LocationHelper.LockLoc(startloc.S_CODE, 2); |
| | | LocationHelper.LockLoc(endloc.S_CODE, 1); |
| | | LogHelper.Info("创建任务成功"); |
| | | } |
| | | else |
| | |
| | | var db = new SqlHelper<HangChaAGV>().GetInstance(); |
| | | DeviceInfoModel device = new DeviceInfoModel(); |
| | | |
| | | List<DeviceInfos> deviceInfos = new List<DeviceInfos>();//叠盘机报错信息 |
| | | // List<DeviceInfos> deviceInfos = new List<DeviceInfos>();//叠盘机报错信息 |
| | | // List<AgvInfos> agvInfos = new List<AgvInfos>();//agv报错信息 |
| | | |
| | | //获取内存中叠盘机的报错信息 |
| | | foreach (var dpjInfo in DeviceProcess.DpjInfoDirectory) |
| | | { |
| | | deviceInfos.Add(new DeviceInfos() { Device = dpjInfo.Value.DeviceName, DeviceInfo = dpjInfo.Value.ErrorInfo }); |
| | | } |
| | | //foreach (var dpjInfo in DeviceProcess.DpjInfoDirectory) |
| | | //{ |
| | | // deviceInfos.Add(new DeviceInfos() { Device = dpjInfo.Value.DeviceName, DeviceInfo = dpjInfo.Value.ErrorInfo }); |
| | | //} |
| | | // device.DeviceInfos = deviceInfos; |
| | | //获取车辆报警信息 |
| | | var agvDeviceInfo = db.Queryable<HangChaAGV>().ToList(); |
| | |
| | | device.AgvQty = agvDeviceInfo.Count; |
| | | device.AgvErrorQty = agvDeviceInfo.FindAll(a => a.agvErrCode != "0" || int.Parse(a.errCode2) > 1 || int.Parse(a.faildCode) > 1).Count; |
| | | device.AgvChargeQty = agvDeviceInfo.FindAll(a => a.errCode2 == "1").Count; |
| | | device.AgvRunQty = agvDeviceInfo.FindAll(a => a.agvErrCode == "0"&& a.errCode2 == "0" && a.faildCode == "1").Count; |
| | | foreach (var agv in agvDeviceInfo) |
| | | { |
| | | string agvErrorInfo = GetAgvAlarmSendCodeTwo(agv.agvNo, agv.agvErrCode, agv.errCode2, agv.faildCode); |
| | | deviceInfos.Add(new DeviceInfos() { AgvNo = agv.agvNo, AgvInfo = agvErrorInfo }); |
| | | } |
| | | device.AgvRunQty = agvDeviceInfo.FindAll(a => a.agvErrCode == "0" && a.errCode2 == "0" && a.faildCode == "1").Count; |
| | | //foreach (var agv in agvDeviceInfo) |
| | | //{ |
| | | // string agvErrorInfo = GetAgvAlarmSendCodeTwo(agv.agvNo, agv.agvErrCode, agv.errCode2, agv.faildCode); |
| | | // deviceInfos.Add(new DeviceInfos() { AgvNo = agv.agvNo, AgvInfo = agvErrorInfo }); |
| | | //} |
| | | } |
| | | device.DeviceInfos = deviceInfos; |
| | | // device.DeviceInfos = deviceInfos; |
| | | |
| | | return device; |
| | | } |