Compare commits

...

7 Commits
2.0.0 ... 2.0.2

Author SHA1 Message Date
Kimdiego2098
b1b9e51ab6 报警/历史值查询时区转换 2023-08-08 09:05:15 +08:00
Kimdiego2098
e49d4770ac 时间最小最大值时不再转换时区 2023-08-08 08:39:20 +08:00
Kimdiego2098
8fa1075511 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-08-08 08:28:37 +08:00
Kimdiego2098
9a70169b94 默认不启用单用户登录 2023-08-08 08:28:27 +08:00
Diego2098
fefb928237 更新文档 2023-08-07 22:31:51 +08:00
Diego2098
ad7e700d0d 去除DateTimeOffset类型 2023-08-07 22:30:38 +08:00
Kimdiego2098
1699c69147 更新文档 2023-08-07 17:38:53 +08:00
117 changed files with 558 additions and 487 deletions

View File

@@ -22,7 +22,7 @@ public class LoginOpenApiEvent
/// <summary>
/// 时间
/// </summary>
public DateTimeOffset DateTimeOffset = SysDateTimeExtensions.CurrentDateTime;
public DateTime DateTime = SysDateTimeExtensions.CurrentDateTime;
/// <summary>
/// 登录设备

View File

@@ -41,7 +41,7 @@ public class OpenApiAuthEventSubscriber : IEventSubscriber, ISingleton
openApiUser.LastLoginTime = openApiUser.LatestLoginTime;
openApiUser.LatestLoginDevice = loginEvent.Device.ToString();
openApiUser.LatestLoginIp = loginEvent.Ip;
openApiUser.LatestLoginTime = loginEvent.DateTimeOffset;
openApiUser.LatestLoginTime = loginEvent.DateTime;
#endregion ,

View File

@@ -135,7 +135,7 @@ public class OpenApiAuthService : IOpenApiAuthService, ITransient
{
//获取verificat列表
List<VerificatInfo> verificatInfos = await GetVerificatInfos(loginEvent.OpenApiUser.Id);
var verificatTimeout = loginEvent.DateTimeOffset.AddMinutes(loginEvent.Expire);
var verificatTimeout = loginEvent.DateTime.AddMinutes(loginEvent.Expire);
//生成verificat信息
var verificatInfo = new VerificatInfo
{

View File

@@ -40,7 +40,7 @@ public class OpenApiSessionOutput : PrimaryKeyEntity
///</summary>
[Description("最新登录时间")]
[DataTable(Order = 3, IsShow = true, Sortable = true)]
public DateTimeOffset? LatestLoginTime { get; set; }
public DateTime? LatestLoginTime { get; set; }
/// <summary>
/// 令牌数量

View File

@@ -77,7 +77,7 @@
"Id": "22222222222232",
"Category": "SYS_CONFIGBASEDEFAULT",
"ConfigKey": "CONFIG_SINGLE_OPEN",
"ConfigValue": "true",
"ConfigValue": "false",
"Remark": "单用户登录开关",
"SortCode": "10",
"IsDelete": "false"

View File

@@ -42,7 +42,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton
sysUser.LastLoginTime = sysUser.LatestLoginTime;
sysUser.LatestLoginDevice = loginEvent.Device.ToString();
sysUser.LatestLoginIp = loginEvent.Ip;
sysUser.LatestLoginTime = loginEvent.DateTimeOffset;
sysUser.LatestLoginTime = loginEvent.DateTime;
#endregion ,

View File

@@ -202,7 +202,7 @@ public class AuthService : IAuthService
{
//获取verificat列表
List<VerificatInfo> verificatInfos = await _verificatService.GetVerificatIdAsync(loginEvent.SysUser.Id);
var verificatTimeout = loginEvent.DateTimeOffset.AddMinutes(loginEvent.Expire);
var verificatTimeout = loginEvent.DateTime.AddMinutes(loginEvent.Expire);
//生成verificat信息
var verificatInfo = new VerificatInfo
{

View File

@@ -22,7 +22,7 @@ public class LoginEvent
/// <summary>
/// 时间
/// </summary>
public DateTimeOffset DateTimeOffset = SysDateTimeExtensions.CurrentDateTime;
public DateTime DateTime = SysDateTimeExtensions.CurrentDateTime;
/// <summary>
/// 登录设备

View File

@@ -40,7 +40,7 @@ public class SessionOutput : PrimaryKeyEntity
///</summary>
[Description("最新登录时间")]
[DataTable(Order = 4, IsShow = true, Sortable = true)]
public DateTimeOffset? LatestLoginTime { get; set; }
public DateTime? LatestLoginTime { get; set; }
/// <summary>
/// 在线状态

View File

@@ -479,7 +479,7 @@
登录事件参数
</summary>
</member>
<member name="F:ThingsGateway.Admin.Application.LoginOpenApiEvent.DateTimeOffset">
<member name="F:ThingsGateway.Admin.Application.LoginOpenApiEvent.DateTime">
<summary>
时间
</summary>
@@ -1192,7 +1192,7 @@
登录事件参数
</summary>
</member>
<member name="F:ThingsGateway.Admin.Application.LoginEvent.DateTimeOffset">
<member name="F:ThingsGateway.Admin.Application.LoginEvent.DateTime">
<summary>
时间
</summary>

View File

@@ -294,7 +294,7 @@ public partial class AppDateTimePicker
Value = dateTime;
if (ValueChanged.HasDelegate)
{
await ValueChanged.InvokeAsync(dateTime);
await ValueChanged.InvokeAsync(DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc));
}
}

View File

@@ -189,37 +189,38 @@
}
else
{
if (context?.Value?.GetType() == typeof(DateTimeOffset))
if (ItemColWithDTTemplate!=null)
{
<span>
@(((DateTimeOffset)context.Value).ToOffset(InitTimezone.TimezoneOffset).ToDefaultDateTimeFormat())
</span>
}
else if (context?.Value?.GetType() == typeof(DateTime))
{
<span>
@(((DateTime)context.Value).Add(InitTimezone.TimezoneOffset).ToDefaultDateTimeFormat())
</span>
}
else if (ItemColTemplate != null)
{
@ItemColTemplate(context)
@ItemColWithDTTemplate(context)
}
else
{
@if (context.Header.CellClass?.Contains("text-truncate") == true)
if (context?.Value?.GetType() == typeof(DateTime))
{
<span title=@context.Value>
@context.Value
<span>
@(((DateTime)context.Value).ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset))
</span>
}
else if (ItemColTemplate != null)
{
@ItemColTemplate(context)
}
else
{
@context.Value
}
@if (context.Header.CellClass?.Contains("text-truncate") == true)
{
<span title=@context.Value>
@context.Value
</span>
}
else
{
@context.Value
}
}
}
}
</ItemColContent>

View File

@@ -193,6 +193,13 @@ public partial class AppDataTable<TItem, SearchItem, AddItem, EditItem> : IAppDa
[Parameter]
public RenderFragment<ItemColProps<TItem>> ItemColTemplate { get; set; }
/// <summary>
/// 独立设置 Table Cols 模板需自行实现DateTime类型的时区转换
/// </summary>
[Parameter]
public RenderFragment<ItemColProps<TItem>> ItemColWithDTTemplate { get; set; }
/// <summary>
/// 当前显示项目
/// </summary>
@@ -457,13 +464,9 @@ public partial class AppDataTable<TItem, SearchItem, AddItem, EditItem> : IAppDa
if (item != BlazorResourceConst.DataTableActions)
{
var value = typeof(TItem).GetMemberInfoValue(DetailModel, item);
if (value is DateTimeOffset dt)
if (value is DateTime dt2)
{
value = dt.ToOffset(InitTimezone.TimezoneOffset).ToDefaultDateTimeFormat();
}
else if (value is DateTime dt2)
{
value = dt2.Add(InitTimezone.TimezoneOffset).ToDefaultDateTimeFormat();
value = dt2.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset);
}
keyValuePairs.Add(item, value?.ToString());
}

