zxx
2025-06-09 ef83aea1ac3325003b4ed8cddd23d295c6a01b1d
jushi
2个文件已修改
147 ■■■■ 已修改文件
HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/core/WMSCore.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/process/TaskProcess.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/core/WMSCore.cs
@@ -194,7 +194,7 @@
                //找送检入库区内托盘满了的货位
                var locList = db.Queryable<Location>()
                    .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0)
                    .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0 && p.C_ENABLE == "Y")
                    .Where(s => locCntrs.Contains(s.S_CODE.Trim()))
                    .ToList();
@@ -318,7 +318,7 @@
                            dev = "2";
                        }
                        var endLocation = db.Queryable<Location>().Where(s => s.S_CODE == endLoc).First();
                        if (endLocation == null || endLocation.N_LOCK_STATE != 0)
                        if (endLocation == null || endLocation.N_LOCK_STATE != 0 || endLocation.C_ENABLE != "Y")
                        {
                            //LogHelper.Info($"拆托机货位{endLoc}不存在或已被锁");
                            return;
@@ -422,7 +422,99 @@
        }
        //产线自动补空托
        public static void AutoRepairEmptyTray()
        {
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                var reservoirs1 = Settings.ReservoirAreas.Where(s => s.areaName == "3min空托区").FirstOrDefault();
                var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "6min空托区").FirstOrDefault();
                var linePlcInfo1 = Settings.linePlcInfos.Where(s => s.deviceNo == "1").FirstOrDefault();
                var linePlcInfo2 = Settings.linePlcInfos.Where(s => s.deviceNo == "2").FirstOrDefault();
                ////找到空托缓存区的所有货位编号
                //var locList = db.Queryable<Location>()
                //    .Where(s => s.S_AREA_CODE == reservoirs1.areaCode || s.S_AREA_CODE == reservoirs2.areaCode)
                //    .Where(s => s.N_LOCK_STATE == 0)
                //    .OrderByDescending(s => s.N_ROW).OrderByDescending(s => s.N_COL).OrderBy(s => s.N_LAYER)
                //    .Select(s => s.S_CODE)
                //    .ToList();
                //查询每排最后一列有托盘的货位  根据行分区 再找每一行的最后一列有货的货位
                var list = db.Queryable<Location>().
                    Where(a => a.N_CURRENT_NUM > 0).Where(a => a.S_AREA_CODE.Trim() == reservoirs1.areaCode || a.S_AREA_CODE.Trim() == reservoirs2.areaCode)
                    .PartitionBy(a => a.N_ROW)
                    .OrderByDescending(a => a.N_COL).Take(1).ToList();
                if (list.Count > 0)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        //var loc = list[i];
                        //判断送往3寸还是6寸拆托机
                        string endLoc = null;
                        string dev = null;
                        if (list[i].S_AREA_CODE == reservoirs1.areaCode)
                        {
                            endLoc = linePlcInfo1.inLoca;
                            dev = "1";
                        }
                        else if (list[i].S_AREA_CODE == reservoirs2.areaCode)
                        {
                            endLoc = linePlcInfo2.inLoca;
                            dev = "2";
                        }
                        var endLocation = db.Queryable<Location>().Where(s => s.S_CODE == endLoc).First();
                        if (endLocation == null || endLocation.N_LOCK_STATE != 0)
                        {
                            //LogHelper.Info($"拆托机货位{endLoc}不存在或已被锁");
                            return;
                        }
                        //校验是否允许放货
                        var plcDeviceTable = S7Helper.plcDeviceTables;
                        LogHelper.Info($"自动送托 拆托机{dev}:{plcDeviceTable.requestPut1}");
                        if ((plcDeviceTable.requestPut1 && dev == "1") ||
                            (plcDeviceTable.requestPut2 && dev == "2"))
                        {
                            var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == list[i].S_CODE).First();
                            LogHelper.Info($"创建任务 起点:{list[i].S_CODE}终点:{endLoc}");
                            var res = TaskProcess.CreateTransport(list[i].S_CODE, endLoc, "送托", locCntrRel.S_CNTR_CODE, 1, 1);
                            if (res)
                            {
                                LogHelper.Info($"起点:{list[i].S_CODE}终点:{endLoc}任务创建成功");
                            }
                            else
                            {
                                LogHelper.Info($"起点:{list[i].S_CODE}终点:{endLoc}任务创建失败");
                            }
                        }
                        else
                        {
                            LogHelper.Info($"拆托机{endLoc}不允许放框");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace);
                LogHelper.Error("AutoReplenish:" + ex.Message, ex);
                throw;
            }
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/process/TaskProcess.cs
@@ -784,11 +784,6 @@
            return result;
            return result;
        }
        #endregion
