单灯交互修改为与液晶一致

This commit is contained in:
hehaibing-1996
2025-04-15 13:38:20 +08:00
parent c7513bf09f
commit aeb58bd0b1
3 changed files with 425 additions and 17 deletions

View File

@ -1,21 +1,29 @@
using System;
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)
public SingleLightShelf(ShelfInfo shelfInfo)
{
ShelfId = shelfInfo.Id;
ShelfCode = shelfInfo.ShelfCode;
@ -24,9 +32,249 @@ namespace WCS.BLL.HardWare
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; }
@ -51,8 +299,8 @@ namespace WCS.BLL.HardWare
public TCPClient TcpCleint { get { return TCPClientManager.GetTCPClientByIPHost(ClientIp); } }
public List<MXL4ShelfModule> MXL4Modules { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public List<MXL4ShelfModule> MXL4Modules { get; set; } = new List<MXL4ShelfModule>();
public bool ConfirmStocktakingSingle(int BoardId, int LightNumber)
{
@ -67,33 +315,33 @@ namespace WCS.BLL.HardWare
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()
@ -103,17 +351,136 @@ namespace WCS.BLL.HardWare
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);
}
}
}
}

View File

@ -42,7 +42,7 @@ namespace WCS.BLL.Services.Service
.ToList();
var moduleInfo = DbHelp.db.Queryable<ModuleInfo>()
.LeftJoin<ShelfTypeInfo>((si, sti) => si.ShelfTypeId == sti.Id)
.Where((si, sti) => sti.ShelfTypeName == "液晶标签货架")
.Where((si, sti) => sti.ShelfTypeName == "液晶标签货架" || sti.ShelfTypeName == "信息化货架")
.Where((si, sti) => storeCodeList.Contains(si.ModuleCode))
.Select((si, sti) => si)
.ToList();
@ -270,7 +270,7 @@ namespace WCS.BLL.Services.Service
var needCancelTasks = DbHelp.db.Queryable<CurrentTask>()
.Where(t => request.OrderNumber == request.OrderNumber)
.WhereIF(!string.IsNullOrEmpty(request.MatCode), t => t.MatCode == request.MatCode)
.WhereIF(!string.IsNullOrEmpty(request.MatCode), t => t.ItemNo == request.MatCode)
.ToList();
needCancelTasks.ForEach(t => t.IsCancel = true);
//获取当前

View File

@ -113,7 +113,9 @@ namespace WCS.WebApi.Controllers
.OrderBy(t => t.ShelfCode)
.ToList();
var storesToSave = new List<StoreInfo>();
foreach (var shelf in shelfInfo)
var modulesToSave = new List<ModuleInfo>();
foreach (var shelf in shelfInfo)
{
if (shelf.ShelfCode == "C07-4")
;
@ -126,6 +128,8 @@ namespace WCS.WebApi.Controllers
//奇数行 灯Id是最后一个灯
for (int i = shelf.Columncounts; i > 0; i--)
{
var storeInfo = new StoreInfo()
{
StoreCode = shelf.ShelfCode + "-" + i.ToString(),
@ -144,9 +148,27 @@ namespace WCS.WebApi.Controllers
LightMode = 0,
ColorMode = 0,
GroupName = shelf.GroupName,
Area = shelf.ShelfCode.Substring(0,1),
Area = shelf.ShelfCode.Substring(0, 1),
};
storesToSave.Add(storeInfo);
var moduleInfo = new ModuleInfo()
{
ModuleCode = shelf.ShelfCode + "-" + i.ToString(),
ShelfTypeId = shelf.ShelfTypeId,
ShelfId = shelf.Id,
ShelfCode = shelf.ShelfCode,
BoardId = storeInfo.BoardId,
LightCount = 1,
CleintIp = shelf.ClientIp,
GroupName = shelf.GroupName,
R = storeInfo.R,
C = storeInfo.C,
Bigshelfcode = "",
IsEnable = true,
CurrentMode = BLL.DbModels.Task.TaskModeEnum.,
};
modulesToSave.Add(moduleInfo);
}
shelf.LightId = ++id;
@ -184,12 +206,31 @@ namespace WCS.WebApi.Controllers
Area = shelf.ShelfCode.Substring(0, 1),
};
storesToSave.Add(storeInfo);
var moduleInfo = new ModuleInfo()
{
ModuleCode = shelf.ShelfCode + "-" + i.ToString(),
ShelfTypeId = shelf.ShelfTypeId,
ShelfId = shelf.Id,
ShelfCode = shelf.ShelfCode,
BoardId = storeInfo.BoardId,
LightCount = 1,
CleintIp = shelf.ClientIp,
GroupName = shelf.GroupName,
R = storeInfo.R,
C = storeInfo.C,
Bigshelfcode = "",
IsEnable = true,
CurrentMode = BLL.DbModels.Task.TaskModeEnum.,
};
modulesToSave.Add(moduleInfo);
}
}
}
DbHelp.db.Insertable(storesToSave).ExecuteCommand();
DbHelp.db.Insertable(modulesToSave).ExecuteCommand();
DbHelp.db.Updateable(shelfInfo).ExecuteCommand();
return new ResponseCommon()