WX
2022-03-17 3d87b751b29e3681a8908be38e798e0ea91b21d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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;
    }
}