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.Config;
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 string ExtractUntilSecondDashCorrect(string input)
{
int firstDashIndex = input.IndexOf('-');
if (firstDashIndex == -1)
{
return string.Empty; // 如果没有找到第一个'-',则返回空字符串
}
int secondDashIndex = input.IndexOf('-', firstDashIndex + 1);
if (secondDashIndex == -1)
{
return input;
}
else
{
return input.Substring(0, secondDashIndex);
}
}
///
/// 单灯 一个库位对应一个硬件
///
///
///
public async Task> SingleLightControl(SingleLightControlRequest request)
{
try
{
//传入数据校验
if (request.StoreCodes == null || request.StoreCodes.Count == 0)
{
return new ResponseCommon()
{
Code = 201,
Message = "操作失败:没有需要控制的库位",
};
}
//瓦斯分院库位数与灯不匹配所以进行如下操作
//处理传入的库位
if(!LocalFile.Config.IsZuantan)
{
for (int i = 0; i < request.StoreCodes.Count; i++)
{
request.StoreCodes[i] = ExtractUntilSecondDashCorrect(request.StoreCodes[i]);
}
}
//库位编码去重
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();
//报警灯
if (shelf.LightId > 0)
{
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,
LightNumber = t.SingleLightNumber,
}).ToList();
shelfModels.Add(shelfModel);
}
//合并:同一个TCP的货架合并 报警灯和库位灯统一只发送一条指令
var clients = shelfs.Select(t => new
{
ClientIp = t.ClientIp,
IsService = t.IsService,
})
.Distinct()
.ToList();
foreach (var client in clients)
{
var shelfModelsInOneIp = shelfModels.Where(t => t.ClientIp == client.ClientIp).ToList();
var sendData = Helper.SingleLightControl(shelfModelsInOneIp);
if (client.IsService)
{
TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(client.ClientIp);
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData);
Logs.Write("【单灯单独控制】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【单灯单独控制】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【单灯单独控制】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
}
}
else
{
var tcpClient = TCPClientManager.Service.GetClients().Where(t => t.IP + ":" + t.Port.ToString() == client.ClientIp).FirstOrDefault();
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData, 0, sendData.Length);
Logs.Write("【单灯单独控制】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【单灯单独控制】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
return new ResponseCommon()
{
Code = 201,
Message = $"【单灯单独控制】{client}指令发送中遇到异常{ex.Message}",
};
}
}
else
{
Logs.Write($"【单灯单独控制】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
return new ResponseCommon()
{
Code = 201,
Message = $"【单灯单独控制】{client}未连接,以下指令未能成功发送",
};
}
}
}
//更新数据库灯的状态
stores.ForEach(t =>
{
t.LightMode = request.LightMode;
t.ColorMode = request.ColorMode;
});
DbHelp.db.Updateable(stores)
.UpdateColumns(t => new { t.LightMode, t.ColorMode })
.ExecuteCommand();
//返回成功
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 clients = shelfs.Select(t => new
{
ClientIp = t.ClientIp,
IsService = t.IsService,
})
.Distinct()
.ToList();
//挨个发关灯指令
foreach (var client in clients)
{
//生成关灯指令
var sendData = Helper.SingleLightTrunOffAllLight();
if (client.IsService)
{
TCPClient tcpClient = TCPClientManager.GetTCPClientByIPHost(client.ClientIp);
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData);
Logs.Write("【熄灯】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【熄灯】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【熄灯】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
}
}
else
{
var tcpClient = TCPClientManager.Service.GetClients().Where(t => t.IP + ":" + t.Port.ToString() == client.ClientIp).FirstOrDefault();
if (tcpClient != null)
{
try
{
tcpClient.Send(sendData, 0, sendData.Length);
Logs.Write("【熄灯】发送指令" + BitConverter.ToString(sendData));
}
catch (Exception ex)
{
Logs.Write($"【熄灯】{client}以下指令发送中遇到异常{ex.Message}" + BitConverter.ToString(sendData));
}
}
else
{
Logs.Write($"【熄灯】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
return new ResponseCommon()
{
Code = 201,
Message = $"【熄灯】{client}未连接,以下指令未能成功发送",
};
}
}
}
//更新灯状态为熄灭
//var stores = DbHelp.db.Queryable().Where(t => t.Area == request.Area).ToList();
stores.ForEach(t =>
{
t.ColorMode = 0;
t.LightMode = 0;
});
DbHelp.db.Updateable(stores)
.UpdateColumns(t => new { t.LightMode, t.ColorMode })
.ExecuteCommand();
//返回成功
return new ResponseCommon()
{
Code = 200,
Message = "success",
};
}
catch (Exception ex)
{
//操作失败
return new ResponseCommon()
{
Code = 300,
Message = $"操作失败:{ex.Message}",
};
}
}
}
}