月度报表

This commit is contained in:
guorui 2025-11-20 19:07:36 +08:00
parent 8a4fceebc0
commit 3be81cf517
21 changed files with 3775 additions and 1638 deletions

View File

@ -23,14 +23,14 @@ namespace YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection
EditSecondaryCircuitEventDrivenConfigInput input,
CancellationToken cancellationToken = default);
/// <summary>
/// 分页查询事件驱动配置列表
/// </summary>
RequestPageResult<SecondaryCircuitEventDrivenConfigOutput> FindDatas(
PageSearchCondition<SecondaryCircuitEventDrivenConfigSearchInput> searchCondition);
Task<RequestPageResult<SecondaryCircuitEventDrivenConfigOutput>> FindDatasAsync(
PageSearchCondition<SecondaryCircuitEventDrivenConfigSearchInput> input,
CancellationToken cancellationToken = default);
/// <summary>
/// 查询所有事件驱动配置(不分页)
/// </summary>

View File

@ -31,6 +31,8 @@ using YunDa.SOMS.Entities.DataMonitoring.SecondaryCircuitInspection;
using YunDa.SOMS.Entities.GeneralInformation;
using YunDa.SOMS.Redis.Repositories;
using YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection.Test;
using Abp.Linq.Extensions;
using Abp.UI;
namespace YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection
{
@ -924,23 +926,197 @@ namespace YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection
#endregion
#region
#region
public RequestPageResult<SecondaryCircuitEventDrivenConfigOutput> FindDatas(PageSearchCondition<SecondaryCircuitEventDrivenConfigSearchInput> searchCondition)
/// <summary>
/// 获取事件驱动配置列表(分页)
/// </summary>
/// <param name="input">分页搜索条件</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>分页结果</returns>
/// <exception cref="UserFriendlyException">查询失败时抛出</exception>
[ShowApi]
[AllowAnonymous]
[HttpPost]
public async Task<RequestPageResult<SecondaryCircuitEventDrivenConfigOutput>> FindDatasAsync(
PageSearchCondition<SecondaryCircuitEventDrivenConfigSearchInput> input,
CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
RequestPageResult<SecondaryCircuitEventDrivenConfigOutput> rst = new RequestPageResult<SecondaryCircuitEventDrivenConfigOutput>();
try
{
// Build query with eager loading of related entities
var query = _eventDrivenConfigRepository.GetAll()
.Include(x => x.SecondaryCircuitInspectionEventItems)
.ThenInclude(t => t.InspectionItem)
.ThenInclude(t => t.TelemetryConfigs)
.ThenInclude(t => t.TelemeteringConfiguration)
.Include(x => x.SecondaryCircuitInspectionEventItems)
.ThenInclude(t => t.InspectionItem)
.ThenInclude(t => t.TelesignalConfigs)
.ThenInclude(t => t.TelesignalisationConfiguration)
.Include(x => x.TelemetryConfigs)
.ThenInclude(t => t.TelemeteringConfiguration)
.Include(x => x.TelesignalConfigs)
.ThenInclude(t => t.TelesignalisationConfiguration)
.AsQueryable()
;
// Apply search conditions
if (input.SearchCondition != null)
{
if (!string.IsNullOrWhiteSpace(input.SearchCondition.Name))
{
query = query.Where(x => x.Name.Contains(input.SearchCondition.Name) ||
x.Remark.Contains(input.SearchCondition.Name));
}
if (input.SearchCondition.Priority.HasValue)
{
query = query.Where(x => x.Priority == input.SearchCondition.Priority.Value);
}
if (input.SearchCondition.IsActive.HasValue)
{
query = query.Where(x => x.IsActive == input.SearchCondition.IsActive.Value);
}
}
// Get total count before pagination
var totalCount = await query.CountAsync(cancellationToken).ConfigureAwait(false);
// Apply sorting
query = query.OrderBy(x => x.CreationTime).ThenBy(x => x.Name);
// Apply pagination
int skipCount = input.PageIndex <= 0 ? 0 : ((input.PageIndex - 1) * input.PageSize);
if (input.PageSize > 0)
{
query = query.PageBy(skipCount, input.PageSize);
}
var entities = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
// Load equipment info dictionary for efficient lookups
var equipmentInfoDict = await _equipmentInfoRepository.GetAll()
.ToDictionaryAsync(e => e.Id, e => e.Name, cancellationToken)
.ConfigureAwait(false);
// Map entities to output DTOs
var outputList = new List<SecondaryCircuitEventDrivenConfigOutput>();
foreach (var entity in entities)
{
var output = ObjectMapper.Map<SecondaryCircuitEventDrivenConfigOutput>(entity);
output.SecondaryCircuitInspectionEventItems = ObjectMapper.Map<List<SecondaryCircuitInspectionItemOutput>>(
entity.SecondaryCircuitInspectionEventItems.Select(t => t.InspectionItem));
// Enrich nested inspection items with telemetry and telesignal config details
foreach (var eventItem in entity.SecondaryCircuitInspectionEventItems)
{
if (eventItem.InspectionItem == null) continue;
var outputItem = output.SecondaryCircuitInspectionEventItems.FirstOrDefault(x => x.Id == eventItem.InspectionItem.Id);
if (outputItem == null) continue;
// Enrich telemetry configs for nested inspection item
if (eventItem.InspectionItem.TelemetryConfigs != null && eventItem.InspectionItem.TelemetryConfigs.Any())
{
outputItem.TelemetryConfigs = eventItem.InspectionItem.TelemetryConfigs.Select(tc => new SecondaryCircuitInspectionTelemetryConfigOutput
{
Id = tc.Id,
EquipmentInfoId = tc.TelemeteringConfiguration.EquipmentInfoId.Value,
EquipmentInfoName = equipmentInfoDict.ContainsKey(tc.TelemeteringConfiguration.EquipmentInfoId.Value)
? equipmentInfoDict[tc.TelemeteringConfiguration.EquipmentInfoId.Value]
: string.Empty,
TelemetryConfigurationId = tc.TelemetryConfigurationId ?? Guid.Empty,
TelemetryConfigurationName = tc.TelemeteringConfiguration?.Name,
TelemetryConfigurationIsmsId = tc.TelemeteringConfiguration?.ismsbaseYCId
}).ToList();
outputItem.TelemetryConfigCount = outputItem.TelemetryConfigs.Count;
}
// Enrich telesignal configs for nested inspection item
if (eventItem.InspectionItem.TelesignalConfigs != null && eventItem.InspectionItem.TelesignalConfigs.Any())
{
outputItem.TelesignalConfigs = eventItem.InspectionItem.TelesignalConfigs.Select(tc => new SecondaryCircuitInspectionTelesignalConfigOutput
{
Id = tc.Id,
EquipmentInfoId = tc.TelesignalisationConfiguration.EquipmentInfoId.Value,
EquipmentInfoName = equipmentInfoDict.ContainsKey(tc.TelesignalisationConfiguration.EquipmentInfoId.Value)
? equipmentInfoDict[tc.TelesignalisationConfiguration.EquipmentInfoId.Value]
: string.Empty,
TelesignalConfigurationId = tc.TelesignalConfigurationId ?? Guid.Empty,
TelesignalConfigurationName = tc.TelesignalisationConfiguration?.Name,
TelesignalConfigurationIsmsId = tc.TelesignalisationConfiguration?.ismsbaseYXId
}).ToList();
outputItem.TelesignalConfigCount = outputItem.TelesignalConfigs.Count;
}
}
// Map telemetry configs
if (entity.TelemetryConfigs != null && entity.TelemetryConfigs.Any())
{
output.TelemetryConfigs = entity.TelemetryConfigs.Select(tc => new SecondaryCircuitInspectionTelemetryConfigOutput
{
Id = tc.Id,
EquipmentInfoId = tc.TelemeteringConfiguration.EquipmentInfoId.Value,
EquipmentInfoName = equipmentInfoDict.ContainsKey(tc.TelemeteringConfiguration.EquipmentInfoId.Value)
? equipmentInfoDict[tc.TelemeteringConfiguration.EquipmentInfoId.Value]
: string.Empty,
TelemetryConfigurationId = tc.TelemetryConfigurationId ?? Guid.Empty,
TelemetryConfigurationName = tc.TelemeteringConfiguration?.Name,
TelemetryConfigurationIsmsId = tc.TelemeteringConfiguration?.ismsbaseYCId
}).ToList();
}
else
{
output.TelemetryConfigs = new List<SecondaryCircuitInspectionTelemetryConfigOutput>();
}
// Map telesignal configs
if (entity.TelesignalConfigs != null && entity.TelesignalConfigs.Any())
{
output.TelesignalConfigs = entity.TelesignalConfigs.Select(tc => new SecondaryCircuitInspectionTelesignalConfigOutput
{
Id = tc.Id,
EquipmentInfoId = tc.TelesignalisationConfiguration.EquipmentInfoId.Value,
EquipmentInfoName = equipmentInfoDict.ContainsKey(tc.TelesignalisationConfiguration.EquipmentInfoId.Value)
? equipmentInfoDict[tc.TelesignalisationConfiguration.EquipmentInfoId.Value]
: string.Empty,
TelesignalConfigurationId = tc.TelesignalConfigurationId ?? Guid.Empty,
TelesignalConfigurationName = tc.TelesignalisationConfiguration?.Name,
TelesignalConfigurationIsmsId = tc.TelesignalisationConfiguration?.ismsbaseYXId
}).ToList();
}
else
{
output.TelesignalConfigs = new List<SecondaryCircuitInspectionTelesignalConfigOutput>();
}
outputList.Add(output);
}
// Set pagination result properties
rst.PageSize = input.PageSize;
rst.PageIndex = input.PageIndex;
rst.TotalCount = totalCount;
rst.Flag = true;
rst.ResultData = outputList;
}
catch (Exception ex)
{
Log4Helper.Error($"获取事件驱动配置列表失败: {ex.Message}", ex);
throw new UserFriendlyException($"获取事件驱动配置列表失败: {ex.Message}");
}
return rst;
}
#endregion
#region
#endregion
#region
/// <summary>

View File

@ -1596,7 +1596,9 @@ namespace YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection
var datas = _imVariantBoolRepository.GetAll().Select(t => new VirtualPointInfoOutput
{
id = t.Id,
name = t.Vaname
name = t.Vaname,
ExprDesc = t.ExprDesc,
AlertMsg = t.AlertMsg
});
rst.ResultData = datas.ToList();
rst.Flag = true;

View File

@ -194,6 +194,102 @@ namespace YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection
return rst;
}
/// <summary>
/// 获取巡检结果(分页)
/// </summary>
/// <param name="input"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[ShowApi]
[AllowAnonymous]
[HttpPost]
public async Task<RequestPageResult<SecondaryCircuitInspectionSimPlanOutput>> FindDatasAsync(
PageSearchCondition<SecondaryCircuitInspectionPlanSearchInput> input,
CancellationToken cancellationToken = default)
{
RequestPageResult<SecondaryCircuitInspectionSimPlanOutput> rst = new RequestPageResult<SecondaryCircuitInspectionSimPlanOutput>();
try
{
// Build query with search conditions
var query = _inspectionPlanRepository.GetAll()
.WhereIf(!string.IsNullOrWhiteSpace(input.SearchCondition.Name),
x => x.Name.Contains(input.SearchCondition.Name) || x.Description.Contains(input.SearchCondition.Name))
.WhereIf(input.SearchCondition.Priority.HasValue,
x => x.Priority == input.SearchCondition.Priority.Value)
.WhereIf(input.SearchCondition.IsActive.HasValue,
x => x.IsActive == input.SearchCondition.IsActive.Value);
// Get total count before pagination
var totalCount = await query.CountAsync(cancellationToken).ConfigureAwait(false);
// Apply sorting
query = query.OrderBy(x => x.ScheduledHour).ThenBy(t=>t.ScheduledMinute);
// Apply pagination
int skipCount = input.PageIndex <= 0 ? 0 : ((input.PageIndex - 1) * input.PageSize);
if (input.PageSize > 0)
{
query = query.PageBy(skipCount, input.PageSize);
}
var entities = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
// Load telemetry and telesignal configurations into memory to avoid MySQL connection reuse issues
//var telemetrys = await _telemeteringConfigurationRepository
// .GetAllIncluding(t => t.EquipmentInfo)
// .ToListAsync(cancellationToken)
// .ConfigureAwait(false);
//var telesignals = await _telesignalisationConfigurationRepository
// .GetAllIncluding(t => t.EquipmentInfo)
// .ToListAsync(cancellationToken)
// .ConfigureAwait(false);
var outputs = new List<SecondaryCircuitInspectionSimPlanOutput>();
var inspectionItems = _inspectionPlanItemRepository.GetAll()
.Include(t => t.InspectionItem);
foreach (var entity in entities)
{
var output = ObjectMapper.Map<SecondaryCircuitInspectionSimPlanOutput>(entity);
output.ScheduledWeekDaysList = entity.GetScheduledWeekDaysList();
if (entity.ScheduledHour.HasValue && entity.ScheduledMinute.HasValue)
{
output.ScheduledTimeString = $"{entity.ScheduledHour:D2}:{entity.ScheduledMinute.Value:D2}";
}
// 统计子项数量
output.InspectionItemCount = inspectionItems.Where(t => t.InspectionPlanId == entity.Id).Count();
// 包含详细信息
if (output.InspectionItemCount > 0)
{
var items = inspectionItems.Where(t => t.InspectionPlanId == entity.Id).OrderBy(t => t.ExecutionOrder);
//output.PlanItems = ObjectMapper.Map<List<SecondaryCircuitInspectionPlanItemOutput>>(items);
var tempInspectionItems = items.Select(t => t.InspectionItem);
foreach (var item in tempInspectionItems)
{
var outputitem = ObjectMapper.Map<SecondaryCircuitInspectionItemSimOutput>(item);
output.InspectionItems.Add(outputitem);
}
}
outputs.Add(output);
}
// Set pagination result properties
rst.PageSize = input.PageSize;
rst.PageIndex = input.PageIndex;
rst.TotalCount = totalCount;
rst.Flag = true;
rst.ResultData = outputs;
}
catch (Exception ex)
{
Log4Helper.Error($"获取二次回路巡检计划列表失败: {ex.Message}", ex);
throw new UserFriendlyException($"获取巡检计划列表失败: {ex.Message}");
}
return rst;
}
/// <summary>
/// 获取巡检计划详情
/// </summary>

