液晶标签协议对接 接口业务实现

This commit is contained in:
hehaibing-1996
2024-12-10 16:47:51 +08:00
parent 1c2a34256e
commit c94af9e987
9 changed files with 440 additions and 237 deletions

View File

@ -1,4 +1,7 @@
using System;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.Manager;
@ -30,7 +33,7 @@ namespace WCS.BLL.HardWare
WarningLight = new WarningLight() { LightId = shelfInfo.LightId };
//初始化Module
Task.Run(() =>
var task = Task.Run(() =>
{
var modules = DbHelp.db.Queryable<ModuleInfo>().Where(t => t.ShelfId == ShelfId).ToList();
foreach (var module in modules)
@ -48,6 +51,63 @@ namespace WCS.BLL.HardWare
ModuleIds = MXL4Modules.Select(t => t.BoardId).ToList();
});
//一个货架存在一个线程去刷新数据
Task.Run(async () =>
{
//等待模组加载完毕再开始发送数据进行刷新
Task.WaitAll(task);
while (true)
{
//未完成首次连接时 暂不发送
if (TcpCleint.IsFirstConnected == false)
{
await Task.Delay(2000);
continue;
}
Logs.Write($"[test]");
try
{
//查询是否有需要刷新的
var needRefreshModules = MXL4Modules.Where(t => t.IsNeedRefresh)
.ToList();
foreach (var module in needRefreshModules)
{
//查询当前是否有任务
var currentTasks = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ModuleId == module.ModuleId)
.ToList();
//存在入库、出库、盘点等任务
if (currentTasks != null && currentTasks.Count > 0)
{
}
//不存在入库、出库、盘点等任务
else
{
module.SetCurrentMode(Mode.);
//向上层系统获取数据
//获取成功 有数据 绑定对应数据
//获取成功 无数据
module.StandbyNoInfoDisplay(TcpCleint);
module.IsNeedRefresh = false;//未获取到库存数据 回没有库位显示信息给硬件
//获取失败 跳过此次循环后继续获取
}
}
}
catch (Exception ex)
{
Logs.Write($"【后台发送线程】遇到异常{ex.Message},{ex.StackTrace}");
}
await Task.Delay(1000);
}
});
}
public string ShelfTypeName { get; set; }
@ -114,36 +174,34 @@ namespace WCS.BLL.HardWare
public string OutOperateUser { get; set; } = string.Empty;
#region
public void Reset()
{
MXL4Modules.ForEach(t => t.Reset(TcpCleint));
}
#region
void IShelfBase.Warning()
{
}
public void ShelfCheck()
{
}
public void GoInInstore(string? IPAddress)
{
}
public void GoOutInstore()
{
}
/// <summary>
/// 由自检异常等错误导致的 手动操作处理后重新进入出库模式
/// </summary>
/// <param name="ModuleId"></param>
public void GoInOutstoreByWebSocket(int moduleId)
{
}
public void GoInOutstore(List<OutOrderMatDetail> MatDetails, OutOrder outOrder, string OperateUser)
{
}
public void GoOutOutstore()
{
}
public void GoInStocktaking(List<StockTakingOrderMatDetail> MatDetails, StockTakingOrder stockTakingOrder)
{
}
/// <summary>
/// 确认盘点 Pda进行触发
@ -154,23 +212,8 @@ namespace WCS.BLL.HardWare
}
public void GoOutStocktaking()
{
}
public void Reset()
{
MXL4Modules.ForEach(t => t.Reset(TcpCleint));
}
public void QueryVoltage(int moduleId)
{
}
public void CalibrationSetOffset(int moduleId, int offSet)
{
}
#endregion
public void SetCurrentMode(Mode mode)
{
@ -187,20 +230,10 @@ namespace WCS.BLL.HardWare
}
});
}
void IShelfBase.Warning()
{
}
public void ShelfCheck()
{
}
#endregion
#region
public void WarningLightProcess(byte[] data, int boardId, int lightNumber)
public void WarningLightProcess(byte[] data, int boardId)
{
if (data[TcpCleint.PreFixLength + 2] == 0x20 && data[TcpCleint.PreFixLength + 3] == 0x01)
{
@ -232,156 +265,224 @@ namespace WCS.BLL.HardWare
}
#endregion
#region
public void ProtocolProcess(byte[] data, int boardId, int lightNumber)
#region
public void ProtocolProcess(byte[] data, int boardId)
{
//协议处理 判断功能位
switch (data[TcpCleint.PreFixLength + 2])
{
case 0x01://进入入库模式返回信号
GoInInstoreProcess(data, boardId, lightNumber);
case 0xA4://标签回到待机模式 请求获取显示数据的信号
if (data[TcpCleint.PreFixLength + 3] == 0x02)
GoBackStandbyModeReturnProcess(data, boardId);
break;
case 0x02://退出入库模式返回信号
GoOutInstoreProcess(data, boardId, lightNumber);
case 0xA1://标签返回入库成功信号
if (data[TcpCleint.PreFixLength + 3] == 0x05)
InStoreSuccessProcess(data, boardId);
break;
case 0x03://正常入库信号
InStoreReturnProcess(data);
case 0xA2://标签返回出库成功信号
if (data[TcpCleint.PreFixLength + 3] == 0x04)
OutStoreSuccessProcess(data, boardId);
break;
case 0x04://入库模式中异常信号
InStoreExceptionReturnProcess(data, boardId, lightNumber);
break;
case 0x05://进入出库模式返回信号
GoInOutstoreProcess(data, boardId, lightNumber);
break;
case 0x06://退出出库模式返回信号
GoOutOutstoreProcess(data, boardId, lightNumber);
break;
case 0x07://正常出库返回信号
OutstoreReturnProcess(data, boardId, lightNumber);
break;
case 0x08://出库模式中异常信号
OutstoreExceptionReturnProcess(data, boardId, lightNumber);
break;
case 0x09://进入盘点模式返回信号
GoInStockTakingReturnProcess(data, boardId, lightNumber);
break;
case 0x0A://退出盘点模式返回信号
GoOutStockTakingReturnProcess(data, boardId, lightNumber);
break;
case 0x13://复位的返回信号
ResetReturnProcess(data, boardId, lightNumber);
break;
case 0x17://电压值1
QueryVoltageProcess(data, boardId, lightNumber);
break;
case 0x18://电压值2
QueryVoltageProcess(data, boardId, lightNumber);
break;
case 0x19://电压值3
QueryVoltageProcess(data, boardId, lightNumber);
break;
case 0x0B://自检结果反馈
SelfCheckProcess(data, boardId, lightNumber);
case 0xA3://标签返回盘点成功信号
if (data[TcpCleint.PreFixLength + 3] == 0x03)
StocktakingSuccessProcess(data, boardId);
break;
default:
;
break;
}
}
/// <summary>
/// 进入入库模式返回信号处理
/// 标签回到待机模式
/// </summary>
/// <param name="data"></param>
public void GoInInstoreProcess(byte[] data, int boardId, int lightNumber)
public void GoBackStandbyModeReturnProcess(byte[] data, int boardId)
{
//获取对应的模组
var module = MXL4Modules.Where(t => t.BoardId == boardId)
.FirstOrDefault();
if (module != null)
{
module.IsNeedRefresh = true;
}
else
{
Logs.Write($"【回到待机模式】货架【{ShelfCode}】通过板子ID【{boardId}】未找到对应模组!");
}
SetCurrentMode(Mode.);
}
/// <summary>
/// 退出入库模式返回信号处理
/// 标签返回入库成功信号
/// </summary>
/// <param name="data"></param>
public void GoOutInstoreProcess(byte[] data, int boardId, int lightNumber)
public void InStoreSuccessProcess(byte[] data, int boardId)
{
var taskId = Convert.ToInt32(data[TcpCleint.PreFixLength + 4]);
var finishQty = (data[TcpCleint.PreFixLength + 5] << 8) + data[TcpCleint.PreFixLength + 6];
//获取对应的模组
var module = MXL4Modules.Where(t => t.BoardId == boardId)
.FirstOrDefault();
if (module != null)
{
//获取对应的任务
var task = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ModuleCode == module.ModuleCode)
.Where(t => t.TaskID == taskId)
.First();
if (task != null)
{
var finishedTask = new FinishedTask()
{
ShelfId = task.ShelfId,
ShelfCode = task.ShelfCode,
ModuleId = task.ModuleId,
ModuleCode = task.ModuleCode,
StoreId = task.StoreId,
StoreCode = task.StoreCode,
TaskID = task.TaskID,
Guid = task.Guid,
TaskMode = task.TaskMode,
OrderNumber = task.OrderNumber,
ButtonColor = task.ButtonColor,
MatCode = task.MatCode,
MatName = task.MatName,
MatSpec = task.MatSpec,
MatBatch = task.MatBatch,
MatSN = task.MatSN,
CreateTime = task.CreateTime,
FinishQty = finishQty,
FinishTime = DateTime.Now,
};
DbHelp.db.Insertable(finishedTask).ExecuteCommand();
DbHelp.db.Deleteable(task).ExecuteCommand();
}
else
{
Logs.Write($"【入库成功】货架【{ShelfCode}】通过模组{module.ModuleCode}({boardId}),通过任务id{taskId}未找到对应任务!");
}
}
else
{
Logs.Write($"【入库成功】货架【{ShelfCode}】通过板子ID【{boardId}】未找到对应模组!");
}
}
/// <summary>
/// 正常入库信号
/// 标签返回出库成功信号
/// </summary>
/// <param name="data"></param>
public void InStoreReturnProcess(byte[] data)
public void OutStoreSuccessProcess(byte[] data, int boardId)
{
var taskId = Convert.ToInt32(data[TcpCleint.PreFixLength + 4]);
var finishQty = (data[TcpCleint.PreFixLength + 5] << 8) + data[TcpCleint.PreFixLength + 6];
//获取对应的模组
var module = MXL4Modules.Where(t => t.BoardId == boardId)
.FirstOrDefault();
if (module != null)
{
//获取对应的任务
var task = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ModuleCode == module.ModuleCode)
.Where(t => t.TaskID == taskId)
.First();
if (task != null)
{
var finishedTask = new FinishedTask()
{
ShelfId = task.ShelfId,
ShelfCode = task.ShelfCode,
ModuleId = task.ModuleId,
ModuleCode = task.ModuleCode,
StoreId = task.StoreId,
StoreCode = task.StoreCode,
TaskID = task.TaskID,
Guid = task.Guid,
TaskMode = task.TaskMode,
OrderNumber = task.OrderNumber,
ButtonColor = task.ButtonColor,
MatCode = task.MatCode,
MatName = task.MatName,
MatSpec = task.MatSpec,
MatBatch = task.MatBatch,
MatSN = task.MatSN,
CreateTime = task.CreateTime,
FinishQty = finishQty,
FinishTime = DateTime.Now,
};
DbHelp.db.Insertable(finishedTask).ExecuteCommand();
DbHelp.db.Deleteable(task).ExecuteCommand();
}
else
{
Logs.Write($"【出库成功】货架【{ShelfCode}】通过模组{module.ModuleCode}({boardId}),通过任务id{taskId}未找到对应任务!");
}
}
else
{
Logs.Write($"【出库成功】货架【{ShelfCode}】通过板子ID【{boardId}】未找到对应模组!");
}
}
/// <summary>
/// 入库模式中异常处理
/// 标签返回盘点成功信号
/// </summary>
/// <param name="data"></param>
/// <param name="boardId"></param>
/// <param name="lightNumber"></param>
public void InStoreExceptionReturnProcess(byte[] data, int boardId, int lightNumber)
public void StocktakingSuccessProcess(byte[] data, int boardId)
{
}
var taskId = Convert.ToInt32(data[TcpCleint.PreFixLength + 4]);
var finishQty = (data[TcpCleint.PreFixLength + 5] << 8) + data[TcpCleint.PreFixLength + 6];
/// <summary>
/// 进入出库模式协议返回
/// </summary>
/// <param name="data"></param>
/// <param name="boardId"></param>
/// <param name="lightNumber"></param>
public void GoInOutstoreProcess(byte[] data, int boardId, int lightNumber)
{
}
public void OutstoreReturnProcess(byte[] data, int boardId, int lightNumber)
{
}
/// <summary>
/// 退出出库模式返回信号处理
/// </summary>
/// <param name="data"></param>
public void GoOutOutstoreProcess(byte[] data, int boardId, int lightNumber)
{
}
/// <summary>
/// 出库模式中异常处理
/// </summary>
/// <param name="data"></param>
/// <param name="boardId"></param>
/// <param name="lightNumber"></param>
public void OutstoreExceptionReturnProcess(byte[] data, int boardId, int lightNumber)
{
}
/// <summary>
/// 进入盘点模式返回信号
/// </summary>
/// <param name="data"></param>
/// <param name="boardId"></param>
/// <param name="lightNumber"></param>
public void GoInStockTakingReturnProcess(byte[] data, int boardId, int lightNumber)
{
}
public void GoOutStockTakingReturnProcess(byte[] data, int boardId, int lightNumber)
{
}
public void ResetReturnProcess(byte[] data, int boardId, int lightNumber)
{
}
public void QueryVoltageProcess(byte[] data, int boardId, int lightNumber)
{
}
public void SelfCheckProcess(byte[] data, int boardId, int lightNumber)
{
//获取对应的模组
var module = MXL4Modules.Where(t => t.BoardId == boardId)
.FirstOrDefault();
if (module != null)
{
//获取对应的任务
var task = DbHelp.db.Queryable<CurrentTask>()
.Where(t => t.ModuleCode == module.ModuleCode)
.Where(t => t.TaskID == taskId)
.First();
if (task != null)
{
var finishedTask = new FinishedTask()
{
ShelfId = task.ShelfId,
ShelfCode = task.ShelfCode,
ModuleId = task.ModuleId,
ModuleCode = task.ModuleCode,
StoreId = task.StoreId,
StoreCode = task.StoreCode,
TaskID = task.TaskID,
Guid = task.Guid,
TaskMode = task.TaskMode,
OrderNumber = task.OrderNumber,
ButtonColor = task.ButtonColor,
MatCode = task.MatCode,
MatName = task.MatName,
MatSpec = task.MatSpec,
MatBatch = task.MatBatch,
MatSN = task.MatSN,
CreateTime = task.CreateTime,
FinishQty = finishQty,
FinishTime = DateTime.Now,
};
DbHelp.db.Insertable(finishedTask).ExecuteCommand();
DbHelp.db.Deleteable(task).ExecuteCommand();
}
else
{
Logs.Write($"【盘点成功】货架【{ShelfCode}】通过模组{module.ModuleCode}({boardId}),通过任务id{taskId}未找到对应任务!");
}
}
else
{
Logs.Write($"【盘点成功】货架【{ShelfCode}】通过板子ID【{boardId}】未找到对应模组!");
}
}
#endregion
}