mh_jy_safe/APT.MicroApi/APT.PF.WebApi/Controllers/Api/HomePageController.cs

2636 lines
131 KiB
C#
Raw Normal View History

2025-08-25 09:56:57 +08:00
using APT.BaseData.Domain.ApiModel;
using APT.BaseData.Domain.ApiModel.PF;
using APT.BaseData.Domain.ApiModel.Platform;
using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Entities.BD;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.IServices.BD;
using APT.ECM.Domain.ApiModel.DD;
using APT.ECM.Domain.ApiModel.PF;
using APT.ECM.Domain.Enums.ED;
using APT.ECM.Domain.Enums.KR;
using APT.Infrastructure.Api.Redis;
using APT.Infrastructure.Core;
using APT.Infrastructure.Core.Refctor;
using APT.Utility;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace APT.PF.WebApiControllers.Api.PF
{
/// <summary>
/// 系统日志
/// </summary>
[Route("api/PF/HomePage")]
public partial class HomePageController : AuthorizeApiController<T_PF_DATA_CHANNEL>
{
private const int RANK_NO_WIDTH = 30;
private const int RANK_VAL_WIDTH = 50;
private const int RANK_NAME_WIDTH = 100;
/// <param name="filter">
/// 首页显示
/// Keyword用户id
/// Parameter1:表单编码
/// </param>
/// <returns>首页显示实体数据</returns>
[HttpPost, Route("Show")]
public JsonActionResult<HomePageModel> Show([FromBody] KeywordFilter filter)
{
return base.SafeExecute(() =>
{
HomePageModel homePage = new HomePageModel();
var redisConf = GetRedisConfig(filter);
#region
foreach (var item in redisConf.StatisticsData.Where(i => i.IsCheck))
{
var redisKey = RedisCacheKey.HomePageStatistics + "_" + item.Code + "_" + filter.Keyword;
var redisData = CsRedisManager.GetClient().Get<HomePageCheckSeeting>(redisKey);
if (redisData != null && redisData.Time.Date == DateTime.Now.Date)
{
homePage.StatisticsData.Add(redisData.Prop);
continue;
}
var statistic = new StatisticsProps();
switch (Convert.ToInt32(item.Code))
{
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalTotalConsumption(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalDosage(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalDosage(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalDosage(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageStatisticsEnum.线:
case (int)HomePageStatisticsEnum.线:
{
statistic = CalAppMonitor(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageStatisticsEnum.线:
case (int)HomePageStatisticsEnum.线:
{
statistic = CalAppMonitor(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageStatisticsEnum.线:
case (int)HomePageStatisticsEnum.线:
{
statistic = CalAppMonitor(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.线:
{
statistic = CalDataQuality(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.线:
{
statistic = CalDataQuality(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.线:
{
statistic = CalDataQuality(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalFlowQty(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalAlarmLog(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
case (int)HomePageStatisticsEnum.:
{
statistic = CalAmortize(filter, Convert.ToInt32(item.Code));
break;
}
}
homePage.StatisticsData.Add(statistic);
SetStatisticRedis(statistic, redisKey);
}
#endregion
#region
foreach (var item in redisConf.ChartData.Where(i => i.IsCheck))
{
//redis获取判断时间如果存在当天的Redis数据则直接返回
var redisKey = RedisCacheKey.HomePageCharts + "_" + item.Code + "_" + filter.Keyword;
var redisData = CsRedisManager.GetClient().Get<HomePageCheckSeeting>(redisKey);
if (redisData != null && redisData.Time.Date == DateTime.Now.Date && redisData.Prop.Data != null)
{
homePage.ChartData.Add(redisData.Prop);
continue;
}
var chart = new ChartProps();
switch (Convert.ToInt32(item.Code))
{
case (int)HomePageChartEnum.:
{
chart = CalEnergyConStatistics(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
{
chart = CalEnergyStatistics(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
{
chart = CalPriceStatistics(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
{
chart = CalPeakValley(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
{
chart = CalDataQualityChart(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageChartEnum.:
{
chart = CalDataQualityChart(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageChartEnum.:
{
chart = CalDataQualityChart(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageChartEnum.:
{
chart = CalWriteOffChart(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
{
chart = CalProStatisticalChart(filter, Convert.ToInt32(item.Code), FMTimeDimEnum.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalProStatisticalChart(filter, Convert.ToInt32(item.Code), FMTimeDimEnum.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalUnitUseDataByTimeChart(filter, Convert.ToInt32(item.Code), FMTimeDimEnum., EDConsType.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalUnitUseDataByTimeChart(filter, Convert.ToInt32(item.Code), FMTimeDimEnum., EDConsType.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalUnitUseDataByTimeChart(filter, Convert.ToInt32(item.Code), FMTimeDimEnum., EDConsType.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalUnitUseDataByTimeChart(filter, Convert.ToInt32(item.Code), FMTimeDimEnum., EDConsType.);
break;
}
case (int)HomePageChartEnum.:
case (int)HomePageChartEnum.:
case (int)HomePageChartEnum.:
case (int)HomePageChartEnum.:
{
chart = CalPeakValleyPie(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
{
chart = CalAmortizePie(filter, Convert.ToInt32(item.Code), FMTimeDimEnum.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalAmortizePie(filter, Convert.ToInt32(item.Code), FMTimeDimEnum.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalRepairPie(filter, Convert.ToInt32(item.Code), FMTimeDimEnum.);
break;
}
case (int)HomePageChartEnum.:
{
chart = CalRepairPie(filter, Convert.ToInt32(item.Code), FMTimeDimEnum.);
break;
}
case (int)HomePageChartEnum.:
case (int)HomePageChartEnum.:
{
chart = CalAlarmNumChart(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageChartEnum.:
case (int)HomePageChartEnum.:
{
chart = CalAlarmLevelChart(filter, Convert.ToInt32(item.Code));
break;
}
}
homePage.ChartData.Add(chart);
SetStatisticRedis(chart, redisKey);
}
#endregion
#region
foreach (var item in redisConf.RankingData.Where(i => i.IsCheck))
{
//redis获取判断时间如果存在当天的Redis数据则直接返回
var redisKey = RedisCacheKey.HomePageRankings + "_" + item.Code + "_" + filter.Keyword;
var redisData = CsRedisManager.GetClient().Get<HomePageCheckSeeting>(redisKey);
if (redisData != null && redisData.Time.Date == DateTime.Now.Date && redisData.Prop.Data != null)
{
homePage.RankingData.Add(redisData.Prop);
continue;
}
var ranking = new RankingProps();
switch (Convert.ToInt32(item.Code))
{
case (int)HomePageRankingEnum.:
{
ranking = CalEnergyRanking(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalDosageRanking(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalDosageRanking(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalDosageRanking(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalDosageRanking(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalDosageRanking(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalDosageRanking(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalAmortizeRanking(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalAmortizeRanking(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalAmortizeRanking(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
case (int)HomePageRankingEnum.:
{
ranking = CalWriteOffRanking(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.:
case (int)HomePageRankingEnum.:
{
ranking = CalAlarmRanking(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.:
case (int)HomePageRankingEnum.:
{
ranking = CalAlarmTimeRanking(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.KPI排名:
case (int)HomePageRankingEnum.KPI排名:
case (int)HomePageRankingEnum.KPI分值变化率排名:
case (int)HomePageRankingEnum.KPI分值变化率排名:
{
ranking = GetMarkItemData(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.:
case (int)HomePageRankingEnum.:
{
ranking = CalCostRanking(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.线:
case (int)HomePageRankingEnum.线:
{
ranking = OffLineDataRanking(filter, Convert.ToInt32(item.Code));
break;
}
case (int)HomePageRankingEnum.:
case (int)HomePageRankingEnum.:
{
ranking = RepairDataRanking(filter, Convert.ToInt32(item.Code), "Electric");
break;
}
case (int)HomePageRankingEnum.:
case (int)HomePageRankingEnum.:
{
ranking = RepairDataRanking(filter, Convert.ToInt32(item.Code), "Water");
break;
}
case (int)HomePageRankingEnum.:
case (int)HomePageRankingEnum.:
{
ranking = RepairDataRanking(filter, Convert.ToInt32(item.Code), "Gas");
break;
}
}
homePage.RankingData.Add(ranking);
SetStatisticRedis(ranking, redisKey);
}
#endregion
#region HMI
foreach (var item in redisConf.HmiData.Where(i => i.IsCheck))
{
//redis获取判断时间如果存在当天的Redis数据则直接返回
homePage.HmiData.Add(item);
}
#endregion
return homePage;
});
}
#region
/// <summary>
/// 计算总能耗
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private StatisticsProps CalTotalConsumption(KeywordFilter filter, int code)
{
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var st = new DateTime();
var et = new DateTime();
if (code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum.)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
var appids = this.GetEntitiesByRedis<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null, filter).Select(x => x.APPLIANCE_ID);
List<T_BD_APPLIANCE_ATTR> appAttrs = GetApplicaceAttr(filter, appids);
var vids = appAttrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var totalData = 0m;
var isEnergy = code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum.;
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { isEnergy ? "CONS_DATA" : "PRICE" };
if (isEnergy)
{
var monthEnergy = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(i => i.TIME >= st && i.TIME < et && vids.Contains(i.VAR_ID), baseFilter);
totalData = monthEnergy.Sum(i => i.CONS_DATA);
}
else
{
var monthVal = this.GetEntities<T_EM_ENERGY_VAL_MONTH>(i => i.TIME >= st && i.TIME < et && vids.Contains(i.VAR_ID), baseFilter);
totalData = monthVal.Sum(i => i.PRICE);
}
statistic.Data.Val = (totalData / 10000).ToString("f3");
statistic.Data.Unit = isEnergy ? "万tCe" : "万元";
return statistic;
}
private List<T_BD_APPLIANCE_ATTR> GetApplicaceAttr(KeywordFilter filter, IEnumerable<Guid> appids)
{
var APP_COUNT = 20;
List<T_BD_APPLIANCE_ATTR> appAttrs = new List<T_BD_APPLIANCE_ATTR>();
List<T_BD_METER_APPLIANCE> meterAppliances = new List<T_BD_METER_APPLIANCE>();
var varAttrs = this.GetEntitiesByRedis<T_BD_VARIABLE_ATTR>(null, filter);
if (appids.Count() < APP_COUNT)
{
foreach (var id in appids)
{
var appList = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(null, filter, id.ToString());
if (appList.Any())
{
appList.ForEach(x => x.Nav_VariableAttr = varAttrs.FirstOrDefault(m => m.ID == x.VAR_ATTR_ID));
appAttrs.AddRange(appList);
}
}
}
else
{
//filter.SelectField = new string[] { "APPLIANCE_ID", "VAR_ATTR_TYPE", "VAR_ID","" };
appAttrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(i => appids.Contains(i.APPLIANCE_ID), filter).ToList();
appAttrs.ForEach(x => x.Nav_VariableAttr = varAttrs.FirstOrDefault(m => m.ID == x.VAR_ATTR_ID));
}
return appAttrs;
}
private StatisticsProps CalDosage(KeywordFilter filter, int code, string type)
{
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var st = new DateTime();
var et = new DateTime();
if (code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum.)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
var energyType = this.GetEntityByRedis<T_BD_ENERGY_TYPE>(type, filter.GetOrgId());
if (energyType == null)
return statistic;
var appids = this.GetEntitiesByRedis<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null && x.ENERGY_TYPE_ID == energyType.ID, filter).Select(x => x.APPLIANCE_ID);
//var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType.计量点, filter);
var attrs = GetApplicaceAttr(filter, appids);
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var unit = this.GetEntityByRedis<T_FM_ENUM_ITEM>(energyType.UNIT_ENUM_ITEM_ID, filter.GetOrgId());
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "DOSAFGE" }; ;
var totalData = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(i => i.TIME >= st && i.TIME < et && vids.Contains(i.VAR_ID), baseFilter).Sum(i => i.DOSAFGE);
statistic.Data.Val = totalData.ToString("f1");
statistic.Data.Unit = unit?.NAME_EN;
return statistic;
}
private StatisticsProps CalAppMonitor(KeywordFilter filter, int code, string type)
{
var onLine = code == (int)HomePageStatisticsEnum.线 || code == (int)HomePageStatisticsEnum.线 ||
code == (int)HomePageStatisticsEnum.线;
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var appliances = this.GetEntitiesByRedis<T_BD_APPLIANCE>(
x => x.ENABLE_STATUS == (int)FMEnableStatusEnum. && x.IS_VIRTUAL == false, filter, "", "Nav_EnergyClass.Nav_EnergyType");
var applianceAttrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null && x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType.,
filter, "", "Nav_Var", "Nav_Appliance", "Nav_VariableAttr");
var appIds = applianceAttrs.Select(x => x.APPLIANCE_ID)?.Distinct().ToList();
var groupApp = appliances.Where(i => i.Nav_EnergyClass.Nav_EnergyType.CODE == type);
List<ApplianceInfoModel> appInfoList = new List<ApplianceInfoModel>();
int OFFLINE_TIME = 30;//断线时间30分钟
var total = 0;
foreach (var item in groupApp)
{
var applicanAttrs = applianceAttrs.FirstOrDefault(i => i.APPLIANCE_ID == item.ID);
if (applicanAttrs != null)
{
var redisValue = CsRedisManager.GetClient().HGet<HisPoint>(RedisCacheKey.RealTime, applicanAttrs?.Nav_Var?.SRC_TAG_ID.ToString());
if (onLine)
{
if (redisValue != null)
{
if (redisValue.HistTime.AddMinutes(OFFLINE_TIME) > DateTime.Now)
total++;
}
}
else
{
if (redisValue == null || redisValue.HistTime.AddMinutes(OFFLINE_TIME) < DateTime.Now)
total++;
}
}
}
statistic.Data.Val = total.ToString();
statistic.Data.Unit = "个";
return statistic;
}
private StatisticsProps CalDataQuality(KeywordFilter filter, int code, string type)
{
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var isRepair = code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum. ||
code == (int)HomePageStatisticsEnum.;
var st = new DateTime(DateTime.Now.Year,DateTime.Now.Month, 1);
//var et = st.AddMonths(1);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "TOTAL", "REPAIR", "OFFLINE" };
var list = this.GetEntities<T_BD_DATA_QUALITY>(x => x.TIME >= st && x.Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE == type, baseFilter);
var total = list.Sum(x => x.TOTAL);
var value = isRepair ? list.Sum(x => x.REPAIR) : list.Sum(x => x.OFFLINE);
statistic.Data.Val = total == 0 ? "0" : (value / (decimal)total * 100).ToString("F2");
statistic.Data.Unit = "%";
return statistic;
}
/// <summary>
/// 流程统计
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private StatisticsProps CalFlowQty(KeywordFilter filter, int code)
{
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var dtStart = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
//本月我发起的
var count = 0;
if (code == (int)HomePageStatisticsEnum.)
count = this.GetCount<T_PF_FLOW_INSTANCE>(i => i.CreateUserId == filter.Keyword && i.CreateDate >= dtStart, filter);
if (code == (int)HomePageStatisticsEnum.)
count = this.GetCount<T_PF_FLOW_INSTANCE>(i => i.CreateDate >= dtStart, filter);
else if (code == (int)HomePageStatisticsEnum.)
count = this.GetCount<T_PF_FLOW_INSTANCE>(u => u.TransitionHistorys.Any(x => x.CreateUserId == filter.Keyword && x.CreateDate >= dtStart), filter);
else if (code == (int)HomePageStatisticsEnum.)
count = this.GetCount<T_PF_FLOW_INSTANCE>(u => u.OrderStatus == (int)PFFlowInstanceOrderStatusEnum., filter);
else if (code == (int)HomePageStatisticsEnum.)
count = this.GetCount<T_PF_FLOW_INSTANCE>(u => u.MakerList == "1" || u.MakerList.Contains(filter.Keyword), filter);
statistic.Data.Val = count.ToString();
statistic.Data.Unit = "个";
return statistic;
}
/// <summary>
/// 报警统计
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private StatisticsProps CalAlarmLog(KeywordFilter filter, int code)
{
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var count = 0;
if (code == (int)HomePageStatisticsEnum.)
{
var dtStart = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
count = this.GetCount<T_KR_ALARM_LOG>(i => i.CREATE_TIME >= dtStart, filter);
}
else if (code == (int)HomePageStatisticsEnum.)
{
var dtStart = new DateTime(DateTime.Now.Year, 1, 1);
count = this.GetCount<T_KR_ALARM_LOG>(i => i.CREATE_TIME >= dtStart, filter);
}
else if (code == (int)HomePageStatisticsEnum.)
count = this.GetCount<T_KR_ALARM_LOG>(i => !i.IS_HANDLE, filter);
statistic.Data.Val = count.ToString();
statistic.Data.Unit = "条";
return statistic;
}
/// <summary>
/// 摊销总量/摊销总价/核销总量 统计
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private StatisticsProps CalAmortize(KeywordFilter filter, int code)
{
var statistic = new StatisticsProps { Code = code.ToString(), Name = ((HomePageStatisticsEnum)code).ToString() };
var st = new DateTime();
var et = new DateTime();
if (code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum.)
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
else
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
Dictionary<string, decimal> dicAmortize = new Dictionary<string, decimal>();
if (code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum.)
{
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
List<Guid> varIds = new List<Guid>();
baseFilter.SelectField = new string[] { "VAR_ID", "TIME", "AMORTIZE" };
var amortizes = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(x => x.TIME.Date >= st.Date && x.TIME.Date <= et.Date, baseFilter);
varIds = amortizes.Select(x => x.VAR_ID).ToList();
// var appids = nodes.Select(x => x.APPLIANCE_ID);
baseFilter.SelectField = new string[] { "Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE", "VAR_ID", "Nav_VariableAttr" };
var attrs = this.GetEntities<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null && x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType. &&
varIds.Contains(x.VAR_ID), baseFilter);//器具属性
baseFilter.SelectField = new string[] { "CODE" };
var energyType = this.GetEntities<T_BD_ENERGY_TYPE>(x => x.ENABLE_STATUS == (int)FMEnableStatusEnum., baseFilter);//能源类型
List<EnergyVid> energyVids = new List<EnergyVid>();
foreach (var attr in attrs)
{
energyVids.Add(new EnergyVid() { Code = attr.Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE, Vid = attr.VAR_ID });
}
foreach (var item in energyType)
{
List<Guid> vids = new List<Guid>();
vids.AddRange(energyVids.Where(x => x.Code == item.CODE).Select(x => x.Vid));
var total = amortizes.Where(x => vids.Contains(x.VAR_ID)).Sum(x => x.AMORTIZE);
if (!dicAmortize.ContainsKey(item.CODE))
{
dicAmortize.Add(item.CODE, total);
}
}
}
decimal sum = 0;
switch (code)
{
case (int)HomePageStatisticsEnum.:
{
filter.SelectField = new string[] { "AMORTIZE" };
var energyAmortizes = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(i => i.TIME.Date >= st.Date && i.TIME.Date <= et.Date, filter);
sum = energyAmortizes.Sum(x => x.AMORTIZE);
break;
}
case (int)HomePageStatisticsEnum.:
{
filter.SelectField = new string[] { "AMORTIZE" };
var energyAmortizes = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(i => i.TIME.Date == st.Date, filter);
sum = energyAmortizes.Sum(x => x.AMORTIZE);
break;
}
case (int)HomePageStatisticsEnum.:
{
filter.SelectField = new string[] { "AMORTIZE_PRICE" };
var energyAmortizes = this.GetEntities<T_EM_ENERGY_VAL_MONTH>(i => i.TIME.Date >= st.Date && i.TIME.Date <= et.Date, filter);
sum = energyAmortizes.Sum(x => x.AMORTIZE_PRICE);
break;
}
case (int)HomePageStatisticsEnum.:
{
filter.SelectField = new string[] { "AMORTIZE_PRICE" };
var energyAmortizes = this.GetEntities<T_EM_ENERGY_VAL_MONTH>(i => i.TIME.Date == st.Date, filter);
sum = energyAmortizes.Sum(x => x.AMORTIZE_PRICE);
break;
}
case (int)HomePageStatisticsEnum.:
{
filter.SelectField = new string[] { "WRITE_OFF" };
var energyAmortizes = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(i => i.TIME.Date == st.Date, filter);
sum = energyAmortizes.Sum(x => x.WRITE_OFF);
break;
}
case (int)HomePageStatisticsEnum.:
{
filter.SelectField = new string[] { "WRITE_OFF" };
var energyAmortizes = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(i => i.TIME.Date >= st.Date && i.TIME.Date <= et.Date, filter);
sum = energyAmortizes.Sum(x => x.WRITE_OFF);
break;
}
case (int)HomePageStatisticsEnum.:
{
sum = dicAmortize["Electric"];
break;
}
case (int)HomePageStatisticsEnum.:
{
sum = dicAmortize["Water"];
break;
}
case (int)HomePageStatisticsEnum.:
{
sum = dicAmortize["Gas"];
break;
}
}
statistic.Data.Val = Math.Round(sum, 2).ToString();
if (code == (int)HomePageStatisticsEnum. || code == (int)HomePageStatisticsEnum.)
{
statistic.Data.Unit = "元";
}
else
{
statistic.Data.Unit = " tce";
}
return statistic;
}
#endregion
#region
/// <summary>
/// 能耗统计
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalEnergyConStatistics(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var appids = this.GetEntitiesByRedis<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null, filter).Select(x => x.APPLIANCE_ID);
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var et = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var st = et.AddYears(-1);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "CONS_DATA", "TIME" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(
x => vids.Contains(x.VAR_ID) && x.TIME >= st.AddYears(-1) && x.TIME <= et, baseFilter)
: new List<T_EM_ENERGY_DOSAGE_MONTH>();
var data = new List<RatioTypeModel>();
var time = st;
while (time <= et)
{
var item = new RatioTypeModel { Time = time.ToString("yyyy-MM") };
item.Current = report.Where(x => x.TIME == time).Sum(x => x.CONS_DATA).ChangeDoubleToThree();
item.MonthErlier =
report.Where(x => x.TIME == time.AddMonths(-1)).Sum(x => x.CONS_DATA).ChangeDoubleToThree();
item.YearErlier =
report.Where(x => x.TIME == time.AddYears(-1)).Sum(x => x.CONS_DATA).ChangeDoubleToThree();
item.MonthRatio = item.MonthErlier == 0
? 0
: (((item.Current - item.MonthErlier) / item.MonthErlier) * 100).ChangeDoubleToTwo();
item.YearRatio = item.YearErlier == 0
? 0
: (((item.Current - item.YearErlier) / item.YearErlier) * 100).ChangeDoubleToTwo();
data.Add(item);
time = time.AddMonths(1);
}
var xAxis = data.Select(x => x.Time).ToList();
var current = new ChartDataDetailModel
{
Name = "本期能耗",
Color = "rgba(84, 216, 212, 1)",
ChartType = (int)PFChartTypeEnum.bar,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.Current }).ToList()
};
var yearErlierData = new ChartDataModel();
yearErlierData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
yearErlierData.Data.Add(new ChartDataDetailModel
{
Name = "同比能耗",
Color = "rgba(2, 167, 240, 1)",
ChartType = (int)PFChartTypeEnum.bar,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.YearErlier }).ToList()
});
yearErlierData.Data.Add(current);
yearErlierData.Data.Add(new ChartDataDetailModel
{
Name = "同比百分比",
Color = "rgba(255, 213, 106, 1)",
ChartType = (int)PFChartTypeEnum.line,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.YearRatio }).ToList(),
YAxisIndex = 1
});
yearErlierData.YAxis.Add(new ChartDataYAxisModel { Name = "tCe" });
yearErlierData.YAxis.Add(new ChartDataYAxisModel { Name = "%" });
model.Data.Add(new HomeChartDataModel { Name = "同比", Data = yearErlierData });
var monthErlierData = new ChartDataModel();
monthErlierData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
monthErlierData.Data.Add(new ChartDataDetailModel
{
Name = "环比能耗",
Color = "rgba(2, 167, 240, 1)",
ChartType = (int)PFChartTypeEnum.bar,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.MonthErlier }).ToList()
});
monthErlierData.Data.Add(current);
monthErlierData.Data.Add(new ChartDataDetailModel
{
Name = "环比百分比",
Color = "rgba(255, 213, 106, 1)",
ChartType = (int)PFChartTypeEnum.line,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.MonthRatio }).ToList(),
YAxisIndex = 1
});
monthErlierData.YAxis.Add(new ChartDataYAxisModel { Name = "tCe" });
monthErlierData.YAxis.Add(new ChartDataYAxisModel { Name = "%" });
model.Data.Add(new HomeChartDataModel { Name = "环比", Data = monthErlierData });
return model;
}
/// <summary>
/// 能源统计
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalEnergyStatistics(KeywordFilter filter, int code)
{
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
baseFilter.SelectField = new string[] { "Nav_Energytype.NUM", "Nav_Energytype.NAME",
"Nav_Appliance.Nav_EnergyClass.ENERGY_TYPE_ID","Nav_Energytype.Nav_UnitEnumItem.NAME_EN", "Nav_Energytype.UNIT_ENUM_ITEM_ID",
"Nav_Appliance.Nav_EnergyClass.Nav_EnergyClass" };
var nodes = this.GetEntities<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null, baseFilter);
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var et = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var st = et.AddYears(-1);
var appids = nodes.Select(x => x.APPLIANCE_ID);
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
baseFilter.SelectField = new string[] { "VAR_ID", "DATA", "TIME" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(
x => vids.Contains(x.VAR_ID) && x.TIME >= st.AddYears(-1) && x.TIME <= et, baseFilter)
: new List<T_EM_ENERGY_DOSAGE_MONTH>();
var xAxis = new List<DateTime>();
while (st <= et)
{
xAxis.Add(st);
st = st.AddMonths(1);
}
var groups = nodes.OrderBy(x => x.Nav_Energytype.NUM).GroupBy(x => x.Nav_Appliance.Nav_EnergyClass.ENERGY_TYPE_ID);
var colors = new List<string> { "#00ADA9", "#295AD7", "#FFA569", "#A6008B", "#EC808D", "#02A7F0", "#8592BC", "#C280FF " };
foreach (var type in groups)
{
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis.Select(x => x.ToString("yyyy-MM")).ToList() });
chartData.YAxis.Add(new ChartDataYAxisModel
{
Name = type.First().Nav_Energytype.Nav_UnitEnumItem.NAME_EN
});
var groups2 = type.GroupBy(x => x.Nav_Appliance.ENERGY_CLASS_ID);
var index = 0;
foreach (var group in groups2)
{
appids = group.Select(x => x.APPLIANCE_ID);
vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var values = new List<decimal>();
foreach (var item in xAxis)
{
var list = report.Where(x => vids.Contains(x.VAR_ID) && x.TIME == item);
values.Add(list.Sum(x => x.DATA));
}
chartData.Data.Add(new ChartDataDetailModel
{
Name = group.First().Nav_Appliance.Nav_EnergyClass.NAME,
Color = colors[index],
ChartType = (int)PFChartTypeEnum.bar,
Stack = "总量",
Data = values.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToThree() }).ToList()
});
index++;
}
model.Data.Add(new HomeChartDataModel { Name = $"用{type.First().Nav_Energytype.NAME}", Data = chartData });
}
return model;
}
/// <summary>
/// 费用统计
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalPriceStatistics(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var appids = this.GetEntitiesByRedis<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null, filter).Select(x => x.APPLIANCE_ID);
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var et = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var st = et.AddYears(-1);
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_VAL_MONTH>(
x => vids.Contains(x.VAR_ID) && x.TIME >= st.AddYears(-1) && x.TIME <= et,
new BaseFilter(filter.OrgId))
: new List<T_EM_ENERGY_VAL_MONTH>();
var xAxis = new List<DateTime>();
var values = new List<decimal>();
var ratios = new List<decimal>();
while (st <= et)
{
xAxis.Add(st);
var current = report.Where(x => x.TIME == st).Sum(x => x.PRICE);
var last = report.Where(x => x.TIME == st.AddYears(-1)).Sum(x => x.PRICE);
values.Add(current);
ratios.Add(last == 0 ? 0 : (current - last) / last * 100);
st = st.AddMonths(1);
}
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis.Select(x => x.ToString("yyyy-MM")).ToList() });
chartData.YAxis.Add(new ChartDataYAxisModel { Name = "万元" });
chartData.YAxis.Add(new ChartDataYAxisModel { Name = "%" });
chartData.Data.Add(new ChartDataDetailModel
{
Name = "总支出",
Color = "rgba(2, 167, 240, 1)",
ChartType = (int)PFChartTypeEnum.bar,
Data = values.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToW() }).ToList()
});
chartData.Data.Add(new ChartDataDetailModel
{
Name = "同比",
Color = "rgba(255, 213, 106, 1)",
ChartType = (int)PFChartTypeEnum.line,
Data = ratios.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToTwo() }).ToList(),
YAxisIndex = 1
});
model.Data.Add(new HomeChartDataModel { Data = chartData });
return model;
}
/// <summary>
/// 峰谷分析
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalPeakValley(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var nodes = this.GetEntities<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null && x.Nav_Energytype.CODE == "Electric", filter, "Nav_Energytype.Nav_UnitEnumItem");
var appids = nodes.Select(x => x.APPLIANCE_ID);
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var et = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var st = et.AddYears(-1);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "VAR_ID", "AMOUNT", "TIME", "PEAK_VALLEY_TYPE" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_VAL_MONTH>(
x => vids.Contains(x.VAR_ID) && x.TIME >= st && x.TIME <= et, baseFilter)
: new List<T_EM_ENERGY_VAL_MONTH>();
var xAxis = new List<DateTime>();
var dic = new Dictionary<BDElectricTypeEunm, List<decimal>>();
while (st <= et)
{
xAxis.Add(st);
foreach (BDElectricTypeEunm item in Enum.GetValues(typeof(BDElectricTypeEunm)))
{
if (!dic.ContainsKey(item))
dic.Add(item, new List<decimal>());
var val = report.Where(x => x.TIME == st && x.PEAK_VALLEY_TYPE == (int)item).Sum(x => x.AMOUNT);
dic[item].Add(val);
}
st = st.AddMonths(1);
}
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis.Select(x => x.ToString("yyyy-MM")).ToList() });
chartData.YAxis.Add(new ChartDataYAxisModel { Name = "万" + nodes.FirstOrDefault()?.Nav_Energytype?.Nav_UnitEnumItem.NAME_EN });
var colors = new List<string> { "#ffc45e", "#389e0d", "#25c4ac", "#f9517d" };
var index = 0;
foreach (var it in dic)
{
chartData.Data.Add(new ChartDataDetailModel
{
Name = it.Key.ToString(),
Color = colors[index],
ChartType = (int)PFChartTypeEnum.line,
Data = it.Value.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToW() }).ToList()
});
index++;
}
model.Data.Add(new HomeChartDataModel { Data = chartData });
return model;
}
private ChartProps CalDataQualityChart(KeywordFilter filter, int code, string type)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
//var et = st.AddMonths(1);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "APPLIANCE_ID", "TOTAL", "REPAIR", "OFFLINE", "Nav_Appliance.NAME" };
var list = this.GetEntities<T_BD_DATA_QUALITY>(
x => x.TIME >= st && x.Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE == type, baseFilter);
var groups = list.GroupBy(x => new { x.APPLIANCE_ID, x.Nav_Appliance.NAME });
var data = new List<T_BD_DATA_QUALITY>();
foreach (var item in groups)
{
var it = new T_BD_DATA_QUALITY { APPLIANCE_ID = item.Key.APPLIANCE_ID, Name = item.Key.NAME };
it.TOTAL = item.Sum(x => x.TOTAL);
it.REPAIR = item.Sum(x => x.REPAIR);
it.OFFLINE = item.Sum(x => x.OFFLINE);
if (it.TOTAL != 0)
{
it.RepairRatio = it.REPAIR / (decimal)it.TOTAL * 100;
it.OfflineRatio = it.OFFLINE / (decimal)it.TOTAL * 100;
}
data.Add(it);
}
//数据修复
var repairData = data.OrderByDescending(x => x.REPAIR).Take(10);
var repairChart = new ChartDataModel();
repairChart.XAxis.Add(new ChartDataXAxisModel { Data = repairData.Select(x => x.Name).ToList() });
repairChart.YAxis.Add(new ChartDataYAxisModel { Name = "条" });
repairChart.YAxis.Add(new ChartDataYAxisModel { Name = "%" });
repairChart.Data.Add(new ChartDataDetailModel
{
Name = "修复数量",
Color = "rgba(84, 216, 212, 1)",
ChartType = (int)PFChartTypeEnum.bar,
Data = repairData.Select(x => new ChartDataValueModel { Value = x.REPAIR }).ToList()
});
repairChart.Data.Add(new ChartDataDetailModel
{
Name = "修复比例",
Color = "rgba(255, 213, 106, 1)",
ChartType = (int)PFChartTypeEnum.line,
Data = repairData.Select(x => new ChartDataValueModel { Value = (double)x.RepairRatio.ChangeDoubleToTwo() }).ToList(),
YAxisIndex = 1
});
model.Data.Add(new HomeChartDataModel { Name = "数据修复", Data = repairChart });
//数据离线
var offLineData = data.OrderByDescending(x => x.OFFLINE).Take(10); ;
var offLineChart = new ChartDataModel();
offLineChart.XAxis.Add(new ChartDataXAxisModel { Data = offLineData.Select(x => x.Name).ToList() });
offLineChart.YAxis.Add(new ChartDataYAxisModel { Name = "条" });
offLineChart.YAxis.Add(new ChartDataYAxisModel { Name = "%" });
offLineChart.Data.Add(new ChartDataDetailModel
{
Name = "离线数量",
Color = "rgba(2, 167, 240, 1)",
ChartType = (int)PFChartTypeEnum.bar,
Data = offLineData.Select(x => new ChartDataValueModel { Value = x.OFFLINE }).ToList()
});
offLineChart.Data.Add(new ChartDataDetailModel
{
Name = "离线比例",
Color = "rgba(255, 213, 106, 1)",
ChartType = (int)PFChartTypeEnum.line,
Data = offLineData.Select(x => new ChartDataValueModel { Value = (double)x.OfflineRatio.ChangeDoubleToTwo() }).ToList(),
YAxisIndex = 1
});
model.Data.Add(new HomeChartDataModel { Name = "数据离线", Data = offLineChart });
return model;
}
private ChartProps CalWriteOffChart(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var list = this.GetEntities<T_EA_ENERGY_WRITE_OFF_NODE>(null, filter, "Nav_MeterNode", "Nav_WriteOffNode.Nav_MeterAppliances");
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "APPLIANCE_ID", "VAR_ID", "Nav_Appliance.Nav_EnergyClass.ENERGY_TYPE_ID" };
var attrs = this.GetEntities<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., baseFilter, "", "Nav_VariableAttr");
baseFilter.SelectField = new string[] { "VAR_ID", "WRITE_OFF" };
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var reports = this.GetEntities<T_EM_ENERGY_VAL_MONTH>(i => i.TIME == time, baseFilter);
var dic = new Dictionary<Guid, Dictionary<string, decimal>>();
var groups = list.GroupBy(x => (x.WRITE_OFF_NODE_ID, x.Nav_WriteOffNode.NAME));
foreach (var item in groups)
{
var appids = item.First().Nav_WriteOffNode.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID);
if (appids.Any())
{
var apps = attrs.Where(x => appids.Contains(x.APPLIANCE_ID));
var appGroup = apps.GroupBy(x => x.Nav_Appliance.Nav_EnergyClass.ENERGY_TYPE_ID);
foreach (var it in appGroup)
{
var vids = it.Select(x => x.VAR_ID);
var val = reports.Where(x => vids.Contains(x.VAR_ID)).Sum(x => x.WRITE_OFF).ChangeDoubleToThree();
if (!dic.ContainsKey(it.Key))
{
dic.Add(it.Key, new Dictionary<string, decimal>());
}
if (dic[it.Key].ContainsKey(item.Key.NAME))
dic[it.Key][item.Key.NAME] = val;
else
dic[it.Key].Add(item.Key.NAME, val);
}
}
}
var colors = new List<string> { "#00ADA9", "#295AD7", "#FFA569", "#A6008B", "#EC808D", "#02A7F0", "#8592BC", "#C280FF " };
var index = 0;
foreach (var item in dic)
{
var type = this.GetEntityByRedis<T_BD_ENERGY_TYPE>(item.Key, filter.GetOrgId());
var unit = this.GetEntityByRedis<T_FM_ENUM_ITEM>(type.UNIT_ENUM_ITEM_ID, filter.GetOrgId());
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = item.Value.Select(x => x.Key).ToList() });
chartData.YAxis.Add(new ChartDataYAxisModel
{
Name = unit.NAME_EN
});
chartData.Data.Add(new ChartDataDetailModel
{
Name = "核销量",
Color = colors[index],
ChartType = (int)PFChartTypeEnum.bar,
Data = item.Value.Select(x => new ChartDataValueModel { Value = (double)x.Value }).ToList()
});
model.Data.Add(new HomeChartDataModel { Name = type.NAME, Data = chartData });
}
return model;
}
/// <summary>
/// 本月产量统计/年
/// </summary>
/// <returns></returns>
private ChartProps CalProStatisticalChart(KeywordFilter filter, int code, FMTimeDimEnum type)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = DateTime.Now;
var et = DateTime.Now;
var xAxis = new List<string>();
if (FMTimeDimEnum. == type)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
for (DateTime t = st; t < et; t = t.AddDays(1))
{
xAxis.Add(t.ToString("yyyy-MM-dd"));
}
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
for (DateTime t = st; t < et; t = t.AddMonths(1))
{
xAxis.Add(t.ToString("yyyy-MM"));
}
}
filter.SelectField = new string[] { "START_TIME", "END_TIME", "QTY" };
var report = this.GetEntities<T_ED_PROD_RECORD>(x => x.START_TIME >= st && x.START_TIME <= et, filter);
#region chartData
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartData.YAxis.Add(new ChartDataYAxisModel { Name = "个" });
var unitData = new List<ChartDataValueModel>();
foreach (var item in xAxis)
{
if (FMTimeDimEnum. == type)
{
var prods = report.Where(x => x.START_TIME.Date == Convert.ToDateTime(item).Date);
if (prods != null && prods.Any())
{
unitData.Add(new ChartDataValueModel { Value = (double)prods.Sum(x => x.QTY) });
}
else
{
unitData.Add(new ChartDataValueModel { Value = 0 });
}
}
else
{
var prods = report.Where(x => x.START_TIME.ToString("yyyy-MM") == item);
if (prods != null && prods.Any())
{
unitData.Add(new ChartDataValueModel { Value = (double)prods.Sum(x => x.QTY) });
}
else
{
unitData.Add(new ChartDataValueModel { Value = 0 });
}
}
}
chartData.Data.Add(new ChartDataDetailModel { Name = "产品产量", Data = unitData, ChartType = (int)PFChartTypeEnum.bar, Color = "rgba(53, 128, 240, 1)" });
model.Data.Add(new HomeChartDataModel { Data = chartData });
#endregion
return model;
}
/// <summary>
/// 按时间单耗统计
/// </summary>
/// <returns></returns>
private ChartProps CalUnitUseDataByTimeChart(KeywordFilter filter, int code, FMTimeDimEnum type, EDConsType eDCons)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = DateTime.Now;
var et = DateTime.Now;
var xAxis = new List<string>();
if (FMTimeDimEnum. == type)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
for (DateTime t = st; t < et; t = t.AddDays(1))
{
xAxis.Add(t.ToString("yyyy-MM-dd"));
}
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
for (DateTime t = st; t < et; t = t.AddMonths(1))
{
xAxis.Add(t.ToString("yyyy-MM"));
}
}
filter.SelectField = new string[] { "CLASS_ID", "TEAM_ID", "Nav_Class.NAME", "Nav_Team.NAME", "TIME", "WORKTIME", "CONSDATA", "QTY" };
var report = this.GetEntities<T_EM_ENERGY_CONSDATA_DAY>(x => x.TIME.Date >= st.Date && x.TIME <= et.Date, filter);
var classTypes = report.Where(x => x.CLASS_ID != null).Distinct(x => x.CLASS_ID);
var teamGroups = report.Where(x => x.TEAM_ID != null).GroupBy(x => x.TEAM_ID);
List<TeamInfo> teams = new List<TeamInfo>();
foreach (var teamGroup in teamGroups)
{
teams.Add(new TeamInfo() { teamID = (Guid)teamGroup.Key, teamName = teamGroup.FirstOrDefault().Nav_Team.NAME, consData = teamGroup.Sum(x => x.CONSDATA) });
}
var teamTypes = teams.OrderByDescending(x => x.consData).Take(5).ToList();
// var teamTypes = report.Where(x => x.CLASS_ID != null).Distinct(x => x.TEAM_ID);
#region
var chartData = new ChartDataModel();
var chartTeamData = new ChartDataModel();
Dictionary<object, List<ChartDataValueModel>> dicChartDataValue = new Dictionary<object, List<ChartDataValueModel>>();
if (FMTimeDimEnum. == type)
{
foreach (var classTyp in classTypes)
{
List<ChartDataValueModel> Data = new List<ChartDataValueModel>();
for (var i = st; i < et; i = i.AddDays(1))
{
var reportDay = report.Where(x => x.TIME.Date == i.Date && x.CLASS_ID == classTyp.CLASS_ID);
if (eDCons == EDConsType.)
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.CLASS_ID == classTyp.CLASS_ID && x.WORKTIME > 0).Sum(x => x.CONSDATA / x.WORKTIME), 6) };
Data.Add(dataValue);
}
else
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.CLASS_ID == classTyp.CLASS_ID && x.QTY > 0).Sum(x => x.CONSDATA / (x.QTY == 0 ? 1 : x.QTY)), 6) };
Data.Add(dataValue);
}
}
if (!dicChartDataValue.ContainsKey(classTyp.CLASS_ID.ToString()))
{
dicChartDataValue.Add(classTyp.CLASS_ID.ToString(), Data);
}
}
foreach (var teamTyp in teamTypes)
{
List<ChartDataValueModel> Data = new List<ChartDataValueModel>();
for (var i = st; i < et; i = i.AddDays(1))
{
var reportDay = report.Where(x => x.TIME.Date == i.Date && x.TEAM_ID == teamTyp.teamID);
if (eDCons == EDConsType.)
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.TEAM_ID == teamTyp.teamID && x.WORKTIME > 0).Sum(x => x.CONSDATA / x.WORKTIME), 6) };
Data.Add(dataValue);
}
else
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.TEAM_ID == teamTyp.teamID && x.QTY > 0).Sum(x => x.CONSDATA / (x.QTY == 0 ? 1 : x.QTY)), 6) };
Data.Add(dataValue);
}
}
if (!dicChartDataValue.ContainsKey(teamTyp.teamID.ToString()))
{
dicChartDataValue.Add(teamTyp.teamID.ToString(), Data);
}
}
}
else
{
foreach (var classTyp in classTypes)
{
List<ChartDataValueModel> Data = new List<ChartDataValueModel>();
for (int i = 1; i <= 12; i++)
{
var reportDay = report.Where(x => x.TIME.Month == i && x.CLASS_ID == classTyp.CLASS_ID);
if (eDCons == EDConsType.)
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.CLASS_ID == classTyp.CLASS_ID && x.WORKTIME > 0).Sum(x => x.CONSDATA / x.WORKTIME), 6) };
Data.Add(dataValue);
}
else
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.CLASS_ID == classTyp.CLASS_ID && x.QTY > 0).Sum(x => x.CONSDATA / (x.QTY == 0 ? 1 : x.QTY)), 6) };
Data.Add(dataValue);
}
}
if (!dicChartDataValue.ContainsKey(classTyp.CLASS_ID.ToString()))
{
dicChartDataValue.Add(classTyp.CLASS_ID.ToString(), Data);
}
}
foreach (var teamTyp in teamTypes)
{
List<ChartDataValueModel> Data = new List<ChartDataValueModel>();
for (int i = 1; i <= (et - st).Days; i++)
{
var reportDay = report.Where(x => x.TIME.Date.Month == i && x.TEAM_ID == teamTyp.teamID);
if (eDCons == EDConsType.)
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.TEAM_ID == teamTyp.teamID && x.WORKTIME > 0).Sum(x => x.CONSDATA / x.WORKTIME), 6) };
Data.Add(dataValue);
}
else
{
ChartDataValueModel dataValue = new ChartDataValueModel { Value = (double)Math.Round(reportDay.Where(x => x.TEAM_ID == teamTyp.teamID && x.QTY > 0).Sum(x => x.CONSDATA / (x.QTY == 0 ? 1 : x.QTY)), 6) };
Data.Add(dataValue);
}
}
if (!dicChartDataValue.ContainsKey(teamTyp.teamID.ToString()))
{
dicChartDataValue.Add(teamTyp.teamID.ToString(), Data);
}
}
}
foreach (var classType in classTypes)
{
if (classType.Nav_Class != null)
{
chartData.Data.Add(new ChartDataDetailModel
{
Name = classType.Nav_Class.NAME,
// Color = "#f9517d",
ChartType = (int)PFChartTypeEnum.bar,
Data = dicChartDataValue[classType.CLASS_ID.ToString()]
});
}
else
{
chartData.Data.Add(new ChartDataDetailModel
{
Name = "班别",
// Color = "#f9517d",
ChartType = (int)PFChartTypeEnum.bar,
Data = dicChartDataValue[classType.CLASS_ID.ToString()]
});
}
}
foreach (var teamTyp in teamTypes)
{
chartTeamData.Data.Add(new ChartDataDetailModel
{
Name = teamTyp.teamName,
//Color = "#f9517d",
ChartType = (int)PFChartTypeEnum.bar,
Data = dicChartDataValue[teamTyp.teamID.ToString()]
});
}
#endregion
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartData.YAxis.Add(new ChartDataYAxisModel { Name = "" });
chartTeamData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartTeamData.YAxis.Add(new ChartDataYAxisModel { Name = "" }); ;
model.Data.Add(new HomeChartDataModel { Name = "班别", Data = chartData });
model.Data.Add(new HomeChartDataModel { Name = "班组", Data = chartTeamData });
return model;
}
private ChartProps CalPeakValleyPie(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var isCost = code == (int)HomePageChartEnum. || code == (int)HomePageChartEnum.;
var st = new DateTime();
var et = new DateTime();
if (code == (int)HomePageChartEnum. || code == (int)HomePageChartEnum.)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
var nodes = this.GetEntities<T_BD_ENERGY_NODE>(x => x.PARENT_ID == null && x.Nav_Energytype.CODE == "Electric", filter, "Nav_Energytype.Nav_UnitEnumItem");
var appids = nodes.Select(x => x.APPLIANCE_ID);
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "VAR_ID", "AMOUNT", "PRICE", "PEAK_VALLEY_TYPE" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_VAL_MONTH>(
x => vids.Contains(x.VAR_ID) && x.TIME >= st && x.TIME <= et, baseFilter)
: new List<T_EM_ENERGY_VAL_MONTH>();
var chartData = new ChartDataModel();
var xAxis = new List<string>();
var data = new List<decimal>();
foreach (BDElectricTypeEunm item in Enum.GetValues(typeof(BDElectricTypeEunm)))
{
xAxis.Add(item.ToString());
var total = report.Where(x => x.PEAK_VALLEY_TYPE == (int)item).Sum(x => isCost ? x.PRICE : x.AMOUNT);
data.Add(total);
}
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartData.Data.Add(new ChartDataDetailModel
{
Name = isCost ? "费用" : "用量",
ChartType = (int)PFChartTypeEnum.pie,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToTwo() }).ToList()
});
model.Data.Add(new HomeChartDataModel { Data = chartData });
return model;
}
/// <summary>
/// 能源分类摊销饼状图
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalAmortizePie(KeywordFilter filter, int code, FMTimeDimEnum type)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = DateTime.Now;
var et = DateTime.Now;
if (FMTimeDimEnum. == type)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
List<Guid> varIds = new List<Guid>();
baseFilter.SelectField = new string[] { "VAR_ID", "TIME", "AMORTIZE" };
var amortizes = this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(x => x.TIME.Date >= st.Date && x.TIME.Date <= et.Date, baseFilter);
varIds = amortizes.Select(x => x.VAR_ID).ToList();
// var appids = nodes.Select(x => x.APPLIANCE_ID);
baseFilter.SelectField = new string[] { "Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE", "VAR_ID", "Nav_VariableAttr" };
var attrs = this.GetEntities<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null && x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType. &&
varIds.Contains(x.VAR_ID), baseFilter);//器具属性
baseFilter.SelectField = new string[] { "CODE", "NAME", "ID" };
var energyType = this.GetEntities<T_BD_ENERGY_TYPE>(x => x.ENABLE_STATUS == (int)FMEnableStatusEnum., baseFilter);//能源类型
List<EnergyVid> energyVids = new List<EnergyVid>();
foreach (var attr in attrs)
{
energyVids.Add(new EnergyVid() { Code = attr.Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE, Vid = attr.VAR_ID });
}
var chartData = new ChartDataModel();
var xAxis = new List<string>();
var data = new List<decimal>();
foreach (var item in energyType)
{
List<Guid> vids = new List<Guid>();
vids.AddRange(energyVids.Where(x => x.Code == item.CODE).Select(x => x.Vid));
xAxis.Add(item.NAME);
var total = amortizes.Where(x => vids.Contains(x.VAR_ID)).Sum(x => x.AMORTIZE);
data.Add(total);
}
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartData.Data.Add(new ChartDataDetailModel
{
Name = "能源摊销",
ChartType = (int)PFChartTypeEnum.pie,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToTwo() }).ToList()
});
model.Data.Add(new HomeChartDataModel { Data = chartData });
return model;
}
/// <summary>
/// 能源分类数据修复饼状图
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalRepairPie(KeywordFilter filter, int code, FMTimeDimEnum type)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = DateTime.Now;
//var et = DateTime.Now;
if (FMTimeDimEnum. == type)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
//et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
//et = st.AddYears(1);
}
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
List<Guid> appliances = new List<Guid>();
baseFilter.SelectField = new string[] { "APPLIANCE_ID", "TIME", "REPAIR" };
var dataQualitys = this.GetEntities<T_BD_DATA_QUALITY>(x => x.TIME.Date >= st.Date , baseFilter);
appliances = dataQualitys.Select(x => x.APPLIANCE_ID).ToList();
baseFilter.SelectField = new string[] { "Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE", "APPLIANCE_ID" };
var attrs = this.GetEntities<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null && x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType. &&
appliances.Contains(x.APPLIANCE_ID), baseFilter);//器具属性
baseFilter.SelectField = new string[] { "CODE", "NAME", "ID" };
var energyType = this.GetEntities<T_BD_ENERGY_TYPE>(x => x.ENABLE_STATUS == (int)FMEnableStatusEnum., baseFilter);//能源类型
List<EnergyVid> energyVids = new List<EnergyVid>();
foreach (var attr in attrs)
{
energyVids.Add(new EnergyVid() { Code = attr.Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE, Vid = attr.APPLIANCE_ID });
}
var chartData = new ChartDataModel();
var xAxis = new List<string>();
var data = new List<decimal>();
foreach (var item in energyType)
{
List<Guid> applianceIds = new List<Guid>();
applianceIds.AddRange(energyVids.Where(x => x.Code == item.CODE).Select(x => x.Vid));
xAxis.Add(item.NAME);
var total = dataQualitys.Where(x => applianceIds.Contains(x.APPLIANCE_ID)).Sum(x => x.REPAIR);
data.Add(total);
}
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartData.Data.Add(new ChartDataDetailModel
{
Name = "数据修复",
ChartType = (int)PFChartTypeEnum.pie,
Data = data.Select(x => new ChartDataValueModel { Value = (double)x.ChangeDoubleToTwo() }).ToList()
});
model.Data.Add(new HomeChartDataModel { Data = chartData });
return model;
}
/// <summary>
/// 年、月报警柱状图
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalAlarmNumChart(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = new DateTime();
var et = new DateTime();
var xAxis = new List<string>();
if (code == (int)HomePageChartEnum.)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
for (DateTime t = st; t <= et; t = t.AddDays(1))
{
xAxis.Add(t.ToString("yyyy-MM-dd"));
}
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
for (DateTime t = st; t < et; t = t.AddMonths(1))
{
xAxis.Add(t.ToString("yyyy-MM"));
}
}
filter.SelectField = new string[] { "CREATE_TIME" };
var report = this.GetEntities<T_KR_ALARM_LOG>(x => x.CREATE_TIME >= st, filter);
#region chartData
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
chartData.YAxis.Add(new ChartDataYAxisModel { Name = "个" });
var unitData = new List<ChartDataValueModel>();
foreach (var item in xAxis)
{
if (code == (int)HomePageChartEnum.)
{
var prods = report.Where(x => ((DateTime)x.CREATE_TIME).Date == Convert.ToDateTime(item).Date).Count();
unitData.Add(new ChartDataValueModel { Value = prods });
}
else
{
var prods = report.Where(x => ((DateTime)x.CREATE_TIME).ToString("yyyy-MM") == item).Count();
unitData.Add(new ChartDataValueModel { Value = prods });
}
}
chartData.Data.Add(new ChartDataDetailModel { Name = "报警数量", Data = unitData, ChartType = (int)PFChartTypeEnum.bar, Color = "rgba(53, 128, 240, 1)" });
model.Data.Add(new HomeChartDataModel { Data = chartData });
#endregion
return model;
}
/// <summary>
/// 年、月报警等级饼状图
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private ChartProps CalAlarmLevelChart(KeywordFilter filter, int code)
{
var model = new ChartProps { Code = code.ToString(), Name = ((HomePageChartEnum)code).ToString() };
var st = new DateTime();
var et = new DateTime();
var xAxis = new List<string>();
xAxis.AddRange(new List<string> { "高", "中", "低" });
if (code == (int)HomePageChartEnum.)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
filter.SelectField = new string[] { "ALARM_TASK_ID", "Nav_AlarmTask.LEVEL", "CREATE_TIME" };
var report = this.GetEntities<T_KR_ALARM_LOG>(x => x.CREATE_TIME >= st, filter);
#region chartData
var chartData = new ChartDataModel();
chartData.XAxis.Add(new ChartDataXAxisModel { Data = xAxis });
var unitData = new List<ChartDataValueModel>();
foreach (var item in xAxis)
{
var prods = report.Where(x => Enum.GetName(typeof(KRAlarmLevelEnum), x.Nav_AlarmTask.LEVEL) == item).Count();
unitData.Add(new ChartDataValueModel { Value = prods });
}
chartData.Data.Add(new ChartDataDetailModel { Name = "报警等级占比", Data = unitData, ChartType = (int)PFChartTypeEnum.pie });
model.Data.Add(new HomeChartDataModel { Data = chartData });
#endregion
return model;
}
#endregion
public class TeamInfo
{
public Guid teamID { get; set; }
public string teamName { get; set; }
public decimal consData { get; set; }
}
public class EnergyVid
{
public string Code { get; set; }
public Guid Vid { get; set; }
}
#region
/// <summary>
/// 本月能耗排名
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private RankingProps CalEnergyRanking(KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
var nodes = this.GetEntities<T_BD_METER_NODE>(x => x.NODE_TYPE == (int)BDNodeGenreEnum. && x.NODE_PROP <= (int)BDProcessPropEnum., filter, "Nav_MeterAppliances", "Nav_DeductAppliances");
var appids = new List<Guid>();
foreach (var node in nodes)
{
appids.AddRange(node.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID));
appids.AddRange(node.Nav_DeductAppliances.Select(x => x.APPLIANCE_ID));
}
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "VAR_ID", "CONS_DATA" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(x => vids.Contains(x.VAR_ID) && x.TIME == time, baseFilter)
: new List<T_EM_ENERGY_DOSAGE_MONTH>();
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "生产节点", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "能耗tCe", key = "Value", dataIndex = "Value" });
var dic = new Dictionary<string, decimal>();
foreach (var node in nodes)
{
var meter = node.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID);
var mvid = attrs.Where(x => meter.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var deduct = node.Nav_DeductAppliances.Select(x => x.APPLIANCE_ID);
var dvid = attrs.Where(x => deduct.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var val = report.Where(x => mvid.Contains(x.VAR_ID)).Sum(x => x.CONS_DATA) - report.Where(x => dvid.Contains(x.VAR_ID)).Sum(x => x.CONS_DATA);
var name = string.IsNullOrEmpty(node.NAME) ? "未知节点" : node.NAME;
if (!dic.ContainsKey(name))
dic.Add(name, 0);
dic[name] = val;
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString("F2") });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
/// <summary>
/// 本月用量/费用排名
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <param name="type"></param>
/// <returns></returns>
private RankingProps CalDosageRanking(KeywordFilter filter, int code, string type)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
var isCost = code == (int)HomePageRankingEnum. || code == (int)HomePageRankingEnum. ||
code == (int)HomePageRankingEnum.;
var nodes = this.GetEntities<T_BD_METER_NODE>(
x => x.NODE_TYPE == (int)BDNodeGenreEnum. && x.NODE_PROP <= (int)BDProcessPropEnum., filter,
"Nav_MeterAppliances.Nav_Appliance.Nav_EnergyClass",
"Nav_DeductAppliances.Nav_Appliance.Nav_EnergyClass");
var energyType = this.GetEntityByRedis<T_BD_ENERGY_TYPE>(type, filter.GetOrgId());
if (energyType == null)
return model;
var unit = this.GetEntityByRedis<T_FM_ENUM_ITEM>(energyType.UNIT_ENUM_ITEM_ID, filter.GetOrgId());
var appids = new List<Guid>();
foreach (var node in nodes)
{
appids.AddRange(node.Nav_MeterAppliances
.Where(x => x.Nav_Appliance?.Nav_EnergyClass?.ENERGY_TYPE_ID == energyType.ID)
.Select(x => x.APPLIANCE_ID));
appids.AddRange(node.Nav_DeductAppliances
.Where(x => x.Nav_Appliance?.Nav_EnergyClass?.ENERGY_TYPE_ID == energyType.ID)
.Select(x => x.APPLIANCE_ID));
}
filter.SelectField = new string[] { "APPLIANCE_ID", "VAR_ID" };
var attrs = this.GetEntities<T_BD_APPLIANCE_ATTR>(x => appids.Contains(x.APPLIANCE_ID)
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter);
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "VAR_ID", "AMOUNT", "PRICE" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_VAL_MONTH>(x => vids.Contains(x.VAR_ID) && x.TIME == time, baseFilter)
: new List<T_EM_ENERGY_VAL_MONTH>();
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "生产节点", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column
{
title = isCost ? $"{energyType.NAME}费(万元)" : $"用{energyType.NAME}{unit?.NAME_EN}",
key = "Value",
dataIndex = "Value",
});
var dic = new Dictionary<string, decimal>();
foreach (var node in nodes)
{
var meter = node.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID);
var mvid = attrs.Where(x => meter.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var deduct = node.Nav_DeductAppliances.Select(x => x.APPLIANCE_ID);
var dvid = attrs.Where(x => deduct.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var val = report.Where(x => mvid.Contains(x.VAR_ID)).Sum(x => isCost ? x.PRICE : x.AMOUNT) - report.Where(x => dvid.Contains(x.VAR_ID)).Sum(x => isCost ? x.PRICE : x.AMOUNT);
var name = string.IsNullOrEmpty(node.NAME) ? "未知节点" : node.NAME;
if (!dic.ContainsKey(name))
dic.Add(name, 0);
dic[name] = isCost ? val.ChangeDoubleToW() : val;
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString("F2") });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
/// <summary>
/// 损耗摊销排名
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <param name="type"></param>
/// <returns></returns>
private RankingProps CalAmortizeRanking(KeywordFilter filter, int code, string type)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
var energyType = this.GetEntityByRedis<T_BD_ENERGY_TYPE>(type, filter.GetOrgId());
if (energyType == null)
return model;
var unit = this.GetEntityByRedis<T_FM_ENUM_ITEM>(energyType.UNIT_ENUM_ITEM_ID, filter.GetOrgId());
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "NAME", "APPLIANCE_ID" };
var nodes = this.GetEntities<T_BD_ENERGY_NODE>(x => x.ENERGY_TYPE_ID == energyType.ID, baseFilter);
var appids = nodes.Select(x => x.APPLIANCE_ID);
filter.SelectField = null;
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
baseFilter.SelectField = new string[] { "VAR_ID", "AMORTIZE" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_DOSAGE_MONTH>(x => vids.Contains(x.VAR_ID) && x.TIME == time, baseFilter)
: new List<T_EM_ENERGY_DOSAGE_MONTH>();
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "表计节点", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = $"摊销{energyType.NAME}{unit?.NAME_EN}", key = "Value", dataIndex = "Value" });
var dic = new Dictionary<string, decimal>();
foreach (var node in nodes)
{
var vid = attrs.Where(x => x.APPLIANCE_ID == node.APPLIANCE_ID).Select(x => x.VAR_ID);
var val = report.Where(x => vid.Contains(x.VAR_ID)).Sum(x => x.AMORTIZE);
var name = string.IsNullOrEmpty(node.NAME) ? "未知节点" : node.NAME;
if (!dic.ContainsKey(name))
dic.Add(name, 0);
dic[name] = val;
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString("F2") });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
private RankingProps CalWriteOffRanking(KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
var list = this.GetEntities<T_EA_ENERGY_WRITE_OFF_NODE>(null, filter, "Nav_MeterNode", "Nav_WriteOffNode.Nav_MeterAppliances");
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "VAR_ID", "WRITE_OFF_PRICE" };
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var reports = this.GetEntities<T_EM_ENERGY_VAL_MONTH>(i => i.TIME == time, baseFilter);
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "核销节点", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "核销费用(万元)", key = "Value", dataIndex = "Value" });
var groups = list.GroupBy(x => (x.WRITE_OFF_NODE_ID, x.Nav_WriteOffNode.NAME));
var dic = new Dictionary<string, decimal>();
foreach (var item in groups)
{
var appids = item.First().Nav_WriteOffNode.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID); ;
decimal price = 0;
if (appids.Any())
{
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
price += reports.Where(x => vids.Contains(x.VAR_ID)).Sum(x => x.WRITE_OFF_PRICE);
}
var name = string.IsNullOrEmpty(item.Key.NAME) ? "未知节点" : item.Key.NAME;
if (!dic.ContainsKey(name))
dic.Add(name, 0);
dic[name] = price.ChangeDoubleToW();
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString("F2") });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
/// <summary>
/// 修复数量排名
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <param name="type"></param>
/// <returns></returns>
private RankingProps RepairDataRanking(KeywordFilter filter, int code, string type)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
filter.SelectField = new string[] { "Nav_Appliance.NAME", "REPAIR" };
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
if (code == (int)HomePageRankingEnum.
|| code == (int)HomePageRankingEnum.
|| code == (int)HomePageRankingEnum.)
{
time = new DateTime(DateTime.Now.Year, 1, 1);
}
var logs = this.GetEntities<T_BD_DATA_QUALITY>(i => i.TIME >= time && i.Nav_Appliance.Nav_EnergyClass.Nav_EnergyType.CODE == type, filter);
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "器具", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "次数", key = "Value", dataIndex = "Value" });
var groups = logs.GroupBy(x => x.APPLIANCE_ID);
var dic = new Dictionary<string, decimal>();
foreach (var item in groups)
{
var def = item.FirstOrDefault();
var name = "未知器具";
if (!string.IsNullOrEmpty(def.Nav_Appliance?.NAME))
name = def.Nav_Appliance?.NAME;
dic[def.Nav_Appliance?.NAME] = item.Sum(i => i.REPAIR);
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString() });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
/// <summary>
/// 离线数量排名
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <param name="type"></param>
/// <returns></returns>
private RankingProps OffLineDataRanking(KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
filter.SelectField = new string[] { "Nav_Appliance.NAME", "OFFLINE" };
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
if (code == (int)HomePageRankingEnum.线)
{
time = new DateTime(DateTime.Now.Year, 1, 1);
}
var logs = this.GetEntities<T_BD_DATA_QUALITY>(i => i.TIME >= time, filter);
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "器具", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "次数", key = "Value", dataIndex = "Value" });
var groups = logs.GroupBy(x => x.APPLIANCE_ID);
var dic = new Dictionary<string, decimal>();
foreach (var item in groups)
{
var def = item.FirstOrDefault();
var name = "未知器具";
if (!string.IsNullOrEmpty(def.Nav_Appliance?.NAME))
name = def.Nav_Appliance?.NAME;
dic[def.Nav_Appliance?.NAME] = item.Sum(i => i.OFFLINE);
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString() });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
private RankingProps CalAlarmRanking(KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
filter.SelectField = new string[] { "APPLIANCE_ID", "Nav_Appliance.NAME" };
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
if (code == (int)HomePageRankingEnum.)
{
time = new DateTime(DateTime.Now.Year, 1, 1);
}
var logs = this.GetEntities<T_KR_ALARM_LOG>(i => i.CREATE_TIME >= time && i.APPLIANCE_ID != null, filter);
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "器具", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "报警次数", key = "Value", dataIndex = "Value" });
var groups = logs.GroupBy(x => x.APPLIANCE_ID);
var dic = new Dictionary<string, decimal>();
foreach (var item in groups)
{
var def = item.FirstOrDefault();
var name = "未知器具";
if (!string.IsNullOrEmpty(def.Nav_Appliance?.NAME))
name = def.Nav_Appliance?.NAME;
dic[def.Nav_Appliance?.NAME] = item.Count();
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString() });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
private RankingProps CalAlarmTimeRanking(KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
filter.SelectField = new string[] { "APPLIANCE_ID", "Nav_Appliance.NAME", "HANDLE_TIME", "IS_HANDLE", "CREATE_TIME" };
var time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
if (code == (int)HomePageRankingEnum.)
{
time = new DateTime(DateTime.Now.Year, 1, 1);
}
var logs = this.GetEntities<T_KR_ALARM_LOG>(i => i.CREATE_TIME >= time && i.IS_HANDLE && i.APPLIANCE_ID != null && i.HANDLE_TIME != null, filter);
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "器具", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "处理时长(小时)", key = "Value", dataIndex = "Value" });
var groups = logs.GroupBy(x => x.APPLIANCE_ID);
var dic = new Dictionary<string, double>();
foreach (var item in groups)
{
var def = item.FirstOrDefault();
var name = "未知器具";
if (!string.IsNullOrEmpty(def.Nav_Appliance?.NAME))
name = def.Nav_Appliance?.NAME;
if (!dic.ContainsKey(name))
dic[def.Nav_Appliance?.NAME] = item.Average(i => (i.HANDLE_TIME - i.CREATE_TIME).Value.TotalHours);
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString("f2") });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
/// <summary>
/// 获取节点能耗KPI分值和变化率排名
/// </summary>
/// <param name="filter"></param>
/// <param name="code"></param>
/// <returns></returns>
private RankingProps GetMarkItemData([FromBody] KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
var timeDim = 0;
var st = new DateTime(DateTime.Now.Year, 1, 1);
if (code == (int)HomePageRankingEnum.KPI排名 || code == (int)HomePageRankingEnum.KPI分值变化率排名)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
timeDim = 1;
}
var et = DateTime.Now;
var service = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IEDEnergyConsumeService>();
if (et > DateTime.Now)
et = timeDim == (int)FMTimeDimEnum. ? DateTime.Now.ToIMonth().FromITime().AddMonths(1) : DateTime.Today;
var xAxis = new List<string>();
var time = st;
while (time < et)
{
if (timeDim == (int)FMTimeDimEnum.)
{
xAxis.Add(time.ToString("yyyy-MM"));
time = time.AddMonths(1);
}
else
{
xAxis.Add(time.ToString("yyyy-MM-dd"));
time = time.AddDays(1);
}
}
var node = new T_BD_METER_NODE();
var result = service.CalPlantData(filter, node, st, et, timeDim, xAxis, EDUnitSetOrder.);
var columns = new List<Column>
{
new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" },
new Column { title = "节点", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH }
};
var data = new List<HomePageTableData>();
var dicData = new ChartDataModel();
if (code == (int)HomePageRankingEnum.KPI排名 || code == (int)HomePageRankingEnum.KPI排名)
{
columns.Add(new Column { title = "KPI分值", key = "Value", dataIndex = "Value" });
dicData = result.chartKpiModel;
}
else
{
columns.Add(new Column { title = "KPI分值变化率", key = "Value", dataIndex = "Value" });
dicData = result.chartKpiChangeModel;
}
var index = 1;
if (dicData != null && dicData.Data[0].Data.Count > 0)
{
foreach (var item in dicData.Data[0].Data.Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = dicData.XAxis[0].Data[index - 1], Value = item.Value.ToString() });
index++;
}
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
private RankingProps CalCostRanking(KeywordFilter filter, int code)
{
var model = new RankingProps { Code = code.ToString(), Name = ((HomePageRankingEnum)code).ToString() };
var nodes = this.GetEntities<T_BD_METER_NODE>(x => x.NODE_TYPE == (int)BDNodeGenreEnum. && x.NODE_PROP <= (int)BDProcessPropEnum., filter, "Nav_MeterAppliances", "Nav_DeductAppliances");
var appids = new List<Guid>();
foreach (var node in nodes)
{
appids.AddRange(node.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID));
appids.AddRange(node.Nav_DeductAppliances.Select(x => x.APPLIANCE_ID));
}
var attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null && x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., filter, "", "Nav_VariableAttr");
var vids = attrs.Where(x => appids.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var st = new DateTime();
var et = new DateTime();
if (code == (int)HomePageRankingEnum.)
{
st = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
et = st.AddMonths(1);
}
else
{
st = new DateTime(DateTime.Now.Year, 1, 1);
et = st.AddYears(1);
}
var baseFilter = new BaseFilter(filter.GetOrgId()) { DataRule = filter.DataRule };
baseFilter.SelectField = new string[] { "VAR_ID", "PRICE" };
var report = vids.Any()
? this.GetEntities<T_EM_ENERGY_VAL_MONTH>(x => vids.Contains(x.VAR_ID) && x.TIME >= st && x.TIME < et, baseFilter)
: new List<T_EM_ENERGY_VAL_MONTH>();
var columns = new List<Column>();
columns.Add(new Column { title = "排名", key = "Ranking", dataIndex = "Ranking" });
columns.Add(new Column { title = "生产节点", key = "Name", dataIndex = "Name", width = RANK_NAME_WIDTH });
columns.Add(new Column { title = "费用(万元)", key = "Value", dataIndex = "Value" });
var dic = new Dictionary<string, decimal>();
foreach (var node in nodes)
{
var meter = node.Nav_MeterAppliances.Select(x => x.APPLIANCE_ID);
var mvid = attrs.Where(x => meter.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var deduct = node.Nav_DeductAppliances.Select(x => x.APPLIANCE_ID);
var dvid = attrs.Where(x => deduct.Contains(x.APPLIANCE_ID)).Select(x => x.VAR_ID);
var val = report.Where(x => mvid.Contains(x.VAR_ID)).Sum(x => x.PRICE) - report.Where(x => dvid.Contains(x.VAR_ID)).Sum(x => x.PRICE);
var name = string.IsNullOrEmpty(node.NAME) ? "未知节点" : node.NAME;
if (!dic.ContainsKey(name))
dic.Add(name, 0);
dic[name] = val.ChangeDoubleToW();
}
var data = new List<HomePageTableData>();
var index = 1;
foreach (var item in dic.OrderByDescending(x => x.Value).Take(10))
{
data.Add(new HomePageTableData { Ranking = index, Name = item.Key, Value = item.Value.ToString("F2") });
index++;
}
model.Data = new HomePageTableModel { columns = columns, dataSource = data };
return model;
}
#endregion
private static void SetStatisticRedis<T>(T statistic, string redisKey)
{
var redisStatistics = new HomePageCheckSeeting();
redisStatistics.Time = DateTime.Now;
redisStatistics.Prop = statistic;
CsRedisManager.GetClient().Set(redisKey, redisStatistics);
}
private void CalEnergyTotal(KeywordFilter filter, BaseFilter baseFilter, List<T_BD_METER_NODE> allNodes,
List<T_BD_APPLIANCE> allApplice, List<T_BD_ENERGY_CLASS> energyClassList, Guid typeId,
out List<T_BD_DEDUCT_APPLIANCE> deApplicances, out List<T_BD_METER_APPLIANCE> application, out List<T_BD_APPLIANCE_ATTR> attrs)
{
baseFilter.SelectField = new string[] { };
var eleApps = new List<T_BD_APPLIANCE>();
foreach (var app in allApplice)
{
var energyClass = energyClassList.FirstOrDefault(i => i.ID == app.ENERGY_CLASS_ID);
if (energyClass != null)
{
app.Nav_EnergyClass = energyClass;
eleApps.Add(app);
}
}
var appIds = eleApps.Select(i => i.ID).ToArray();
var meterApplicances = this.GetEntitiesByRedis<T_BD_METER_APPLIANCE>(null, baseFilter);
deApplicances = this.GetEntitiesByRedis<T_BD_DEDUCT_APPLIANCE>(null, baseFilter);
foreach (var node in allNodes)
{
node.Nav_MeterAppliances = meterApplicances.Where(i => i.NODE_ID == node.ID && appIds.Contains(i.APPLIANCE_ID)).ToList();
foreach (var appliance in node.Nav_MeterAppliances)
{
appliance.Nav_Appliance = allApplice.FirstOrDefault(i => i.ID == appliance.APPLIANCE_ID);
}
node.Nav_DeductAppliances = deApplicances.Where(i => i.NODE_ID == node.ID && appIds.Contains(i.APPLIANCE_ID)).ToList();
foreach (var appliance in node.Nav_DeductAppliances)
{
appliance.Nav_Appliance = allApplice.FirstOrDefault(i => i.ID == appliance.APPLIANCE_ID);
}
}
var meterNodeserice = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IBDMeterNodeService>();
var nodes = meterNodeserice.GetCalMeterAllAppliance(null, typeId, filter.GetOrgId(), allNodes);
application = nodes.SelectMany(i => i.Nav_MeterAppliances).ToList();
var deApplication = nodes.SelectMany(i => i.Nav_DeductAppliances).ToList();
attrs = new List<T_BD_APPLIANCE_ATTR>();
if (application.Count > 20)
{
attrs = this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType.,
baseFilter, "", "Nav_VariableAttr");
}
else
{
foreach (var app in application)
{
attrs.AddRange(this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., baseFilter, app.APPLIANCE_ID.ToString(), "Nav_Appliance", "Nav_VariableAttr").ToList());
}
foreach (var app in deApplication)
{
attrs.AddRange(this.GetEntitiesByRedis<T_BD_APPLIANCE_ATTR>(x => x.Nav_VariableAttr != null
&& x.Nav_VariableAttr.VAR_ATTR_TYPE == (int)BDVarAttrType., baseFilter, app.APPLIANCE_ID.ToString(), "Nav_Appliance", "Nav_VariableAttr").ToList());
}
}
}
/// <summary>
/// 获取首页配置属性
/// Keyword:用户id
/// </summary>
/// <returns></returns>
[HttpPost, Route("GetConf")]
public async Task<JsonActionResult<HomePageModel>> GetConf([FromBody] KeywordFilter filter)
{
return base.SafeExecute(() =>
{
return GetRedisConfig(filter);
});
}
/// <summary>
/// 获取用户Redis配置
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
private HomePageModel GetRedisConfig(KeywordFilter filter)
{
var fields = typeof(HomePageModel).GetProperties();
List<dynamic> attrs = new List<dynamic>();
var redisKey = RedisCacheKey.HomePageUserSetting
+ "_" + filter.Keyword;
List<string> homePageFilter = new List<string>();
Dictionary<string, string[]> filterArray = new Dictionary<string, string[]>();
if (!string.IsNullOrEmpty(filter.Parameter1))
{
redisKey += "_" + filter.Parameter1;
var form = this.GetEntityByRedis<T_PF_FORM>(filter.Parameter1, filter.GetOrgId());
if (form != null)
{
//var pageCustom = this.GetEntityByRedis<T_PF_PAGE_CUSTOM>(form.ID, filter.GetOrgId());
//if (pageCustom != null && !string.IsNullOrEmpty(pageCustom.CUSTOM_PARAMS))
//{
// filterArray = pageCustom.CUSTOM_PARAMS.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
//}
var statatics = this.GetEntitiesByRedis<T_PF_FORM_HOME_STATISTIC>(null, new BaseFilter(filter.GetOrgId()), form.ID.ToString()).Select(i => i.VALUE.ToString()).ToArray();
filterArray.Add("HomePageStatisticsEnum", statatics);
var charts = this.GetEntitiesByRedis<T_PF_FORM_HOME_CHART>(null, filter, form.ID.ToString()).Select(i => i.VALUE.ToString()).ToArray();
filterArray.Add("HomePageChartEnum", charts);
var rankings = this.GetEntitiesByRedis<T_PF_FORM_HOME_RANKING>(null, filter, form.ID.ToString()).Select(i => i.VALUE.ToString()).ToArray();
filterArray.Add("HomePageRankingEnum", rankings);
var hmis = this.GetEntitiesByRedis<T_PF_FORM_HOME_HMI>(null, filter, form.ID.ToString()).Select(i => i.HMI_ID.ToString()).ToArray();
filterArray.Add("HomePageHmiEnum", hmis);
}
}
var redisConfig = CsRedisManager.GetClient().Get<HomePageModel>(redisKey);
bool isRedis = true;
bool isRedisUpdate = false;
if (redisConfig == null)
{
redisConfig = new HomePageModel();
redisConfig.UserId = new Guid(filter.Keyword);
isRedis = false;
isRedisUpdate = true;
}
foreach (var fi in fields)
{
var enumName = fi.GetAttribute<EnumNameAttribute>();
if (enumName != null)
{
var enumType = ReflectHelper.FindTypeInCurrentDomain(enumName.EnumName);
var enums = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
homePageFilter.Clear();
if (filterArray != null && filterArray.ContainsKey(enumName.EnumName))
{
homePageFilter = filterArray[enumName.EnumName].ToList();
}
if (isRedis)
{
var redisItems = fi.GetValue(redisConfig) as List<dynamic>;
if (redisItems == null)
redisItems = new List<dynamic>();
if (homePageFilter.Any())//过滤枚举
{
for (var x = redisItems.Count - 1; x >= 0; x--)
{
if (!homePageFilter.Any(i => i == Convert.ToString(redisItems[x].Code)))
{
redisItems.RemoveAt(x);
isRedisUpdate = true;
}
}
}
if (enumName.EnumName != "HomePageHmiEnum")
{
foreach (var em in enums)
{
var emVal = (Convert.ToInt32(em.GetValue(null))).ToString();
if (!redisItems.Any(i => i.Code == emVal) && homePageFilter.Any(i => i == emVal))
{
dynamic propBase = new System.Dynamic.ExpandoObject();
propBase.Code = emVal;
propBase.Name = em.Name;
propBase.IsCheck = true;
redisItems.Add(propBase);
isRedisUpdate = true;
}
if (redisItems.Any(i => i.Code == emVal) && !homePageFilter.Any(i => i == emVal))
{
dynamic it = redisItems.FirstOrDefault(i => i.Code == emVal);
redisItems.Remove(it);
isRedisUpdate = true;
}
}
}
else
{
foreach (var hmi in homePageFilter)
{
var hmiObj = this.GetEntityByRedis<T_BD_HMI>(hmi, filter.GetOrgId());
if (hmiObj != null)
{
var def = redisItems.FirstOrDefault(i => i.Code == hmiObj.ID.ToString());
if (def == null)
{
dynamic propBase = new System.Dynamic.ExpandoObject();
propBase.Code = hmiObj.ID.ToString();
propBase.Name = hmiObj.NAME;
propBase.IsCheck = true;
redisItems.Add(propBase);
isRedisUpdate = true;
}
}
}
}
fi.SetValue(redisConfig, redisItems);
}
else
{
var redisItems = new List<dynamic>();
if (enumName.EnumName != "HomePageHmiEnum")
{
foreach (var em in enums)
{
var emVal = (Convert.ToInt32(em.GetValue(null))).ToString();
if (!redisItems.Any(i => i.Code == emVal) && homePageFilter.Any(i => i == emVal))
{
dynamic propBase = new System.Dynamic.ExpandoObject();
propBase.Code = emVal;
propBase.Name = em.Name;
propBase.IsCheck = true;
redisItems.Add(propBase);
}
}
}
else
{
foreach (var hmi in homePageFilter)
{
var hmiObj = this.GetEntityByRedis<T_BD_HMI>(hmi, filter.GetOrgId());
if (hmiObj != null)
{
dynamic propBase = new System.Dynamic.ExpandoObject();
propBase.Code = hmiObj.ID.ToString();
propBase.Name = hmiObj.NAME;
propBase.IsCheck = true; ;
redisItems.Add(propBase);
}
}
}
fi.SetValue(redisConfig, redisItems);
}
}
if (isRedisUpdate)
CsRedisManager.GetClient().Set(redisKey, redisConfig);
}
return redisConfig;
}
/// <summary>
/// 设置首页配置属性
/// Keyword:用户id
/// </summary>
/// <returns></returns>
[HttpPost, Route("SetConf")]
public async Task<JsonActionResult<bool>> SetConf([FromBody] HomePageModel setting)
{
return SafeExecute<bool>(() =>
{
var redisKey = RedisCacheKey.HomePageUserSetting
+ "_" + setting.UserId;
if (!string.IsNullOrEmpty(setting.FromCode))
redisKey += "_" + setting.FromCode;
return CsRedisManager.GetClient().Set(redisKey, setting);
});
}
}
}