View File

@ -436,6 +436,7 @@ namespace YunDa.SOMS.Application.DataMonitoring
start++;
}
rst.Flag = true;
}
catch (Exception ex)

View File

@ -334,7 +334,8 @@ namespace YunDa.SOMS.Application.GeneralInformation.ProtectionDevice
public async Task<RequestEasyResult> DataChanged(Guid equipmentId)
{
var result = new RequestEasyResult();
result.Flag = true;
return result;
// 1. 速率限制检查 - 防止过于频繁的更新
var lastUpdateTime = _lastUpdateTimeCache.GetOrAdd(equipmentId, DateTime.MinValue);
var timeSinceLastUpdate = DateTime.Now - lastUpdateTime;
@ -448,18 +449,18 @@ namespace YunDa.SOMS.Application.GeneralInformation.ProtectionDevice
}
// 9. 调用PushDynamicsInternalAsync推送数据 (使用内部方法避免授权问题)
var dynamicsJson = Newtonsoft.Json.JsonConvert.SerializeObject(dynamicsData);
Log4Helper.Info(GetType(), $"准备推送动态数据,数据点数量: {dynamicsData.Count}JSON长度: {dynamicsJson.Length}");
//var dynamicsJson = Newtonsoft.Json.JsonConvert.SerializeObject(dynamicsData);
//Log4Helper.Info(GetType(), $"准备推送动态数据,数据点数量: {dynamicsData.Count}JSON长度: {dynamicsJson.Length}");
bool pushResult = await _beijingYounuoApiAppService.PushDynamicsInternalAsync(dynamicsJson);
//bool pushResult = await _beijingYounuoApiAppService.PushDynamicsInternalAsync(dynamicsJson);
// 10. 更新最后更新时间(无论推送成功与否,都更新时间戳以防止重试风暴)
_lastUpdateTimeCache.AddOrUpdate(equipmentId, DateTime.Now, (key, oldValue) => DateTime.Now);
//// 10. 更新最后更新时间(无论推送成功与否,都更新时间戳以防止重试风暴)
//_lastUpdateTimeCache.AddOrUpdate(equipmentId, DateTime.Now, (key, oldValue) => DateTime.Now);
result.Flag = pushResult;
result.Message = pushResult ?
$"成功推送设备 {equipmentId} 的动态数据,数据点数量: {dynamicsData.Count}" :
$"推送设备 {equipmentId} 的动态数据失败";
//result.Flag = pushResult;
//result.Message = pushResult ?
// $"成功推送设备 {equipmentId} 的动态数据,数据点数量: {dynamicsData.Count}" :
// $"推送设备 {equipmentId} 的动态数据失败";
Log4Helper.Info(GetType(), $"数据变位信号处理完成,结果: {result.Message}");
}

