using Entity.Ammeter; using Entity.Dto.Req; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkCore.Entity; using Microsoft.AspNetCore.Mvc.RazorPages; using Repository.Ammeter; using SqlSugar; namespace Service.Ammeter { /// /// /// [Scope("SingleInstance")] public class EmeterHourEnergyService: BaseServices { public EmeterHourEnergyService(EmeterHourEnergyRepository service) { this.BaseDal = service; } public async Task>> Page(PageAmmeterReq queryPageModel) { QueryPageModel queryPageModel1 = new QueryPageModel { PageNum = queryPageModel.PageNum, PageSize = queryPageModel.PageSize, }; if (!string.IsNullOrEmpty(queryPageModel.Code)) return Result>.Success(PageResult.ConvertPage(this.BaseDal.QueryIPageByCause(queryPageModel1, u => u.Code == queryPageModel.Code))); else return Result>.Success(PageResult.ConvertPage(this.BaseDal.QueryIPageByCause(queryPageModel1, null))); } /// /// 根据小时统计电量 /// /// public async Task> GetTodayHourlyElectricalData(int type) { string sql = $@" WITH hourly_max_min AS ( SELECT `code`, DATE_FORMAT(`time`, '%Y-%m-%d %H:00:00') AS `Hour`, MAX(`real_time_value`) AS `MaxValue`, MIN(`real_time_value`) AS `MinValue`, COUNT(*) AS `record_count` FROM `emeter_hour_energy` WHERE DATE(`time`) = CURDATE() AND `type` = {type} GROUP BY `code`, DATE_FORMAT(`time`, '%Y-%m-%d %H:00:00') ), previous_hour_max AS ( SELECT `code`, `Hour`, LAG(`MaxValue`) OVER (PARTITION BY `code` ORDER BY `Hour`) AS `PreviousMaxValue` FROM hourly_max_min ) SELECT h.`code`, h.`Hour`, CASE WHEN h.`record_count` > 1 THEN h.`MaxValue` - h.`MinValue` ELSE h.`MaxValue` - COALESCE(p.`PreviousMaxValue`, 0) END AS `Value` FROM hourly_max_min h LEFT JOIN previous_hour_max p ON h.`code` = p.`code` AND h.`Hour` = p.`Hour` ORDER BY h.`code`, h.`Hour`; "; List emeterEnergies = await this.BaseDal.SqlQueryable(sql); return emeterEnergies; } /// /// 获取直流电表实时数据 /// /// public async Task> GetEnergyMeterRealTime(string endTime, int type) { // 将传入的时间参数转换为 DateTime 类型 DateTime endDateTime = DateTime.Parse(endTime); // 根据传入的时间参数计算 1 天前的时间 DateTime startDateTime = endDateTime.AddDays(-1); // 构建 SQL 查询字符串并包含参数 string sql = @" WITH latest_data AS ( SELECT code, MAX(time) AS latest_upload_time FROM emeter_hour_energy WHERE time >= @StartDateTime AND time <= @EndDateTime AND type = @Type GROUP BY code ), max_value_data AS ( SELECT e.*, ROW_NUMBER() OVER (PARTITION BY e.code ORDER BY e.real_time_value DESC) AS rn FROM emeter_hour_energy e JOIN latest_data ld ON e.code = ld.code AND e.time = ld.latest_upload_time WHERE e.type = @Type ) SELECT * FROM max_value_data WHERE rn = 1; "; // 使用参数化查询防止 SQL 注入 var parameters = new List { new SugarParameter("@StartDateTime", startDateTime), new SugarParameter("@EndDateTime", endDateTime), new SugarParameter("@Type", type) }; // 调用现有的 SqlQuery 方法 List emeterEnergyChanges = this.BaseDal.SqlQuery(sql, parameters); return emeterEnergyChanges; } } }