@@ -814,9 +809,10 @@
                    for (int i = 0; i < list.Count; i++)
                    {
                        //如果锁了或者容量满了                   当前数量                 容器容量
                        if (list[i].N_LOCK_STATE != 0 || list[i].N_CURRENT_NUM >= list[i].N_CAPACITY)
                        if (list[i].N_LOCK_STATE != 0|| list[i].C_ENABLE != "Y" || list[i].N_CURRENT_NUM >= list[i].N_CAPACITY)
                        {
                            loca.Add(list[i].S_CODE);
                            LogHelper.Info($"InWorkTransport  满或者锁上的货位:{list[i].S_CODE},状态{list[i].N_LOCK_STATE}");
                        }
                    }
                    //移除
@@ -858,7 +854,20 @@
                    //符合条件的排序选第一个  先找第一个
                    if (list.Count > 0)
                    {
                        result = list.OrderBy(s => s.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                        //立库的随机分配
                        if (reservoirs != null && reservoirs.areaCode.Equals(area))
                        {
                            // 立库随机分配算法
                            var random = new Random();
                            result = list.OrderBy(x => random.Next()).FirstOrDefault();
                            LogHelper.Info($"立库随机分配选择货位:{result?.S_CODE},状态{result?.N_LOCK_STATE}");
                        }
                        else
                        {
                            result = list.OrderBy(s => s.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                        }
                    }
                }
@@ -889,7 +898,7 @@
                for (int i = 0; i < list.Count; i++)
                {
                    //判断货位是否被锁住了 与 是否有托盘
                    if (list[i].N_LOCK_STATE == 0)
                    if (list[i].N_LOCK_STATE == 0&& list[i].C_ENABLE =="Y")
                    {
                        var locCntrRel = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == list[i].S_CODE).First();
@@ -966,7 +975,7 @@
        {
            return locations
                .Where(l => targetAreas.Any(area => l.S_CODE.Contains(area)))
                .Where(l => l.N_LOCK_STATE == 0 && l.N_CURRENT_NUM < l.N_CAPACITY)
                .Where(l => l.N_LOCK_STATE == 0&& l.C_ENABLE == "Y" && l.N_CURRENT_NUM < l.N_CAPACITY)
                .ToList();
        }
@@ -995,7 +1004,7 @@
                        result = db.Queryable<Location>().OrderBy(a => a.N_COL)
                            .Where(a => a.S_AREA_CODE.Trim() == area && a.N_ROW == list[i].N_ROW
                            && a.N_COL > list[i].N_COL).First();
                        if (result != null && result.N_LOCK_STATE == 0)
                        if (result != null && result.N_LOCK_STATE == 0 && result.C_ENABLE == "Y")
                        {
                            return result;
                        }
@@ -1005,7 +1014,7 @@
                else
                {
                    result = db.Queryable<Location>().
                    Where(a => a.S_AREA_CODE.Trim() == area && a.N_LOCK_STATE == 0 && a.N_CURRENT_NUM == 0)
                    Where(a => a.S_AREA_CODE.Trim() == area && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0)
                    .OrderBy(a => a.N_COL).OrderBy(a => a.N_ROW).First();
                }
            }
@@ -1202,7 +1211,7 @@
            {
                //校验起点货位是否存在/锁住
                var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.START_LOC).First();
                if (loc == null || loc.N_LOCK_STATE != 0)
                if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y")
                {
                    return new Results { Code = "1", Message = $"{model.START_LOC}库位已被锁定!", Data = null };
                }
@@ -1288,7 +1297,7 @@
                }
                //校验终点货位是否存在/锁定
                var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.END_LOC).First();
                if (loc == null || loc.N_LOCK_STATE != 0)
                if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y")
                {
                    return new Results { Code = "1", Message = $"{model.END_LOC}库位已被锁定!", Data = null };
                }