View File

@@ -66,7 +66,7 @@
Small>
<MRow Class="pt-1">
<MCol Cols="4">
<span class="text-caption">@item.OpTime.ToDefaultDateTimeFormat()</span>
<span class="text-caption">@item.OpTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)</span>
</MCol>
<MCol>
<div class="text-body-1">@item.Name</div>
@@ -93,7 +93,7 @@
Small>
<MRow Class="pt-1">
<MCol Cols="4">
<span class="text-caption">@item.OpTime.ToDefaultDateTimeFormat()</span>
<span class="text-caption">@item.OpTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)</span>
</MCol>
<MCol>
<div class="text-body-1">@item.Name</div>

View File

@@ -148,6 +148,11 @@
获得/设置 Table Cols 模板
</summary>
</member>
<member name="P:ThingsGateway.Admin.Blazor.Core.AppDataTable`4.ItemColWithDTTemplate">
<summary>
独立设置 Table Cols 模板需自行实现DateTime类型的时区转换
</summary>
</member>
<member name="P:ThingsGateway.Admin.Blazor.Core.AppDataTable`4.Items">
<summary>
当前显示项目

View File

@@ -50,7 +50,7 @@ public abstract class BaseEntity : PrimaryKeyEntity
/// </summary>
[SugarColumn(ColumnDescription = "创建时间", IsOnlyIgnoreUpdate = true, IsNullable = true)]
[IgnoreExcel]
public virtual DateTimeOffset? CreateTime { get; set; }
public virtual DateTime? CreateTime { get; set; }
/// <summary>
/// 创建人
@@ -78,7 +78,7 @@ public abstract class BaseEntity : PrimaryKeyEntity
/// </summary>
[SugarColumn(ColumnDescription = "更新时间", IsOnlyIgnoreInsert = true, IsNullable = true)]
[IgnoreExcel]
public virtual DateTimeOffset? UpdateTime { get; set; }
public virtual DateTime? UpdateTime { get; set; }
/// <summary>
/// 更新人

View File

@@ -54,7 +54,7 @@ public class OpenApiUser : BaseEntity
///</summary>
[SugarColumn(ColumnName = "LastLoginTime", ColumnDescription = "上次登录时间", IsNullable = true)]
[DataTable(Order = 10, IsShow = true, Sortable = true, DefaultFilter = true)]
public DateTimeOffset? LastLoginTime { get; set; }
public DateTime? LastLoginTime { get; set; }
/// <summary>
/// 最新登录设备
@@ -75,7 +75,7 @@ public class OpenApiUser : BaseEntity
///</summary>
[SugarColumn(ColumnName = "LatestLoginTime", ColumnDescription = "最新登录时间", IsNullable = true)]
[DataTable(Order = 7, IsShow = true, Sortable = true)]
public DateTimeOffset? LatestLoginTime { get; set; }
public DateTime? LatestLoginTime { get; set; }
/// <summary>
/// 密码

View File

@@ -60,7 +60,7 @@ public class SysUser : BaseEntity
///</summary>
[SugarColumn(ColumnName = "LastLoginTime", ColumnDescription = "上次登录时间", IsNullable = true)]
[DataTable(Order = 5, IsShow = true, Sortable = true, DefaultFilter = true)]
public DateTimeOffset? LastLoginTime { get; set; }
public DateTime? LastLoginTime { get; set; }
/// <summary>
/// 最新登录设备
@@ -81,7 +81,7 @@ public class SysUser : BaseEntity
///</summary>
[SugarColumn(ColumnName = "LatestLoginTime", ColumnDescription = "最新登录时间", IsNullable = true)]
[DataTable(Order = 8, IsShow = true, Sortable = true, DefaultFilter = false)]
public DateTimeOffset? LatestLoginTime { get; set; }
public DateTime? LatestLoginTime { get; set; }
/// <summary>
/// 密码

View File

@@ -100,5 +100,5 @@ public class VerificatInfo : PrimaryIdEntity
/// </summary>
[Description("超时时间")]
[DataTable(Order = 5, IsShow = true, Sortable = true)]
public DateTimeOffset VerificatTimeout { get; set; }
public DateTime VerificatTimeout { get; set; }
}

View File

@@ -75,7 +75,7 @@ public class SysVisitLog : BaseEntity
///</summary>
[SugarColumn(ColumnName = "OpTime", ColumnDescription = "操作时间")]
[DataTable(Order = 8, IsShow = true, Sortable = true, DefaultFilter = false)]
public DateTimeOffset OpTime { get; set; }
public DateTime OpTime { get; set; }
/// <summary>
/// 验证Id

View File

@@ -21,26 +21,39 @@ namespace ThingsGateway.Admin.Core;
public static class SysDateTimeExtensions
{
private static readonly DateTime _dt1970 = new(1970, 1, 1);
private static readonly DateTimeOffset _dto1970 = new(new DateTime(1970, 1, 1));
/// <summary>
/// 系统默认使用的当前时间
/// </summary>
public static DateTimeOffset CurrentDateTime => DateTimeOffset.Now;
public static DateTime CurrentDateTime => DateTime.Now;
/// <summary>
/// 返回yyyy-MM-dd HH:mm:ss:fff zz时间格式字符串
/// </summary>
public static string ToDefaultDateTimeFormat(this in DateTime dt) => dt.ToString("yyyy-MM-dd HH:mm:ss:fff zz");
public static string ToDefaultDateTimeFormat(this in DateTime dt, TimeSpan offset)
{
if (dt.Kind == DateTimeKind.Utc)
return new DateTimeOffset(dt.ToLocalTime(), offset).ToString("yyyy-MM-dd HH:mm:ss:fff zz");
else if (dt == DateTime.MinValue || dt == DateTime.MaxValue)
return dt.ToString("yyyy-MM-dd HH:mm:ss:fff zz");
else
return new DateTimeOffset(dt, offset).ToString("yyyy-MM-dd HH:mm:ss:fff zz");
}
/// <summary>
/// 返回yyyy-MM-dd HH:mm:ss:fff zz时间格式字符串
/// </summary>
public static string ToDefaultDateTimeFormat(this in DateTimeOffset dt) => dt.ToString("yyyy-MM-dd HH:mm:ss:fff zz");
public static string ToDefaultDateTimeFormat(this in DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH:mm:ss:fff zz");
}
/// <summary>
/// 返回yyyy-MM-dd HH-mm-ss-fff zz时间格式字符串
/// 返回yyyy-MM-dd HH:mm:ss:fff zz时间格式字符串
/// </summary>
public static string ToFileDateTimeFormat(this in DateTimeOffset dt) => dt.ToString("yyyy-MM-dd HH-mm-ss-fff zz");
public static string ToFileDateTimeFormat(this in DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH-mm-ss-fff zz");
}
/// <summary>
@@ -166,15 +179,5 @@ public static class SysDateTimeExtensions
return (Int64)(value - _dt1970).TotalMilliseconds;
}
/// <summary>
/// ToLong
/// </summary>
/// <returns></returns>
public static long ToLong(this DateTimeOffset value, long defaultValue = 0)
{
// 特殊处理时间转Unix毫秒
return value == DateTimeOffset.MinValue ? 0 : (Int64)(value - _dto1970).TotalMilliseconds;
}
}

View File

