2025-03-17 14:23:48 +08:00
using System ;
using System.Collections.Generic ;
2025-03-14 14:38:08 +08:00
using System.Threading.Tasks ;
using DotNetCore.CAP ;
2025-03-12 14:57:42 +08:00
using JiShe.CollectBus.Ammeters ;
using JiShe.CollectBus.Common.Consts ;
2025-04-14 23:42:18 +08:00
using JiShe.CollectBus.Common.DeviceBalanceControl ;
2025-04-10 14:12:14 +08:00
using JiShe.CollectBus.Common.Helpers ;
2025-03-12 14:57:42 +08:00
using JiShe.CollectBus.FreeSql ;
2025-03-14 14:24:38 +08:00
using JiShe.CollectBus.GatherItem ;
2025-04-08 17:44:42 +08:00
using JiShe.CollectBus.IoTDBProvider ;
2025-03-21 11:48:31 +08:00
using JiShe.CollectBus.IotSystems.Devices ;
2025-03-17 14:23:48 +08:00
using JiShe.CollectBus.IotSystems.MessageIssueds ;
2025-03-18 22:43:24 +08:00
using JiShe.CollectBus.IotSystems.MeterReadingRecords ;
2025-03-14 14:38:08 +08:00
using JiShe.CollectBus.IotSystems.Watermeter ;
2025-03-20 16:40:27 +08:00
using JiShe.CollectBus.Repository ;
using JiShe.CollectBus.Repository.MeterReadingRecord ;
2025-03-24 20:54:31 +08:00
using MassTransit ;
2025-03-12 14:57:42 +08:00
using Microsoft.AspNetCore.Authorization ;
2025-04-10 14:12:14 +08:00
using Microsoft.AspNetCore.Mvc ;
2025-04-09 17:29:30 +08:00
using Microsoft.Extensions.Configuration ;
2025-03-13 10:51:16 +08:00
using Microsoft.Extensions.Logging ;
2025-03-17 14:23:48 +08:00
using Volo.Abp.Domain.Repositories ;
2025-03-18 13:56:38 +08:00
using Volo.Abp.Uow ;
2025-03-12 14:57:42 +08:00
2025-03-14 14:38:08 +08:00
namespace JiShe.CollectBus.ScheduledMeterReading
2025-03-12 14:57:42 +08:00
{
/// <summary>
/// 能耗系统定时采集服务
/// </summary>
[AllowAnonymous]
//[Route($"/energy/app/scheduled")]
public class EnergySystemScheduledMeterReadingService : BasicScheduledMeterReadingService
{
2025-04-09 17:29:30 +08:00
string serverTagName = string . Empty ;
2025-03-24 20:54:31 +08:00
public EnergySystemScheduledMeterReadingService ( ILogger < EnergySystemScheduledMeterReadingService > logger ,
2025-04-09 17:29:30 +08:00
ICapPublisher producerBus , IIoTDBProvider dbProvider , IMeterReadingRecordRepository meterReadingRecordRepository , IConfiguration configuration ) : base ( logger , producerBus , meterReadingRecordRepository , dbProvider )
2025-03-12 16:29:38 +08:00
{
2025-04-09 17:29:30 +08:00
serverTagName = configuration . GetValue < string > ( CommonConst . ServerTagName ) ! ;
2025-03-12 16:29:38 +08:00
}
2025-03-12 14:57:42 +08:00
public sealed override string SystemType = > SystemTypeConst . Energy ;
2025-04-09 17:29:30 +08:00
public sealed override string ServerTagName = > serverTagName ;
2025-03-14 14:24:38 +08:00
/// <summary>
/// 获取采集项列表
/// </summary>
/// <returns></returns>
public override async Task < List < GatherItemInfo > > GetGatherItemByDataTypes ( )
{
try
{
string sql = $"SELECT DataType,ItemCode FROM TB_GatherItem(NOLOCK) WHERE [State]=0" ;
return await SqlProvider . Instance . Change ( DbEnum . EnergyDB )
. Ado
. QueryAsync < GatherItemInfo > ( sql , null ) ;
}
catch
{
return null ;
}
}
2025-03-12 14:57:42 +08:00
/// <summary>
/// 获取电表信息
/// </summary>
/// <param name="gatherCode">采集端Code</param>
/// <returns></returns>
//[HttpGet]
//[Route($"ammeter/list")]
public override async Task < List < AmmeterInfo > > GetAmmeterInfoList ( string gatherCode = "V4-Gather-8890" )
{
2025-04-14 16:41:41 +08:00
//List<AmmeterInfo> ammeterInfos = new List<AmmeterInfo>();
//ammeterInfos.Add(new AmmeterInfo()
//{
// Baudrate = 2400,
// FocusAddress = "402440506",
// Name = "张家祠工务(三相电表)",
// FocusID = 95780,
// DatabaseBusiID = 1,
// MeteringCode = 1,
// AmmerterAddress = "402410040506",
// ID = 127035,
// TypeName = 3,
// DataTypes = "449,503,581,582,583,584,585,586,587,588,589,590,591,592,593,594,597,598,599,600,601,602,603,604,605,606,607,608,661,663,677,679",
// TimeDensity = 15,
//});
//ammeterInfos.Add(new AmmeterInfo()
//{
// Baudrate = 2400,
// FocusAddress = "542400504",
// Name = "五号配(长芦二所四排)(单相电表)",
// FocusID = 69280,
// DatabaseBusiID = 1,
// MeteringCode = 2,
// AmmerterAddress = "542410000504",
// ID = 95594,
// TypeName = 1,
// DataTypes = "581,589,592,597,601",
// TimeDensity = 15,
//});
//return ammeterInfos;
2025-03-24 20:54:31 +08:00
2025-03-27 08:38:19 +08:00
string sql = $ @ "SELECT C.ID,C.Name,C.FocusID,C.SingleRate,C.MeteringCode,C.Code AS BrandType,C.Baudrate,C.Password,C.MeteringPort,C.[Address] AS AmmerterAddress,C.TypeName,C.Protocol,C.TripState,C.[State],B.[Address],B.AreaCode,B.AutomaticReport,D.DataTypes,B.TimeDensity,A.GatherCode,C.Special,C.[ProjectID],B.AbnormalState,B.LastTime,CONCAT(B.AreaCode, B.[Address]) AS FocusAddress,(select top 1 DatabaseBusiID from TB_Project where ID = B.ProjectID) AS DatabaseBusiID
FROM TB_GatherInfo ( NOLOCK ) AS A
INNER JOIN TB_FocusInfo ( NOLOCK ) AS B ON A . ID = B . GatherInfoID AND B . RemoveState > = 0 AND B . State > = 0
INNER JOIN TB_AmmeterInfo ( NOLOCK ) AS C ON B . ID = C . FocusID AND C . State > = 0 AND C . State < 100
INNER JOIN TB_AmmeterGatherItem ( NOLOCK ) AS D ON C . ID = D . AmmeterID AND D . State > = 0
WHERE 1 = 1 and C . Special = 0 ";
//TODO 记得移除特殊表过滤
2025-03-24 20:54:31 +08:00
2025-04-14 16:41:41 +08:00
//if (!string.IsNullOrWhiteSpace(gatherCode))
//{
// sql = $@"{sql} AND A.GatherCode = '{gatherCode}'";
//}
2025-03-27 08:38:19 +08:00
return await SqlProvider . Instance . Change ( DbEnum . EnergyDB )
. Ado
. QueryAsync < AmmeterInfo > ( sql ) ;
2025-03-12 14:57:42 +08:00
}
/// <summary>
/// 获取水表信息
/// </summary>
/// <param name="gatherCode">采集端Code</param>
/// <returns></returns>
//[HttpGet]
//[Route($"ammeter/list")]
public override async Task < List < WatermeterInfo > > GetWatermeterInfoList ( string gatherCode = "V4-Gather-8890" )
{
string sql = $ @ "SELECT
A . ID ,
A . Name ,
A . FocusID ,
A . MeteringCode ,
A . Baudrate ,
A . MeteringPort ,
A . [ Address ] AS MeterAddress ,
A . [ Password ] ,
A . TypeName ,
A . Protocol ,
A . Code ,
A . LinkType ,
A . HaveValve ,
A . MeterType AS MeterTypeName ,
A . MeterBrand ,
A . TimesRate ,
A . TimeDensity ,
A . TripState ,
B . [ Address ] ,
B . AreaCode ,
B . AutomaticReport ,
A . [ State ] ,
C . GatherCode ,
A . [ ProjectID ] ,
B . AbnormalState ,
2025-03-21 11:48:31 +08:00
B . LastTime ,
CONCAT ( B . AreaCode , B . [ Address ] ) AS FocusAddress ,
( select top 1 DatabaseBusiID from TB_Project where ID = b . ProjectID ) AS DatabaseBusiID
2025-03-12 14:57:42 +08:00
FROM [ dbo ] . [ TB_WatermeterInfo ] ( NOLOCK ) AS A
INNER JOIN [ dbo ] . [ TB_FocusInfo ] ( NOLOCK ) AS B ON A . FocusID = B . ID AND B . RemoveState > = 0 AND B . State > = 0
INNER JOIN [ dbo ] . [ TB_GatherInfo ] ( NOLOCK ) AS C ON B . GatherInfoID = C . ID
WHERE A . State > = 0 AND A . State < 100 ";
if ( ! string . IsNullOrWhiteSpace ( gatherCode ) )
{
sql = $@"{sql} AND C.GatherCode= '{gatherCode}'" ;
}
return await SqlProvider . Instance . Change ( DbEnum . EnergyDB )
. Ado
. QueryAsync < WatermeterInfo > ( sql ) ;
}
2025-04-10 14:12:14 +08:00
/// <summary>
/// 测试设备分组均衡控制算法
/// </summary>
/// <param name="deviceCount"></param>
/// <returns></returns>
[HttpGet]
public async Task TestDeviceGroupBalanceControl ( int deviceCount = 200000 )
{
var deviceList = new List < string > ( ) ;
for ( int i = 0 ; i < deviceCount ; i + + )
{
deviceList . Add ( $"Device_{Guid.NewGuid()}" ) ;
}
2025-04-14 16:41:41 +08:00
// 初始化缓存
DeviceGroupBalanceControl . InitializeCache ( deviceList ) ;
2025-04-10 14:12:14 +08:00
// 打印分布统计
DeviceGroupBalanceControl . PrintDistributionStats ( ) ;
await Task . CompletedTask ;
}
2025-03-12 14:57:42 +08:00
}
}