czw
2025-06-17 74a352255e4a8d7cd10eaaab8cb44f568f88b6c2
清溪问题处理
6个文件已修改
11个文件已删除
1641 ■■■■ 已修改文件
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang.csproj.dtbcache.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/CopilotIndices/17.13.431.34963/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/CopilotIndices/17.13.431.34963/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/12715c31-ac81-4915-9979-c4626f82f8fd.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/2a563d8c-3ecc-470f-9961-cffb13b20226.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/624636c7-9edc-488c-b412-0c42e2169303.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/config/applicationhost.config 981 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/copilot-chat/5812ce9b/sessions/4b7eb4c4-7c03-4aee-9f74-1e5c93b3be46 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/v17/DocumentLayout.backup.json 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/v17/DocumentLayout.json 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/v17/HierarchyCache.v1.txt 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/Program.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/core/Monitor.cs 239 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/core/TaskCore.cs 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/process/TaskProcess.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.QingXiNongfu/wms/WMSModel.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.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.db
Binary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/CopilotIndices/17.13.431.34963/SemanticSymbols.db
Binary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/12715c31-ac81-4915-9979-c4626f82f8fd.vsidx
Binary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/2a563d8c-3ecc-470f-9961-cffb13b20226.vsidx
Binary files differ
HH.WCS.QingXiNongfu/.vs/HH.WCS.QingXigongchang/FileContentIndex/624636c7-9edc-488c-b412-0c42e2169303.vsidx
Binary 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-1e5c93b3be46
Binary 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.txt
Binary 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.")]