@@ -1196,21 +1196,21 @@
系统默认使用的当前时间
</summary>
</member>
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.ToDefaultDateTimeFormat(System.DateTime@,System.TimeSpan)">
<summary>
返回yyyy-MM-dd HH:mm:ss:fff zz时间格式字符串
</summary>
</member>
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.ToDefaultDateTimeFormat(System.DateTime@)">
<summary>
返回yyyy-MM-dd HH:mm:ss:fff zz时间格式字符串
</summary>
</member>
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.ToDefaultDateTimeFormat(System.DateTimeOffset@)">
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.ToFileDateTimeFormat(System.DateTime@)">
<summary>
返回yyyy-MM-dd HH:mm:ss:fff zz时间格式字符串
</summary>
</member>
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.ToFileDateTimeFormat(System.DateTimeOffset@)">
<summary>
返回yyyy-MM-dd HH-mm-ss-fff zz时间格式字符串
</summary>
</member>
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.GetDiffTime(System.DateTime@,System.DateTime@)">
<summary>
计算2个时间差返回文字描述
@@ -1233,12 +1233,6 @@
</summary>
<returns></returns>
</member>
<member name="M:ThingsGateway.Admin.Core.SysDateTimeExtensions.ToLong(System.DateTimeOffset,System.Int64)">
<summary>
ToLong
</summary>
<returns></returns>
</member>
<member name="T:ThingsGateway.Admin.Core.TextWriterExtensions">
<summary>
TextWriter扩展

View File

@@ -41,5 +41,5 @@ public class UnifyResult<T>
/// <summary>
/// 时间
/// </summary>
public DateTimeOffset Time { get; set; }
public DateTime Time { get; set; }
}

View File

@@ -34,13 +34,13 @@ public class TimerTick
/// <summary>
/// 上次操作时间
/// </summary>
public DateTimeOffset LastTime { get; private set; }
public DateTime LastTime { get; private set; }
/// <summary>
/// 是否触发时间刻度
/// </summary>
/// <returns></returns>
public bool IsTickHappen(DateTimeOffset currentTime)
public bool IsTickHappen(DateTime currentTime)
{
var dateTime = LastTime.AddMilliseconds(milliSeconds);
if (currentTime < dateTime)

View File

@@ -28,7 +28,7 @@ public class BackendLog : PrimaryIdEntity
/// </summary>
[SugarColumn(ColumnName = "LogTime", ColumnDescription = "日志时间", IsNullable = false)]
[DataTable(Order = 1, IsShow = true, Sortable = true)]
public DateTimeOffset LogTime { get; set; }
public DateTime LogTime { get; set; }
/// <summary>
/// 日志级别
/// </summary>

View File

@@ -71,13 +71,13 @@ public class HistoryAlarm : PrimaryIdEntity
/// <inheritdoc cref="DeviceVariableRunTime.AlarmTime"/>
[SugarColumn(ColumnName = "AlarmTime", ColumnDescription = "报警时间", IsNullable = false)]
[DataTable(Order = 8, IsShow = true, Sortable = true, CellClass = " table-text-truncate ")]
public DateTimeOffset AlarmTime { get; set; }
public DateTime AlarmTime { get; set; }
/// <inheritdoc cref="DeviceVariableRunTime.EventTime"/>
[SugarColumn(ColumnName = "EventTime", ColumnDescription = "事件时间", IsNullable = false)]
[DataTable(Order = 8, IsShow = true, Sortable = true, CellClass = " table-text-truncate ")]
public DateTimeOffset EventTime { get; set; }
public DateTime EventTime { get; set; }
/// <summary>

View File

@@ -24,7 +24,7 @@ public class RpcLog : PrimaryIdEntity
/// </summary>
[SugarColumn(ColumnName = "LogTime", ColumnDescription = "日志时间", IsNullable = false)]
[DataTable(Order = 1, IsShow = true, Sortable = true, CellClass = " table-text-truncate ")]
public DateTimeOffset LogTime { get; set; }
public DateTime LogTime { get; set; }
/// <summary>
/// 操作源

View File

@@ -44,7 +44,7 @@ public class BackendLogDatabaseLoggingWriter : IDatabaseLoggingWriter
LogLevel = logMsg.LogLevel,
LogMessage = logMsg.State.ToString(),
LogSource = logMsg.LogName,
LogTime = logMsg.LogDateTime.ToUniversalTime(),
LogTime = logMsg.LogDateTime,
Exception = logMsg.Exception?.ToString(),
};
_logQueues.Enqueue(logRuntime);

View File

@@ -55,7 +55,7 @@ public class CollectDeviceRunTime : CollectDevice
/// 设备活跃时间
/// </summary>
[Description("活跃时间")]
public DateTimeOffset ActiveTime { get; private set; } = DateTimeOffset.MinValue;
public DateTime ActiveTime { get; private set; } = DateTime.MinValue;
/// <summary>
/// 设备状态
/// </summary>
@@ -121,7 +121,7 @@ public class CollectDeviceRunTime : CollectDevice
/// <param name="activeTime"></param>
/// <param name="errorCount"></param>
/// <param name="lastErrorMessage"></param>
public void SetDeviceStatus(DateTimeOffset? activeTime = null, int? errorCount = null, string lastErrorMessage = null)
public void SetDeviceStatus(DateTime? activeTime = null, int? errorCount = null, string lastErrorMessage = null)
{
if (activeTime != null)
ActiveTime = activeTime.Value;

View File

@@ -23,7 +23,7 @@ public class DeviceData
/// <inheritdoc cref="CollectDeviceRunTime.DeviceVariableCount"/>
public int DeviceVariablesCount { get; set; }
/// <inheritdoc cref="CollectDeviceRunTime.ActiveTime"/>
public DateTimeOffset ActiveTime { get; set; }
public DateTime ActiveTime { get; set; }
/// <inheritdoc cref="CollectDeviceRunTime.DeviceStatus"/>
public int DeviceStatus { get; set; }
/// <inheritdoc cref="CollectDeviceRunTime.LastErrorMessage"/>

View File

@@ -64,7 +64,7 @@ public class DeviceVariableMethodSource
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public bool CheckIfRequestAndUpdateTime(DateTimeOffset time) => exTimerTick.IsTickHappen(time);
public bool CheckIfRequestAndUpdateTime(DateTime time) => exTimerTick.IsTickHappen(time);
}

View File

