.gitignore
@@ -185,3 +185,4 @@ # Microsoft Fakes FakesAssemblies/ /HH.WCS.QingXiNongfu/.vs HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang.csproj.dtbcache.json
File was deleted HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/CopilotIndices/17.13.431.34963/CodeChunks.dbBinary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/CopilotIndices/17.13.431.34963/SemanticSymbols.dbBinary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/12715c31-ac81-4915-9979-c4626f82f8fd.vsidxBinary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/2a563d8c-3ecc-470f-9961-cffb13b20226.vsidxBinary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/624636c7-9edc-488c-b412-0c42e2169303.vsidxBinary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/config/applicationhost.config
File was deleted HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/copilot-chat/5812ce9b/sessions/4b7eb4c4-7c03-4aee-9f74-1e5c93b3be46Binary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/v17/DocumentLayout.backup.json
File was deleted HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/v17/DocumentLayout.json
File was deleted HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/v17/HierarchyCache.v1.txtBinary files differ
HH.WCS.QingXiNongfu/Program.cs
@@ -178,12 +178,16 @@ //var v = new string[] { "QX-04_J", "QX-04_D", "QX04_J", "QX4_X", "QX-12_A", "QX-08_X", "QX-08_XC", "QX-08_DC" }; //foreach (var item in v) //{ // var m = System.Text.RegularExpressions.Regex.Matches(item, @"QX-\d+_[A-Z]+"); // if (m.Count > 0) // foreach (Match match in m) // { // Console.WriteLine(match.Value); // } // var m = System.Text.RegularExpressions.Regex.IsMatch(item, @"QX-\d+_X$"); // if (m) // { // Console.WriteLine(m); // } // //if (m.Count > 0) // // foreach (System.Text.RegularExpressions.Match match in m) // // { // // Console.WriteLine(match.Value); // // } //} //Console.WriteLine(""); //new WmsController().BindLoc3(new { loc = "PPMKCK=1-2", LineNo = "翻斗机", ItemCode = "550ml水_15入_膜包_6" }); @@ -731,6 +735,7 @@ GetTask(Monitor.A),//计数器 清除 控制台 //添加任务推送线程 GetTask(TaskCore.Dispatch), GetTask(TaskCore.Kuronggg), GetTask(TaskCore.ChargeHostAgv), //手动转运 HH.WCS.QingXiNongfu/core/Monitor.cs
@@ -850,7 +850,7 @@ { var locs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW); if (locs.Find(x => x.N_CURRENT_NUM > 0) == null) LocationHelper.SetRowLock(item, 0); WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand()); } } Rlock = Rlocks.FindAll(x => x.S_LOCK_STATE.Contains("入库锁")); @@ -867,11 +867,11 @@ // LocationHelper.SetRowLock(item, 0); //} //如果一排内无货。也无锁。 可能是物料的入库取消了。 取消当前排锁,防止后续不入这个物料了依然占着排。 if (locs.Find(x => x.N_CURRENT_NUM > 0) == null && locs.Find(x => x.S_LOCK_STATE != "无") == null) LocationHelper.SetRowLock(item, 0); if (locs.Find(x => x.N_CURRENT_NUM > 0) == null && locs.Find(x => x.S_LOCK_STATE != "无") == null) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand()); else { var lastloC = locs.OrderByDescending(x => x.N_COL).FirstOrDefault(); if (lastloC.N_CURRENT_NUM == lastloC.N_CAPACITY) LocationHelper.SetRowLock(item, 0); if (lastloC.N_CURRENT_NUM == lastloC.N_CAPACITY) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand()); } } } @@ -3544,7 +3544,7 @@ public static void AutoRun13TSJ() { var list = new List<string>() { "YWLAQWJ", "YWLBQWJ", "YWLCQSX", "YWLDQWJ" }; var WorkOrder = new List<YWLWorkOrder>(); //var WorkOrder = new List<YWLWorkOrder>(); foreach (var PLC in Settings.GetDeviceInfoList().FindAll(X => X.deviceType == 13 && X.enable == 1)) { string pline = PLC.deviceName; @@ -3552,7 +3552,6 @@ pline = "T2提升机-纸箱"; var orkOrd = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中"); orkOrd = orkOrd.FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10); bool can = false; if (orkOrd.Any()) { @@ -3564,42 +3563,46 @@ continue; can = true; foreach (var item in list) { YWLWorkOrder source = new YWLWorkOrder(); var source1 = orkOrd.FirstOrDefault(); source.SQL_PLineNo = source1.SQL_PLineNo; source.FuLe_PLine_No = source1.FuLe_PLine_No; source.SQL_LinkLineNO = source1.SQL_LinkLineNO; source.SQL_Area = item; source.SQL_UsingNow = source1.SQL_UsingNow; source.SQL_State = source1.SQL_State; source.SQL_WorkNo = source1.SQL_WorkNo; source.SQL_ItemCode = source1.SQL_ItemCode; source.SQL_ItemName = source1.SQL_ItemName; source.SQL_charge = source1.SQL_charge; source.SQL_Total = source1.SQL_Total; source.SQL_PLAN_END = source1.SQL_PLAN_END; source.SQL_Modify_TIme = source1.SQL_Modify_TIme; source.OutNum = source1.OutNum; source.WorkType = source1.WorkType; source.MidArea = source1.MidArea; source.TagOver = source1.TagOver; source.TagOverTime = source1.TagOverTime; source.S_BQ_TRAY_TYPE = source1.S_BQ_TRAY_TYPE; source.S_CJ_NAME = source1.S_CJ_NAME; source.S_ROW = item; WorkOrder.Add(source); } //var source1 = orkOrd.FirstOrDefault(); //foreach (var item in list) //{ // YWLWorkOrder source = new YWLWorkOrder(); // source.SQL_PLineNo = source1.SQL_PLineNo; // source.FuLe_PLine_No = source1.FuLe_PLine_No; // source.SQL_LinkLineNO = source1.SQL_LinkLineNO; // source.SQL_Area = item; // source.SQL_UsingNow = source1.SQL_UsingNow; // source.SQL_State = source1.SQL_State; // source.SQL_WorkNo = source1.SQL_WorkNo; // source.SQL_ItemCode = source1.SQL_ItemCode; // source.SQL_ItemName = source1.SQL_ItemName; // source.SQL_charge = source1.SQL_charge; // source.SQL_Total = source1.SQL_Total; // source.SQL_PLAN_END = source1.SQL_PLAN_END; // source.SQL_Modify_TIme = source1.SQL_Modify_TIme; // source.OutNum = source1.OutNum; // source.WorkType = source1.WorkType; // source.MidArea = source1.MidArea; // source.TagOver = source1.TagOver; // source.TagOverTime = source1.TagOverTime; // source.S_BQ_TRAY_TYPE = source1.S_BQ_TRAY_TYPE; // source.S_CJ_NAME = source1.S_CJ_NAME; // source.S_ROW = item; // WorkOrder.Add(source); //} } orkOrd = orkOrd.FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10); ReadCCK = can; if (orkOrd.Any()) // foreach (var od in orkOrd.OrderByDescending(x => x.OutNum)) foreach (var od in WorkOrder) foreach (var od in orkOrd.OrderBy(x => x.TagOverTime).ThenBy(x => x.OutNum)) //foreach (var od in od2.ToList()) { list.Remove(od.S_ROW); var odsr = new List<string> { od.S_ROW }.Concat(list).Distinct().ToList(); ///汇总仓库里最大层是几层。 Dictitems Lart = null; foreach (var area in od.S_ROW.Split('$')) foreach (var area in odsr)//od.S_ROW.Split('$')) { if (dsi.TryGetValue(area, out var dictitems1)) { @@ -3616,107 +3619,113 @@ } } LogHelper.Info($"AutoRun13TSJ 筛选物料 库区排数据. {od.SQL_PLineNo} >>{od.OutNum}> {JsonConvert.SerializeObject(Lart)}"); // 需要数量 >= 仓库最大数量。 就开始出库。 if (od.OutNum >= Lart?.ItemLayer) { var v = new List<string>() { Lart.area }; Location StartBit = null; List<LocCntrRel> _clrel = new List<LocCntrRel>(); foreach (var area in v.Concat(od.S_ROW.Split('$')).Distinct()) if (Lart != null) if (od.OutNum >= Lart?.ItemLayer) { var AreaRowlist = LocationHelper.GetAreaNormalLocList(area); foreach (var item in AreaRowlist.GroupBy(x => x.N_ROW)) { var rl = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (rl == null) continue; _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE); //板型相同 var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0)); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem)); if (_clcntitem != null) { LogHelper.Info("相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME); if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME) { var v = new List<string>() { Lart.area }; Location StartBit = null; List<LocCntrRel> _clrel = new List<LocCntrRel>(); StartBit = rl; break; foreach (var area in v.Concat(od.S_ROW.Split('$')).Distinct()) { var AreaRowlist = LocationHelper.GetAreaNormalLocList(area); foreach (var item in AreaRowlist.GroupBy(x => x.N_ROW)) { var rl = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (rl == null) continue; _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE); //板型相同 var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0)); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem)); if (_clcntitem != null) { LogHelper.Info("相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME); if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME) { StartBit = rl; break; } } } if (StartBit != null) break; } if (StartBit != null) break; } if (StartBit == null) continue; Location Endbit = null; var loc = LocationHelper.GetLoc(PLC.location[0]); if (loc?.N_CURRENT_NUM == 0 && StartBit.N_CURRENT_NUM == 1 && DeviceProcess.doorStatus.ContainsKey(PLC.location[0])) { if (DeviceProcess.doorStatus[PLC.location[0]].info == "1") { Endbit = LocationHelper.GetLoc(PLC.location[0]); } } else { Endbit = LocationHelper.GetAreaNormalLocList(PLC.areaPriy[0]).Find(x => x.N_CURRENT_NUM == 0); } if (StartBit == null) continue; Location Endbit = null; if (StartBit != null && Endbit != null) { var crs = _clrel.Select(x => x.S_CNTR_CODE).ToList(); var EndBit = Endbit.S_LOC_CODE; if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ") var loc = LocationHelper.GetLoc(PLC.location[0]); if (loc?.N_CURRENT_NUM == 0 && StartBit.N_CURRENT_NUM == 1 && DeviceProcess.doorStatus.ContainsKey(PLC.location[0])) { var locs1 = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == "YWLWJJB" && x.S_LOCK_STATE != "报废" && x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).ToList(); if (locs1.Count() > 0) if (DeviceProcess.doorStatus[PLC.location[0]].info == "1") { EndBit = locs1.FirstOrDefault().S_LOC_CODE; } else { continue; Endbit = LocationHelper.GetLoc(PLC.location[0]); } } var b = TaskProcess.CreateTransport(od.SQL_WorkNo, StartBit.S_LOC_CODE, EndBit, "原物料搬运-纸箱", crs, StartBit.N_CURRENT_NUM - crs.Count + 1, 1, crs.Count, PLC.taskPri, "", Endbit.S_LOC_CODE); if (b) else { Endbit = LocationHelper.GetAreaNormalLocList(PLC.areaPriy[0]).Find(x => x.N_CURRENT_NUM == 0); } var r = new RowLock { S_LOCK_SRC = od.SQL_ItemCode, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW }; var db = new SqlHelper<object>().GetInstance(); //给终点锁定住 if (StartBit != null && Endbit != null) { var crs = _clrel.Select(x => x.S_CNTR_CODE).ToList(); var EndBit = Endbit.S_LOC_CODE; if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ") { var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == Endbit.S_LOC_CODE).First(); model.S_LOCK_STATE = "入库锁"; var res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0; LogHelper.Info(Endbit.S_LOC_CODE + "LockLoc:锁结果" + res); } //排锁 var row = db.Queryable<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); if (row != null) { if (row.S_LOCK_SRC != r.S_LOCK_SRC) var locs1 = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == "YWLWJJB" && x.S_LOCK_STATE != "报废" && x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).ToList(); if (locs1.Count() > 0) { db.Deleteable(row).ExecuteCommand(); db.Insertable(r).ExecuteCommand(); EndBit = locs1.FirstOrDefault().S_LOC_CODE; } else { continue; } } else db.Insertable(r).ExecuteCommand(); var b = TaskProcess.CreateTransport(od.SQL_WorkNo, StartBit.S_LOC_CODE, EndBit, "原物料搬运-纸箱", crs, StartBit.N_CURRENT_NUM - crs.Count + 1, 1, crs.Count, PLC.taskPri, "", Endbit.S_LOC_CODE); if (b) { var r = new RowLock { S_LOCK_SRC = od.SQL_ItemCode, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW }; var db = new SqlHelper<object>().GetInstance(); //给终点锁定住 if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ") { var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == Endbit.S_LOC_CODE).First(); model.S_LOCK_STATE = "入库锁"; var res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0; LogHelper.Info(Endbit.S_LOC_CODE + "LockLoc:锁结果" + res); } //排锁 var row = db.Queryable<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); if (row != null) { if (row.S_LOCK_SRC != r.S_LOCK_SRC) { db.Deleteable(row).ExecuteCommand(); db.Insertable(r).ExecuteCommand(); } } else db.Insertable(r).ExecuteCommand(); od.TagOverTime = DateTime.Now; db.Updateable(od).UpdateColumns(it => new { it.TagOverTime }).ExecuteCommand(); break; } } break; } } } } } public static void AutoRunABD() { LogHelper.Info($"AutoRunABD abcd物料汇总 >>{ReadCCK}|| {dsi.Count}"); if (!ReadCCK) { Thread.Sleep(3000); @@ -3747,8 +3756,13 @@ var rl = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); var _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info($"{area}>> {rl.S_LOC_CODE}有数量, 没托盘"); continue; } //板型相同 var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).FirstOrDefault(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘类型。"); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault(); @@ -3796,6 +3810,7 @@ } } } LogHelper.Info($"AutoRunABD abcd物料汇总完成 >>{ReadCCK}|| {dsi.Count}"); } public static void chargeCCD() HH.WCS.QingXiNongfu/core/TaskCore.cs
@@ -250,7 +250,250 @@ } } /// <summary> /// 60分钟更新一次库容 /// </summary> /// <param name="min"></param> public static void CheckKuRong(int min) { try { Console.WriteLine("CheckKurRong"); //如果表内没有数据就初始化一下,有数据了modify时间和当前时间超过30min再统计一次 var db = new SqlHelper<object>().GetInstance(); var info = db.Queryable<KuRong>().First(); if (info == null || DateTime.Now.Subtract(info.T_MODIFY).TotalMinutes > min) { //1、查到小板库区下面所有的库位 var totalX = 0; var totalRows = 0; var list = new List<KuRong>(); var areas = db.Queryable<Location>().Select(x => x.S_AREA_CODE).ToList().FindAll(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"QX-\d+_[A-Z]+")).Select(x => x.Split('_')[0]).Distinct().ToList(); //GetAreas(); areas.ForEach(area => { totalX += db.Queryable<Location>().Count(b => b.S_AREA_CODE.StartsWith(area) && b.S_AREA_CODE.Contains("_X")); totalRows += db.Queryable<Location>().Where(b => b.S_AREA_CODE.StartsWith(area) && b.S_AREA_CODE.Contains("_X")).Select(b => b.N_ROW).Distinct().Count(); var aresList = db.Queryable<Location>().Where(b => b.S_AREA_CODE.StartsWith(area) && b.S_AREA_CODE.Contains("_")).Select(b => b.S_AREA_CODE).Distinct().ToList(); aresList = aresList.Select(a => a.Split('_')[0]).Distinct().ToList(); aresList.ForEach(a => { //b => b.S_AREA_CODE == a + "_X" Console.WriteLine("area:" + a); // && b.S_AREA_CODE.EndsWith("X") var rows = db.Queryable<Location>().Where(b => b.S_AREA_CODE.StartsWith(a)).Select(b => b.N_ROW).Distinct().ToList(); if (rows.Count > 0) { Console.WriteLine(string.Join(",", rows)); rows.ForEach(b => { var kr = new KuRong() { StorageLoc = a.Split('-')[1] + "-" + b, T_MODIFY = DateTime.Now }; Console.WriteLine(kr.StorageLoc); //每一排要查一下有没有托盘 var listLoc = db.Queryable<Location>().Where(c => c.S_AREA_CODE.Contains(c.S_AREA_CODE) && c.N_ROW == b && c.N_CURRENT_NUM > 0).ToList(); if (!listLoc.Any()) { //没托盘,默认最大容量是小板的数量 var count = db.Queryable<Location>().Count(c => c.S_AREA_CODE == a + "_X" && c.N_ROW == b) * 2 * 2;//2层2托 kr.MaxCapacity = count; kr.AvailableCapacity = count; kr.ProductItem = ""; } else { //有托盘 判断是叠2层还是3层,要获取物料信息 var lcr = db.Queryable<LocCntrRel>().Includes(it => it.CntrItemRel).Where(l => l.S_LOC_CODE == listLoc[0].S_LOC_CODE).First(); if (lcr != null && lcr.CntrItemRel != null) { var maxLayer = ContainerHelper.GetItem(ass => ass.S_ITEM_NAME == lcr.CntrItemRel.S_ITEM_NAME && ass.S_ITEM_CODE == lcr.CntrItemRel.S_ITEM_CODE)?.MaxLayer ?? listLoc[0].N_CAPACITY; var total = db.Queryable<Location>().Count(c => c.S_AREA_CODE == listLoc[0].S_AREA_CODE && c.N_ROW == b) * maxLayer * 2; var count = db.Queryable<Location>().Where(c => c.S_AREA_CODE == listLoc[0].S_AREA_CODE && c.N_ROW == b && c.N_CURRENT_NUM > 0).Sum(c => c.N_CURRENT_NUM) * 2; // 指定统计字段 kr.ProductItem = lcr.CntrItemRel.S_ITEM_CODE; kr.MaxCapacity = total; kr.FilledCapacity = count; kr.AvailableCapacity = total - count; } } list.Add(kr); }); } else { Console.WriteLine("area:" + a + ":未获取到排"); } }); }); var ordersCount = db.Queryable<WorkOrder>().Where(a => a.SQL_State == "执行中").Count(); var totalDesiredCapacity = ordersCount * 4 * 3 * (totalX / totalRows); LogHelper.Error($"成品小板区总货位是{totalX},总排数是{totalRows},当前执行工单数量是{ordersCount}", null); var totalAvailableCapacity = list.Sum(a => a.AvailableCapacity); var totalAssignableCapacity = totalAvailableCapacity - totalDesiredCapacity; list.ForEach(a => { a.DesiredCapacity = totalDesiredCapacity; a.CRC = totalAvailableCapacity; a.RAC = totalAssignableCapacity; }); if (info == null) { /*SQL Server 1000 条/批次 单个 INSERT 语句最多支持 1000 条 VALUES 子句,超出会报语法错误。*/ db.Insertable(list).ExecuteCommand(); } else { //更新 list.ForEach(a => { var old = db.Queryable<KuRong>().Where(b => b.StorageLoc == a.StorageLoc).First(); if (old != null) { old.MaxCapacity = a.MaxCapacity; old.AvailableCapacity = a.AvailableCapacity; old.FilledCapacity = a.FilledCapacity; old.ProductItem = a.ProductItem; old.DesiredCapacity = a.DesiredCapacity; old.CRC = a.CRC; old.RAC = a.RAC; old.T_MODIFY = DateTime.Now; db.Updateable(old).UpdateColumns(it => new { it.MaxCapacity, it.FilledCapacity, it.AvailableCapacity, it.ProductItem, it.T_MODIFY }).ExecuteCommand(); } else { db.Insertable(a).ExecuteCommand(); } }); } } } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Error(ex.Message, ex); } //统计当前产线 } internal static void Kuronggg() { int min = 60; try { LogHelper.Info("Run>>CheckKurRong"); //如果表内没有数据就初始化一下,有数据了modify时间和当前时间超过30min再统计一次 var db = new SqlHelper<object>().GetInstance(); var info = db.Queryable<KuRong>().First(); if (info == null || DateTime.Now.Subtract(info.T_MODIFY).TotalMinutes > min) { //1、查到小板库区下面所有的库位 var totalX = 0; var totalRows = 0; var list = new List<KuRong>(); var areas = db.Queryable<Location>().Select(x => x.S_AREA_CODE).ToList().FindAll(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"QX-\d+_[A-Z]+")).Select(x => x.Split('_')[0]).Distinct().ToList(); //GetAreas(); areas.ForEach(area => { totalX += db.Queryable<Location>().Count(b => b.S_AREA_CODE.StartsWith(area) && b.S_AREA_CODE.Contains("_X")); totalRows += db.Queryable<Location>().Where(b => b.S_AREA_CODE.StartsWith(area) && b.S_AREA_CODE.Contains("_X")).Select(b => b.N_ROW).Distinct().Count(); var aresList = db.Queryable<Location>().Where(b => b.S_AREA_CODE.StartsWith(area) && b.S_AREA_CODE.Contains("_")).Select(b => b.S_AREA_CODE).Distinct().ToList(); aresList = aresList.Select(a => a.Split('_')[0]).Distinct().ToList(); aresList.ForEach(a => { //b => b.S_AREA_CODE == a + "_X" Console.WriteLine("area:" + a); // && b.S_AREA_CODE.EndsWith("X") var rows = db.Queryable<Location>().Where(b => b.S_AREA_CODE.StartsWith(a)).Select(b => b.N_ROW).Distinct().ToList(); if (rows.Count > 0) { Console.WriteLine(string.Join(",", rows)); rows.ForEach(b => { var kr = new KuRong() { StorageLoc = a.Split('-')[1] + "-" + b, T_MODIFY = DateTime.Now }; Console.WriteLine(kr.StorageLoc); //每一排要查一下有没有托盘 var listLoc = db.Queryable<Location>().Where(c => c.S_AREA_CODE.Contains(c.S_AREA_CODE) && c.N_ROW == b && c.N_CURRENT_NUM > 0).ToList(); if (!listLoc.Any()) { //没托盘,默认最大容量是小板的数量 var count = db.Queryable<Location>().Count(c => c.S_AREA_CODE == a + "_X" && c.N_ROW == b) * 2 * 2;//2层2托 kr.MaxCapacity = count; kr.AvailableCapacity = count; kr.ProductItem = ""; } else { //有托盘 判断是叠2层还是3层,要获取物料信息 var lcr = db.Queryable<LocCntrRel>().Includes(it => it.CntrItemRel).Where(l => l.S_LOC_CODE == listLoc[0].S_LOC_CODE).First(); if (lcr != null && lcr.CntrItemRel != null) { var maxLayer = ContainerHelper.GetItem(ass => ass.S_ITEM_NAME == lcr.CntrItemRel.S_ITEM_NAME && ass.S_ITEM_CODE == lcr.CntrItemRel.S_ITEM_CODE)?.MaxLayer ?? listLoc[0].N_CAPACITY; var total = db.Queryable<Location>().Count(c => c.S_AREA_CODE == listLoc[0].S_AREA_CODE && c.N_ROW == b) * maxLayer * 2; var count = db.Queryable<Location>().Where(c => c.S_AREA_CODE == listLoc[0].S_AREA_CODE && c.N_ROW == b && c.N_CURRENT_NUM > 0).Sum(c => c.N_CURRENT_NUM) * 2; // 指定统计字段 kr.ProductItem = lcr.CntrItemRel.S_ITEM_CODE; kr.MaxCapacity = total; kr.FilledCapacity = count; kr.AvailableCapacity = total - count; } } list.Add(kr); }); } else { Console.WriteLine("area:" + a + ":未获取到排"); } }); }); var ordersCount = 0;// db.Queryable<WorkOrder>().Where(a => a.SQL_State == "执行中").Count(); foreach (var pline in Settings.GetDeviceInfoList().FindAll(x => x.deviceType == 9)) { ordersCount += db.Queryable<WorkOrder>().Where(a => a.SQL_PLineNo == pline.deviceName && a.SQL_State == "执行中").Count(); } var totalDesiredCapacity = ordersCount * 4 * 3 * (totalX / totalRows); LogHelper.Error($"成品小板区总货位是{totalX},总排数是{totalRows},当前执行工单数量是{ordersCount}", new Exception("Kurong")); var totalAvailableCapacity = list.Sum(a => a.AvailableCapacity); var totalAssignableCapacity = totalAvailableCapacity - totalDesiredCapacity; list.ForEach(a => { a.DesiredCapacity = totalDesiredCapacity; a.CRC = totalAvailableCapacity; a.RAC = totalAssignableCapacity; }); if (info == null) { /*SQL Server 1000 条/批次 单个 INSERT 语句最多支持 1000 条 VALUES 子句,超出会报语法错误。*/ for (int i = 0; i < list.Count; i += 1000) { db.Insertable(list.Skip(i).Take(1000).ToList()).ExecuteCommand(); } } else { //更新 list.ForEach(a => { var old = db.Queryable<KuRong>().Where(b => b.StorageLoc == a.StorageLoc).First(); if (old != null) { old.MaxCapacity = a.MaxCapacity; old.AvailableCapacity = a.AvailableCapacity; old.FilledCapacity = a.FilledCapacity; old.ProductItem = a.ProductItem; old.DesiredCapacity = a.DesiredCapacity; old.CRC = a.CRC; old.RAC = a.RAC; old.T_MODIFY = DateTime.Now; db.Updateable(old).UpdateColumns(it => new { it.MaxCapacity, it.FilledCapacity, it.AvailableCapacity, it.ProductItem, it.T_MODIFY }).ExecuteCommand(); } else { db.Insertable(a).ExecuteCommand(); } }); } } LogHelper.Info("OVER<<CheckKurRong"); } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Error(ex.Message, ex); } } } } HH.WCS.QingXiNongfu/process/TaskProcess.cs
@@ -1525,10 +1525,8 @@ if (Settings.GetDeviceInfoList().Find(x => x.location.Contains(mst.S_END_LOC))?.deviceType == 13 && mst.S_TYPE.Contains("收缩膜叉运")) { end = 7682; end = 7027; } LogHelper.Info("SendTask " + mst.S_TASK_NO); Console.WriteLine("start=" + start.ToString()); @@ -1609,6 +1607,9 @@ /// <returns></returns> public static bool CreateTransport(string wWorkNo, string start, string end, string taskType, List<string> cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1, string note = "", string TwoEndLoc = "") { if (string.IsNullOrEmpty(start) || string.IsNullOrEmpty(end)) return false; var result = false; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); HH.WCS.QingXiNongfu/wms/WMSModel.cs
@@ -365,6 +365,18 @@ public string S_CNTR_STATE { get; set; } } [SuGG("库容表")] public class KuRong : BaseModel { public string StorageLoc { get; set; } public int MaxCapacity { get; set; } public int FilledCapacity { get; set; } public string ProductItem { get; set; } public int AvailableCapacity { get; set; } public int DesiredCapacity { get; set; } public int CRC { get; set; } public int RAC { get; set; } } //均州现场 //[SugarTable("dbo.")]