1
pulg
2025-05-27 bc3d7a828114cb9df154da869ec986cf6733a779
HH.WCS.ZCQTJ/Bll/ZCBLL.cs
@@ -34,7 +34,7 @@
                var newDb = chi.CopyNew();
                foreach (var task in TaskList)
                {
                    LogHelper.Info("处理自管任务", " 出库 开始------任务:" + task.S_TASK_NO);
                    LogHelper.DanInfo("处理自管任务", " 出库 开始------任务:" + task.S_TASK_NO);
                    try
                    {
                        bool ggf = true;
@@ -48,6 +48,7 @@
                            string lkBit = task.S_START_LOC;
                            var locationBit = LocationHelper.LocationCode(lkBit);
                            var tTaskNum = newDb.Queryable<OutAreaTaskAnyJbEntitys>().Where(e => e.S_AreaCode == task.S_START_LAREA && e.S_IsUse == "Y")?.First();
                            //获取托盘号  如果起点管控的话
                            var endArea = newDb.Queryable<TN_AreaEntitys>().Where(e => e.S_AREA_CODE == task.S_END_LAREA)?.First();
                            if (endArea != null && endArea.S_CONTROL_QTY == "Y")
@@ -55,7 +56,7 @@
                                var locaBit = newDb.Queryable<LocCntrRel>().Where(e => e.S_CNTR_CODE == task.S_CNTRS).First();
                                if (locaBit == null)
                                {
                                    LogHelper.Info("处理自管任务", "未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS);
                                    LogHelper.DanInfo("处理自管任务", "未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS);
                                    throw new Exception("未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS);
                                }
                            }
@@ -63,7 +64,7 @@
                            var ToBit = LocationHelper.LocationCodeJbw(task.S_START_LOC);
                            if (ToBit == null)
                            {
                                LogHelper.Info("处理自管任务", "未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC);
                                LogHelper.DanInfo("处理自管任务", "未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC);
                                throw new Exception("未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC);
                            }
                            if (locationBit == null)
@@ -71,7 +72,41 @@
                            //通过任务类型找接驳位
                            var _bit = "";
                            string input = task.S_Jb_Bit;
                            string[] result = input.Split(',');
                            List<string> result = input.Split(',').ToList();
                            if (tTaskNum != null && Itemgh != null)
                            {
                                //查询起点库区对应巷道总任务量
                                var TaskLis = newDb.Queryable<WMSTask>().Where(e => e.S_START_LAREA == task.S_START_LAREA && e.S_Main_task == "主任务" && e.S_B_STATE == "未执行" && (e.S_Jb_Bit.Contains(result.FirstOrDefault()) || e.S_Jb_Bit.Contains(result.LastOrDefault()))).ToList();
                                if (TaskLis.Count > 0)
                                {
                                    //筛选出库的全部满托任务
                                    var TaskTray = TaskLis.Select(e => e.S_CNTRS).ToList();
                                    LogHelper.DanInfo("处理自管任务", "筛选出库的全部满托任务" + JsonConvert.SerializeObject(TaskTray));
                                    //查托盘空满
                                    var TaskItemghList = newDb.Queryable<CntrItemRel>().Where(e => TaskTray.Contains(e.S_CNTR_CODE)).ToList();
                                    if (TaskItemghList.Count() > 0)
                                    {
                                        //获取满托的托盘集合
                                        var MtTray = TaskItemghList.Select(e => e.S_CNTR_CODE).ToList();
                                        LogHelper.DanInfo("处理自管任务", "筛选出库的全部满托任务" + JsonConvert.SerializeObject(MtTray));
                                        TaskLis = TaskLis.FindAll(e => MtTray.Contains(e.S_CNTRS)).ToList();
                                    }
                                }
                                if (TaskLis.Count() > 0)
                                {
                                    LogHelper.DanInfo("处理自管任务", $"起点库区{task.S_START_LAREA} 所处的巷道的 未执行的任务量为:{TaskLis.Count()}");
                                    LogHelper.DanInfo("处理自管任务", $"最大任务数为{tTaskNum.N_TaskQuantity}");
                                    if (TaskLis.Count() < tTaskNum.N_TaskQuantity)
                                    {
                                        if (result.Count > 1)
                                        {
                                            LogHelper.DanInfo("处理自管任务", $"排除前接驳位有{JsonConvert.SerializeObject(result)}");
                                            result.RemoveRange(1, result.Count - 1);
                                            LogHelper.DanInfo("处理自管任务", $"排除后接驳位有{JsonConvert.SerializeObject(result)}");
                                        }
                                    }
                                }
                            }
                            Location connectBit = new Location();
                            foreach (var item in result)
                            {
@@ -129,7 +164,7 @@
                                if (lstLocation.Count() == 0)
                                {
                                    LogHelper.Info("处理自管任务", "移库任务:: 货位表没有可用货位");
                                    LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有可用货位");
                                    throw new Exception("没有可用货位");
                                }
                                //如果外侧有阻挡,就将外侧的货位的CN_S_TASK_NO  获取到
@@ -154,7 +189,7 @@
                                        if (emptyLocation.Count() == 0)
                                        {
                                            LogHelper.Info("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 CN_S_AREA_CODE=" + locationBit.S_AREA_CODE);
                                            LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 CN_S_AREA_CODE=" + locationBit.S_AREA_CODE);
                                            throw new Exception("没有可用货位");
                                        }
@@ -173,13 +208,13 @@
                                            loca.And(it => it.S_LOCK_STATE == "出库锁");
                                            List<Location> locationOutLock = newDb.Queryable<Location>().Where(loca.ToExpression()).ToList();
                                            LogHelper.Info("处理自管任务", "locationOutLock数据:" + JsonConvert.SerializeObject(locationOutLock));
                                            LogHelper.DanInfo("处理自管任务", "locationOutLock数据:" + JsonConvert.SerializeObject(locationOutLock));
                                            foreach (Location lEntity in locationOutLock)
                                            {
                                                emptyLocation.RemoveAll(o => o.N_ROW == lEntity.N_ROW && o.N_COL == lEntity.N_COL && o.N_LAYER == lEntity.N_LAYER);
                                            }
                                            LogHelper.Info("处理自管任务", "去除预出库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
                                            LogHelper.DanInfo("处理自管任务", "去除预出库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
                                            //去除预入库锁定的排列层
                                            var locaIn = Expressionable.Create<Location>();
@@ -187,13 +222,13 @@
                                            locaIn.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE);
                                            locaIn.And(it => it.S_LOCK_STATE == "入库锁");
                                            List<Location> locationInLock = newDb.Queryable<Location>().Where(locaIn.ToExpression()).ToList();
                                            LogHelper.Info("处理自管任务", "locationInLock数据:" + JsonConvert.SerializeObject(locationInLock));
                                            LogHelper.DanInfo("处理自管任务", "locationInLock数据:" + JsonConvert.SerializeObject(locationInLock));
                                            foreach (Location lEntity in locationInLock)
                                            {
                                                emptyLocation.RemoveAll(o => o.N_ROW == lEntity.N_ROW && o.N_COL == lEntity.N_COL && o.N_LAYER == lEntity.N_LAYER);
                                            }
                                            LogHelper.Info("处理自管任务", "去除预入库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
                                            LogHelper.DanInfo("处理自管任务", "去除预入库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
                                            //去除被外侧货物阻挡的货位
                                            var locaWc = Expressionable.Create<Location>();
@@ -203,14 +238,14 @@
                                            locaWc.And(it => it.N_SIDE == 1);
                                            lca.And(it => it.N_CURRENT_NUM > 0);
                                            List<Location> lstLocationHasItem = newDb.Queryable<Location>().Where(locaWc.ToExpression()).ToList();
                                            LogHelper.Info("处理自管任务", "lstLocationHasItem数据:" + JsonConvert.SerializeObject(lstLocationHasItem));
                                            LogHelper.DanInfo("处理自管任务", "lstLocationHasItem数据:" + JsonConvert.SerializeObject(lstLocationHasItem));
                                            List<Location> lstLocationHasItemOrder = new List<Location>();
                                            foreach (Location itemC in lstLocationHasItem)
                                            {
                                                emptyLocation.RemoveAll(o => o.N_ROW == itemC.N_ROW && o.N_COL == itemC.N_COL && o.N_LAYER == itemC.N_LAYER && o.N_SIDE > itemC.N_SIDE);
                                            }
                                            LogHelper.Info("处理自管任务", "去除阻挡后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
                                            LogHelper.DanInfo("处理自管任务", "去除阻挡后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
                                            if (emptyLocation.Count() > 0)
                                            {
                                                var emptyLocation_inside = emptyLocation.FindAll(f => f.N_SIDE == 2);
@@ -221,7 +256,7 @@
                                            }
                                            else
                                            {
                                                LogHelper.Info("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 S_AREA_CODE=" + locationBit.S_AREA_CODE);
                                                LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 S_AREA_CODE=" + locationBit.S_AREA_CODE);
                                                throw new Exception("没有可用货位");
                                            }
                                            //
@@ -276,7 +311,7 @@
                            taskEntity1.S_Main_task = "子任务";
                            taskEntity1.S_TOOLS_TPYE = task.S_TOOLS_TPYE;
                            LogHelper.Info("处理自管任务", "11---" + JsonConvert.SerializeObject(taskEntity1));
                            LogHelper.DanInfo("处理自管任务", "11---" + JsonConvert.SerializeObject(taskEntity1));
                            string taskNo2 = task.S_TASK_NO + "_2";
                            //创建第二个任务
                            WMSTask taskEntity2 = new WMSTask()
@@ -303,7 +338,7 @@
                                S_Main_task = "子任务",
                                S_TOOLS_TPYE = task.S_TOOLS_TPYE
                            };
                            LogHelper.Info("处理自管任务", "12---" + JsonConvert.SerializeObject(taskEntity2));
                            LogHelper.DanInfo("处理自管任务", "12---" + JsonConvert.SerializeObject(taskEntity2));
                            #region 任务下达
                            #region 如果有阻挡需要移库则产生移库任务
@@ -323,7 +358,7 @@
                                    throw new Exception("锁定终点货位并发异常:" + taskEntityYk.S_END_LOC);
                                }
                                LogHelper.Info("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_END_LOC + "--锁定终点货位 任务号为:" + taskNoYk);
                                LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_END_LOC + "--锁定终点货位 任务号为:" + taskNoYk);
                                A = newDb.Updateable<Location>().SetColumns(it => new Location
                                {
                                    S_LOCK_STATE = "出库锁",
@@ -334,12 +369,12 @@
                                    newDb.RollbackTran();
                                    throw new Exception("锁定起点货位并发异常:" + taskEntityYk.S_START_LOC);
                                }
                                LogHelper.Info("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_START_LOC + "--锁定终点货位 任务号为:" + taskNoYk);
                                LogHelper.Info("处理自管任务", "移库任务下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntityYk));
                                LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_START_LOC + "--锁定终点货位 任务号为:" + taskNoYk);
                                LogHelper.DanInfo("处理自管任务", "移库任务下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntityYk));
                                //下发任务给WCS--立库
                                var tr = BLLCreator.CreateSingleton<WcsTask>().WcsTaskEntity(taskEntityYk);
                                LogHelper.Info("处理自管任务", "移库任务调用WCS接口执行任务  执行结果:" + JsonConvert.SerializeObject(tr));
                                LogHelper.DanInfo("处理自管任务", "移库任务调用WCS接口执行任务  执行结果:" + JsonConvert.SerializeObject(tr));
                                if (!tr.Success)
                                {
                                    WCSBOOL = tr.Success;
@@ -368,7 +403,7 @@
                             S_LOCK_STATE = "入库锁",
                             T_MODIFY = DateTime.Now
                         }).Where(x => x.S_LOC_CODE == taskEntity1.S_END_LOC && x.S_LOCK_STATE == "无").ExecuteCommand();
                                LogHelper.Info("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntity1.S_END_LOC + "--锁定货位为预入库 任务号为:" + taskNo1 + JsonConvert.SerializeObject(B));
                                LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntity1.S_END_LOC + "--锁定货位为预入库 任务号为:" + taskNo1 + JsonConvert.SerializeObject(B));
                                if (B == 0)
                                {
                                    newDb.RollbackTran();
@@ -386,8 +421,8 @@
                            }
                            #endregion
                            #region 发送Wcs任务
                            LogHelper.Info("处理自管任务", "下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntity1));
                            LogHelper.Info("处理自管任务", "调用WCS接口");
                            LogHelper.DanInfo("处理自管任务", "下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntity1));
                            LogHelper.DanInfo("处理自管任务", "调用WCS接口");
                            var re = BLLCreator.CreateSingleton<WcsTask>().WcsTaskEntity(taskEntity1, Itemgh);
                            //如果任务成功下达 则主任务不需要在循环了
                            if (!re.Success)
@@ -400,7 +435,7 @@
                            {
                                WCSBOOL = re.Success;
                            }
                            LogHelper.Info("处理自管任务", "调用WCS接口执行任务  执行结果:" + JsonConvert.SerializeObject(re));
                            LogHelper.DanInfo("处理自管任务", "调用WCS接口执行任务  执行结果:" + JsonConvert.SerializeObject(re));
                            #endregion
                            #region  添加第二个子任务
                            B = newDb.Insertable(taskEntity2).ExecuteCommand();
@@ -412,7 +447,7 @@
                            #endregion
                            #region agv任务
                            //下达任务给Agv
                            //LogHelper.Info("处理自管任务", "调用agv接口");
                            //LogHelper.DanInfo("处理自管任务", "调用agv接口");
                            //var Are = TaskProcess.SendTask(taskEntity2);
                            //if (!Are)
                            //{
@@ -447,11 +482,11 @@
                        ors.Add(OperateResult.Error(ex.Message));
                    }
                }
                LogHelper.Info("处理自管任务", JsonConvert.SerializeObject(ors));
                LogHelper.DanInfo("处理自管任务", JsonConvert.SerializeObject(ors));
            }
            catch (Exception ex)
            {
                LogHelper.Info("处理自管任务", " Error:" + ex.Message + ex.StackTrace);
                LogHelper.DanInfo("处理自管任务", " Error:" + ex.Message + ex.StackTrace);
            }
        }
@@ -1353,7 +1388,7 @@
                        return OperateResult.Succeed();
                        //  }
                    }
                  //  return OperateResult.Succeed();
                    //  return OperateResult.Succeed();
                }
                else
                {
@@ -2130,5 +2165,21 @@
            }
        }
        private bool ContainsAnyChar(string input, List<string> charList)
        {
            bool gf = false;
            foreach (var item in charList)
            {
                if (input.Contains(input))
                {
                    gf = true;
                    break;
                }
            }
            return gf;
        }
    }
}