2636 lines
131 KiB
C#
2636 lines
131 KiB
C#
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);
|
||
|
||
});
|
||
}
|
||
|
||
|
||
}
|
||
}
|