using HH.WCS.ZhongCeJinTan; using HH.WCS.ZhongCeJinTan.util; using HH.WCS.ZhongCeJinTan.wms; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using static HH.WCS.ZhongCeJinTan.util.Settings; using static HH.WCS.ZhongCeJinTan.wms.WcsModel; namespace HH.WCS.ZhongCeJinTan.wms { internal class LocationHelper { private static Dictionary locations = null; //private static Dictionary locationExts = null; static LocationHelper() { //初始化location加入到字典缓存 locations = new Dictionary(); var list = GetAllLocList(); if (list.Count > 0) { list.ForEach(a => { if (!locations.ContainsKey(a.S_CODE)) { locations.Add(a.S_CODE, a); } }); } //初始化locationExt加入到集合缓存 //locationExts = new Dictionary(); //var exts = GetAllLocExtList(); //if (exts.Count > 0) { // exts.ForEach(a => { // var key = $"{a.S_LOC_CODE.Trim()}_{a.S_PICKUP_POINT.Trim()}"; // if (!locationExts.ContainsKey(key)) { // locationExts.Add(key, a); // } // }); //} } internal static bool CheckExist(string loc) { return locations.Keys.Contains(loc); } internal static Location GetLocation(string loc) { if (CheckExist(loc.Trim())) { return locations[loc.Trim()]; } return null; } /// /// 获取所有货位信息 /// /// internal static List GetAllLocList() { var db = new SqlHelper().GetInstance(); return db.Queryable().ToList(); } /// /// 获取货位信息,参数库区编号,按照排列从小到大排序 /// internal static List GetAllLocList1(string S_AREA_CODE) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.C_ENABLE == "Y").OrderBy(a=> a.N_ROW).OrderBy(a => a.N_COL).ToList(); } /// /// 获取货位信息,参数库区编号,按照列从大到小排序 /// internal static List GetAllLocList2(string S_AREA_CODE) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.C_ENABLE == "Y").OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).ToList(); } /// /// 获取货位信息,参数库区编号 /// internal static List GetConnectionList(string S_AREA_CODE) { var db = new SqlHelper().GetInstance(); var ConnectionList = db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.C_ENABLE == "Y").OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).ToList(); List result = new List(); foreach (var item in ConnectionList) { result.Add(item.S_CODE); } return result; } /// /// 找终点巷道可用空货位 /// /// /// internal static Location FindEndcolByLocList(List locations,string endArea,string rodway="") { try { var db = new SqlHelper().GetInstance(); Location end = null; //根据终点货位找空闲货位 var rows = locations.Select(a => a.N_ROW).Distinct().ToList(); //作业流程的巷道 var xd = new List(); List rowdwa = null; if (!string.IsNullOrEmpty(rodway)) { xd = rodway.Split('-').ToList(); rowdwa = db.Queryable().Where(x => x.areaCode == endArea && x.status == "0" && xd.Contains(x.roadWay)).ToList(); } else { //查找可用巷道 rowdwa = db.Queryable().Where(x => x.areaCode == endArea && x.status == "0").ToList(); } for (int i = 0; i < rows.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList(); var flag = false; var flag1 = false; foreach (var item in rowdwa) { if (rowList.Count(a => a.N_ROADWAY.ToString()== item.roadWay) > 0) { flag = true; break; } } foreach (var item1 in xd) { if (rowList.Count(a => a.N_ROADWAY.ToString() != item1) > 0) { flag1 = true; break; } } if (flag1 || flag) { continue; } if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0) { Location other = null; //当前排没有锁并且有空位置 //先找满位,然后后面一位要么是空,要么不存在 var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault(); if (full == null) { //没有满位,那就找最小的空位 other = rowList.Where(b=>b.S_LOCK_STATE=="无").OrderBy(a => a.N_COL).FirstOrDefault(); } else { other = rowList.Where(b => b.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault(); } if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "N")) { //禁用了选择后面一个货位 other = db.Queryable().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "N") && a.S_AREA_CODE == other.S_AREA_CODE && a.S_LOCK_STATE=="无"&& a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First(); } if (other != null) { end = other; break; } } } return end; } catch (Exception) { throw; } } /// /// 找终点可用空货位排除不可用巷道 /// /// /// internal static Location FindEndcolByLoc(List locations, string endArea) { try { var db = new SqlHelper().GetInstance(); Location end = null; //根据终点货位找空闲货位 var rows = locations.Select(a => a.N_ROW).Distinct().ToList(); var rowdwa = db.Queryable().Where(x => x.areaCode == endArea && x.status == "0").ToList(); for (int i = 0; i < rows.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList(); var flag = false; foreach (var item in rowdwa) { if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0) { flag = true; break; } } if (flag) { continue; } if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0) { Location other = null; //当前排没有锁并且有空位置 //先找满位,然后后面一位要么是空,要么不存在 var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault(); if (full == null) { //没有满位,那就找最小的空位 other = rowList.Where(b => b.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).FirstOrDefault(); } else { other = rowList.Where(b => b.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault(); } if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "N")) { //禁用了选择后面一个货位 other = db.Queryable().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "N") && a.S_AREA_CODE == other.S_AREA_CODE && a.S_LOCK_STATE == "无" && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First(); } if (other != null) { end = other; break; } } } return end; } catch (Exception) { throw; } } /// /// 找终点可用空货位排除不可用巷道 /// /// /// internal static Location FindEndcolByLoc1(List locations, string endArea) { try { var db = new SqlHelper().GetInstance(); Location end = null; //根据终点货位找空闲货位 var rows = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rows.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList(); if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0) { Location other = null; //当前排没有锁并且有空位置 //先找满位,然后后面一位要么是空,要么不存在 var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault(); if (full == null) { //没有满位,那就找最小的空位 other = rowList.Where(b => b.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).FirstOrDefault(); } else { other = rowList.Where(b => b.S_LOCK_STATE == "无").OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault(); } if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "N")) { //禁用了选择后面一个货位 other = db.Queryable().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "N") && a.S_AREA_CODE == other.S_AREA_CODE && a.S_LOCK_STATE == "无" && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First(); } if (other != null) { end = other; break; } } } return end; } catch (Exception) { throw; } } /// /// 找起点满货位 /// /// /// internal static Location FindStartcolByLoclistAndCol(List locations) { try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //当前排有锁并且没有货位,排除 if (rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") > 0 || rowList.Count(a => a.N_CURRENT_NUM == 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } start = locations.FindAll(a => a.N_CURRENT_NUM == 1 && a.S_LOCK_STATE == "无").OrderByDescending(a => a.N_COL).FirstOrDefault(); return start; } catch (Exception) { throw; } } /// /// 根据起点立库区找空托 /// /// /// internal static Location FindStartcolByLoclistAndcntr(List locations,string startArea) { var db = new SqlHelper().GetInstance(); try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); //查找可用巷道 var rowdwa = db.Queryable().Where(x => x.areaCode == startArea && x.status == "0").ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); var flag = false; foreach (var item in rowdwa) { if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0) { flag = true; break; } } if (flag) { continue; } //当前排有锁并且没有满货位,排除 if ( rowList.Count(a => a.N_CURRENT_NUM == 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } foreach (var item in locations) { if (item.N_CURRENT_NUM == 0) { continue; } var tp = db.Queryable().Where(s => s.S_LOC_CODE == item.S_CODE).First(); if (tp != null && item.S_LOCK_STATE == "无") { var tp1 = db.Queryable().Where(s => s.S_CODE == tp.S_CNTR_CODE).First(); if (tp1 != null && tp1.N_DETAIL_COUNT==0) { start = item; break; } } } return start; } catch (Exception) { throw; } } /// /// 根据起点货架区找空托 /// /// /// internal static Location FindStartcolByHjArea(List locations, string startArea) { var db = new SqlHelper().GetInstance(); try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //当前排有锁并且没有满货位,排除 if (rowList.Count(a => a.N_CURRENT_NUM == 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } foreach (var item in locations) { if (item.N_CURRENT_NUM==0) { continue; } var tp = db.Queryable().Where(s => s.S_LOC_CODE == item.S_CODE).First(); if (tp != null && item.S_LOCK_STATE == "无") { if (tp.S_CNTR_CODE.Contains("KJZ")) { continue; } var tp1 = db.Queryable().Where(s => s.S_CODE == tp.S_CNTR_CODE).First(); if (tp1 != null && tp1.N_DETAIL_COUNT == 0) { start = item; break; } } } return start; } catch (Exception) { throw; } } /// /// 根据起点货架区找空托 /// /// /// internal static Location FindStartcolByHjAreaKjz(List locations, string startArea) { var db = new SqlHelper().GetInstance(); try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //当前排有锁并且没有满货位,排除 if (rowList.Count(a => a.N_CURRENT_NUM == 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } foreach (var item in locations) { if (item.N_CURRENT_NUM == 0) { continue; } var tp = db.Queryable().Where(s => s.S_LOC_CODE == item.S_CODE).First(); if (tp != null && item.S_LOCK_STATE == "无") { if (tp.S_CNTR_CODE.Contains("KJZ")) { var tp1 = db.Queryable().Where(s => s.S_CODE == tp.S_CNTR_CODE).First(); if (tp1 != null && tp1.N_DETAIL_COUNT == 0) { start = item; break; } } } } return start; } catch (Exception) { throw; } } /// /// 根据物料编码找立库区起点满货位 /// /// /// internal static Location FindStartcolByLoclistAndItem(List locations,string itemCode,string endArea,string rodway="") { var db = new SqlHelper().GetInstance(); try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); LogHelper.Info($"ZCSendTask出库任务排除不可用巷道开始", "Mes任务下发"); //作业流程的巷道 var xd = new List(); List rowdwa = null; if (!string.IsNullOrEmpty(rodway)) { xd = rodway.Split('-').ToList(); rowdwa = db.Queryable().Where(x => x.areaCode == endArea && x.status == "0" && xd.Contains(x.roadWay)).ToList(); } else { //查找可用巷道 rowdwa = db.Queryable().Where(x => x.areaCode == endArea && x.status == "0").ToList(); } //if (rodway.Count()==0) //{ // LogHelper.Info($"ZCSendTask出库任务起点库区{endArea}找不到可用巷道", "Mes任务下发"); // return null; //} for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); var flag = false; var flag1 = false; foreach (var item in rowdwa) { if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0) { flag = true; break; } } foreach (var item1 in xd) { if (rowList.Count(a => a.N_ROADWAY.ToString() != item1) > 0) { flag1 = true; break; } } if (flag1 || flag) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } //rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") > 0 || //当前排有锁并且没有满货位,排除 if ( rowList.Count(a => a.N_CURRENT_NUM == 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } DateTime date = DateTime.Now; List startList = new List(); ; LogHelper.Info($"ZCSendTask出库任务排除不可用巷道完成", "Mes任务下发"); foreach (var item in locations) { if (item.N_CURRENT_NUM==0) { continue; } var tp = db.Queryable().Where(s => s.S_LOC_CODE == item.S_CODE).First(); LogHelper.Info($"ZCSendTask出库任务下发起点货位容器信息" + JsonConvert.SerializeObject(tp), "Mes任务下发"); if (tp != null && item.S_LOCK_STATE == "无") { var tp1 = db.Queryable().Where(s => s.S_CNTR_CODE == tp.S_CNTR_CODE).First(); LogHelper.Info($"ZCSendTask出库任务下发起点容器物料信息" + JsonConvert.SerializeObject(tp1), "Mes任务下发"); if (tp1 != null && tp1.S_ITEM_CODE== itemCode&& tp1.S_ITEM_STATE == "合格" && tp1.takeEffectTime < date && tp1.expireTime > date) { LogHelper.Info($"ZCSendTask出库任务下发起点合格容器物料,容器号{tp1.S_CNTR_CODE}", "Mes任务下发"); startList.Add(tp1); } } } LogHelper.Info($"ZCSendTask出库任务下发起点合格物料数量{startList.Count}", "Mes任务下发"); var startItem = startList.OrderBy(a => a.PRODUCTIONDATE).FirstOrDefault(); LogHelper.Info($"ZCSendTask出库任务下发起点按生产时间排序物料信息" + JsonConvert.SerializeObject(startItem), "Mes任务下发"); if (startItem!=null) { var tp = db.Queryable().Where(s => s.S_CNTR_CODE == startItem.S_CNTR_CODE).First(); start = LocationHelper.GetLocOne(tp.S_LOC_CODE); LogHelper.Info($"ZCSendTask出库任务下发起点货位信息" + JsonConvert.SerializeObject(start), "Mes任务下发"); } return start; } catch (Exception) { throw; } } /// /// 根据物料编码找货架区起点满货位 /// /// /// internal static Location FindStartcolByHjLoclistAndItem(List locations, string itemCode, string endArea) { var db = new SqlHelper().GetInstance(); try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") > 0 || //当前排有锁并且没有满货位,排除 if (rowList.Count(a => a.N_CURRENT_NUM == 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } DateTime date = DateTime.Now; List startList = new List(); ; foreach (var item in locations) { if (item.N_CURRENT_NUM == 0) { continue; } var tp = db.Queryable().Where(s => s.S_LOC_CODE == item.S_CODE).First(); LogHelper.Info($"ZCSendTask出库任务下发起点货位容器信息" + JsonConvert.SerializeObject(tp), "Mes任务下发"); if (tp != null && item.S_LOCK_STATE == "无") { var tp1 = db.Queryable().Where(s => s.S_CNTR_CODE == tp.S_CNTR_CODE).First(); LogHelper.Info($"ZCSendTask出库任务下发起点容器物料信息" + JsonConvert.SerializeObject(tp1), "Mes任务下发"); if (tp1 != null && tp1.S_ITEM_CODE == itemCode ) { LogHelper.Info($"ZCSendTask出库任务下发起点合格容器物料,容器号{tp1.S_CNTR_CODE}", "Mes任务下发"); startList.Add(tp1); } } } LogHelper.Info($"ZCSendTask出库任务下发起点合格物料数量{startList.Count}", "Mes任务下发"); var startItem = startList.OrderBy(a => a.PRODUCTIONDATE).FirstOrDefault(); LogHelper.Info($"ZCSendTask出库任务下发起点按生产时间排序物料信息" + JsonConvert.SerializeObject(startItem), "Mes任务下发"); if (startItem != null) { var tp = db.Queryable().Where(s => s.S_CNTR_CODE == startItem.S_CNTR_CODE).First(); start = LocationHelper.GetLocOne(tp.S_LOC_CODE); LogHelper.Info($"ZCSendTask出库任务下发起点货位信息" + JsonConvert.SerializeObject(start), "Mes任务下发"); } return start; } catch (Exception) { throw; } } internal static List GetAllLocList1(string S_AREA_CODE, string row) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.N_ROW.ToString() == row).OrderBy(a => a.N_COL).ToList(); } /// /// 获取货位信息,参数货位编号 /// internal static List GetAllLocList(string S_AREA_CODE) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE).ToList(); } internal static List GetAllLocList6(string S_AREA_CODE) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE).OrderBy(b=> b.N_COL).ToList(); } /// /// 获取货位信息,参数货位编号 /// internal static Location GetLocOne(string S_LOC_CODE) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_CODE == S_LOC_CODE).First(); } /// /// 获取有锁货位信息,参数库区编号 /// internal static List GetAllLockLocList1(string S_AREA_CODE,int row) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.N_ROW ==row && s.S_LOCK_STATE != "无").ToList(); } /// /// 获取有锁货位信息,参数库区编号,巷道号 /// internal static List GetAllLockLocList1(string S_AREA_CODE, int row,int xd) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.S_LOCK_STATE != "无" && s.N_ROADWAY==xd).ToList(); } internal static List GetAllLockLocList(string S_LOC_CODE) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(s => s.S_CODE == S_LOC_CODE && s.S_LOCK_STATE != "无").ToList(); } internal static int GetArea(string area) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(a => a.S_START_AREA==area && a.S_B_STATE != "完成" && a.S_B_STATE != "未执行" && a.S_B_STATE != "失败" && a.S_B_STATE != "取消").ToList().Count(); } internal static Location GetLoc(string code) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(a => a.S_CODE.Trim() == code).First(); } internal static Location GetLocByWorkName(string workName) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(a => a.S_AGV_SITE.Trim() == workName).First(); } internal static string GetLocCntrCode(string locCode) { var db = new SqlHelper().GetInstance(); var tp = db.Queryable().Where(s => s.S_LOC_CODE == locCode).First(); return tp.S_CNTR_CODE; } /// ///获取所有货位扩展信息 /// /// //internal static List GetAllLocExtList() { // var db = new SqlHelper().GetInstance(); // return db.Queryable().ToList(); //} /// /// 判断没有入库锁和出库锁 /// /// /// internal static bool CheckLocFree(string code) { var result = false; var loc = GetLoc(code); if (loc != null) { result = loc.S_LOCK_STATE.Trim() == "无"; } return result; } /// /// 根据容器编号获取货位容器信息 /// /// /// internal static LocCntrRel GetLocCntr(string cntrNo) { var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a =>a.S_CNTR_CODE.Contains(cntrNo)).First(); return list; } /// /// 根据货位集合获取有容器的货位 /// /// /// internal static List GetLocList(List loc) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM > 0).ToList(); return list; } internal static List GetLocListAny(string area) { try { var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == area).OrderBy(b=>b.N_ROW).ToList(); return list; } catch (Exception ex) { //Console.WriteLine(ex.Message); throw ex; } } internal static List GetLocListAny1(string area) { try { var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == area).OrderBy(b => b.N_ROW).ToList(); return list; } catch (Exception ex) { //Console.WriteLine(ex.Message); throw ex; } } internal static List GetLocListAny(string area, int row) { try { var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == area && a.N_ROW == row).ToList(); return list; } catch (Exception ex) { //Console.WriteLine(ex.Message); throw ex; } } //internal static List GetAllFreeLineInfo() { // var db = new SqlHelper().GetInstance(); // return db.Queryable().ToList(); //} /// /// 根据货位编码获取货位信息,不管有没有容器 /// /// /// internal static List GetLocListAny(List loc) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => loc.Contains(a.S_CODE)).ToList(); return list; } /// /// 根据货位集合获取有容器 没有锁的货位 /// /// /// internal static List GetLocListFree(List loc) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE.Trim() == "无").ToList(); return list; } /// /// 获取固定数量容器 没有锁的货位 /// /// /// /// internal static List GetLocListFree(List loc, int current) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM == current && a.S_LOCK_STATE.Trim() == "无").ToList(); return list; } /// /// 获取数量大于等于固定数量容器 没有锁的货位 /// /// /// /// internal static List GetLocList(List loc, int current) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM >= current && a.S_LOCK_STATE.Trim() == "无").ToList(); return list; } /// /// 根据货位集合获取 没有容器 没有锁的货位 /// /// /// internal static List GetLocListEmptyFree(List loc) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "无").ToList(); return list; } /// /// 入库锁定终点,出库锁定起点 /// /// /// 1:入库锁、2:出库锁、2:其它锁 /// public static bool LockLoc(string loc, string lockState,int lockNo) { var res = false; var db = new SqlHelper().GetInstance(); var model = db.Queryable().Where(a => a.S_CODE == loc).First(); if (model != null && model.S_LOCK_STATE.Trim() == "无") { model.S_LOCK_STATE = lockState; model.N_LOCK_STATE = lockNo; res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE,it.N_LOCK_STATE }).ExecuteCommand() > 0; } return res; } /// /// 取货完解锁起点,卸货完解锁终点,可检验锁的来源,也可以不校验 /// /// /// public static bool UnLockLoc(string loc) { LogHelper.Info("UnLockLoc:" + loc); var res = false; var db = new SqlHelper().GetInstance(); var model = db.Queryable().Where(a => a.S_CODE == loc).First(); if (model != null) { model.S_LOCK_STATE = "无"; model.N_LOCK_STATE = 0; res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0; LogHelper.Info("UnLockLoc:解锁结果" + res); } else { LogHelper.Info("UnLockLoc 失败"); } return res; } internal static string GetAgvSiteZc(string loc) { var location = GetLocOne(loc.Trim()); return location.S_AGV_SITE; } public static bool LockLoc(string loc) { LogHelper.Info("UnLockLoc:" + loc); var res = false; var db = new SqlHelper().GetInstance(); var model = db.Queryable().Where(a => a.S_CODE == loc).First(); if (model != null) { model.S_LOCK_STATE = "入库锁"; res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0; } return res; } public static bool updateLocLock(string loc,int state,string states) { LogHelper.Info($"updateLocLock:loc:{loc},state:{state},states:{states}" ); var res = false; var db = new SqlHelper().GetInstance(); var model = db.Queryable().Where(a => a.S_CODE == loc).First(); if (model != null) { model.S_LOCK_STATE = states; model.N_LOCK_STATE = state; res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0; } LogHelper.Info($"updateLocLock:loc:{loc},state:{state},states:{states},res:{res}"); return res; } /// /// 添加上下架表 /// /// /// internal static bool CreateUpAndDown(WMSTask task) { LogHelper.Info($"任务{task.S_CODE}添加上下架表", "上下架记录"); var db = new SqlHelper().GetInstance(); try { var cntr = ContainerHelper.GetCntr(task.S_CNTR_CODE); if (cntr == null) { LogHelper.Info($"任务{task.S_CODE}添加上下架表没查到容器{task.S_CNTR_CODE}", "上下架记录"); return false; } var cntr1 = new RecordUpAndDown(); var work = db.Queryable().Where(it => it.S_CODE==task.S_OP_CODE ).First(); if (work == null) { LogHelper.Info($"任务{task.S_CODE}添加上下架表没查到作业{task.S_OP_CODE}", "上下架记录"); } var type = "上架"; if (task.S_TYPE.Contains("出库")) { type = "下架"; } var c = 0; cntr1.S_ACTION = type; cntr1.S_END_LOC = work.S_END_LOC; cntr1.S_CNTR_CODE = task.S_CNTR_CODE; cntr1.S_LOC_CODE = work.S_START_LOC; cntr1.S_TRAY_TYPE = cntr.S_TYPE; cntr1.S_OPTASK = task.S_CODE; cntr1.T_INBOUND_TIME = DateTime.Now; if (cntr.N_DETAIL_COUNT > 0) { var cntrItem = ContainerHelper.GetCntrItem(task.S_CNTR_CODE); if (cntrItem == null) { LogHelper.Info($"任务{task.S_CODE}添加上下架表没查到容器物料{task.S_CNTR_CODE}", "上下架记录"); return false; } cntr1.expireTime=cntrItem.expireTime; cntr1.itemFeature=cntrItem.itemFeature; cntr1.F_QTY = cntrItem.F_QTY; cntr1.F_SUM_QTY = cntrItem.F_SUM_QTY; cntr1.TurnCardNum = cntrItem.TurnCardNum; cntr1.S_ITEM_CODE = cntrItem.S_ITEM_CODE; cntr1.S_ITEM_SPEC = cntrItem.S_ITEM_SPEC; cntr1.itemModel = cntrItem.itemModel; cntr1.Level = cntrItem.Level; cntr1.D_PRD_DATE = cntrItem.PRODUCTIONDATE; cntr1.S_ITEM_NAME = cntrItem.S_ITEM_NAME; cntr1.S_BATCH_NO = cntrItem.S_BATCH_NO; cntr1.S_ITEM_STATE = cntrItem.S_ITEM_STATE; cntr1.takeEffectTime = cntrItem.takeEffectTime; //if (task.S_TYPE.Contains("入库")&&task.S_SCHEDULE_TYPE.Contains("wcs")) //{ // var endLoc = LocationHelper.GetLocOne(task.S_END_LOC); // endLoc.PRODUCTIONDATE = cntrItem.PRODUCTIONDATE; // c = db.Updateable(endLoc).UpdateColumns(it => new { it.PRODUCTIONDATE }).ExecuteCommand(); //} } db.BeginTran(); var b = db.Insertable(cntr1).ExecuteCommand(); LogHelper.Info($"任务{task.S_CODE}添加上下架表影响行数:b:{b},c:{c}", "上下架记录"); if ( b > 0) { db.CommitTran(); LogHelper.Info($"任务{task.S_CODE}添加上下架表成功", "上下架记录"); return true; } else { db.RollbackTran(); LogHelper.Info($"任务{task.S_CODE}添加上下架表失败" , "上下架记录"); return false; } } catch (Exception ex) { db.RollbackTran(); LogHelper.Info($"任务{task.S_CODE}添加上下架表异常" + ex.Message,"上下架记录"); return false; throw; } } /// /// 删除货位容器表记录,修改货位容器数量 /// /// /// /// public static bool UnBindingLoc(string loc, List cntrs) { LogHelper.Info($"UnBindingLoc信息:loc:{loc},cntrs:{cntrs}"); var res = false; var db = new SqlHelper().GetInstance(); var location = db.Queryable().Where(a => a.S_CODE == loc).First(); try { db.BeginTran(); var lcrList = db.Queryable().Where(a => a.S_LOC_CODE == loc).ToList(); var count = db.Deleteable().Where(it => cntrs.Contains(it.S_CNTR_CODE) && it.S_LOC_CODE == loc).ExecuteCommand(); LogHelper.Info($"lcrList信息" + JsonConvert.SerializeObject(lcrList)); LogHelper.Info($"count信息" + JsonConvert.SerializeObject(count)); location.N_CURRENT_NUM = lcrList.Count - count; location.S_LOCK_STATE = "无"; location.N_LOCK_STATE = 0; db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); LogHelper.Info($"解绑异常{ex.Message}"); } return res; } /// /// 货位绑定容器 /// /// /// /// public static bool BindingLoc(string loc, List cntrs) { var res = false; var db = new SqlHelper().GetInstance(); var location = db.Queryable().Where(a => a.S_CODE == loc).First(); try { var lcrList = db.Queryable().Includes(a => a.Container).Where(a => a.S_LOC_CODE == loc).ToList(); db.BeginTran(); int count = 0; cntrs.ForEach(a => { if (lcrList.Count(b => b.S_CNTR_CODE.Trim() == a) == 0) { db.Insertable(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = a }).ExecuteCommand(); count++; } }); location.N_CURRENT_NUM = lcrList.Count + count; location.N_LOCK_STATE = 0; location.S_LOCK_STATE = "无"; db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { Console.WriteLine(ex.Message); db.RollbackTran(); LogHelper.Info($"绑定异常{ex.Message}"); } return res; } } }