| | |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using WCS.Application.Entity; |
| | | using static Elastic.Clients.Elasticsearch.JoinField; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.CustomServiceKfSessionGetWaitCaseResponse.Types; |
| | | |
| | | namespace WCS.Application.Util; |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取小车移动的目标位置 |
| | | /// </summary> |
| | | /// <param name="startLocation">起始位置</param> |
| | | /// <param name="noPathStr">不能存放的储位字符串</param> |
| | | /// <returns></returns> |
| | | public static string GetCarEndLocation(string startLocation,string noPathStr) |
| | | { |
| | | if (string.IsNullOrEmpty(startLocation)) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | // 起始位置 |
| | | CarModel start = new CarModel() |
| | | { |
| | | X = int.Parse(startLocation.Substring(0, 2)), |
| | | Y = int.Parse(startLocation.Substring(2, 2)), |
| | | Z = int.Parse(startLocation.Substring(4, 2)), |
| | | NodeCom = 0 |
| | | }; |
| | | |
| | | // 获取储位表信息存储到集合里 |
| | | var layer = int.Parse(startLocation.Substring(4, 2)); |
| | | |
| | | // 获取当前层储位信息 |
| | | var locationModels = _db.Queryable<WcsStorageLocat>() |
| | | .Where(m => m.WareHouseNo == "W01" && m.Layer == layer && m.IsDelete == false) |
| | | .ToList(); |
| | | |
| | | #region MyRegion |
| | | |
| | | var list = locationModels.Where(m => !noPathStr.Contains(m.LocatNo)).OrderBy(m=> Math.Abs(start.X - m.Row) + Math.Abs(start.Y - m.Column)).ToList(); |
| | | var locateStr = ""; |
| | | foreach (var item in list) |
| | | { |
| | | // 储位状态为损坏不可通行 储位状态为屏蔽为可通行不可存储托盘 |
| | | if (item.Flag == "2") |
| | | { |
| | | continue; |
| | | } |
| | | locateStr = item.LocatNo; |
| | | break; |
| | | } |
| | | return locateStr; |
| | | #endregion |
| | | |
| | | #region 使用算法计算小车可移动的目标路径 |
| | | //try |
| | | //{ |
| | | |
| | | // // 定义关闭节点字典 |
| | | // var closeSet = new Dictionary<CarModel, CarModel>(); |
| | | |
| | | // // 存储小车可运行的方向 |
| | | // var validDirections = new List<CarModel>(); |
| | | // var currentLocation = locationModels.FirstOrDefault(m => m.Row == start.X && m.Column == start.Y); |
| | | // if (currentLocation.Make == "0") |
| | | // { |
| | | // // 主通道 |
| | | // validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 右 |
| | | // validDirections.Add(new CarModel() { X = -1, Y = 0 }); // 左 |
| | | // validDirections.Add(new CarModel() { X = 0, Y = 1 }); // 下 |
| | | // validDirections.Add(new CarModel() { X = 0, Y = -1 }); // 上 |
| | | // } |
| | | |
| | | // if (currentLocation.Make == "1") |
| | | // { |
| | | // // 子通道 |
| | | // // 先拆分出口 |
| | | // var outNode = currentLocation.AisleOne; |
| | | // if (string.IsNullOrEmpty(outNode)) |
| | | // { |
| | | // throw new Exception("当前位置没有维护出口!"); |
| | | // } |
| | | // int outX = int.Parse(outNode.Substring(0, 2)); |
| | | // int outY = int.Parse(outNode.Substring(2, 2)); |
| | | // if (start.X == outX) |
| | | // { |
| | | // validDirections.Add(new CarModel() { X = 0, Y = 1 }); // 下 |
| | | // validDirections.Add(new CarModel() { X = 0, Y = -1 }); // 上 |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 右 |
| | | // validDirections.Add(new CarModel() { X = -1, Y = 0 }); // 左 |
| | | // } |
| | | // } |
| | | |
| | | // foreach (var dir in validDirections) |
| | | // { |
| | | // CarModel neighbor = new CarModel() { X = start.X + dir.X, Y = start.Y + dir.Y, Z = layer }; |
| | | |
| | | // // 验证下一节点位置是否可通行并且判断是否被其他小车占用 |
| | | |
| | | |
| | | // // 判断下一节点是否关闭 |
| | | // if (closeSet.ContainsKey(neighbor)) |
| | | // { |
| | | // closeSet[neighbor] = neighbor; |
| | | // } |
| | | |
| | | // // 当前节点 |
| | | // var currentModel = locationModels.FirstOrDefault(it => it.Row == start.X && it.Column == start.Y); |
| | | // // 下一节点 |
| | | // var locationModel = locationModels.FirstOrDefault(it => it.Row == neighbor.X && it.Column == neighbor.Y); |
| | | |
| | | // // 不存在此位置信息 |
| | | // if (locationModel == null) |
| | | // { |
| | | // closeSet[neighbor] = neighbor; |
| | | // continue; |
| | | // } |
| | | // // 储位状态为损坏不可通行 储位状态为屏蔽为可通行不可存储托盘 |
| | | // if (locationModel.Flag == "2") |
| | | // { |
| | | // closeSet[neighbor] = neighbor; |
| | | // continue; |
| | | // } |
| | | |
| | | // } |
| | | |
| | | |
| | | |
| | | //} |
| | | //catch (Exception) |
| | | //{ |
| | | // throw; |
| | | //} |
| | | |
| | | //return null; |
| | | #endregion |
| | | } |
| | | |
| | | public static int GetTaskNo() |
| | | { |
| | | var list = _db.Queryable<WcsCarTasks>().ToList(); |
| | | var maxNo = list.Max(m => m.CarTaskNo); |
| | | |
| | | if (maxNo!=null && maxNo > 0) |
| | | { |
| | | if (maxNo++ > 65535) |
| | | { |
| | | return 1; |
| | | } |
| | | |
| | | return (int)maxNo++; |
| | | } |
| | | return 1; |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取总任务表下发ID主键 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static int GetTaskId() |
| | | { |
| | | var list = _db.Queryable<WcsTask>().ToList(); |
| | | var maxNo = list.Max(m => m.TaskId); |
| | | |
| | | if (maxNo != null && maxNo > 0) |
| | | { |
| | | if (maxNo++ > 99999999) |
| | | { |
| | | return 1; |
| | | } |
| | | |
| | | return (int)maxNo++; |
| | | } |
| | | |
| | | return 1; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 计算曼哈顿距离 |
| | | /// </summary> |
| | | /// <param name="start">起始位置</param> |