zxx
2025-05-30 034839c93e9f18d2b77105a85f65c8400798d74c
HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/core/WMSCore.cs
@@ -1,4 +1,5 @@
using HH.WCS.JuShi.api;
using HH.WCS.JuShi.device;
using HH.WCS.JuShi.process;
using HH.WCS.JuShi.util;
using HH.WCS.JuShi.wms;
@@ -172,49 +173,56 @@
        //    }
        //}
        //监测摄像头处货位(送检入库区)空满状态 满的就叉到立库
        public static void MonitorFullStatus()
        {
            //bool result = false;
            //找送检入库区满托盘的货位
            var db = new SqlHelper<Location>().GetInstance();
            var db = new SqlHelper<object>().GetInstance();
            try
            {
            var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault();
            var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "RGV库区").FirstOrDefault();
            //三表联查查出托盘满的 按创建时间顺序
            var locCntrs = db.Queryable<LocCntrRel>().LeftJoin<Container>((p, c) => p.S_CNTR_CODE == c.S_CODE)
            .Where((p, c) => c.C_FULL == "2")
            .OrderBy((p, c) => p.T_CREATE)
            .Select((p, c) => p.S_LOC_CODE) // 选择托盘物料表的数据
            .ToList();
                var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault();
                var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "立库入库区").FirstOrDefault();
                //三表联查查出托盘满的 按创建时间顺序
                var locCntrs = db.Queryable<LocCntrRel>().LeftJoin<Container>((p, c) => p.S_CNTR_CODE == c.S_CODE)
                .Where((p, c) => c.C_FULL == "2")
                .OrderBy((p, c) => p.T_CREATE)
                .Select((p, c) => p.S_LOC_CODE) // 选择托盘物料表的数据
                .ToList();
            //找送检入库区内托盘满了的货位
            var locList = db.Queryable<Location>()
               .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0)
               .Where(s => locCntrs.Contains(s.S_CODE.Trim()))
               .ToList();
                //找送检入库区内托盘满了的货位
                var locList = db.Queryable<Location>()
                    .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0)
                    .Where(s => locCntrs.Contains(s.S_CODE.Trim()))
                    .ToList();
            if (locList.Any())
            {
               //建任务
               var startLoc = locList.FirstOrDefault();
               var endLoc = TaskProcess.InWorkTransport(reservoirs2.areaCode);
                if (locList.Any())
                {
                    LogHelper.Info($"任务摄像头监测空满状态找到货位{JsonConvert.SerializeObject(locList)}");
                    //建任务
                    var startLoc = locList.FirstOrDefault();
                    var endLoc = TaskProcess.InWorkTransport(reservoirs2.areaCode);
                    LogHelper.Info($"任务摄像头监测找到终点货位:{JsonConvert.SerializeObject(endLoc)}");
                    if (endLoc!=null)
                    {
                        var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
                        LogHelper.Info($"任务摄像头监测找到托盘:{JsonConvert.SerializeObject(locCntrRel)}");
               var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == endLoc.S_CODE).First();
               TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "摄像头监测", locCntrRel.S_CNTR_CODE, 1, 1);
                        TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "摄像头监测", locCntrRel.S_CNTR_CODE, 1, 1);
            }
         }
                    }
                }
            }
            catch (Exception ex)
         {
            Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace);
            LogHelper.Error("AutoReplenish:" + ex.Message, ex);
            throw;
         }
            {
                Console.WriteLine("MonitorFullStatus:" + ex.Message + ex.StackTrace);
                LogHelper.Error("MonitorFullStatus:" + ex.Message, ex);
                throw;
            }
            //return result;
@@ -222,7 +230,12 @@
        //常规送检空了自动从送检缓存区取一个送过去
        public static void AutoReplenish()
        {
            var db = new SqlHelper<Location>().GetInstance();
            var db = new SqlHelper<object>().GetInstance();
            var isusinglist = db.Queryable<Isusing>().Where(a => a.S_TYPE == "自动补货").First();
            if (isusinglist.S_STATUS == 0)
            {
                return;
            }
            try
            {
                var cgreservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "常规送检区").FirstOrDefault();
@@ -233,17 +246,110 @@
                    var hcreservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检缓存区").FirstOrDefault();
                    //找送检缓存区有货的货位
                    var startloc = TaskProcess.OutWorkTransport(hcreservoirs.areaCode);
                    //LogHelper.Info($"AutoReplenish 自动补货 起点货位{JsonConvert.SerializeObject(startloc)}");
                    if (startloc != null)
                    {
                        //创建送检任务
                        var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First();
                        LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endloc.S_CODE}", "自动补货");
                        var res = TaskProcess.CreateTransport(startloc.S_CODE, endloc.S_CODE, "自动补货", locCntrRel.S_CNTR_CODE, 1, 1);
                        if (!res)
                        {
                            LogHelper.Info($"任务 起点:{startloc.S_CODE}终点:{endloc.S_CODE}创建失败", "自动补货");
                        }
                    }
                    //创建送检任务
               var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First();
               LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endloc.S_CODE}", "自动补货");
               var res = TaskProcess.CreateTransport(startloc.S_CODE, endloc.S_CODE, "自动补货", locCntrRel.S_CNTR_CODE, 1, 1);
               if (!res)
               {
                  LogHelper.Info($"任务 起点:{startloc.S_CODE}终点:{endloc.S_CODE}创建失败", "自动补货");
               }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace);
                LogHelper.Error("AutoReplenish:" + ex.Message, ex);
                throw;
            }
            }
        }
        //空托缓存区有绑定的托盘就送到拆托机
        public static void AutoSendMachine()
        {
            var db = new SqlHelper<object>().GetInstance();
            var isusinglist = db.Queryable<Isusing>().Where(a => a.S_TYPE == "自动送托").First();
            if (isusinglist.S_STATUS == 0)
            {
                return;
            }
            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 locCntrs = db.Queryable<LocCntrRel>()
                    .Where(s => locList.Contains(s.S_LOC_CODE.Trim()))
                    .Select(s => s.S_LOC_CODE)
                    .ToList();
                if (locCntrs.Any())
                {
                    //LogHelper.Info($"空托缓存区有绑定货位:{JsonConvert.SerializeObject(locCntrs)}");
                    //var loccode = locCntrs.First();
                    foreach (var loccode in locCntrs)
                    {
                        var loc = db.Queryable<Location>().Where(s => s.S_CODE == loccode).First();
                        //判断送往3寸还是6寸拆托机
                        string endLoc = null;
                        string dev = null;
                        if (loc.S_AREA_CODE == reservoirs1.areaCode)
                        {
                            endLoc = linePlcInfo1.inLoca;
                            dev = "1";
                        }
                        else if (loc.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 == loccode).First();
                            LogHelper.Info($"创建任务 起点:{loccode}终点:{endLoc}");
                            var res = TaskProcess.CreateTransport(loccode, endLoc, "送托", locCntrRel.S_CNTR_CODE, 1, 1);
                            if (res)
                            {
                                LogHelper.Info($"起点:{loccode}终点:{endLoc}任务创建成功");
                            }
                            else
                            {
                                LogHelper.Info($"起点:{loccode}终点:{endLoc}任务创建失败");
                            }
                        }
                        else
                        {
                            LogHelper.Info($"拆托机{endLoc}不允许放框");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
@@ -255,7 +361,6 @@
        }
    }