//using iWareCommon; //using iWareCommon.Utils; //using iWareSql; //using System; //using System.Collections.Generic; //using System.Threading; //using System.Linq; //using iWareSql.Orm; //using iWareCC.RgvService; //using System.Threading.Tasks; //using iWareSql.Entity.ParamModel; //using iWareCC.BLL; //using iWareSql.DataAccess; //using Newtonsoft.Json; //using iWareModel; //using iWareSql.DBModel; //using iWareCommon.Common.Globle; //using XiGang.Core.Model; //using iWareCC.Common.Helper; //namespace iWareCC //{ // /// // /// RGV任务服务线程类 // /// // public class RgvTaskThreadService : DeviceThreadServiceHandle // { // private static string _namespace = "iWareCC.RgvThreadService"; // private RgvTaskThreadService() { } // public RgvTaskThreadService(LogType logType) // { // base.currentLogType = logType; // } // public override void StartService() // { // Task.Run(() => // { // try // { // //自动执行Rgv任务线程 // Log4NetHelper.WriteInfoLog(base.currentLogType, "[自动执行Rgv任务线程] 启动了"); // base.IssueTaskThread(EDevice.RGV); // base.ConfirmFinishTaskThread(EDevice.RGV); // } // catch (Exception ex) // { // Log4NetHelper.WriteErrorLog(base.currentLogType, "RgvThreadService线程启动出现异常", ex); // } // }); // } // #region 线程处理 // #region 自动执行Rgv任务线程 // /// // /// 自动执行Rgv任务 // /// // /// // public override void IssueTask(object deviceId) // { // var errMsg = ""; // int i_deviceId = (int)deviceId; // while (true) // { // if (SystemValue.isAllowRuning_RgvThreadService && SystemValue.isStartedModel) // { // IssueTaskHandle(i_deviceId, out errMsg); // } // SystemWarningMsg._lbl_Alert_RgvRelease = errMsg; // Thread.Sleep(2000);//2秒一次 // } // } // /// // /// 自动执行Rgv任务(线程) // /// // /// // public override void IssueTaskHandle(int deviceId, out string errMsg) // { // errMsg = ""; // string logHeader = "方法:DoRgvTaskByThead,参数deviceId:" + deviceId.ToString() + "==="; // #region 新增异常信息表 【EditBy shaocx,2020-01-20】 // IDictionary logDict = new Dictionary(); // logDict.Add("deviceId", deviceId); // iWareSql.Orm.Base_SysExceptionInfo exception = SysExceptionInfoHandler.GetExceptionInfo>(base.currentLogType, _namespace, "DoRgvTaskByThead", logDict); // #endregion // try // { // /* // * 执行发送给Rgv的指令任务 // * 1、验证根据设备号是否找到Rgv // * 2、判断设备是否属于任务完成,如果属于任务完成,就继续走3 // * 3、判断数据库中是否有可要下发的任务,如果有就下发+验证起始点和目标点是否正确 // * 4、下发成功后,更新任务状态 // */ // //2、判断设备是否属于空闲,如果属于空闲,就继续走2 // bool isOk = ValidateDeviceIsAllowSendTask((int)EDevice.RGV, out errMsg); // if (!isOk) // { // errMsg = "不允许下发新任务," + errMsg; // return; // } // var newErrMsg = ""; // using (DbModel dbModel = new DbModel()) // { // var partList = GetPartListByDevice(dbModel, deviceId, TaskExcuteTypeEnum.执行任务); // if (partList != null && partList.Count > 0) // { // //首先处理模拟完成的任务 // foreach (var item in partList) // { // if (item.IsAllowSimulateExecute == true) // { // Single_IssueTaskHandle(false, item, dbModel, deviceId, exception, false, out newErrMsg); // errMsg += newErrMsg + SysGloble.SPLIT_STR; // return; // } // } // //foreach (var currentTask in partList) // //{ // // Single_IssueTaskHandle(currentTask, dbModel, deviceId, exception, out errMsg); // // Thread.Sleep(2000);//休眠2秒 【EditBy shaocx,2022-05-04】 // //} // //*/ // //分隔任务 RGV任务和输送线任务 [EditBy shaocx,2022-04-29] // var q_taskType_出库 = (int)DeviceTaskTypeEnum.出库; // var rgvOutTaskList_出库 = partList.Where(x => x.TaskType == q_taskType_出库).ToList();//rgv出库任务 // var q_taskType_立库空托到拆盘机入口 = (int)DeviceTaskTypeEnum.立库空托到拆盘机入口; // var rgvOutTaskList_立库空托到拆盘机入口 = partList.Where(x => x.TaskType == q_taskType_立库空托到拆盘机入口).ToList();//rgv 立库空托到拆盘机入口任务 // var q_taskType_组盘入库 = (int)DeviceTaskTypeEnum.组盘入库; // var q_taskType_空托转运到立体库 = (int)DeviceTaskTypeEnum.空托转运到立体库; // var rgvInTaskList = partList.Where(x => x.TaskType == q_taskType_组盘入库 || x.TaskType == q_taskType_空托转运到立体库).ToList();//rgv入库任务 // var q_taskType_空托转运到拆盘机入口 = (int)DeviceTaskTypeEnum.空托转运到拆盘机入口; // var rgvTaskList_空托转运到拆盘机入口 = partList.Where(x => x.TaskType == q_taskType_空托转运到拆盘机入口).ToList();//rgv 空托转运到拆盘机入口 任务 // //纯输送线任务 // var q_taskType_拆盘机入口到拆盘机 = (int)DeviceTaskTypeEnum.拆盘机入口到拆盘机; // var q_taskType_空托缓存位转运 = (int)DeviceTaskTypeEnum.空托缓存位转运; // var lineTaskList = partList.Where(x => x.TaskType == q_taskType_拆盘机入口到拆盘机 || x.TaskType == q_taskType_空托缓存位转运).ToList();//纯输送线任务 // /* // * 策略: // * 1、优先做发动机出库任务 // * 2、如果发动机出库任务下发不成功,则做 立库空托到拆盘机入口 任务 // * 3、其次做 组盘入库+空托转运到立体库任务,按顺序执行 // * 4、其次做 空托转运到拆盘机入口 任务 // * 5、其他纯输送线任务不受上述策略影响 // */ // if (lineTaskList != null && lineTaskList.Count > 0) // {//纯输送线任务 // foreach (var currentTask in lineTaskList) // { // Single_IssueTaskHandle(false, currentTask, dbModel, deviceId, exception, false, out newErrMsg); // errMsg += newErrMsg + SysGloble.SPLIT_STR; // } // } // if (rgvOutTaskList_出库 != null && rgvOutTaskList_出库.Count > 0) // { // //注意:出库任务下发就不要以CreateTime了,而是按照MainTaskSequence,因为在出库任务分解的时候,会出现那种 【EditBy shaocx,2022-05-19】 // // 二号堆垛机、二号堆垛机、三号堆垛机出库情况,如果按照CreateTime,排序会变为 二号堆垛机、三号堆垛机、二号堆垛机 // //var _partTask = rgvOutTaskList_出库.OrderBy(x => x.CreateTime).First(); // var _partTask = rgvOutTaskList_出库.OrderBy(x => x.MainTaskSequence).ThenBy(x => x.CreateTime).First(); // var validateLastSameToPlaceIsFinished = ValidateLastSameToPlaceIsFinished(dbModel, _partTask, true, ref newErrMsg); // //var vaidateIsMIN_OUTSTORE_RGV_TASK_JIANGE = VaidateIsMIN_OUTSTORE_RGV_TASK_JIANGE(dbModel, _partTask, ref newErrMsg); // if (validateLastSameToPlaceIsFinished == true) // { // //每次只下发第一个出库任务 // Single_IssueTaskHandle(true, _partTask, dbModel, deviceId, exception, true, out newErrMsg); // errMsg += newErrMsg + SysGloble.SPLIT_STR; // if (string.IsNullOrEmpty(errMsg)) // {//说明下发任务成功 // return;//结束此次循环 // } // } // else // { // errMsg += newErrMsg + SysGloble.SPLIT_STR; // } // } // //如果发动机出库任务下发不成功,则做 立库空托到拆盘机入口 任务 // if (rgvOutTaskList_立库空托到拆盘机入口 != null && rgvOutTaskList_立库空托到拆盘机入口.Count > 0) // { // Single_IssueTaskHandle(true, rgvOutTaskList_立库空托到拆盘机入口.OrderBy(x => x.CreateTime).First(), dbModel, deviceId, exception, true, out newErrMsg); // errMsg += newErrMsg + SysGloble.SPLIT_STR; // if (string.IsNullOrEmpty(errMsg)) // {//说明下发任务成功 // return;//结束此次循环 // } // } // //其次做 组盘入库+空托转运到立体库任务,按顺序执行 // if (rgvInTaskList != null && rgvInTaskList.Count > 0) // { // var _partTask = rgvInTaskList.OrderBy(x => x.CreateTime).First(); // var validateLastSameToPlaceIsFinished = ValidateLastSameToPlaceIsFinished(dbModel, _partTask, false, ref newErrMsg); // //var vaidateIsMIN_OUTSTORE_RGV_TASK_JIANGE = VaidateIsMIN_OUTSTORE_RGV_TASK_JIANGE22(dbModel, _partTask, ref newErrMsg); // if (validateLastSameToPlaceIsFinished == true) // { // //按顺序下发 // Single_IssueTaskHandle(true, _partTask, dbModel, deviceId, exception, false, out newErrMsg); // errMsg += newErrMsg + SysGloble.SPLIT_STR; // if (string.IsNullOrEmpty(errMsg)) // {//说明下发任务成功 // return;//结束此次循环 // } // } // else // { // errMsg += newErrMsg + SysGloble.SPLIT_STR; // } // } // //其次做 空托转运到拆盘机入口 任务 // if (rgvTaskList_空托转运到拆盘机入口 != null && rgvTaskList_空托转运到拆盘机入口.Count > 0) // { // Single_IssueTaskHandle(true, rgvTaskList_空托转运到拆盘机入口.OrderBy(x => x.CreateTime).First(), dbModel, deviceId, exception, false, out newErrMsg); // errMsg += newErrMsg + SysGloble.SPLIT_STR; // if (string.IsNullOrEmpty(errMsg)) // {//说明下发任务成功 // return;//结束此次循环 // } // } // //*/ // /* // //分隔任务 RGV任务和输送线任务 [EditBy shaocx,2022-04-29] // var q_taskType1 = (int)DeviceTaskTypeEnum.拆盘机入口到拆盘机; // var q_taskType2 = (int)DeviceTaskTypeEnum.空托缓存位转运; // var lineTaskList = partList.Where(x => x.TaskType == q_taskType1 || x.TaskType == q_taskType2).ToList();//输送线任务 // var rgvTaskList = partList.Where(x => x.TaskType != q_taskType1 && x.TaskType != q_taskType2).ToList();//rgv任务 // if (rgvTaskList != null && rgvTaskList.Count > 0) // { // Single_IssueTaskHandle(true, rgvTaskList.First(), dbModel, deviceId, exception, out errMsg); // Thread.Sleep(2000);//休眠2秒 【EditBy shaocx,2022-05-04】 // } // if (lineTaskList != null && lineTaskList.Count > 0) // { // foreach (var currentTask in lineTaskList) // { // Single_IssueTaskHandle(false, currentTask, dbModel, deviceId, exception, out errMsg); // } // } // //*/ // } // else // { // errMsg = "没有任务要发送给Rgv"; // } // } // } // catch (Exception ex) // { // errMsg = "出现异常:" + ex.Message; // SysExceptionInfoHandler.GetExceptionInfoForError("自动执行Rgv任务(线程)出现异常,deviceId:" + deviceId + ",异常:" + ex.Message, ex, ref exception); // SysExceptionInfoHandler.InsertExceptionInfo(exception, true); // } // } // /// // /// // /// // /// // /// // /// // /// // /// // /// 是否是出库任务 // /// // private void Single_IssueTaskHandle(bool isRgvTask, Task_Part currentTask, DbModel dbModel, int deviceId, iWareSql.Orm.Base_SysExceptionInfo exception, // bool isOutStoreTask, // out string errMsg) // { // errMsg = ""; // if (MyExtendHelper.IsAllowSimulatorHandle(currentTask)) // {//如果是模拟完成 // } // else // {//非模拟完成 // #region //3、判断数据库中是否有可要下发的任务,如果有就下发 // //验证起始点和目标点是否正确 // RealPlaceEntity realPlaceEntity = null; // //if (!ValdiatePalceIsRight(dbModel, (int)currentTask.SourcePlace, (int)currentTask.ToPlace, ref realPlaceEntity)) // //{ // // errMsg = "验证起始点和目标点是否正确失败"; // // PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // // return; // //} // //验证是否可以下发任务 // var isOk = ValidateDeviceIsAllowSendTask(isRgvTask, (int)EDevice.RGV, currentTask, out errMsg); // if (!isOk) // { // errMsg = "不允许下发新任务," + errMsg; // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // //要判断起点是否有库存,如果起点没有库存,则报错 【EditBy shaocx,2022-05-15】 // var sourcePlaceStore = dbModel.V_AllStore.Where(x => x.StationId == currentTask.SourcePlace).FirstOrDefault(); // if (sourcePlaceStore == null) // { // errMsg = "不允许下发新任务," + string.Format("起点{0},{1}没有找到库存信息,无法下发RGV任务!", currentTask.SourcePlace.ToString(), currentTask.RealSourcePlace); // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // //验证目标点是否已经有库存 【EditBy shaocx,2022-04-15】 // isOk = ValidateIsHasStoreForToPlace((int)EDevice.RGV, currentTask.ToPlace, currentTask.RealToPlace, out errMsg); // if (!isOk) // { // errMsg = "不允许下发新任务," + errMsg; // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // //if (isRgvTask) // if (currentTask.TaskType == (int)DeviceTaskTypeEnum.出库) //修改为只对出库任务的判断,因为我发现有次出现过,下发了去1012的任务,但当时1012竟然有货,导致rgv不执行任务,然后导致rgv不执行其他入库任务的情况 【EditBy shaocx,2022-05-21】 // { // isOk = ValidateIsExistNoFinished(dbModel, currentTask, ref errMsg); // if (!isOk) // { // errMsg = "不允许下发新任务," + errMsg; // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // } // //增加验证 【EditBy shaocx,2022-05-07】 // var vaidateIsExistNoIssuedTaskBeforeCurrTaskTo1012 = VaidateIsExistNoIssuedTaskBeforeCurrTaskTo1012(dbModel, currentTask, ref errMsg); // if (vaidateIsExistNoIssuedTaskBeforeCurrTaskTo1012) // { // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // var vaidateIsExistNoIssuedTaskBeforeCurrTaskToSameInStoreStation = VaidateIsExistNoIssuedTaskBeforeCurrTaskToSameInStoreStation(dbModel, currentTask, ref errMsg); // if (vaidateIsExistNoIssuedTaskBeforeCurrTaskToSameInStoreStation) // { // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // //验证起点光电是否有货存在 【EditBy shaocx,2022-05-11】 // //var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(currentTask.RealSourcePlace); // //if (isGD_HasCatogryForRgvStattion == false) // //{ // // errMsg = "不允许下发新任务,起点位置" + currentTask.RealSourcePlace + "有光电显示无货存在"; // // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // // return; // //} // //如果目标位置有光电显示有货存在,则不允许下发任务,是为了防止1014到1020的任务的,如果1020上有货,就不发任务 【EditBy shaocx,2022-04-30】 // //全部任务都要验证目标点是否有货 【EditBy shaocx,2022-05-08】 // //isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(currentTask.RealToPlace); // //if (isGD_HasCatogryForRgvStattion) // //{ // // errMsg = "不允许下发新任务,目标位置" + currentTask.RealToPlace + "有光电显示有货存在"; // // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // // return; // //} // if (isOutStoreTask) // {//如果是出库任务,则需要检测立体库出库口上面有货才可以下发任务 [EditBy shaocx,2022-05-11] // //休眠1秒 // Thread.Sleep(3000);//增加休眠3秒的判断 // //var isGD_HasCatogryForSoruceRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(currentTask.RealSourcePlace); // //if (!isGD_HasCatogryForSoruceRgvStattion) // //{ // // errMsg = "不允许下发新任务,起始位置" + currentTask.RealSourcePlace + "有光电显示没有货存在!!"; // // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // // return; // //} // //再次判断出库任务,目标位置是否有发动机 // //因为我发现有次出现过,下发了去1012的任务,但当时1012竟然有货,导致rgv不执行任务,然后导致rgv不执行其他入库任务的情况 【EditBy shaocx,2022-07-24】 // //isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(currentTask.RealToPlace); // //if (isGD_HasCatogryForRgvStattion) // //{ // // errMsg = "不允许下发新任务,目标位置" + currentTask.RealToPlace + "有光电显示有货存在"; // // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // // return; // //} // } // //验证是否存在 同一个起点,同一个目标点,并且是 未完成的的任务 // isOk = ValidateIsHasNoFinishedSameTask((int)EDevice.RGV, currentTask, out errMsg); // if (!isOk) // { // errMsg = "不允许下发新任务," + errMsg; // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // //同一个关联任务的其他设备任务 // //判断和堆垛机的连接任务是不是已经完成了 // var queryTaskState1 = (int)SubTaskStateEnum.未开始; // var queryTaskState2 = (int)SubTaskStateEnum.已下发; // var relevanceTask = dbModel.Task_Part.Where(x => x.MainTaskId == currentTask.MainTaskId && x.TaskSequence < currentTask.TaskSequence && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2)).FirstOrDefault(); // if (relevanceTask != null) // { // errMsg = string.Format("关联{0}任务未完成,所以RGV任务不允许下发!关联任务号:{1}", relevanceTask.DeviceName, relevanceTask.PlcTaskId); // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // #region 增加验证 【EditBy shaocx,2022-05-15】 // //来源位置的库位状态 // var sourcePlace = dbModel.Base_Station.Where(o => o.Id == currentTask.SourcePlace).FirstOrDefault(); // if (sourcePlace == null) // { // throw new Exception(string.Format("根据库位号{0}没有找到库位信息!", currentTask.SourcePlace.ToString())); // } // var toPlace = dbModel.Base_Station.Where(o => o.Id == currentTask.ToPlace).FirstOrDefault(); // if (toPlace == null) // { // throw new Exception(string.Format("根据库位号{0}没有找到库位信息!", currentTask.ToPlace.ToString())); // } // DeviceTaskTypeEnum _DeviceTaskTypeEnum; // if (EnumberHelper.GetEnumObject(currentTask.TaskType.ToString(), out _DeviceTaskTypeEnum) == false) // { // throw new Exception("枚举值不正确!"); // } // #endregion // //下发 // SdaResEntity sdaResult = new SdaResEntity(); // var log = TaskRequestLogHandler.GetTask(currentTask.Id, // (int)currentTask.DeviceId, currentTask.PlcTaskId, currentTask.RealSourcePlace.ToString(), // currentTask.RealToPlace.ToString(), "给RGV发送任务指令", "sys"); // try // { // if (MyExtendHelper.IsAllowSimulatorHandle(currentTask)) // { // sdaResult.result = true; // } // else // { // sdaResult = new RgvService.RgvServiceClient().SendRgvTask(deviceId, Convert.ToInt32(currentTask.PlcTaskId), Convert.ToString(currentTask.RealSourcePlace), Convert.ToString(currentTask.RealToPlace)); // } // if (sdaResult.result == false) // {//给Rgv下发指令失败 // errMsg = sdaResult.resMsg; // exception.exceptionMsg = string.Format("发送指令给Rgv失败,设备号{0},任务ID{1},起始位{2},目标位{3},errMsg{4}", deviceId, currentTask.Id, currentTask.SourcePlace.ToString(), currentTask.ToPlace.ToString(), errMsg); // SysExceptionInfoHandler.InsertExceptionInfo(exception, true); // TaskRequestLogHandler.InsertTask(base.currentLogType, RequestStatusEnum.请求失败, JsonConvert.SerializeObject(sdaResult).ToString(), log, null); // return; // } // else // { // TaskRequestLogHandler.InsertTask(base.currentLogType, RequestStatusEnum.请求成功, JsonConvert.SerializeObject(sdaResult).ToString(), log, null); // } // } // catch (Exception ex) // { // errMsg = "出现异常:" + ex.Message; // SysExceptionInfoHandler.GetExceptionInfoForError("给RGV发送任务指令出现异常,deviceId:" + deviceId + ",异常:" + ex.Message, ex, ref exception); // SysExceptionInfoHandler.InsertExceptionInfo(exception, true); // TaskRequestLogHandler.InsertTask(base.currentLogType, RequestStatusEnum.请求失败, JsonConvert.SerializeObject(sdaResult).ToString(), log, ex); // return; // } // #endregion // } // TranferStoreForRgv(currentTask, deviceId, dbModel, "RGV任务下发后", out errMsg); // if (!string.IsNullOrEmpty(errMsg)) // { // //PartTaskHandler.WriteOperationRemarkForPartTask(currentTask.Id, errMsg); // return; // } // //4、下发成功后,更新任务状态 // currentTask.IsReleased = true; // currentTask.ModifyBy = SysGloble.WCSSystem; // currentTask.ModifyTime = DateTime.Now; // var changeState = SubTaskStateEnum.已下发; // currentTask.TaskState = (int)changeState; // currentTask.TaskStateName = changeState.ToString(); // currentTask.OperationRemark = "任务已下发给设备"; // currentTask.IssueTime = DateTime.Now;//下发时间 // //修改Task_Main的状态 // UpdateMainTaskStatus(dbModel, currentTask.MainTaskId, currentTask.TaskType, "下发任务给RGV"); // //推送MES // var mainTask = MainTaskHandler.GetMainTaskById(dbModel, currentTask.MainTaskId); // MesService.UpdateIsNeedOnLineForMainTask(mainTask); // int i = dbModel.SaveChanges(); // if (i <= 0) // { // errMsg = "更新数据库失败,更新条数:" + i; // } // else // { // } // } // #endregion // #region 自动结束Rgv任务线程 // /// // /// 自动结束Rgv任务线程 // /// // /// // public override void ConfirmFinishTask(object deviceId) // { // string errMsg = ""; // int i_deviceId = (int)deviceId; // while (true) // { // if (SystemValue.isAllowRuning_RgvThreadService_Finish && SystemValue.isStartedModel) // { // ConfirmFinishTaskHandle(i_deviceId, out errMsg); // } // SystemWarningMsg._lbl_Alert_RgvReleaseFinish = errMsg; // Thread.Sleep(2000); // } // } // /// // /// 自动结束Rgv任务线程(线程) // /// // /// // public override void ConfirmFinishTaskHandle(int deviceId, out string errMsg) // { // errMsg = ""; // var remark = "自动结束Rgv任务线程(线程)"; // #region 新增异常信息表 【EditBy shaocx,2020-01-20】 // IDictionary logDict = new Dictionary(); // logDict.Add("deviceId", deviceId); // iWareSql.Orm.Base_SysExceptionInfo exception = SysExceptionInfoHandler.GetExceptionInfo>(base.currentLogType, _namespace, "FinishRgvTaskByThead", logDict); // #endregion // try // { // /* // * 执行发送给Rgv的指令任务 // * 1、验证根据设备号是否找到Rgv // * 2、判断设备是否属于任务完成,如果属于任务完成,就继续走3 // * 3、判断数据库中是否有可要完成的任务,如果有判断是否跟Rgv中的完成任务相符,如果相符就处理 // * 4、更新任务状态 // */ // int int_deviceId = (int)deviceId; // //*/ // using (DbModel dbModel = new DbModel()) // { // var partList = GetPartListByDevice(dbModel, deviceId, TaskExcuteTypeEnum.结束任务); // if (partList != null && partList.Count > 0) // { // foreach (var currentTask in partList) // { // SingleConfirmFinishTaskHandle(currentTask, int_deviceId, dbModel, remark, out errMsg); // } // } // else // { // errMsg = "没有RGV任务要处理"; // return; // } // } // } // catch (Exception ex) // { // errMsg = "出现异常:" + ex.Message; // SysExceptionInfoHandler.GetExceptionInfoForError("自动结束Rgv任务线程(线程)出现异常,deviceId:" + deviceId + ",异常:" + ex.Message, ex, ref exception); // SysExceptionInfoHandler.InsertExceptionInfo(exception, true); // } // } // private void SingleConfirmFinishTaskHandle(Task_Part currentTask, int int_deviceId, DbModel dbModel, string remark, out string errMsg) // { // #region //3、判断数据库中是否有可要完成的任务,如果有判断是否跟Rgv中的完成任务相符,如果相符就处理 // DeviceTaskTypeEnum rgvTaskTypeEnum = (DeviceTaskTypeEnum)Enum.Parse(typeof(DeviceTaskTypeEnum), currentTask.TaskType.ToString()); // //同一个关联任务的其他设备任务 // //判断和堆垛机的连接任务是不是已经完成了 // var queryTaskState1 = (int)SubTaskStateEnum.未开始; // var queryTaskState2 = (int)SubTaskStateEnum.已下发; // var relevanceTask = dbModel.Task_Part.Where(x => x.MainTaskId == currentTask.MainTaskId && x.TaskSequence < currentTask.TaskSequence && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2)).FirstOrDefault(); // if (relevanceTask != null) // { // errMsg = string.Format("关联{0}任务未完成,所以RGV任务不允许完成!关联任务号:{1}", relevanceTask.DeviceName, relevanceTask.PlcTaskId); // return; // } // #endregion // //注意:这里不需要判断设备是否完成,直接就结束任务 // //2、判断设备是否属于任务完成,如果属于任务完成,就继续走2 // var isTaskFinished = ValidateDeviceTaskIsFinsished(int_deviceId, currentTask, Convert.ToInt32(currentTask.PlcTaskId), currentTask.IsAllowSimulateExecute, out errMsg); // if (!isTaskFinished) return; // //4、更新任务状态 // currentTask.FinishTime = DateTime.Now;//完成时间 // currentTask.IsFinished = true; // currentTask.TaskState = (int)SubTaskStateEnum.已完成; // currentTask.TaskStateName = SubTaskStateEnum.已完成.ToString(); // currentTask.OperationRemark = "已完成"; // currentTask.ModifyBy = SysGloble.WCSSystem; // currentTask.ModifyTime = DateTime.Now; // using (var trans = dbModel.Database.BeginTransaction()) // { // try // { // //推送MES // var mainTask = MainTaskHandler.GetMainTaskById(dbModel, currentTask.MainTaskId); // MesService.UpdateIsNeedOnLineForMainTask(mainTask); // //注意:一定是先要保存数据库,才再跟plc交互!!!!! // var i = dbModel.SaveChanges(); // if (i <= 0) // { // throw new Exception("修改条数为0"); // } // var isRgvTask = IsRgvTask(currentTask); // if (isRgvTask) // {//如果是RGV任务,则需要去给RGV任务确认 // SdaResEntity confirmTaskFinish = null; // var log = TaskRequestLogHandler.GetTask(currentTask.Id, // (int)currentTask.DeviceId, currentTask.PlcTaskId, currentTask.RealSourcePlace.ToString(), // currentTask.RealToPlace.ToString(), "给RGV发送任务完成确认指令", "sys"); // try // { // //任务完成处理成功,需要再给RGV发送任务完成确认信号 // if (MyExtendHelper.IsAllowSimulatorHandle(currentTask)) // { // confirmTaskFinish = new SdaResEntity() // { // result = true // }; // } // else // { // confirmTaskFinish = new RgvService.RgvServiceClient().WriteRGV_FinishACK((int)EDevice.RGV, true, Convert.ToInt32(currentTask.PlcTaskId)); // } // if (!confirmTaskFinish.result) // { // TaskRequestLogHandler.InsertTask(base.currentLogType, RequestStatusEnum.请求失败, JsonConvert.SerializeObject(confirmTaskFinish), log, null); // trans.Rollback(); // return; // } // else // { // TaskRequestLogHandler.InsertTask(base.currentLogType, RequestStatusEnum.请求成功, JsonConvert.SerializeObject(confirmTaskFinish), log, null); // } // } // catch (Exception ex) // { // errMsg = "出现异常:" + ex.Message; // Log4NetHelper.WriteErrorLog(LogType.RgvThreadService, errMsg, ex); // TaskRequestLogHandler.InsertTask(base.currentLogType, RequestStatusEnum.请求失败, JsonConvert.SerializeObject(confirmTaskFinish), log, ex); // trans.Rollback(); // return; // } // //*/ // } // trans.Commit(); // } // catch (Exception) // { // trans.Rollback(); // throw; // } // } // } // #endregion // #endregion // #region 库存处理 // /// // /// 库存转移 // /// // /// // /// // /// // /// // /// // private void TranferStoreForRgv(Task_Part currentTask, int int_deviceId, DbModel dbModel, string remark, out string errMsg) // { // //来源位置的库位状态 // var sourcePlace = dbModel.Base_Station.Where(o => o.Id == currentTask.SourcePlace).FirstOrDefault(); // if (sourcePlace == null) // { // throw new Exception(string.Format("根据库位号{0}没有找到库位信息!", currentTask.SourcePlace.ToString())); // } // var toPlace = dbModel.Base_Station.Where(o => o.Id == currentTask.ToPlace).FirstOrDefault(); // if (toPlace == null) // { // throw new Exception(string.Format("根据库位号{0}没有找到库位信息!", currentTask.ToPlace.ToString())); // } // //验证目标点是否已经有库存 【EditBy shaocx,2022-04-15】 // var isOk = ValidateIsHasStoreForToPlace((int)EDevice.RGV, currentTask.ToPlace, currentTask.RealToPlace, out errMsg); // if (!isOk) // { // errMsg = "不允许下发新任务," + errMsg; // return; // } // #region 3、变更库位状态(任务占用、锁定) // UpdateStationLockInfoWhenFinished(dbModel, sourcePlace, toPlace, currentTask.Id, "RGV任务完成,出库任务处理"); // #endregion // toPlace.IsFull = true; // sourcePlace.IsFull = false; // DeviceTaskTypeEnum _DeviceTaskTypeEnum; // if (EnumberHelper.GetEnumObject(currentTask.TaskType.ToString(), out _DeviceTaskTypeEnum) == false) // { // throw new Exception("枚举值不正确!"); // } // //修改来源和目标的CVP关系,更新库存 // UpdateStore(dbModel, sourcePlace, toPlace, _DeviceTaskTypeEnum, currentTask); // //5、如果是出库任务,则需要更新计划出库明细表和计划出库主表的信息 // if (currentTask.TaskType == (int)DeviceTaskTypeEnum.出库) // { // PlanOutTaskHandler.UpdatePlanStateToFinished(dbModel, currentTask.MainTaskId, remark); // } // } // #endregion // #region 公共处理 // /// // /// 是否是RGV任务 // /// // /// // /// // private bool IsRgvTask(Task_Part _task) // { // var isRgvTask = true; // if (_task.TaskType == (int)DeviceTaskTypeEnum.拆盘机入口到拆盘机 || _task.TaskType == (int)DeviceTaskTypeEnum.空托缓存位转运) // { // isRgvTask = false; // } // return isRgvTask; // } // /// // /// 判断相同目的地的RGV任务,上一个是否完成了 // /// // /// // /// // /// // /// // public bool ValidateLastSameToPlaceIsFinished(DbModel dbModel, Task_Part currentTask, bool isOutStoreForFDJ, ref string errMsg) // { // ////判断和堆垛机(或RGV)的连接任务是不是已经完成了 // var queryTaskState1 = (int)SubTaskStateEnum.未开始; // var queryTaskState2 = (int)SubTaskStateEnum.已下发; // var queryDeviceId = (int)EDevice.RGV; // //同一个RGV的,并且是同种类型的(即相同目的地的) // Task_Part otherSrmTask = null; // if (isOutStoreForFDJ) // {//是发动机出库 // otherSrmTask = dbModel.Task_Part.Where(x => x.DeviceId == queryDeviceId // && x.Id != currentTask.Id // && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2) // && x.MainTaskSequence <= currentTask.MainTaskSequence // && x.RealToPlace == currentTask.RealToPlace // ).FirstOrDefault(); // } // else // {//非发动机出库 // otherSrmTask = dbModel.Task_Part.Where(x => x.DeviceId == queryDeviceId // && x.Id != currentTask.Id // && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2) // && x.CreateTime < currentTask.CreateTime // && x.RealToPlace == currentTask.RealToPlace // ).FirstOrDefault(); // } // if (otherSrmTask != null) // { // errMsg = "上一个RGV任务(即相同目的地的" + currentTask.RealToPlace + ")未完成,所以本次任务不允许下发!上一个RGV任务号:" + otherSrmTask.PlcTaskId + ",本次RGV任务号:" + currentTask.PlcTaskId; // return false; // } // return true; // } // /// // /// 判断RGV任务,上一个RGV存在已下发的任务 // /// // /// // /// // /// // /// // public bool ValidateIsExistNoFinished(DbModel dbModel, Task_Part currentTask, ref string errMsg) // { // ////判断和堆垛机(或RGV)的连接任务是不是已经完成了 // var queryTaskState2 = (int)SubTaskStateEnum.已下发; // var queryDeviceId = (int)EDevice.RGV; // var q_taskType_拆盘机入口到拆盘机 = (int)DeviceTaskTypeEnum.拆盘机入口到拆盘机; // var q_taskType_空托缓存位转运 = (int)DeviceTaskTypeEnum.空托缓存位转运; // //判断都是RGV任务,前面是否有 已下发 的任务,如果有,就报错 // var otherSrmTask = dbModel.Task_Part.Where(x => x.DeviceId == queryDeviceId // && x.Id != currentTask.Id // && (x.TaskState == queryTaskState2) // //&& x.CreateTime < currentTask.CreateTime // && (x.TaskType != q_taskType_拆盘机入口到拆盘机 && x.TaskType != q_taskType_空托缓存位转运) // ).FirstOrDefault(); // if (otherSrmTask != null) // { // errMsg = "上一个RGV任务是已下发状态,所以本次任务不允许下发!上一个RGV任务号:" + otherSrmTask.PlcTaskId + ",本次RGV任务号:" + currentTask.PlcTaskId; // return false; // } // return true; // } // /// // /// 是否 距离上一次出库任务的下发时间小于设定的值 // /// // /// // /// // /// // /// // public bool VaidateIsMIN_OUTSTORE_RGV_TASK_JIANGE(DbModel edm, Task_Part partTask, ref string errMsg) // { // var queryToPlace = ((int)EDevice.出库口1012).ToString(); // var queryTaskState1 = (int)SubTaskStateEnum.已完成; // var queryDeviceId = (int)EDevice.RGV; // var task = edm.Task_Part.Where(x => // x.DeviceId == queryDeviceId // && x.RealToPlace == queryToPlace // && x.TaskState == queryTaskState1).OrderByDescending(x => x.IssueTime).FirstOrDefault();//获取最新下发完成的出库任务 // if (task != null) // { // //得到下发时间 // var issueTime = (DateTime)task.IssueTime; // var nowTime = DateTime.Now; // TimeSpan ts = nowTime - issueTime; // if (ts.Seconds <= SysGloble.MIN_OUTSTORE_RGV_TASK_JIANGE) // { // errMsg = "距离上一次出库任务的下发时间小于设定的" + SysGloble.MIN_OUTSTORE_RGV_TASK_JIANGE + "秒"; // return false; // } // } // return true; // } // /// // /// 是否 距离上一次出库任务的下发时间小于设定的值 // /// // /// // /// // /// // /// // public bool VaidateIsMIN_OUTSTORE_RGV_TASK_JIANGE22(DbModel edm, Task_Part partTask, ref string errMsg) // { // var q_taskType_组盘入库 = (int)DeviceTaskTypeEnum.组盘入库; // var q_taskType_空托转运到立体库 = (int)DeviceTaskTypeEnum.空托转运到立体库; // var queryTaskState1 = (int)SubTaskStateEnum.已完成; // var queryDeviceId = (int)EDevice.RGV; // var task = edm.Task_Part.Where(x => // x.DeviceId == queryDeviceId // && x.RealToPlace == partTask.RealToPlace // && (x.TaskType == q_taskType_组盘入库 || x.TaskType == q_taskType_空托转运到立体库) // && x.TaskState == queryTaskState1).OrderByDescending(x => x.IssueTime).FirstOrDefault();//获取上一次入库,并且是同一个目标点的任务 // if (task != null) // { // //得到下发时间 // var issueTime = (DateTime)task.IssueTime; // var nowTime = DateTime.Now; // TimeSpan ts = nowTime - issueTime; // if (ts.Seconds <= SysGloble.MIN_OUTSTORE_RGV_TASK_JIANGE) // { // errMsg = "距离上一次组盘入库/空托转运到立体库的任务下发时间小于设定的" + SysGloble.MIN_OUTSTORE_RGV_TASK_JIANGE + "秒"; // return false; // } // } // return true; // } // /// // /// 是否存在 创建时间早于当前的任务的未结束的任务,去1012的任务 // /// // /// // /// // /// // /// // public bool VaidateIsExistNoIssuedTaskBeforeCurrTaskTo1012(DbModel edm, Task_Part partTask, ref string errMsg) // { // var queryDeviceId = (int)EDevice.RGV; // var queryToPlace = ((int)EDevice.出库口1012).ToString(); // if (partTask.RealToPlace == queryToPlace) // { // //判断创建时间早于当前的任务是否下发了,如果没下发,就也不允许下发 // var queryTaskState1 = (int)SubTaskStateEnum.未开始; // var queryTaskState2 = (int)SubTaskStateEnum.已下发; // var list = edm.Task_Part.Where(x => x.RealToPlace == queryToPlace // && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2) // && x.DeviceId == queryDeviceId // // && x.CreateTime < partTask.CreateTime // && x.Id != partTask.Id // && x.MainTaskSequence <= partTask.MainTaskSequence // ).FirstOrDefault(); // if (list != null) // { // errMsg = "存在都是去向1012的任务,创建时间早于当前任务,但是未开始或已下发的任务" + list.PlcTaskId + ",因为要严格控制出库顺序,不允许下发当前任务:" + partTask.PlcTaskId; // return true; // } // } // return false; // } // /// // /// 是否存在 创建时间早于当前的任务的未结束的任务 // /// // /// // /// // /// // /// // public bool VaidateIsExistNoIssuedTaskBeforeCurrTaskToSameInStoreStation(DbModel edm, Task_Part partTask, ref string errMsg) // { // var q_taskType_组盘入库 = (int)DeviceTaskTypeEnum.组盘入库; // var q_taskType_空托转运到立体库 = (int)DeviceTaskTypeEnum.空托转运到立体库; // var queryDeviceId = (int)EDevice.RGV; // //判断创建时间早于当前的任务是否下发了,如果没下发,就也不允许下发 // var queryTaskState1 = (int)SubTaskStateEnum.未开始; // var queryTaskState2 = (int)SubTaskStateEnum.已下发; // var list = edm.Task_Part.Where(x => // x.RealToPlace == partTask.RealToPlace // && (x.TaskType == q_taskType_组盘入库 || x.TaskType == q_taskType_空托转运到立体库) // && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2) // && x.DeviceId == queryDeviceId // && x.CreateTime < partTask.CreateTime).FirstOrDefault(); // if (list != null) // { // errMsg = "存在都是去向相同" + partTask.RealToPlace + "的入库任务,创建时间早于当前任务,但是未开始或已下发的任务" + list.PlcTaskId + ",因为要严格控制入库顺序,不允许下发当前任务:" + partTask.PlcTaskId; // return true; // } // return false; // } // /// // /// 更新主任务的状态 // /// // /// // /// // /// // /// // private void UpdateMainTaskStatus(DbModel edm, int mainTaskId, int rgvTaskTypeValue, string remark) // { // DeviceTaskTypeEnum rgvTaskTypeEnum = (DeviceTaskTypeEnum)Enum.Parse(typeof(DeviceTaskTypeEnum), rgvTaskTypeValue.ToString()); // MainTaskStatusEnum changeTaskStatus = default(MainTaskStatusEnum); // switch (rgvTaskTypeEnum) // { // case DeviceTaskTypeEnum.组盘入库: // changeTaskStatus = MainTaskStatusEnum.入库中; // MainTaskHandler.UpdateTaskStatus(edm, mainTaskId, changeTaskStatus, remark); // break; // case DeviceTaskTypeEnum.出库: // changeTaskStatus = MainTaskStatusEnum.已完成; // MainTaskHandler.UpdateTaskStatus(edm, mainTaskId, changeTaskStatus, remark); // //如果是有计划的,需要处理下计划表的状态 // UpdatePlanOut(edm, mainTaskId); // break; // case DeviceTaskTypeEnum.空托缓存位转运: // case DeviceTaskTypeEnum.空托转运到拆盘机入口: // case DeviceTaskTypeEnum.立库空托到拆盘机入口: // case DeviceTaskTypeEnum.拆盘机入口到拆盘机: // changeTaskStatus = MainTaskStatusEnum.已完成; // MainTaskHandler.UpdateTaskStatus(edm, mainTaskId, changeTaskStatus, remark); // break; // default: // return;//其他状态不予处理 // } // } // private void UpdatePlanOut(DbModel edm, int mainTaskId) // { // var planDetail = edm.Plan_OutTaskDetail.FirstOrDefault(x => x.MainTaskId == mainTaskId); // if (planDetail != null) // { // planDetail.OutTaskDetailState = (int)OutTaskDetailStateEnum.完成; // planDetail.OutTaskDetailStateName = OutTaskDetailStateEnum.完成.ToString(); // planDetail.FinishTime = DateTime.Now;//增加计划子表完成时间 【EditBy shaocx,2022-06-20】 // planDetail.OperationRemark = "RGV任务完成,修改状态为完成"; // //查找Main表 // var outTask = edm.Plan_OutTask.FirstOrDefault(x => x.Id == planDetail.M_PlanId); // if (outTask != null) // { // var queryOutTaskDetailState1 = (int)OutTaskDetailStateEnum.完成; // var queryOutTaskDetailState2 = (int)OutTaskDetailStateEnum.已取消; // var allCount = edm.Plan_OutTaskDetail.Where(x => x.M_PlanId == outTask.Id).Count();//所有计划 // outTask.Qty = allCount;//重新赋值总数量 // var count = edm.Plan_OutTaskDetail.Where(x => x.M_PlanId == outTask.Id && (x.OutTaskDetailState == queryOutTaskDetailState1 || x.OutTaskDetailState == queryOutTaskDetailState2)).Count();//已下发的计划 // var finishedCount = count + 1; // var changeOutPlanStateEnum = default(OutPlanStateEnum); // if (finishedCount >= allCount) // { // changeOutPlanStateEnum = OutPlanStateEnum.全部下发; // outTask.PlanState = (int)changeOutPlanStateEnum; // outTask.PlanStateName = changeOutPlanStateEnum.ToString(); // outTask.OperationRemark = "RGV任务完成,全部下发"; // outTask.Qty_Finish = outTask.Qty; // outTask.Qty_NoFinish = 0; // //修改齐套性为已齐套 [EditBy shaocx,2022-05-16] // outTask.IsPickFinished = true; // //更新计划进度 // outTask.PlanRate = 100; // } // else // { // changeOutPlanStateEnum = OutPlanStateEnum.部分下发; // outTask.PlanState = (int)changeOutPlanStateEnum; // outTask.PlanStateName = changeOutPlanStateEnum.ToString(); // outTask.OperationRemark = "RGV任务完成,部分下发"; // outTask.Qty_Finish = finishedCount; // outTask.Qty_NoFinish = outTask.Qty - finishedCount; // //更新计划进度 // outTask.PlanRate = CSharpHelper.ExecPercentRetInt(finishedCount, allCount); // } // } // } // } // /// // /// 修改CVP的数据 // /// // /// // /// // /// // private void UpdateStore(DbModel dbModel, Base_Station sourcePlace, Base_Station toPlace, DeviceTaskTypeEnum rgvTaskTypeEnum, Task_Part rgvTask) // { // switch (rgvTaskTypeEnum) // { // case DeviceTaskTypeEnum.组盘入库: // default://其他 // TransferStoreWhenFinished(rgvTask, dbModel, rgvTask.SalverId, toPlace, "RGV任务被下发,重新绑定新的CVP关系", rgvTaskTypeEnum, EDeviceType.RGV); // break; // case DeviceTaskTypeEnum.拆盘机入口到拆盘机: // case DeviceTaskTypeEnum.出库://注意:RGV出库的时候,目前是将库存删除掉!!!! // StoreHandler.ClearStockByPlaceId(dbModel, sourcePlace, "RGV出库任务被下发,删除库存"); // //记录主表的出库时间 // var mainTask = dbModel.Task_Main.Where(x => x.TaskNo == rgvTask.MainTaskNo).First(); // mainTask.OutStoreTime = DateTime.Now; // break; // } // } // public bool ValidateDeviceIsAllowSendTask(bool isRgvTask, int int_deviceId, Task_Part task, out string errMsg) // { // errMsg = ""; // if (FormCC.IsSimulationPLC) // { // return true; // } // if (!base.ValidateDeviceIsAllowSendTask(int_deviceId, out errMsg)) // { // return false; // } // bool isNeedValidateRealSourceAndToPlace = true; // if (task.RealSourcePlace == ((int)EDevice.堆垛机1出库口1001).ToString() // || task.RealSourcePlace == ((int)EDevice.堆垛机2出库口1003).ToString() // || task.RealSourcePlace == ((int)EDevice.堆垛机3出库口1005).ToString() // || task.RealSourcePlace == ((int)EDevice.堆垛机4出库口1008).ToString() // ) // {//如果是立体库出库口,则不需要校验起点和终点是否是自动模式啊,运行模式啊 // isNeedValidateRealSourceAndToPlace = false; // } // using (var rgvServie = new RgvService.RgvServiceClient()) // { // SdaResEntity sdaResult = rgvServie.IsAllowSendTask(isNeedValidateRealSourceAndToPlace, int_deviceId, task.RealSourcePlace, task.RealToPlace, isRgvTask); // if (sdaResult.result == false) // { // errMsg = sdaResult.resMsg; // Log4NetHelper.WriteErrorLog(currentLogType, "验证RGV不可以下发新任务,int_deviceId:" + int_deviceId + ",sdaResultStr:" + JsonConvert.SerializeObject(sdaResult)); // } // return sdaResult.result; // } // } // /// // /// 验证Rgv是否可以接受任务 // /// // /// 设备号,不需要 // /// 任务号,需要 // /// // public override bool ValidateDeviceIsOK(int int_deviceId, Task_Part _task, int taskId, out string errMsg) // { // errMsg = ""; // // Rgv没有所谓的空闲状态,有任务直接发即可 // if (Wms_EquipmentSituationHandler.IsEquipmentBreakdown(int_deviceId).result) // {//如果设备已经设定为 故障状态,不允许下发任务!!! [EditBy shaocx,2020-12-07] // return false; // } // return true; // } // /// // /// 验证Rgv是否任务完成 // /// // /// // /// 0表示没有任务完成,其他表示任务完成,并返回任务号 // public override bool ValidateDeviceTaskIsFinsished(int int_deviceId, Task_Part _task, int taskId, bool? isAllowSimulateExecute, out string errMsg) // { // errMsg = ""; // if (FormCC.IsSimulationPLC) // { // return true; // } // if (MyExtendHelper.IsAllowSimulatorHandle(_task)) // {//模拟代码!发布时移除该代码 // errMsg = "任务要求强制模拟完成"; // return true; // } // var isRgvTask = IsRgvTask(_task); // if (isRgvTask == false) // { // //注意:这里不需要跟rgv确认完成,发送任务就自动完成任务了 【EditBy shaocx,2022-04-13】 // return true; // } // else // { // var result = new RgvService.RgvServiceClient().IsTaskFinish(int_deviceId, taskId); // if (result.result) return true; // else // { // errMsg = result.resMsg; // return false; // } // } // } // #endregion // } //}