mh_sms/APT.MicroApi/APT.PF.WebApi/Controllers/Api/HomePageController.cs
2024-04-12 16:50:28 +08:00

2636 lines
131 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
});
}
}
}