using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using TouchSocket.Core; using WCS.DAL; using WCS.DAL.Db; using WCS.DAL.DbModels; using WCS.Model; namespace WCS.BLL.HardWare { /// /// 智能货架 /// public class SmartShelf : IShelfBase { public SmartShelf(ShelfInfo shelfInfo) { ShelfId = shelfInfo.Id; ShelfCode = shelfInfo.ShelfCode; RowCounts = shelfInfo.Rowcounts; ColumnCounts = shelfInfo.Columncounts; CurentMode = shelfInfo.CurrentMode; //初始化Module Task.Run(() => { var modules = DbHelp.db.Queryable().Where(t => t.ShelfId == ShelfId).ToList(); foreach (var module in modules) { Modules.Add(new SmartShelfModule() { ModuleId = module.Id, ModuleCode = module.ModuleCode, IsEnable = module.IsEnable, CurrentMode = module.CurentMode }); } ModulesStr = string.Join(";", Modules.Select(t => t.ModuleCode)); }); //初始化TCPCleint TcpCleint = new TCPClient("127.0.0.1:20002", "127.0.0.1:20003"); TcpCleint.Connect(); TcpCleint.tcpClient.Received += (client, e) => { var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray(); e.ByteBlock.Clear(); var len = data.Length; for (int index = 0; index < data.Length - TcpCleint.PreFixLength; index++) { //协议拆包 通过前缀校验是否为完整数据包 var prefixInData = data.Skip(index).Take(TcpCleint.PreFixLength); var isEqual = prefixInData.SequenceEqual(TcpCleint.Prefix); if (isEqual) { var dataTemp = data.Skip(index).Take(TcpCleint.PreFixLength + TcpCleint.DataLength).ToArray(); if (dataTemp.Length < TcpCleint.PreFixLength + TcpCleint.DataLength)//拆包后不满足一条指令的长度 { continue; } index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1 //获取板子ID var boardId = (data[TcpCleint.PreFixLength + 0] << 8) + data[TcpCleint.PreFixLength + 1]; //协议处理 判断功能位 switch (dataTemp[TcpCleint.PreFixLength + 2]) { case 0x01: ; break; default: ; break; } } } return EasyTask.CompletedTask; }; } public int ShelfId { get; set; } public string ShelfCode { get; set; } public int RowCounts { get; set; } public int ColumnCounts { get; set; } public Mode CurentMode { get; set; } public string ModulesStr { get; set; }//当前货架所有模组的Str public string GroupName { get; set; } public List Modules { get; set; } = new List(); public TCPClient TcpCleint { get; set; } public IWarningLightBase WarningLight { get; set; } public List ExceptionMessages { get; set; } = new List(); public string? InstoreIpAddress { get; set; } = string.Empty; public MatInfoResponse InStoreData { get; set; } public string OrderNumber { get; set; } public void GoInInstore(string? IPAddress) { //判断当前模式是否为待机模式 if (this.CurentMode != Mode.待机模式) { return; } else { this.CurentMode = Mode.入库模式; } //货架所有模组发送指令进入入库模式 foreach (var module in Modules.Where(t => t.IsEnable).ToList()) { module.GoInInstoreMode(TcpCleint); } //延时获取异常 var timeOut = 3000; var timeSpan = TimeSpan.FromMilliseconds(0); var beginTime = DateTime.Now; while (timeSpan <= TimeSpan.FromMilliseconds(timeOut)) { timeSpan = DateTime.Now - beginTime; //接收到第一个异常就不继续循环了 if (ExceptionMessages.Count() > 0) { var deficientTime = timeOut - (int)timeSpan.TotalMilliseconds; if (deficientTime > 0) Thread.Sleep(deficientTime); //出现异常的未进入入库模式,有红灯进行指引 //未出现异常的需要退出入库模式 GoOutInstore(); return; } //延时处理 Thread.Sleep(50); } //警示灯亮起 //WarningLight.BlueLight(); //绑定当前入库PDA的IP InstoreIpAddress = IPAddress; //返回成功 return; } public void GoInInstoreReturn() { } public void GoOutInstore() { //看货架是否为入库模式 if (CurentMode != Mode.入库模式) { return; } else { this.CurentMode = Mode.待机模式; } //货架所有模组发送指令退出入库模式 foreach (var module in Modules.Where(t => t.IsEnable) .Where(t => t.CurrentMode == Mode.入库模式) .ToList()) { module.GoOutInstoreMode(TcpCleint); } } public void GoInOutstore() { throw new NotImplementedException(); } public void GoInStocktaking() { this.CurentMode = Mode.盘点模式; } public void GoOutOutstore() { this.CurentMode = Mode.待机模式; } public void GoOutStocktaking() { this.CurentMode = Mode.待机模式; } void IShelfBase.Reset() { throw new NotImplementedException(); } void IShelfBase.SetCurrentMode() { throw new NotImplementedException(); } void IShelfBase.Warning() { throw new NotImplementedException(); } } }