From a5b6334ae09f2be1a5c073169458b55df68b0b2e Mon Sep 17 00:00:00 2001 From: lixiaojun <1287241240@qq.com> Date: 星期二, 19 十一月 2024 11:02:26 +0800 Subject: [PATCH] 新增一个水质仪对接 --- IStation.DataDockingSocket.SZJT_SZY1/paras_datadocking_socket_szjt_szy1.json | 42 ++ IStation.DataDockingSocket.SZJT_SZY1/helper/DebugHelper.cs | 42 ++ IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardRecord.cs | 25 + IStation.DataDockingSocket.SZJT_SZY1/helper/HandleDataHelper.cs | 92 ++++ IStation.DataDockingSocket.SZJT_SZY1/paras/AppParas.cs | 176 +++++++++ IStation.DataDockingSocket.SZJT_SZY1/HandleHelper.cs | 137 +++++++ IStation.DataDockingSocket.SZJT_SZY1/helper/SessionHelper.cs | 13 IStation.DataDockingSocket.SZJT_SZY1/Model/Middle/MiddleRecord.cs | 23 + IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJob.cs | 40 ++ IStation.DataDockingSocket.SZJT_SZY1/IStation.DataDockingSocket.SZJT_SZY1.csproj | 24 + IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardModel.cs | 22 + IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldResult.cs | 23 + IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardRecord.cs | 30 + IStation.DataDockingSocket.SZJT_SZY1/helper/SrcHelper.cs | 22 + IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardSubRecord.cs | 21 + IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardSubRecord.cs | 26 + IStation.DataDockingSocket.SZJT_SZY1/GlobalUsings.cs | 6 IStation.DataDockingSocket.SZJT_SZY1/helper/ConfigHelper.cs | 45 ++ IStation.DataDockingSocket.SZJT_SZY1/helper/OldTransferHelper.cs | 41 ++ IStation.TopShelf.DataDocking4Socket/Properties/PublishProfiles/FolderProfile.pubxml.user | 2 IStation.DataDocking.Socket.sln | 6 IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewResult.cs | 38 ++ IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobHelper.cs | 100 +++++ IStation.DataDockingSocket.SZJT_SZY1/paras/AppParasHelper.cs | 39 ++ IStation.TopShelf.DataDocking4Socket/IStation.TopShelf.DataDocking4Socket.csproj.user | 6 IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardModel.cs | 22 + IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobNameHelper.cs | 40 ++ IStation.DataDocking.Socket/IStation.DataDocking.Socket.csproj | 1 28 files changed, 1,103 insertions(+), 1 deletions(-) diff --git a/IStation.DataDocking.Socket.sln b/IStation.DataDocking.Socket.sln index 698a25d..d62c767 100644 --- a/IStation.DataDocking.Socket.sln +++ b/IStation.DataDocking.Socket.sln @@ -29,6 +29,8 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IStation.DataDockingSocket.SZJT_XJD", "IStation.DataDockingSocket.SZJT_XJD\IStation.DataDockingSocket.SZJT_XJD.csproj", "{A553EA76-C543-4C56-94C2-5594ABFFE6DD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.DataDockingSocket.SZJT_SZY1", "IStation.DataDockingSocket.SZJT_SZY1\IStation.DataDockingSocket.SZJT_SZY1.csproj", "{53CDD119-7F16-4E12-9134-EF497E833270}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -87,6 +89,10 @@ {A553EA76-C543-4C56-94C2-5594ABFFE6DD}.Debug|Any CPU.Build.0 = Debug|Any CPU {A553EA76-C543-4C56-94C2-5594ABFFE6DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {A553EA76-C543-4C56-94C2-5594ABFFE6DD}.Release|Any CPU.Build.0 = Release|Any CPU + {53CDD119-7F16-4E12-9134-EF497E833270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53CDD119-7F16-4E12-9134-EF497E833270}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53CDD119-7F16-4E12-9134-EF497E833270}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53CDD119-7F16-4E12-9134-EF497E833270}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/IStation.DataDocking.Socket/IStation.DataDocking.Socket.csproj b/IStation.DataDocking.Socket/IStation.DataDocking.Socket.csproj index 935a74e..e04b30c 100644 --- a/IStation.DataDocking.Socket/IStation.DataDocking.Socket.csproj +++ b/IStation.DataDocking.Socket/IStation.DataDocking.Socket.csproj @@ -21,6 +21,7 @@ <ProjectReference Include="..\IStation.DataDockingSocket.SZJT_PST\IStation.DataDockingSocket.SZJT_PST.csproj" /> <ProjectReference Include="..\IStation.DataDockingSocket.SZJT_QFT\IStation.DataDockingSocket.SZJT_QFT.csproj" /> <ProjectReference Include="..\IStation.DataDockingSocket.SZJT_SYW\IStation.DataDockingSocket.SZJT_SYW.csproj" /> + <ProjectReference Include="..\IStation.DataDockingSocket.SZJT_SZY1\IStation.DataDockingSocket.SZJT_SZY1.csproj" /> <ProjectReference Include="..\IStation.DataDockingSocket.SZJT_WTW\IStation.DataDockingSocket.SZJT_WTW.csproj" /> <ProjectReference Include="..\IStation.DataDockingSocket.SZJT_XJD\IStation.DataDockingSocket.SZJT_XJD.csproj" /> </ItemGroup> diff --git a/IStation.DataDockingSocket.SZJT_SZY1/GlobalUsings.cs b/IStation.DataDockingSocket.SZJT_SZY1/GlobalUsings.cs new file mode 100644 index 0000000..3239372 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/GlobalUsings.cs @@ -0,0 +1,6 @@ +锘縢lobal using Yw; +global using Yw.Untity; +global using Yw.Service; +global using System.ComponentModel.DataAnnotations; +global using Quartz; +global using Yw.DataDockingSocket; \ No newline at end of file diff --git a/IStation.DataDockingSocket.SZJT_SZY1/HandleHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/HandleHelper.cs new file mode 100644 index 0000000..38075fc --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/HandleHelper.cs @@ -0,0 +1,137 @@ +锘縩amespace IStation.DataDockingSocket +{ + public class HandleHelper : IHandleHelper + { + + + /// <summary> + /// 澶勭悊娉ㄥ唽鐮� + /// </summary> + public void HandleRegisterCode(Yw.Model.IMonitorDataDockingSession session) + { + if (session == null) + return; + if (!session.IsConnected) + return; + + if (SessionHelper.Cache != null) + { + if (SessionHelper.Cache != session) + { + if (SessionHelper.Cache.IsConnected) + { + SessionHelper.Cache.Close($"{session.SessionName} 涓紝浜х敓鏂扮殑浼氳瘽锛�"); + } + } + } + + SessionHelper.Cache = session; + var appParas = AppParasHelper.Get(); + if (appParas == null) + { + LogHelper.Error("Socket 鏁版嵁瀵规帴涓紝SZY1 缂哄皯鏁版嵁瀵规帴閰嶇疆鏂囦欢"); + return; + } + foreach (var item in appParas.InstructionItems) + { + SendInstructionJobHelper.StartJob(session, item); + Thread.Sleep(appParas.InstructionSendSpace * 1000); + } + } + + /// <summary> + /// 澶勭悊蹇冭烦鍖� + /// </summary> + public void HandleHeartbeat(Yw.Model.IMonitorDataDockingSession session) + { + + } + + /// <summary> + /// 澶勭悊鏁版嵁 + /// </summary> + public void HandleData + ( + Yw.Model.IMonitorDataDockingSession session, + byte[] bytes, + List<Yw.Model.DataDockingConfigureItemExSubList> mappers, + Action<List<Yw.Model.MonitorHandleRecord>> receive + ) + { + if (session == null) + return; + if (!session.IsConnected) + return; + if (bytes == null) + return; + if (!AppParas.Verify(bytes)) + { + return; + } + if (mappers == null || mappers.Count < 1) + { + return; + } + var appParas = AppParasHelper.Get(); + if (appParas == null) + { + LogHelper.Error("Socket 鏁版嵁瀵规帴涓紝SZY1 缂哄皯鏁版嵁瀵规帴閰嶇疆鏂囦欢"); + return; + } + + var item = appParas.InstructionItems.Find(x => x.Verify(bytes)); + if (item == null) + return; + var middleList = HandleDataHelper.HandleData(item, bytes); + if (middleList != null && middleList.Count > 0) + { + var recordList = new List<Yw.Model.MonitorHandleRecord>(); + foreach (var mapper in mappers) + { + if (mapper.SubList == null || mapper.SubList.Count < 1) + { + continue; + } + var mapper_sub = mapper.SubList.First(); + var middle = middleList.Find(x => x.SignId == mapper.TransferId); + if (middle != null) + { + var record = new Yw.Model.MonitorHandleRecord + { + MonitorPointID = mapper.MonitorPointID, + DataTime = middle.DataTime + }; + + var dataStatus = new List<string>(); + var record_sub = new Yw.Model.MonitorHandleSubRecord(); + record_sub.SignalID = mapper_sub.SignalID; + record_sub.SrcValue = middle.DataValue; + record_sub.DataValue = mapper_sub.Docking(middle.DataValue, ref dataStatus); + record_sub.DataStatus = dataStatus; + record.SubList.Add(record_sub); + recordList.Add(record); + } + } + receive(recordList); + } + + if (ConfigHelper.SupportOld) + { + OldTransferHelper.Transfer(middleList); + } + + if (appParas.Src) + { + SrcHelper.Src(bytes); + } + if (appParas.Debug) + { + DebugHelper.Debug(middleList); + } + } + + + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/IStation.DataDockingSocket.SZJT_SZY1.csproj b/IStation.DataDockingSocket.SZJT_SZY1/IStation.DataDockingSocket.SZJT_SZY1.csproj new file mode 100644 index 0000000..1be3c56 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/IStation.DataDockingSocket.SZJT_SZY1.csproj @@ -0,0 +1,24 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net6.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>disable</Nullable> + </PropertyGroup> + + <ItemGroup> + <None Remove="paras_datadocking_socket_szjt_szy1.json" /> + </ItemGroup> + + <ItemGroup> + <Content Include="paras_datadocking_socket_szjt_szy1.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Yw.IDataDockingSocket.Core" Version="3.0.1" /> + <PackageReference Include="Yw.Quartz.Core" Version="3.0.0" /> + </ItemGroup> + +</Project> diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/Middle/MiddleRecord.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/Middle/MiddleRecord.cs new file mode 100644 index 0000000..65fbe0b --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/Middle/MiddleRecord.cs @@ -0,0 +1,23 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// + /// </summary> + internal class MiddleRecord + { + /// <summary> + /// 鏍囧織id + /// </summary> + public string SignId { get; set; } + + /// <summary> + /// 鏁版嵁鏃堕棿 + /// </summary> + public DateTime DataTime { get; set; } + + /// <summary> + /// 鏁版嵁鍊� + /// </summary> + public string DataValue { get; set; } + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewResult.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewResult.cs new file mode 100644 index 0000000..44bdd5c --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewResult.cs @@ -0,0 +1,38 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// + /// </summary> + public class NewResult + { + /// <summary> + /// 鐘舵�佺爜 + /// </summary> + public int Code { get; set; } + + /// <summary> + /// 閿欒鐮� + /// </summary> + public object Error { get; set; } + + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public object Message { get; set; } + + /// <summary> + /// 鏁版嵁 + /// </summary> + public bool Data { get; set; } + + /// <summary> + /// 闄勫姞鏁版嵁 + /// </summary> + public object Extras { get; set; } + + /// <summary> + /// 鏃堕棿鎴� + /// </summary> + public DateTime Timestamp { get; set; } + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardModel.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardModel.cs new file mode 100644 index 0000000..e8640b1 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardModel.cs @@ -0,0 +1,22 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// + /// </summary> + public class NewStandardModel + { + + /// <summary> + /// 娉ㄥ唽鐮� + /// </summary> + public string RegisterCode { get; set; } + + /// <summary> + /// 璁板綍鍒楄〃 + /// </summary> + public List<NewStandardRecord> RecordList { get; set; } + + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardRecord.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardRecord.cs new file mode 100644 index 0000000..ecd093c --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardRecord.cs @@ -0,0 +1,25 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鏁版嵁瀵规帴鏍囧噯璁板綍dto + /// </summary> + public class NewStandardRecord + { + + /// <summary> + /// 浼犺緭id + /// </summary> + public string TransferId { get; set; } + + /// <summary> + /// 鍘熷鏃堕棿 + /// </summary> + public DateTime SrcTime { get; set; } + + /// <summary> + /// 瀛愰」鍒楄〃 + /// </summary> + public List<NewStandardSubRecord> SubList { get; set; } + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardSubRecord.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardSubRecord.cs new file mode 100644 index 0000000..4363658 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/New/NewStandardSubRecord.cs @@ -0,0 +1,26 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鏁版嵁鏍囧噯瀵规帴瀛愯褰昫to + /// </summary> + public class NewStandardSubRecord + { + + /// <summary> + /// 浼犺緭id + /// </summary> + public string TransferId { get; set; } + + /// <summary> + /// 鍘熷鍊� + /// </summary> + public string SrcValue { get; set; } + + /// <summary> + /// 鏁版嵁鐘舵�� + /// </summary> + public List<string> DataStatus { get; set; } + + } + +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldResult.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldResult.cs new file mode 100644 index 0000000..092f0ac --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldResult.cs @@ -0,0 +1,23 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// + /// </summary> + public class OldResult + { + /// <summary> + /// 鐘舵�佷俊鎭� + /// </summary> + public int Code { get; set; } + + /// <summary> + /// 鎻愮ず淇℃伅 + /// </summary> + public string Message { get; set; } + + /// <summary> + /// + /// </summary> + public bool Data { get; set; } + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardModel.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardModel.cs new file mode 100644 index 0000000..bbdfa3c --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardModel.cs @@ -0,0 +1,22 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// + /// </summary> + public class OldStandardModel + { + + /// <summary> + /// 娉ㄥ唽鐮� + /// </summary> + public string RegisterCode { get; set; } + + /// <summary> + /// 璁板綍鍒楄〃 + /// </summary> + public List<OldStandardRecord> Records { get; set; } + + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardRecord.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardRecord.cs new file mode 100644 index 0000000..68e717e --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardRecord.cs @@ -0,0 +1,30 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鏁版嵁瀵规帴鏍囧噯璁板綍dto + /// </summary> + public class OldStandardRecord + { + + /// <summary> + /// 璁板綍鏍囪瘑 + /// </summary> + public string RecordId { get; set; } + + /// <summary> + /// 璁板綍绫诲瀷 + /// </summary> + public int RecordType { get; set; } + + /// <summary> + /// 璁板綍鏃堕棿 + /// </summary> + public DateTime RecordTime { get; set; } + + /// <summary> + /// 璁板綍鍊� + /// </summary> + public string RecordValue { get; set; } + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardSubRecord.cs b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardSubRecord.cs new file mode 100644 index 0000000..e439383 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/Model/Old/OldStandardSubRecord.cs @@ -0,0 +1,21 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鏁版嵁鏍囧噯瀵规帴瀛愯褰昫to + /// </summary> + public class OldStandardSubRecord + { + + /// <summary> + /// 瀛愯褰昳d + /// </summary> + public string RecordId { get; set; } + + /// <summary> + /// 瀛愯褰曞�� + /// </summary> + public string RecordValue { get; set; } + + } + +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/helper/ConfigHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/helper/ConfigHelper.cs new file mode 100644 index 0000000..7d39578 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/helper/ConfigHelper.cs @@ -0,0 +1,45 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 閰嶇疆鏂囦欢杈呭姪绫� + /// </summary> + internal class ConfigHelper + { + + /// <summary> + /// 鏃ф敞鍐岀爜 + /// </summary> + public static string OldRegisterCode + { + get + { + return AppParasHelper.Get().OldTransfer.RegisterCode; + } + } + + /// <summary> + /// 鏃т紶杈揢rl + /// </summary> + public static string OldTransferUrl + { + get + { + return AppParasHelper.Get().OldTransfer.TransferUrl; + } + } + + /// <summary> + /// 鏄惁鏀寔 + /// </summary> + public static bool SupportOld + { + get + { + return AppParasHelper.Get().SupportOld; + } + } + + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/helper/DebugHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/helper/DebugHelper.cs new file mode 100644 index 0000000..de4a52e --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/helper/DebugHelper.cs @@ -0,0 +1,42 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鐢熸垚璋冭瘯淇℃伅杈呭姪绫� + /// </summary> + internal class DebugHelper + { + private const string _logName = "socket-szjt-szy1-debug"; + + /// <summary> + /// 鐢熸垚 + /// </summary> + public static void Debug(List<MiddleRecord> list) + { + if (list == null || list.Count < 1) + { + return; + } + var debug_list = new List<Yw.Model.MonitorDataDockingDebugRecord>(); + foreach (var record in list) + { + var debug_item = new Yw.Model.MonitorDataDockingDebugRecord(); + debug_item.TransferId = record.SignId; + debug_item.SrcTime = record.DataTime.ToString("yyyy-MM-dd HH:mm:ss"); + debug_item.SubList.Add(new Yw.Model.MonitorDataDockingDebugSubRecord() + { + TransferId = "", + SrcValue = record.DataValue + }); + + debug_list.Add(debug_item); + } + + if (debug_list != null && debug_list.Count > 0) + { + var json = JsonHelper.Object2Json(debug_list); + LogHelper.Custom(_logName, json); + } + } + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/helper/HandleDataHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/helper/HandleDataHelper.cs new file mode 100644 index 0000000..a201a5e --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/helper/HandleDataHelper.cs @@ -0,0 +1,92 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 澶勭悊鏁版嵁杈呭姪绫� + /// </summary> + internal class HandleDataHelper + { + /// <summary> + /// 澶勭悊鏁版嵁 + /// </summary> + public static List<MiddleRecord> HandleData + ( + InstructionItem item, + byte[] bts + ) + { + var list = new List<MiddleRecord>(); + + //灏嗘寚浠よ浆鍖栦负瀛楄妭鏁扮粍 + var instrution_bts = BitTransfer.FromString(item.Instruction); + //璇锋眰鏁版嵁鐨勭储寮曞櫒浣嶇疆 浠�0寮�濮� + var startIndex = instrution_bts[2] * 16 * 16 + instrution_bts[3]; + + foreach (var x in item.RuleItems) + { + var record = new MiddleRecord(); + record.SignId = x.SignId; + record.DataTime = DateTime.Now; + record.DataValue = null; + + var skip = 3 + (x.Index - startIndex - 1) * 2; + switch (x.Rule) + { + case eRule.Float: + { + var btValue = bts.Skip(skip).Take(2 * 2).ToArray(); + var value = CalcuFloat(btValue) * x.Ratio; + record.DataValue = value.ToString(); + } + break; + case eRule.Short: + { + var btValue = bts.Skip(skip).Take(2).ToArray(); + var value = CalcuShort(btValue) * x.Ratio; + record.DataValue = value.ToString(); + } + break; + case eRule.Int: + { + var btValue = bts.Skip(skip).Take(2 * 2).ToArray(); + var value = CalcuInt(btValue) * x.Ratio; + record.DataValue = value.ToString(); + } + break; + default: break; + } + list.Add(record); + } + + return list; + } + + //璁$畻Float + private static float CalcuFloat(byte[] bts) + { + if (bts.Length != 4) + return default; + var rbts = bts.Reverse().ToArray(); + return BitConverter.ToSingle(rbts, 0); + } + + //璁$畻Short + private static short CalcuShort(byte[] bts) + { + if (bts.Length != 2) + return default; + var rbts = bts.Reverse().ToArray(); + return BitConverter.ToInt16(rbts, 0); + } + + //璁$畻Int + private static int CalcuInt(byte[] bts) + { + if (bts.Length != 4) + return default; + var rbts = bts.Reverse().ToArray(); + return BitConverter.ToInt32(rbts, 0); + } + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/helper/OldTransferHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/helper/OldTransferHelper.cs new file mode 100644 index 0000000..e0177d7 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/helper/OldTransferHelper.cs @@ -0,0 +1,41 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// + /// </summary> + internal class OldTransferHelper + { + /// <summary> + /// 浼犺緭 + /// </summary> + /// <param name="middleList"></param> + /// <returns></returns> + public static bool Transfer(List<MiddleRecord> middleList) + { + try + { + if (middleList == null || middleList.Count < 1) + { + return false; + } + var recordList = middleList.Select(x => new OldStandardRecord() { RecordId = x.SignId, RecordType = 0, RecordTime = x.DataTime, RecordValue = x.DataValue }).ToList(); + var model = new OldStandardModel() { RegisterCode = ConfigHelper.OldRegisterCode, Records = recordList }; + var data = JsonHelper.Object2Json(model); + var responseText = HttpRequestHelper.Post(ConfigHelper.OldTransferUrl, data); + var result = JsonHelper.Json2Object<OldResult>(responseText); + if (result.Code != 0) + { + throw new Exception(result.Message); + } + return result.Data; + } + catch (Exception ex) + { + LogHelper.Error(ex.Message); + return false; + } + } + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/helper/SessionHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/helper/SessionHelper.cs new file mode 100644 index 0000000..5755493 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/helper/SessionHelper.cs @@ -0,0 +1,13 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 浼氳瘽杈呭姪绫� + /// </summary> + public class SessionHelper + { + /// <summary> + /// 缂撳瓨 + /// </summary> + public static Yw.Model.IMonitorDataDockingSession Cache { get; set; } + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/helper/SrcHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/helper/SrcHelper.cs new file mode 100644 index 0000000..dcdf3c5 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/helper/SrcHelper.cs @@ -0,0 +1,22 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鐢熸垚鍘熷淇℃伅杈呭姪绫� + /// </summary> + internal class SrcHelper + { + private const string _logName = "socket-szjt-szy1-src"; + + /// <summary> + /// 鐢熸垚 + /// </summary> + public static void Src(byte[] bts) + { + if (bts == null || bts.Length < 1) + return; + var message = BitTransfer.ToString(bts); + LogHelper.Custom(_logName, message); + } + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJob.cs b/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJob.cs new file mode 100644 index 0000000..b690835 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJob.cs @@ -0,0 +1,40 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鍙戦�佹寚浠や换鍔� + /// </summary> + [DisallowConcurrentExecution]//姝ょ壒鎬ф爣璇� 蹇呴』绛夊緟杩欐浠诲姟鎵ц瀹屾垚鍚庯紝鎵嶈兘鎵ц涓嬫浠诲姟 + public class SendInstructionJob : IJob + { + internal const string Session = "Session";//浼氳瘽瀛楃 + internal const string Instruction = "Instruction";//鎸囦护瀛楃 + + public async Task Execute(IJobExecutionContext context) + { + try + { + await Task.Run(() => + { + var dataMap = context.MergedJobDataMap; + var bytes = (byte[])dataMap[Instruction]; + if (bytes == null) + return; + var session = (Yw.Model.IMonitorDataDockingSession)dataMap[Session]; + if (session == null) + return; + if (session.IsConnected) + { + SessionHelper.Cache.Send(bytes, 0, bytes.Length); + LogHelper.Info(session.SessionName + ":" + BitConverter.ToString(bytes) + ", 鍙戦�佷竴鏉¤姹傛暟鎹寚浠�"); + } + + }); + } + catch (Exception ex) + { + var e = new JobExecutionException(ex); + throw e; + } + } + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobHelper.cs new file mode 100644 index 0000000..933862b --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobHelper.cs @@ -0,0 +1,100 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// Modbus杈呭姪绫� + /// </summary> + public class SendInstructionJobHelper + { + private static IScheduler _sched;//璋冨害鍣� + + /// <summary> + /// 寮�濮嬩换鍔� + /// </summary> + public static async void StartJob(Yw.Model.IMonitorDataDockingSession session, InstructionItem item) + { + if (session == null) + return; + if (!session.IsConnected) + return; + if (item == null) + return; + if (string.IsNullOrEmpty(item.Instruction)) + return; + if (item.RuleItems == null || item.RuleItems.Count < 1) + return; + + LogHelper.Info($"{session.SessionName} 寮�濮嬪鐞嗗彂閫佹寚浠や换鍔★紝鎸囦护:{item.Instruction} !"); + + var jobName = SendInstructionJobNameHelper.GetJobName(session, item.Instruction); + var jobGroupName = SendInstructionJobNameHelper.GetJobGroupName(session, item.Instruction); + var triggerName = SendInstructionJobNameHelper.GetTriggerName(session, item.Instruction); + + //鍒ゆ柇鏄惁瀛樺湪 + if (_sched != null) + { + var triggerKey = new TriggerKey(triggerName, jobGroupName); + if (await _sched.CheckExists(triggerKey)) + { + LogHelper.Info($"{session.SessionName} 涓紝鎸囦护锛歿item.Instruction} 鐨勪富鍔ㄨ姹傛暟鎹换鍔″凡缁忓紑鍚紝鏃犻渶閲嶅寮�鍚紒"); + return; + } + } + + //鍒ゆ柇鏄惁寮�鍚皟鍙栧櫒 + if (_sched == null) + { + // 1.鍒涘缓scheduler鐨勫紩鐢� + var fac = new Quartz.Impl.StdSchedulerFactory(); + _sched = await fac.GetScheduler(); + + //2.鍚姩 scheduler + await _sched.Start(); + } + + //3.鍒涘缓浠诲姟 + var job = JobBuilder.Create<SendInstructionJob>() + .WithIdentity(jobName, jobGroupName) + .Build(); + job.JobDataMap.Put(SendInstructionJob.Session, session); + job.JobDataMap.Put(SendInstructionJob.Instruction, BitTransfer.FromString(item.Instruction)); + + //4.鍒涘缓Trigger + var trigger = TriggerBuilder.Create() + .WithIdentity(triggerName, jobGroupName) + .WithSimpleSchedule(x => x.WithIntervalInSeconds(item.Frequency).RepeatForever() + .WithMisfireHandlingInstructionNextWithRemainingCount()) + .Build(); + + //5.鍔犲叆璋冨害绠$悊鍣� + await _sched.ScheduleJob(job, trigger); + session.SessionClosedEvent += () => CancelJob(session, item.Instruction); + LogHelper.Info($"{session.SessionName} 涓紝鎸囦护:{item.Instruction} 鐨勪富鍔ㄨ姹傛暟鎹嚎绋嬪紑鍚垚鍔燂紒"); + } + + /// <summary> + /// 鍙栨秷浠诲姟 + /// </summary> + private static async void CancelJob(Yw.Model.IMonitorDataDockingSession session, string instruction) + { + if (_sched == null) + return; + LogHelper.Info($"{session.SessionName} 姝f墦绠楃粓姝富鍔ㄨ姹傛暟鎹换鍔�"); + var triggerName = SendInstructionJobNameHelper.GetTriggerName(session, instruction); + var jobGroupName = SendInstructionJobNameHelper.GetJobGroupName(session, instruction); + var triggerKey = new TriggerKey(triggerName, jobGroupName); + if (await _sched.CheckExists(triggerKey)) + { + await _sched.UnscheduleJob(triggerKey); + LogHelper.Info($"{session.SessionName},鎸囦护:{instruction} 涓诲姩璇锋眰鏁版嵁浠诲姟缁堟鎴愬姛"); + } + else + { + LogHelper.Info($"{session.SessionName},鎸囦护:{instruction} 涓诲姩璇锋眰鏁版嵁浠诲姟涓嶅瓨鍦�"); + } + } + + + + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobNameHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobNameHelper.cs new file mode 100644 index 0000000..81e326a --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/instruction/SendInstructionJobNameHelper.cs @@ -0,0 +1,40 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// 鍙戦�佹寚浠や换鍔″悕绉拌緟鍔╃被 + /// </summary> + public class SendInstructionJobNameHelper + { + private const string _jobNameHeader = "SZJT_TenSendInstructionJob"; + private const string _jobGroupHeader = "SZJT_TenSendInstructionJobGroup"; + private const string _triggerNameHeader = "SZJT_TenSendInstructionJobTrigger"; + + /// <summary> + /// 鑾峰彇浠诲姟鍚嶇О + /// </summary> + public static string GetJobName(Yw.Model.IMonitorDataDockingSession session, string instructioon) + { + var jobName = $"{_jobNameHeader}_{session.RegisterCode}_{session.SessionID}_{instructioon}"; + return jobName; + } + + /// <summary> + /// 鑾峰彇浠诲姟缁勫悕绉� + /// </summary> + public static string GetJobGroupName(Yw.Model.IMonitorDataDockingSession session, string instructioon) + { + var jobGroup = $"{_jobGroupHeader}_{session.RegisterCode}_{session.SessionID}_{instructioon}"; + return jobGroup; + } + + /// <summary> + /// 鑾峰彇瑙﹀彂鍣ㄥ悕绉� + /// </summary> + public static string GetTriggerName(Yw.Model.IMonitorDataDockingSession session, string instructioon) + { + var triggerName = $"{_triggerNameHeader}_{session.RegisterCode}_{session.SessionID}_{instructioon}"; + return triggerName; + } + + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/paras/AppParas.cs b/IStation.DataDockingSocket.SZJT_SZY1/paras/AppParas.cs new file mode 100644 index 0000000..82e321f --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/paras/AppParas.cs @@ -0,0 +1,176 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// app鍙傛暟锛堝彲閰嶅埗锛� + /// </summary> + public class AppParas + { + /// <summary> + /// 鎸囦护鍙戦�侀棿闅� + /// </summary> + public int InstructionSendSpace { get; set; } + + /// <summary> + /// 鎸囦护椤瑰垪琛� + /// </summary> + public List<InstructionItem> InstructionItems { get; set; } + + /// <summary> + /// 鏃т紶杈� + /// </summary> + public Transfer OldTransfer { get; set; } + + /// <summary> + /// 鏀寔鏃� + /// </summary> + public bool SupportOld { get; set; } + + /// <summary> + /// 鏄惁淇濆瓨鍘熷 + /// </summary> + public bool Src { get; set; } + + /// <summary> + /// 鏄惁璋冭瘯 + /// </summary> + public bool Debug { get; set; } + + /// <summary> + /// 楠岃瘉ModbusRtu 鍗忚 + /// </summary> + public static bool Verify(byte[] bts) + { + if (bts == null) + return default; + if (bts.Length < 6) + return false; + if (bts.Length - 5 != bts[2]) + return false; + if (!ModBusRtuHelper.CheckReceivedMessage(bts)) + return false; + return true; + } + + } + + + + /// <summary> + /// 瑙f瀽瑙勫垯鏋氫妇 + /// </summary> + public enum eRule + { + /// <summary> + /// 涓や釜瀛楄妭涓轰竴缁勶紝涓ょ粍琛ㄧず涓�涓暟鎹紝閫氳繃寰楀埌鐨勫洓涓瓧鑺傚弽杞悗锛孊itConvert.Single()鑾峰彇鍊� + /// </summary> + [Display(Name = "鍙屽瓧瑙f瀽涓烘诞鐐规暟", Description = "鍙屽瓧瑙f瀽涓烘诞鐐规暟 ")] + Float = 1, + + /// <summary> + /// 涓や釜瀛楄妭琛ㄧず涓�涓暣鏁板�硷紝閫氳繃寰楀埌鐨�2涓瓧鑺傚弽杞悗锛孊itConvert.ToInt16()鑾峰彇鍊� + /// </summary> + [Display(Name = "鍗曞瓧瑙f瀽涓烘暣鏁�", Description = "鍗曞瓧琛ㄧず涓�涓暣鏁板��")] + Short = 2, + + /// <summary> + /// 涓や釜瀛楄妭涓轰竴缁勶紝涓ょ粍琛ㄧず涓�涓暟鎹紝閫氳繃寰楀埌鐨勫洓涓瓧鑺傚弽杞悗锛孊itConverter.ToInt32();鑾峰彇鍊� + /// </summary> + [Display(Name = "鍙屽瓧瑙f瀽涓烘暣鏁�", Description = "鍙屽瓧琛ㄧず涓�涓暣鏁板��")] + Int = 3, + } + + /// <summary> + /// 瑙f瀽椤� + /// </summary> + public class RuleItem + { + /// <summary> + /// 鏍囪鏍囪瘑 + /// </summary> + public string SignId { get; set; } + + /// <summary> + /// 绱㈠紩 浠�1寮�濮� + /// </summary> + public int Index { get; set; } + + /// <summary> + /// 绯绘暟 + /// </summary> + public double Ratio { get; set; } + + /// <summary> + /// 瑙f瀽瑙勫垯 + /// </summary> + public eRule Rule { get; set; } + + } + + /// <summary> + /// 鎸囦护椤� + /// </summary> + public class InstructionItem + { + /// <summary> + /// 鎸囦护 + /// </summary> + public string Instruction { get; set; } + + /// <summary> + /// 鎸囦护鍙戦�侀鐜� 绉� + /// </summary> + public int Frequency { get; set; } + + /// <summary> + /// 瑙f瀽椤� + /// </summary> + public List<RuleItem> RuleItems { get; set; } + + /// <summary> + /// 楠岃瘉 + /// </summary> + public bool Verify(byte[] bts) + { + if (bts == null) + return default; + if (bts.Length < 6) + return false; + if (bts.Length - 5 != bts[2]) + return false; + if (string.IsNullOrEmpty(this.Instruction)) + return default; + + var instruction = BitTransfer.FromString(this.Instruction); + if (bts[0] == instruction[0]) + { + if (bts[1] == instruction[1]) + { + //璇锋眰鐨勬暟鎹瓧鑺傛暟閲� + var requestDataCount = BitConverter.ToInt16(instruction.Skip(4).Take(2).Reverse().ToArray(), 0) * 2; + if (requestDataCount == bts[2]) + { + return true; + } + } + } + return default; + } + + } + + /// <summary> + /// 浼犺緭 + /// </summary> + public class Transfer + { + /// <summary> + /// 娉ㄥ唽鐮� + /// </summary> + public string RegisterCode { get; set; } + + /// <summary> + /// 浼犺緭Url + /// </summary> + public string TransferUrl { get; set; } + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/paras/AppParasHelper.cs b/IStation.DataDockingSocket.SZJT_SZY1/paras/AppParasHelper.cs new file mode 100644 index 0000000..c969ed9 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/paras/AppParasHelper.cs @@ -0,0 +1,39 @@ +锘縩amespace IStation.DataDockingSocket +{ + /// <summary> + /// app 鍙傛暟杈呭姪绫� + /// </summary> + internal class AppParasHelper + { + /// <summary> + /// json鏂囦欢鍚嶇О + /// </summary> + public static string JsonFileName + { + get + { + if (string.IsNullOrEmpty(_jsonFileName)) + { + _jsonFileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "paras_datadocking_socket_szjt_szy1.json"); + } + return _jsonFileName; + } + } + private static string _jsonFileName = null; + + /// <summary> + /// 鑾峰彇 + /// </summary> + /// <returns></returns> + public static AppParas Get() + { + if (_appparas == null) + { + var json = File.ReadAllText(JsonFileName); + _appparas = JsonHelper.Json2Object<AppParas>(json); + } + return _appparas; + } + private static AppParas _appparas = null; + } +} diff --git a/IStation.DataDockingSocket.SZJT_SZY1/paras_datadocking_socket_szjt_szy1.json b/IStation.DataDockingSocket.SZJT_SZY1/paras_datadocking_socket_szjt_szy1.json new file mode 100644 index 0000000..923e7e5 --- /dev/null +++ b/IStation.DataDockingSocket.SZJT_SZY1/paras_datadocking_socket_szjt_szy1.json @@ -0,0 +1,42 @@ +{ + "InstructionSendSpace": 10, + "InstructionItems": [ + { + "Instruction": "01-03-01-82-00-08-E5-D8", + "Frequency": 60, + "RuleItems": [ + { + "SignId": "szy1_387", + "Index": 387, + "Ratio": 1, + "Rule": 1 + }, + { + "SignId": "szy1_389", + "Index": 389, + "Ratio": 1, + "Rule": 1 + }, + { + "SignId": "szy1_391", + "Index": 391, + "Ratio": 1, + "Rule": 1 + }, + { + "SignId": "szy1_393", + "Index": 393, + "Ratio": 1, + "Rule": 1 + } + ] + } + ], + "OldTransfer": { + "RegisterCode": "@@@863293051622816", + "TransferUrl": "http://172.19.69.11:9019/Run/DataDocking/Standard/Insert@V1.0" + }, + "SupportOld": true, + "Debug": true, + "Src": true +} diff --git a/IStation.TopShelf.DataDocking4Socket/IStation.TopShelf.DataDocking4Socket.csproj.user b/IStation.TopShelf.DataDocking4Socket/IStation.TopShelf.DataDocking4Socket.csproj.user new file mode 100644 index 0000000..aaa695c --- /dev/null +++ b/IStation.TopShelf.DataDocking4Socket/IStation.TopShelf.DataDocking4Socket.csproj.user @@ -0,0 +1,6 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <_LastSelectedProfileId>D:\WorkData\git\istation\szjt\IStation.TopShelf.DataDocking4Socket\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId> + </PropertyGroup> +</Project> \ No newline at end of file diff --git a/IStation.TopShelf.DataDocking4Socket/Properties/PublishProfiles/FolderProfile.pubxml.user b/IStation.TopShelf.DataDocking4Socket/Properties/PublishProfiles/FolderProfile.pubxml.user index 8db93aa..9e47b0e 100644 --- a/IStation.TopShelf.DataDocking4Socket/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/IStation.TopShelf.DataDocking4Socket/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -4,7 +4,7 @@ --> <Project> <PropertyGroup> - <History>True|2024-11-11T08:07:57.2232009Z;True|2024-05-16T13:56:47.8204382+08:00;True|2024-05-09T16:59:48.1703915+08:00;False|2024-05-09T16:54:48.1914196+08:00;True|2024-04-04T11:53:15.6689438+08:00;False|2024-04-04T11:52:41.3417899+08:00;False|2024-04-04T11:50:18.0958240+08:00;True|2023-12-26T12:15:34.2479140+08:00;True|2023-12-26T12:15:13.2347981+08:00;True|2023-12-12T20:07:12.6576370+08:00;True|2022-12-01T15:20:13.0180741+08:00;True|2022-12-01T13:30:29.6610607+08:00;True|2022-12-01T13:10:00.6718954+08:00;True|2022-11-30T16:12:46.0669167+08:00;True|2022-11-30T16:11:46.8013058+08:00;True|2022-11-18T17:16:08.2357388+08:00;True|2022-11-18T17:10:16.7111998+08:00;True|2022-11-18T17:04:10.5678845+08:00;True|2022-11-18T17:01:48.4283015+08:00;True|2022-11-18T16:52:07.1424550+08:00;True|2022-11-07T14:19:02.7595787+08:00;True|2022-11-07T14:16:18.9629209+08:00;True|2022-11-07T14:10:58.7927593+08:00;True|2022-11-07T13:40:15.7710087+08:00;True|2022-11-04T10:51:31.2128411+08:00;True|2022-11-04T10:50:48.9390883+08:00;False|2022-11-04T10:45:25.5349335+08:00;False|2022-11-04T10:38:09.7881861+08:00;False|2022-11-04T10:32:57.3163779+08:00;True|2022-10-31T13:50:19.2799744+08:00;True|2022-10-28T18:12:41.9095520+08:00;True|2022-10-28T15:43:16.2950292+08:00;True|2022-10-28T15:41:52.2233941+08:00;True|2022-10-28T15:30:14.2215199+08:00;True|2022-10-28T11:51:16.0785196+08:00;True|2022-10-28T11:44:51.8315664+08:00;True|2022-10-28T10:33:52.2698494+08:00;True|2022-10-28T09:35:47.1875028+08:00;True|2022-10-28T09:10:26.0008427+08:00;True|2022-10-27T18:39:24.9534804+08:00;True|2022-10-27T18:33:34.4681116+08:00;True|2022-10-27T18:13:21.7875951+08:00;True|2022-10-27T18:12:44.3890244+08:00;True|2022-10-27T18:07:26.1755739+08:00;True|2022-10-27T17:57:58.0347320+08:00;True|2022-10-27T17:34:58.8259465+08:00;True|2022-10-27T17:22:06.3154634+08:00;False|2022-10-27T17:20:19.9004059+08:00;True|2022-10-27T17:18:10.4716763+08:00;True|2022-10-27T17:05:00.4099257+08:00;True|2022-10-27T16:54:07.3727699+08:00;True|2022-10-27T16:42:08.7868428+08:00;True|2022-10-27T16:20:40.9187590+08:00;True|2022-10-27T16:15:48.8887876+08:00;True|2022-10-27T15:32:23.6326778+08:00;True|2022-10-27T15:31:21.2898598+08:00;True|2022-10-27T15:31:06.9752171+08:00;True|2022-10-27T15:30:12.3351290+08:00;True|2022-10-27T15:16:06.6376480+08:00;True|2022-10-27T15:04:16.6181644+08:00;True|2022-10-27T14:56:07.3371453+08:00;True|2022-10-27T14:55:40.9994920+08:00;True|2022-10-26T14:21:13.7358061+08:00;True|2022-10-26T13:58:17.8518712+08:00;True|2022-10-26T10:50:57.8305616+08:00;True|2022-10-26T10:41:24.0512951+08:00;True|2022-10-26T10:36:18.9669938+08:00;True|2022-10-26T10:23:42.5700603+08:00;True|2022-10-26T09:49:18.1242267+08:00;True|2022-10-24T17:44:25.5039390+08:00;True|2022-07-02T00:06:16.6338790+08:00;True|2022-07-02T00:02:49.1000053+08:00;True|2022-07-01T23:23:53.1924783+08:00;True|2022-07-01T14:02:38.1190102+08:00;True|2022-07-01T13:55:33.4591108+08:00;</History> + <History>True|2024-11-19T02:44:43.1147974Z;True|2024-11-11T16:07:57.2232009+08:00;True|2024-05-16T13:56:47.8204382+08:00;True|2024-05-09T16:59:48.1703915+08:00;False|2024-05-09T16:54:48.1914196+08:00;True|2024-04-04T11:53:15.6689438+08:00;False|2024-04-04T11:52:41.3417899+08:00;False|2024-04-04T11:50:18.0958240+08:00;True|2023-12-26T12:15:34.2479140+08:00;True|2023-12-26T12:15:13.2347981+08:00;True|2023-12-12T20:07:12.6576370+08:00;True|2022-12-01T15:20:13.0180741+08:00;True|2022-12-01T13:30:29.6610607+08:00;True|2022-12-01T13:10:00.6718954+08:00;True|2022-11-30T16:12:46.0669167+08:00;True|2022-11-30T16:11:46.8013058+08:00;True|2022-11-18T17:16:08.2357388+08:00;True|2022-11-18T17:10:16.7111998+08:00;True|2022-11-18T17:04:10.5678845+08:00;True|2022-11-18T17:01:48.4283015+08:00;True|2022-11-18T16:52:07.1424550+08:00;True|2022-11-07T14:19:02.7595787+08:00;True|2022-11-07T14:16:18.9629209+08:00;True|2022-11-07T14:10:58.7927593+08:00;True|2022-11-07T13:40:15.7710087+08:00;True|2022-11-04T10:51:31.2128411+08:00;True|2022-11-04T10:50:48.9390883+08:00;False|2022-11-04T10:45:25.5349335+08:00;False|2022-11-04T10:38:09.7881861+08:00;False|2022-11-04T10:32:57.3163779+08:00;True|2022-10-31T13:50:19.2799744+08:00;True|2022-10-28T18:12:41.9095520+08:00;True|2022-10-28T15:43:16.2950292+08:00;True|2022-10-28T15:41:52.2233941+08:00;True|2022-10-28T15:30:14.2215199+08:00;True|2022-10-28T11:51:16.0785196+08:00;True|2022-10-28T11:44:51.8315664+08:00;True|2022-10-28T10:33:52.2698494+08:00;True|2022-10-28T09:35:47.1875028+08:00;True|2022-10-28T09:10:26.0008427+08:00;True|2022-10-27T18:39:24.9534804+08:00;True|2022-10-27T18:33:34.4681116+08:00;True|2022-10-27T18:13:21.7875951+08:00;True|2022-10-27T18:12:44.3890244+08:00;True|2022-10-27T18:07:26.1755739+08:00;True|2022-10-27T17:57:58.0347320+08:00;True|2022-10-27T17:34:58.8259465+08:00;True|2022-10-27T17:22:06.3154634+08:00;False|2022-10-27T17:20:19.9004059+08:00;True|2022-10-27T17:18:10.4716763+08:00;True|2022-10-27T17:05:00.4099257+08:00;True|2022-10-27T16:54:07.3727699+08:00;True|2022-10-27T16:42:08.7868428+08:00;True|2022-10-27T16:20:40.9187590+08:00;True|2022-10-27T16:15:48.8887876+08:00;True|2022-10-27T15:32:23.6326778+08:00;True|2022-10-27T15:31:21.2898598+08:00;True|2022-10-27T15:31:06.9752171+08:00;True|2022-10-27T15:30:12.3351290+08:00;True|2022-10-27T15:16:06.6376480+08:00;True|2022-10-27T15:04:16.6181644+08:00;True|2022-10-27T14:56:07.3371453+08:00;True|2022-10-27T14:55:40.9994920+08:00;True|2022-10-26T14:21:13.7358061+08:00;True|2022-10-26T13:58:17.8518712+08:00;True|2022-10-26T10:50:57.8305616+08:00;True|2022-10-26T10:41:24.0512951+08:00;True|2022-10-26T10:36:18.9669938+08:00;True|2022-10-26T10:23:42.5700603+08:00;True|2022-10-26T09:49:18.1242267+08:00;True|2022-10-24T17:44:25.5039390+08:00;True|2022-07-02T00:06:16.6338790+08:00;True|2022-07-02T00:02:49.1000053+08:00;True|2022-07-01T23:23:53.1924783+08:00;True|2022-07-01T14:02:38.1190102+08:00;True|2022-07-01T13:55:33.4591108+08:00;</History> <LastFailureDetails /> </PropertyGroup> </Project> \ No newline at end of file -- Gitblit v1.9.3