@@ -82,7 +82,7 @@ public class DeviceVariableRunTime : DeviceVariable
/// </summary>
/// <param name="value"></param>
/// <param name="dateTime"></param>
public OperResult SetValue(object value, DateTimeOffset dateTime = default)
public OperResult SetValue(object value, DateTime dateTime = default)
{
try
{
@@ -129,7 +129,7 @@ public class DeviceVariableRunTime : DeviceVariable
void Set(object data)
{
DateTimeOffset time;
DateTime time;
if (dateTime == default)
{
time = SysDateTimeExtensions.CurrentDateTime;
@@ -139,22 +139,8 @@ public class DeviceVariableRunTime : DeviceVariable
time = dateTime;
}
CollectTime = time;
if (data?.GetType().IsValueType == true)
{
if (data != _value && LastSetValue != data || isOnlineChanged)
{
ChangeTime = time;
if (IsOnline)
{
_value = data;
}
LastSetValue = data;
VariableValueChange?.Invoke(this);
}
}
else
{
if (data?.ToString() != _value?.ToString() && LastSetValue?.ToString() != data?.ToString() || isOnlineChanged)
if ((data?.ToString() != _value?.ToString() && LastSetValue?.ToString() != data?.ToString()) || isOnlineChanged)
{
ChangeTime = time;
if (IsOnline)
@@ -175,13 +161,13 @@ public class DeviceVariableRunTime : DeviceVariable
/// </summary>
[Description("变化时间")]
[DataTable(Order = 2, IsShow = true, Sortable = true)]
public DateTimeOffset ChangeTime { get; private set; }
public DateTime ChangeTime { get; private set; }
/// <summary>
/// 采集时间
/// </summary>
[Description("采集时间")]
[DataTable(Order = 2, IsShow = true, Sortable = true)]
public DateTimeOffset CollectTime { get; private set; }
public DateTime CollectTime { get; private set; }
/// <summary>
@@ -255,11 +241,11 @@ public class DeviceVariableRunTime : DeviceVariable
/// <summary>
/// 报警时间
/// </summary>
public DateTimeOffset AlarmTime { get; set; }
public DateTime AlarmTime { get; set; }
/// <summary>
/// 事件时间
/// </summary>
public DateTimeOffset EventTime { get; set; }
public DateTime EventTime { get; set; }
/// <summary>
/// 报警类型
/// </summary>

View File

@@ -55,6 +55,6 @@ public class DeviceVariableSourceRead
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public bool CheckIfRequestAndUpdateTime(DateTimeOffset time) => exTimerTick.IsTickHappen(time);
public bool CheckIfRequestAndUpdateTime(DateTime time) => exTimerTick.IsTickHappen(time);
}

View File

@@ -35,7 +35,7 @@ public class UploadDeviceRunTime : UploadDevice
/// 设备活跃时间
/// </summary>
[Description("活跃时间")]
public DateTimeOffset ActiveTime { get; private set; } = DateTimeOffset.MinValue;
public DateTime ActiveTime { get; private set; } = DateTime.MinValue;
/// <summary>
/// 设备状态
/// </summary>
@@ -113,7 +113,7 @@ public class UploadDeviceRunTime : UploadDevice
/// <param name="activeTime"></param>
/// <param name="errorCount"></param>
/// <param name="lastErrorMessage"></param>
public void SetDeviceStatus(DateTimeOffset? activeTime = null, int? errorCount = null, string lastErrorMessage = null)
public void SetDeviceStatus(DateTime? activeTime = null, int? errorCount = null, string lastErrorMessage = null)
{
if (activeTime != null)
ActiveTime = activeTime.Value;

View File

@@ -29,9 +29,9 @@ public class VariableData
/// <inheritdoc cref="DeviceVariableRunTime.Value"/>
public object Value { get; set; }
/// <inheritdoc cref="DeviceVariableRunTime.ChangeTime"/>
public DateTimeOffset ChangeTime { get; set; }
public DateTime ChangeTime { get; set; }
/// <inheritdoc cref="DeviceVariableRunTime.CollectTime"/>
public DateTimeOffset CollectTime { get; set; }
public DateTime CollectTime { get; set; }
/// <inheritdoc cref="DeviceVariableRunTime.IsOnline"/>
public bool IsOnline { get; set; }
/// <inheritdoc cref="MemoryVariable.ReadExpressions"/>

View File

@@ -48,7 +48,7 @@ public abstract class DriverBase : DisposableObject
base.Dispose(disposing);
}
/// <summary>
/// 调试UI Type继承实现<see cref="DriverDebugUIBase"/>后返回继承类的Type如果不存在返回null
/// 调试UI Type如果不存在返回null
/// </summary>
public abstract Type DriverDebugUIType { get; }

View File

@@ -44,9 +44,5 @@
<ProjectReference Include="..\ThingsGateway.Admin.Application\ThingsGateway.Admin.Application.csproj" />
<ProjectReference Include="..\ThingsGateway.Foundation\ThingsGateway.Foundation.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Workers\Helper\" />
</ItemGroup>
</Project>

View File

@@ -184,7 +184,7 @@
上次操作时间
</summary>
</member>
<member name="M:ThingsGateway.Application.TimerTick.IsTickHappen(System.DateTimeOffset)">
<member name="M:ThingsGateway.Application.TimerTick.IsTickHappen(System.DateTime)">
<summary>
是否触发时间刻度
</summary>
@@ -1457,7 +1457,7 @@
距上次成功时的读取失败次数,超过3次设备更新为离线等于0时设备更新为在线
</summary>
</member>
<member name="M:ThingsGateway.Application.CollectDeviceRunTime.SetDeviceStatus(System.Nullable{System.DateTimeOffset},System.Nullable{System.Int32},System.String)">
<member name="M:ThingsGateway.Application.CollectDeviceRunTime.SetDeviceStatus(System.Nullable{System.DateTime},System.Nullable{System.Int32},System.String)">
<summary>
传入设备的状态信息
</summary>
@@ -1559,7 +1559,7 @@
地址参数,以;分割参数值
</summary>
</member>
<member name="M:ThingsGateway.Application.DeviceVariableMethodSource.CheckIfRequestAndUpdateTime(System.DateTimeOffset)">
<member name="M:ThingsGateway.Application.DeviceVariableMethodSource.CheckIfRequestAndUpdateTime(System.DateTime)">
<summary>
检测是否达到读取间隔
</summary>
@@ -1601,7 +1601,7 @@
最近一次值
</summary>
</member>
<member name="M:ThingsGateway.Application.DeviceVariableRunTime.SetValue(System.Object,System.DateTimeOffset)">
<member name="M:ThingsGateway.Application.DeviceVariableRunTime.SetValue(System.Object,System.DateTime)">
<summary>
设置变量值与时间设置为null时只更改质量戳状态
</summary>
@@ -1725,7 +1725,7 @@
读取长度
</summary>
</member>
<member name="M:ThingsGateway.Application.DeviceVariableSourceRead.CheckIfRequestAndUpdateTime(System.DateTimeOffset)">
<member name="M:ThingsGateway.Application.DeviceVariableSourceRead.CheckIfRequestAndUpdateTime(System.DateTime)">
<summary>
检测是否达到读取间隔
</summary>
@@ -1772,7 +1772,7 @@
距上次成功时的读取失败次数,超过3次设备更新为离线等于0时设备更新为在线
</summary>
</member>
<member name="M:ThingsGateway.Application.UploadDeviceRunTime.SetDeviceStatus(System.Nullable{System.DateTimeOffset},System.Nullable{System.Int32},System.String)">
<member name="M:ThingsGateway.Application.UploadDeviceRunTime.SetDeviceStatus(System.Nullable{System.DateTime},System.Nullable{System.Int32},System.String)">
<summary>
传入设备的状态信息
</summary>
@@ -1951,7 +1951,7 @@
</member>
<member name="P:ThingsGateway.Application.DriverBase.DriverDebugUIType">
<summary>
调试UI Type继承实现<see cref="T:ThingsGateway.Application.DriverDebugUIBase"/>返回继承类的Type如果不存在返回null
调试UI Type如果不存在返回null
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverBase.DriverPlugin">
@@ -1995,78 +1995,6 @@
底层日志输出
</summary>
</member>
<member name="T:ThingsGateway.Application.DriverDebugUIBase">
<summary>
调试UI
</summary>
</member>
<member name="F:ThingsGateway.Application.DriverDebugUIBase.isDownExport">
<summary>
导出提示
</summary>
</member>
<member name="F:ThingsGateway.Application.DriverDebugUIBase.Messages">
<summary>
日志缓存
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.Plc">
<summary>
默认读写设备
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.Address">
<summary>
变量地址
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.DataTypeEnum">
<summary>
数据类型
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.JS">
<inheritdoc/>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.WriteValue">
<summary>
写入值
</summary>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.Dispose">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.ReadAsync">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.WriteAsync">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.DownDeviceExportAsync(ThingsGateway.Application.CollectDevice)">
<summary>
导入设备
</summary>
<returns></returns>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.DownDeviceExportAsync(System.Collections.Generic.List{ThingsGateway.Application.DeviceVariable})">
<summary>
导入变量
</summary>
<returns></returns>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.DownDeviceMessageExportAsync(System.Collections.Generic.IEnumerable{System.String})">
<summary>
导出
</summary>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.LogOut(TouchSocket.Core.LogLevel,System.Object,System.String,System.Exception)">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.OnInitialized">
<inheritdoc/>
</member>
<member name="T:ThingsGateway.Application.PluginSingletonService">
<summary>
驱动插件服务

View File

@@ -496,7 +496,7 @@ public class CollectDeviceWorker : BackgroundService
{
//超过30分钟或者(初始化失败并超过10分钟)会重启
if (
(devcore.Device.ActiveTime != DateTimeOffset.MinValue &&
(devcore.Device.ActiveTime != DateTime.MinValue &&
devcore.Device.ActiveTime.AddMinutes(30) <= SysDateTimeExtensions.CurrentDateTime)
|| (devcore.IsInitSuccess == false && devcore.Device.ActiveTime.AddMinutes(10) <= SysDateTimeExtensions.CurrentDateTime)
)

View File

@@ -451,7 +451,7 @@ public class HistoryValueMapper : IRegister
{
config.ForType<DeviceVariableRunTime, HistoryValue>()
.Map(dest => dest.Value, (src) => ValueReturn(src))
.Map(dest => dest.CollectTime, (src) => src.CollectTime.UtcDateTime);
.Map(dest => dest.CollectTime, (src) => src.CollectTime.ToUniversalTime());//注意sqlsugar插入时无时区直接utc时间
}
private static object ValueReturn(DeviceVariableRunTime src)

View File

@@ -373,7 +373,7 @@ public class UploadDeviceWorker : BackgroundService
{
//超过30分钟或者(初始化失败并超过10分钟)会重启
if (
(devcore.Device.ActiveTime != DateTimeOffset.MinValue
(devcore.Device.ActiveTime != DateTime.MinValue
&& devcore.Device.ActiveTime.AddMinutes(30) <= SysDateTimeExtensions.CurrentDateTime)
|| (devcore.IsInitSuccess == false && devcore.Device.ActiveTime.AddMinutes(10) <= SysDateTimeExtensions.CurrentDateTime)
)

View File

@@ -21,9 +21,9 @@ public class HisPageInput : VariablePageInput
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; } = DateTime.Now.AddDays(-1);
public DateTime? StartTime { get; set; } = DateTime.UtcNow.AddDays(-1);
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; } = DateTime.Now.AddDays(1);
public DateTime? EndTime { get; set; } = DateTime.UtcNow.AddDays(1);
}

View File

@@ -14,6 +14,11 @@ using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Logging;
using Microsoft.JSInterop;
using System.IO;
using System.Threading;
using ThingsGateway.Admin.Blazor.Core;
using ThingsGateway.Admin.Core;
using ThingsGateway.Application.Extensions;
using ThingsGateway.Foundation;
@@ -65,6 +70,8 @@ public abstract class DriverDebugUIBase : ComponentBase, IDisposable
[Inject]
private IVariableService VariableService { get; set; }
[Inject]
private InitTimezone InitTimezone { get; set; }
/// <inheritdoc/>
public virtual void Dispose()
@@ -80,18 +87,18 @@ public abstract class DriverDebugUIBase : ComponentBase, IDisposable
var data = await Plc.ReadAsync(Address, DataTypeEnum.GetSystemType());
if (data.IsSuccess)
{
Messages.Add((LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - 对应类型值:" + data.Content));
Messages.Add((LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - 对应类型值:" + data.Content));
}
else
{
Messages.Add((LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + data.Message));
Messages.Add((LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + data.Message));
}
}
catch (Exception ex)
{
Messages.Add((LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + "错误:" + ex.Message));
Messages.Add((LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + "错误:" + ex.Message));
}
}
@@ -104,16 +111,16 @@ public abstract class DriverDebugUIBase : ComponentBase, IDisposable
var data = await Plc.WriteAsync(Address, DataTypeEnum.GetSystemType(), WriteValue);
if (data.IsSuccess)
{
Messages.Add((LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + data.Message));
Messages.Add((LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + data.Message));
}
else
{
Messages.Add((LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + data.Message));
Messages.Add((LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + data.Message));
}
}
catch (Exception ex)
{
Messages.Add((LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + "写入前失败:" + ex.Message));
Messages.Add((LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + "写入前失败:" + ex.Message));
}
}
/// <summary>
@@ -183,7 +190,7 @@ public abstract class DriverDebugUIBase : ComponentBase, IDisposable
/// <inheritdoc/>
public void LogOut(TouchSocket.Core.LogLevel logLevel, object source, string message, Exception exception)
{
Messages.Add(((LogLevel)logLevel, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + message + (exception != null ? exception.Message : "")));
Messages.Add(((LogLevel)logLevel, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + message + (exception != null ? exception.Message : "")));
if (Messages.Count > 2500)
{
Messages.Clear();

View File

@@ -95,7 +95,7 @@
<MLabel Class=@((item.Device?.DeviceStatus==DeviceStatusEnum.OnLine?"green--text":"red--text")+$" text-h6")>
<div class="mt-1 d-flex align-center justify-space-between" title=@item.Device?.Name>
<span>@item.Device?.Name</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat() + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
</div>
</MLabel>
</MListItemTitle>
@@ -127,7 +127,7 @@
<MLabel Class=@((item.Device?.DeviceStatus==DeviceStatusEnum.OnLine?"green--text":"red--text")+$" text-h6")>
<div class="mt-1 d-flex align-center justify-space-between">
<span class="mx-3">@item.Device?.Name</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption mx-3">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat() + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption mx-3">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
</div>
</MLabel>
@@ -180,7 +180,7 @@
<MRow Class="ml-2 mr-2 d-flex" NoGutters>
<MCol Md=6 Cols="12" Class="px-4 mt-1 d-flex align-center justify-space-between">
<span class="text-subtitle-2 grey--text">@item.Device?.Description(a=>a.ActiveTime)</span>
<span class="text-caption">@item.Device?.ActiveTime.ToDefaultDateTimeFormat()</span>
<span class="text-caption">@item.Device?.ActiveTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)</span>
</MCol>
<MCol Md=6 Cols="12" Class="px-4 mt-1 d-flex align-center justify-space-between">
<span class="text-subtitle-2 grey--text">@item.Device?.Description(a=>a.SourceVariableCount)</span>
@@ -346,7 +346,7 @@
<MLabel Class=@((item.Device?.DeviceStatus==DeviceStatusEnum.OnLine?"green--text":"red--text")+$" text-h6")>
<div class="mt-1 d-flex align-center justify-space-between" title=@item.Device?.Name>
<span>@item.Device?.Name</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat() + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
</div>
</MLabel>
</MListItemTitle>
@@ -378,7 +378,7 @@
<MLabel Class=@((item.Device?.DeviceStatus==DeviceStatusEnum.OnLine?"green--text":"red--text")+$" text-h6")>
<div class="mt-1 d-flex align-center justify-space-between">
<span class="mx-3">@item.Device?.Name</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption mx-3">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat() + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
<span style="white-space: nowrap !important;overflow: hidden !important; text-overflow: ellipsis !important;" class="text-caption mx-3">@(item.Device?.ActiveTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " " + typeof(DeviceStatusEnum).GetDescription(item.Device?.DeviceStatus.ToString()))</span>
</div>
</MLabel>
@@ -432,7 +432,7 @@
<MRow Class="ml-2 mr-2 d-flex" NoGutters>
<MCol Md=6 Cols="12" Class="px-4 mt-1 d-flex align-center justify-space-between">
<span class="text-subtitle-2 grey--text">@item.Device?.Description(a=>a.ActiveTime)</span>
<span class="text-caption">@item.Device?.ActiveTime.ToDefaultDateTimeFormat()</span>
<span class="text-caption">@item.Device?.ActiveTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)</span>
</MCol>
<MCol Md=6 Cols="12" Class="px-4 mt-1 d-flex align-center justify-space-between">
<span class="text-subtitle-2 grey--text">@item.Device?.Description(a=>a.UploadVariableCount)</span>

View File

@@ -40,22 +40,22 @@
<MMenu CloseOnContentClick="false" OffsetY Context="menu">
<ActivatorContent>
<MTextField Dense Readonly Style="max-width:200px;" HideDetails=@("auto") Class="my-1 mx-2 "
Value="context.StartTime"
Value="context.StartTime.Value.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)"
@attributes="menu.Attrs" Outlined Label=@context.Description(x => x.StartTime) />
</ActivatorContent>
<ChildContent>
<AppDateTimePicker OutputTimezoneOffset="DateTimeOffset.Now.Offset" @bind-Value="context.StartTime"></AppDateTimePicker>
<AppDateTimePicker @bind-Value="context.StartTime"></AppDateTimePicker>
</ChildContent>
</MMenu>
<MMenu CloseOnContentClick="false" OffsetY Context="menu">
<ActivatorContent>
<MTextField Dense Readonly Style="max-width:200px;" HideDetails=@("auto") Class="my-1 mx-2 "
Value="context.EndTime"
<MTextField Dense Readonly Style="max-width:200px;" HideDetails=@("auto") Class="my-1 mx-2 "
Value="context.EndTime.Value.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)" Clearable
@attributes="menu.Attrs" Outlined Label=@context.Description(x => x.EndTime) />
</ActivatorContent>
<ChildContent>
<AppDateTimePicker OutputTimezoneOffset="DateTimeOffset.Now.Offset" @bind-Value="context.EndTime"></AppDateTimePicker>
<AppDateTimePicker @bind-Value="context.EndTime"></AppDateTimePicker>
</ChildContent>
</MMenu>

View File

@@ -63,8 +63,8 @@ public partial class HistoryAlarmPage
var query = result.Content.CopyNew().Queryable<HistoryAlarm>().
WhereIF(!input.DeviceName.IsNullOrEmpty(), a => a.DeviceName.Contains(input.DeviceName))
.WhereIF(!input.Name.IsNullOrEmpty(), a => a.Name.Contains(input.Name))
.WhereIF(input.StartTime != null, a => a.EventTime >= input.StartTime.Value)
.WhereIF(input.EndTime != null, a => a.EventTime <= input.EndTime.Value);
.WhereIF(input.StartTime != null, a => a.EventTime >= input.StartTime.Value.ToLocalTime())
.WhereIF(input.EndTime != null, a => a.EventTime <= input.EndTime.Value.ToLocalTime());
for (int i = 0; i < input.SortField.Count; i++)
{

View File

@@ -30,6 +30,7 @@
@inherits BaseComponentBase
@inject UserResoures UserResoures
@layout MainLayout
@inject InitTimezone InitTimezone
<AppDataTable @ref="_datatable" TItem="HistoryValue" SearchItem="HisPageInput"
AddItem="object" EditItem="object" IsShowSelect=false
IsMenuOperTemplate=false
@@ -41,23 +42,23 @@
<MMenu CloseOnContentClick="false" OffsetY Context="menu">
<ActivatorContent>
<MTextField Dense Readonly Style="max-width:200px;" HideDetails=@("auto") Class="my-1 mx-2 "
Value="context.StartTime"
Value="context.StartTime.Value.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)"
Clearable
@attributes="menu.Attrs" Outlined Label=@context.Description(x => x.StartTime) />
</ActivatorContent>
<ChildContent>
<AppDateTimePicker OutputTimezoneOffset="DateTimeOffset.Now.Offset" @bind-Value="context.StartTime"></AppDateTimePicker>
<AppDateTimePicker @bind-Value="context.StartTime"></AppDateTimePicker>
</ChildContent>
</MMenu>
<MMenu CloseOnContentClick="false" OffsetY Context="menu">
<ActivatorContent>
<MTextField Dense Readonly Style="max-width:200px;" HideDetails=@("auto") Class="my-1 mx-2 "
Value="context.EndTime" Clearable
Value="context.EndTime.Value.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)" Clearable
@attributes="menu.Attrs" Outlined Label=@context.Description(x => x.EndTime) />
</ActivatorContent>
<ChildContent>
<AppDateTimePicker OutputTimezoneOffset="DateTimeOffset.Now.Offset" @bind-Value="context.EndTime"></AppDateTimePicker>
<AppDateTimePicker @bind-Value="context.EndTime"></AppDateTimePicker>
</ChildContent>
</MMenu>
@@ -68,28 +69,38 @@
</SearchTemplate>
<ItemColTemplate>
@switch (context.Header.Value)
<ItemColWithDTTemplate>
@if (context?.Value?.GetType() == typeof(DateTime))
{
case nameof(context.Item.IsOnline):
<EnableChip Value="context.Item.IsOnline" DisabledLabel="离线" EnabledLabel="在线">
</EnableChip>
break;
default:
@if (context.Header.CellClass?.Contains("text-truncate") == true)
{
<span title=@context.Value>
<span>
@((DateTime.SpecifyKind((DateTime)context.Value, DateTimeKind.Utc)).ToLocalTime().ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset))
</span>
}
else
{
@switch (context.Header.Value)
{
case nameof(context.Item.IsOnline):
<EnableChip Value="context.Item.IsOnline" DisabledLabel="离线" EnabledLabel="在线">
</EnableChip>
break;
default:
@if (context.Header.CellClass?.Contains("text-truncate") == true)
{
<span title=@context.Value>
@context.Value
</span>
}
else
{
@context.Value
</span>
}
else
{
@context.Value
}
break;
}
break;
}
}
</ItemColTemplate>
</ItemColWithDTTemplate>
</AppDataTable>

View File

@@ -61,8 +61,8 @@ public partial class HistoryValuePage
{
var query = result.Content.CopyNew().Queryable<HistoryValue>()
.WhereIF(!input.Name.IsNullOrEmpty(), a => a.Name.Contains(input.Name))
.WhereIF(input.StartTime != null, a => a.CollectTime >= input.StartTime.Value.ToUniversalTime())
.WhereIF(input.EndTime != null, a => a.CollectTime <= input.EndTime.Value.ToUniversalTime());
.WhereIF(input.StartTime != null, a => a.CollectTime >= input.StartTime.Value)
.WhereIF(input.EndTime != null, a => a.CollectTime <= input.EndTime.Value);
for (int i = 0; i < input.SortField.Count; i++)
{

View File

@@ -381,5 +381,77 @@
</summary>
<returns></returns>
</member>
<member name="T:ThingsGateway.Application.DriverDebugUIBase">
<summary>
调试UI
</summary>
</member>
<member name="F:ThingsGateway.Application.DriverDebugUIBase.isDownExport">
<summary>
导出提示
</summary>
</member>
<member name="F:ThingsGateway.Application.DriverDebugUIBase.Messages">
<summary>
日志缓存
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.Plc">
<summary>
默认读写设备
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.Address">
<summary>
变量地址
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.DataTypeEnum">
<summary>
数据类型
</summary>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.JS">
<inheritdoc/>
</member>
<member name="P:ThingsGateway.Application.DriverDebugUIBase.WriteValue">
<summary>
写入值
</summary>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.Dispose">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.ReadAsync">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.WriteAsync">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.DownDeviceExportAsync(ThingsGateway.Application.CollectDevice)">
<summary>
导入设备
</summary>
<returns></returns>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.DownDeviceExportAsync(System.Collections.Generic.List{ThingsGateway.Application.DeviceVariable})">
<summary>
导入变量
</summary>
<returns></returns>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.DownDeviceMessageExportAsync(System.Collections.Generic.IEnumerable{System.String})">
<summary>
导出
</summary>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.LogOut(TouchSocket.Core.LogLevel,System.Object,System.String,System.Exception)">
<inheritdoc/>
</member>
<member name="M:ThingsGateway.Application.DriverDebugUIBase.OnInitialized">
<inheritdoc/>
</member>
</members>
</doc>

View File

@@ -799,7 +799,7 @@ public class Interop
if (input.GetType() == typeof(DateTime))
{
DateTime dateTime = (DateTime)input;
return dateTime != DateTime.MinValue ? (object)dateTime.ToUniversalTime() : (object)dateTime;
return dateTime != DateTime.MinValue ? (object)dateTime.ToLocalTime() : (object)dateTime;
}
}
}

View File

@@ -22,7 +22,6 @@
@namespace ThingsGateway.Modbus
@using Masa.Blazor
@using ThingsGateway.Application;
@inherits DriverDebugUIBase
<DefalutDebugDriverPage Channel="ChannelEnum.SerialPort" @ref=defalutDebugDriverPage>
<MCard Flat Elevation="0">

View File

@@ -174,7 +174,7 @@ public class OPCDAClient : CollectBase
{
var value = data.Value;
var quality = data.Quality;
var time = new DateTimeOffset(data.TimeStamp);
var time = data.TimeStamp.ToLocalTime();
if (value != null && quality == 192)
{
if (item.DataTypeEnum == DataTypeEnum.Object)

View File

@@ -20,6 +20,7 @@ using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using ThingsGateway.Admin.Blazor.Core;
using ThingsGateway.Admin.Core;
using ThingsGateway.Blazor;
using ThingsGateway.Foundation.Adapter.OPCDA.Da;
@@ -70,7 +71,8 @@ public partial class OPCDAClientDebugDriverPage : IDisposable
base.OnAfterRender(firstRender);
}
[Inject]
private InitTimezone InitTimezone { get; set; }
private void Add()
{
var tags = new Dictionary<string, List<OpcItem>>();
@@ -79,7 +81,7 @@ public partial class OPCDAClientDebugDriverPage : IDisposable
var result = _plc.AddItems(tags);
if (!result.IsSuccess)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + result.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + result.Message));
}
}
@@ -107,7 +109,7 @@ public partial class OPCDAClientDebugDriverPage : IDisposable
}
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + data.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + data.Message));
}
return Task.CompletedTask;
@@ -119,7 +121,7 @@ public partial class OPCDAClientDebugDriverPage : IDisposable
private void ValueOut(List<ItemReadResult> values)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + values.ToJson()));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + values.ToJson()));
if (defalutDebugDriverPage.Messages.Count > 2500)
{
defalutDebugDriverPage.Messages.Clear();
@@ -133,16 +135,16 @@ public partial class OPCDAClientDebugDriverPage : IDisposable
var data = _plc.WriteItem(defalutDebugDriverPage.Address, defalutDebugDriverPage.WriteValue);
if (data.IsSuccess)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - д<><D0B4>" + data.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - д<><D0B4>" + data.Message));
}
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + data.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + data.Message));
}
}
catch (Exception ex)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + <><D0B4>ʧ<EFBFBD>ܣ<EFBFBD>" + ex.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + <><D0B4>ʧ<EFBFBD>ܣ<EFBFBD>" + ex.Message));
}
return Task.CompletedTask;

