增加更多的指令实现

dev
nxiaoxiao 1 year ago
parent 670856fb58
commit 0d7cc2df5f

@ -12,7 +12,7 @@ namespace OMS.NET.Common
public class ActiveDataElement
{
private static readonly JsonSerializerOptions options = new()
public static readonly JsonSerializerOptions options = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名为小写
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, // 忽略 null 值,

@ -293,6 +293,17 @@ namespace OMS.NET
private static readonly List<ActiveDataElement> _ActiveDataList = new();
private static readonly object _ActiveDataListLock = new();
public static List<ActiveDataElement> GetActiveDataList
{
get
{
lock (_ActiveDataListLock)
{
return _ActiveDataList.Where(x => x.Pick != null || x.Select != null).ToList();
}
}
}
public static bool IsElementExit(long elementId)
{
lock (_ActiveDataListLock)

@ -0,0 +1,24 @@
namespace OMS.NET.Instructs
{
public class GetActiveDataInstruct : Instruct
{
public GetActiveDataInstruct()
{
this.Type = "get_activeData";
}
public override Task Handler(string wsid)
{
return Task.Run(() =>
{
if (!GlobalArea.LoginCheckByID(wsid)) return;//登录检查,不通过则直接退出
this.ResponseOrBroadcastInstructs.Add(new Instruct()
{
IsResponse = true,
Type = "send_activeData",
Data = GlobalArea.GetActiveDataList
});
});
}
}
}

@ -2,6 +2,7 @@ using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text.Json;
using System.Text.Json.Serialization;
using OMS.NET.Common;
namespace OMS.NET.Instructs
{
@ -52,6 +53,7 @@ namespace OMS.NET.Instructs
"get_presence" => JsonSerializer.Deserialize<GetPresenceInstruct>(root.GetRawText(), options),
"get_mapData" => JsonSerializer.Deserialize<GetMapDataInstruct>(root.GetRawText(), options),
"get_mapLayer" => JsonSerializer.Deserialize<GetMapLayerInstruct>(root.GetRawText(), options),
"get_activeData" => JsonSerializer.Deserialize<GetActiveDataInstruct>(root.GetRawText(), options),
"ping" => JsonSerializer.Deserialize<PingInstuct>(root.GetRawText(), options),
//广播指令
@ -64,6 +66,10 @@ namespace OMS.NET.Instructs
"curve" => JsonSerializer.Deserialize<AddElementInstruct>(root.GetRawText(), options),
"deleteElement" => JsonSerializer.Deserialize<DeleteElementInstruct>(root.GetRawText(), options),
"textMessage" => JsonSerializer.Deserialize<TextMessageInstruct>(root.GetRawText(), options),
"selectIngElement" => JsonSerializer.Deserialize<SelectIngElementInstruct>(root.GetRawText(), options),
"selectEndElement" => JsonSerializer.Deserialize<SelectEndElementInstruct>(root.GetRawText(), options),
"pickIngElement" => JsonSerializer.Deserialize<PickIngElementInstruct>(root.GetRawText(), options),
"pickEndElement" => JsonSerializer.Deserialize<PickEndElementInstruct>(root.GetRawText(), options),
_ => JsonSerializer.Deserialize<Instruct>(root.GetRawText(), options)
},
_ => null
@ -96,7 +102,14 @@ namespace OMS.NET.Instructs
if (value.Data != null)
{
writer.WritePropertyName(InstructNamingPolicy.Convert(nameof(Instruct.Data)));
JsonSerializer.Serialize(writer, value.Data, value.Data.GetType(), options);
if (value.Data.GetType() == typeof(List<ActiveDataElement>))
{
JsonSerializer.Serialize(writer, value.Data, value.Data.GetType(), ActiveDataElement.options);
}
else
{
JsonSerializer.Serialize(writer, value.Data, value.Data.GetType(), options);
}
}
writer.WriteEndObject();
}

@ -0,0 +1,50 @@
using System.Text.Json;
using OMS.NET.Common;
using OMS.NET.DbClass;
namespace OMS.NET.Instructs
{
public class PickEndElementInstruct : Instruct
{
public PickEndElementInstruct()
{
Type = "broadcast";
Class = "pickEndElement";
}
public override Task Handler(string wsid)
{
return Task.Run(() =>
{
if (!GlobalArea.LoginCheckByID(wsid)) return;//登录检查,不通过则直接退出
if (Data?.GetType() != typeof(JsonElement)) return;//Data 非空和JsonElement类型检查
try
{
long id = Data.GetInt64();
string conveyor = GlobalArea.GetLoginEmailByID(wsid);
if (GlobalArea.IsElementExit(id))//已存在activedata项
{
ActiveDataElement activeDataElement = GlobalArea.GetActiveDataElement(id)!;
if (activeDataElement.Pick?.Email == conveyor)
{
activeDataElement.Pick = null;
string time = GlobalArea.GetCurrentTime();
ResponseOrBroadcastInstructs.Add(new PickEndElementInstruct()
{
IsBroadcast = true,
Conveyor = conveyor,
Time = time,
Data = id
});
}
}
}
catch (Exception ex)
{
GlobalArea.Log.Warn($"处理{this.Class}广播指令出错:" + ex.Message);
}
});
}
}
}

@ -0,0 +1,71 @@
using System.Text.Json;
using OMS.NET.Common;
using OMS.NET.DbClass;
namespace OMS.NET.Instructs
{
public class PickIngElementInstruct : Instruct
{
public PickIngElementInstruct()
{
this.Type = "broadcast";
this.Class = "pickIngElement";
}
public override Task Handler(string wsid)
{
return Task.Run(() =>
{
if (!GlobalArea.LoginCheckByID(wsid)) return;//登录检查,不通过则直接退出
if (Data?.GetType() != typeof(JsonElement)) return;//Data 非空和JsonElement类型检查
try
{
long id = Data.GetInt64();
string conveyor = GlobalArea.GetLoginEmailByID(wsid);
AccountData accountData = GlobalArea.GetLoginAccountData(conveyor)!;
UserInfo userInfo = new()
{
Email = conveyor,
Color = accountData.HeadColor,
Name = accountData.UserName,
};
if (GlobalArea.IsElementExit(id))//已存在activedata项
{
ActiveDataElement activeDataElement = GlobalArea.GetActiveDataElement(id)!;
if (activeDataElement.Pick == null)
{
activeDataElement.Pick = userInfo;
}
else
{
throw new Exception($"{id}已被{activeDataElement.Pick.Name}Pick");
}
}
else
{
GlobalArea.AddActiveDataElement(new ActiveDataElement(id)
{
Pick = userInfo
});
}
string time = GlobalArea.GetCurrentTime();
ResponseOrBroadcastInstructs.Add(new PickIngElementInstruct()
{
IsBroadcast = true,
Conveyor = conveyor,
Time = time,
Data = new
{
id = id,
color = accountData.HeadColor
}
});
}
catch (Exception ex)
{
GlobalArea.Log.Warn($"处理{this.Class}广播指令出错:" + ex.Message);
}
});
}
}
}

@ -0,0 +1,50 @@
using System.Text.Json;
using OMS.NET.Common;
using OMS.NET.DbClass;
namespace OMS.NET.Instructs
{
public class SelectEndElementInstruct : Instruct
{
public SelectEndElementInstruct()
{
Type = "broadcast";
Class = "selectEndElement";
}
public override Task Handler(string wsid)
{
return Task.Run(() =>
{
if (!GlobalArea.LoginCheckByID(wsid)) return;//登录检查,不通过则直接退出
if (Data?.GetType() != typeof(JsonElement)) return;//Data 非空和JsonElement类型检查
try
{
long id = Data.GetInt64();
string conveyor = GlobalArea.GetLoginEmailByID(wsid);
if (GlobalArea.IsElementExit(id))//已存在activedata项
{
ActiveDataElement activeDataElement = GlobalArea.GetActiveDataElement(id)!;
if (activeDataElement.Select?.Email == conveyor)
{
activeDataElement.Select = null;
string time = GlobalArea.GetCurrentTime();
ResponseOrBroadcastInstructs.Add(new SelectEndElementInstruct()
{
IsBroadcast = true,
Conveyor = conveyor,
Time = time,
Data = id
});
}
}
}
catch (Exception ex)
{
GlobalArea.Log.Warn($"处理{this.Class}广播指令出错:" + ex.Message);
}
});
}
}
}

@ -38,7 +38,7 @@ namespace OMS.NET.Instructs
}
else
{
throw new Exception($"{id}已被{activeDataElement.Select.Name}选中");
throw new Exception($"{id}已被{activeDataElement.Select.Name}Select");
}
}
else

Loading…
Cancel
Save