´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/RGVLocationInfoService.cs
@@ -4,7 +4,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.LocationEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Helper; @@ -35,19 +37,60 @@ { return BaseDal.QueryData(x => x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt(), _emptyAssignOrderBy); } /// <summary> /// æ¥æ¾å ¥åºå¯ç¨è´§ä½ /// </summary> /// <param name="AreaCode"></param> /// <returns></returns> public Dt_RGVLocationInfo? GetInFreeLocationInfo(string AreaCode) public (List<Dt_Task>, List<Dt_RGVLocationInfo>) GetMoveFreeLocationInfo(List<Dt_RGVLocationInfo> locationInfos) { Dt_RGVLocationInfo? rGVLocationInfo = null; Dt_RGVLocationInfo? FreerGVLocationInfo = null; List<Dt_RGVLocationInfo> rGVLocationInfos = BaseDal.QueryData(x => x.WarehouseId.ToString() == AreaCode && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt(), _emptyAssignOrderBy);//æ¥æ¾ææç©ºè´§ä½ if (rGVLocationInfos == null || rGVLocationInfos.Count < 1) return rGVLocationInfo; List<Dt_Task> tasks = new List<Dt_Task>(); List<Dt_RGVLocationInfo> upFreeLocationInfos = new List<Dt_RGVLocationInfo>(); List<Dt_RGVLocationInfo> FreeLocationInfos = GetFreeLocationInfos();//è·åææç©ºè´§ä½ try { List<string> LocationCodes = new List<string>(); foreach (var locationInfo in locationInfos) { FreeLocationInfos = FreeLocationInfos.Where(x => !LocationCodes.Contains(x.LocationCode)).ToList(); var rGVLocationInfos = FreeLocationInfos.Where(x => x.WarehouseId == locationInfo.WarehouseId).ToList();//æ¥æ¾ååºåå¯ç¨ç©ºè´§ä½ rGVLocationInfo = GetFreeLocationInfo(rGVLocationInfos); if (rGVLocationInfo == null) { rGVLocationInfos = FreeLocationInfos.Where(x => x.WarehouseId != locationInfo.WarehouseId).ToList();//æ¥æ¾ä¸ååºåå¯ç¨ç©ºè´§ä½ rGVLocationInfo = GetFreeLocationInfo(rGVLocationInfos); } if (rGVLocationInfo == null) break; Dt_Task dt_Task = new() { Grade = 1, PalletCode = locationInfo.PalletCode, Roadway = locationInfo.RoadwayNo, TaskState = TaskStatusEnum.RGV_NewMoveTask.ObjToInt(), TaskType = TaskTypeEnum.CPMoveInventory.ObjToInt(), SourceAddress = locationInfo.LocationCode, CurrentAddress = locationInfo.LocationCode, NextAddress = rGVLocationInfo.LocationCode, TargetAddress = rGVLocationInfo.LocationCode, Creater = "WCS", }; tasks.Add(dt_Task); upFreeLocationInfos.Add(rGVLocationInfo); LocationCodes.Add(rGVLocationInfo.LocationCode); } } catch (Exception ex) { } return (tasks, upFreeLocationInfos); } /// <summary> /// è·åå¯ç¨ç©ºè´§ä½ /// </summary> /// <param name="rGVLocationInfos"></param> /// <returns></returns> public Dt_RGVLocationInfo? GetFreeLocationInfo(List<Dt_RGVLocationInfo> rGVLocationInfos) { Dt_RGVLocationInfo? rGVLocationInfo = null; #region å¤æå··éæ¯å¦æè´§ List<string> LocationCodes = new List<string>(); foreach (var items in rGVLocationInfos.GroupBy(x => x.RoadwayNo))//æ ¹æ®å··éå·åç» { foreach (var item in items) @@ -70,46 +113,56 @@ if (dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).Any()) rGVLocationInfo = null; else return rGVLocationInfo; } //var Depth = 0; //while (item.Depth - rGVLocationInfo.Depth != 0) //{ // if (rGVLocationInfo.Depth < item.Depth) Depth = rGVLocationInfo.Depth - 1; // else Depth = rGVLocationInfo.Depth + 1; // rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth == Depth).FirstOrDefault(); // if (rGVLocationInfo != null && rGVLocationInfo.LocationStatus == (int)LocationStatusEnum.Free) return rGVLocationInfo; //} }//å¤ææµ æ·±åº¦è´§ä½æ¯å¦æè´§ } else return item; } //if (rGVLocationInfo != null)//æµ æ·±åº¦è´§ä½æè´§ï¼æ¾æ·±æ·±åº¦è´§ä½æ¯å¦æè´§ //{ // if (item.LocationType == 1) break;//å··éç±»å为ååï¼ç´æ¥è·³è¿ // foreach (var locationInfo in rGVLocationInfos.Where(x => x.RoadwayNo == items.Key).OrderByDescending(x => x.Depth)) // { // if (!dt_RGVLocationInfos.Where(x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && x.Depth < locationInfo.Depth).Any()) return locationInfo; // } // //rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt()).OrderBy(x => x.Depth).FirstOrDefault();//æ¾æµ æ·±åº¦ç©ºè´§ä½ // //if (rGVLocationInfo != null) // //{ // // if (dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).FirstOrDefault() == null)//å¤ææ·±æ·±åº¦è´§ä½æ¯å¦æè´§ // // return rGVLocationInfo; // //} //} //if (rGVLocationInfo == null) //{ // rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth > item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).FirstOrDefault();//å¤ææµ æ·±åº¦è´§ä½æ¯å¦æè´§ // if (item.LocationType == 1) break;//å··éç±»å为ååï¼ç´æ¥è·³è¿ // foreach (var locationInfo in rGVLocationInfos.Where(x => x.RoadwayNo == items.Key).OrderByDescending(x => x.Depth)) // { // if (!dt_RGVLocationInfos.Where(x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && x.Depth < locationInfo.Depth).Any()) return locationInfo; // } //} //else return item; } } #endregion return FreerGVLocationInfo; return rGVLocationInfo; } /// <summary> /// æ¥æ¾å ¥åºå¯ç¨è´§ä½ /// </summary> /// <param name="AreaCode"></param> /// <returns></returns> public Dt_RGVLocationInfo? GetInFreeLocationInfo(int AreaCode) { Dt_RGVLocationInfo? rGVLocationInfo = null; Dt_RGVLocationInfo? FreerGVLocationInfo = null; List<Dt_RGVLocationInfo> rGVLocationInfos = BaseDal.QueryData(x => x.WarehouseId == AreaCode && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt(), _emptyAssignOrderBy);//æ¥æ¾ææç©ºè´§ä½ if (rGVLocationInfos == null || rGVLocationInfos.Count < 1) return rGVLocationInfo; return GetFreeLocationInfo(rGVLocationInfos); #region å¤æå··éæ¯å¦æè´§ //foreach (var items in rGVLocationInfos.GroupBy(x => x.RoadwayNo))//æ ¹æ®å··éå·åç» //{ // foreach (var item in items) // { // List<Dt_RGVLocationInfo> dt_RGVLocationInfos = BaseDal.QueryData(x => x.RoadwayNo == items.Key);//æ¥æ¾å½åå··éå·è´§ä½ // if (item.LocationType == 1) // { // rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth < item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).FirstOrDefault();//å¤ææµ æ·±åº¦è´§ä½æ¯å¦æè´§ // if (rGVLocationInfo != null) break; // return item; // } // else // { // rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth < item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).OrderByDescending(x => x.Depth).FirstOrDefault();//å¤ææµ æ·±åº¦è´§ä½æ¯å¦æè´§ // if (rGVLocationInfo != null) // { // rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.Free.ObjToInt()).OrderBy(x => x.Depth).FirstOrDefault(); // if (rGVLocationInfo != null) // { // if (dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).Any()) rGVLocationInfo = null; // else return rGVLocationInfo; // } // } // else return item; // } // } //} #endregion //return FreerGVLocationInfo; } } } ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IRGVLocationInfoService.cs
@@ -11,18 +11,24 @@ { public interface IRGVLocationInfoService : IService<Dt_RGVLocationInfo> { public IRepository<Dt_RGVLocationInfo> Repository { get; } public IRepository<Dt_RGVLocationInfo> Repository { get; } /// <summary> /// è·åå ¥åºå¯ç¨ç©ºè´§ä½ /// </summary> /// <param name="AreaCode"></param> /// <param name="containerType"></param> /// <returns></returns> Dt_RGVLocationInfo GetInFreeLocationInfo(string AreaCode); Dt_RGVLocationInfo GetInFreeLocationInfo(int AreaCode); /// <summary> /// è·åææç©ºè´§ä½ /// </summary> /// <returns></returns> List<Dt_RGVLocationInfo> GetFreeLocationInfos(); /// <summary> /// è·åç§»åºå¯ç¨ç©ºè´§ä½ /// </summary> /// <param name="locationInfo"></param> /// <returns></returns> (List<Dt_Task>, List<Dt_RGVLocationInfo>) GetMoveFreeLocationInfo(List<Dt_RGVLocationInfo> locationInfos); } } ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskMethods.cs
@@ -96,42 +96,49 @@ //var task = BaseDal.QueryFirst(x => x.RGVTaskId == Rgv.content.taskID); var task = BaseDal.QueryFirst(x => x.PalletCode == Rgv.content.podID); if (task == null) throw new Exception($"æªæ¾å°ä»»å¡,ä»»å¡ç¼å·ã{Rgv.content.taskID}ã"); if (Rgv.messageType == 72)//å°è½¦é¡¶èµ·è´§ç© if (task.TaskType == TaskTypeEnum.CPMoveInventory.ObjToInt()) { if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.Execut) { task.TaskState = (int)TaskStatusEnum.WaiCheckShape; //BaseDal.UpdateData(task);//ç»è´¨æ£é¨åå ¥å¯å¨ä¿¡å· TaskFeedback(task, 4); var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "F1") as OtherDevice ?? throw new Exception("æªæ¾å°1楼质æ£é¨è®¾å¤ä¿¡æ¯"); device.SetValue(QualityInspectionCommandEnum.StartqualityInspection, true, task.SourceAddress); } else { TaskFromCompleted(task, deviceTypeEnum); } } else if (Rgv.messageType == 10) else { if (Rgv.content.status == 2) TaskFeedback(task, 1); if (Rgv.content.status == 4) if (Rgv.messageType == 72)//å°è½¦é¡¶èµ·è´§ç© { if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.TakeFinish) if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.Execut) { task.TaskState = (int)TaskStatusEnum.CheckShapeing; BaseDal.UpdateData(task); task.TaskState = (int)TaskStatusEnum.WaiCheckShape; //BaseDal.UpdateData(task);//ç»è´¨æ£é¨åå ¥å¯å¨ä¿¡å· TaskFeedback(task, 4); var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "F1") as OtherDevice ?? throw new Exception("æªæ¾å°1楼质æ£é¨è®¾å¤ä¿¡æ¯"); device.SetValue(QualityInspectionCommandEnum.StartqualityInspection, true, task.SourceAddress); } else if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.Puting) else { TaskCompleted(task, deviceTypeEnum); TaskFromCompleted(task, deviceTypeEnum); } else if (task.TaskType == (int)TaskTypeEnum.CPInbound && !string.IsNullOrEmpty(task.ExceptionMessage)) } else if (Rgv.messageType == 10) { if (Rgv.content.status == 2) TaskFeedback(task, 1); if (Rgv.content.status == 4) { ErrorTaskFeedback(task, !task.ExceptionMessage.Contains("夿£å¤±è´¥")); } else if (task.TaskType == (int)TaskTypeEnum.CPOutbound || task.TaskType == (int)TaskTypeEnum.CPMoveInventory)//åºåºãç§»åºå®æ { TaskCompleted(task, deviceTypeEnum); if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.TakeFinish) { task.TaskState = (int)TaskStatusEnum.CheckShapeing; BaseDal.UpdateData(task); } else if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.Puting) { TaskCompleted(task, deviceTypeEnum); } else if (task.TaskType == (int)TaskTypeEnum.CPInbound && !string.IsNullOrEmpty(task.ExceptionMessage)) { ErrorTaskFeedback(task, !task.ExceptionMessage.Contains("夿£å¤±è´¥")); } else if (task.TaskType == (int)TaskTypeEnum.CPOutbound || task.TaskType == (int)TaskTypeEnum.CPMoveInventory)//åºåºãç§»åºå®æ { TaskCompleted(task, deviceTypeEnum); } } } } ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/RGVTaskExtend.cs
@@ -189,9 +189,10 @@ var task = tasks.First(x => x.PalletCode == item.outPod); if (item.blockPods != null && item.blockPods.Count > 0) { task.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute; var responseContent = AddMoveTask(item.blockPods, task);//æ·»å ç§»åºä»»å¡ if (!responseContent.Status) task.ExceptionMessage = responseContent.Message; else task.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute; dt_Tasks.Add(task); AddMoveTask(item.blockPods);//æ·»å ç§»åºä»»å¡ } else { @@ -237,7 +238,7 @@ try { #region è·åè´§ä½ var rGVLocationInfo = _rGVLocationInfoService.GetInFreeLocationInfo(item.Roadway); var rGVLocationInfo = _rGVLocationInfoService.GetInFreeLocationInfo(item.Roadway.ObjToInt()); if (rGVLocationInfo == null) { item.ExceptionMessage = $"æªæ¾å°ç»ç¹åºåºã{item.Roadway}ãå¯ç¨ç©ºè´§ä½ï¼"; @@ -467,49 +468,51 @@ #endregion #region æ·»å ç§»åºä»»å¡ public void AddMoveTask(List<string> blockPods) public WebResponseContent AddMoveTask(List<string> blockPods, Dt_Task task) { WebResponseContent content = new WebResponseContent(); try { List<Dt_Task> tasks = new List<Dt_Task>(); List<Dt_RGVLocationInfo> _UpRGVLocationInfos = new List<Dt_RGVLocationInfo>(); List<Dt_RGVLocationInfo> rGVLocationInfos = _rGVLocationInfoService.Repository.QueryData(x => blockPods.Contains(x.PalletCode)); var FreeLocationInfos = _rGVLocationInfoService.GetFreeLocationInfos(); if (FreeLocationInfos.Count < 1) throw new Exception($"æååºå建移åºä»»å¡æ å¯ç¨ç©ºè´§ä½"); foreach (var item in rGVLocationInfos) var Items = _rGVLocationInfoService.GetMoveFreeLocationInfo(rGVLocationInfos); List<Dt_Task> tasks = Items.Item1; List<Dt_RGVLocationInfo> _UpRGVLocationInfos = Items.Item2; if (tasks.Count < blockPods.Count) throw new Exception("å¯ç§»åºç©ºè´§ä½å°äºéç§»åºæçæ°é"); tasks.ForEach(x => { Dt_RGVLocationInfo? rGVLocationInfo = FreeLocationInfos.Where(x => x.Layer == item.Layer && x.RoadwayNo != item.RoadwayNo).OrderBy(n => Math.Abs(n.Row - item.Row)).FirstOrDefault(); rGVLocationInfo ??= FreeLocationInfos.First(); Dt_Task dt_Task = new() { TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), //WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = 1, PalletCode = item.PalletCode, Roadway = item.RoadwayNo, TaskState = TaskStatusEnum.RGV_NewMoveTask.ObjToInt(), TaskType = TaskTypeEnum.CPMoveInventory.ObjToInt(), SourceAddress = item.LocationCode, CurrentAddress = item.LocationCode, NextAddress = rGVLocationInfo.LocationCode, TargetAddress = rGVLocationInfo.LocationCode, Creater = "WCS", }; tasks.Add(dt_Task); item.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt(); rGVLocationInfo.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt(); _UpRGVLocationInfos.Add(rGVLocationInfo); FreeLocationInfos.Remove(rGVLocationInfo); x.TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)); x.WMSTaskNum = task.WMSTaskNum; }); rGVLocationInfos.ForEach(x => { x.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt(); }); _UpRGVLocationInfos.ForEach(x => { x.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt(); }); try { _unitOfWorkManage.BeginTran(); _rGVLocationInfoService.UpdateData(rGVLocationInfos); _rGVLocationInfoService.UpdateData(_UpRGVLocationInfos); _taskService.AddData(tasks); _unitOfWorkManage.CommitTran(); content.OK(); } _rGVLocationInfoService.UpdateData(rGVLocationInfos); _rGVLocationInfoService.UpdateData(_UpRGVLocationInfos); _taskService.AddData(tasks); catch (Exception ex) { _unitOfWorkManage.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) { throw new Exception(ex.Message); content.Error(ex.Message); } return content; } #endregion