d1e9b4b34378bbee52b62c38f80ca678501e04cd..1ec3de8254a3dc8d77f01283ab4d85f52d446192
2025-05-09 wxw
Merge branch 'master' into wxw
1ec3de 对比 | 目录
2025-05-09 wxw
修改问题
2d5ac3 对比 | 目录
2025-04-29 wxw
修改问题
csc
62f643 对比 | 目录
2025-04-29 wxw
修改问题
98b5ce 对比 | 目录
5个文件已修改
254 ■■■■■ 已修改文件
Wms/Model/InterFaceModel/AgvModel.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Utility/Tools/RcsHelper.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllTransServer/HopperTransportServer.cs 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllTransServer/IHopperTransportServer.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/AgvModel.cs
@@ -192,9 +192,21 @@
    public class TaskDetial
    {
        /// <summary>
        /// 任务号
        /// </summary>
        public string Taskno { get; set; }
        /// <summary>
        /// 起始位置
        /// </summary>
        public string Startport { get; set; }
        /// <summary>
        /// 目标位置
        /// </summary>
        public string Endport { get; set; }
        /// <summary>
        /// 托盘号/桶号
        /// </summary>
        public string Pallno { get; set; }
        /// <summary>
@@ -209,4 +221,13 @@
        /// </summary>
        public string WareHouseNo { get; set; }
    }
    public class RCSCleanRequestModel
    {
        public string deviceID { get; set; }
        public string deviceStation { get; set; }
        public string status { get; set; }
    }
}
Wms/Utility/Tools/RcsHelper.cs
@@ -10,6 +10,14 @@
{
    public static class RcsHelper
    {
        /// <summary>
        /// 下发任务
        /// </summary>
        /// <param name="taskDetial">请求参数</param>
        /// <param name="url">请求地址</param>
        /// <param name="agvMsg">返回信息</param>
        /// <param name="priority">优先级</param>
        /// <returns></returns>
        public static bool CreateTaskForAgv(TaskDetial taskDetial, string url, out string agvMsg, string priority = null)
        {
            bool result = false;
@@ -48,17 +56,8 @@
            }
            else
            {
                string logMsg = "";
                if (taskDetial.Crtype == "1")//叫桶(桶出库)
                {
                    logMsg = "申请叫桶";
                }
                else if (taskDetial.Crtype == "0")//申请储位(桶入库)
                {
                    logMsg = "申请储位";
                }
                var logStr = $@".\log\AGV\AGV{logMsg}" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"AGV{logMsg}异常:( {agvModel.Message} ),", logStr);
                var logStr = $@".\log\AGV\下发给AGV转运命令" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                LogFile.SaveLogToFile($"下发给AGV转运命令异常:( {agvModel.Message} ),", logStr);
                agvMsg = agvModel.Message;
            }
Wms/WMS.BLL/BllTransServer/HopperTransportServer.cs
@@ -720,6 +720,178 @@
            }
        }
        /// <summary>
        /// 清洗机叫料状态
        /// </summary>
        /// <param name="deviceID">清洗机编号</param>
        /// <param name="deviceStation">叫料点位:”input”-入口(叫脏桶),”output”-出口(净桶申请储位)</param>
        /// <param name="status"></param>
        /// <exception cref="Exception"></exception>
        public void RCSCleanRequest(string deviceID,string deviceStation,string status,string url)
        {
            try
            {
                if (string.IsNullOrEmpty(deviceID))
                {
                    throw new Exception("清洗机编号不能为空");
                }
                if (status != "1")
                {
                    throw new Exception("非叫料状态");
                }
                //通过设备号查找到所属设备(区域)
                var deviceInfo = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.DeviceCode == deviceID);
                if (deviceInfo == null)
                {
                    throw new Exception("设备信息不存在");
                }
                var houseNo = deviceInfo.WareHouseNo;//叫桶设备所属车间编号
                var startLoction = new SysStorageLocat();//起始储位信息
                var endLoction = new SysStorageLocat();//目标储位信息
                var palletModel = new DataStockDetail();//分配桶信息
                //开启事务
                Db.BeginTran();
                //叫料点位
                switch (deviceStation)
                {
                    case "input"://叫脏桶
                        //叫桶设备所在储位信息(目标储位)
                        endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                        // 所有待分配的脏桶
                        var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.Status == "0" && w.PalletStatus == "3");
                        //优先查找脏桶缓存车间
                        palletModel = stockDetail.Where(w => w.AreaNo == "C43").OrderByDescending(o => o.UpdateTime).First();
                        if (palletModel == null)//脏桶缓存车间没有脏桶,再从三楼中间站脏桶区查找
                        {
                            palletModel = stockDetail.Where(w =>w.WareHouseNo=="M16" && w.AreaNo == "C26").OrderByDescending(o => o.UpdateTime).First();
                        }
                        if (palletModel == null)//三楼中间站脏桶区没有脏桶,再从四楼中间站脏桶区查找
                        {
                            palletModel = stockDetail.Where(w => w.WareHouseNo == "M01" && w.AreaNo == "C03").OrderByDescending(o => o.UpdateTime).First();
                        }
                        if (palletModel == null)
                        {
                            throw new Exception("无脏桶可分配");
                        }
                        //起始储位地址信息
                        startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.Status == "1" && w.LocatNo == palletModel.LocatNo);
                        if (startLoction == null)
                        {
                            throw new Exception($"起始目标储位信息不存在,桶号:{palletModel.LocatNo}");
                        }
                        break;
                    case "output"://净桶申请储位
                        //叫桶设备所在储位信息(起始储位)
                        startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                        //桶信息
                        palletModel = Db.Queryable<DataStockDetail>().Where(w => w.WareHouseNo==houseNo && w.AreaNo==deviceInfo.AreaNo && w.LocatNo==startLoction.LocatNo).First();
                        if (palletModel == null)
                        {
                            throw new Exception("未查询到净桶信息");
                        }
                        //分配储位
                        //优先分配四楼中间站净桶区
                        endLoction= Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == "M01" && w.AreaNo == "C01")
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        if (endLoction == null)//四楼中间站净桶区没有空储位,再从三楼中间站净桶区查找
                        {
                            endLoction = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == "M16" && w.AreaNo == "C24")
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        }
                        if (endLoction == null)//三楼中间站净桶区没有空储位,再从三楼清洗间缓存区查找
                        {
                            endLoction = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == "M44" && w.AreaNo == "C55")
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        }
                        if (endLoction == null)
                        {
                            throw new Exception("未查询到合适储位");
                        }
                        break;
                    default:
                        throw new Exception("叫料点位异常");
                }
                var taskNo = new Common().GetMaxNo("TK");
                //添加任务
                var logTaskEntry = new LogTask
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "RCS",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = "",//起始位置
                    EndLocat = endLoction.LocatNo,//目标位置
                    PalletNo = "",//托盘码
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                    CreateTime = DateTime.Now
                };
                Db.Insertable(logTaskEntry).ExecuteCommand();
                //组织下发小车任务信息
                var task = new TaskDetial
                {
                    Taskno = taskNo,//任务号
                    Startport = palletModel.LocatNo,//起始位置
                    Endport = endLoction.LocatNo,//目标位置
                    Pallno = palletModel.PalletNo,//桶号
                    Crtype = "1",//叫桶
                };
                string agvMsg = string.Empty;
                //给下车下发任务
                logTaskEntry.SendDate = DateTime.Now;//发送时间
                var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg);
                if (agvResult)//成功
                {
                    //请求成功修改任务表相应字段状态
                    logTaskEntry.IsSuccess = 1;
                    logTaskEntry.IsSend = 0;
                    //logTaskEntry.IsCancel = 0;
                    logTaskEntry.BackDate = DateTime.Now;
                    logTaskEntry.Status = "1";//正在执行
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                    startLoction.Status = "3";//出库中
                    Db.Updateable(startLoction).ExecuteCommand();
                    endLoction.Status = "2";//入库中
                    Db.Updateable(endLoction).ExecuteCommand();
                }
                else//失败
                {
                    logTaskEntry.IsSuccess = 0;
                    logTaskEntry.Information = agvMsg;
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                }
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        private bool YikuTask(string palletNo, string taskNo, string url)
        {
Wms/WMS.IBLL/IBllTransServer/IHopperTransportServer.cs
@@ -19,6 +19,13 @@
        void jiaoLiaoHopper(string areaNo, string endLocate, string plnStatus, string standard, string skuNo, string lotNo, string url, int userId);
        void jiaoCheHopper(string areaNo, string StartLocate, string plnNo, string plnStatus, decimal weight, string skuNo, string lotNo, string url, int userId);
        /// <summary>
        /// 清洗机叫料状态
        /// </summary>
        /// <param name="deviceID">清洗机编号</param>
        /// <param name="deviceStation">叫料点位:”input”-入口(叫脏桶),”output”-出口(净桶申请储位)</param>
        /// <param name="status"></param>
        /// <exception cref="Exception"></exception>
        void RCSCleanRequest(string deviceID, string deviceStation, string status, string url);
    }
}
Wms/Wms/Controllers/DownApiController.cs
@@ -1311,8 +1311,39 @@
                return Ok(new { data = "", code = 1, msg = e.Message });
            }
        }
        /// <summary>
        /// 清洗机叫料状态
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult RCSCleanRequest(RCSCleanRequestModel model)
        {
            var logStr = $@".\log\AGV\清洗机叫料" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            AgvResultModel resultModel = null;//返回信息
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"清洗机叫料-请求报文:( {jsonData} ),", logStr);
                //具体处理方法
                _hopper.RCSCleanRequest(model.deviceID,model.deviceStation,model.status, _config.AgvHost + _config.GenAgvSchedulingTask);
                resultModel = new AgvResultModel { code = "0", message = "请求成功!"};
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"清洗机叫料-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"清洗机叫料异常:( {e.Message} ),", logStr);
                resultModel = new AgvResultModel { code = "1", message = e.Message, data = "", reqCode = "" };
                var jsonData2 = JsonConvert.SerializeObject(resultModel);
                LogFile.SaveLogToFile($"清洗机叫料-返回报文:( {jsonData2} ),", logStr);
                return Ok(resultModel);
            }
        }
        #endregion
    }