View File

@ -26,6 +26,7 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// 设备名称
/// </summary>
public string deviceName { get; set; }
public string ValueStr { get; set; }
/// <summary>
/// 调度地址
@ -84,7 +85,8 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// <summary>
/// 时间戳
/// </summary>
public string timeStamp { get; set; }
public string timeStamp { get; set; }
public string valueStr { get; set; }
}
public class TelesignalData
{
@ -93,7 +95,6 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// </summary>
public int value { get; set; }
public string valueStr { get; set; }
/// <summary>
/// 时间戳
/// </summary>
@ -114,6 +115,10 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// 虚点名称
/// </summary>
public string name { get; set; }
public string ValueStr { get; set; }
public string ExprDesc { get; set; }
public string AlertMsg { get; set; }
/// <summary>
/// 数据列表
@ -130,7 +135,9 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// 数据值
/// </summary>
public int value { get; set; }
public string ValueStr { get; set; }
public string ExprDesc { get; set; }
public string AlertMsg { get; set; }
/// <summary>
/// 时间戳
/// </summary>
@ -151,7 +158,7 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// 网关名称
/// </summary>
public string name { get; set; }
public string ValueStr { get; set; }
/// <summary>
/// 数据列表
/// </summary>
@ -167,7 +174,7 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// 数据值丢帧率float类型例如0.001表示0.1%丢帧率)
/// </summary>
public float value { get; set; }
public string ValueStr { get; set; }
/// <summary>
/// 时间戳
/// </summary>

View File

@ -159,6 +159,15 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
GatewayConfigs = new List<SecondaryCircuitInspectionGatewayOutput>();
}
}
[AutoMapFrom(typeof(SecondaryCircuitInspectionItem))]
public class SecondaryCircuitInspectionItemSimOutput : EntityDto<Guid>
{
/// <summary>
/// 子项名称
/// </summary>
public string Name { get; set; }
}
/// <summary>
/// 编辑二次回路巡检子项输入DTO

View File

@ -83,6 +83,78 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
}
}
[AutoMapFrom(typeof(SecondaryCircuitInspectionPlan))]
public class SecondaryCircuitInspectionSimPlanOutput : EntityDto<Guid>
{
/// <summary>
/// 巡检计划名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 巡检计划描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 巡检优先级
/// </summary>
public SecondaryCircuitInspectionPriority Priority { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// 计划巡检 - 执行星期列表
/// </summary>
public List<int> ScheduledWeekDaysList { get; set; }
/// <summary>
/// 定时任务日期
/// </summary>
public virtual string ScheduledDate { get; set; }
/// <summary>
/// 计划巡检 - 执行时间(小时)
/// </summary>
public int? ScheduledHour { get; set; }
/// <summary>
/// 计划巡检 - 执行时间(分钟)
/// </summary>
public int? ScheduledMinute { get; set; }
/// <summary>
/// 计划巡检 - 执行时间字符串
/// </summary>
public string ScheduledTimeString { get; set; }
/// <summary>
/// 是否排除检修装置
/// </summary>
public bool ExcludeMaintenanceDevices { get; set; }
/// <summary>
/// 计算检修状态表达式
/// </summary>
public virtual string ExcludeMaintenanceExpreesion { get; set; }
/// <summary>
/// 巡检子项数量
/// </summary>
public int InspectionItemCount { get; set; }
/// <summary>
/// 巡检项列表
/// </summary>
public List<SecondaryCircuitInspectionItemSimOutput> InspectionItems { get; set; }
public SecondaryCircuitInspectionSimPlanOutput()
{
InspectionItems = new List<SecondaryCircuitInspectionItemSimOutput>();
ScheduledWeekDaysList = new List<int>();
}
}
/// <summary>
/// 编辑二次回路巡检计划输入DTO
/// </summary>
@ -173,7 +245,7 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// <summary>
/// 二次回路巡检计划查询输入DTO
/// </summary>
public class SecondaryCircuitInspectionPlanSearchInput : PagedAndSortedResultRequestDto
public class SecondaryCircuitInspectionPlanSearchInput:PagedAndSortedResultRequestDto
{
/// <summary>
/// 关键字搜索(名称、描述)

View File

@ -30,17 +30,26 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
public SecondaryCircuitInspectionModuleType? ModuleType { get; set; }
/// <summary>
/// 开始时间
/// 日期范围字符串(支持多种格式,优先使用此参数)
/// 格式说明:
/// - "yyyy-MM-dd" : 按天查询,如 "2025-11-19" 查询当天 00:00:00 至 23:59:59
/// - "yyyy-MM" : 按月查询,如 "2025-11" 查询当月第一天至最后一天
/// - "yyyy" : 按年查询,如 "2025" 查询当年第一天至最后一天
/// - "yyyy-Www" 或 "yyyyWww" : 按周查询ISO 8601如 "2025-W47" 查询第47周周一至周日
/// - "yyyy-MM-dd~yyyy-MM-dd" : 日期范围查询,如 "2025-11-17~2025-11-23" 查询指定范围
/// </summary>
public string DateRange { get; set; }
/// <summary>
/// 开始时间(当 DateRange 未提供时使用)
/// </summary>
[Required(ErrorMessage = "开始时间不能为空")]
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// 结束时间(当 DateRange 未提供时使用)
/// </summary>
[Required(ErrorMessage = "结束时间不能为空")]
public DateTime? EndTime { get; set; }
/// <summary>
/// 是否包含详细分析
/// </summary>

View File

@ -49,32 +49,16 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// </summary>
public DateTime StatisticsEndTime { get; set; }
/// <summary>
/// 按变电站统计详情
/// </summary>
public List<SecondaryCircuitInspectionStatisticsByStation> StatisticsByStation { get; set; }
/// <summary>
/// 按巡检计划统计详情
/// </summary>
public List<SecondaryCircuitInspectionStatisticsByPlan> StatisticsByPlan { get; set; }
/// <summary>
/// 按模块类型统计详情
/// </summary>
public List<SecondaryCircuitInspectionStatisticsByModule> StatisticsByModule { get; set; }
/// <summary>
/// 按时间统计详情
/// </summary>
public List<SecondaryCircuitInspectionStatisticsByTime> StatisticsByTime { get; set; }
public SecondaryCircuitInspectionStatisticsOutput()
{
StatisticsByStation = new List<SecondaryCircuitInspectionStatisticsByStation>();
StatisticsByPlan = new List<SecondaryCircuitInspectionStatisticsByPlan>();
StatisticsByModule = new List<SecondaryCircuitInspectionStatisticsByModule>();
StatisticsByTime = new List<SecondaryCircuitInspectionStatisticsByTime>();
}
}
@ -241,4 +225,46 @@ namespace YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspectio
/// </summary>
public double AbnormalRate { get; set; }
}
/// <summary>
/// 年度统计按月分组输出DTO
/// </summary>
public class YearlyStatisticsByMonthOutput
{
/// <summary>
/// 年份
/// </summary>
public int Year { get; set; }
/// <summary>
/// 月度统计列表包含12个月的统计数据
/// </summary>
public List<MonthlyStatisticsItem> MonthlyStatistics { get; set; }
public YearlyStatisticsByMonthOutput()
{
MonthlyStatistics = new List<MonthlyStatisticsItem>();
}
}
/// <summary>
/// 月度统计项
/// </summary>
public class MonthlyStatisticsItem
{
/// <summary>
/// 年份
/// </summary>
public int Year { get; set; }
/// <summary>
/// 月份1-12
/// </summary>
public int Month { get; set; }
/// <summary>
/// 该月的统计数据
/// </summary>
public SecondaryCircuitInspectionStatisticsOutput Statistics { get; set; }
}
}

