dengjunjie
2026-02-27 b6a82cb656a6cd045d772274ae927c8ca2c22b06
优化四向车入库任务
已修改10个文件
267 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/StationMangerService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IStationMangerService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/KLSTaskMethods.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RGVTaskMethods.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/RGVTaskExtend.cs 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskExtend.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskJob.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/StationMangerService.cs
@@ -24,5 +24,9 @@
        {
            return BaseDal.QueryFirst(x => x.StationCode == fromLocationCode && x.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt());
        }
        public Dt_StationManger GetOutStationInfo(string stationCode)
        {
            return BaseDal.QueryFirst(x => x.StationCode == stationCode && x.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt());
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -41,32 +41,8 @@
        /// </summary>
        [Description("完成")]
        Finish,
        /// <summary>
        /// å¤–形检测中
        /// </summary>
        [Description("外形检测中")]
        CheckShapeing,
        /// <summary>
        /// å¤–形检测成功
        /// </summary>
        [Description("外形检测成功")]
        CheckShapeingOk,
        /// <summary>
        /// å¤–形检测失败
        /// </summary>
        [Description("外形检测失败")]
        CheckShapeingNG,
        /// <summary>
        /// æ‰˜ç›˜å·ç¡®è®¤ä¸­
        /// </summary>
        [Description("托盘号确认中")]
        CheckPalletCodeing,
        /// <summary>
        /// AGV待继续执行
        /// </summary>
        [Description("AGV待继续执行")]
        AGV_WaitToExecute,
        #region å‡¯ä¹å£«AGV其他任务状态
@@ -120,11 +96,40 @@
        #endregion
        #region æµ·åº·AGV其他任务状态
        /// <summary>
        /// æ‰˜ç›˜å·ç¡®è®¤ä¸­
        /// </summary>
        [Description("托盘号确认中")]
        CheckPalletCodeing,
        /// <summary>
        /// AGV待继续执行
        /// </summary>
        [Description("AGV待继续执行")]
        AGV_WaitToExecute,
        #endregion
        #region å››å‘车其他任务状态
        /// <summary>
        /// å¤–形检测中
        /// </summary>
        [Description("外形检测中")]
        CheckShapeing,
        /// <summary>
        /// å¤–形检测成功
        /// </summary>
        [Description("外形检测成功")]
        CheckShapeingOk,
        /// <summary>
        /// å¤–形检测失败
        /// </summary>
        [Description("外形检测失败")]
        CheckShapeingNG,
        /// <summary>
        /// å¾…移库后执行
        /// </summary>
        [Description("待移库后执行")]
        RGV_WaitMoveToExecute,
        #endregion
    }
    public enum TaskInStatusEnum
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -49,6 +49,12 @@
        /// </summary>
        [Description("裁剪出库")]
        CJOutbound,
        /// <summary>
        /// æˆå“ç§»åº“
        /// </summary>
        [Description("成品移库")]
        CPMoveInventory,
    }
    public enum TaskInboundTypeEnum
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IStationMangerService.cs
@@ -18,5 +18,11 @@
        /// <param name="fromLocationCode"></param>
        /// <returns></returns>
        Dt_StationManger GetInStationInfo(string fromLocationCode);
        /// <summary>
        /// èŽ·å–å‡ºåº“ç«™å°
        /// </summary>
        /// <param name="fromLocationCode"></param>
        /// <returns></returns>
        Dt_StationManger GetOutStationInfo(string fromLocationCode);
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -123,7 +123,7 @@
        [ImporterHeader(Name = "异常信息")]
        [ExporterHeader(DisplayName = "异常信息")]
        [SugarColumn(IsNullable = true, Length = 500, ColumnDescription = "异常信息")]
        public string? ExceptionMessage { get; set; }
        public string ExceptionMessage { get; set; }
        /// <summary>
        /// ä¼˜å…ˆçº§
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/KLSTaskMethods.cs
@@ -67,10 +67,9 @@
        {
            try
            {
                Dt_KLSLocationInfo? kLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == taskDTO.fromLocationCode);
                if (kLSLocationInfo == null) throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!");
                Dt_KLSLocationInfo? kLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == taskDTO.fromLocationCode) ?? throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!");
                if (kLSLocationInfo.LocationStatus != LocationStatusEnum.InStock.ObjToInt()) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】当前库位状态不可出库!");
                Dt_Task dt_Task = new Dt_Task()
                Dt_Task dt_Task = new()
                {
                    TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    WMSTaskNum = taskDTO.taskCode,
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RGVTaskMethods.cs
@@ -72,8 +72,30 @@
        {
            try
            {
                //Dt_Task dt_Task = BaseDal.QueryFirst(x => x.PalletCode == taskDTO.containerCode);
                //if (dt_Task != null) throw new Exception($"托盘号【{taskDTO.containerCode}】已存在任务");
                Dt_RGVLocationInfo rGVLocationInfo = _rGVLocationInfoService.Repository.QueryFirst(x => x.LocationCode == taskDTO.fromLocationCode) ?? throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!");
                if (rGVLocationInfo.LocationStatus != LocationStatusEnum.InStock.ObjToInt()) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】当前库位状态不可出库!");
                Dt_Task dt_Task = new()
                {
                    TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    WMSTaskNum = taskDTO.taskCode,
                    //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    Grade = taskDTO.taskPriority,
                    PalletCode = taskDTO.containerCode,
                    Roadway = rGVLocationInfo.RoadwayNo,
                    TaskState = TaskStatusEnum.New.ObjToInt(),
                    TaskType = taskType,
                    SourceAddress = taskDTO.fromLocationCode,
                    CurrentAddress = taskDTO.fromLocationCode,
                    NextAddress = taskDTO.toLocationCode,
                    TargetAddress = taskDTO.toLocationCode,
                    Creater = "WMS",
                };
                rGVLocationInfo.LocationStatus = LocationStatusEnum.OutLock.ObjToInt();
                Db.Ado.BeginTran();
                BaseDal.AddData(dt_Task);
                _rGVLocationInfoService.Repository.UpdateData(rGVLocationInfo);
                Db.Ado.CommitTran();
                return WebResponseContent.Instance.OK();
            }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/RGVTaskExtend.cs
@@ -50,8 +50,33 @@
                var outtasks = tasks.Where(x => x.TaskType == (int)TaskTypeEnum.CPOutbound).ToList();
                foreach (var item in outtasks)
                {
                    ///判断是否需要移库
                    ///判断是否需要移库,出库站台是否空闲
                    if (IsNoMoveTask(item) && StationIsFree(item.TargetAddress))
                    {
                        #region ä¸‹å‘出库任务
                        fOURBOTnewMovePodTask.priority = item.Grade;
                        fOURBOTnewMovePodTask.podID = item.PalletCode;
                        fOURBOTnewMovePodTask.destination = item.NextAddress;
                        fOURBOTnewMovePodTask.desExt = new
                        {
                            unload = 1//是否放下容器,0否1是
                        };
                        fOURBOTnewMovePodTask.desType = 2;
                        string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
                        FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                        if (fOURBOTReturn.returnCode == 0)
                        {
                            item.RGVTaskId = fOURBOTReturn.data.taskID;
                            item.TaskState = (int)TaskStatusEnum.Execut;
                        }
                        #endregion
                    }
                    else
                    {
                        item.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute;
                    }
                }
                _taskService.UpdateData(outtasks);
                #endregion
            }
            catch (Exception ex)
@@ -60,6 +85,8 @@
            }
        }
        #endregion
        #region ä¸‹å‘外形检测成功任务
        /// <summary>
        /// ä¸‹å‘外形检测成功任务
        /// </summary>
