Files
wcs/WCS.BLL/HardWare/SingleLightShelf.cs
2025-04-15 13:38:20 +08:00

487 lines
21 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TouchSocket.Sockets;
using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.DbModels.Task;
using WCS.BLL.Manager;
using WCS.BLL.Tool;
using WCS.DAL.Db;
using WCS.DAL.DbModels;
using WCS.Model;
using WCS.Model.ApiModel.MKYBackgroundThread;
using WCS.Model.ApiModel.SingleLight;
using static WCS.BLL.HardWare.WarningLight;
using static WCS.BLL.Tool.Helper;
namespace WCS.BLL.HardWare
{
public class SingleLightShelf : IShelfBase
{
public SingleLightShelf(ShelfInfo shelfInfo)
{
ShelfId = shelfInfo.Id;
ShelfCode = shelfInfo.ShelfCode;
RowCounts = shelfInfo.Rowcounts;
ColumnCounts = shelfInfo.Columncounts;
SetCurrentMode(TaskModeEnum.);
ClientIp = shelfInfo.ClientIp;
LightId = shelfInfo.LightId;
IsService = shelfInfo.IsService;
ClientIp = shelfInfo.ClientIp;
if (ClientIp.Contains("127"))
{
;
}
ShelfTypeName = shelfInfo.ShelfTypeName;
//初始化Module
Logs.Write($"[初始化单灯货架]初始化模组{ShelfCode}");
var task = Task.Run(() =>
{
var modules = DbHelp.db.Queryable<ModuleInfo>().Where(t => t.ShelfId == ShelfId).ToList();
foreach (var module in modules)
{
MXL4Modules.Add(new MXL4ShelfModule()
{
ModuleId = module.Id,
ModuleCode = module.ModuleCode,
BoardId = module.BoardId,
IsEnable = module.IsEnable,
CurrentMode = TaskModeEnum.,
IsNeedRefresh = false,
});
}
ModulesStr = string.Join(";", MXL4Modules.Select(t => t.ModuleCode));
ModuleIds = MXL4Modules.Select(t => t.BoardId).ToList();
});
Logs.Write($"[初始化单灯货架]初始化单灯线程{ShelfCode}");
//初始化单灯线程
//一个货架存在一个线程去刷新数据
Task.Run(async () =>
{
//等待模组加载完毕再开始发送数据进行刷新
Task.WaitAll(task);
while (true)
{
try
{
await Task.Delay(200);
//未完成首次连接时 暂不发送
if (IsService)
{
if (TcpCleint == null)
{
await Task.Delay(2000);
continue;
}
if (TcpCleint.IsFirstConnected == false)
{
await Task.Delay(2000);
continue;
}
}
else
{
if (ClientIp.Contains("127"))
{
;
}
var tcpClient = TCPClientManager.Service.GetClients().Where(t => t.IP + ":" + t.Port.ToString() == ClientIp).FirstOrDefault();
if (tcpClient == null)
{
await Task.Delay(2000);
continue;
}
}
//查询属于本货架的任务
var currentShelfTasks = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ShelfId == this.ShelfId)
.Where(t => t.IsSended == false || t.IsCancel == true)
.OrderBy(t => t.CreateTime)
.ToList();
//获取因为任务需要刷新的module
var haveTaskModules = currentShelfTasks.Where(t => t.IsCancel == true || t.IsSended == false)
.Select(t => t.ModuleId)
.Distinct()
.ToList();
MXL4Modules.ForEach(t =>
{
if (haveTaskModules.Contains(t.ModuleId))
{
t.IsNeedRefresh = true;
}
});
//查询是否有需要刷新的
var needRefreshModules = MXL4Modules.Where(t => t.IsNeedRefresh)
.ToList();
foreach (var module in needRefreshModules)
{
Logs.Write($"[初始化单灯货架]存在需要刷新的{ShelfCode}");
try
{
//查询当前是否有任务
var currentTasks = currentShelfTasks.Where(t => t.ModuleId == module.ModuleId)
.OrderBy(t => t.CreateTime)
.ToList();
#region
var cancelTasks = currentTasks.Where(t => t.IsCancel == true)
.ToList();
if (cancelTasks != null && cancelTasks.Count > 0)
{
Logs.Write($"[单灯后台刷新线程]当前有任务需要取消!");
//获取该库位还有无任务
var currentModuleTask = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ShelfId == this.ShelfId)
.Where(t => t.ModuleId == module.ModuleId)
.Where(t => t.IsSended == true && t.IsCancel == false)
.ToList();
//当前库位无任务 关闭库位灯
if (!currentModuleTask.Any())
{
Logs.Write($"[单灯后台刷新线程]当前库位{module.ModuleCode},无任务,关闭库位灯!");
var storeCodes = new List<string>();
storeCodes.Add(module.ModuleCode);
var shelfModel = new SingleLightShelfModel();
//先不操作报警灯
shelfModel.WarningLightMode = -1;
shelfModel.WarningLightColor = 0;
shelfModel.WarningBoardId = 0;
shelfModel.ClientIp = ClientIp;
shelfModel.StoreList = new List<SingleLightStoreModel>();
shelfModel.StoreList.Add(new SingleLightStoreModel()
{
BoardId = module.BoardId,
LightColor = 0,
LightMode = 0,
});
var response = SingleLightControl(shelfModel, storeCodes);
if (response != null && response.Code == 200)
{
//删除取消的这个任务
DbHelp.db.Deleteable(cancelTasks).ExecuteCommand();
//删除被取消的任务
await Task.Delay(20);
module.IsNeedRefresh = false;
}
}
else
{
Logs.Write($"[单灯后台刷新线程]当前库位{module.ModuleCode},还存在任务,不关闭库位灯!");
module.IsNeedRefresh = false;
continue;
}
}
#endregion
}
catch (Exception ex)
{
Logs.Write($"【后台发送线程】遇到异常{ex.Message},{ex.StackTrace}");
}
}
//刷新报警灯
if (needRefreshModules != null && needRefreshModules.Count > 0)
{
var currentTasks = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ShelfId == this.ShelfId)
.ToList();
if (currentTasks != null && currentTasks.Count > 0)
{
var firstCurrentTask = currentTasks[0];
//开报警灯 开大灯
var moduleCodes = currentTasks.Select(t => t.ModuleCode)
.Distinct()
.ToList();
var shelfModel = new SingleLightShelfModel();
//报警灯长亮
shelfModel.WarningLightMode = 1;
shelfModel.WarningLightColor = (int)firstCurrentTask.ButtonColor;
shelfModel.WarningBoardId = shelfInfo.LightId;
shelfModel.ClientIp = ClientIp;
shelfModel.StoreList = new List<SingleLightStoreModel>();
currentTasks.ForEach(task =>
{
var module = MXL4Modules.Where(t => t.ModuleCode == task.ModuleCode).First();
if (module != null)
{
shelfModel.StoreList.Add(new SingleLightStoreModel()
{
BoardId = module.BoardId,
LightColor = (int)task.ButtonColor,
LightMode = 1,
});
}
});
var response = SingleLightControl(shelfModel, moduleCodes);
//亮了灯的更新为已发送
if (response != null && response.Code == 200)
{
Logs.Write($"[单灯后台刷新线程]当前灯继续亮!");
MXL4Modules.ForEach(t => t.IsNeedRefresh = false);
currentTasks.ForEach(t => t.IsSended = true);
DbHelp.db.Updateable(currentTasks).UpdateColumns(ct => new { ct.IsSended }).ExecuteCommand();
}
}
else
{
//关报警灯 小灯也全关
var shelfModel = new SingleLightShelfModel();
//报警灯关闭
shelfModel.WarningLightMode = 0;
shelfModel.WarningLightColor = 0;
shelfModel.WarningBoardId = shelfInfo.LightId;
shelfModel.ClientIp = ClientIp;
shelfModel.StoreList = new List<SingleLightStoreModel>();
var response = SingleLightControl(shelfModel, new List<string>());
if (response != null && response.Code == 200)
{
Logs.Write($"[单灯后台刷新线程]当前灯不继续亮!");
MXL4Modules.ForEach(t => t.IsNeedRefresh = false);
}
}
}
}
catch (Exception ex)
{
Logs.Write($"【后台发送线程】遇到异常{ex.Message},{ex.StackTrace}");
}
await Task.Delay(1500);
}
});
}
public bool IsService { get; set; }
public string ShelfTypeName { get; set; }
public int ShelfId { get; set; }
public string ShelfCode { get; set; }
public int RowCounts { get; set; }
public int ColumnCounts { get; set; }
public TaskModeEnum CurrentMode { get; set; }
public string ModulesStr { get; set; }
public string GroupName { get; set; }
public MatInfoResponse InStoreData { get; set; }
public string? CurrentCom { get; set; } = string.Empty;
public string OrderNumber { get; set; }
public int LightId { get; set; }
public LightColorEnum LightColor { get; set; }
public List<int> ModuleIds { get; set; }
public string ClientIp { get; set; }
public List<string> ExceptionMessages { get; set; }
public bool IsWarning { get; set; }
public string WebSocketIpAddress { get; set; }
public List<SmartShelfModule> Modules { get; set; } = new List<SmartShelfModule>();
public DateTime SetCurrentModeTime { get; set; }
public TCPClient TcpCleint { get { return TCPClientManager.GetTCPClientByIPHost(ClientIp); } }
public List<MXL4ShelfModule> MXL4Modules { get; set; } = new List<MXL4ShelfModule>();
public bool ConfirmStocktakingSingle(int BoardId, int LightNumber)
{
throw new NotImplementedException();
}
public void GoInInstore(string IPAdress)
{
//找到对应的灯 亮灯
}
public void GoInOutstore(List<OutOrderMatDetail> MatDetails, OutOrder outOrder, string OperateUser)
{
}
public void GoInStocktaking()
{
}
public void GoInStocktaking(List<StockTakingOrderMatDetail> MatDetails, StockTakingOrder outOrder)
{
}
public void GoOutInstore()
{
//找到已亮灯的 灭灯
}
public void GoOutOutstore()
{
}
public void GoOutStocktaking()
{
}
public void Reset()
{
return;
}
public void SetCurrentMode(TaskModeEnum mode)
{
}
public void ShelfCheck()
{
}
public void Warning()
{
}
public ResponseCommon<object> SingleLightControl(SingleLightShelfModel request, List<string> storeCodes)
{
try
{
var shelf = DbHelp.db.Queryable<ShelfInfo>().Where(t => t.Id == ShelfId)
.First();
var client = new
{
ClientIp = shelf.ClientIp,
IsService = shelf.IsService,
};
List<SingleLightShelfModel> singleLightShelfModels = new List<SingleLightShelfModel>();
singleLightShelfModels.Add(request);
var sendData = Helper.SingleLightControl(singleLightShelfModels);
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() == 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<object>()
{
Code = 201,
Message = $"【单灯单独控制】{client}指令发送中遇到异常{ex.Message}",
};
}
}
else
{
Logs.Write($"【单灯单独控制】{client}未连接,以下指令未能成功发送" + BitConverter.ToString(sendData));
return new ResponseCommon<object>()
{
Code = 201,
Message = $"【单灯单独控制】{client}未连接,以下指令未能成功发送",
};
}
}
var stores = DbHelp.db.Queryable<StoreInfo>()
.Where(t => storeCodes.Contains(t.StoreCode))
.ToList();
//更新数据库灯的状态
stores.ForEach(t =>
{
t.LightMode = request.WarningLightMode == -1 ? 0 : request.WarningLightMode;
t.ColorMode = request.WarningLightColor;
});
DbHelp.db.Updateable(stores)
.UpdateColumns(t => new { t.LightMode, t.ColorMode })
.ExecuteCommand();
//返回成功
return new ResponseCommon<object>()
{
Code = 200,
Message = "success",
};
}
catch (Exception ex)
{
//操作失败
return new ResponseCommon<object>()
{
Code = 300,
Message = $"操作失败:{ex.Message}",
};
}
}
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);
}
}
}
}