View File

@@ -235,7 +235,7 @@ public class OPCUAClient : CollectBase
}
var quality = StatusCode.IsGood(data.dataValue.StatusCode);
var time = new DateTimeOffset(data.dataValue.SourceTimestamp);
var time = data.dataValue.SourceTimestamp.ToLocalTime();
foreach (var item in itemReads)
{
if (item.DataTypeEnum == DataTypeEnum.Object)

View File

@@ -23,6 +23,7 @@ using Opc.Ua;
using System;
using System.Threading.Tasks;
using ThingsGateway.Admin.Blazor.Core;
using ThingsGateway.Admin.Core;
using ThingsGateway.Blazor;
@@ -41,6 +42,12 @@ public partial class OPCUAClientDebugDriverPage
bool IsShowImportVariableList;
private OPCUAClientPage opcUAClientPage;
private ImportVariable ImportVariable { get; set; }
[Inject]
private InitTimezone InitTimezone { get; set; }
[Inject]
IPopupService PopupService { get; set; }
/// <summary>
/// <inheritdoc/>
/// </summary>
@@ -70,18 +77,15 @@ public partial class OPCUAClientDebugDriverPage
base.OnAfterRender(firstRender);
}
private void Add()
{
if (_plc.Connected)
_plc.AddSubscription(YitIdHelper.NextId().ToString(), new[] { defalutDebugDriverPage.Address });
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + <><CEB4><EFBFBD><EFBFBD>"));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + <><CEB4><EFBFBD><EFBFBD>"));
}
}
[Inject]
IPopupService PopupService { get; set; }
private async Task DownDeviceExport()
{
var data = await ImportVariable?.GetImportVariableListAsync();
@@ -97,7 +101,7 @@ public partial class OPCUAClientDebugDriverPage
private void Plc_DataChangedHandler((VariableNode variableNode, DataValue dataValue, Newtonsoft.Json.Linq.JToken jToken) item)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + (item.variableNode.NodeId + ":" + item.jToken)));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + (item.variableNode.NodeId + ":" + item.jToken)));
if (defalutDebugDriverPage.Messages.Count > 2500)
{
defalutDebugDriverPage.Messages.Clear();
@@ -111,17 +115,17 @@ public partial class OPCUAClientDebugDriverPage
try
{
var data = await _plc.ReadJTokenValueAsync(new string[] { defalutDebugDriverPage.Address });
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + data.ToJson()));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Debug, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + data.ToJson()));
}
catch (Exception ex)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + ex.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + ex.Message));
}
}
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + <><CEB4><EFBFBD><EFBFBD>"));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + <><CEB4><EFBFBD><EFBFBD>"));
}
}
private void Remove()
@@ -130,7 +134,7 @@ public partial class OPCUAClientDebugDriverPage
_plc.RemoveSubscription("");
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + <><CEB4><EFBFBD><EFBFBD>"));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + <><CEB4><EFBFBD><EFBFBD>"));
}
}
@@ -143,21 +147,21 @@ public partial class OPCUAClientDebugDriverPage
var data = await _plc.WriteNodeAsync(defalutDebugDriverPage.Address, JToken.Parse(defalutDebugDriverPage.WriteValue));
if (data.IsSuccess)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + " - д<><D0B4><EFBFBD>ɹ<EFBFBD>"));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Information, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + " - д<><D0B4><EFBFBD>ɹ<EFBFBD>"));
}
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + " - д<><D0B4>ʧ<EFBFBD><CAA7> " + data.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + " - д<><D0B4>ʧ<EFBFBD><CAA7> " + data.Message));
}
}
else
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + <><CEB4><EFBFBD><EFBFBD>"));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Warning, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + <><CEB4><EFBFBD><EFBFBD>"));
}
}
catch (Exception ex)
{
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat() + " - " + " - " + <><D0B4>ʧ<EFBFBD>ܣ<EFBFBD>" + ex.Message));
defalutDebugDriverPage.Messages.Add((Microsoft.Extensions.Logging.LogLevel.Error, SysDateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset) + " - " + " - " + <><D0B4>ʧ<EFBFBD>ܣ<EFBFBD>" + ex.Message));
}
}
}