View File

@ -63,5 +63,6 @@
_searchCondition = value;
}
}
}
}

View File

@ -9972,6 +9972,11 @@
网关配置关联列表
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionItemSimOutput.Name">
<summary>
子项名称
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.EditSecondaryCircuitInspectionItemInput">
<summary>
编辑二次回路巡检子项输入DTO
@ -10422,6 +10427,71 @@
巡检项列表
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.Name">
<summary>
巡检计划名称
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.Description">
<summary>
巡检计划描述
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.Priority">
<summary>
巡检优先级
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.IsActive">
<summary>
是否启用
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ScheduledWeekDaysList">
<summary>
计划巡检 - 执行星期列表
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ScheduledDate">
<summary>
定时任务日期
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ScheduledHour">
<summary>
计划巡检 - 执行时间(小时)
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ScheduledMinute">
<summary>
计划巡检 - 执行时间(分钟)
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ScheduledTimeString">
<summary>
计划巡检 - 执行时间字符串
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ExcludeMaintenanceDevices">
<summary>
是否排除检修装置
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.ExcludeMaintenanceExpreesion">
<summary>
计算检修状态表达式
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.InspectionItemCount">
<summary>
巡检子项数量
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionSimPlanOutput.InspectionItems">
<summary>
巡检项列表
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.EditSecondaryCircuitInspectionPlanInput">
<summary>
编辑二次回路巡检计划输入DTO
@ -10992,14 +11062,25 @@
主模块类型
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsInput.DateRange">
<summary>
日期范围字符串(支持多种格式,优先使用此参数)
格式说明:
- "yyyy-MM-dd" : 按天查询,如 "2025-11-19" 查询当天 00:00:00 至 23:59:59
- "yyyy-MM" : 按月查询,如 "2025-11" 查询当月第一天至最后一天
- "yyyy" : 按年查询,如 "2025" 查询当年第一天至最后一天
- "yyyy-Www" 或 "yyyyWww" : 按周查询ISO 8601如 "2025-W47" 查询第47周周一至周日
- "yyyy-MM-dd~yyyy-MM-dd" : 日期范围查询,如 "2025-11-17~2025-11-23" 查询指定范围
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsInput.StartTime">
<summary>
开始时间
开始时间(当 DateRange 未提供时使用)
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsInput.EndTime">
<summary>
结束时间
结束时间(当 DateRange 未提供时使用)
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsInput.IncludeDetailAnalysis">
@ -11052,26 +11133,11 @@
统计时间范围结束
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsOutput.StatisticsByStation">
<summary>
按变电站统计详情
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsOutput.StatisticsByPlan">
<summary>
按巡检计划统计详情
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsOutput.StatisticsByModule">
<summary>
按模块类型统计详情
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsOutput.StatisticsByTime">
<summary>
按时间统计详情
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsByStation">
<summary>
按变电站统计详情
@ -11232,6 +11298,41 @@
异常率
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.YearlyStatisticsByMonthOutput">
<summary>
年度统计按月分组输出DTO
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.YearlyStatisticsByMonthOutput.Year">
<summary>
年份
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.YearlyStatisticsByMonthOutput.MonthlyStatistics">
<summary>
月度统计列表包含12个月的统计数据
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.MonthlyStatisticsItem">
<summary>
月度统计项
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.MonthlyStatisticsItem.Year">
<summary>
年份
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.MonthlyStatisticsItem.Month">
<summary>
月份1-12
</summary>
</member>
<member name="P:YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.MonthlyStatisticsItem.Statistics">
<summary>
该月的统计数据
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.DataMonitoring.SelfCheckingConfigurationDto.EditSelfCheckingConfigurationInput">
<summary>
预置点识别配置

View File

