| | |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using WCS.Application.Entity; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.CustomServiceKfSessionGetWaitCaseResponse.Types; |
| | | |
| | | namespace WCS.Application.Util; |
| | | |
| | |
| | | { |
| | | private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); |
| | | |
| | | private static readonly WcsTaskService _taskService = App.GetService<WcsTaskService>(); |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// 完善小车下发节点、节点命令 |
| | | /// </summary> |
| | | /// <param name="list">集合</param> |
| | | /// <param name="moveType">移动类型 0:移动 1:移货 </param> |
| | | /// <returns></returns> |
| | | public static List<CarModel> GetCarPathUp(List<CarModel> list,int moveType) |
| | | public static List<CarModel> GetCarPathUp(List<CarModel> list, int moveType) |
| | | { |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | if (i > 0 && i < list.Count - 1) |
| | | if (i >= 0 && i < list.Count - 1) |
| | | { |
| | | if (list[i].X == list[i + 1].X) |
| | | { |
| | |
| | | { |
| | | list[i].NodeCom = 3; |
| | | } |
| | | |
| | | } |
| | | if (i== 0) |
| | | if (i > 0 && i < list.Count - 1) |
| | | { |
| | | if (list[i].Make != list[i - 1].Make || list[i].Make != list[i + 1].Make) |
| | | { |
| | | if (list[i].X != list[i - 1].X || list[i].X != list[i + 1].X) |
| | | { |
| | | list[i].IsSendPlc = true; |
| | | } |
| | | |
| | | //list[i - 1].IsSendPlc = true; |
| | | |
| | | } |
| | | |
| | | } |
| | | if (i == 0) |
| | | { |
| | | list[i].IsSendPlc = true; |
| | | if (moveType == 0) |
| | |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | else |
| | | { |
| | | list[i].NodeCom = 1; |
| | | } |
| | | } |
| | | if (i == list.Count-1) |
| | | if (i == list.Count - 1) |
| | | { |
| | | list[i].IsSendPlc = true; |
| | | if (moveType == 0) |
| | | { |
| | | list[i].NodeCom = list[i + 1].NodeCom; |
| | | if (list[i].X == list[i - 1].X) |
| | | { |
| | | list[i].NodeCom = 2; |
| | | } |
| | | else if (list[i].Y == list[i - 1].Y) |
| | | { |
| | | list[i].NodeCom = 3; |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /// <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 |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取任务号 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | 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; |
| | | |
| | | } |
| | | |
| | | public static bool AddCarTask(List<CarModel> data, List<CarInfo> kXCarList, CarInfo assignCar, WcsTask waitTask,int moveType) |
| | | { |
| | | #region 获取适合执行当前任务的小车 生成路径(需考虑小车阻阻挡) |
| | | var preId1 = "";//前置任务Id |
| | | var executionPath1 = "";//交互路径 |
| | | var executionPath2 = "";//交互路径 |
| | | var path = "";//所有路径 |
| | | var isOk = "1"; //是否完整路径 1完整 2 两条路径 |
| | | for (int i = 0; i < data.Count; i++) |
| | | { |
| | | //路径节点 |
| | | var pathXYZ = data[i].X.ToString().PadLeft(2, '0') + data[i].Y.ToString().PadLeft(2, '0') + data[i].Z.ToString().PadLeft(2, '0') + data[i].NodeCom.ToString(); |
| | | var pathXYZ2 = data[i].X.ToString().PadLeft(2, '0') + data[i].Y.ToString().PadLeft(2, '0') + data[i].Z.ToString().PadLeft(2, '0'); |
| | | path += pathXYZ + ";"; |
| | | |
| | | //获取等待或正在执行的任务中包含当前节点的小车任务 |
| | | var taskList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.Path.Contains(pathXYZ2) && m.CarNo != assignCar.CarPlcIp).Select(m => m.Id).Distinct().ToList(); |
| | | |
| | | foreach (var item in taskList) |
| | | { |
| | | //判断如果是完整路径 记录交互路径 |
| | | if (isOk == "1") |
| | | { |
| | | if (i == 0) |
| | | { |
| | | continue; |
| | | } |
| | | var pathXYZQian = data[i - 1].X.ToString().PadLeft(2, '0') + data[i - 1].Y.ToString().PadLeft(2, '0') + data[i - 1].Z.ToString().PadLeft(2, '0')+ data[i - 1].NodeCom.ToString(); |
| | | var pathXYZQian2 = data[i - 1].X.ToString().PadLeft(2, '0') + data[i - 1].Y.ToString().PadLeft(2, '0') + data[i - 1].Z.ToString().PadLeft(2, '0'); |
| | | if (!executionPath1.Contains(pathXYZQian2)) |
| | | { |
| | | executionPath1 += pathXYZQian + ";"; |
| | | } |
| | | executionPath2 += pathXYZQian + ";"; |
| | | //判断添加前置任务Id |
| | | if (!preId1.Contains(item + "")) |
| | | { |
| | | preId1 += item + ";"; |
| | | } |
| | | } |
| | | |
| | | |
| | | isOk = "2"; |
| | | } |
| | | |
| | | if (data[i].IsSendPlc) |
| | | { |
| | | if (isOk == "1") |
| | | { |
| | | executionPath1 += pathXYZ + ";"; |
| | | } |
| | | else |
| | | { |
| | | executionPath2 += pathXYZ + ";"; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 判断是否有空闲小车阻挡路径 3 |
| | | var preId3 = "";//前置任务Id |
| | | foreach (var item in kXCarList) |
| | | { |
| | | if (item == assignCar) |
| | | { |
| | | continue;//排除当前分配任务的小车 |
| | | } |
| | | //小车位置 |
| | | var carXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0'); |
| | | //分配的任务路径中 当前小车是否阻挡 |
| | | if (path.Contains(carXYZ)) |
| | | { |
| | | //获取等待或正在执行的任务中包含当前节点的小车任务,不会有太多任务,同层有几个小车最多有几个任务 |
| | | var taskList3 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)).ToList(); |
| | | |
| | | var str3 = "";//所有已分配或执行的任务全路径之和 |
| | | |
| | | foreach (var item2 in taskList3) |
| | | { |
| | | str3 += item2.Path; |
| | | } |
| | | var endLocate3 = ""; |
| | | var executionPath3 = ""; |
| | | var path3 = ""; |
| | | var datas3 = new List<CarModel>(); |
| | | //查找目标位置 |
| | | while (endLocate3 == "" || datas3.Count == 0 || datas3 == null) |
| | | { |
| | | endLocate3 = FourWayCarUtil.GetCarEndLocation(carXYZ, str3); |
| | | var data3 = FourWayCarUtil.GetCarPath(carXYZ, endLocate3, "0"); |
| | | datas3 = FourWayCarUtil.GetCarPathUp(data3, 0); |
| | | } |
| | | foreach (var itemPath in datas3) |
| | | { |
| | | var pathXYZ = itemPath.X.ToString().PadLeft(2, '0') + itemPath.Y.ToString().PadLeft(2, '0') + itemPath.Z.ToString().PadLeft(2, '0') + itemPath.NodeCom.ToString(); |
| | | |
| | | path3 += pathXYZ + ";"; |
| | | if (itemPath.IsSendPlc) |
| | | { |
| | | executionPath3 += pathXYZ + ";"; |
| | | } |
| | | } |
| | | WcsTask modTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.ShuttleCar, |
| | | StartLocate = carXYZ, |
| | | EndLocate = endLocate3, |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 999, |
| | | Origin = "WCS" |
| | | }; |
| | | _db.Insertable(modTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | //移动小车 |
| | | var carTaskYC = new WcsCarTasks() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PreId = "", |
| | | ExecutionPath = executionPath3, |
| | | Path = path3, |
| | | CarNo = item.CarPlcIp, |
| | | Status = TaskStatusEnum.Wait |
| | | }; |
| | | var idLong = _db.Insertable(carTaskYC).ExecuteReturnSnowflakeId(); |
| | | preId3 += idLong + ";"; |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 判断现有任务中最终节点是否在当前分配路径中,如有 添加移走小车任务并加入前置任务 4 |
| | | |
| | | //获取等待或正在执行的任务中包含当前节点的小车任务,不会有太多任务,同层有几个小车最多有几个任务 |
| | | var taskList4 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.CarNo!=assignCar.CarPlcIp).ToList(); |
| | | var preId4 = "";//前置任务Id |
| | | var str4 = "";//所有已分配或执行的任务全路径之和 |
| | | |
| | | foreach (var item in taskList4) |
| | | { |
| | | str4 += item.Path; |
| | | } |
| | | //判断现有任务中最终节点是否在当前分配路径中,如有 添加移走小车任务并加入前置任务 |
| | | foreach (var item in taskList4) |
| | | { |
| | | var lastPathList = item.ExecutionPath.Split(';'); |
| | | // a;b;c; 最后一个位是“”,所以lastPathList.Length - 2 |
| | | var lastPath = lastPathList[lastPathList.Length - 2]; |
| | | var lastPath2 = lastPath.Substring(0,6); |
| | | |
| | | //如果此此分配路径包含醉舞中最终节点路径,添加移走小车 |
| | | if (path.Contains(lastPath2)) |
| | | { |
| | | var endLocate = ""; |
| | | var executionPath4 = ""; |
| | | var path4 = ""; |
| | | var datas4 = new List<CarModel>(); |
| | | //查找目标位置 |
| | | while (endLocate == "" || datas4.Count == 0 || datas4 == null) |
| | | { |
| | | endLocate = FourWayCarUtil.GetCarEndLocation(lastPath, str4); |
| | | var data4 = FourWayCarUtil.GetCarPath(lastPath, endLocate); |
| | | datas4 = FourWayCarUtil.GetCarPathUp(data4, 0); |
| | | } |
| | | foreach (var itemPath in datas4) |
| | | { |
| | | var pathXYZ = itemPath.X.ToString().PadLeft(2, '0') + itemPath.Y.ToString().PadLeft(2, '0') + itemPath.Z.ToString().PadLeft(2, '0') + itemPath.NodeCom.ToString(); |
| | | |
| | | path4 += pathXYZ + ";"; |
| | | if (itemPath.IsSendPlc) |
| | | { |
| | | executionPath4 += pathXYZ + ";"; |
| | | } |
| | | } |
| | | WcsTask modTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.ShuttleCar, |
| | | StartLocate = lastPath, |
| | | EndLocate = endLocate, |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 999, |
| | | Origin = "WCS" |
| | | }; |
| | | _db.Insertable(modTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | //移动小车 |
| | | var carTaskYC = new WcsCarTasks() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PreId = "", |
| | | ExecutionPath = executionPath4, |
| | | Path = path4, |
| | | CarNo = item.CarNo, |
| | | Status = TaskStatusEnum.Wait |
| | | }; |
| | | var idLong = _db.Insertable(carTaskYC).ExecuteReturnSnowflakeId(); |
| | | preId4 += idLong + ";"; |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 插入任务数据 改变任务状态 |
| | | |
| | | // 插入四向车任务表 |
| | | var carTask1 = new WcsCarTasks() |
| | | { |
| | | TaskNo = waitTask.TaskNo, |
| | | PreId = preId1 + preId3 + preId4, |
| | | ExecutionPath = executionPath1, |
| | | Path = path, |
| | | CarNo = assignCar.CarPlcIp, |
| | | Status = TaskStatusEnum.Wait |
| | | }; |
| | | _db.Insertable(carTask1).ExecuteCommand(); |
| | | if (!string.IsNullOrWhiteSpace(executionPath1) && isOk == "2") |
| | | { |
| | | // 插入四向车任务表 |
| | | var carTask2 = new WcsCarTasks() |
| | | { |
| | | TaskNo = waitTask.TaskNo, |
| | | PreId = preId1, |
| | | ExecutionPath = executionPath2, |
| | | Path = path, |
| | | CarNo = assignCar.CarPlcIp, |
| | | Status = TaskStatusEnum.Wait |
| | | }; |
| | | _db.Insertable(carTask2).ExecuteCommand(); |
| | | } |
| | | if (moveType == 1) |
| | | { |
| | | // 改变总任务表状态 |
| | | waitTask.Status = TaskStatusEnum.Doing; |
| | | waitTask.UpdateTime = DateTime.Now; |
| | | _db.Updateable(waitTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(waitTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | |
| | | return true; |
| | | #endregion |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取小车路径 |
| | |
| | | // 存储小车可运行的方向 |
| | | var validDirections = new List<CarModel>(); |
| | | var currentLocation = locationModels.FirstOrDefault(m => m.Row == current.X && m.Column == current.Y); |
| | | if (currentLocation.Make == "0") |
| | | if (currentLocation.Make == "0"|| currentLocation.Make == "2") |
| | | { |
| | | // 主通道 |
| | | validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 右 |
| | |
| | | { |
| | | neighbor.IsSendPlc = false; |
| | | |
| | | //if (current.X == neighbor.X) |
| | | //{ |
| | | // current.NodeCom = 2; |
| | | //} |
| | | //else if (current.Y == neighbor.Y) |
| | | //{ |
| | | // current.NodeCom = 3; |
| | | //} |
| | | |
| | | //// 补充参数 |
| | | //if (current.Equals(start)) |
| | | //{ |
| | | // current.NodeCom = moveType; |
| | | // current.IsSendPlc = true; |
| | | //} |
| | | //if (neighbor.Equals(end)) |
| | | //{ |
| | | // //neighbor.NodeCom = moveType != 0 ? 2:0 ; |
| | | // if (moveType == 1) |
| | | // { |
| | | // neighbor.NodeCom = 4; |
| | | // } |
| | | // else |
| | | // { |
| | | // neighbor.NodeCom = current.NodeCom; |
| | | // } |
| | | |
| | | // neighbor.IsSendPlc = true; |
| | | //} |
| | | if (currentModel.Make != locationModel.Make) |
| | | { |
| | | neighbor.IsSendPlc = true; |
| | | } |
| | | |
| | | |
| | | neighbor.Make = locationModel.Make; |
| | | current.Make = currentModel.Make; |
| | | |
| | | // 更新实际距离与预估距离 |
| | | cameFrom[neighbor] = current; |
| | | gScore[neighbor] = tentativeGScore; |
| | |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | /// <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> |
| | |
| | | /// </summary> |
| | | public bool IsSendPlc { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 0通道 1 储位 |
| | | /// </summary> |
| | | public string Make { get; set; } |
| | | |
| | | public int CompareTo(CarModel other) |
| | | { |
| | | if (other == null) |