View File

@@ -165,8 +165,8 @@ src.IsOnline ? StatusCodes.Good : StatusCodes.Bad);
errors[0] = StatusCodes.BadHistoryOperationUnsupported;
return;
}
var startTime = readDetail.StartTime.ToUniversalTime();
var endTime = readDetail.EndTime.ToUniversalTime();
var startTime = readDetail.StartTime;
var endTime = readDetail.EndTime;
for (int i = 0; i < nodesToRead.Count; i++)
{
@@ -314,7 +314,7 @@ src.IsOnline ? StatusCodes.Good : StatusCodes.Bad);
/// <summary>
/// 在服务器端直接更改对应数据节点的值
/// </summary>
private void ChangeNodeData(OPCUATag tag, object value, DateTimeOffset dateTime)
private void ChangeNodeData(OPCUATag tag, object value, DateTime dateTime)
{
object newValue;
try
@@ -349,7 +349,7 @@ src.IsOnline ? StatusCodes.Good : StatusCodes.Bad);
newValue = value;
}
tag.Value = newValue;
tag.Timestamp = dateTime.UtcDateTime;
tag.Timestamp = dateTime;
void SetDataType(OPCUATag tag, object value)
@@ -447,7 +447,7 @@ src.IsOnline ? StatusCodes.Good : StatusCodes.Bad);
variable.Value = Opc.Ua.TypeInfo.GetDefaultValue(variable.DataType, ValueRanks.Any, Server.TypeTree);
var code = variableRunTime.IsOnline ? StatusCodes.Good : StatusCodes.Bad;
variable.StatusCode = code;
variable.Timestamp = variableRunTime.CollectTime.UtcDateTime;
variable.Timestamp = variableRunTime.CollectTime;
variable.OnWriteValue = OnWriteDataValue;
parent?.AddChild(variable);
NodeIdTags.AddOrUpdate(variable.NodeId, variable);