@ -0,0 +1,435 @@
# DateRange 解析测试用例
## 测试目的
验证 `ParseDateRange` 方法能够正确处理各种日期格式和边界情况。
---
## 测试用例 1按天查询 - 普通日期
**输入:** `"2025-11-19"`
**预期输出:**
- StartTime: `2025-11-19 00:00:00.000`
- EndTime: `2025-11-19 23:59:59.999`
**验证点:**
- ✅ 正确解析 yyyy-MM-dd 格式
- ✅ 开始时间为当天 00:00:00
- ✅ 结束时间为当天 23:59:59.999
---
## 测试用例 2按天查询 - 月末日期
**输入:** `"2025-11-30"`
**预期输出:**
- StartTime: `2025-11-30 00:00:00.000`
- EndTime: `2025-11-30 23:59:59.999`
**验证点:**
- ✅ 正确处理月末日期
- ✅ 不会溢出到下个月
---
## 测试用例 3按天查询 - 年末日期
**输入:** `"2025-12-31"`
**预期输出:**
- StartTime: `2025-12-31 00:00:00.000`
- EndTime: `2025-12-31 23:59:59.999`
**验证点:**
- ✅ 正确处理年末日期
- ✅ 不会溢出到下一年
---
## 测试用例 4按月查询 - 31天的月份
**输入:** `"2025-01"`
**预期输出:**
- StartTime: `2025-01-01 00:00:00.000`
- EndTime: `2025-01-31 23:59:59.999`
**验证点:**
- ✅ 正确解析 yyyy-MM 格式
- ✅ 正确计算31天月份的最后一天
---
## 测试用例 5按月查询 - 30天的月份
**输入:** `"2025-11"`
**预期输出:**
- StartTime: `2025-11-01 00:00:00.000`
- EndTime: `2025-11-30 23:59:59.999`
**验证点:**
- ✅ 正确计算30天月份的最后一天
---
## 测试用例 6按月查询 - 2月平年
**输入:** `"2025-02"`
**预期输出:**
- StartTime: `2025-02-01 00:00:00.000`
- EndTime: `2025-02-28 23:59:59.999`
**验证点:**
- ✅ 正确处理平年2月28天
---
## 测试用例 7按月查询 - 2月闰年
**输入:** `"2024-02"`
**预期输出:**
- StartTime: `2024-02-01 00:00:00.000`
- EndTime: `2024-02-29 23:59:59.999`
**验证点:**
- ✅ 正确处理闰年2月29天
- ✅ 自动识别闰年
---
## 测试用例 8按月查询 - 12月
**输入:** `"2025-12"`
**预期输出:**
- StartTime: `2025-12-01 00:00:00.000`
- EndTime: `2025-12-31 23:59:59.999`
**验证点:**
- ✅ 正确处理年末月份
- ✅ 不会溢出到下一年
---
## 测试用例 9按年查询 - 平年
**输入:** `"2025"`
**预期输出:**
- StartTime: `2025-01-01 00:00:00.000`
- EndTime: `2025-12-31 23:59:59.999`
**验证点:**
- ✅ 正确解析 yyyy 格式
- ✅ 开始时间为1月1日
- ✅ 结束时间为12月31日
---
## 测试用例 10按年查询 - 闰年
**输入:** `"2024"`
**预期输出:**
- StartTime: `2024-01-01 00:00:00.000`
- EndTime: `2024-12-31 23:59:59.999`
**验证点:**
- ✅ 正确处理闰年
- ✅ 结束时间仍为12月31日不受闰年影响
---
## 测试用例 11按周查询 - ISO 8601 格式(带连字符)
**输入:** `"2025-W47"`
**预期输出:**
- StartTime: `2025-11-17 00:00:00.000`(周一)
- EndTime: `2025-11-23 23:59:59.999`(周日)
**验证点:**
- ✅ 正确解析 yyyy-Www 格式
- ✅ 周一为一周的第一天
- ✅ 周日为一周的最后一天
- ✅ 正确计算第47周的日期范围
---
## 测试用例 12按周查询 - ISO 8601 格式(无连字符)
**输入:** `"2025W47"`
**预期输出:**
- StartTime: `2025-11-17 00:00:00.000`(周一)
- EndTime: `2025-11-23 23:59:59.999`(周日)
**验证点:**
- ✅ 正确解析 yyyyWww 格式
- ✅ 与带连字符格式结果一致
---
## 测试用例 13按周查询 - 第1周可能跨年
**输入:** `"2025-W01"`
**预期输出:**
- StartTime: `2024-12-30 00:00:00.000`周一跨年到2024年
- EndTime: `2025-01-05 23:59:59.999`(周日)
**验证点:**
- ✅ 正确处理跨年周
- ✅ 遵循 ISO 8601 标准第1周包含该年第一个周四
- ✅ 周一可能在上一年
---
## 测试用例 14按周查询 - 最后一周
**输入:** `"2025-W52"`
**预期输出:**
- StartTime: `2025-12-22 00:00:00.000`(周一)
- EndTime: `2025-12-28 23:59:59.999`(周日)
**验证点:**
- ✅ 正确处理年末周
- ✅ 不会溢出到下一年
---
## 测试用例 15按周查询 - 闰年的第1周
**输入:** `"2024-W01"`
**预期输出:**
- StartTime: `2024-01-01 00:00:00.000`(周一)
- EndTime: `2024-01-07 23:59:59.999`(周日)
**验证点:**
- ✅ 正确处理闰年的周
- ✅ 2024年第1周从1月1日开始因为1月1日是周一
---
## 测试用例 16日期范围查询 - 7天范围
**输入:** `"2025-11-17~2025-11-23"`
**预期输出:**
- StartTime: `2025-11-17 00:00:00.000`
- EndTime: `2025-11-23 23:59:59.999`
**验证点:**
- ✅ 正确解析日期范围格式
- ✅ 使用 `~` 分隔符
- ✅ 包含起始和结束日期
---
## 测试用例 17日期范围查询 - 单天范围
**输入:** `"2025-11-19~2025-11-19"`
**预期输出:**
- StartTime: `2025-11-19 00:00:00.000`
- EndTime: `2025-11-19 23:59:59.999`
**验证点:**
- ✅ 支持起始和结束日期相同
- ✅ 等同于按天查询
---
## 测试用例 18日期范围查询 - 跨月范围
**输入:** `"2025-11-25~2025-12-05"`
**预期输出:**
- StartTime: `2025-11-25 00:00:00.000`
- EndTime: `2025-12-05 23:59:59.999`
**验证点:**
- ✅ 正确处理跨月日期范围
- ✅ 共11天
---
## 测试用例 19日期范围查询 - 跨年范围
**输入:** `"2025-12-28~2026-01-03"`
**预期输出:**
- StartTime: `2025-12-28 00:00:00.000`
- EndTime: `2026-01-03 23:59:59.999`
**验证点:**
- ✅ 正确处理跨年日期范围
- ✅ 共7天
---
## 测试用例 20错误格式 - 周数超出范围
**输入:** `"2025-W54"`
**预期输出:**
- 抛出异常:`周数无效: 54。有效范围为 1-53`
**验证点:**
- ✅ 验证周数范围
- ✅ 拒绝无效的周数
---
## 测试用例 21错误格式 - 日期范围顺序错误
**输入:** `"2025-11-23~2025-11-17"`
**预期输出:**
- 抛出异常:`结束日期 (2025-11-23) 不能早于开始日期 (2025-11-17)`
**验证点:**
- ✅ 验证日期范围顺序
- ✅ 提供清晰的错误提示
---
## 测试用例 22错误格式 - 日期范围格式错误
**输入:** `"2025-11-17~2025/11/23"`
**预期输出:**
- 抛出异常:`无法解析日期范围: 2025-11-17~2025/11/23。日期格式应为 yyyy-MM-dd~yyyy-MM-dd`
**验证点:**
- ✅ 验证日期范围中的日期格式
- ✅ 提供格式说明
---
## 测试用例 23错误格式 - 斜杠分隔
**输入:** `"2025/11/19"`
**预期输出:**
- 抛出异常,包含所有支持的格式说明
**验证点:**
- ✅ 拒绝不支持的日期格式
- ✅ 提供清晰的错误提示
---
## 测试用例 24错误格式 - 无效日期
**输入:** `"2025-13-01"` 13月不存在
**预期输出:**
- 抛出异常:`无法解析日期范围参数...`
**验证点:**
- ✅ 验证日期有效性
- ✅ 拒绝无效的月份
---
## 测试用例 25错误格式 - 空字符串
**输入:** `""`
**预期输出:**
- 抛出异常:`日期范围参数不能为空`
**验证点:**
- ✅ 验证参数非空
---
## 测试用例 26边界情况 - 前导/尾随空格
**输入:** `" 2025-11-19 "`
**预期输出:**
- StartTime: `2025-11-19 00:00:00.000`
- EndTime: `2025-11-19 23:59:59.999`
**验证点:**
- ✅ 自动去除前导和尾随空格
- ✅ 正确解析日期
---
## ISO 8601 周标准说明
### 基本规则
1. **周的定义**:每周从周一开始,到周日结束
2. **第1周的定义**:包含该年第一个周四的那一周
3. **周数范围**每年有52或53周
### 跨年周示例
- **2025年第1周**2024-12-30周一至 2025-01-05周日
- 因为2025年1月2日是周四所以包含这个周四的周是2025年第1周
- 这一周的周一在2024年12月
- **2024年第53周**2024-12-30周一至 2025-01-05周日
- 注意2024年第53周和2025年第1周是同一周
- 使用哪个周数取决于查询的年份
### C# ISOWeek 类
.NET Core 3.0+ 提供了 `System.Globalization.ISOWeek` 类:
- `ISOWeek.ToDateTime(year, week, dayOfWeek)` - 将周数转换为日期
- `ISOWeek.GetWeekOfYear(date)` - 获取日期所在的周数
- `ISOWeek.GetWeeksInYear(year)` - 获取某年的周数52或53
---
## 实现验证
### 闰年判断逻辑
C# 的 `DateTime` 类会自动处理闰年:
- `new DateTime(2024, 2, 29)` ✅ 有效2024是闰年
- `new DateTime(2025, 2, 29)` ❌ 抛出异常2025不是闰年
### 月份天数计算
使用 `AddMonths(1).AddMilliseconds(-1)` 方法:
- 自动计算下个月第一天
- 减去1毫秒得到当月最后一刻
- 无需手动判断月份天数
### 周查询实现
使用正则表达式和 ISOWeek 类:
```csharp
var weekPattern = @"^(\d{4})-?W(\d{1,2})$";
var weekMatch = Regex.Match(dateRange, weekPattern, RegexOptions.IgnoreCase);
if (weekMatch.Success)
{
int year = int.Parse(weekMatch.Groups[1].Value);
int week = int.Parse(weekMatch.Groups[2].Value);
var monday = ISOWeek.ToDateTime(year, week, DayOfWeek.Monday);
var sunday = monday.AddDays(6);
}
```
### 日期范围查询实现
使用字符串分割和日期解析:
```csharp
if (dateRange.Contains("~"))
{
var parts = dateRange.Split('~');
DateTime.TryParseExact(parts[0].Trim(), "yyyy-MM-dd", ...);
DateTime.TryParseExact(parts[1].Trim(), "yyyy-MM-dd", ...);
}
```
### 时间精度
- 使用毫秒级精度(.999
- 确保包含当天/当周/当月/当年的所有数据
- 避免边界数据遗漏

View File

@ -0,0 +1,246 @@
# 二次回路巡检统计 API - 日期范围查询示例
## 功能说明
`GetStatisticsAsync` 方法现在支持两种方式指定查询时间范围:
1. **新方式(推荐)**:使用 `DateRange` 字符串参数,支持按天/按月/按年查询
2. **传统方式**:使用 `StartTime``EndTime` 参数
优先级:如果同时提供了 `DateRange``StartTime/EndTime`,将优先使用 `DateRange`
---
## API 请求示例
### 1. 按天查询
查询 2025年11月19日 的所有巡检统计数据。
**请求体:**
```json
{
"dateRange": "2025-11-19"
}
```
**实际查询范围:**
- 开始时间2025-11-19 00:00:00.000
- 结束时间2025-11-19 23:59:59.999
**说明:**
- 格式:`yyyy-MM-dd`
- 自动查询该日期的完整一天数据
- 如果是历史日期,会使用缓存提升性能
---
### 2. 按月查询
查询 2025年11月 整月的巡检统计数据。
**请求体:**
```json
{
"dateRange": "2025-11"
}
```
**实际查询范围:**
- 开始时间2025-11-01 00:00:00.000
- 结束时间2025-11-30 23:59:59.999
**说明:**
- 格式:`yyyy-MM`
- 自动计算该月的第一天和最后一天
- 正确处理不同月份的天数28/29/30/31天
- 历史月份的每一天都会使用缓存
---
### 3. 按年查询
查询 2025年 全年的巡检统计数据。
**请求体:**
```json
{
"dateRange": "2025"
}
```
**实际查询范围:**
- 开始时间2025-01-01 00:00:00.000
- 结束时间2025-12-31 23:59:59.999
**说明:**
- 格式:`yyyy`
- 自动查询该年的完整数据
- 正确处理闰年如2024年2月有29天
- 历史年份的每一天都会使用缓存
---
### 4. 按周查询ISO 8601 标准)
查询 2025年第47周 的巡检统计数据。
**请求体(方式一):**
```json
{
"dateRange": "2025-W47"
}
```
**请求体(方式二):**
```json
{
"dateRange": "2025W47"
}
```
**实际查询范围:**
- 开始时间2025-11-17 00:00:00.000(周一)
- 结束时间2025-11-23 23:59:59.999(周日)
**说明:**
- 格式:`yyyy-Www``yyyyWww`W 可大写或小写)
- 遵循 ISO 8601 标准:周一为一周的第一天,周日为最后一天
- 每年第1周的定义包含该年第一个周四的那一周
- 自动处理跨年周如2025年第1周可能包含2024年12月的日期
- 周数范围1-53
---
### 5. 日期范围查询
查询指定日期范围的巡检统计数据。
**请求体:**
```json
{
"dateRange": "2025-11-17~2025-11-23"
}
```
**实际查询范围:**
- 开始时间2025-11-17 00:00:00.000
- 结束时间2025-11-23 23:59:59.999
**说明:**
- 格式:`yyyy-MM-dd~yyyy-MM-dd`
- 使用 `~` 符号分隔起始日期和结束日期
- 支持任意天数的范围不限于7天
- 结束日期必须大于或等于开始日期
- 适用于查询自定义时间段
---
### 6. 传统方式查询(向后兼容)
使用明确的开始时间和结束时间。
**请求体:**
```json
{
"startTime": "2025-11-01T00:00:00",
"endTime": "2025-11-19T23:59:59"
}
```
**说明:**
- 当 `DateRange` 未提供时,使用此方式
- 支持任意时间范围
- 与旧版本 API 完全兼容
---
### 7. 结合其他过滤条件
可以将 `DateRange` 与其他过滤条件组合使用。
**请求体:**
```json
{
"dateRange": "2025-11",
"transformerSubstationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"inspectionPlanId": "3fa85f64-5717-4562-b3fc-2c963f66afa7"
}
```
**说明:**
- 查询2025年11月指定变电站和巡检计划的统计数据
- 所有过滤条件可以自由组合
---
## 错误处理
### 无效的日期格式
**请求:**
```json
{
"dateRange": "2025/11/19"
}
```
**响应:**
```json
{
"success": false,
"error": "无法解析日期范围参数: 2025/11/19。支持的格式yyyy-MM-dd按天、yyyy-MM按月、yyyy按年"
}
```
### 未提供任何时间参数
**请求:**
```json
{
"transformerSubstationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
```
**响应:**
```json
{
"success": false,
"error": "请提供 DateRange 参数或 StartTime/EndTime 参数"
}
```
---
## 性能优化说明
### 缓存机制
1. **历史日期数据**:自动缓存到 MongoDB后续查询直接从缓存读取
2. **当天数据**:实时计算,不缓存(因为数据仍在更新)
3. **跨月/跨年查询**:历史部分从缓存读取,当天部分实时计算
### 查询性能对比
| 查询类型 | 首次查询 | 后续查询 | 性能提升 |
|---------|---------|---------|---------|
| 按天(历史) | 正常速度 | 极快(缓存) | 10-100倍 |
| 按月(历史) | 正常速度 | 极快(缓存) | 10-100倍 |
| 按年(历史) | 较慢 | 快(缓存) | 10-100倍 |
| 包含当天 | 正常速度 | 部分提升 | 2-10倍 |
---
## 日志示例
查询时会在服务器日志中记录详细信息:
```
[INFO] 使用 DateRange 参数解析时间范围: DateRange=2025-11, StartTime=2025-11-01 00:00:00, EndTime=2025-11-30 23:59:59
[INFO] 解析为按月查询: 2025-11 -> 2025-11-01 00:00:00.000 至 2025-11-30 23:59:59.999
[INFO] 从缓存获取统计数据成功: Date=2025-11-01
[INFO] 从缓存获取统计数据成功: Date=2025-11-02
...
[INFO] 当天统计数据实时计算: Date=2025-11-19
```

