diff --git a/ZR.Admin.WebApi/Controllers/BI/carouselBoard/CarouselBoardController.cs b/ZR.Admin.WebApi/Controllers/BI/carouselBoard/CarouselBoardController.cs
new file mode 100644
index 00000000..416feab4
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/BI/carouselBoard/CarouselBoardController.cs
@@ -0,0 +1,80 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.mes.carouselBoard;
+using ZR.Service.BI.IService;
+using ZR.Service.MES.carouselBoard.IService;
+
+namespace ZR.Admin.WebApi.Controllers.BI
+{
+ ///
+ /// 生产看板BI
+ ///
+
+ [Route("BI/CarouselBoard")]
+ public class CarouselBoardController : BaseController
+ {
+
+ ICarouselBoardService _carouselBoardService;
+ public CarouselBoardController(ICarouselBoardService carouselBoardService)
+ {
+
+ this._carouselBoardService = carouselBoardService;
+ }
+
+ ///
+ /// 获取质量大屏轮播数据
+ ///
+ ///
+ [HttpPost("getQualityStatisticsCarouselBoardData")]
+ public IActionResult GetQualityStatisticsCarouselBoardData([FromBody] CarouselBoardQuery query)
+ {
+ var response = _carouselBoardService.GetQualityStatisticsCarouselBoardData(query);
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 获取工单大屏轮播数据
+ ///
+ ///
+ [HttpPost("getWorkOrderCarouselBoardData")]
+ public IActionResult GetWorkOrderCarouselBoardData([FromBody] CarouselBoardQuery query)
+ {
+ var response = _carouselBoardService.GetWorkOrderCarouselBoardData(query);
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 获取毛坯大屏轮播数据
+ ///
+ ///
+ [HttpPost("getBlankInventoryCarouselBoardData")]
+ public IActionResult GetBlankInventoryCarouselBoardData([FromBody] CarouselBoardQuery query)
+ {
+ var response = _carouselBoardService.GetBlankInventoryCarouselBoardData(query);
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 获取设备报警信息大屏轮播数据
+ ///
+ ///
+ [HttpPost("getEquipmentAlarmCarouselBoardData")]
+ public IActionResult GetEquipmentAlarmCarouselBoardData([FromBody] CarouselBoardQuery query)
+ {
+ var response = _carouselBoardService.GetEquipmentAlarmCarouselBoardData(query);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 获取设备实时参数信息大屏轮播数据
+ ///
+ ///
+ [HttpPost("getEquipmentLiveCarouselBoardData")]
+ public IActionResult GetEquipmentLiveCarouselBoardData([FromBody] CarouselBoardQuery query)
+ {
+ var response = _carouselBoardService.GetEquipmentLiveCarouselBoardData(query);
+ return SUCCESS(response);
+ }
+
+ }
+}
diff --git a/ZR.Model/MES/BI/carouselBoard/CarouselBoardDto.cs b/ZR.Model/MES/BI/carouselBoard/CarouselBoardDto.cs
new file mode 100644
index 00000000..5044f634
--- /dev/null
+++ b/ZR.Model/MES/BI/carouselBoard/CarouselBoardDto.cs
@@ -0,0 +1,349 @@
+using MiniExcelLibs.Attributes;
+
+namespace ZR.Model.mes.carouselBoard
+{
+
+ ///
+ /// 查询内容
+ ///
+ public class CarouselBoardQuery
+ {
+ public string Text { get; set; } = string.Empty;
+ public string SubText { get; set; } = string.Empty;
+ }
+
+ ///
+ /// 工单大屏信息
+ ///
+ public class WorkOrderCarouseDto
+ {
+ ///
+ /// 工单号WO20240301001
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// 毛坯号
+ ///
+ public string BlankNumber { get; set; }
+
+ ///
+ /// 成品零件号
+ ///
+ public string FinishedPartNumber { get; set; }
+
+ ///
+ /// 产品描述
+ ///
+ public string ProductDescription { get; set; }
+
+ ///
+ /// 颜色
+ ///
+ public string Colour { get; set; }
+
+ ///
+ /// 规格
+ ///
+ public string Specifications { get; set; }
+
+ ///
+ /// 编码号
+ ///
+ public string CodeNumber { get; set; }
+
+ ///
+ /// 车数
+ ///
+ public int VehicleNumber { get; set; }
+
+ ///
+ /// 挂具摆放
+ ///
+ public int HangNumber { get; set; }
+
+ ///
+ /// 上件数
+ ///
+ public int PreviousNumber { get; set; }
+
+ ///
+ /// 双组号缸号
+ ///
+ public string CylinderNumber { get; set; }
+
+ ///
+ /// 备注1
+ ///
+ public string Remark1 { get; set; }
+
+ ///
+ /// 备注2
+ ///
+ public string Remark2 { get; set; }
+
+
+ ///
+ /// 备注3,识别是否需要工单
+ ///
+ public string Remark3 { get; set; }
+
+ ///
+ /// 备注4 :来源
+ ///
+ public string Remark4 { get; set; }
+
+ ///
+ /// 序号
+ ///
+ public int Sort { get; set; }
+
+ ///
+ /// 客户工单号
+ ///
+ public string ClientWorkorder { get; set; }
+ ///
+ /// 状态:0初态 1上线
+ ///
+ public int Status { get; set; }
+
+ ///
+ /// 年
+ ///
+ public int Year { get; set; }
+
+ ///
+ /// 周
+ ///
+ public int Week { get; set; }
+
+ ///
+ /// 日
+ ///
+ public int Date { get; set; }
+ }
+ ///
+ /// 质量大屏信息
+ ///
+ public class QualityStatisticsCarouseDto
+ {
+ ///
+ /// id
+ ///
+ public string Id { get; set; }
+ ///
+ /// 工单号
+ ///
+ public string WorkorderId { get; set; }
+ ///
+ /// 零件号
+ ///
+ public string FinishedPartNumber { get; set; }
+ ///
+ /// 描述
+ ///
+ public string ProductDescription { get; set; }
+
+ ///
+ /// 颜色
+ ///
+ public string Color { get; set; }
+ ///
+ /// 生产投入数
+ ///
+ public int? RequireNumber { get; set; }
+ ///
+ /// 班次
+ ///
+ public string Team { get; set; }
+ ///
+ /// 合格数
+ ///
+ public int? QualifiedNumber { get; set; }
+ ///
+ /// 合格率
+ ///
+ public decimal? QualifiedRate { get; set; }
+ ///
+ /// 抛光总数
+ ///
+ public int? PaoguangTotal { get; set; }
+ ///
+ /// 打磨总数
+ ///
+ public int? DamoTotal { get; set; }
+ ///
+ /// 报废总数
+ ///
+ public int? BaofeiTotal { get; set; }
+ ///
+ /// 开始时间
+ ///
+ public DateTime? StartTime { get; set; }
+ ///
+ /// 结束时间
+ ///
+ public DateTime? EndTime { get; set; }
+ ///
+ /// 备注(报废,打磨,抛光)
+ ///
+ public string Remark { get; set; }
+ ///
+ /// 备注(报废1,打磨2,抛光3)
+ ///
+ public int Remark2 { get; set; }
+ }
+ ///
+ /// 毛坯大屏信息
+ ///
+ public class BlankInventoryCarouseDto
+ {
+ ///
+ /// 主键
+ ///
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = false)]
+ public string Id { get; set; }
+
+ ///
+ /// 油漆id
+ ///
+ public string FkPaintId { get; set; }
+
+ ///
+ /// 毛坯号
+ ///
+ public string BlankNum { get; set; }
+ ///
+ /// 描述
+ ///
+ public string Description { get; set; }
+ ///
+ /// 颜色
+ ///
+ public string Color { get; set; }
+ ///
+ /// 规格
+ ///
+ public string Specification { get; set; }
+
+
+ ///
+ /// 库存数量
+ ///
+ public int? Quantity { get; set; }
+
+ ///
+ /// 最大库存
+ ///
+ public int? MaxNum { get; set; }
+
+ ///
+ /// 最小库存
+ ///
+ public int? MinNum { get; set; }
+
+ ///
+ /// 预警库存
+ ///
+ public int? WarnNum { get; set; }
+
+ ///
+ /// 类别
+ ///
+ public int? Type { get; set; }
+
+ ///
+ /// 状态
+ ///
+ public int? Status { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remark { get; set; }
+
+
+ }
+
+ ///
+ /// 设备报警大屏信息
+ ///
+ public class DeviceAlarmCarouseDto
+ {
+ ///
+ /// 编号
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// 报警类别
+ ///
+ public string AlarmType { get; set; }
+
+ ///
+ /// 报警内容
+ ///
+ public string AlarmContent { get; set; }
+
+ ///
+ /// 报警时间
+ ///
+ public DateTime? AlarmTime { get; set; }
+
+ ///
+ /// 处理状态
+ ///
+ public string HandleStatus { get; set; }
+ }
+
+ ///
+ /// 设备实时状态
+ ///
+ public class DeviceLiveCarouseDto
+ {
+ ///
+ /// 底漆循环温度
+ ///
+ public string PrimerCycleTemperature { get; set; }
+
+ ///
+ /// 底漆循环湿度
+ ///
+ public string PrimerCycleHumidity { get; set; }
+
+ ///
+ /// 色漆循环温度
+ ///
+ public string ColorCycleTemperature { get; set; }
+
+ ///
+ /// 色漆循环湿度
+ ///
+ public string ColorCycleHumidity { get; set; }
+
+ ///
+ /// 清漆循环温度
+ ///
+ public string ClearCycleTemperature { get; set; }
+
+ ///
+ /// 清漆循环湿度
+ ///
+ public string ClearCycleHumidity { get; set; }
+
+ ///
+ /// 纯水电导率
+ ///
+ public string PureWaterConductivity { get; set; }
+
+ ///
+ /// 水份烘干温度
+ ///
+ public string MoistureDryingTemperature { get; set; }
+
+ ///
+ /// 清漆烘干温度
+ ///
+ public string ClearDryingTemperature { get; set; }
+ }
+}
diff --git a/ZR.Model/MES/Device/DeviceAlarmLog.cs b/ZR.Model/MES/Device/DeviceAlarmLog.cs
new file mode 100644
index 00000000..3188159f
--- /dev/null
+++ b/ZR.Model/MES/Device/DeviceAlarmLog.cs
@@ -0,0 +1,91 @@
+
+namespace ZR.Model.Business
+{
+ ///
+ /// 设备报警日志表
+ ///
+ [SugarTable("device_alarm_log")]
+ public class DeviceAlarmLog
+ {
+ ///
+ /// 主键ID
+ ///
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+
+ ///
+ /// 编号
+ ///
+ [SugarColumn(ColumnName = "alarm_no")]
+ public string AlarmNo { get; set; }
+
+ ///
+ /// 时间
+ ///
+ [SugarColumn(ColumnName = "alarm_time")]
+ public DateTime? AlarmTime { get; set; }
+
+ ///
+ /// 区域
+ ///
+ public string Area { get; set; }
+
+ ///
+ /// 消息文本
+ ///
+ [SugarColumn(ColumnName = "message_text")]
+ public string MessageText { get; set; }
+
+ ///
+ /// 错误点
+ ///
+ [SugarColumn(ColumnName = "error_point")]
+ public string ErrorPoint { get; set; }
+
+ ///
+ /// 状态
+ ///
+ public string Status { get; set; }
+
+ ///
+ /// 优先级
+ ///
+ public string Priority { get; set; }
+
+ ///
+ /// 持续时间(秒)
+ ///
+ public int? Duration { get; set; }
+
+ ///
+ /// 报警回路
+ ///
+ [SugarColumn(ColumnName = "alarm_circuit")]
+ public string AlarmCircuit { get; set; }
+
+ ///
+ /// 确认状态
+ ///
+ [SugarColumn(ColumnName = "confirm_status")]
+ public string ConfirmStatus { get; set; }
+
+ ///
+ /// 消息类型
+ ///
+ [SugarColumn(ColumnName = "message_type")]
+ public string MessageType { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ [SugarColumn(ColumnName = "create_time")]
+ public DateTime? CreateTime { get; set; }
+
+ ///
+ /// 更新时间
+ ///
+ [SugarColumn(ColumnName = "update_time")]
+ public DateTime? UpdateTime { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Model/MES/qc/QcQualityStatisticsFirst.cs b/ZR.Model/MES/qc/QcQualityStatisticsFirst.cs
index e37bc481..12b27235 100644
--- a/ZR.Model/MES/qc/QcQualityStatisticsFirst.cs
+++ b/ZR.Model/MES/qc/QcQualityStatisticsFirst.cs
@@ -80,20 +80,17 @@
[SugarColumn(ColumnName = "end_time")]
public DateTime? EndTime { get; set; }
///
- /// 备注(报废,打磨,抛光)
+ /// 备注(抛光,打磨,报废)
///
[SugarColumn(ColumnName = "remark")]
public string Remark { get; set; }
///
- /// 备注(报废1,打磨2,抛光3)
+ /// 备注(抛光1,打磨2,报废3)
///
[SugarColumn(ColumnName = "remark2")]
public int Remark2 { get; set; }
-
-
-
///
/// 油漆-缩孔
///
diff --git a/ZR.Service/mes/BI/carouselBoard/CarouselBoardService.cs b/ZR.Service/mes/BI/carouselBoard/CarouselBoardService.cs
new file mode 100644
index 00000000..0fd57802
--- /dev/null
+++ b/ZR.Service/mes/BI/carouselBoard/CarouselBoardService.cs
@@ -0,0 +1,209 @@
+using Aliyun.OSS;
+using Infrastructure.Attribute;
+using SqlSugar;
+using System;
+using System.Data;
+using System.Globalization;
+using System.Linq;
+using ZR.Model.mes.carouselBoard;
+using ZR.Model.mes.echarts;
+using ZR.Model.MES.pro;
+using ZR.Model.MES.qc;
+using ZR.Model.MES.wms.Dto;
+using ZR.Model.MES.wms;
+using ZR.Service.MES.carouselBoard.IService;
+using ZR.Service.MES.echarts.IService;
+using ZR.Model.Business;
+using ZR.Model.dc;
+
+namespace ZR.Service.MES.carouselBoard
+{
+ [AppService(ServiceType = typeof(ICarouselBoardService), ServiceLifetime = LifeTime.Transient)]
+ public class CarouselBoardService : BaseService, ICarouselBoardService
+ {
+ public List GetBlankInventoryCarouselBoardData(CarouselBoardQuery query)
+ {
+ // 构建查询条件
+ var predicate = Expressionable
+ .Create()
+ .And(it => it.Type == 1)
+ .ToExpression();
+
+ // 获取所有符合条件的毛坯库存记录,并按更新时间降序排列
+ var inventoryList = Context.Queryable()
+ .Where(predicate)
+ .OrderByDescending(it => it.UpdatedTime)
+ .ToList();
+
+ // 去重:获取所有唯一的毛坯号列表
+ var uniqueBlankNums = inventoryList
+ .GroupBy(it => it.BlankNum)
+ .Select(group => group.First())
+ .ToList();
+
+ // 构建返回结果
+ var response = new List();
+ foreach (var inventory in uniqueBlankNums)
+ {
+ var dto = new BlankInventoryCarouseDto
+ {
+ Id = inventory.Id, // 主键
+ FkPaintId = inventory.FkPaintId, // 油漆id
+ BlankNum = inventory.BlankNum, // 毛坯号
+ Quantity = inventory.Quantity, // 库存数量
+ MaxNum = inventory.MaxNum, // 最大库存
+ MinNum = inventory.MinNum, // 最小库存
+ WarnNum = inventory.WarnNum, // 预警库存
+ Type = inventory.Type, // 类别
+ Status = inventory.Status, // 状态
+ Remark = inventory.Remark // 备注
+ };
+
+ // 直接查询当前毛坯号对应的物料信息(不使用字典缓存)
+ var material = Context.Queryable()
+ .Where(m => m.BlankNum == inventory.BlankNum && m.Type == 2 && m.Status == 1)
+ .First();
+
+ if (material != null)
+ {
+ dto.Description = !string.IsNullOrEmpty(material.Description)
+ ? material.Description
+ : material.ProductName;
+ dto.Color = material.Color;
+ dto.Specification = material.Specification;
+ }
+ else
+ {
+ dto.Description = "此毛坯号不在物料清单内!";
+ }
+
+ response.Add(dto);
+ }
+
+ return response;
+ }
+
+ public List GetEquipmentAlarmCarouselBoardData(CarouselBoardQuery query)
+ {
+ List result = Context.Queryable()
+ .OrderByDescending(it => it.CreateTime)
+ .Select(it => new DeviceAlarmCarouseDto
+ {
+ Id = it.AlarmNo,
+ AlarmType = it.AlarmCircuit,
+ AlarmContent = it.MessageText,
+ AlarmTime = it.AlarmTime,
+ HandleStatus = it.Status
+ })
+ .ToList();
+ return result;
+ }
+
+ public DeviceLiveCarouseDto GetEquipmentLiveCarouselBoardData(CarouselBoardQuery query)
+ {
+ DeviceLiveCarouseDto result = Context.Queryable()
+ .OrderByDescending(it => it.CollectionTime)
+ .Select(it => new DeviceLiveCarouseDto
+ {
+ PrimerCycleTemperature = it.Value01,
+ PrimerCycleHumidity = it.Value02,
+ ColorCycleTemperature = it.Value03,
+ ColorCycleHumidity = it.Value04,
+ ClearCycleTemperature = it.Value05,
+ ClearCycleHumidity = it.Value06,
+ PureWaterConductivity = it.Value07,
+ MoistureDryingTemperature = it.Value08,
+ ClearDryingTemperature = it.Value09
+ })
+ .First();
+ return result;
+ }
+
+ public List GetQualityStatisticsCarouselBoardData(CarouselBoardQuery query)
+ {
+ // 获取今日日期
+ DateTime today = DateTime.Today;
+ DateTime tomorrow = today.AddDays(1);
+
+ List qualityStatistics = Context
+ .Queryable()
+ .Where(it => it.Remark2 == 1) // 只获取有效的记录
+ .Where(it => it.StartTime >= today && it.StartTime < tomorrow) // 筛选今日内的数据
+ .Select(it => new QualityStatisticsCarouseDto
+ {
+ Id = it.Id, // id
+ WorkorderId = it.WorkorderId, // 工单号
+ FinishedPartNumber = it.FinishedPartNumber, // 零件号
+ ProductDescription = it.ProductDescription, // 描述
+ Color = it.Color, // 颜色
+ RequireNumber = it.RequireNumber, // 生产投入数
+ Team = it.Team, // 班次
+ QualifiedNumber = it.QualifiedNumber, // 合格数
+ QualifiedRate = it.QualifiedRate, // 合格率
+ PaoguangTotal = it.PaoguangTotal, // 抛光总数
+ DamoTotal = it.DamoTotal, // 打磨总数
+ BaofeiTotal = it.BaofeiTotal, // 报废总数
+ StartTime = it.StartTime,
+ EndTime = it.EndTime,
+ })
+ .ToList();
+ return qualityStatistics;
+ }
+
+ public List GetWorkOrderCarouselBoardData(CarouselBoardQuery query)
+ {
+ // 获取当前日期信息
+ DateTime now = DateTime.Now;
+ int currentYear = now.Year;
+
+ // 计算当前是本年的第几周(周一为一周的开始)
+ int currentWeek = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(
+ now,
+ CalendarWeekRule.FirstFourDayWeek,
+ DayOfWeek.Monday
+ );
+
+ // 计算当前是星期几(1-7,周一=1,周日=7)
+ int currentDay = (int)now.DayOfWeek;
+ if (currentDay == 0) // 如果是周日
+ {
+ currentDay = 7;
+ }
+
+ List workorders = Context
+ .Queryable()
+ .Where(it => it.Remark3 == "是") // 只获取有效的工单
+ .Where(it => it.Status == 1) // 只获取状态为1的工单
+ .Where(it => it.Year == currentYear) // 筛选当前年份
+ .Where(it => it.Week == currentWeek) // 筛选当前周
+ .Where(it => it.Date == currentDay) // 筛选当前日
+ .OrderBy(it => it.Sort) // 按序号排序
+ .Select(it => new WorkOrderCarouseDto
+ {
+ Id = it.Id, // 工单号
+ BlankNumber = it.BlankNumber, // 毛坯号
+ FinishedPartNumber = it.FinishedPartNumber, // 成品零件号
+ ProductDescription = it.ProductDescription, // 产品描述
+ Colour = it.Colour, // 颜色
+ Specifications = it.Specifications, // 规格
+ CodeNumber = it.CodeNumber, // 编码号
+ VehicleNumber = it.VehicleNumber, // 车数
+ PreviousNumber = it.PreviousNumber, // 上件数
+ CylinderNumber = it.CylinderNumber, // 双组号缸号
+ Remark1 = it.Remark1, // 备注1
+ Remark2 = it.Remark2, // 备注2
+ Remark3 = it.Remark3, // 备注3
+ Remark4 = it.Remark4, // 备注4
+ Sort = it.Sort, // 序号
+ ClientWorkorder = it.ClientWorkorder, // 客户工单号
+ Status = it.Status, // 状态
+ Year = it.Year, // 年
+ Week = it.Week, // 周
+ Date = it.Date // 日
+ })
+ .ToList();
+
+ return workorders;
+ }
+ }
+}
diff --git a/ZR.Service/mes/BI/carouselBoard/IService/ICarouselBoardService.cs b/ZR.Service/mes/BI/carouselBoard/IService/ICarouselBoardService.cs
new file mode 100644
index 00000000..4b6e9560
--- /dev/null
+++ b/ZR.Service/mes/BI/carouselBoard/IService/ICarouselBoardService.cs
@@ -0,0 +1,39 @@
+using ZR.Model.mes.carouselBoard;
+
+namespace ZR.Service.MES.carouselBoard.IService
+{
+ public interface ICarouselBoardService
+ {
+ ///
+ /// 获取质量大屏轮播数据
+ ///
+ ///
+ List GetQualityStatisticsCarouselBoardData(CarouselBoardQuery query);
+
+ ///
+ /// 获取生产大屏轮播数据
+ ///
+ ///
+ List GetWorkOrderCarouselBoardData(CarouselBoardQuery query);
+
+
+ ///
+ /// 获取毛坯大屏轮播数据
+ ///
+ ///
+ List GetBlankInventoryCarouselBoardData(CarouselBoardQuery query);
+
+
+ ///
+ /// 获取设备报警信息大屏轮播数据
+ ///
+ ///
+ List GetEquipmentAlarmCarouselBoardData(CarouselBoardQuery query);
+
+ ///
+ /// 获取设备实时参数信息大屏轮播数据
+ ///
+ ///
+ DeviceLiveCarouseDto GetEquipmentLiveCarouselBoardData(CarouselBoardQuery query);
+ }
+}