@@ -1343,7 +1352,7 @@
                if (!string.IsNullOrEmpty(model.START_LOC))
                {
                    var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.START_LOC).First();
                    if (loc == null || loc.N_LOCK_STATE != 0)
                    if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y")
                    {
                        return new Results { Code = "1", Message = $"{model.START_LOC}库位已被锁定!", Data = null };
                    }
@@ -1396,7 +1405,7 @@
                LogHelper.Info($"有物料{itemCode}的货位编号{JsonConvert.SerializeObject(locCntrs)}");
                //找常规送检区内含有查出物料货位的货位
                var locList = db.Queryable<Location>()
                    .Where(p => p.S_AREA_CODE == areaCode && p.N_LOCK_STATE == 0)
                    .Where(p => p.S_AREA_CODE == areaCode && p.N_LOCK_STATE == 0 && p.C_ENABLE == "Y")
                    .Where(s => locCntrs.Contains(s.S_CODE.Trim()))
                    .ToList();
@@ -1442,7 +1451,7 @@
                        //找到该点位的库区
                        var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.PointCode).First();
                        //没锁再继续走
                        if (loc.N_LOCK_STATE == 0 && loc != null)
                        if (loc.N_LOCK_STATE == 0 && loc.C_ENABLE =="Y" && loc != null)
                        {
                            var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault();
                            //如果是送检入库区
@@ -1531,7 +1540,7 @@
                {
                    //创建任务 从空托缓存区到拆托机
                    var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == loc.S_AREA_CODE
                    && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0).OrderByDescending(a => a.N_ROW)
                    && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderByDescending(a => a.N_ROW)
                    .OrderByDescending(a => a.N_COL).First();
                    var startLoc = list.S_CODE;
@@ -1577,7 +1586,7 @@
                }
                //终点
                var endloc = db.Queryable<Location>().Where(a => a.S_CODE == model.END_LOC).First();
                if (endloc == null || endloc.N_LOCK_STATE != 0)
                if (endloc == null || endloc.N_LOCK_STATE != 0 || endloc.C_ENABLE != "Y")
                {
                    return new Results { Code = "1", Message = $"{model.END_LOC}库位已被锁定!", Data = null };
                }
@@ -1613,7 +1622,7 @@
            try
            {
                var loc = db.Queryable<Location>().Where(a => a.S_CODE == model.BIND_LOC).First();
                if (loc == null || loc.N_LOCK_STATE != 0)
                if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y")
                {
                    return new Results { Code = "1", Message = $"绑定货位不存在或已被锁", Data = null };
@@ -1695,7 +1704,7 @@
            {
                //校验起点货位是否存在/锁住
                var loc = db.Queryable<Location>().Where(a => a.S_CODE == startLoc).First();
                if (loc == null || loc.N_LOCK_STATE != 0)
                if (loc == null || loc.N_LOCK_STATE != 0 || loc.C_ENABLE != "Y")
                {
                    LogHelper.Info("起点货位不存在或已锁" + startLoc);
                    return false;
@@ -1757,7 +1766,7 @@
            {
                //校验终点货位是否锁
                var endloc = db.Queryable<Location>().Where(a => a.S_CODE == endLoc).First();
                if (endloc == null || endloc.N_LOCK_STATE != 0)
                if (endloc == null || endloc.N_LOCK_STATE != 0 || endloc.C_ENABLE != "Y")
                {
                    LogHelper.Info("终点货位已锁" + endLoc);
                    return false;