大屏折线图

This commit is contained in:
quowingwang 2025-11-25 15:05:03 +08:00
parent 7a18a0633a
commit 573ebf4f83
5 changed files with 136 additions and 5 deletions

View File

@ -149,5 +149,17 @@ namespace RIZO.Admin.WebApi.Controllers.Mes.WorkOrderInfo
true
);
}
/// <summary>
/// 查询一周合格数不合适数这些图
/// </summary>
/// <returns></returns>
[HttpGet("/queryQualityLineChart")]
[ActionPermissionFilter(Permission = "workorder:list")]
public IActionResult QueryQualityLineChart()
{
var response = _WorkOrderService.QueryQualityLineChart();
return SUCCESS(response);
}
}
}

View File

@ -111,4 +111,54 @@ namespace RIZO.Model.Mes.Dto.WorkOrderInfo
public string UserId { get; set; }
public string UserName { get; set; }
}
/// <summary>
/// 饼图数据项模型(单条数据)
/// </summary>
public class PieChartItem
{
/// <summary>
/// 分类名称(如 A类、B类对应前端 name
/// </summary>
public string name { get; set; }
/// <summary>
/// 对应数值(对应前端 value用 double 兼容整数/小数)
/// </summary>
public double value { get; set; }
}
/// <summary>
/// 饼图响应模型(外层统一格式)
/// </summary>
public class PieChartResponse
{
public int code { get; set; } = 200;
public string msg { get; set; } = "操作成功";
/// <summary>
/// 饼图核心数据(直接返回数组)
/// </summary>
public List<PieChartItem> data { get; set; } = new List<PieChartItem>();
}
/// <summary>
/// 折线图返回模型
/// </summary>
public class LineChartResponse
{
/// <summary>
/// X轴数据
/// </summary>
public List<string> xAxisData { get; set; } = new List<string>();
/// <summary>
/// 系列数据
/// </summary>
public List<LineChartSeries> series { get; set; } = new List<LineChartSeries>();
}
public class LineChartSeries
{
public string Name { get; set; }
public List<double> Data { get; set; } = new List<double>();
}
}

View File

@ -120,5 +120,8 @@ namespace RIZO.Model.Mes.WorkOrderInfo
/// </summary>
[SugarColumn(ColumnName = "batch_number")]
public string BatchNumber { get; set; }
[SugarColumn(ColumnName = "CreateDate")]
private string CreateDate { get; set; }
}
}

View File

@ -24,6 +24,6 @@ namespace RIZO.Service.Mes.IMesService.WorkOrderInfo
int ChangeWorkOrderState(WorkOrderState parm);
LineChartResponse QueryQualityLineChart();
}
}

View File

@ -1,6 +1,7 @@
using Aliyun.OSS;
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using Microsoft.Data.SqlClient;
using RIZO.Model.Mes.Dto.GatherData;
using RIZO.Model.Mes.Dto.WorkOrderInfo;
using RIZO.Model.Mes.MasterData;
@ -9,6 +10,7 @@ using RIZO.Repository;
using RIZO.Service.Mes.IMesService.MasterData;
using RIZO.Service.Mes.IMesService.WorkOrderInfo;
using RIZO.Service.Mes.MasterData;
using SqlSugar.Extensions;
namespace RIZO.Service.Mes.WorkOrderInfo
{
@ -19,7 +21,7 @@ namespace RIZO.Service.Mes.WorkOrderInfo
public class WorkOrderService : BaseService<WorkOrder>, IWorkOrderService
{
private WorkOrderItemService workOrderItemService = new WorkOrderItemService();
/// <summary>
/// 查询工单主表列表
/// </summary>
@ -46,7 +48,7 @@ namespace RIZO.Service.Mes.WorkOrderInfo
return response;
}
/// <summary>
/// 获取详情
@ -122,7 +124,7 @@ namespace RIZO.Service.Mes.WorkOrderInfo
}
return predicate;
}
public WorkOrder CreateWorkOrderBySacnCode(FlowCard flowCard)
{
@ -241,10 +243,74 @@ namespace RIZO.Service.Mes.WorkOrderInfo
);
}
catch (Exception ex)
{
{
iResult = 0;
}
return iResult;
}
/// <summary>
/// 按产线统计7天内每日合格率折线图数据
/// </summary>
/// <returns>合格率折线图格式xAxisData + series</returns>
public LineChartResponse QueryQualityLineChart()
{
DateTime now = DateTime.Now;
List<DateTime> last7Days = Enumerable.Range(0, 7)
.Select(i => now.AddDays(-i).Date)
.OrderBy(date => date)
.ToList();
List<string> xAxisData = last7Days.Select(date => date.ToString("yyyy-MM-dd")).ToList();
string sql = string.Format(@"SELECT
w.line_code LineCode,
w.line_name LineName,
w.create_time,
sum(w.ok_qty) OkQty,
sum(w.ng_qty) NgQty
FROM
work_order w
WHERE
w.create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
AND w.create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
GROUP BY
w.line_code,
w.line_name,
DATE_FORMAT(w.create_time, '%Y-%m-%d')");
var queryData = SqlQueryToList(sql);
List<LineChartSeries> series = new List<LineChartSeries>();
foreach (var lineKv in queryData)
{
string lineCode = lineKv.LineCode;
string lineName = lineKv.LineName;
// 为7天的每个日期补全数据计算合格率
List<double> data = new List<double>();
foreach (string date in xAxisData)
{
// 存在该日期数据则用查询结果否则OK/NG均为0
if (lineKv.CreateTime.ObjToDate().ToString("yyyy-MM-dd").Contains(date))
{
int total = lineKv.OkQty + lineKv.NgQty;
// 合格率=OK数/总数总数为0时合格率设为0避免除以0
double rate = total == 0 ? 0 : Math.Round(((double)lineKv.OkQty / total)*100, 2);
data.Add(rate);
}
else
{
data.Add(0);
}
}
series.Add(new LineChartSeries
{
Name = $"{lineName}({lineCode})",
Data = data
});
}
return new LineChartResponse
{
xAxisData = xAxisData,
series = series
};
}
}
}