zhaowc
2024-06-25 12341214acb7f387413e26057e22f3ca593b2f04
接口重新开发,添加创建生成任务类
4个文件已修改
349 ■■■■■ 已修改文件
Wms/Model/InterFaceModel/RCSModel.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllTransServer/RcsServer.cs 254 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllTransServer/IRcsServer.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/UpApiController.cs 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/RCSModel.cs
@@ -117,10 +117,10 @@
        public class Pallnetmsg
        {
            public string warehouseno { get; set; }
            public string type { get; set; }
            public string lotno { get; set; }
            public string palletno { get; set; }
            public string Location { get; set; }
            public string Type { get; set; }
            public string LotNo { get; set; }
            public string Palletno { get; set; }
            
        }
@@ -132,5 +132,34 @@
            public string endPos { get; set; }
            public string agvCode { get; set; }
        }
        public class ReMes
        {
            public string Success { get; set; }
            public string Result { get; set; }
            public string Message { get; set; }
        }
        public class TaskDetial
        {
            public string Taskno { get; set; }
            public string Startport { get; set; }
            public string Endport { get; set; }
            public string Pallno { get; set; }
            public string Type { get; set; }
            /// <summary>
            /// 任务类型
            /// 0:入库
            /// 1:出库
            /// </summary>
            public string Crtype { get; set; }
            /// <summary>
            /// 库存单据ID
            /// </summary>
            public int? Noticedetailno { get; set; }
        }
    }
}
Wms/WMS.BLL/BllTransServer/RcsServer.cs
@@ -6,9 +6,11 @@
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;
@@ -24,99 +26,134 @@
        /// <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;
            }
        }
@@ -125,16 +162,18 @@
        /// </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)
                        {
@@ -142,7 +181,12 @@
                        }
                        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)
                        {
@@ -150,7 +194,12 @@
                        }
                        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)
                        {
@@ -158,7 +207,7 @@
                        }
                        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)
                        {
@@ -166,7 +215,16 @@
                        }
                        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)
            {
@@ -186,10 +244,11 @@
        /// <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(),
@@ -215,14 +274,10 @@
                    //ctnrCode="2",
                };
                if (agv.startPos == "50")
                {
                    cbreq.ctnrTyp = "4";
                }
                cbrep = genAgvSchedulingTask(cbreq,url);
                
                return cbrep.code;
                return cbrep;
            }
            catch (Exception ex) { throw ex; }
        }
@@ -266,17 +321,66 @@
        /// </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;
            }
        }
Wms/WMS.IBLL/IBllTransServer/IRcsServer.cs
@@ -8,28 +8,20 @@
    public interface IRcsServer
    {
        /// <summary>
        /// RCS叫桶(净桶和脏桶)
        /// RCS叫桶
        /// </summary>
        /// <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);
        /// <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);
        /// <summary>
        /// 申请储位
        /// </summary>
        /// <param name="PalletNo"></param>
        /// <returns></returns>
        public void ApplyLocatNo(string palletno, string type, out string locatno);
        public void ApplyLocatNo(Pallnetmsg pallnetmsg);
        /// <summary>
        /// RCS生成任务
@@ -41,6 +33,6 @@
        /// <param name="agvCode"></param>
        /// <param name="url">RCS地址</param>
        /// <returns></returns>
        public string genAgvSchedulingTask(AgvTask agvtask, string url, ref genAgvSchedulingTaskRep cbrep);
        public genAgvSchedulingTaskRep genAgvSchedulingTask(AgvTask agvtask, string url);
    }
}
Wms/Wms/Controllers/UpApiController.cs
@@ -407,19 +407,16 @@
        [HttpPost]
        public IActionResult GetPalletNo(Pallnetmsg pallmsg)
        {
            var Pallnet = "";
            var locate = "";
            var result = new ErpModel { Success = -1, Message = "",};
            try
            {
                if (pallmsg.lotno != null)
                if (string.IsNullOrWhiteSpace(pallmsg.Location))
                {
                    _rcsserver.GetPalletNo(pallmsg.warehouseno, pallmsg.type, pallmsg.lotno, out Pallnet, out locate);
                    result.Message = "叫料位置为空!";
                    return Ok(result);
                }
                else
                {
                    _rcsserver.GetPalletNo(pallmsg.warehouseno, pallmsg.type, out Pallnet, out locate);
                }
                _rcsserver.GetPalletNo(pallmsg);
                
                result.Success = 0;
                result.Message = "叫桶成功!";
@@ -431,15 +428,15 @@
                return Ok(result);
            }
        }
        //RCS申请储位
        [HttpPost]
        public IActionResult ApplyLocatNo(Pallnetmsg pallmsg)
        {
            var lotno = "";
            var result = new ErpModel { Success = -1, Message = "" };
            try
            {
                _rcsserver.ApplyLocatNo(pallmsg.palletno,pallmsg.type, out lotno);
                _rcsserver.ApplyLocatNo(pallmsg);
                result.Success = 0;
                result.Message = "申请储位成功!";
                return Ok(result);
@@ -452,29 +449,6 @@
            }
        }
        //下发调度RCS任务
        //RCS申请储位
        [HttpPost]
        public IActionResult genAgvSchedulingTask(AgvTask agvtask)
        {
            var lotno = "";
            var url = "";
            genAgvSchedulingTaskRep chrep = new genAgvSchedulingTaskRep();
            var result = new ErpModel { Success = -1, Message = "" };
            try
            {
                _rcsserver.genAgvSchedulingTask(agvtask,url,ref chrep);
                result.Success = 0;
                result.Message = "申请储位成功!";
                return Ok(result);
            }
            catch (Exception e)
            {
                result.Message = e.Message;
                return Ok(result);
            }
        }
        //箱码信息 手持组托用 (赋码或追溯下发到wms)
        //质检结果下发接口