using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Linq;
|
using System.Threading.Tasks;
|
using Furion.ClayObject.Extensions;
|
using Furion.DatabaseAccessor;
|
using Furion.DependencyInjection;
|
using Newtonsoft.Json.Linq;
|
using SqlSugar;
|
using StackExchange.Profiling.Internal;
|
using ZTICInterface.Core.Entity;
|
using ZTICInterface.Core.Extend;
|
using ZTICInterface.Core.Method;
|
using ZTICInterface.Core.ViewModel;
|
|
namespace ZTICInterface.Application.Service;
|
|
/// <summary>
|
/// 生产和销售情况
|
/// </summary>
|
public class TableProductionSalesService:Repository<TableProductionSalesName>,ISingleton
|
{
|
/// <summary>
|
/// 分页列表
|
/// </summary>
|
/// <param name="param"></param>
|
/// <returns></returns>
|
public async Task<Page<Dictionary<string, object>>> GetPages(VmParamTableProductionSalesPageSearch param)
|
{
|
var cms = param.ColCondition.ToIConditionalModels();
|
var page = await Context.Queryable<TableProductionSalesName>()
|
.Where(cms)
|
.OrderBy(a=>a.UpdateTime,OrderByType.Desc)
|
.ToPageAsync(param.PageIndex, param.PageSize);
|
|
// 符合条件的数据值
|
var valueList = await Context.Queryable<TableProductionSalesValue>()
|
.Where(a => page.Items.Select(p => p.Id).Contains(a.NameId))
|
.ToListAsync();
|
var minDateRange = valueList.Min(a=>new DateTime(a.Year,a.Month,1));
|
var maxDateRange = valueList.Max(a => new DateTime(a.Year, a.Month, 1));
|
|
// 时间范围内的所有月份
|
var dateRange = new List<DateTime>();
|
var startDate = param.DateRange.StartTime ?? minDateRange;
|
var endDate = param.DateRange.EndTime ?? maxDateRange;
|
|
var frequencyItem = param?.ColCondition.Find(a =>
|
string.Equals(a.FieldName, "Frequency", StringComparison.CurrentCultureIgnoreCase));
|
// 如果条件type是=的话,拿频率值
|
var frequency = frequencyItem?.ConditionalType == ConditionalType.Equal ? frequencyItem.FieldValue : "";
|
// 频率=年,列以年显示;频率=季度,列显示季度
|
switch (frequency)
|
{
|
case "季":
|
// 时间范围 2020-05至2020-11 取 2020-06至2020-12
|
startDate = new DateTime(startDate.Year, (int)Math.Ceiling(startDate.Month / 3.0) * 3, 1);
|
endDate = new DateTime(endDate.Year, (int)Math.Ceiling(endDate.Month / 3.0) * 3, 1);
|
for (DateTime t = startDate; t <= endDate; t = t.AddMonths(3))
|
{
|
dateRange.Add(new DateTime(t.Year, t.Month, 1));
|
}
|
break;
|
case "年":
|
// 时间范围 2020-05至2021-11 取 2020-12至2021-12
|
for (int year = startDate.Year; year <= endDate.Year; year++)
|
{
|
dateRange.Add(new DateTime(year, 12, 1));
|
}
|
break;
|
// 其余按“月”处理
|
default:
|
// 置为每月1号
|
startDate = new DateTime(startDate.Year, startDate.Month, 1);
|
endDate = new DateTime(endDate.Year, endDate.Month, 1);
|
for (DateTime t = startDate; t <= endDate; t = t.AddMonths(1))
|
{
|
dateRange.Add(new DateTime(t.Year, t.Month, 1));
|
}
|
break;
|
}
|
|
// 结果组装
|
var kvList = page.Items.ToJson().ToObject<List<Dictionary<string, object>>>();
|
// 添加每个指标对应时间的值
|
foreach (var dateTime in dateRange)
|
{
|
var colName = dateTime.ToString("yyyy-MM");
|
foreach (var kvItem in kvList)
|
{
|
var value = valueList.Find(a =>
|
a.Year == dateTime.Year && a.Month == dateTime.Month &&
|
a.NameId.ToString() == kvItem["Id"].ToString())?.Value;
|
kvItem[colName] = $"{value:N2}";
|
}
|
}
|
|
var res = new Page<Dictionary<string, object>>()
|
{
|
PageIndex = page.PageIndex,
|
PageSize = page.PageSize,
|
TotalItems = page.TotalItems,
|
Items = kvList
|
};
|
|
|
return res;
|
}
|
}
|