@@ -71,6 +98,7 @@
            {
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
                List<Dt_RGVLocationInfo> rGVLocationInfos = new List<Dt_RGVLocationInfo>();
                List<Dt_StationManger> stationMangers = new List<Dt_StationManger>();
                foreach (var item in tasks)
                {
                    #region èŽ·å–è´§ä½
@@ -100,12 +128,18 @@
                            item.TaskState = (int)TaskStatusEnum.Puting;
                            rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt();
                            rGVLocationInfos.Add(rGVLocationInfo);
                            #region é‡Šæ”¾å…¥åº“站台
                            Dt_StationManger stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
                            stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
                            stationMangers.Add(stationManger);
                            #endregion
                        }
                    }
                }
                _taskService.Db.Ado.BeginTran();
                _taskService.UpdateData(tasks);
                _rGVLocationInfoService.UpdateData(rGVLocationInfos);
                _stationMangerService.UpdateData(stationMangers);
                _taskService.Db.Ado.CommitTran();
            }
            catch (Exception ex)
@@ -113,5 +147,105 @@
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
        #region ä¸‹å‘外形检测失败任务
        public void SendCheckShapeingNGTask(List<Dt_Task> tasks)
        {
            FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
            try
            {
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
                foreach (var item in tasks)
                {
                    Dt_StationManger stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
                    item.CurrentAddress = item.NextAddress;
                    item.NextAddress = stationManger.RGVStationCode;
                    fOURBOTnewMovePodTask.priority = item.Grade;
                    fOURBOTnewMovePodTask.podID = item.PalletCode;
                    fOURBOTnewMovePodTask.destination = item.NextAddress;
                    fOURBOTnewMovePodTask.desExt = new
                    {
                        unload = 1//是否放下容器,0否1是
                    };
                    fOURBOTnewMovePodTask.desType = 2;
                    string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
                    FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                    if (fOURBOTReturn.returnCode == 0)
                    {
                        item.RGVTaskId = fOURBOTReturn.data.taskID;
                        item.TaskState = (int)TaskStatusEnum.Puting;
                    }
                }
                _taskService.UpdateData(tasks);
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
        #region åˆ¤æ–­æ˜¯å¦éœ€è¦ç§»åº“
        public static bool IsNoMoveTask(Dt_Task task)
        {
            var isNoMove = true;
            try
            {
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return isNoMove;
        }
        #endregion
        #region åˆ¤æ–­å‡ºåº“口是否空闲
        public bool StationIsFree(string StationCode)
        {
            Dt_StationManger stationManger = _stationMangerService.GetOutStationInfo(StationCode);
            return stationManger.IsOccupied == LocationStatusEnum.Free.ObjToInt();
        }
        #endregion
        #region ç§»åº“后下发出库任务
        public void SendMoveToExecuteTask(List<Dt_Task> tasks)
        {
            try
            {
                FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
                foreach (var item in tasks)
                {
                    if (_taskService.Repository.QueryData(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory).Any()) continue;
                    if (!StationIsFree(item.TargetAddress)) continue;
                    #region ä¸‹å‘出库任务
                    fOURBOTnewMovePodTask.priority = item.Grade;
                    fOURBOTnewMovePodTask.podID = item.PalletCode;
                    fOURBOTnewMovePodTask.destination = item.NextAddress;
                    fOURBOTnewMovePodTask.desExt = new
                    {
                        unload = 0//是否放下容器,0否1是
                    };
                    fOURBOTnewMovePodTask.desType = 2;
                    string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
                    FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                    if (fOURBOTReturn.returnCode == 0)
                    {
                        item.RGVTaskId = fOURBOTReturn.data.taskID;
                        item.TaskState = (int)TaskStatusEnum.Execut;
                    }
                    #endregion
                }
                _taskService.UpdateData(tasks);
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskExtend.cs
@@ -56,8 +56,26 @@
        {
            try
            {
                #region ä¸‹å‘外形检测通过的四向车任务
                var Tasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == (int)TaskStatusEnum.CheckShapeingOk).ToList();
                SendCheckShapeingOkTask(Tasks);
                if (Tasks.Count > 0) SendCheckShapeingOkTask(Tasks);
                #endregion
                #region ä¸‹å‘外形检测失败的四向车任务
                Tasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == (int)TaskStatusEnum.CheckShapeingNG).ToList();
                if (Tasks.Count > 0) SendCheckShapeingNGTask(Tasks);
                Tasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == (int)TaskStatusEnum.CheckShapeingOk && x.ExceptionMessage.Contains("未找到终点库区")).ToList();
                if (Tasks.Count > 0) SendCheckShapeingNGTask(Tasks);
                #endregion
                #region ä¸‹å‘待移库后四向车出库任务
                Tasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == (int)TaskStatusEnum.RGV_WaitMoveToExecute).ToList();
                if (Tasks.Count > 0) SendMoveToExecuteTask(Tasks);
                #endregion
                #region ä¸‹å‘托盘确认的海康AGV任务
                #endregion
            }
            catch (Exception ex)
            {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskJob.cs
@@ -29,11 +29,14 @@
        private readonly ITaskService _taskService;
        private readonly IApiInfoService _apiInfoService;
        private readonly IRGVLocationInfoService _rGVLocationInfoService;
        public TaskJob(ITaskService taskService, IApiInfoService apiInfoService, IRGVLocationInfoService rGVLocationInfoService)
        private readonly IStationMangerService _stationMangerService;
        public TaskJob(ITaskService taskService, IApiInfoService apiInfoService, IRGVLocationInfoService rGVLocationInfoService, IStationMangerService stationMangerService)
        {
            _taskService = taskService;//注入
            _apiInfoService = apiInfoService;
            _rGVLocationInfoService = rGVLocationInfoService;
            _stationMangerService = stationMangerService;
        }
        public Task Execute(IJobExecutionContext context)