111
cjs
2025-06-24 470d5135f9cb53898e167eeb4c7f74a80bb5f4dc
111
3个文件已修改
260 ■■■■ 已修改文件
HH.WCS.Mobox3.NongFuLinZhi/config/config.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs 257 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.NongFuLinZhi/config/config.json
@@ -31,11 +31,13 @@
        {
            "areaName": "瓶盖入库接驳位",
            "areaCode": "pgjb",
            "pri": 1,
            "enable": 1
        },
        {
            "areaName": "瓶盖库区",
            "areaCode": "pgkq",
            "pri": 1,
            "enable": 1
        }
    ],
HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs
@@ -1285,127 +1285,136 @@
            if (action)
            {
                //瓶盖库区,两层密集型库区  空满在同一个库区,需要区分不同排
                var areaInfo = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).First();
                if (areaInfo != null)
                var areaInfo = Settings.areaInfos.Where(a => a.areaName.Contains(areaName) && a.enable == 1).OrderBy(a => a.pri).ToList();
                if (areaInfo.Count > 0)
                {
                    //库区货位约定:列号越小越靠里
                    LogHelper.Info($"入库算法01:area:{areaInfo.areaCode},itemCode:{itemCode}");
                    try
                    foreach(var it in areaInfo)
                    {
                        if (result == null)
                        //库区货位约定:列号越小越靠里
                        LogHelper.Info($"入库算法01:area:{it.areaCode},itemCode:{itemCode}");
                        try
                        {
                            var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL)
                                .PartitionBy(a => a.N_ROW).Take(1)
                                .ToList();
                            if (locInfo.Count > 0)
                            if (result == null)
                            {
                                LogHelper.Info($"入库算法02:查询到可入货位的数量为:{locInfo.Count}");
                                foreach (var a in locInfo)
                                var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL)
                                    .PartitionBy(a => a.N_ROW).Take(1)
                                    .ToList();
                                if (locInfo.Count > 0)
                                {
                                    LogHelper.Info($"入库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE},当前数量:{a.N_CURRENT_NUM}");
                                    //去掉当前货位有锁,或者为空托的货位
                                    if (a.S_LOCK_STATE == "无")
                                    LogHelper.Info($"入库算法02:查询到可入货位的数量为:{locInfo.Count}");
                                    foreach (var a in locInfo)
                                    {
                                        string endItemCode = "";
                                        var endCntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                                        if (endCntrInfo != null)
                                        LogHelper.Info($"入库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE},当前数量:{a.N_CURRENT_NUM}");
                                        //去掉当前货位有锁,或者为空托的货位
                                        if (a.S_LOCK_STATE == "无")
                                        {
                                            var endItemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == endCntrInfo.S_CNTR_CODE).First();
                                            if (endItemInfo != null)
                                            string endItemCode = "";
                                            var endCntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                                            if (endCntrInfo != null)
                                            {
                                                endItemCode = endItemInfo.S_ITEM_CODE;
                                            }
                                        }
                                        else
                                        {
                                            LogHelper.Info($"终点货位未绑定托盘信息");
                                            continue;
                                        }
                                        LogHelper.Info($"入库算法04:查询到当前货位绑定的物料编码为:{endItemCode}");
                                        //判断是否和当前货位的物料编码相同
                                        if (itemCode == endItemCode)
                                        {
                                            //查询当前排是否可入(判断是是否有入库锁和出库锁)
                                            var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First();
                                            if (lockInfo == null)
                                            {
                                                //当前排无任务
                                                if (a.N_CURRENT_NUM < a.N_CAPACITY) result = a;
                                                else
                                                var endItemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == endCntrInfo.S_CNTR_CODE).First();
                                                if (endItemInfo != null)
                                                {
                                                    //查询后面当前货位后一个
                                                    result = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW > a.N_ROW && b.S_LOCK_STATE == "无").OrderBy(b => b.N_COL).First();
                                                }
                                                if (result != null)
                                                {
                                                    break;
                                                    endItemCode = endItemInfo.S_ITEM_CODE;
                                                }
                                            }
                                            else
                                            {
                                                LogHelper.Info($"入库算法05:查询到当前排有锁,排号:{a.N_ROW}");
                                                LogHelper.Info($"终点货位未绑定托盘信息");
                                                continue;
                                            }
                                        }
                                    }
                                }
                            }
                            else
                            {
                                LogHelper.Info($"入库算法02:未查询到可入货位");
                            }
                            if (result == null)
                            {
                                //todo 还需要判断锁
                                #region 查找所有数量是空的排
                                LogHelper.Info($"入库算法06:无可用货位,获取空排货位。", "WMSAlgoRithm");
                                //2.0 简化查询只查每一排第一列
                                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
                                //2.1 选一个空排
                                if (list.Count > 0)
                                {
                                    LogHelper.Info($"入库算法06:无可用货位,获取空排货位数量为:{list.Count}。", "WMSAlgoRithm");
                                    for (int i = 0; i < list.Count; i++)
                                    {
                                        LogHelper.Info($"入库算法07:获取空排货位:货位编码:{list[i].S_CODE.Trim()},当前数量:{list[i].N_CURRENT_NUM},排号:{list[i].N_ROW},库区编码:{list[i].S_AREA_CODE.Trim()}", "WMSAlgoRithm");
                                        if (list[i].S_LOCK_STATE.Trim().Contains("无"))
                                        {
                                            //二次校验当前排所有货位都是空的,防止系统数据错乱
                                            int row = list[i].N_ROW;
                                            string areaCode = list[i].S_AREA_CODE.Trim();
                                            var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaCode && b.N_ROW == row && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First();
                                            if (lockInfo == null)
                                            LogHelper.Info($"入库算法04:查询到当前货位绑定的物料编码为:{endItemCode}");
                                            //判断是否和当前货位的物料编码相同
                                            if (itemCode == endItemCode)
                                            {
                                                var locInfo1 = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaCode && a.N_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
                                                if (locInfo1 != null)
                                                //查询当前排是否可入(判断是是否有入库锁和出库锁)
                                                var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First();
                                                if (lockInfo == null)
                                                {
                                                    LogHelper.Info($"{locInfo1.sum},row:{row}");
                                                    if (locInfo1.sum == 0)
                                                    //当前排无任务
                                                    if (a.N_CURRENT_NUM < a.N_CAPACITY) result = a;
                                                    else
                                                    {
                                                        //空排
                                                        result = list[i];
                                                        //查询后面当前货位后一个
                                                        result = db.Queryable<Location>().Where(b => b.S_AREA_CODE == a.S_AREA_CODE && b.N_ROW > a.N_ROW && b.S_LOCK_STATE == "无").OrderBy(b => b.N_COL).First();
                                                    }
                                                    if (result != null)
                                                    {
                                                        break;
                                                    }
                                                }
                                                else LogHelper.Info("未找到该排");
                                            }
                                            else
                                            {
                                                LogHelper.Info("该排有锁");
                                                else
                                                {
                                                    LogHelper.Info($"入库算法05:查询到当前排有锁,排号:{a.N_ROW}");
                                                }
                                            }
                                        }
                                    }
                                }
                                else LogHelper.Info($"未获取到空排,库区编码:{areaInfo.areaCode}");
                                #endregion
                                else
                                {
                                    LogHelper.Info($"入库算法02:未查询到可入货位");
                                }
                                if (result == null)
                                {
                                    //todo 还需要判断锁
                                    #region 查找所有数量是空的排
                                    LogHelper.Info($"入库算法06:无可用货位,获取空排货位。", "WMSAlgoRithm");
                                    //2.0 简化查询只查每一排第一列
                                    var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.areaCode).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
                                    //2.1 选一个空排
                                    if (list.Count > 0)
                                    {
                                        LogHelper.Info($"入库算法06:无可用货位,获取空排货位数量为:{list.Count}。", "WMSAlgoRithm");
                                        for (int i = 0; i < list.Count; i++)
                                        {
                                            LogHelper.Info($"入库算法07:获取空排货位:货位编码:{list[i].S_CODE.Trim()},当前数量:{list[i].N_CURRENT_NUM},排号:{list[i].N_ROW},库区编码:{list[i].S_AREA_CODE.Trim()}", "WMSAlgoRithm");
                                            if (list[i].S_LOCK_STATE.Trim().Contains("无"))
                                            {
                                                //二次校验当前排所有货位都是空的,防止系统数据错乱
                                                int row = list[i].N_ROW;
                                                string areaCode = list[i].S_AREA_CODE.Trim();
                                                var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaCode && b.N_ROW == row && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First();
                                                if (lockInfo == null)
                                                {
                                                    var locInfo1 = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaCode && a.N_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
                                                    if (locInfo1 != null)
                                                    {
                                                        LogHelper.Info($"{locInfo1.sum},row:{row}");
                                                        if (locInfo1.sum == 0)
                                                        {
                                                            //空排
                                                            result = list[i];
                                                            break;
                                                        }
                                                    }
                                                    else LogHelper.Info("未找到该排");
                                                }
                                                else
                                                {
                                                    LogHelper.Info("该排有锁");
                                                }
                                            }
                                        }
                                    }
                                    else LogHelper.Info($"未获取到空排,库区编码:{it.areaCode}");
                                    #endregion
                                }
                                if(result != null)
                                {
                                    break;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
                            LogHelper.Error("GetLocationIn:" + ex.Message, ex);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
                        LogHelper.Error("GetLocationIn:" + ex.Message, ex);
                    }
                }
                else
                {
@@ -1414,47 +1423,55 @@
            }
            else
            {
                LogHelper.Info($"出库算法01:area:{areaName},itemCode:{itemCode}");
                var areaInfo = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).FirstOrDefault();
                if(areaInfo != null)
                var areaInfo = Settings.areaInfos.Where(a => a.areaName.Contains(areaName) && a.enable == 1).OrderBy(a => a.pri).ToList();
                if(areaInfo.Count > 0)
                {
                    var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).Includes(a => a.LocCntrRel).ToList();
                    if(locList.Count > 0)
                    foreach(var it in areaInfo)
                    {
                        LogHelper.Info($"出库算法02:查询到可出货位数量:{locList.Count}");
                        foreach (var a in locList)
                        LogHelper.Info($"出库算法01:area:{it.areaName},itemCode:{itemCode}");
                        var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).Includes(a => a.LocCntrRel).ToList();
                        if (locList.Count > 0)
                        {
                            LogHelper.Info($"出库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE}");
                            if (a.S_LOCK_STATE == "无")
                            LogHelper.Info($"出库算法02:查询到可出货位数量:{locList.Count}");
                            foreach (var a in locList)
                            {
                                var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                                if(cntrInfo != null)
                                LogHelper.Info($"出库算法03:查询货位:{a.S_CODE},锁状态:{a.S_LOCK_STATE}");
                                if (a.S_LOCK_STATE == "无")
                                {
                                    LogHelper.Info($"出库算法04:当前货位绑定的托盘码为:{cntrInfo.S_CNTR_CODE}");
                                    string endItemCode = "";
                                    var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First();
                                    if(itemInfo != null && itemInfo.S_ITEM_CODE == itemCode)
                                    var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                                    if (cntrInfo != null)
                                    {
                                        endItemCode = itemInfo.S_ITEM_CODE;
                                    }
                                    if(endItemCode == itemCode)
                                    {
                                        //判断当前排有无锁
                                        var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaInfo.areaCode && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First();
                                        if (lockInfo == null)
                                        LogHelper.Info($"出库算法04:当前货位绑定的托盘码为:{cntrInfo.S_CNTR_CODE}");
                                        string endItemCode = "";
                                        var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First();
                                        if (itemInfo != null && itemInfo.S_ITEM_CODE == itemCode)
                                        {
                                            result = a;
                                            break;
                                            endItemCode = itemInfo.S_ITEM_CODE;
                                        }
                                        else
                                        if (endItemCode == itemCode)
                                        {
                                            LogHelper.Info($"出库算法05:当前排有锁,货位号:{lockInfo.S_CODE}");
                                            //判断当前排有无锁
                                            var lockInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == it.areaCode && b.N_ROW == a.N_ROW && (b.S_LOCK_STATE == "入库锁" || b.S_LOCK_STATE == "出库锁")).First();
                                            if (lockInfo == null)
                                            {
                                                result = a;
                                                break;
                                            }
                                            else
                                            {
                                                LogHelper.Info($"出库算法05:当前排有锁,货位号:{lockInfo.S_CODE}");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if(result != null)
                        {
                            break;
                        }
                    }
                }
                else
                {
HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs
@@ -171,6 +171,7 @@
        {
            public string areaName { get; set; }
            public string areaCode { get; set; }
            public int pri { get; set; }
            public int enable { get; set; }
        }