View File

@@ -290,7 +290,7 @@
<param name="fs">设备组节点</param>
<param name="name">设备名称</param>
</member>
<member name="M:ThingsGateway.OPCUA.ThingsGatewayNodeManager.ChangeNodeData(ThingsGateway.OPCUA.OPCUATag,System.Object,System.DateTimeOffset)">
<member name="M:ThingsGateway.OPCUA.ThingsGatewayNodeManager.ChangeNodeData(ThingsGateway.OPCUA.OPCUATag,System.Object,System.DateTime)">
<summary>
在服务器端直接更改对应数据节点的值
</summary>

View File

@@ -37,7 +37,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter
//转成实体
var loggingMonitor = jsonString.ToJsonWithT<LoggingMonitorJson>();
//日志时间赋值
loggingMonitor.LogDateTime = logMsg.LogDateTime.ToUniversalTime();
loggingMonitor.LogDateTime = logMsg.LogDateTime;
{
var operation = logMsg.Context.Get(LoggingConst.Operation).ToString();//获取操作名称
var client = (ClientInfo)logMsg.Context.Get(LoggingConst.Client);//获取客户端信息
@@ -102,7 +102,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter
OpIp = loggingMonitor.RemoteIPv4,
OpBrowser = clientInfo.UA.Family + clientInfo.UA.Major,
OpOs = clientInfo.OS.Family + clientInfo.OS.Major,
OpTime = loggingMonitor.LogDateTime,
OpTime = loggingMonitor.LogDateTime.LocalDateTime,
OpAccount = opAccount,
ReqMethod = loggingMonitor.HttpMethod,
ReqUrl = path,
@@ -179,7 +179,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter
OpIp = loggingMonitor.RemoteIPv4,
OpBrowser = clientInfo.UA.Family + clientInfo.UA.Major,
OpOs = clientInfo.OS.Family + clientInfo.OS.Major,
OpTime = loggingMonitor.LogDateTime,
OpTime = loggingMonitor.LogDateTime.LocalDateTime,
OpAccount = opAccount,
VerificatId = verificatId,
};

