Files
wcs/WCS.BLL/HardWare/SmartShelf.cs
hehaibing-1996 aaf7c17562 提交代码
2024-04-23 08:31:37 +08:00

346 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Sockets;
using WCS.BLL.DbModels;
using WCS.DAL;
using WCS.DAL.Db;
using WCS.DAL.DbModels;
using WCS.Model;
namespace WCS.BLL.HardWare
{
/// <summary>
/// 智能货架
/// </summary>
public class SmartShelf : IShelfBase
{
public SmartShelf(ShelfInfo shelfInfo)
{
ShelfId = shelfInfo.Id;
ShelfCode = shelfInfo.ShelfCode;
RowCounts = shelfInfo.Rowcounts;
ColumnCounts = shelfInfo.Columncounts;
CurentMode = shelfInfo.CurrentMode;
//初始化Module
Task.Run(() =>
{
var modules = DbHelp.db.Queryable<ModuleInfo>().Where(t => t.ShelfId == ShelfId).ToList();
foreach (var module in modules)
{
Modules.Add(new SmartShelfModule()
{
ModuleId = module.Id,
ModuleCode = module.ModuleCode,
BoardId = module.BoardId,
IsEnable = module.IsEnable,
CurrentMode = module.CurentMode
});
}
ModulesStr = string.Join(";", Modules.Select(t => t.ModuleCode));
});
//初始化TCPCleint
TcpCleint = new TCPClient("127.0.0.1:20002", "127.0.0.1:20003");
TcpCleint.Connect();
TcpCleint.tcpClient.Received += (client, e) =>
{
var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray();
e.ByteBlock.Clear();
var len = data.Length;
for (int index = 0; index < data.Length - TcpCleint.PreFixLength; index++)
{
//协议拆包 通过前缀校验是否为完整数据包
var prefixInData = data.Skip(index).Take(TcpCleint.PreFixLength);
var isEqual = prefixInData.SequenceEqual(TcpCleint.Prefix);
if (isEqual)
{
var dataTemp = data.Skip(index).Take(TcpCleint.PreFixLength + TcpCleint.DataLength).ToArray();
if (dataTemp.Length < TcpCleint.PreFixLength + TcpCleint.DataLength)//拆包后不满足一条指令的长度
{
continue;
}
index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1
//获取板子ID
var boardId = (data[TcpCleint.PreFixLength + 0] << 8) + data[TcpCleint.PreFixLength + 1];
//协议处理 判断功能位
switch (dataTemp[TcpCleint.PreFixLength + 2])
{
case 0x01:
;
break;
case 0x03://正常入库信号
InStoreReturnProcess(dataTemp);
break;
default:
;
break;
}
}
}
return EasyTask.CompletedTask;
};
}
public int ShelfId { get; set; }
public string ShelfCode { get; set; }
public int RowCounts { get; set; }
public int ColumnCounts { get; set; }
public Mode CurentMode { get; set; }
public string ModulesStr { get; set; }//当前货架所有模组的Str
public string GroupName { get; set; }
public List<SmartShelfModule> Modules { get; set; } = new List<SmartShelfModule>();
public TCPClient TcpCleint { get; set; }
public WarningLight WarningLight { get; set; }
public List<string> ExceptionMessages { get; set; } = new List<string>();
public string? InstoreIpAddress { get; set; } = string.Empty;
public MatInfoResponse InStoreData { get; set; }
public string OrderNumber { get; set; }
#region
public void GoInInstore(string? IPAddress)
{
//判断当前模式是否为待机模式
if (this.CurentMode != Mode.)
{
return;
}
else
{
this.CurentMode = Mode.;
}
//货架所有模组发送指令进入入库模式
foreach (var module in Modules.Where(t => t.IsEnable).ToList())
{
module.GoInInstoreMode(TcpCleint);
}
//延时获取异常
var timeOut = 3000;
var timeSpan = TimeSpan.FromMilliseconds(0);
var beginTime = DateTime.Now;
while (timeSpan <= TimeSpan.FromMilliseconds(timeOut))
{
timeSpan = DateTime.Now - beginTime;
//接收到第一个异常就不继续循环了
if (ExceptionMessages.Count() > 0)
{
var deficientTime = timeOut - (int)timeSpan.TotalMilliseconds;
if (deficientTime > 0)
Thread.Sleep(deficientTime);
//出现异常的未进入入库模式,有红灯进行指引
//未出现异常的需要退出入库模式
GoOutInstore();
return;
}
//延时处理
Thread.Sleep(50);
}
//警示灯亮起
//WarningLight.BlueLight();
//绑定当前进入入库PDA/WCS前端的IP
InstoreIpAddress = IPAddress;
//返回成功
return;
}
public void GoOutInstore()
{
//看货架是否为入库模式
if (CurentMode != Mode.)
{
return;
}
else
{
this.CurentMode = Mode.;
}
//货架所有模组发送指令退出入库模式
foreach (var module in Modules.Where(t => t.IsEnable)
.Where(t => t.CurrentMode == Mode.)
.ToList())
{
module.GoOutInstoreMode(TcpCleint);
}
}
public void GoInOutstore()
{
throw new NotImplementedException();
}
public void GoInStocktaking()
{
this.CurentMode = Mode.;
}
public void GoOutOutstore()
{
this.CurentMode = Mode.;
}
public void GoOutStocktaking()
{
this.CurentMode = Mode.;
}
void IShelfBase.Reset()
{
throw new NotImplementedException();
}
void IShelfBase.SetCurrentMode()
{
throw new NotImplementedException();
}
void IShelfBase.Warning()
{
throw new NotImplementedException();
}
public void ShelfCheck()
{
foreach (var module in Modules.Where(t => t.IsEnable).ToList())
{
module.ShelfCheck(TcpCleint);
}
}
#endregion
#region
public void InStoreReturnProcess(byte[] data)
{
var boardId = (data[TcpCleint.PreFixLength + 0] << 8) + data[TcpCleint.PreFixLength + 1];
var number = Convert.ToInt32(data[TcpCleint.PreFixLength + 3]);
var storeInfo = DbHelp.db.Queryable<StoreInfo>().Where(t => t.BoardId == boardId
&& t.LightNumber == number).First();
if (storeInfo == null)
{
//TO DO 报错
return;
}
var module = this.Modules.Where(t => t.BoardId == boardId)
.FirstOrDefault();
if (module == null)
{
//TO DO 报错
return;
}
#region
//物料未扫码
if (this.InStoreData == null)
{
//重复给了多次信号
if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn))
{
module.ComfirmInstore(TcpCleint);
//TO DO Logs.Write($"[{guid}]CAN给了多次正常入库信号防止硬件异常返回了确认入库");
return;
}
else
{
module.ComfirmErrInstore(TcpCleint);
//WaringLight(shelfStatus.ClientIp, shelfStatus.LightId);
//TO DO Logs.Write($"[{guid}]当前物料信息不存在,请取出后重新扫码进行入库!");
return;
}
}
//该位置已放置物料
else if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn))
{
//ComfirmErrInstoreByIp(shelfStatus.ClientIp, boardId);
//WaringLight(shelfStatus.ClientIp, shelfStatus.LightId);
//Logs.Write($"[{guid}]该位置已放置物料!");
return;
}
#endregion
#region
{
try
{
DbHelp.db.BeginTran();
//库存明细表
var inventoryDetail = new InventoryDetail
{
StoreCode = storeInfo.StoreCode,
StoreId = storeInfo.Id,
MatSN = this.InStoreData.materialBar,
MatCode = this.InStoreData.materialCode,
MatName = this.InStoreData.materialName,
MatSpec = this.InStoreData.materialSpec,
MatBatch = this.InStoreData.batchNo,
MatQty = (int)this.InStoreData.materialQty,
MatCustomer = this.InStoreData.customer,
MatSupplier = this.InStoreData.supplier,
InstoreTime = DateTime.Now,
InstoreUser = ""
};
//出入库记录表
var inOutRecord = new InOutRecord()
{
StoreCode = storeInfo.StoreCode,
StoreId = storeInfo.Id,
StoreInfo = storeInfo,
MatSN = this.InStoreData.materialBar,
MatCode = this.InStoreData.materialCode,
MatName = this.InStoreData.materialName,
MatSpec = this.InStoreData.materialSpec,
MatBatch = this.InStoreData.batchNo,
MatQty = (int)this.InStoreData.materialQty,
MatCustomer = this.InStoreData.customer,
MatSupplier = this.InStoreData.supplier,
OperateUser = this.InStoreData.InstoreUser,
Direction = DirectionEnum.,
};
//库位表
storeInfo.CurrentMatSn = this.InStoreData.materialBar;
//保存and更新数据
DbHelp.db.Insertable(inventoryDetail).ExecuteCommand();
DbHelp.db.Insertable(inOutRecord).ExecuteCommand();
DbHelp.db.Updateable(storeInfo).ExecuteCommand();
DbHelp.db.CommitTran();
//清空扫码信息
this.InStoreData = null;
//实际入库位置亮灯1S报警灯同时进行亮绿灯并鸣叫一次提示。
Thread.Sleep(20);
Task.Run(() =>
{
//确认入库硬件入库位置亮灯1秒
//ComfirmInstoreByIp(client.IP, boardId);
//报警灯亮绿灯 鸣叫一次提示
//SuccessLightBlueEnd(shelfStatus.ClientIp, shelfStatus.LightId);
});
}
catch (Exception ex)
{
DbHelp.db.RollbackTran();
Logs.Write($"入库保存数据异常,异常信息为{ex.Message}");
//报警灯报警
//WaringLight(shelfStatus.ClientIp, shelfStatus.LightId);
}
}
#endregion
}
#endregion
}
}