View File

@ -0,0 +1,21 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using YunDa.SOMS.DataTransferObject;
using YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection;
using YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.Output;
namespace YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection
{
public interface ISecondaryCircuitInspectionResultStatisticsAppService
{
Task<RequestResult<DailyReportOutput>> GetDailyReportAsync(DateTime reportDate, CancellationToken cancellationToken = default);
Task<RequestResult<ModuleTypeStatisticsOutput>> GetModuleTypeStatisticsAsync(CancellationToken cancellationToken = default);
Task<RequestResult<MonthlyFaultPredictionOutput>> GetMonthlyFaultPredictionAsync(CancellationToken cancellationToken = default);
Task<RequestResult<MonthlyReportOutput>> GetMonthlyReportAsync(int year, int month, CancellationToken cancellationToken = default);
Task<SecondaryCircuitInspectionStatisticsOutput> GetStatisticsAsync(SecondaryCircuitInspectionStatisticsInput input, CancellationToken cancellationToken = default);
Task<RequestResult<TimePeriodStatisticsOutput>> GetTimePeriodStatisticsAsync(TimePeriodStatisticsInput input, CancellationToken cancellationToken = default);
Task<RequestResult<WeeklyReportOutput>> GetWeeklyReportAsync(DateTime startDate, DateTime endDate, CancellationToken cancellationToken = default);
Task<RequestResult<YearlyStatisticsByMonthOutput>> GetYearlyStatisticsByMonthAsync(int year, CancellationToken cancellationToken = default);
}
}