View File

@@ -6,7 +6,7 @@ export const language = ["en","zh"];
export const removeDefaultStopWordFilter = false;
export const removeDefaultStemmer = false;
export { default as Mark } from "E:\\Tg\\ThingsGateway\\NewThingsGateway\\handbook\\node_modules\\mark.js\\dist\\mark.js"
export const searchIndexUrl = "search-index{dir}.json?_=210dba24";
export const searchIndexUrl = "search-index{dir}.json?_=9bed4e05";
export const searchResultLimits = 8;
export const searchResultContextMaxLength = 50;
export const explicitSearchResultPath = true;

View File

@@ -203,9 +203,9 @@
"53": {
"js": [
{
"file": "assets/js/935f2afb.079c3229.js",
"hash": "0f25bba5a6e4fe70",
"publicPath": "/thingsgateway-docs/assets/js/935f2afb.079c3229.js"
"file": "assets/js/935f2afb.0f7e606f.js",
"hash": "481ecc5141990b51",
"publicPath": "/thingsgateway-docs/assets/js/935f2afb.0f7e606f.js"
}
]
},
@@ -221,9 +221,9 @@
"179": {
"js": [
{
"file": "assets/js/main.983c2b82.js",
"hash": "59f6f11492f1d646",
"publicPath": "/thingsgateway-docs/assets/js/main.983c2b82.js"
"file": "assets/js/main.fe6ca657.js",
"hash": "35b596252fb7aae3",
"publicPath": "/thingsgateway-docs/assets/js/main.fe6ca657.js"
}
]
},
@@ -284,9 +284,9 @@
"1303": {
"js": [
{
"file": "assets/js/runtime~main.3d9c09f6.js",
"hash": "0871ba95c4f81542",
"publicPath": "/thingsgateway-docs/assets/js/runtime~main.3d9c09f6.js"
"file": "assets/js/runtime~main.998dd168.js",
"hash": "0b2c7ad12b62da0f",
"publicPath": "/thingsgateway-docs/assets/js/runtime~main.998dd168.js"
}
]
},
@@ -437,9 +437,9 @@
"4954": {
"js": [
{
"file": "assets/js/6f635a3d.3a8994ec.js",
"hash": "8f16fdd8736ca22a",
"publicPath": "/thingsgateway-docs/assets/js/6f635a3d.3a8994ec.js"
"file": "assets/js/6f635a3d.034ef8a0.js",
"hash": "f7af1b4b22b00fbe",
"publicPath": "/thingsgateway-docs/assets/js/6f635a3d.034ef8a0.js"
}
]
},
@@ -568,9 +568,9 @@
"8494": {
"js": [
{
"file": "assets/js/5137840a.07869322.js",
"hash": "68f63cccd11c772a",
"publicPath": "/thingsgateway-docs/assets/js/5137840a.07869322.js"
"file": "assets/js/5137840a.efbb9425.js",
"hash": "b288804baeb0408d",
"publicPath": "/thingsgateway-docs/assets/js/5137840a.efbb9425.js"
}
]
},

View File

@@ -2,7 +2,7 @@
"unversionedId": "description",
"id": "description",
"title": "说明",
"description": "当前版本",
"description": "注意以下常见版权问题:",
"source": "@site/docs/description.mdx",
"sourceDirName": ".",
"slug": "/",

View File

@@ -336,7 +336,7 @@
"description": {
"id": "description",
"title": "说明",
"description": "当前版本",
"description": "注意以下常见版权问题:",
"sidebar": "docs"
},
"devicevariable": {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More