ZTICInterface.Application/App/IndustryPolicyApp.cs
@@ -25,7 +25,7 @@ /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> [HttpGet] [HttpGet] public async Task<Page<IndustryPolicy>> GetPages([FromQuery] int pageIndex, [FromQuery] int pageSize) { return await _industryPolicyService.GetPagesAsync(pageIndex, pageSize,null,a=>a.PublishDate,OrderByType.Desc); ZTICInterface.Application/App/TableProductionSalesApp.cs
New file @@ -0,0 +1,34 @@ using System.Collections.Generic; using System.Threading.Tasks; using Furion.DynamicApiController; using Microsoft.AspNetCore.Mvc; using SqlSugar; using ZTICInterface.Application.Service; using ZTICInterface.Core.Entity; using ZTICInterface.Core.Extend; using ZTICInterface.Core.ViewModel; namespace ZTICInterface.Application.App; /// <summary> /// 报表-生成及销售数据 /// </summary> public class TableProductionSalesApp : IDynamicApiController { private readonly TableProductionSalesService _productionSalesService; public TableProductionSalesApp(TableProductionSalesService productionSalesService) { _productionSalesService = productionSalesService; } /// <summary> /// 获取分页 /// </summary> /// <returns></returns> [HttpPost] public async Task<Page<Dictionary<string, object>>> SearchPages([FromBody]VmParamTableProductionSalesPageSearch param) { return await _productionSalesService.GetPages(param); } } ZTICInterface.Application/Service/TableProductionSalesService.cs
New file @@ -0,0 +1,129 @@ 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.Main.ToIConditionalModels(); var page = await Context.Queryable<TableProductionSalesName>() .Where(cms) .OrderBy(a=>a.UpdateTime,OrderByType.Desc) .ToPageAsync(param.PageIndex, param.PageSize); var dbDataRange = await Context.Queryable<TableProductionSalesValue>() .Where(a => page.Items.Select(p => p.Id).Contains(a.NameId)) .Select(a => new { Min = SqlFunc.AggregateMin(Convert.ToDateTime(SqlFunc.MergeString(a.Year.ToString(), "/", a.Month.ToString(), "/1"))), Max = SqlFunc.AggregateMax(Convert.ToDateTime(SqlFunc.MergeString(a.Year.ToString(), "/", a.Month.ToString(), "/1"))), }) .FirstAsync(); // 符合条件的数据值 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?.Main.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 = new List<Dictionary<string,object>>(); var nameProps = typeof(TableProductionSalesName).GetProperties(); foreach (var item in page.Items) { var dict = new Dictionary<string, object>(); foreach (var prop in nameProps) { var value = prop.GetValue(item); dict.Add(prop.Name,value); } kvList.Add(dict); } 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; if (value != null) kvItem[colName] = $"{value:N2}"; } } var res = new Page<Dictionary<string, object>>() { PageIndex = page.PageIndex, PageSize = page.PageSize, TotalItems = page.TotalItems, Items = kvList }; return res; } } ZTICInterface.Application/ZTICInterface.Application.csproj
@@ -22,8 +22,8 @@ </ItemGroup> <ItemGroup> <Folder Include="Service\" /> <Folder Include="App\" /> <Folder Include="Service\" /> </ItemGroup> </Project> ZTICInterface.Application/ZTICInterface.Application.xml
@@ -17,6 +17,17 @@ <param name="pageSize"></param> <returns></returns> </member> <member name="T:ZTICInterface.Application.App.TableProductionSalesApp"> <summary> 报表-生成及销售数据 </summary> </member> <member name="M:ZTICInterface.Application.App.TableProductionSalesApp.SearchPages(ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch)"> <summary> 获取分页 </summary> <returns></returns> </member> <member name="M:ZTICInterface.Application.Repository`1.AddAsync(`0,System.Boolean)"> <summary> 添加一条数据 @@ -87,5 +98,17 @@ <returns>受影响行数</returns> </member> <!-- Badly formed XML comment ignored for member "M:ZTICInterface.Application.Repository`1.DeleteAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Boolean)" --> <member name="T:ZTICInterface.Application.Service.TableProductionSalesService"> <summary> 生产和销售情况 </summary> </member> <member name="M:ZTICInterface.Application.Service.TableProductionSalesService.GetPages(ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch)"> <summary> 分页列表 </summary> <param name="param"></param> <returns></returns> </member> </members> </doc> ZTICInterface.Core/Entity/TableProductionSalesName.cs
New file @@ -0,0 +1,62 @@ using System; using System.ComponentModel; using SqlSugar; namespace ZTICInterface.Core.Entity; /// <summary> /// 生产和销售情况-属性表 /// </summary> [Tenant("1")] public class TableProductionSalesName:BaseEntity { /// <summary> /// 指标名称 /// </summary> [Description("")] public string Name { get; set; } /// <summary> /// 频率 /// </summary> public string Frequency { get; set; } /// <summary> /// 单位 /// </summary> public string Unit { get; set; } /// <summary> /// 来源 /// </summary> public string Source { get; set; } /// <summary> /// 国家 /// </summary> public string Country { get; set; } /// <summary> /// 更新时间 /// </summary> public DateTime UpdateTime { get; set; } } /// <summary> /// 生产和销售情况-数据值表 /// </summary> [Tenant("1")] public class TableProductionSalesValue : BaseEntity { /// <summary> /// 指标Id /// </summary> public int NameId { get; set; } /// <summary> /// 年份 /// </summary> public int Year { get; set; } /// <summary> /// 月份 /// </summary> public int Month { get; set; } /// <summary> /// 值 /// </summary> public double Value { get; set; } } ZTICInterface.Core/Extend/Page.cs
@@ -1,4 +1,5 @@ using System.Collections.Generic; using System.Data; using System.Threading.Tasks; using SqlSugar; @@ -26,6 +27,11 @@ /// 数据集 /// </summary> public List<T> Items { get; set; } public static implicit operator Page<T>(Page<DataTable> v) { throw new System.NotImplementedException(); } } public static class PageExtension ZTICInterface.Core/Extend/SugarTableSearchSimple.cs
New file @@ -0,0 +1,23 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using SqlSugar; namespace ZTICInterface.Core.Extend; public class SugarTableSearchSimple { /// <summary> /// 字段名 /// </summary> public string FieldName { get; set; } /// <summary> /// 条件类型 /// https://www.donet5.com/Home/Doc?typeId=2314 /// </summary> [JsonConverter(typeof(StringEnumConverter))] public ConditionalType ConditionalType { get; set; } /// <summary> /// 值 /// </summary> public string FieldValue { get; set; } } ZTICInterface.Core/Method/JsonHelper.cs
New file @@ -0,0 +1,25 @@ namespace ZTICInterface.Core.Method; public static class JsonHelper { /// <summary> /// 序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string ToJson<T>(this T obj) { return Newtonsoft.Json.JsonConvert.SerializeObject(obj); } /// <summary> /// 反序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="str"></param> /// <returns></returns> public static T ToObject<T>(this string str) { return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(str); } } ZTICInterface.Core/Method/MapToICM.cs
New file @@ -0,0 +1,27 @@ using System.Collections.Generic; using System.Linq; using Mapster; using SqlSugar; using StackExchange.Profiling.Internal; using ZTICInterface.Core.Extend; using ZTICInterface.Core.ViewModel; namespace ZTICInterface.Core.Method; public static class SugarFilterHelper { /// <summary> /// 将SugarTableSearchSimple转为sugar格式 /// </summary> /// <param name="param"></param> /// <returns></returns> public static List<IConditionalModel> ToIConditionalModels(this List<SugarTableSearchSimple> param) { var list = param .Where(a => !a.FieldName.IsNullOrWhiteSpace()) .Select(item => item.Adapt<ConditionalModel>()) .Cast<IConditionalModel>() .ToList(); return list; } } ZTICInterface.Core/ViewModel/TableProductionSales.cs
New file @@ -0,0 +1,45 @@ using System; using System.Collections.Generic; using ZTICInterface.Core.Extend; namespace ZTICInterface.Core.ViewModel; /// <summary> /// 分页查询条件 /// </summary> public class VmParamTableProductionSalesPageSearch { /// <summary> /// 页码 /// </summary> public int PageIndex { get; set; } /// <summary> /// 条数 /// </summary> public int PageSize { get; set; } /// <summary> /// 指标查询条件 /// </summary> public List<SugarTableSearchSimple> Main { get; set; } /// <summary> /// 数据时间范围 /// </summary> public ModelDateRange DateRange { get; set; } /// <summary> /// 时间范围 /// </summary> public class ModelDateRange { /// <summary> /// 开始时间 /// </summary> public DateTime? StartTime { get; set; } /// <summary> /// 结束时间 /// </summary> public DateTime? EndTime { get; set; } } } ZTICInterface.Core/ZTICInterface.Core.csproj
@@ -20,6 +20,8 @@ <ItemGroup> <Folder Include="Extend\" /> <Folder Include="ViewModel\" /> <Folder Include="Method\" /> </ItemGroup> </Project> ZTICInterface.Core/ZTICInterface.Core.xml
@@ -54,6 +54,66 @@ 链接 </summary> </member> <member name="T:ZTICInterface.Core.Entity.TableProductionSalesName"> <summary> 生产和销售情况-属性表 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesName.Name"> <summary> 指标名称 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesName.Frequency"> <summary> 频率 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesName.Unit"> <summary> 单位 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesName.Source"> <summary> 来源 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesName.Country"> <summary> 国家 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesName.UpdateTime"> <summary> 更新时间 </summary> </member> <member name="T:ZTICInterface.Core.Entity.TableProductionSalesValue"> <summary> 生产和销售情况-数据值表 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesValue.NameId"> <summary> 指标Id </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesValue.Year"> <summary> 年份 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesValue.Month"> <summary> 月份 </summary> </member> <member name="P:ZTICInterface.Core.Entity.TableProductionSalesValue.Value"> <summary> 值 </summary> </member> <member name="T:ZTICInterface.Core.Extend.MyConstant.MyCacheKey"> <summary> 缓存key @@ -121,12 +181,51 @@ <param name="isOrderBy"></param> <returns></returns> </member> <member name="P:ZTICInterface.Core.Extend.SugarTableSearchSimple.FieldName"> <summary> 字段名 </summary> </member> <member name="P:ZTICInterface.Core.Extend.SugarTableSearchSimple.ConditionalType"> <summary> 条件类型 https://www.donet5.com/Home/Doc?typeId=2314 </summary> </member> <member name="P:ZTICInterface.Core.Extend.SugarTableSearchSimple.FieldValue"> <summary> 值 </summary> </member> <member name="M:ZTICInterface.Core.Extend.TranReturn.Return``1(SqlSugar.DbResult{``0})"> <summary> 事务返回 </summary> <typeparam name="TR"></typeparam> <param name="result"></param> <returns></returns> </member> <member name="M:ZTICInterface.Core.Method.JsonHelper.ToJson``1(``0)"> <summary> 序列化 </summary> <typeparam name="T"></typeparam> <param name="obj"></param> <returns></returns> </member> <member name="M:ZTICInterface.Core.Method.JsonHelper.ToObject``1(System.String)"> <summary> 反序列化 </summary> <typeparam name="T"></typeparam> <param name="str"></param> <returns></returns> </member> <member name="M:ZTICInterface.Core.Method.SugarFilterHelper.ToIConditionalModels(System.Collections.Generic.List{ZTICInterface.Core.Extend.SugarTableSearchSimple})"> <summary> 将SugarTableSearchSimple转为sugar格式 </summary> <param name="param"></param> <returns></returns> </member> <member name="T:ZTICInterface.Core.MyRESTfulResultProvider"> @@ -178,5 +277,45 @@ <param name="errors"></param> <returns></returns> </member> <member name="T:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch"> <summary> 分页查询条件 </summary> </member> <member name="P:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.PageIndex"> <summary> 页码 </summary> </member> <member name="P:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.PageSize"> <summary> 条数 </summary> </member> <member name="P:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.Main"> <summary> 指标查询条件 </summary> </member> <member name="P:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.DateRange"> <summary> 数据时间范围 </summary> </member> <member name="T:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.ModelDateRange"> <summary> 时间范围 </summary> </member> <member name="P:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.ModelDateRange.StartTime"> <summary> 开始时间 </summary> </member> <member name="P:ZTICInterface.Core.ViewModel.VmParamTableProductionSalesPageSearch.ModelDateRange.EndTime"> <summary> 结束时间 </summary> </member> </members> </doc>