View File

@ -0,0 +1,205 @@
# 按周查询详细指南
## ISO 8601 周标准
### 什么是 ISO 8601 周?
ISO 8601 是国际标准化组织制定的日期和时间表示标准。在这个标准中:
1. **周的定义**
- 每周从**周一**开始,到**周日**结束
- 这与某些国家(如美国)以周日为一周开始的习惯不同
2. **第1周的定义**
- 每年的第1周是包含该年**第一个周四**的那一周
- 这意味着第1周至少有4天在新的一年中
3. **周数范围**
- 大多数年份有52周
- 某些年份有53周长年
---
## 跨年周的处理
### 示例 12025年第1周
```
2024年12月 2025年1月
一 二 三 四 五 六 日 一 二 三 四 五 六 日
30 31 1 2 3 4 5
```
- **2025年第1周**2024-12-30周一至 2025-01-05周日
- **原因**2025年1月2日周四是该年的第一个周四
- **注意**这一周的前两天12月30-31日在2024年
### 示例 22024年第1周
```
2023年12月 2024年1月
一 二 三 四 五 六 日 一 二 三 四 五 六 日
1 2 3 4 5 6 7
```
- **2024年第1周**2024-01-01周一至 2024-01-07周日
- **原因**2024年1月1日是周一1月4日周四是该年的第一个周四
- **注意**这一周完全在2024年内
### 示例 32026年第1周
```
2025年12月 2026年1月
一 二 三 四 五 六 日 一 二 三 四 五 六 日
29 30 31 1 2 3 4
```
- **2026年第1周**2025-12-29周一至 2026-01-04周日
- **原因**2026年1月1日周四是该年的第一个周四
- **注意**这一周的前三天12月29-31日在2025年
---
## API 使用示例
### 查询2025年第47周
**请求:**
```json
{
"dateRange": "2025-W47"
}
```
```json
{
"dateRange": "2025W47"
}
```
**实际查询范围:**
- 开始2025-11-17 00:00:00.000(周一)
- 结束2025-11-23 23:59:59.999(周日)
**日志输出:**
```
[INFO] 解析为按周查询 (ISO 8601): 2025-W47 -> 2025-11-17 00:00:00.000 至 2025-11-23 23:59:59.999 (周一至周日)
```
---
### 查询2025年第1周跨年
**请求:**
```json
{
"dateRange": "2025-W01"
}
```
**实际查询范围:**
- 开始2024-12-30 00:00:00.000周一在2024年
- 结束2025-01-05 23:59:59.999周日在2025年
**说明:**
- 虽然周一在2024年但这是2025年的第1周
- 系统会自动处理跨年情况
- 缓存机制会分别缓存2024-12-30、2024-12-31和2025-01-01至2025-01-05的数据
---
### 查询2024年第53周
**请求:**
```json
{
"dateRange": "2024-W53"
}
```
**实际查询范围:**
- 开始2024-12-30 00:00:00.000(周一)
- 结束2025-01-05 23:59:59.999(周日)
**注意:**
- 2024年有53周长年
- 2024年第53周和2025年第1周是同一周
- 使用哪个周数取决于你想查询哪一年的数据
---
## 如何判断某年有多少周?
使用 C# 代码:
```csharp
int weeksIn2024 = System.Globalization.ISOWeek.GetWeeksInYear(2024); // 返回 53
int weeksIn2025 = System.Globalization.ISOWeek.GetWeeksInYear(2025); // 返回 52
```
**长年53周的条件**
- 该年的1月1日是周四
- 该年是闰年且1月1日是周三
---
## 错误处理
### 无效的周数
**请求:**
```json
{
"dateRange": "2025-W54"
}
```
**响应:**
```json
{
"success": false,
"error": "周数无效: 54。有效范围为 1-53"
}
```
### 不存在的周
**请求:**
```json
{
"dateRange": "2025-W53"
}
```
**响应:**
```json
{
"success": false,
"error": "无效的周数: 2025年第53周不存在。..."
}
```
**说明:**2025年只有52周第53周不存在
---
## 与缓存机制的配合
按周查询完全兼容现有的按日缓存机制:
1. **查询过程**
- 系统将周范围拆分为7天
- 对每一天检查缓存
- 历史日期从缓存读取,当天数据实时计算
2. **性能优化**
- 首次查询某周需要计算7天的数据
- 后续查询同一周:历史部分直接从缓存读取
- 如果查询的周包含今天今天的数据实时计算其他6天从缓存读取
3. **跨年周的缓存**
- 跨年周的每一天都会单独缓存
- 例如2025-W01包含2024年的2天和2025年的5天
- 这7天的数据会分别缓存互不影响

View File

