using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using TouchSocket.Core; using WCS.BLL.Manager; using WCS.BLL.Services.IService; using WCS.BLL.Tool; using WCS.DAL; using WCS.DAL.Db; using WCS.DAL.Db.AuthDb; using WCS.DAL.DbModels; using WCS.Model; using WCS.Model.ApiModel; using WCS.Model.ApiModel.SingleLight; using WCS.Model.ApiModel.User; using WCS.Model.WebSocketModel; using static System.Formats.Asn1.AsnWriter; using static WCS.BLL.Tool.Helper; namespace WCS.BLL.Services.Service { public class SingleLightService : ISingleLightService { /// /// 单灯 一个库位对应一个硬件 /// /// /// public async Task> SingleLightControl(SingleLightControlRequest request) { try { //传入数据校验 if (request.StoreCodes == null || request.StoreCodes.Count == 0) { return new ResponseCommon() { Code = 201, Message = "操作失败:没有需要控制的库位", }; } //库位编码去重 var storeCodes = request.StoreCodes.Distinct() .ToList(); var stores = DbHelp.db.Queryable() .Where(t => storeCodes.Contains(t.StoreCode)) .ToList(); if (stores == null || stores.Count == 0) { return new ResponseCommon { Code = 201, Message = $"操作失败:所有库位不存在!" }; } //对应货架(获取TCP和报警灯ID) var shelfIds = stores.Select(t => t.ShelfId).Distinct().ToList(); var shelfs = DbHelp.db.Queryable().Where(t => shelfIds.Contains(t.Id)) .ToList(); //对应模组信息 var moduleIds = stores.Select(t => t.ModuleId).Distinct().ToList(); var modules = DbHelp.db.Queryable().Where(t => moduleIds.Contains(t.Id)) .ToList(); //合并:同一个货架的库位合并 var shelfModels = new List(); foreach (var shelf in shelfs) { var shelfModel = new SingleLightShelfModel(); //报警灯 shelfModel.WarningLightMode = request.LightMode; shelfModel.WarningLightColor = request.ColorMode; shelfModel.WarningBoardId = shelf.LightId; shelfModel.ClientIp = shelf.ClientIp; shelfModel.StoreList = stores.Where(t => t.ShelfId == shelf.Id) .Select(t => new SingleLightStoreModel() { BoardId = t.BoardId, LightMode = request.LightMode, LightColor = request.ColorMode, }).ToList(); shelfModels.Add(shelfModel); } //合并:同一个TCP的货架合并 报警灯和库位灯统一只发送一条指令 var clientIpList = shelfs.Select(t => t.ClientIp) .Distinct() .ToList(); foreach (var clientIp in clientIpList) { var shelfModelsInOneIp = shelfModels.Where(t => t.ClientIp == clientIp).ToList(); var sendData = Helper.SingleLightControl(shelfModelsInOneIp); TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(clientIp); if (tcpClient != null) { try { tcpClient.Send(sendData); Logs.Write("【单灯单独控制】发送指令" + BitConverter.ToString(sendData)); } catch (Exception ex) { Logs.Write($"【单灯单独控制】{clientIp}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData)); } } else { Logs.Write($"【单灯单独控制】{clientIp}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData)); } } //返回成功 return new ResponseCommon() { Code = 200, Message = "success", }; } catch (Exception ex) { //操作失败 return new ResponseCommon() { Code = 300, Message = $"操作失败:{ex.Message}", }; } } public async Task> TurnoffLightByArea(TurnoffLightByAreaRequest request) { try { //传入数据校验 if (string.IsNullOrEmpty(request.Area)) { return new ResponseCommon() { Code = 201, Message = "操作失败:参数传入错误!Area为空!", }; } //库位 var stores = DbHelp.db.Queryable() .Where(t => t.Area == request.Area) .ToList(); if (stores == null || stores.Count == 0) { return new ResponseCommon { Code = 201, Message = $"操作失败:所选区域不存在库位!" }; } //对应货架(获取TCP和报警灯ID) var shelfIds = stores.Select(t => t.ShelfId).Distinct().ToList(); var shelfs = DbHelp.db.Queryable().Where(t => shelfIds.Contains(t.Id)) .ToList(); //获取对应货架所有IP var clientIPs = shelfs.Select(t => t.ClientIp) .Distinct() .ToList(); //挨个发关灯指令 foreach (var clientIP in clientIPs) { //生成关灯指令 var sendData = Helper.SingleLightTrunOffAllLight(); TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(clientIP); if (tcpClient != null) { try { tcpClient.Send(sendData); Logs.Write("【单灯单独控制】发送指令" + BitConverter.ToString(sendData)); } catch (Exception ex) { Logs.Write($"【单灯单独控制】{clientIP}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData)); } } else { Logs.Write($"【单灯单独控制】{clientIP}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData)); } } //返回成功 return new ResponseCommon() { Code = 200, Message = "success", }; } catch (Exception ex) { //操作失败 return new ResponseCommon() { Code = 300, Message = $"操作失败:{ex.Message}", }; } } } }