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); + } +}