| | |
| | | |
| | | return result; |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | #endregion |
| | |
| | | { |
| | | //查询这个库区的空托盘与满托盘 |
| | | var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area).OrderByDescending(a => a.N_ROW).ToList(); |
| | | LogHelper.Info($"查询这个库区的空托盘与满托盘:{JsonConvert.SerializeObject(list)}"); |
| | | //LogHelper.Info($"查询这个库区的空托盘与满托盘:{JsonConvert.SerializeObject(list)}"); |
| | | if (list.Count > 0) |
| | | { |
| | | List<string> loca = new List<string>(); |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | //如果锁了或者容量满了 当前数量 容器容量 |
| | | if (list[i].N_LOCK_STATE != 0 || list[i].N_CURRENT_NUM >= list[i].N_CAPACITY) |
| | | if (list[i].N_LOCK_STATE != 0|| list[i].C_ENABLE != "Y" || list[i].N_CURRENT_NUM >= list[i].N_CAPACITY) |
| | | { |
| | | loca.Add(list[i].S_CODE); |
| | | LogHelper.Info($"InWorkTransport 满或者锁上的货位:{list[i].S_CODE},状态{list[i].N_LOCK_STATE}"); |
| | | } |
| | | } |
| | | //移除 |
| | |
| | | { |
| | | list.RemoveAll(s => loca.Contains(s.S_CODE)); |
| | | } |
| | | //过滤一下 允许进入的才分配 |
| | | var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "立库入库区").FirstOrDefault(); |
| | | if (reservoirs.areaCode.Equals(area)) |
| | | // 3. 如果是立库入库区,检查 PLC 是否允许卸载 |
| | | var reservoirs = Settings.ReservoirAreas.FirstOrDefault(s => s.areaName == "立库入库区"); |
| | | if (reservoirs != null && reservoirs.areaCode.Equals(area)) |
| | | { |
| | | var plcDeviceTable = S7Helper.plcDeviceTables; |
| | | foreach (var l in list) |
| | | // 先收集要移除的货位,避免在遍历时修改集合 |
| | | List<Location> locationsToRemove = new List<Location>(); |
| | | |
| | | foreach (var location in list) |
| | | { |
| | | var safeInteraction = Settings.SafeInteractions.Where(s => s.location == l.S_CODE).FirstOrDefault(); |
| | | var res = int.Parse(plcDeviceTable.RGVAllowUnload[safeInteraction.code].ToString().Substring(1, 1)); |
| | | if (res!=1) |
| | | var safeInteraction = Settings.SafeInteractions.FirstOrDefault(s => s.location == location.S_CODE); |
| | | if (safeInteraction != null) |
| | | { |
| | | list.Remove(l); |
| | | // 检查 PLC 是否允许卸载(取第二位数字,判断是否为 1) |
| | | string allowUnloadStr = plcDeviceTable.RGVAllowUnload[safeInteraction.code].ToString(); |
| | | int allowUnload = int.Parse(allowUnloadStr.Substring(1, 1)); |
| | | |
| | | if (allowUnload != 1) |
| | | { |
| | | locationsToRemove.Add(location); // 不允许卸载,加入待移除列表 |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 遍历结束后,再统一移除不符合条件的货位 |
| | | foreach (var locToRemove in locationsToRemove) |
| | | { |
| | | list.Remove(locToRemove); |
| | | } |
| | | } |
| | | |
| | | |
| | | //符合条件的排序选第一个 先找第一个 |
| | | if (list.Count > 0) |
| | | { |
| | | result = list.OrderBy(s => s.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); |
| | | //立库的随机分配 |
| | | if (reservoirs != null && reservoirs.areaCode.Equals(area)) |
| | | { |
| | | // 立库随机分配算法 |
| | | var random = new Random(); |
| | | result = list.OrderBy(x => random.Next()).FirstOrDefault(); |
| | | LogHelper.Info($"立库随机分配选择货位:{result?.S_CODE},状态{result?.N_LOCK_STATE}"); |
| | | |
| | | } |
| | | else |
| | | { |
| | | result = list.OrderBy(s => s.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | //判断货位是否被锁住了 与 是否有托盘 |
| | | if (list[i].N_LOCK_STATE == 0) |
| | | if (list[i].N_LOCK_STATE == 0&& list[i].C_ENABLE =="Y") |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == list[i].S_CODE).First(); |
| | | |
| | |
| | | { |
| | | return locations |
| | | .Where(l => targetAreas.Any(area => l.S_CODE.Contains(area))) |
| | | .Where(l => l.N_LOCK_STATE == 0 && l.N_CURRENT_NUM < l.N_CAPACITY) |
| | | .Where(l => l.N_LOCK_STATE == 0&& l.C_ENABLE == "Y" && l.N_CURRENT_NUM < l.N_CAPACITY) |
| | | .ToList(); |
| | | } |
| | | |
| | |
| | | result = db.Queryable<Location>().OrderBy(a => a.N_COL) |
| | | .Where(a => a.S_AREA_CODE.Trim() == area && a.N_ROW == list[i].N_ROW |
| | | && a.N_COL > list[i].N_COL).First(); |
| | | if (result != null && result.N_LOCK_STATE == 0) |
| | | if (result != null && result.N_LOCK_STATE == 0 && result.C_ENABLE == "Y") |
| | | { |
| | | return result; |
| | | } |
| | |
| | | else |
| | | { |
| | | result = db.Queryable<Location>(). |
| | | Where(a => a.S_AREA_CODE.Trim() == area && a.N_LOCK_STATE == 0 && a.N_CURRENT_NUM == 0) |
| | | Where(a => a.S_AREA_CODE.Trim() == area && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0) |
| | | .OrderBy(a => a.N_COL).OrderBy(a => a.N_ROW).First(); |
| | | } |
| | | } |
| | |
| | | { |
| | | //校验起点货位是否存在/锁住 |
| | | var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.START_LOC).First(); |
| | | if (loc == null || loc.N_LOCK_STATE != 0) |
| | | if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y") |
| | | { |
| | | return new Results { Code = "1", Message = $"{model.START_LOC}库位已被锁定!", Data = null }; |
| | | } |
| | |
| | | } |
| | | //校验终点货位是否存在/锁定 |
| | | var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.END_LOC).First(); |
| | | if (loc == null || loc.N_LOCK_STATE != 0) |
| | | if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y") |
| | | { |
| | | return new Results { Code = "1", Message = $"{model.END_LOC}库位已被锁定!", Data = null }; |
| | | } |
| | |
| | | if (!string.IsNullOrEmpty(model.START_LOC)) |
| | | { |
| | | var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.START_LOC).First(); |
| | | if (loc == null || loc.N_LOCK_STATE != 0) |
| | | if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y") |
| | | { |
| | | return new Results { Code = "1", Message = $"{model.START_LOC}库位已被锁定!", Data = null }; |
| | | } |
| | |
| | | LogHelper.Info($"有物料{itemCode}的货位编号{JsonConvert.SerializeObject(locCntrs)}"); |
| | | //找常规送检区内含有查出物料货位的货位 |
| | | var locList = db.Queryable<Location>() |
| | | .Where(p => p.S_AREA_CODE == areaCode && p.N_LOCK_STATE == 0) |
| | | .Where(p => p.S_AREA_CODE == areaCode && p.N_LOCK_STATE == 0 && p.C_ENABLE == "Y") |
| | | .Where(s => locCntrs.Contains(s.S_CODE.Trim())) |
| | | .ToList(); |
| | | |
| | |
| | | //找到该点位的库区 |
| | | var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.PointCode).First(); |
| | | //没锁再继续走 |
| | | if (loc.N_LOCK_STATE == 0 && loc != null) |
| | | if (loc.N_LOCK_STATE == 0 && loc.C_ENABLE =="Y" && loc != null) |
| | | { |
| | | var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault(); |
| | | //如果是送检入库区 |
| | |
| | | { |
| | | //创建任务 从空托缓存区到拆托机 |
| | | var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == loc.S_AREA_CODE |
| | | && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0).OrderByDescending(a => a.N_ROW) |
| | | && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderByDescending(a => a.N_ROW) |
| | | .OrderByDescending(a => a.N_COL).First(); |
| | | var startLoc = list.S_CODE; |
| | | |
| | |
| | | } |
| | | //终点 |
| | | var endloc = db.Queryable<Location>().Where(a => a.S_CODE == model.END_LOC).First(); |
| | | if (endloc == null || endloc.N_LOCK_STATE != 0) |
| | | if (endloc == null || endloc.N_LOCK_STATE != 0 || endloc.C_ENABLE != "Y") |
| | | { |
| | | return new Results { Code = "1", Message = $"{model.END_LOC}库位已被锁定!", Data = null }; |
| | | } |
| | |
| | | try |
| | | { |
| | | var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.BIND_LOC).First(); |
| | | if (loc == null || loc.N_LOCK_STATE != 0) |
| | | if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y") |
| | | { |
| | | return new Results { Code = "1", Message = $"绑定货位不存在或已被锁", Data = null }; |
| | | |
| | |
| | | { |
| | | var db = new SqlHelper<Location>().GetInstance(); |
| | | |
| | | LogHelper.Info($"tcpOffline=====参数:起点货位{startLoc}终点库区{endArea}"); |
| | | try |
| | | { |
| | | //校验起点货位是否存在/锁住 |
| | | var loc = db.Queryable<Location>().Where(a => a.S_CODE == startLoc).First(); |
| | | if (loc == null || loc.N_LOCK_STATE != 0) |
| | | if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y") |
| | | { |
| | | LogHelper.Info("起点货位不存在或已锁" + startLoc); |
| | | return false; |
| | |
| | | // itemCode = model.S_ITEM_CODE; |
| | | // wlName = db.Queryable<TN_Material>().Where(b => b.S_ITEM_CODE == model.S_ITEM_CODE).First().S_ITEM_NAME; |
| | | //} |
| | | if (OutLoc==null) |
| | | { |
| | | LogHelper.Info($"终点货位不存在", "按钮盒下线"); |
| | | return false; |
| | | } |
| | | ContainerHelper.BindLocCntrs(OutLoc.S_CODE, trayCode, itemCode, wlName); |
| | | //创建任务 |
| | | LogHelper.Info($"创建任务 起点:{startLoc}终点:{OutLoc.S_CODE}", "按钮盒下线"); |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine("materialOffline:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("materialOffline:" + ex.Message, ex); |
| | | Console.WriteLine("tcpOffline:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("tcpOffline:" + ex.Message, ex); |
| | | throw; |
| | | } |
| | | } |
| | |
| | | { |
| | | //校验终点货位是否锁 |
| | | var endloc = db.Queryable<Location>().Where(a => a.S_CODE == endLoc).First(); |
| | | if (endloc == null || endloc.N_LOCK_STATE != 0) |
| | | if (endloc == null || endloc.N_LOCK_STATE != 0 || endloc.C_ENABLE != "Y") |
| | | { |
| | | LogHelper.Info("终点货位已锁" + endLoc); |
| | | return false; |