using iWareCommon.Common.Globle; using iWareCommon.Utils; using iWareModel; using iWareModel.EnumType.XiGangPublicCommon; 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.Common.Helper { /// /// 增补创建的扩展帮助类 【EditBy shaocx,2022-02-05】 /// public class MyExtendHelper { /// /// 配置缺料原因 /// /// /// /// public static string GetQueliaoReason(string oldRemark, string queliaoReason) { char splitStr = '|'; var updateRemark = "缺料原因:" + queliaoReason; if (string.IsNullOrEmpty(oldRemark)) { oldRemark = updateRemark + splitStr; } else { //解析字符串 var arr = oldRemark.Split(splitStr); oldRemark = updateRemark + splitStr + arr.Last(); } return oldRemark; } /// /// 清除缺料原因 /// /// /// /// public static string CleareQueliaoReason(string oldRemark) { char splitStr = '|'; if (string.IsNullOrEmpty(oldRemark)) { return string.Empty; } else { //解析字符串 var arr = oldRemark.Split(splitStr); oldRemark = arr.Last(); } return oldRemark; } /// /// 设置强制完成信号 /// /// /// public static void SetSrm_IN_SMQZYZTG(EDevice device, bool value) { if (device == EDevice.一号堆垛机) { FormCC.Srm1_IN_SMQZYZTG = value; } else if (device == EDevice.二号堆垛机) { FormCC.Srm2_IN_SMQZYZTG = value; } else if (device == EDevice.三号堆垛机) { FormCC.Srm3_IN_SMQZYZTG = value; } else if (device == EDevice.四号堆垛机) { FormCC.Srm4_IN_SMQZYZTG = value; } } /// /// 根据堆垛机的入库口获取 输送线的站点号 /// /// /// public static string GetRgvStationCodeBySrm(EDevice device) { string stationCode = ""; if (device == EDevice.一号堆垛机) { stationCode = "1002"; } else if (device == EDevice.二号堆垛机) { stationCode = "1004"; } else if (device == EDevice.三号堆垛机) { stationCode = "1006"; } else if (device == EDevice.四号堆垛机) { stationCode = "1007"; } return stationCode; } /// /// 四个入库口 扫描验证结果推送 /// /// /// /// /// /// /// /// public static bool WriteScanValidateACK(bool isReset, string handType, string stationCode, int plcTaskId, bool value, string sysSalverCode, string scanCode) { using (RgvService.RgvServiceClient clent = new RgvService.RgvServiceClient()) { var res = clent.WriteScanValidateACK(isReset, (int)EDevice.RGV, stationCode, value, Convert.ToInt32(plcTaskId)); if (res.result) { Log4NetHelper.WriteInfoLog(iWareCommon.Utils.LogType.LineInScanTheadService, "HandlerLineInSacnResult 下发扫描验证下发成功,写入值value:" + value + ",stationCode:" + stationCode + ",PlcTaskId:" + plcTaskId + ",系统托盘号:" + sysSalverCode + ",扫描托盘号:" + scanCode + ",处理类型:" + handType); return true; } else { Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.LineInScanTheadService, "HandlerLineInSacnResult 下发扫描验证下发失败,写入值value:" + value + ",stationCode:" + stationCode + ",PlcTaskId:" + plcTaskId + ",系统托盘号:" + sysSalverCode + ",扫描托盘号:" + scanCode + ",处理类型:" + handType); return false; } } } /// /// 托盘回收时,是否允许创建去1014的任务 /// /// /// true:允许创建,false:不允许创建 public static bool IsAllowSendTaskTo1014ByTPHS(ref string errMsg) { //增加验证,1009上两个光电有货,或 1010上其中一个光电有货,或 1011上一个光电有货,就先暂停不要下发去1014的任务,目的是为了优先让托盘回收的去1014位置,而不是立体库,挺高接怕 [EditBy shaocx,2022-05-01] EDevice rgvLocation = EDevice.空托缓存1009; var stationCode = Convert.ToInt32(rgvLocation).ToString(); //bool isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattionForPH_1(stationCode); bool isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(stationCode); if (isGD_HasCatogryForRgvStattion) { errMsg = "1009显示PH_01光电有货,就暂时不创建从立体库去1014的任务,等着1009的托盘到了1011再定夺托盘区哪里"; return false; } rgvLocation = EDevice.空托缓存1010; isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(stationCode); if (isGD_HasCatogryForRgvStattion) { errMsg = "1010显示一个光电有货,就暂时不创建从立体库去1014的任务,等着1010的托盘到了1011再定夺托盘区哪里"; return false; } rgvLocation = EDevice.空托缓存1011; isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(stationCode); if (isGD_HasCatogryForRgvStattion) { errMsg = "1011显示一个光电有货,就暂时不创建从立体库去1014的任务"; return false; } return true; } /// /// 根据1009站点的光电获取返回立体库的托盘数 /// /// public static int GetSalverStackCountForBackToStore() { var high3 = FormCC.rgvView.R_1009_High3; var high2 = FormCC.rgvView.R_1009_High2; var high1 = FormCC.rgvView.R_1009_High1; int count = 0; if (high1 && high2 && high3) { count = 3; } else if (high1 && high2 && !high3) { count = 2; } else if (high1 && !high2 && !high3) { count = 1; } return count; } /// /// 判断 出库的任务未完成的,超过了两个库区的设定 /// /// /// /// true:未超过限定 false:超过了限定 public static bool IsNoFinishedOutTaskGroupbyArea(DbModel context, ref string errMsg) { var queryTaskType = (int)DeviceTaskTypeEnum.出库; var noFishisedList = context.Task_Part.Where(x => x.TaskType == queryTaskType && (x.TaskState == (int)DeviceTaskStatusEnum.未开始 || x.TaskState == (int)DeviceTaskStatusEnum.已下发) && x.DeviceType == (int)EDeviceType.堆垛机 ).ToList(); if (noFishisedList == null || noFishisedList.Count == 0) { return true; } int num = noFishisedList.Select(x => x.DeviceId).Distinct().Count(); if (num >= 2) { errMsg = "未结束的出库任务所占的库区,已经超过设定的值" + 2 + ",目前是:" + num; return false; } return true; } /* /// /// 是否条件允许做入库任务,只有当 当 没有出库计划,或者是 1012长时间被托盘占用的情况下 才允许分解组盘入库任务 /// /// /// public static bool IsAllowCreateTaskForInStore(DbModel context, ref string errMsg) { //查询状态=下发中的出库计划 //注意:原则是优先执行出库任务 var queryState2 = (int)MainTaskStatusEnum.待出库; //按照先 出库优先,再入库的原则来 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) {//每次只处理一个 if (FormCC.RGV_1012_HasCategory_COUNT > SysGloble.MAX_RGV_1012_HasCategory_COUNT) {//1012长时间被托盘占用的情况下 才允许分解组盘入库任务 return true; } } else {//只有当 没有出库计划,或者是 1012长时间被托盘占用的情况下 才允许分解组盘入库任务 return true; } errMsg = "只有当 没有出库计划,或者是 1012长时间被托盘占用的情况下 才允许入库任务"; return false; } //*/ ///// ///// 是否有两个货物占用两个出库口,并且1012上显示有货 ///// ///// //public static bool IsHasTwoCatogryOnOutStationAndOn1012() //{ // //判断出库计划是否有两个出库口被货物占用了 // var _list = GetHasCatogryStationCodeAreaList(); // if (_list != null && _list.Count >= 2) // {//说明有两个货物占用两个出库口 // var isHasCatogry_1012 = IsGD_HasCatogryForRgvStattion(((int)EDevice.出库口1012).ToString()); // if (isHasCatogry_1012) // { // return true; // } // } // return false; //} /// /// 获取四个出库口 光电有货物占用的列表 /// /// /// public static List GetHasCatogryStationCodeAreaList() { if (MyExtendHelper.IsAllowSimulatorHandle(null)) {//如果是模拟,返回默认 [EditBy shaocx,2022-05-31] return new List(); } List hasCatogryStationCodeAreaList = new List(); //优先从四个出库口目前未占用的地方出库 var stationCode = ((int)EDevice.堆垛机1出库口1001).ToString(); var isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isHasCatogry) { hasCatogryStationCodeAreaList.Add("1"); } stationCode = ((int)EDevice.堆垛机2出库口1003).ToString(); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isHasCatogry) { hasCatogryStationCodeAreaList.Add("2"); } stationCode = ((int)EDevice.堆垛机3出库口1005).ToString(); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isHasCatogry) { hasCatogryStationCodeAreaList.Add("3"); } stationCode = ((int)EDevice.堆垛机4出库口1008).ToString(); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isHasCatogry) { hasCatogryStationCodeAreaList.Add("4"); } return hasCatogryStationCodeAreaList; } /// /// 获取四个出库口 有出库任务未结束或有货物占用 的占用的列表 /// /// /// public static List GetHasCatogryAndNoFinishedOutStoreTaskStationCodeAreaList(DbModel context, ref Dictionary dict_hasNoFinishedOutStoreTaskStationCodeAreaList) { dict_hasNoFinishedOutStoreTaskStationCodeAreaList = new Dictionary(); List hasNoFinishedOutStoreTaskStationCodeAreaList = new List(); if (MyExtendHelper.IsAllowSimulatorHandle(null)) {//如果是模拟,返回默认 [EditBy shaocx,2022-05-31] return new List(); } //优先从四个出库口目前未占用的地方出库 var stationCode = ((int)EDevice.堆垛机1出库口1001).ToString(); var place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); bool isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id);//判断堆垛机是否有出库任务未结束 var isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("1"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("1", FormCC.RGV_1001_HasCategory_COUNT); } stationCode = ((int)EDevice.堆垛机2出库口1003).ToString(); place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("2"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("2", FormCC.RGV_1003_HasCategory_COUNT); } stationCode = ((int)EDevice.堆垛机3出库口1005).ToString(); place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("3"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("3", FormCC.RGV_1005_HasCategory_COUNT); } stationCode = ((int)EDevice.堆垛机4出库口1008).ToString(); place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("4"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("4", FormCC.RGV_1008_HasCategory_COUNT); } return hasNoFinishedOutStoreTaskStationCodeAreaList; } public static List GetHasCatogryAndNoFinishedOutStoreTaskStationCodeAreaListForOutSalver(DbModel context, ref Dictionary dict_hasNoFinishedOutStoreTaskStationCodeAreaList) { dict_hasNoFinishedOutStoreTaskStationCodeAreaList = new Dictionary(); List hasNoFinishedOutStoreTaskStationCodeAreaList = new List(); if (MyExtendHelper.IsAllowSimulatorHandle(null)) {//如果是模拟,返回默认 [EditBy shaocx,2022-05-31] return new List(); } //优先从四个出库口目前未占用的地方出库 var stationCode = ((int)EDevice.堆垛机1出库口1001).ToString(); var place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); bool isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id);//判断堆垛机是否有出库任务未结束 var isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry || !IsKongXianForSrm(EDevice.一号堆垛机)) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("1"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("1", FormCC.RGV_1001_HasCategory_COUNT); } stationCode = ((int)EDevice.堆垛机2出库口1003).ToString(); place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry || !IsKongXianForSrm(EDevice.二号堆垛机)) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("2"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("2", FormCC.RGV_1003_HasCategory_COUNT); } stationCode = ((int)EDevice.堆垛机3出库口1005).ToString(); place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry || !IsKongXianForSrm(EDevice.三号堆垛机)) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("3"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("3", FormCC.RGV_1005_HasCategory_COUNT); } stationCode = ((int)EDevice.堆垛机4出库口1008).ToString(); place = context.Base_Station.Where(x => x.RgvStationCode == stationCode).First(); isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, place.Id); isHasCatogry = IsGD_HasCatogryForRgvStattion(stationCode); if (isExistOtherTaskDoing || isHasCatogry || !IsKongXianForSrm(EDevice.四号堆垛机)) { hasNoFinishedOutStoreTaskStationCodeAreaList.Add("4"); dict_hasNoFinishedOutStoreTaskStationCodeAreaList.Add("4", FormCC.RGV_1008_HasCategory_COUNT); } return hasNoFinishedOutStoreTaskStationCodeAreaList; } /// /// 判断堆垛机是否空闲 /// /// private static bool IsKongXianForSrm(EDevice devic) { if (FormCC.srmViewDict[(int)devic].R_State == (int)ESrmState.空闲) { return true; } return false; } #region 寻找立体库中的空托,出库到1014位置 /// /// 寻找立体库中的空托,出库到1014位置 /// /// /// /// public static V_Store FindStoreForEmptySalverTo1014(DbModel context, ref string errMsg) { var queryMaterialType = (int)MaterialTypeEnum.托盘; var findStoreList = context.V_Store.Where(x => x.MaterialType == queryMaterialType && x.StationIsHasTaskDoing == false && x.StationIsLock == false && x.StationIsDeleted == false).OrderBy(x => x.InStoreTime).ThenBy(x => x.Qty).ToList();//空托排序 if (findStoreList == null || findStoreList.Count == 0) { errMsg = "未找到可用于到拆盘机入库的立体库空托盘库存"; return null; } //注意:排除掉堆垛机不可用的 【EditBy shaocx,2022-04-16】 findStoreList = StationHandler.FindPlacesFilterByBreakdown(findStoreList);//通过设备状态来过滤库位 [EditBy shaocx,2020-12-13] if (findStoreList == null || findStoreList.Count == 0) { errMsg = "未找到可用于到拆盘机入库的空托盘库存"; return null; } #region 优先从四个出库口目前未占用的地方出库 Dictionary dict_hasNoFinishedOutStoreTaskStationCodeAreaList = new Dictionary(); List hasCatogryStationCodeAreaList = GetHasCatogryAndNoFinishedOutStoreTaskStationCodeAreaListForOutSalver(context, ref dict_hasNoFinishedOutStoreTaskStationCodeAreaList); var resultStore = findStoreList.FirstOrDefault(); if (hasCatogryStationCodeAreaList.Count == 0) { return resultStore; } else { var new_findStoreList = findStoreList.Where(x => !hasCatogryStationCodeAreaList.Contains(x.Area)).OrderBy(x => x.InStoreTime).ThenBy(x => x.Qty).ToList();//空托排序 if (new_findStoreList == null || new_findStoreList.Count == 0) { //无奈,只好排队了,先找有货秒数=0的那个 var myArea = ""; foreach (var item in dict_hasNoFinishedOutStoreTaskStationCodeAreaList) { if (item.Value == 0) { myArea = item.Key; break; } } if (!string.IsNullOrEmpty(myArea)) { resultStore = findStoreList.Where(x => x.Area == myArea).OrderBy(x => x.InStoreTime).ThenBy(x => x.Qty).First();//空托排序 } else { //无奈,只好排队了,排队也要排最长的那个 var dict = dict_hasNoFinishedOutStoreTaskStationCodeAreaList.OrderByDescending(x => x.Value).First();//取排队时间最长的那个 resultStore = findStoreList.Where(x => x.Area == dict.Key).OrderBy(x => x.InStoreTime).ThenBy(x => x.Qty).First();//空托排序 } return resultStore; } else {//找到最优的 return new_findStoreList.FirstOrDefault(); } } #endregion } #endregion /// /// 新建转运任务 /// /// 1:转移到1014位置 2:转移到立体库中 3:1009到1011 4:立体库到1014位置 /// RGV设备号 /// /// /// public static FunRetEntity AddTransferTask(AddTransferTaskEnum flag, EDevice rgvEDevice, SysUser user, V_AllStore store) { FunRetEntity fr = new FunRetEntity(); var errMsg = ""; var remark = "新增转运任务"; try { #region 事务 #endregion using (DbModel edm = new DbModel()) { //增加验证 【EditBy shaocx,2022-04-28】 switch (flag) { case AddTransferTaskEnum.位置1011转移到1014位置: case AddTransferTaskEnum.位置1011转移到立体库中: //去掉这个验证,前面允许创建任务就创建吧 【EditBy shaocx,2022-05-15】 /* var isAllow = IsAllowCreateTaskForInStore(edm, ref errMsg); if (!isAllow) { return FunRetEntity.Fail(errMsg); } //*/ break; } using (var trans = edm.Database.BeginTransaction()) { try { Task_Main mainTask = new Task_Main(); mainTask.IsVirtual = false;//非虚拟入库 mainTask.TaskNo = TaskNoHelper.GenerateTaskNo("TR"); mainTask.TaskName = "空托转运"; #region 获取任务起点 //起点 var realSourcePlace = ""; Base_Station sourcePlace = null; if (flag == AddTransferTaskEnum.立体库到1014位置) {//4:立体库到1014位置 var srmStore = MyExtendHelper.FindStoreForEmptySalverTo1014(edm, ref errMsg); if (srmStore == null) { return FunRetEntity.Fail(errMsg); } store = ClassHelper.RotationMapping(srmStore); sourcePlace = StationHandler.GetPlaceByPlaceId(store.StationId, edm); realSourcePlace = sourcePlace.SrmStationCode; //记录区域 [EditBy shaocx,2022-05-02] var device = BusinessHelper.GetSrmDeviceByPlaceNo(sourcePlace.SrmStationCode); mainTask.Area = ((int)device).ToString(); } else if (flag == AddTransferTaskEnum.位置1014到1020) {//5:位置1014到1020 sourcePlace = StationHandler.GetPlaceByPlaceId(store.StationId, edm); realSourcePlace = sourcePlace.RgvStationCode; } else { var getSourcePlaceResult = StationHandler.GetTargtStationForAddTransferTask(edm, rgvEDevice, ref errMsg, ref sourcePlace); if (getSourcePlaceResult.result == false) return getSourcePlaceResult; realSourcePlace = sourcePlace.RgvStationCode; } mainTask.SourcePlace = sourcePlace.Id; mainTask.RealSourcePlace = realSourcePlace; #endregion #region 获取中间点和目标点 Base_Station toPlace = null; Base_Station midPlace = null; var getMidToPlaceResult = MainTaskHandler.GetMidToPlaceForAddTransferTask(sourcePlace, flag, edm, ref errMsg, ref toPlace, ref midPlace, ref mainTask); if (getMidToPlaceResult.result == false) return getMidToPlaceResult; #endregion SetTaskTypeStateAndInOutFlagForMainTask(flag, ref mainTask); Base_Salver salver = null; Base_Material newMaterial = null; if (store == null) {//新建物料,新建托盘,新建绑定关系 //绑定托盘和站点的关系 //新建物料 var salverStackCount = GetSalverStackCountForBackToStore(); if (salverStackCount == 0) { //报错 return FunRetEntity.Fail("根据1009站点的光电获取返回立体库的托盘数为0"); } newMaterial = MaterialHandler.CreateEmptySlaverMaterial(edm, "空托盘转运时创建", salverStackCount); //判断托盘是否存在,如果存在,就不需要重建,如果不存在,就新建托盘 salver = SalverHandler.CreateVirtualSalver(edm, "空托盘转运"); if (!string.IsNullOrEmpty(errMsg)) { return FunRetEntity.Fail(errMsg); } //绑定托盘和物料的关系 Salver_Material_Handler.CreateCvIRelation(edm, user.Name, salver, newMaterial, remark); //绑定托盘和站点的关系 Salver_Station_Handler.CreateCvPRelation(edm, user.Name, salver, sourcePlace, Salver_V_Station_StateEnum.入库绑定, remark); } else { salver = SalverHandler.GetSalveById(edm, store.SalverId); newMaterial = MaterialHandler.GetMaterialById(edm, store.MaterialId); } mainTask.SalverId = salver.Id; mainTask.SalverCode = salver.SalverCode; mainTask.MaterialId = newMaterial.Id; //物料信息 MainTaskHandler.SetMaterialForMainTask(ref mainTask, newMaterial); //序列号和订货号赋值 [Editby shaocx,2022-04-05] mainTask.SerialNumber = ""; mainTask.OrderNo = ""; mainTask.CreateTime = mainTask.ModifyTime = mainTask.StartTime = DateTime.Now; mainTask.CreateBy = mainTask.ModifyBy = user.Name; mainTask.CreateId = mainTask.ModifyId = user.ID; mainTask.OperationRemark = "添加"; string taskSequenceGuid = ""; mainTask.TaskSequence = MainTaskHandler.GenerateTaskSequence(edm, ref taskSequenceGuid);//生成任务序列号 mainTask.TaskSequenceGuid = taskSequenceGuid; edm.Task_Main.Add(mainTask); edm.SaveChanges();//保存一次,此时mainTask的自增ID就有值了 var plcTaskNo = BusinessHelper.CreatePlcTaskIdForSrmTask(); var createTime = DateTime.Now; if (flag == AddTransferTaskEnum.位置1011转移到1014位置) {//转移到1014位置 //创建RGV任务 FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.RGV, user.Name, 1, DeviceTaskTypeEnum.空托转运到拆盘机入口, mainTask, salver, sourcePlace, toPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } } else if (flag == AddTransferTaskEnum.位置1011转移到立体库中) {//转移到立体库中 //创建RGV任务 FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.RGV, user.Name, 1, DeviceTaskTypeEnum.空托转运到立体库, mainTask, salver, sourcePlace, midPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } //创建堆垛机任务 fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.堆垛机, user.Name, 2, DeviceTaskTypeEnum.空托转运到立体库, mainTask, salver, midPlace, toPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } } else if (flag == AddTransferTaskEnum.位置1009到位置1011) {// 3:1009到1011 //创建RGV任务 FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.RGV, user.Name, 1, DeviceTaskTypeEnum.空托缓存位转运, mainTask, salver, sourcePlace, toPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } } else if (flag == AddTransferTaskEnum.立体库到1014位置) {//4:立体库到1014位置 //创建堆垛机任务 FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.堆垛机, user.Name, 1, DeviceTaskTypeEnum.立库空托到拆盘机入口, mainTask, salver, sourcePlace, midPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } //创建RGV任务 fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.RGV, user.Name, 2, DeviceTaskTypeEnum.立库空托到拆盘机入口, mainTask, salver, midPlace, toPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } } else if (flag == AddTransferTaskEnum.位置1014到1020) {//5:1014到1020位置 //创建RGV任务 FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, edm, EDeviceType.RGV, user.Name, 1, DeviceTaskTypeEnum.拆盘机入口到拆盘机, mainTask, salver, sourcePlace, toPlace, remark); if (fre.result == false) { throw new Exception(fr.resMsg); } } edm.SaveChanges();//第二次保存 trans.Commit();//事务提交 } catch (Exception ex) { trans.Rollback(); throw ex; } } return FunRetEntity.Success("成功"); } } catch (System.Exception ex) { throw ex; } } private static void SetTaskTypeStateAndInOutFlagForMainTask(AddTransferTaskEnum flag, ref Task_Main mainTask) { var _InOutFlag = default(MainInOutFlagEnum); var _taskType = default(MainTaskTypeEnum); var _taskState = default(MainTaskStatusEnum); switch (flag) { case AddTransferTaskEnum.立体库到1014位置: _taskType = MainTaskTypeEnum.自动出库; _taskState = MainTaskStatusEnum.出库中; _InOutFlag = MainInOutFlagEnum.出库; break; case AddTransferTaskEnum.位置1009到位置1011: case AddTransferTaskEnum.位置1011转移到1014位置: case AddTransferTaskEnum.位置1014到1020: _taskType = MainTaskTypeEnum.空托转运; _taskState = MainTaskStatusEnum.待转运; _InOutFlag = MainInOutFlagEnum.转运; break; case AddTransferTaskEnum.位置1011转移到立体库中: _taskType = MainTaskTypeEnum.自动入库; _taskState = MainTaskStatusEnum.入库中; _InOutFlag = MainInOutFlagEnum.入库; break; default: throw new Exception("不支持的类型"); } mainTask.TaskType = Convert.ToInt32(_taskType); mainTask.TaskTypeName = _taskType.ToString(); mainTask.TaskState = Convert.ToInt32(_taskState); mainTask.TaskStateName = _taskState.ToString(); mainTask.InOutFlag = (int)_InOutFlag; mainTask.InOutFlagName = _InOutFlag.ToString(); } /// /// 是否允许给1014发送目标点是1014的任务 /// /// /// /// /// true:允许,false:不允许 public static bool IsAllowSendTaskToPlace1014(DbModel context, string stationCode, ref V_AllStore store) { var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(stationCode); var isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(stationCode); var isSys_HasCatogryForRgvStattion = MyExtendHelper.IsSys_HasCatogryForRgvStattion(context, stationCode, ref store);//1014上是否有系统库存 var isExistOtherTaskDoingForDeviceTaskTypeEnum_立库空托到拆盘机入口 = PartTaskHandler.IsExistOtherTaskDoingForDeviceTaskTypeEnum(DeviceTaskTypeEnum.立库空托到拆盘机入口); var isExistOtherTaskDoingForDeviceTaskTypeEnum_空托转运到拆盘机入口 = PartTaskHandler.IsExistOtherTaskDoingForDeviceTaskTypeEnum(DeviceTaskTypeEnum.空托转运到拆盘机入口); if (!isSys_HasCatogryForRgvStattion && //没有系统库存 !isGD_HasCatogryForRgvStattion && //光电显示无货 !isExistOtherTaskDoing //没有其他任务占用 && isExistOtherTaskDoingForDeviceTaskTypeEnum_立库空托到拆盘机入口 == false && isExistOtherTaskDoingForDeviceTaskTypeEnum_空托转运到拆盘机入口 == false ) { return true; } return false; } /// /// 站点光电是否有货(只需要判断其中一个光电,就认为,有货) /// /// /// true:光电有货,false:光电无货 public static bool IsGD_HasCatogryForRgvStattion(string stationCode) { if (FormCC.rgvView == null) return false; var rgv = FormCC.rgvView.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); if (rgv.R_PH_2 == true || rgv.R_PH_1 == true) {//只需要判断其中一个光电,就认为,有货 return true; } return false; } /// /// 站点光电是否有货(两个光电必须全是有货) /// /// /// true:光电有货,false:光电无货 public static bool IsGD_HasCatogryForRgvStattionFor2(string stationCode) { if (FormCC.rgvView == null) return false; var rgv = FormCC.rgvView.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); if (rgv.R_PH_1 == true && rgv.R_PH_2 == true) {//有货,两个光电必须全是有货 return true; } return false; } /// /// 站点PH_1光电是否有货 (PH_1是指他的停止光电) /// /// /// true:光电有货,false:光电无货 public static bool IsGD_HasCatogryForRgvStattionForPH_1(string stationCode) { if (FormCC.rgvView == null) return false; var rgv = FormCC.rgvView.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); if (rgv.R_PH_1 == true) {//PH_1有货 return true; } return false; } /// /// 站点PH_2光电是否有货 (PH_2是指他的有货光电) /// /// /// true:光电有货,false:光电无货 public static bool IsGD_HasCatogryForRgvStattionForPH_2(string stationCode) { var rgv = FormCC.rgvView.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); if (rgv.R_PH_2 == true) {//PH_2有货 return true; } return false; } /// /// 站点系统是否有货 /// /// /// true:系统有货,false:系统无货 public static bool IsSys_HasCatogryForRgvStattion(DbModel context, string stationCode, ref V_AllStore store) { store = StoreHandler.GetV_AllStoreByRgvStationCode(context, stationCode); if (store != null) {//有货 return true; } return false; } public static FunRetEntity DoHandler(DbModel context, V_AllStore store, EDevice rgvStationCode) { try { SysUser user = new SysUser() { ID = 0, Name = SysGloble.WCSSystem }; if (rgvStationCode == EDevice.空托缓存1011) { //判断1014是否有空位 var queryRgvStationCode = ((int)EDevice.拆盘机入口1014).ToString(); V_AllStore my1014Store = null; var isAllow = MyExtendHelper.IsAllowSendTaskToPlace1014(context, queryRgvStationCode, ref my1014Store); if (isAllow) { return AddTransferTask(AddTransferTaskEnum.位置1011转移到1014位置, rgvStationCode, user, store); } else { //寻找立体库是否有库存 return AddTransferTask(AddTransferTaskEnum.位置1011转移到立体库中, rgvStationCode, user, store); } //*/ //var isGD_HasCatogryForRgvStattion = IsGD_HasCatogryForRgvStattion(queryRgvStationCode); //var store_1014_count = context.V_AllStore.Where(x => x.RgvStationCode == queryRgvStationCode).Count(); //if (store_1014_count > 0 || isGD_HasCatogryForRgvStattion) //{ //} //else //{//1014无货,创建任务 // return MainTaskHandler.AddTransferTask(AddTransferTaskEnum.转移到1014位置, rgvStationCode, user, store); //} } else if (rgvStationCode == EDevice.空托缓存1009) { return AddTransferTask(AddTransferTaskEnum.位置1009到位置1011, rgvStationCode, user, store); } else if (rgvStationCode == EDevice.拆盘机入口1014) {//拆盘机入口1014处新建从立体库叫托盘任务 return AddTransferTask(AddTransferTaskEnum.立体库到1014位置, rgvStationCode, user, store); } else if (rgvStationCode == EDevice.拆盘机1020) {// 从1014到1020 return AddTransferTask(AddTransferTaskEnum.位置1014到1020, rgvStationCode, user, store); } return null; } catch (Exception ex) { return FunRetEntity.Fail("新增空托盘转运任务异常:" + ex.Message); } } /// /// 判断任务是否允许模拟完成(虚拟模拟或者是强制完成模式) /// /// /// public static bool IsAllowSimulatorHandle(Task_Part _task) { if (WCSConfigHelper.GetConfig_IsSimulationPLC()) { return true; } if (_task != null && _task.IsAllowSimulateExecute == true) { return true; } return false; } } }