using ServiceCenter.Extensions; using ServiceCenter.Logs; using ServiceCenter.SqlSugars; using System; using System.Collections; 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.WorkEngineering.Extensions; using WCS.WorkEngineering.Protocol.BCR; using WCS.WorkEngineering.Protocol.SRM; using WCS.WorkEngineering.Protocol.Station; using WCS.WorkEngineering.WebApi.Controllers; using WCS.WorkEngineering.Worlds; using static System.Runtime.InteropServices.JavaScript.JSType; using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags; namespace WCS.WorkEngineering.Systems { /// /// 装箱区扫码 /// [BelongTo(typeof(MainWorld))] [Description("装箱区扫码")] public class 装箱区扫码 : DeviceSystem> { protected override bool ParallelDo => true; protected override bool SaveLogsToFile => true; private List devs = new List(); private List srms = new List(); public override void Do(Device obj) { obj.入库站点是否被禁止(); obj.库前入库站点是否满足执行条件(); string bcr = ""; //开始读取条码 bcr = obj.Data5.GetBCRCode(); if (bcr == null) throw new KnownException("未读取到条码", LogLevelEnum.High); World.Log($"扫码记录:设备号{obj.Entity.Code}-" + $"bcr{bcr},521任务号:{obj.Data2.TaskNumber}"); WCS_TaskInfo task = null; SqlSugarHelper.Do(_db => { var db = _db.Default; //找到对应任务 if (obj.Entity.Code == "8050") { var taskInfo = db.Queryable().First(x => (x.AddrFrom == "8050" || x.BusType == "间隔板出库") && x.Status == Entity.TaskStatus.WaitingToExecute); if (taskInfo == null) { return; //向WMS申请入库任务 //var res = WmsApi.I_WCS_GetInTask(bcr, obj.Entity.Code); //return; //throw new KnownException($"未找到条码{bcr}对应WCS任务", LogLevelEnum.High); } if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute) { if (taskInfo.Type == TaskType.Delivery) { taskInfo.AddrNext = "8058"; } else if (taskInfo.Type == TaskType.OutDepot && taskInfo.BusType == "间隔板出库") { taskInfo.AddrNext = taskInfo.AddrTo; } taskInfo.Status = Entity.TaskStatus.ConveyorExecution; taskInfo.EditWho = "WCS"; taskInfo.EditTime = DateTime.Now; db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8050扫码"); //taskInfo.updateRedisHash(); task = taskInfo; } } else { var taskInfo = db.Queryable().First(x => x.ID == obj.Data2.TaskNumber); if (taskInfo == null && obj.Data2.TaskNumber > 0) { obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = 8148; obj.Data.VoucherNo++; throw new KnownException($"未找到对应WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.High); } else if (string.IsNullOrEmpty(taskInfo.BarCode)) { if (db.Queryable().Any(x => x.BarCode == bcr)) { throw new KnownException($"一条托盘码不允许绑定两个任务{obj.Data2.TaskNumber}托盘码{bcr}", LogLevelEnum.High); } taskInfo.EditWho = "WCS"; taskInfo.EditTime = DateTime.Now; taskInfo.BarCode = bcr; if (obj.Data4.Weight == 0) { obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = 8148; obj.Data.VoucherNo++; //taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, "8148", $"称重信息是0,排出到异常口"); throw new KnownException($"任务{obj.Data2.TaskNumber}称重信息是0,排出到异常口,起始地址{obj.Data.GoodsStart}-目标地址{obj.Data.GoodsEnd}", LogLevelEnum.High); } taskInfo.AddrNext = taskInfo.AddrTo; taskInfo.Weight = (float)Math.Round(obj.Data4.Weight, 2); db.Updateable(taskInfo).ExecuteCommand(); WCS_TaskOld taskOld = db.Queryable().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First(); if (taskOld != null) { taskOld.BarCode = taskInfo.BarCode; db.Updateable(taskOld).SplitTable(tas => tas.Take(2)).ExecuteCommand(); } taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058扫码完成"); //taskInfo.updateRedisHash(); task = taskInfo; } else if (taskInfo.BarCode != bcr) { obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = 8148; obj.Data.VoucherNo++; throw new KnownException($"任务{obj.Data2.TaskNumber}绑定的托盘条码与实际扫描条码不一致,排出到异常口,起始地址{obj.Data.GoodsStart}-目标地址{obj.Data.GoodsEnd}", LogLevelEnum.High); } else if (taskInfo.BarCode == bcr) { if (taskInfo.Type == TaskType.Delivery || (taskInfo.Type == TaskType.OutDepot && taskInfo.BusType == "间隔板出库")) { taskInfo.AddrNext = taskInfo.AddrTo; taskInfo.EditWho = "WCS"; taskInfo.EditTime = DateTime.Now; taskInfo.Weight = (float)Math.Round(obj.Data4.Weight, 2); try { WmsApi.WcsUploadInfo(taskInfo.ID, (decimal)taskInfo.Weight, ""); } catch (Exception ex) { throw new KnownException(ex.Message, LogLevelEnum.Mid); } db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058重复扫码完成"); task = taskInfo; } else if (taskInfo.Type == TaskType.OutDepot && taskInfo.BusType == "砝码出库") { var weightBefore = taskInfo.Weight; var weightNow = (decimal)Math.Round(obj.Data4.Weight, 2); //上抛重量信息并记录 try { WmsApi.WcsUploadInfo(taskInfo.ID, weightNow, ""); } catch (Exception ex) { throw new KnownException(ex.Message, LogLevelEnum.Mid); } //把状态变更为入库任务并且需要从库前执行入库,固定分配至5巷道 砝码入库 taskInfo.AddrNext = "8161"; //TODO:目标地址改为库前入库相关路径 taskInfo.EditWho = "WCS"; taskInfo.EditTime = DateTime.Now; taskInfo.Weight = (float)weightNow; taskInfo.Type = TaskType.EnterDepot; taskInfo.Status = Entity.TaskStatus.ConveyorExecution; taskInfo.BusType = "砝码出库"; db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL1(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058重复扫码完成,已称重,前{weightBefore}-后{weightNow}"); task = taskInfo; } else { //taskInfo.AddrNext = string.IsNullOrEmpty(taskInfo.AddrTo) ? "8128" : "8161"; taskInfo.AddrNext = string.IsNullOrEmpty(taskInfo.AddrTo) ? "8128" : "8300"; taskInfo.EditWho = "WCS"; taskInfo.EditTime = DateTime.Now; taskInfo.Weight = (float)Math.Round(obj.Data4.Weight, 2); //上抛重量 try { WmsApi.WcsUploadInfo(taskInfo.ID, (decimal)taskInfo.Weight, taskInfo.BarCode); } catch (Exception ex) { throw new KnownException(ex.Message, LogLevelEnum.Mid); } db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058扫码完成"); //taskInfo.updateRedisHash(); task = taskInfo; } } } }); if (task == null) return; obj.Data.TaskNumber = task.ID; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = task.AddrNext.ToShort(); obj.Data.VoucherNo++; World.Log($"设备号{obj.Entity.Code},任务号{task.ID},起始地址{obj.Data.GoodsStart},目标地址{obj.Data.GoodsEnd}"); } public override bool Select(Device dev) { return dev.Code == "8050" || dev.Code == "8058"; } } }