using ServiceCenter.SqlSugars; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.BCR; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Worlds; using WCS.WorkEngineering.Extensions; using SqlSugar.Extensions; using WCS.WorkEngineering.WebApi.Models.WMS.Response; using WCS.WorkEngineering.WebApi.Models.WCS.Request; using Newtonsoft.Json; using SqlSugar; using ServiceCenter.Logs; namespace WCS.WorkEngineering.Systems { [BelongTo(typeof(RobotBCRWorld))] [Description("码垛抓取扫码")] public class 码垛抓取扫码 : DeviceSystem> { protected override bool ParallelDo => true; public override void Do(Device obj) { if (obj.Data.VoucherNo != obj.Data2.VoucherNo) { World.Log("PLC正在处理"); return; } if (obj.Data2.Request == 0) { World.Log("无请求"); return; } var barcode = obj.Data4.Content.Replace("\r", "").Replace("\0", "").Trim(); //未扫到码或条码与任务不一致去异常口 if (string.IsNullOrEmpty(barcode)) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},{barcode}扫码失败", Time = DateTime.Now })); throw new Exception("扫码失败"); //task.Status = Entity.TaskStatus.Error; //task.EditTime = DateTime.Now; //db.Default.Updateable(task).ExecuteCommand(); //task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, $"码垛抓取扫码异常,条码值:{barcode}"); obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; var num = MainWorld.Redis.HGet($"NotScanNumber{obj.Entity.Code}", DateTime.Now.ToString("yyyyMMdd")); MainWorld.Redis.HSet($"NotScanNumber{obj.Entity.Code}", DateTime.Now.ToString("yyyyMMdd"), (num + 1)); return; } World.Log($"码垛抓取扫码{obj.Entity.Code}交互开始时间:工字轮条码 {barcode} | " + DateTime.Now.ToString("yyyyMMddHHmmss")); var taskid = obj.Data2.TaskNumber; if (taskid == 0) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},521任务号不能为{obj.Data2.TaskNumber}", Time = DateTime.Now })); return; } var addrTo = obj.Entity.GetFlag("码垛工位"); var addrPick = 0; switch (obj.Entity.Code) { case "5126": addrPick = 5135; break; case "5137": addrPick = 5146; break; case "5149": addrPick = 5158; break; case "5160": addrPick = 5169; break; } var arr = Device.All.Where(v => v.HasProtocol()) .Where(v => v.HasFlag("装箱码垛") && v.HasFlag("Parent", addrPick.ToString())) .Select(v => v.Protocol(this.World)).ToArray(); var qty = arr.Where(v => v.TaskNumber > 10000).Count(); if (qty >= 5) { World.Log("抓取位已满"); MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},{qty}抓取位已满", Time = DateTime.Now })); return; } SqlSugarHelper.Do(db => { var task = db.Default.Queryable().Where(v => v.ID == taskid).First(); if (task == null) { World.Log("任务号有误"); MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code}未找到对应的码垛任务信息,请检查521任务号{obj.Data2.TaskNumber}是否正确", Time = DateTime.Now })); obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; World.Log($"码垛抓取扫码{obj.Entity.Code}电控给的任务号和条码不匹配,自动去转圈:工字轮条码 {barcode} | " + obj.Data2.TaskNumber +"|"+ DateTime.Now.ToString("yyyyMMddHHmmss")); var error = new BaseErrorinfoWcs() { ContBarCode = barcode, Message = $"电控给的任务号和条码不匹配,抓取扫码器{obj.Entity.Code},自动去绕圈,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}", Count = 1, Memo = "WCS" }; error.UpdataErrorinfo(); return; } if (task.BarCode != barcode) { var error = new BaseErrorinfoWcs() { ContBarCode = barcode, Message = $"码垛抓取扫码|{obj.Entity.Code},条码{barcode}进入排异,扫出条码{barcode}和521任务号{obj.Data2.TaskNumber}查询出任务的条码{task.BarCode}不匹配,{DateTime.Now:yyyyMMddHH}", Count = 1, Memo = "WCS" }; error.UpdataErrorinfo(); if (task.Status == Entity.TaskStatus.码垛缓存放行) { if (db.Default.Updateable().SetColumns(v => new WCS_TaskInfo() { Status = Entity.TaskStatus.码垛缓存扫码, EditTime = DateTime.Now }).Where(v => v.ID == task.ID).ExecuteCommand() > 0) { task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, $"任务在{obj.Entity.Code},条码{barcode}进入排异,扫出条码{barcode}和521任务号{obj.Data2.TaskNumber}查询出任务的条码{task.BarCode}不匹配"); //obj.Data.TaskNumber = obj.Data2.TaskNumber; //obj.Data.GoodsEnd = (short)addrPick; //obj.Data.VoucherNo++; } else { World.Log($"修改任务状态为码垛抓取扫码失败,任务号:{task.ID},原状态{task.Status}", LogLevelEnum.High); } } obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; return; } //var tasks = db.Default.Queryable().Where(v => v.BarCode == barcode).First(); //if (tasks == null) //{ // MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code}扫出条码{barcode},不存在该条码的任务", Time = DateTime.Now })); // throw new Exception($"扫码器{obj.Entity.Code}扫出条码{barcode},不存在该条码的任务"); //} var pallet = db.Default.Queryable().With(SqlWith.NoLock).Where(v => v.PalletizState == 0 && v.Equip == addrTo).First(); if (pallet == null) { throw new Exception($"扫码器{obj.Entity.Code},未找到对应的码垛信息"); } if (task.PalletizingID != pallet.ID) { throw new Exception($"上一箱正在码垛中!!!"); } if (task.AddrTo == "8090") { if (obj.Entity.Code != "5126") { obj.Data.TaskNumber = int.Parse(obj.Entity.Code); obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; return; //MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},任务目标地址不对", Time = DateTime.Now })); //throw new Exception($"扫码器{obj.Entity.Code},任务目标地址不对"); } } if (task.AddrTo == "8092") { if (obj.Entity.Code != "5137") { obj.Data.TaskNumber = int.Parse(obj.Entity.Code); obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; return; //MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},任务目标地址不对", Time = DateTime.Now })); //throw new Exception($"扫码器{obj.Entity.Code},任务目标地址不对"); } } if (task.AddrTo == "8096") { if (obj.Entity.Code != "5149") { obj.Data.TaskNumber = int.Parse(obj.Entity.Code); obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; return; //MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},任务目标地址不对", Time = DateTime.Now })); //throw new Exception($"扫码器{obj.Entity.Code},任务目标地址不对"); } } if (task.AddrTo == "8098") { if (obj.Entity.Code != "5160") { obj.Data.TaskNumber = int.Parse(obj.Entity.Code); obj.Data.GoodsEnd = 5173; obj.Data.VoucherNo++; return; //MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code},任务目标地址不对", Time = DateTime.Now })); //throw new Exception($"扫码器{obj.Entity.Code},任务目标地址不对"); } } task.Status = Entity.TaskStatus.码垛抓取扫码; task.EditTime = DateTime.Now; try { if (db.Default.Updateable().SetColumns(v => new WCS_TaskInfo() { Status = Entity.TaskStatus.码垛抓取扫码, EditTime = DateTime.Now }).Where(v => v.ID == task.ID).ExecuteCommand() > 0) { task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "码垛抓取扫码"); obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsEnd = (short)addrPick; obj.Data.VoucherNo++; } else { World.Log($"修改任务状态为码垛抓取扫码失败,任务号:{task.ID},原状态{task.Status}", LogLevelEnum.High); } } catch (Exception ex) { throw new Exception($"扫码器{obj.Entity.Code},{ex.Message}"); } }); World.Log($"码垛抓取扫码{obj.Entity.Code}交互结束时间:工字轮条码 {barcode} | " + DateTime.Now.ToString("yyyyMMddHHmmss")); //异常补轮子 //if (obj.Data.GoodsEnd == 5173) // WMS.补料(taskid, obj.Entity.Code); } public override bool Select(Device dev) { return dev.HasFlag("装箱码垛") && dev.HasFlag("位置", "扫码"); } } }