using Admin.NET.Application; using iWareCC.Common.Helper; using iWareCC.StationService; using iWareCommon.Common.Globle; using iWareCommon.Utils; using iWareModel; using iWareModel.Entity.MES; using iWareModel.EnumType.WMS; using iWareSql.DataAccess; using iWareSql.WmsDBModel; using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace iWareCC.ThreadService._04_BZ21_搬运整垛机器人_ { public class DataProcess_BZ21 { public static async void Hander() { var alertMsg = ""; LogType logType = LogType.DataProcess_BZ21; while (true) { Thread.Sleep(2000);//休眠2秒,将休眠写到前面,是为了下面的continue方法执行后不显示错误信息的提示!!!【EditBy shaocx,2022-05-24】 SystemWarningMsg._lbl_alert_DataProcess_BZ21 = string.Empty; try { if (SystemValue.isStartedModel) { var rgvLocation = StationLocationEnum.BZ21.ToString(); /* * 1、从数据库中判断是否齐套 * 2、根据齐套结果,推送给PLC */ if (FormCC.stationView == null) { SystemWarningMsg._lbl_Alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-获取PLC对象为null"; continue; } var obj = FormCC.stationView.R_StationForReadCommList.Where(x => x.StationCode == rgvLocation.ToString()).FirstOrDefault(); if (obj.R_PalletizingAck) { //给PLC推送任务完接收完成复位信号 using (StationServiceClient client = new StationServiceClient()) { var res = client.WriteStation_ACK((int)EDevice.Station, false, rgvLocation); if (!res.result) { SystemWarningMsg._lbl_Alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-下发码板任务 失败,SetPalletizingTaskFinishAck 返回:{res.resMsg}"; continue; } else { Log4NetHelper.WriteInfoLog(logType, $"{rgvLocation.ToString()}-下发入库任务 成功,SetPalletizingTaskFinishAck,参数: 站点{rgvLocation}"); } } } if (obj.R_ReqParseData) { var result = obj.R_ReadCodeResult; if (string.IsNullOrEmpty(result)) { SystemWarningMsg._lbl_alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-请求了解码,但是结果是空的,此次循环结束"; continue; } //short cartonwidth = 0;//纸箱宽 //short cartonhigh = 0;//纸箱高 string place = "22"; using (WmsDBModel wmsDB = new WmsDBModel()) { //要是有已下发的任务,就不要执行 var isValidate = TaskHandler.ValidateIssueTaskForNoFinishTaskByUpi(wmsDB, result); if (!isValidate) { SystemWarningMsg._lbl_alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-有‘已下发’的任务,不能处理,此次循环结束"; continue; } //增加校验,如果上一个任务upi跟本次upi一致,就报错 【Editby shaocx,2024-12-03】 var lastTask = wmsDB.wms_rbline_task.Where(x => x.RbTaskType == (int)RbTaskTypeEnum.合包任务).OrderByDescending(x => x.Id).FirstOrDefault(); if (lastTask != null && lastTask.Upi == result) { SystemWarningMsg._lbl_alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-PLC重发此任务,upi:{result},系统不能重复处理,此次循环结束"; continue; } var upiObj = wmsDB.mes_batchOrderUPI_new.Where(x => x.UPI == result).FirstOrDefault(); if (upiObj == null) { //写入报警信息 await MyExtendHelper.WriteBoolPlcDataForWarning(PlcWarningAddressGloble.Num_BZ21_1); SystemWarningMsg._lbl_alert_DataProcess_BZ21 = $"{rgvLocation.ToString()},根据UPI:{result}没有找到对象 "; continue; } var package = wmsDB.mes_package_gather.Where(x => x.PackageCode == upiObj.PackageCode).FirstOrDefault(); if (package == null) { SystemWarningMsg._lbl_alert_DataProcess_BZ21 = $"{rgvLocation.ToString()},根据包号:{upiObj.PackageCode}没有找到对象 "; continue; } //验证是否允许切纸 var validteReslt = ValidateIsAllowCut(); if (validteReslt == false) { //写入报警信息 await MyExtendHelper.WriteBoolPlcDataForWarning(PlcWarningAddressGloble.Num_BZ21_2); continue; } //string upi = "LS070700101B0001GS"; //调用出纸机接口 var papercut = ClassHelper.RotationMapping(package); papercut.Id = Yitter.IdGenerator.YitIdHelper.NextId(); papercut.ApiMessage = ""; papercut.PushNum = 0; papercut.PushStatus = (int)PushStatusEnum.NotPush; papercut.CreateUserName = papercut.UpdateUserName = SysGloble.WCSSystem; papercut.CreateTime = papercut.UpdateTime = DateTime.Now; wmsDB.mes_push_papercut.Add(papercut); AreaCodeEnum setAreaCode = AreaCodeEnum.合包裁切区; UpiStatusEnum setUpiStatus = UpiStatusEnum.已合包; var ngFlag = false; var queryFlag = (int)UpiFlagEnum.NG; var upilist = wmsDB.mes_batchOrderUPI_new.Where(x => x.PackageCode == upiObj.PackageCode).ToList(); var ngCount = upilist.Count(x => x.UpiFlag == queryFlag); if (ngCount > 0) { ngFlag = true; setUpiStatus = UpiStatusEnum.已下线; setAreaCode = AreaCodeEnum.下线区域; } else {//不是NG //新增mes推送表 var putpakegecodeid = Yitter.IdGenerator.YitIdHelper.NextId(); var putpakegecode = new mes_push_packagecode() { Id = putpakegecodeid, PackageCode = upiObj.PackageCode, PushStatus = 0, PushNum = 0, ApiMessage = "", CreateTime = DateTime.Now, CreateUserName = SysGloble.WCSSystem, UpdateTime = DateTime.Now, UpdateUserName = SysGloble.WCSSystem }; wmsDB.mes_push_packagecode.Add(putpakegecode); //新增表 var mesinequeue = ClassHelper.RotationMapping(package); mesinequeue.Id = Yitter.IdGenerator.YitIdHelper.NextId(); mesinequeue.CreateTime = mesinequeue.UpdateTime = DateTime.Now; wmsDB.mes_package_linequeue.Add(mesinequeue); } //更新表 var mesgather = wmsDB.mes_package_gather.Where(x => x.PackageCode == upiObj.PackageCode).FirstOrDefault(); if (mesgather != null) { mesgather.AreaCode = (int)setAreaCode; mesgather.UpiStatus = (int)setUpiStatus; } upiObj.UpiStatus = (int)setUpiStatus; upiObj.AreaCode = (int)setAreaCode; //记录任务 var _id = Yitter.IdGenerator.YitIdHelper.NextId(); var plcTaskNo = BusinessHelper.CreatePlcTaskId(); plcTaskNo = MyExtendHelper.GetNewTaskNo(wmsDB, RbTaskTypeEnum.合包任务, plcTaskNo); //新增任务表 var task = new wms_rbline_task() { Id = _id, TaskNo = plcTaskNo, Upi = upiObj.UPI, Length = upiObj.Length, Width = upiObj.Width, Thk = upiObj.Thk, IssueTime = DateTime.Now, PlanNo = upiObj.PlanNo, OrderId = upiObj.OrderId, PackageCode = upiObj.PackageCode, RbTaskType = (int)RbTaskTypeEnum.合包任务, TaskStatus = (int)TaskStatusEnum.新建, TaskMsg = "夹板", CreateTime = DateTime.Now, CreateUserName = SysGloble.WCSSystem, UpdateTime = DateTime.Now, UpdateUserName = SysGloble.WCSSystem, PlaceCode = place }; //新增打印表 var printid = Yitter.IdGenerator.YitIdHelper.NextId(); var print = ClassHelper.RotationMapping(package); print.Id = printid; print.PrintType = (int)PrintTypeEnum.包装条码; print.PrintSource = (int)PrintSourceEnum.包装条码打印; print.PrintSheetNum = 1; print.PrintNum = 0; print.PrintStatus = (int)PrintStatuEnum.未打印; print.IsAllowPrint = true; print.CreateTime = print.UpdateTime = DateTime.Now; wmsDB.wms_record_print.Add(print); //var printtwo = ClassHelper.RotationMapping(upiObj); //printtwo.PrintType = (int)PrintTypeEnum.包装条码; //printtwo.PrintSource = (int)PrintSourceEnum.包装条码打印; //printtwo.PrintSheetNum = 1; //printtwo.PrintNum = 0; //printtwo.PrintStatus = (int)PrintStatuEnum.未打印; //printtwo.IsAllowPrint = true; //printtwo.CreateTime = print.UpdateTime = DateTime.Now; //printtwo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); //wmsDB.wms_record_print.Add(printtwo); wmsDB.wms_rbline_task.Add(task); //处理表 mes_order_gather var errmsg = ""; var resultAlert = MyExtendHelper.HandlerOrderGather(wmsDB, package, "", "", out errmsg); if (resultAlert == false) { SystemWarningMsg._lbl_alert_DataProcess_BZ21 = errmsg; continue; } WmsRecordUpiProcessHandler.SaveWmsRecordUpiProcess(wmsDB, upiObj, "BZ21", "合包"); WmsRecordUpiProcessHandler.SaveWmsRecordPackageProcess(wmsDB, package, "BZ21", "合包"); wmsDB.SaveChanges(); } } else { SystemWarningMsg._lbl_Alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-没有要处理的数据"; } } } catch (Exception ex) { SystemWarningMsg._lbl_alert_DataProcess_BZ21 += " 出现异常:" + ex.Message + SysGloble.SPLIT_STR; Log4NetHelper.WriteErrorLog(logType, " 出现异常:" + ex.Message, ex); } } } /// /// 验证是否允许切纸 /// /// public static bool ValidateIsAllowCut() { var rgvLocation = StationLocationEnum.BZ3007.ToString(); if (FormCC.stationView == null) { SystemWarningMsg._lbl_Alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-获取PLC对象为null"; return false; } var obj = FormCC.stationView.R_StationForReadCommList.Where(x => x.StationCode == rgvLocation.ToString()).FirstOrDefault(); if (obj != null) { if (obj.R_AllowCut) { return true; } else { SystemWarningMsg._lbl_Alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-PLC不允许切纸"; return false; } } else { SystemWarningMsg._lbl_Alert_DataProcess_BZ21 = $"{rgvLocation.ToString()}-获取PLC对象为null"; return false; } } } }