Commit 0987bff3 张东亮

添加记录最近出库的栈,避免出库任务重复执行

1 个父辈 eafc12f1
...@@ -83,6 +83,7 @@ ...@@ -83,6 +83,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="deviceLibrary\FixedSizeStack.cs" />
<Compile Include="deviceLibrary\Msg.cs" /> <Compile Include="deviceLibrary\Msg.cs" />
<Compile Include="deviceLibrary\ReelCheckCamera.cs" /> <Compile Include="deviceLibrary\ReelCheckCamera.cs" />
<Compile Include="deviceLibrary\SignalMonitor.cs" /> <Compile Include="deviceLibrary\SignalMonitor.cs" />
......
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnlineStore.DeviceLibrary.deviceLibrary
{
/// <summary>
/// 一个固定大小的堆栈。当元素数量超过容量时,最老的元素(栈底)会被自动移除。
/// </summary>
/// <typeparam name="T">堆栈中元素的类型</typeparam>
public class FixedSizeStack<T> : IEnumerable<T>
{
private readonly List<T> _internalList = new List<T>();
private readonly int _capacity;
/// <summary>
/// 获取堆栈的最大容量。
/// </summary>
public int Capacity => _capacity;
/// <summary>
/// 获取当前堆栈中的元素数量。
/// </summary>
public int Count => _internalList.Count;
/// <summary>
/// 初始化一个新的、指定容量的 FixedSizeStack 实例。
/// </summary>
/// <param name="capacity">堆栈的最大容量。</param>
/// <exception cref="ArgumentOutOfRangeException">当容量小于1时抛出。</exception>
public FixedSizeStack(int capacity)
{
if (capacity < 1)
throw new ArgumentOutOfRangeException(nameof(capacity), "容量必须大于或等于1。");
_capacity = capacity;
}
/// <summary>
/// 将一个元素推入堆栈顶部。如果堆栈已满,最老的元素将被移除。
/// </summary>
/// <param name="item">要推入的元素。</param>
public void Push(T item)
{
_internalList.Add(item);
// 如果超出容量,移除最前面(最老)的元素
if (_internalList.Count > _capacity)
{
_internalList.RemoveAt(0);
}
}
/// <summary>
/// 移除并返回堆栈顶部的元素。
/// </summary>
/// <returns>堆栈顶部的元素。</returns>
/// <exception cref="InvalidOperationException">当堆栈为空时抛出。</exception>
public T Pop()
{
if (_internalList.Count == 0)
throw new InvalidOperationException("堆栈为空,无法执行 Pop 操作。");
int lastIndex = _internalList.Count - 1;
T itemToReturn = _internalList[lastIndex];
_internalList.RemoveAt(lastIndex);
return itemToReturn;
}
/// <summary>
/// 返回堆栈顶部的元素,但不移除它。
/// </summary>
/// <returns>堆栈顶部的元素。</returns>
/// <exception cref="InvalidOperationException">当堆栈为空时抛出。</exception>
public T Peek()
{
if (_internalList.Count == 0)
throw new InvalidOperationException("堆栈为空,无法执行 Peek 操作。");
return _internalList[_internalList.Count - 1];
}
/// <summary>
/// 从堆栈中移除所有元素。
/// </summary>
public void Clear()
{
_internalList.Clear();
}
/// <summary>
/// 返回一个循环访问集合的枚举器。枚举顺序是从栈顶到栈底。
/// </summary>
/// <returns>一个可用于循环访问集合的 IEnumerator&lt;T&gt;。</returns>
public IEnumerator<T> GetEnumerator()
{
// 从后往前遍历,模拟从栈顶到栈底的顺序
for (int i = _internalList.Count - 1; i >= 0; i--)
{
yield return _internalList[i];
}
}
/// <summary>
/// 返回一个循环访问集合的枚举器。
/// </summary>
/// <returns>一个可用于循环访问集合的 IEnumerator。</returns>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
/// <summary>
/// 返回一个表示当前对象的字符串。
/// </summary>
/// <returns>一个表示当前对象的字符串。</returns>
public override string ToString()
{
return $"FixedSizeStack (Capacity: {_capacity}, Count: {_internalList.Count}) [ {string.Join(", ", _internalList)} ]";
}
}
}
...@@ -718,7 +718,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -718,7 +718,7 @@ namespace OnlineStore.DeviceLibrary
bool isAlarmForkCheck() bool isAlarmForkCheck()
{ {
if(checkForkCnt > 3) if (checkForkCnt > 3)
{ {
return true; return true;
} }
...@@ -1367,6 +1367,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -1367,6 +1367,7 @@ namespace OnlineStore.DeviceLibrary
return false; return false;
} }
private static object outStoreObject = new object(); private static object outStoreObject = new object();
FixedSizeStack<string> recentOutstores = new FixedSizeStack<string>(5);
public bool StartExecuctOut(InOutParam param) public bool StartExecuctOut(InOutParam param)
{ {
bool result = false; bool result = false;
...@@ -1377,12 +1378,17 @@ namespace OnlineStore.DeviceLibrary ...@@ -1377,12 +1378,17 @@ namespace OnlineStore.DeviceLibrary
{ {
if (MoveInfo.MoveType.Equals(MoveType.OutStore) && if (MoveInfo.MoveType.Equals(MoveType.OutStore) &&
(MoveInfo.MoveParam.PosInfo.PosId.Equals(param.PosInfo.PosId) (MoveInfo.MoveParam.PosInfo.PosId.Equals(param.PosInfo.PosId)
|| (MoveInfo.MoveParam.PosInfoBack!=null && MoveInfo.MoveParam.PosInfoBack.PosId.Equals(param.PosInfo.PosId)))) || (MoveInfo.MoveParam.PosInfoBack != null && MoveInfo.MoveParam.PosInfoBack.PosId.Equals(param.PosInfo.PosId))))
{ {
LogUtil.error(Name + " 出库命令【" + param.PosInfo.ToStr() + "】重复,【" + MoveInfo.MoveParam.PosInfo.PosId + "】出库执行中"); LogUtil.error(Name + " 出库命令【" + param.PosInfo.ToStr() + "】重复,【" + MoveInfo.MoveParam.PosInfo.PosId + "】出库执行中");
return false; return false;
} }
if (recentOutstores.Contains(param.PosInfo.PosId))
{
LogUtil.error(Name + " 出库命令【" + param.PosInfo.ToStr() + "】重复,在最近的出库列表");
return false;
}
List<InOutParam> reviceList = new List<InOutParam>(); List<InOutParam> reviceList = new List<InOutParam>();
reviceList.AddRange(waitAOutStoreList); reviceList.AddRange(waitAOutStoreList);
reviceList.AddRange(waitBOutStoreList); reviceList.AddRange(waitBOutStoreList);
...@@ -1440,6 +1446,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -1440,6 +1446,8 @@ namespace OnlineStore.DeviceLibrary
SetBoxStatus(DeviceStatus.OutStoreExecute, RunStatus.Busy, param.PosInfo.PosId, param.PosInfo.barcode); SetBoxStatus(DeviceStatus.OutStoreExecute, RunStatus.Busy, param.PosInfo.PosId, param.PosInfo.barcode);
MoveInfo.NewMove(MoveType.OutStore, param); MoveInfo.NewMove(MoveType.OutStore, param);
LogInfo("启动出库【" + param.PosInfo.ToStr() + "】 "); LogInfo("启动出库【" + param.PosInfo.ToStr() + "】 ");
recentOutstores.Push(param.PosInfo.PosId);
LogInfo($"{recentOutstores}");
///开始记录 ///开始记录
StartRecord(); StartRecord();
//LogInfo("LoadInoutParam:" + JsonHelper.SerializeObject(param.MoveP)); //LogInfo("LoadInoutParam:" + JsonHelper.SerializeObject(param.MoveP));
......
...@@ -129,6 +129,14 @@ namespace OnlineStore.DeviceLibrary ...@@ -129,6 +129,14 @@ namespace OnlineStore.DeviceLibrary
// else // else
// data[1] += tempadjust; // data[1] += tempadjust;
//} //}
if (data[1]>80)
{
data[1] = 0;
}
if (data[0] > 100)
{
data[0] = 0;
}
data[1] = ProcessTemp(port, data[1]); data[1] = ProcessTemp(port, data[1]);
param = new HumitureParam(data[1], data[0], data[2]); param = new HumitureParam(data[1], data[0], data[2]);
} }
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!