@ -892,61 +892,16 @@
批量删除巡检结果
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetStatisticsAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsInput,System.Threading.CancellationToken)">
<summary>
获取巡检统计信息
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetTimePeriodStatisticsAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.Output.TimePeriodStatisticsInput,System.Threading.CancellationToken)">
<summary>
获取时间段统计信息
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetModuleTypeStatisticsAsync(System.Threading.CancellationToken)">
<summary>
获取按模块类型分组的统计信息
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.FindRootParentType(YunDa.SOMS.Entities.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionModuleType,System.Collections.Generic.List{YunDa.SOMS.Entities.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionModuleType})">
<summary>
查找根父类型
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetMonthlyFaultPredictionAsync(System.Threading.CancellationToken)">
<summary>
获取月度故障统计及预测
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.PredictNextMonths(System.Collections.Generic.List{YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.Output.MonthlyFaultData},System.Int32)">
<summary>
使用简单线性趋势预测未来月份的故障概率
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetDailyReportAsync(System.DateTime,System.Threading.CancellationToken)">
<summary>
获取日报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetWeeklyReportAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<summary>
获取周报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetMonthlyReportAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
<summary>
获取月报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.UpdateReportWithAIAnalysisAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.Output.UpdateReportAIAnalysisInput,System.Threading.CancellationToken)">
<summary>
更新报告AI分析结果和巡检结果处理措施
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetSortDefinition(System.String)">
<summary>
获取排序定义
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetCollectionsForTimeRange(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
<summary>
根据时间范围获取需要查询的集合列表
@ -967,81 +922,161 @@
根据ID列表批量删除巡检结果跨分片集合删除
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetCachedReportAsync(System.String,System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<member name="T:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService">
<summary>
二次回路巡检结果服务实现
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetCollection``1(System.String)">
<summary>
获取MongoDB集合
</summary>
<typeparam name="T">实体类型</typeparam>
<param name="collectionName">集合名称</param>
<returns>MongoDB集合</returns>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetStatisticsAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsInput,System.Threading.CancellationToken)">
<summary>
获取巡检统计信息(支持按日缓存和灵活的日期范围格式)
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.ParseDateRange(System.String)">
<summary>
解析日期范围字符串,支持多种格式
</summary>
<param name="dateRange">日期范围字符串</param>
<returns>开始时间和结束时间的元组</returns>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetDailyStatisticsFromCacheAsync(System.DateTime,System.Threading.CancellationToken)">
<summary>
从缓存获取某一天的统计数据
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.SaveDailyStatisticsToCacheAsync(System.DateTime,YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsOutput,System.Threading.CancellationToken)">
<summary>
保存某一天的统计数据到缓存
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.CalculateDailyStatisticsAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<summary>
计算某一天的统计数据(包含基础数据填充)
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.MergeDailyStatistics(System.Collections.Generic.List{YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionStatisticsOutput})">
<summary>
合并多天的统计数据
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetTimePeriodStatisticsAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.Output.TimePeriodStatisticsInput,System.Threading.CancellationToken)">
<summary>
获取时间段统计信息
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetYearlyStatisticsByMonthAsync(System.Int32,System.Threading.CancellationToken)">
<summary>
获取年度统计信息(按月分组)
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetModuleTypeStatisticsAsync(System.Threading.CancellationToken)">
<summary>
获取按模块类型分组的统计信息
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.FindRootParentType(YunDa.SOMS.Entities.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionModuleType,System.Collections.Generic.List{YunDa.SOMS.Entities.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionModuleType})">
<summary>
查找根父类型
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetMonthlyFaultPredictionAsync(System.Threading.CancellationToken)">
<summary>
获取月度故障统计及预测
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.PredictNextMonths(System.Collections.Generic.List{YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.Output.MonthlyFaultData},System.Int32)">
<summary>
使用简单线性趋势预测未来月份的故障概率
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetDailyReportAsync(System.DateTime,System.Threading.CancellationToken)">
<summary>
获取日报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetWeeklyReportAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<summary>
获取周报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetMonthlyReportAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
<summary>
获取月报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetCollectionsForTimeRange(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
<summary>
根据时间范围获取需要查询的集合列表
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetCachedReportAsync(System.String,System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<summary>
获取缓存的报告
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.SaveReportAsync(System.String,System.DateTime,System.DateTime,MongoDB.Bson.BsonDocument,System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.SaveReportAsync(System.String,System.DateTime,System.DateTime,MongoDB.Bson.BsonDocument,System.Threading.CancellationToken)">
<summary>
保存报告到缓存
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GenerateDailyReportAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GenerateDailyReportAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<summary>
生成日报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GenerateWeeklyReportAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GenerateWeeklyReportAsync(System.DateTime,System.DateTime,System.Threading.CancellationToken)">
<summary>
生成周报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GenerateMonthlyReportAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GenerateMonthlyReportAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
<summary>
生成月报
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetModuleTypeStatisticsForResultsAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetModuleTypeStatisticsForResultsAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<summary>
获取模块类型统计(用于日报)
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetModuleTypeDistributionAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.GetModuleTypeDistributionAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<summary>
获取模块类型分布(用于周报和月报)
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.CalculateKeyIndicatorComparisonAsync(System.Int32,System.Int32,System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.CalculateKeyIndicatorComparisonAsync(System.Int32,System.Int32,System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<summary>
计算关键指标对比
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.CreateIndicatorComparison(System.String,System.Double,System.Double)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.CreateIndicatorComparison(System.String,System.Double,System.Double)">
<summary>
创建指标对比对象
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.CalculateMTBF(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult})">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.CalculateMTBF(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult})">
<summary>
计算平均故障间隔MTBF
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.CalculateTimelinessRateAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Int32,System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.CalculateTimelinessRateAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Int32,System.Threading.CancellationToken)">
<summary>
计算异常处理及时率
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.CalculateDisposalCompletionRateAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultStatisticsAppService.CalculateDisposalCompletionRateAsync(System.Collections.Generic.List{Yunda.SOMS.MongoDB.Entities.Inspection.SecondaryCircuitInspectionResult},System.Threading.CancellationToken)">
<summary>
计算处置完成率
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetAbnormalAnalysisAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionAbnormalAnalysisInput,System.Threading.CancellationToken)">
<summary>
获取异常分析数据
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetDeviceReportAsync(YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionDeviceReportInput,System.Threading.CancellationToken)">
<summary>
获取设备巡检报告
</summary>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionResultAppService.GetItemExecutionHistoryAsync(System.Guid,YunDa.SOMS.DataTransferObject.DataMonitoring.SecondaryCircuitInspection.SecondaryCircuitInspectionExecutionHistoryInput,System.Threading.CancellationToken)">
<summary>
获取巡检子项执行历史
</summary>
</member>
<member name="T:YunDa.SOMS.MongoDB.Application.Inspection.IInspectionItemResultAppService">
<summary>
巡检项结果管理服务
@ -1201,12 +1236,6 @@
</summary>
<returns></returns>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.Inspection.InspectionItemResultAppService.TestGetAlarmMessage(System.String,System.String,System.String)">
<summary>
测试报警api
</summary>
<returns></returns>
</member>
<member name="M:YunDa.SOMS.MongoDB.Application.Inspection.InspectionItemResultAppService.GetAlarmMessage(System.Nullable{System.Guid},System.Int32,System.String)">
<summary>
获取报警信息

View File

@ -22,7 +22,7 @@
"ISMS_ReportServerTempDBSqlServerSetting": "Server=127.0.0.1;User ID=sa;Password=sa;Database=ReportServerTempDB;Trusted_Connection=False;TrustServerCertificate=True",
"MongoDBSetting": {
"Host": "127.0.0.1",
"Host": "192.168.81.22",
"Port": "37017",
"DatabaseName": "soms_mongodb",
"IsAuth": "false",
@ -30,7 +30,7 @@
"PassWord": "123456"
},
"RedisSetting": {
"Host": "127.0.0.1",
"Host": "192.168.81.22",
"Port": "36379",
"Auth": "yunda123",
"Name": "",
@ -47,7 +47,7 @@
"DataMonitoringServiceBaseUrl": "http://127.0.0.1:8093/SOMS/api/dataMonitoringService/",
"MaxDataCount": 80000,
"Swagger": true,
"IsmsGateWayIp": "http://192.168.81.231:38094",
"IsmsGateWayIp": "http://192.168.81.22:38094",
"IsmsftpIp": "192.168.65.33:48021",
"IsmsftpUserName": "admin",
"IsmsftpPassword": "yunda123",