diff --git a/DOAN.Admin.WebApi/Controllers/MES/SmartScreen/Product/ProductSmartScreenController.cs b/DOAN.Admin.WebApi/Controllers/MES/SmartScreen/Product/ProductSmartScreenController.cs index e499e48..47b8064 100644 --- a/DOAN.Admin.WebApi/Controllers/MES/SmartScreen/Product/ProductSmartScreenController.cs +++ b/DOAN.Admin.WebApi/Controllers/MES/SmartScreen/Product/ProductSmartScreenController.cs @@ -35,6 +35,25 @@ namespace DOAN.Admin.WebApi.Controllers.MES.SmartScreen.Product } + //TODO 今日 各工序产量统计 + [HttpGet("BarProcessProductStatistic")] + public IActionResult BarProcessProductStatistic() + { + var response = _productSmartScreenService.BarProcessProductStatistic(); + + return SUCCESS(response); + } + + + //TODO 本月产量 折线图 + //本月每天产量 + [HttpGet("outputOfCurrentmonth")] + public IActionResult OutputOfCurrentmonth() + { + var response = _productSmartScreenService.OutputOfCurrentmonth(); + return SUCCESS(response); + } + diff --git a/DOAN.Admin.WebApi/Controllers/Mobile/ReportFlowController.cs b/DOAN.Admin.WebApi/Controllers/Mobile/ReportFlowController.cs index c0122f9..1adad67 100644 --- a/DOAN.Admin.WebApi/Controllers/Mobile/ReportFlowController.cs +++ b/DOAN.Admin.WebApi/Controllers/Mobile/ReportFlowController.cs @@ -1,3 +1,4 @@ +using DOAN.Model.Mobile.ReportFlow.Dto; using DOAN.Service.Mobile.IService; using Infrastructure.Converter; using Microsoft.AspNetCore.Mvc; @@ -77,6 +78,9 @@ public class ReportFlowController : BaseController } return ToResponse(ResultCode.SUCCESS,_reportFlowService.GetProcessReportWorkDetail(workorder, processId)); } + + + //TODO 领料工序 [HttpGet("feed_process_reportwork")] public IActionResult FeedProcessReportwork(string workorder, int processId, int finish_num,string stove_code,string feed_order,string process_operator) @@ -100,14 +104,14 @@ public class ReportFlowController : BaseController /// /// [HttpGet("process_reportwork")] - public IActionResult ProcessReportWork(string workorder, int processId, int finish_num,int bad_num,string process_operator) + public IActionResult ProcessReportWork([FromQuery]ProReportWorkDto proReportWorkDto) { - if (string.IsNullOrEmpty(workorder)) + if (string.IsNullOrEmpty(proReportWorkDto.workorder)) { throw new CustomException("workorder or process is null"); } - return SUCCESS(_reportFlowService.ProcessReportWork(workorder, processId, finish_num,bad_num, process_operator)); + return SUCCESS(_reportFlowService.ProcessReportWork(proReportWorkDto.workorder, proReportWorkDto. processId, proReportWorkDto.finish_num, proReportWorkDto.bad_num, proReportWorkDto.process_operator)); } //TODO 出货工序 diff --git a/DOAN.Model/MES/Product/Dto/ProReportworkDto.cs b/DOAN.Model/MES/Product/Dto/ProReportworkDto.cs index 83e8375..96e5875 100644 --- a/DOAN.Model/MES/Product/Dto/ProReportworkDto.cs +++ b/DOAN.Model/MES/Product/Dto/ProReportworkDto.cs @@ -8,7 +8,7 @@ namespace DOAN.Model.BZFM.Dto { public string Workorder { get; set; } - public string RouteCode { get; set; } + public string RouteId { get; set; } public int ProcessId { get; set; } @@ -27,7 +27,7 @@ namespace DOAN.Model.BZFM.Dto public string Workorder { get; set; } - public string RouteCode { get; set; } + public string RouteId { get; set; } public int ProcessId { get; set; } public string ProcessName { get; set; } @@ -40,7 +40,7 @@ namespace DOAN.Model.BZFM.Dto public string Worker { get; set; } - public DateTime? JobDate { get; set; } + public DateTime? JobDateTime { get; set; } public string Remark { get; set; } diff --git a/DOAN.Model/MES/Product/ProReportwork01.cs b/DOAN.Model/MES/Product/ProReportwork01.cs index 6feb309..f85795a 100644 --- a/DOAN.Model/MES/Product/ProReportwork01.cs +++ b/DOAN.Model/MES/Product/ProReportwork01.cs @@ -21,8 +21,8 @@ namespace DOAN.Model.MES.product /// /// 路线code /// - [SugarColumn(ColumnName = "route_code")] - public string RouteCode { get; set; } + [SugarColumn(ColumnName = "route_id")] + public int RouteId { get; set; } /// /// 工序id @@ -56,8 +56,8 @@ namespace DOAN.Model.MES.product /// /// 作业日期 /// - [SugarColumn(ColumnName = "job_date")] - public DateTime? JobDate { get; set; } + [SugarColumn(ColumnName = "job_datetime")] + public DateTime? JobDateTime { get; set; } /// /// 备注 diff --git a/DOAN.Model/Mobile/ReportFlow/Dto/ProReportWorkDto.cs b/DOAN.Model/Mobile/ReportFlow/Dto/ProReportWorkDto.cs new file mode 100644 index 0000000..77ffeda --- /dev/null +++ b/DOAN.Model/Mobile/ReportFlow/Dto/ProReportWorkDto.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DOAN.Model.Mobile.ReportFlow.Dto +{ + public class ProReportWorkDto + { + public string workorder { get; set; } + public int processId { get; set; } + public int finish_num { get; set; } + public int bad_num { get; set; } + public string process_operator { get; set; } + } +} diff --git a/DOAN.Model/echarts/EchartsDto.cs b/DOAN.Model/echarts/EchartsDto.cs deleted file mode 100644 index ab328c6..0000000 --- a/DOAN.Model/echarts/EchartsDto.cs +++ /dev/null @@ -1,98 +0,0 @@ -using Newtonsoft.Json.Converters; - -namespace DOAN.Model.mes.echarts -{ - - - - /// - /// echarts 通用Options返回值 - /// - public class EchartsOptions - { - public EchartsTitle Title { get; set; } = null; - public EchartsXAxis XAxis { get; set; } = null; - public EchartsYAxis YAxis { get; set; } = null; - public List Series { get; set; } = new List(); - } - - /// - /// echarts图表标题 - /// - public class EchartsTitle - { - public EchartsTitle(string Text,string SubText) - { - this.Text = Text; - this.SubText = SubText; - } - - public EchartsTitle(){} - public string Text { get; set; } = string.Empty; - public string SubText { get; set; } = string.Empty; - } - - /// - /// echarts X轴 - /// - public class EchartsXAxis - { - public List Data { get; set; } = new List(); - // public string[] Data { get; set; } =Array.Empty(); - - // value 数值轴,适用于连续数据 category 类目轴,适用于离散的类目数据 time 时间轴,适用于连续的时序数据 log 对数轴。适用于对数数据 - public string Type { get; set; } = "category"; - public string Max { get; set; } - public string Min { get; set; } - } - - /// - /// echarts Y轴 - /// - public class EchartsYAxis - { - public List Data { get; set; } = new List(); - - // value 数值轴,适用于连续数据 category 类目轴,适用于离散的类目数据 time 时间轴,适用于连续的时序数据 log 对数轴。适用于对数数据 - public string Type { get; set; } = "category"; - public string Max { get; set; } - public string Min { get; set; } - } - - /// - /// echarts图表series返回值 - /// - public class EchartsSeries - { - /// - /// 标签名称 - /// - public string Name { get; set; } = "category"; - - /// - /// bar-柱状图 line-折线图 EchartsSeriesType enum结构 - /// - public string Type { get; set; } = "bar"; - - /// - /// 参数值 - /// - public List Data { get; set; } = new List(); - } - - /// - /// echarts图表series返回值内容 - /// - public class EchartsSeriesData - { - /// - /// 标签名称 - /// - public string Name { get; set; } = string.Empty; - - /// - /// 参数值 - /// - public decimal Value { get; set; } = new decimal(); - } -} diff --git a/DOAN.Service/MES/SmartScreen/Product/IService/IProductSmartScreenService.cs b/DOAN.Service/MES/SmartScreen/Product/IService/IProductSmartScreenService.cs index 4c748d5..cd009d2 100644 --- a/DOAN.Service/MES/SmartScreen/Product/IService/IProductSmartScreenService.cs +++ b/DOAN.Service/MES/SmartScreen/Product/IService/IProductSmartScreenService.cs @@ -1,4 +1,5 @@ using DOAN.Model.MES.product; +using DOAN.Model.MES.SmartScreen; using DOAN.Model.MES.SmartScreen.Product; using System; using System.Collections.Generic; @@ -12,5 +13,9 @@ namespace DOAN.Service.MES.SmartScreen.Product.IService { DigitalTurntableModel DigitalTurntable(); + EchartsOptions BarProcessProductStatistic(); + + EchartsOptions OutputOfCurrentmonth(); + } } diff --git a/DOAN.Service/MES/SmartScreen/Product/ProductSmartScreenService.cs b/DOAN.Service/MES/SmartScreen/Product/ProductSmartScreenService.cs index 6d66392..a2d3ccd 100644 --- a/DOAN.Service/MES/SmartScreen/Product/ProductSmartScreenService.cs +++ b/DOAN.Service/MES/SmartScreen/Product/ProductSmartScreenService.cs @@ -8,6 +8,9 @@ using System.Text; using System.Threading.Tasks; using DOAN.Service.MES.SmartScreen.Product.IService; using DOAN.Model.MES.SmartScreen.Product; +using DOAN.Model.MES.SmartScreen; +using Microsoft.Data.SqlClient; +using DOAN.Model.MES.base_; namespace DOAN.Service.MES.SmartScreen.Product { @@ -46,5 +49,158 @@ namespace DOAN.Service.MES.SmartScreen.Product return digital; } + + + public EchartsOptions BarProcessProductStatistic() + { + EchartsOptions echartsOptions = new EchartsOptions(); + echartsOptions.Title = new EchartsTitle("今日各工序产量统计", "今日各工序产量统计"); + EchartsXAxis xAxis = new EchartsXAxis(); + + xAxis.Data = Context.Queryable().LeftJoin((r, p) => r.FkWorkProcesses == p.Id) + .Where((r, p) => r.FkWorkRoute == 32) + .OrderBy((r, p) => p.Id) + .Select((r, p) => p.Name) + .ToList(); + echartsOptions.XAxis=xAxis; + //获取各个工序今日累计报工值 + EchartsSeries echartsSeries = new EchartsSeries(); + echartsSeries.Name = "今日各个工序今日累计报工数"; + List Data = Context.Queryable() + .LeftJoin((it,w)=>it.ProcessId==w.Id) + .Where((it, w) => it.JobDateTime >= DateTime.Today && it.JobDateTime <= DateTime.Today.AddDays(1)) + .GroupBy((it, w) => new {it.ProcessId,w.Name}) + .Select((it, w) => new EchartsSeriesData() + { + Name = w.Name, + Value=SqlFunc.AggregateSum(it.FinishNum??0) + }).ToList(); + echartsSeries.Data = Data; + echartsOptions.Series.Add(echartsSeries); + //获取各个工序今日累计计划值 + EchartsSeries echartsSeries2 = new EchartsSeries(); + echartsSeries2.Name = "今日各个工序今日累计计划数"; + List Data2 = Context.Queryable() + .LeftJoin((it, w) => it.ProcessId == w.Id) + .Where((it, w) => it.JobDateTime >= DateTime.Today && it.JobDateTime <= DateTime.Today.AddDays(1)) + .GroupBy((it, w) => new { it.ProcessId, w.Name }) + .Select((it, w) => new EchartsSeriesData() + { + Name = w.Name, + Value = SqlFunc.AggregateSum(it.PlanNum ?? 0) + }).ToList(); + echartsSeries2.Data = Data2; + echartsOptions.Series.Add(echartsSeries2); + + + + return echartsOptions; + } + + /// + /// 本月每天产量 + /// + /// + public EchartsOptions OutputOfCurrentmonth() + { // 获取当前日期 + DateTime today = DateTime.Today; + + // 获取当前月的第一天 + DateTime firstDayOfMonth = new DateTime(today.Year, today.Month, 1); + + // 获取当前月的最后一天 + DateTime lastDayOfMonth = + new DateTime(today.Year, today.Month, DateTime.DaysInMonth(today.Year, today.Month)); + + EchartsOptions echartsOptions = new EchartsOptions(); + EchartsTitle Title = new EchartsTitle("本月每天产量", "本月每天产量"); + echartsOptions.Title = Title; + // 横坐标 + EchartsXAxis xAxis = new EchartsXAxis(); + List xData = new List(); + DateTime index = firstDayOfMonth; + do + { + xData.Add(index.ToString("MM-dd")); + index = index.AddDays(1); + } while (index < lastDayOfMonth.AddDays(1)); + + xAxis.Data = xData; + echartsOptions.XAxis = xAxis; + + + //折线系列 + EchartsSeries LineSeries = new EchartsSeries(); + LineSeries.Name = "本月每天产量"; + LineSeries.Type = "line"; + + + var result = Context.Queryable() + .LeftJoin((w, r) => w.Workorder == r.Workorder) + .Where((w, r) => w.WorkorderDate >= firstDayOfMonth && w.WorkorderDate <= lastDayOfMonth) + .GroupBy((w, r) => w.WorkorderDate) + .Select((w, r) => new EchartsSeriesData() + { + Name = w.WorkorderDate.Value.ToString("MM-dd"), + Value = SqlFunc.AggregateSum(r.FinishNum ?? 0) + + }).ToList(); + List LineSeriesData = new List(); + + foreach (var item in xData) + { + LineSeriesData.Add(new EchartsSeriesData() + { + Name = item, + Value = result.Where(it => it.Name == item).Select(it => it.Value).FirstOrDefault(), + }); + } + + LineSeries.Data = LineSeriesData; + echartsOptions.Series = new List() { LineSeries }; + + + // 各个组的产量系列 + string[] groupArray = Context.Queryable().Where(it => it.Status == 1).OrderBy(it => it.Id).Select(it => it.GroupCode) + .ToArray(); + if (groupArray.Length > 0) + { + var GroupresultList = Context.Queryable() + .LeftJoin((w, r) => w.Workorder == r.FkWorkorder) + .Where((w, r) => groupArray.Contains(w.GroupCode)) + .Where((w, r) => w.WorkorderDate >= firstDayOfMonth && w.WorkorderDate <= lastDayOfMonth) + .GroupBy((w, r) => new { w.GroupCode, w.WorkorderDate }) + .Select((w, r) => new + { + groupCode = w.GroupCode, + Name = w.WorkorderDate.Value.ToString("MM-dd"), + Value = SqlFunc.AggregateSum(r.FinishedNum ?? 0) + }).ToList(); + foreach (var group in groupArray) + { + EchartsSeries groupSeries = new EchartsSeries(); + groupSeries.Name = group + "组"; + groupSeries.Type = "bar"; + + + List LineSeriesData01 = new List(); + + foreach (var item in xData) + { + LineSeriesData01.Add(new EchartsSeriesData() + { + Name = item, + Value = GroupresultList.Where(it => it.Name == item).Where(it => it.groupCode == group).Select(it => it.Value).FirstOrDefault(), + }); + } + + groupSeries.Data = LineSeriesData01; + echartsOptions.Series.Add(groupSeries); + } + } + + return echartsOptions; + + } } } diff --git a/DOAN.Service/Mobile/ReportFlowService.cs b/DOAN.Service/Mobile/ReportFlowService.cs index 57f8a9d..8ffb13d 100644 --- a/DOAN.Service/Mobile/ReportFlowService.cs +++ b/DOAN.Service/Mobile/ReportFlowService.cs @@ -58,6 +58,7 @@ public class ReportFlowService : BaseService, IReportFlowServic .SetColumns(it => it.FinishNum == finish_num) .SetColumns(it => it.Worker == Worker) .SetColumns(it => it.JobDate == DateTime.Now) + .SetColumns(it => it.RouteId == 32) .SetColumns(it => it.UpdatedBy == Worker) .SetColumns(it => it.UpdatedTime == DateTime.Now) .ExecuteCommand(); @@ -73,7 +74,7 @@ public class ReportFlowService : BaseService, IReportFlowServic proReportwork01.Workorder = workorder; proReportwork01.ProcessId = processId; proReportwork01.FinishNum = finish_num; - + proReportwork01.RouteId = 32; proReportwork01.Worker = Worker; proReportwork01.JobDate = DateTime.Now; proReportwork01.CreatedBy = Worker; @@ -100,6 +101,7 @@ public class ReportFlowService : BaseService, IReportFlowServic .SetColumns(it => it.FinishNum == finish_num) .SetColumns(it => it.BadNum == bad_num) .SetColumns(it => it.Worker == Worker) + .SetColumns(it => it.RouteId == 32) .SetColumns(it => it.JobDate == DateTime.Now) .SetColumns(it => it.UpdatedBy == Worker) .SetColumns(it => it.UpdatedTime == DateTime.Now) @@ -115,6 +117,7 @@ public class ReportFlowService : BaseService, IReportFlowServic proReportwork01.FinishNum = finish_num; proReportwork01.BadNum = bad_num; proReportwork01.Worker = Worker; + proReportwork01.RouteId = 32; proReportwork01.JobDate = DateTime.Now; proReportwork01.CreatedBy = Worker; proReportwork01.CreatedTime = DateTime.Now; @@ -145,6 +148,7 @@ public class ReportFlowService : BaseService, IReportFlowServic result = Context.Updateable() .Where(it => it.Workorder == workorder && it.ProcessId == processId) .SetColumns(it => it.FinishNum == finish_num) + .SetColumns(it => it.RouteId == 32) .SetColumns(it => it.BadNum == bad_num) .SetColumns(it => it.Worker == Worker) .SetColumns(it => it.JobDate == DateTime.Now) @@ -165,6 +169,7 @@ public class ReportFlowService : BaseService, IReportFlowServic proReportwork01.FinishNum = finish_num; proReportwork01.BadNum = bad_num; proReportwork01.Worker = Worker; + proReportwork01.RouteId = 32; proReportwork01.JobDate = DateTime.Now; proReportwork01.CreatedBy = Worker; proReportwork01.CreatedTime = DateTime.Now; @@ -211,13 +216,13 @@ public class ReportFlowService : BaseService, IReportFlowServic public List GetProcessByRoute(int route_id) { - return Context.Queryable() - .LeftJoin((rel, pro) => rel.FkWorkProcesses == pro.Id) - .Where((rel, pro) => rel.FkWorkRoute == route_id) - .Select((rel, pro) => pro) - .ToList() - .Adapt, List>(); - + return Context.Queryable() + .LeftJoin((rel, pro) => rel.FkWorkProcesses == pro.Id) + .Where((rel, pro) => rel.FkWorkRoute == route_id) + .Select((rel, pro) => pro) + .ToList() + .Adapt, List>(); + } public List GetReportByProcessId(int processId)