Merge branch '11'

# Conflicts:
#	WCS.BLL/Services/Service/InstoreService.cs
#	WCS.BLL/Services/Service/OutstoreService.cs
This commit is contained in:
hehaibing-1996
2024-05-28 08:59:32 +08:00
132 changed files with 5024 additions and 541 deletions

View File

@ -274,7 +274,7 @@ namespace WCS.BLL.Tool
public static T GetDataFromHttp<T>(string url, object dataObj, string httpMethod, bool isSaveLog = false)
{
Guid guid = Guid.NewGuid();
var data = JsonConvert.SerializeObject(dataObj);
var data = dataObj == null ? string.Empty : JsonConvert.SerializeObject(dataObj);
try
{
if (isSaveLog)

View File

@ -22,18 +22,21 @@ namespace WCS.BLL
/// </summary>
Info,
/// <summary>
/// 警告
/// 启动信息
/// </summary>
Warning,
StartBoot,
/// <summary>
/// 错误
/// 调用外部Api的接口
/// </summary>
Err,
Api,
/// <summary>
/// 数据库错误
/// 指令发送接收
/// </summary>
DbErr,
Api
Instructions,
/// <summary>
/// 指令重发
/// </summary>
InstructionResend
}
/// <summary>
@ -115,16 +118,6 @@ namespace WCS.BLL
Write($"{contentTitle} {JsonConvert.SerializeObject(content)}", type);
}
/// <summary>
/// 写入日志
/// </summary>
/// <param name="ex">错误</param>
/// <returns>是否写入成功</returns>
public static void Write(Exception ex, LogsType type = LogsType.Err)
{
Write(ex.ToString(), type);
}
/// <summary>
/// 清除日志
/// </summary>

View File

@ -79,36 +79,38 @@ namespace WCS.BLL
tcpClient.Received += (client, e) =>
{
var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray();
Logs.Write($"校验发送接收,收到数据" + BitConverter.ToString(data));
var len = data.Length;
for (int index = 0; index < data.Length - PreFixLength; index++)
Task.Run(() =>
{
//协议拆包 通过前缀校验是否为完整数据包
var prefixInData = data.Skip(index).Take(PreFixLength);
var isEqual = prefixInData.SequenceEqual(Prefix);
if (isEqual)
Logs.Write($"【校验发送接收 开始】" + BitConverter.ToString(data), LogsType.InstructionResend);
var len = data.Length;
for (int index = 0; index < data.Length - PreFixLength; index++)
{
var dataTemp = data.Skip(index).Take(PreFixLength + DataLength).ToArray();
if (dataTemp.Length < PreFixLength + DataLength)//拆包后不满足一条指令的长度
//协议拆包 通过前缀校验是否为完整数据包
var prefixInData = data.Skip(index).Take(PreFixLength);
var isEqual = prefixInData.SequenceEqual(Prefix);
if (isEqual)
{
continue;
var dataTemp = data.Skip(index).Take(PreFixLength + DataLength).ToArray();
if (dataTemp.Length < PreFixLength + DataLength)//拆包后不满足一条指令的长度
{
continue;
}
//获取返回指令的板子ID
var boardId = (dataTemp[PreFixLength + 0] << 8) + dataTemp[PreFixLength + 1];
//查询当前板子是否有待验证的指令
var message = new MessageDto();
MessageList.TryGetValue(boardId, out message);
//功能位校验 功能位相同视为已响应指令 删除对应的指令
if (message?.Message[PreFixLength + 2] == dataTemp[PreFixLength + 2])
{
MessageList.TryRemove(boardId, out message);
}
index += (PreFixLength + DataLength - 2);//每次循环index会+1 所以这里-1
}
//获取返回指令的板子ID
var boardId = (data[PreFixLength + 0] << 8) + data[PreFixLength + 1];
//查询当前板子是否有待验证的指令
var message = new MessageDto();
MessageList.TryGetValue(boardId, out message);
//功能位校验 功能位相同视为已响应指令 删除对应的指令
if (message?.Message[PreFixLength + 2] == dataTemp[PreFixLength + 2])
{
MessageList.TryRemove(boardId, out message);
}
index += (PreFixLength + DataLength - 1);//每次循环index会+1 所以这里-1
}
}
Logs.Write($"校验发送接收处理完毕" + BitConverter.ToString(data));
Logs.Write($"【校验发送接收 结束】" + BitConverter.ToString(data), LogsType.InstructionResend);
});
return null;
};
tcpClient.Connected += (client, e) =>
@ -131,27 +133,25 @@ namespace WCS.BLL
try
{
//TODO如果指令已发两次 则取消重发
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
await Task.Delay(100);
if (MessageList.Count > 0)
{
var failedMessage = MessageList.Where(t => t.Value.SendTimes >= 2).ToList();
var failedMessage = MessageList.Where(t => t.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
.ToList();
foreach (var message in failedMessage)
{
Logs.Write(BitConverter.ToString(message.Value.Message) +
"指令未响应");
Logs.Write("【指令重发】" + BitConverter.ToString(message.Value.Message) + "指令超时1s未响应", LogsType.InstructionResend);
}
MessageList.RemoveWhen(t => t.Value.SendTimes >= 3);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
MessageList.RemoveWhen(t => t.Value.SendTimes >= 2);
foreach (var item in MessageList)
{
if (item.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
{
tcpClient.Send(item.Value.Message);
Send(item.Value.Message);
item.Value.SendTimes++;
item.Value.LastSendTime = DateTime.Now;
await Task.Delay(10);
Logs.Write("【指令重发】" + BitConverter.ToString(item.Value.Message) + "已进行重发", LogsType.InstructionResend);
}
}
}
@ -173,18 +173,30 @@ namespace WCS.BLL
}
public void Send(byte[] message)
public void Send(byte[] message, bool IsReSend = false)
{
try
{
var boardId = (message[3] << 8) + message[4];
if (boardId != 2047 && IsReSend == false)
{
MessageList.TryAdd(boardId, new MessageDto()
{
ID = boardId,
Message = message,
SendTimes = 1
});
}
lock (sendLockObject)
{
tcpClient.Send(message);
//TODO MessageList.AddOrUpdate(new Mes)
//发送自带10ms间隔
Thread.Sleep(10);
//发送自带8ms间隔
Thread.Sleep(8);
}
}
catch (Exception ex)
{
@ -226,18 +238,14 @@ namespace WCS.BLL
public class MessageDto
{
public int ID { get; set; }
/// <summary>
/// 最后一次发送时间
/// </summary>
public DateTime LastSendTime { get; set; } = DateTime.Now;
/// <summary>
/// 发送内容
/// </summary>
public byte[] Message { get; set; }
public bool IsWating { get; set; }
/// <summary>
/// 发送次数
/// </summary>