| | |
| | | using System.Linq; |
| | | using System.Text; |
| | | using Utility.Tools; |
| | | using WMS.DAL; |
| | | using WMS.Entity.BllAsnEntity; |
| | | using WMS.Entity.Context; |
| | | using WMS.Entity.DataEntity; |
| | | using WMS.Entity.LogEntity; |
| | | using WMS.Entity.SysEntity; |
| | | using WMS.IBLL.IBllTransServer; |
| | | using static Model.InterFaceModel.RCSModel; |
| | |
| | | /// <param name="warehouseno">库区</param> |
| | | /// <param name="type">叫料类型</param> |
| | | /// <returns></returns> |
| | | public void GetPalletNo(string warehouseno, string type, out string palletno, out string locatno) |
| | | public void GetPalletNo(Pallnetmsg pallnetmsg) |
| | | { |
| | | var sql = "select LocatNo,palletno from SysStorageLocat where status = '1'"; |
| | | SysStorageLocat pallet = new SysStorageLocat(); |
| | | DataStockDetail pallet = new DataStockDetail(); |
| | | SysStorageLocat locat = new SysStorageLocat(); |
| | | try |
| | | { |
| | | switch (type) |
| | | var house = "W01";//叫桶位置,后续根据位置关联或定义,来判断叫桶位置所属车间 |
| | | var url = "";//回传MES的接口地址 |
| | | var noticeno = ""; |
| | | var sql = "select PalletNo,LocatNo from DataStockDetail where Status = '0'"; |
| | | switch (pallnetmsg.Type) |
| | | { |
| | | case "0"://叫净桶 |
| | | sql += $"and WareHouseNo = 'A01' and WareHouseNo = '{warehouseno}' order by updatetime desc"; |
| | | pallet = Db.Ado.SqlQuery<SysStorageLocat>(sql).FirstOrDefault(); |
| | | if (pallet == null) |
| | | List<DataStockDetail> jtpallet = new List<DataStockDetail>(); |
| | | sql += $"and WareHouseNo = '{house}' and AreaNo like '%01' order by CreateTime desc"; |
| | | jtpallet = Db.Ado.SqlQuery<DataStockDetail>(sql).ToList(); |
| | | if (jtpallet.Count == 0) |
| | | { |
| | | throw new Exception("暂无净桶可分配"); |
| | | } |
| | | break; |
| | | case "3"://叫脏桶 |
| | | sql += $"and WareHouseNo = 'A04' and WareHouseNo = '{warehouseno}' order by updatetime desc"; |
| | | pallet = Db.Ado.SqlQuery<SysStorageLocat>(sql).FirstOrDefault(); |
| | | if (pallet == null) |
| | | //遍历库存净桶,返回MES验证 |
| | | foreach (var item in jtpallet) |
| | | { |
| | | throw new Exception("暂无脏桶可分配"); |
| | | string jsonReq = JsonConvert.SerializeObject(item.PalletNo); |
| | | var response = HttpHelper.DoPost(url, jsonReq, "回传MES净桶编号", "RCS").ToString(); |
| | | var obj = JsonConvert.DeserializeObject<ReMes>(response);//解析返回数据 |
| | | if (obj.Success == "0") |
| | | { |
| | | if (obj.Result != "0")//可用,生成小车拉净桶任务 |
| | | { |
| | | //查找是否有空余脏桶位 |
| | | sql = $"select LocatNo from SysStorageLocat where AreaNo like '%04' and WareHouseNo = wareno and Status = 0"; |
| | | locat = Db.Ado.SqlQuery<SysStorageLocat>(sql).FirstOrDefault(); |
| | | if (locat == null) |
| | | { |
| | | Db.Ado.BeginTran(); |
| | | //脏桶区无空余库位,则锁定此净桶库存,并重新遍历 |
| | | sql = $"UPDATE DataStockDetail Set Status = '5' Where locat ='{locat.LocatNo}'"; |
| | | Db.Ado.ExecuteCommand(sql); |
| | | Db.Ado.CommitTran(); |
| | | break; |
| | | } |
| | | //生成调度小车净桶去脏桶区任务 |
| | | var ztask = new TaskDetial |
| | | { |
| | | Startport = item.LocatNo, |
| | | Endport = locat.LocatNo, |
| | | Pallno = pallnetmsg.Palletno, |
| | | Type = "4", |
| | | Crtype = "0", |
| | | Noticedetailno = int.Parse(noticeno), |
| | | }; |
| | | CreateLotTask(ztask); |
| | | return; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | throw new Exception("回传MES净桶编号失败!"); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | palletno = pallet.PalletNo; |
| | | locatno = pallet.LocatNo; |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// RCS叫桶(混料桶和下料桶) |
| | | /// </summary> |
| | | /// <param name="warehouseno">库区</param> |
| | | /// <param name="type">叫料类型</param> |
| | | /// <param name="lotno">叫料批次</param> |
| | | /// <returns></returns> |
| | | public void GetPalletNo(string warehouseno, string type, string lotno, out string palletno, out string locatno) |
| | | { |
| | | var sql = ""; |
| | | var pallet = ""; |
| | | DataStockDetail SoMes = new DataStockDetail(); |
| | | try |
| | | { |
| | | switch (type) |
| | | { |
| | | case "1"://叫料桶(混料) |
| | | //判断是否有批次号 |
| | | if (string.IsNullOrWhiteSpace(pallnetmsg.LotNo)) |
| | | { |
| | | throw new Exception("批次号为空!"); |
| | | } |
| | | BllArrivalNoticeDetail ArriveMes = new BllArrivalNoticeDetail(); |
| | | //判断该批次是否有对应入库单 |
| | | sql += $"select * from BllArrivalNoticeDetail where LotNo = '{lotno}' order by CreateTime desc"; |
| | | sql = $"select * from BllArrivalNoticeDetail where LotNo = '{pallnetmsg.LotNo}' order by CreateTime desc"; |
| | | ArriveMes = Db.Ado.SqlQuery<BllArrivalNoticeDetail>(sql).FirstOrDefault(); |
| | | if (ArriveMes == null) |
| | | { |
| | | throw new Exception("该批次没有对应的入库单"); |
| | | } |
| | | //查找库存中是否有可用的此批次的混料桶 |
| | | sql = $"select LocatNo,palletno from DataStockDetail " + |
| | | $"left join SysStorageLocat b on a.LocatNo = b.LocatNo " + |
| | | $"where a.LotNo = '{lotno}'and a.WareHouseNo = '{warehouseno}' and b.status = '1' " + |
| | | sql += $"where a.LotNo = '{pallnetmsg.LotNo}'and AreaNo like '%02' and a.WareHouseNo = '{house}' and b.status = '0' " + |
| | | $"order by CompleteTime desc"; |
| | | SoMes = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault(); |
| | | pallet = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault(); |
| | | if (pallet == null) |
| | | { |
| | | throw new Exception("暂无混料桶可分配"); |
| | | } |
| | | |
| | | break; |
| | | case "2"://叫料桶(下料) |
| | | //判断是否有批次号 |
| | | if (string.IsNullOrWhiteSpace(pallnetmsg.LotNo)) |
| | | { |
| | | throw new Exception("批次号为空!"); |
| | | } |
| | | //查找库存中是否有此批次的下料桶 |
| | | sql = $"select LocatNo,palletno from DataStockDetail" + |
| | | $"left join SysStorageLocat b on a.LocatNo = b.LocatNo " + |
| | | $"where a.LotNo = '{lotno}'and a.WareHouseNo = '{warehouseno}' and b.status = '1'" + |
| | | $" order by CompleteTime desc"; |
| | | SoMes = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault(); |
| | | sql += $"where a.LotNo = '{pallnetmsg.LotNo}'and AreaNo like '%03' and a.WareHouseNo = '{house}' and b.status = '0' " + |
| | | $"order by CompleteTime desc"; |
| | | pallet = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault(); |
| | | if (pallet == null) |
| | | { |
| | | throw new Exception("暂无下料桶可分配"); |
| | | } |
| | | |
| | | break; |
| | | case "3"://叫脏桶 |
| | | sql += $"and WareHouseNo = '{house}' and AreaNo like '%04' order by CreateTime desc"; |
| | | pallet = Db.Ado.SqlQuery<DataStockDetail>(sql).FirstOrDefault(); |
| | | if (pallet == null) |
| | | { |
| | | throw new Exception("暂无脏桶可分配"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | palletno = SoMes.PalletNo; |
| | | locatno = SoMes.LocatNo; |
| | | |
| | | //下发小车任务 |
| | | var task = new TaskDetial |
| | | { |
| | | Startport = pallnetmsg.Location, |
| | | Endport = pallet.LocatNo, |
| | | Pallno = pallnetmsg.Palletno, |
| | | Type = pallnetmsg.Type, |
| | | Crtype = "1", |
| | | Noticedetailno = int.Parse(noticeno), |
| | | }; |
| | | CreateLotTask(task); |
| | | } |
| | | catch (Exception) |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | throw; |
| | | Db.Ado.RollbackTran(); |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | |
| | | /// </summary> |
| | | /// <param name="PalletNo"></param> |
| | | /// <returns></returns> |
| | | public void ApplyLocatNo(string palletno, string type, out string locatno) |
| | | public void ApplyLocatNo(Pallnetmsg pallnetmsg) |
| | | { |
| | | var sql = $"select LocatNo from SysStorageLocat where status = '0'"; |
| | | var house = "W01";//……叫桶位置,后续根据位置关联或定义,来判断叫桶位置所属车间 |
| | | var noticeno = ""; |
| | | SysStorageLocat loction = new SysStorageLocat(); |
| | | try |
| | | { |
| | | switch (type) |
| | | switch (pallnetmsg.Type) |
| | | { |
| | | case "0"://净桶申请储位 |
| | | sql += $"and WareHouseNo = 'A01'"; |
| | | sql += $"and AreaNo like '%01' and WareHouseNo = {house}"; |
| | | loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault(); |
| | | if (loction == null) |
| | | { |
| | |
| | | } |
| | | break; |
| | | case "1"://混料桶申请储位 |
| | | sql += $"and WareHouseNo = 'A02'"; |
| | | //判断是否有批次号 |
| | | if (string.IsNullOrWhiteSpace(pallnetmsg.LotNo)) |
| | | { |
| | | throw new Exception("批次号为空!"); |
| | | } |
| | | sql += $"and AreaNo like '%02' and WareHouseNo = {house}"; |
| | | loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault(); |
| | | if (loction == null) |
| | | { |
| | |
| | | } |
| | | break; |
| | | case "2"://半成品桶申请储位 |
| | | sql += $"and WareHouseNo = 'A03'"; |
| | | //判断是否有批次号 |
| | | if (string.IsNullOrWhiteSpace(pallnetmsg.LotNo)) |
| | | { |
| | | throw new Exception("批次号为空!"); |
| | | } |
| | | sql += $"and AreaNo like '%03' and WareHouseNo = {house}"; |
| | | loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault(); |
| | | if (loction == null) |
| | | { |
| | |
| | | } |
| | | break; |
| | | case "3"://脏桶申请储位 |
| | | sql += $"and WareHouseNo = 'A04'"; |
| | | sql += $"and AreaNo like '%04' and WareHouseNo = {house}"; |
| | | loction = Db.Ado.SqlQuery<SysStorageLocat>(sql).OrderByDescending(a => a.CreateTime).FirstOrDefault(); |
| | | if (loction == null) |
| | | { |
| | |
| | | } |
| | | break; |
| | | } |
| | | locatno = loction.PalletNo; |
| | | var task = new TaskDetial |
| | | { |
| | | Startport = pallnetmsg.Location, |
| | | Endport = loction.LocatNo, |
| | | Pallno = pallnetmsg.Palletno, |
| | | Type = pallnetmsg.Type, |
| | | Crtype = "1", |
| | | Noticedetailno = int.Parse(noticeno), |
| | | }; |
| | | CreateLotTask(task); |
| | | } |
| | | catch (Exception) |
| | | { |
| | |
| | | /// <param name="agvCode"></param> |
| | | /// <param name="url">RCS地址</param> |
| | | /// <returns></returns> |
| | | public string genAgvSchedulingTask(AgvTask agv,string url, ref genAgvSchedulingTaskRep cbrep) |
| | | public genAgvSchedulingTaskRep genAgvSchedulingTask(AgvTask agv,string url) |
| | | { |
| | | try |
| | | { |
| | | genAgvSchedulingTaskRep cbrep = new genAgvSchedulingTaskRep(); |
| | | PositionCodePath pcd1 = new PositionCodePath() |
| | | { |
| | | positionCode = agv.startPos.ToString(), |
| | |
| | | //ctnrCode="2", |
| | | |
| | | }; |
| | | if (agv.startPos == "50") |
| | | { |
| | | cbreq.ctnrTyp = "4"; |
| | | } |
| | | cbrep = genAgvSchedulingTask(cbreq,url); |
| | | |
| | | |
| | | return cbrep.code; |
| | | return cbrep; |
| | | } |
| | | catch (Exception ex) { throw ex; } |
| | | } |
| | |
| | | /// </summary> |
| | | /// <param name="req"></param> |
| | | /// <returns></returns> |
| | | public void CreateLotTask(string startport,string endport,string type,string tasktype) |
| | | public void CreateLotTask(TaskDetial taskDetial) |
| | | { |
| | | try |
| | | { |
| | | |
| | | |
| | | var na = taskDetial.Crtype == "0"?"入库":"出库"; |
| | | var sql = ""; |
| | | //开启事务 |
| | | Db.BeginTran(); |
| | | //判断任务是否为新任务 |
| | | if (string.IsNullOrWhiteSpace(taskDetial.Taskno)) |
| | | { |
| | | taskDetial.Taskno = new Common().GetMaxNo("T"); |
| | | |
| | | var logTaskEntry = new LogTask |
| | | { |
| | | TaskNo = taskDetial.Taskno, |
| | | Sender = "WMS", |
| | | Receiver = "RCS", |
| | | //IsSuccess = 1, //是否下发成功 0失败 1成功 |
| | | SendDate = DateTime.Now, //发送时间 |
| | | //BackDate = DateTime.Now, //返回时间 |
| | | StartLocat = taskDetial.Startport,//起始位置 |
| | | EndLocat = taskDetial.Endport,//目标位置 |
| | | PalletNo = taskDetial.Pallno,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = taskDetial.Crtype,//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | NoticeDetailNo = int.Parse(taskDetial.Noticedetailno.ToString()), |
| | | Msg = $"{taskDetial.Endport}的{na}任务", //关键信息 |
| | | }; |
| | | Db.Insertable(logTaskEntry).ExecuteCommand(); |
| | | } |
| | | var Agv = new AgvTask |
| | | { |
| | | taskCode = taskDetial.Taskno, |
| | | taskType = taskDetial.Type, |
| | | startPos = taskDetial.Startport, |
| | | endPos = taskDetial.Endport, |
| | | agvCode = "1",//……需要和AGV确认此字段值 |
| | | }; |
| | | //请求小车 |
| | | genAgvSchedulingTaskRep chrep =genAgvSchedulingTask(Agv, "url"); |
| | | if (chrep.code != "0") |
| | | { |
| | | sql = $"UPDATE LogTask SET IsSuccess = '0' WHERE TaskNo = {taskDetial.Taskno}"; |
| | | Db.Ado.ExecuteCommand(sql); |
| | | Db.CommitTran(); |
| | | throw new Exception("RCS任务下发错误,RCS返回消息:"+chrep.message); |
| | | } |
| | | sql = $"UPDATE LogTask SET IsSuccess = 1,BackDate = {DateTime.Now},Status = '1' WHERE TaskNo = {taskDetial.Taskno}"; |
| | | Db.Ado.ExecuteCommand(sql); |
| | | //提交事务 |
| | | Db.CommitTran(); |
| | | } |
| | | catch (Exception) |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | throw; |
| | | Db.RollbackTran(); |
| | | throw ex; |
| | | } |
| | | |
| | | } |