using iWareCC.Common.Helper; using iWareCommon.Common.Globle; using iWareCommon.Utils; using iWareModel; using iWareSql; using iWareSql.DataAccess; using iWareSql.DBModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using XiGang.Core.Model; namespace iWareCC { /// /// 任务分解线程 /// public static class MainTaskDecompose { /// /// 任务分解线程 /// public static void HandlerMainTaskDecompose() { while (true) { try { SystemWarningMsg._lbl_Alert_MainTaskDecompose = ""; if (SystemValue.isAllowRuning_MainTaskDecompose && SystemValue.isStartedModel) { using (DbModel context = new DbModel()) { //查询状态=下发中的出库计划 //注意:原则是优先执行出库任务 var queryState2 = (int)MainTaskStatusEnum.待出库; //var mainList = context.Task_Main.Where(x => x.TaskState == queryState1 || x.TaskState == queryState2).OrderBy(x => x.TaskSequence).ToList();//按照顺序号升序排列 //if (mainList != null && mainList.Count > 0) //{//每次只处理一个 // Do_HandlerMainTaskDecompose(mainList, context); //} //else //{ // SystemWarningMsg._lbl_Alert_MainTaskDecompose = "没有要分解的任务"; //} var isAllowDecomposeOutTask = true;//是否允许分解出库任务 //按照先 出库优先,再入库的原则来 var mainList = context.Task_Main.Where(x => x.TaskState == queryState2).OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList();//按照顺序号升序排列 if (mainList != null && mainList.Count > 0) {//每次只处理一个 //验证 如果连续出库任务分解了两次,并且1012 var errMsg = ""; if (!MyExtendHelper.IsNoFinishedOutTaskGroupbyArea(context, ref errMsg)) { SystemWarningMsg._lbl_Alert_MainTaskDecompose += "不允许分解出库任务:" + errMsg + SysGloble.SPLIT_STR; isAllowDecomposeOutTask = false; } //var _list = MyExtendHelper.GetHasCatogryStationCodeAreaList(); Dictionary dict_hasNoFinishedOutStoreTaskStationCodeAreaList = new Dictionary(); var _list = MyExtendHelper.GetHasCatogryAndNoFinishedOutStoreTaskStationCodeAreaList(context, ref dict_hasNoFinishedOutStoreTaskStationCodeAreaList); if (_list != null && _list.Count >= 2) { SystemWarningMsg._lbl_Alert_MainTaskDecompose += "不允许分解出库任务:四个出库口目前有" + _list.Count + "个被占用了,超过了设定值:" + 2 + SysGloble.SPLIT_STR; isAllowDecomposeOutTask = false; } if (isAllowDecomposeOutTask) { Do_HandlerMainTaskDecomposeForOut(mainList, context); } } else {//当前没有要出库的主任务,或者是 1012长时间被托盘占用的情况下 才允许分解组盘入库任务 } } } } catch (Exception ex) { SystemWarningMsg._lbl_Alert_MainTaskDecompose += "分解线程出现异常:" + ex.Message + SysGloble.SPLIT_STR; Log4NetHelper.WriteErrorLog(LogType.CCWCFService, "HandlerIssuingTask出现异常:" + ex.Message, ex); } Thread.Sleep(2000);//休眠2秒 } } private static void Do_HandlerMainTaskDecomposeForOut(List mainList, DbModel context) { if (mainList != null && mainList.Count > 0) {//出库任务,严格按照 出库计划的顺序来执行。不能调个。 //取前2台要出库的发动机,必须只能是处理2个,否则会出现顺序不对的情况 var _mainList = mainList.OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList().Take(2); List areaList = new List(); List doMainList = new List(); foreach (var item in _mainList) { if (string.IsNullOrEmpty(item.Area)) { throw new Exception("出库任务" + item.TaskNo + "的区域为空!"); } if (areaList.Count >= 2) { break; } if (!areaList.Contains(item.Area)) { areaList.Add(item.Area); doMainList.Add(item); } } //获取要处理的这些任务 foreach (var doMain in doMainList) { FunRetEntity result = null; result = SingleHandlerForOutTask(context, doMain); if (result.result) context.SaveChanges(); SystemWarningMsg._lbl_Alert_MainTaskDecompose = result.resMsg + SysGloble.SPLIT_STR; } } else { SystemWarningMsg._lbl_Alert_MainTaskDecompose += "没有要分解的任务" + SysGloble.SPLIT_STR; } } private static FunRetEntity SingleHandlerForOutTask(DbModel context, Task_Main mainTask) { try { //再次判断主任务是否已经被分解 var aa = context.Task_Main.Where(x => x.Id == mainTask.Id).First(); if (aa.TaskState != (int)MainTaskStatusEnum.待出库) { return FunRetEntity.Fail("主任务不是待出库状态"); } var toPlace = StationHandler.GetPlaceByPlaceId((int)mainTask.ToPlace, context); var sourcePlace = StationHandler.GetPlaceByPlaceId((int)mainTask.SourcePlace, context); var salver = SalverHandler.GetSalveById(context, mainTask.SalverId); //中间点 var midPlace = StationHandler.GetRgvPlaceBySrmPlaceForOutStore(context, sourcePlace); if (midPlace == null) { return FunRetEntity.Fail("没有找到RGV出库位置"); } //去掉这个验证 【EditBy shaocx,2022-05-19】 //判断rgv站点是否有光电占用 [EditBy shaocx,2022-04-29] /* var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(midPlace.RgvStationCode); if (isGD_HasCatogryForRgvStattion) { return FunRetEntity.Fail("RGV出库口站点" + midPlace.RgvStationCode + "上面光电显示有货,不允许创建堆垛机出库任务"); } //*/ //增加验证同一个目标点,是否存在未结束的任务,如果有,则不允许了 【EditBy shaocx,2022-04-29】 //同一个堆垛机的前面未结束的任务,且同种类型 var queryTaskState1 = (int)DeviceTaskStatusEnum.未开始; var queryTaskState2 = (int)DeviceTaskStatusEnum.已下发; var otherSrmTask = context.Task_Part.Where(x => x.ToPlace == midPlace.Id && x.DeviceType == (int)EDeviceType.堆垛机 && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2) ).FirstOrDefault(); if (otherSrmTask != null) { return FunRetEntity.Fail("上一个堆垛机任务未完成,不允许创建堆垛机出库任务,上一个堆垛机任务号:" + otherSrmTask.PlcTaskId); } var plcTaskNo = BusinessHelper.CreatePlcTaskIdForSrmTask(); var createTime = DateTime.Now; //创建堆垛机任务 FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, context, EDeviceType.堆垛机, mainTask.CreateBy, 1, DeviceTaskTypeEnum.出库, mainTask, salver, sourcePlace, midPlace, mainTask.OperationRemark); if (fre.result == false) { return fre; } //创建RGV任务 fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, context, EDeviceType.RGV, mainTask.CreateBy, 2, DeviceTaskTypeEnum.出库, mainTask, salver, midPlace, toPlace, mainTask.OperationRemark); if (fre.result == false) { return fre; } //更新主表的任务状态 var _changeTaskState = MainTaskStatusEnum.出库任务已分解; mainTask.TaskState = (int)_changeTaskState; mainTask.TaskStateName = _changeTaskState.ToString(); return FunRetEntity.Success("成功新建出库设备任务"); } catch (Exception ex) { return FunRetEntity.Fail("新增出库设备任务异常:" + ex.Message); } } } }