using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Furion.JsonSerialization; using iWare.Wms.Core; using iWare.Wms.Core.Util; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Internal; using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Text; using System.Web; namespace iWare.Wms.Application { /// /// 质量数据查询服务 /// [ApiDescriptionSettings("数据查询服务", Name = "QualityDataInfo", Order = 100)] [Route("api/[Controller]")] public class QualityDataInfoService : IQualityDataInfoService, IDynamicApiController, ITransient { private readonly IRepository _qualityDataInfoRep; private readonly IRepository _equipmentBaseInfoRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly IRepository _accessInterfaceLogRep; /// /// 质量数据查询构造 /// /// /// /// /// public QualityDataInfoService( IRepository qualityDataInfoRep, IRepository equipmentBaseInfoRep, IRepository sysDictTypeRep, IRepository sysDictDataRep, IRepository accessInterfaceLogRep) { _qualityDataInfoRep = qualityDataInfoRep; _equipmentBaseInfoRep = equipmentBaseInfoRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysDictDataRep = sysDictDataRep; _accessInterfaceLogRep = accessInterfaceLogRep; } /// /// 根据质量ID获取SPC质量信息 /// /// /// [HttpGet("GetQualityInfoSPCForID")] public async Task GetQualityInfoSPCForID([FromQuery] QualityDataInfoSearch2 input) { var interfaceLog = _accessInterfaceLogRep.DetachedEntities.Where(o => o.Id == input.QualityDataInfoID).FirstOrDefault(); if (interfaceLog == null || interfaceLog.Id < 1) {//没有查询到 throw Oops.Oh($"当前工件{input.WorkPieceID ?? ""}没有SPC反馈信息!"); } var output = JsonConvert.DeserializeObject(interfaceLog.ParaJSON); return output; } /// /// 根据质量ID获取质量信息 /// /// /// [HttpGet("GetQualityInfoForID")] public async Task GetQualityInfoForID([FromQuery] QualityDataInfoSearch2 input) { QualityDataInfoOutput qualityDataInfo = new QualityDataInfoOutput(); if (input == null || string.IsNullOrEmpty(input.OperationType)) { throw Oops.Oh("传参异常!"); } if (input.OperationType.Equals("SPC")) { } else { qualityDataInfo = await _qualityDataInfoRep.DetachedEntities .Join(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, b) => new { a, b }) //.Join(_sysDictDataRep.DetachedEntities, e => e.a.QualityState.ToString(), f => f.Code, (e, f) => new { e, f }) //.Join(_sysDictTypeRep.DetachedEntities, g => g.f.TypeId, h => h.Id, (f, g) => new { f, g }) //.Where(x => (x.g.Code.Equals("quality_state"))) .Where(input.WorkPieceID != null, w => w.a.WorkPieceID.Equals(input.WorkPieceID)) .Select(m => new QualityDataInfoOutput { Id = m.a.Id, WorkPieceID = m.a.WorkPieceID, EquipmentName = m.b.EquipmentName, WorkingProcedure = m.a.WorkingProcedure, QualityState = m.a.QualityState, //QualityStateName = m.f.f.Value, QualityStateUpdateMode = m.a.QualityStateUpdateMode, QualityStateUpdateUser = m.a.QualityStateUpdateUser, QualityReceiveTime = m.a.QualityReceiveTime, OfflineTime = m.a.OfflineTime, QualityOP10To1 = m.a.QualityOP10To1, QualityOP40To1 = m.a.QualityOP40To1, QualityOP20To1 = m.a.QualityOP20To1, QualityOP30To1 = m.a.QualityOP30To1, QualityOP30To2 = m.a.QualityOP30To2, QualityOP30To3 = m.a.QualityOP30To3, QualityOP30To4 = m.a.QualityOP30To4, QualityOP30To5 = m.a.QualityOP30To5, QualityOP30To6 = m.a.QualityOP30To6, QualityOP30To7 = m.a.QualityOP30To7, QualityOP30To8 = m.a.QualityOP30To8, QualityOP30To9 = m.a.QualityOP30To9, QualityOP30To10 = m.a.QualityOP30To10, QualityOP30To11 = m.a.QualityOP30To11, QualityOP35To1 = m.a.QualityOP35To1, QualityOP35To2 = m.a.QualityOP35To2, QualityOP60To1 = m.a.QualityOP60To1, QualityOP60To2 = m.a.QualityOP60To2, QualityOP70To1 = m.a.QualityOP70To1, QualityOP70To2 = m.a.QualityOP70To2, QualityOP70To3 = m.a.QualityOP70To3, QualityOP80To1 = m.a.QualityOP80To1, QualityOP80To2 = m.a.QualityOP80To2, QualityOP80To3 = m.a.QualityOP80To3, QualityOP80To4 = m.a.QualityOP80To4, QualityOP80To5 = m.a.QualityOP80To5, QualityOP80To6 = m.a.QualityOP80To6, QualityOP80To7 = m.a.QualityOP80To7, QualityOP80To8 = m.a.QualityOP80To8, QualityOP80To9 = m.a.QualityOP80To9, QualityOP80To10 = m.a.QualityOP80To10, Remarks = m.a.Remarks, }) //.OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .FirstOrDefaultAsync(); } return qualityDataInfo; } /// /// 分页查询质量数据查询 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] QualityDataInfoSearch input) { if (!input.StartTime.HasValue || !input.EndTime.HasValue || input.StartTime > input.EndTime) { throw Oops.Oh("传参异常:日期范围必须传值!"); } if (string.IsNullOrEmpty(input.EquipmentID)) { throw Oops.Oh("传参异常:设备编号必须传参!"); } //if (!string.IsNullOrEmpty(input.EquipmentID) && input.EquipmentID.Equals("EOP10") && string.IsNullOrEmpty(input.WorkingProcedure)) //{ // throw Oops.Oh("传参异常:工序必须传值!"); //} var qualityDataInfos = await _qualityDataInfoRep.DetachedEntities .Join(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, b) => new { a, b }) //.Where(o => o.a.CreatedTime.Value.Date >= input.StartTime.Value) //.Where(o => o.a.UpdatedTime.Value.Date <= input.EndTime.Value) .Where(!string.IsNullOrEmpty(input.WorkPieceID), w => w.a.WorkPieceID.Contains(input.WorkPieceID)) .Where(input.EquipmentID.Equals("EOP10") && string.IsNullOrEmpty(input.WorkingProcedure), o => (o.a.OP10QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP10QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP10QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP10QualityState)) || (o.a.OP40QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP40QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP40QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP40QualityState))) .Where(input.EquipmentID.Equals("EOP10") && !string.IsNullOrEmpty(input.WorkingProcedure) && input.WorkingProcedure.Equals("OP10"), o => (o.a.OP10QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP10QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP10QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP10QualityState))) .Where(input.EquipmentID.Equals("EOP10") && !string.IsNullOrEmpty(input.WorkingProcedure) && input.WorkingProcedure.Equals("OP40"), o => (o.a.OP40QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP40QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP40QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP40QualityState))) .Where(input.EquipmentID.Equals("EOP20"), o => o.a.OP20QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP20QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP20QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP20QualityState)) .Where(input.EquipmentID.Equals("EOP30"), o => o.a.OP30QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP30QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP30QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP30QualityState)) .Where(input.EquipmentID.Equals("EOP35"), o => o.a.OP35QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP35QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP35QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP35QualityState)) .Where(input.EquipmentID.Equals("EOP60"), o => o.a.OP60QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP60QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP60QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP60QualityState)) .Where(input.EquipmentID.Equals("EOP80"), o => o.a.OP80QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP80QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP80QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP80QualityState)) .Where(o => !string.IsNullOrEmpty(o.a.WorkPieceID)) .Select(m => new QualityDataInfoOutput { Id = m.a.Id, WorkPieceID = m.a.WorkPieceID, EquipmentID = input.EquipmentID, //EquipmentName = m.b.EquipmentName, WorkingProcedure = input.WorkingProcedure, QualityState = m.a.QualityState, //QualityStateName = m.a.f.f.Value, QualityStateUpdateMode = m.a.QualityStateUpdateMode, QualityStateUpdateUser = m.a.QualityStateUpdateUser, QualityReceiveTime = m.a.QualityReceiveTime, OfflineTime = m.a.OfflineTime, QualityOP10To1 = m.a.QualityOP10To1, QualityOP40To1 = m.a.QualityOP40To1, QualityOP20To1 = m.a.QualityOP20To1, QualityOP30To1 = m.a.QualityOP30To1, QualityOP30To2 = m.a.QualityOP30To2, QualityOP30To3 = m.a.QualityOP30To3, QualityOP30To4 = m.a.QualityOP30To4, QualityOP30To5 = m.a.QualityOP30To5, QualityOP30To6 = m.a.QualityOP30To6, QualityOP30To7 = m.a.QualityOP30To7, QualityOP30To8 = m.a.QualityOP30To8, QualityOP30To9 = m.a.QualityOP30To9, QualityOP30To10 = m.a.QualityOP30To10, QualityOP30To11 = m.a.QualityOP30To11, QualityOP35To1 = m.a.QualityOP35To1, QualityOP35To2 = m.a.QualityOP35To2, QualityOP60To1 = m.a.QualityOP60To1, QualityOP60To2 = m.a.QualityOP60To2, QualityOP70To1 = m.a.QualityOP70To1, QualityOP70To2 = m.a.QualityOP70To2, QualityOP70To3 = m.a.QualityOP70To3, QualityOP80To1 = m.a.QualityOP80To1, QualityOP80To2 = m.a.QualityOP80To2, QualityOP80To3 = m.a.QualityOP80To3, QualityOP80To4 = m.a.QualityOP80To4, QualityOP80To5 = m.a.QualityOP80To5, QualityOP80To6 = m.a.QualityOP80To6, QualityOP80To7 = m.a.QualityOP80To7, QualityOP80To8 = m.a.QualityOP80To8, QualityOP80To9 = m.a.QualityOP80To9, QualityOP80To10 = m.a.QualityOP80To10, OP10QualityReceiveTime = m.a.OP10QualityReceiveTime, OP20QualityReceiveTime = m.a.OP20QualityReceiveTime, OP30QualityReceiveTime = m.a.OP30QualityReceiveTime, OP35QualityReceiveTime = m.a.OP35QualityReceiveTime, OP40QualityReceiveTime = m.a.OP40QualityReceiveTime, OP60QualityReceiveTime = m.a.OP60QualityReceiveTime, OP80QualityReceiveTime = m.a.OP80QualityReceiveTime, OP10QualityState = m.a.OP10QualityState, OP20QualityState = m.a.OP20QualityState, OP30QualityState = m.a.OP30QualityState, OP40QualityState = m.a.OP40QualityState, OP35QualityState = m.a.OP35QualityState, OP60QualityState = m.a.OP60QualityState, OP80QualityState = m.a.OP80QualityState, OP30QualityStateCH3 = m.a.OP30QualityStateCH3, OP30QualityStateCH4 = m.a.OP30QualityStateCH4, OP30QualityStateCH5 = m.a.OP30QualityStateCH5, OP30QualityStateCH6 = m.a.OP30QualityStateCH6, Remarks = m.a.Remarks, UpdateTime = m.a.UpdatedTime, }) .ProjectToType() .OrderByDescending(o => o.UpdateTime) .ToADPagedListAsync(input.PageNo, input.PageSize); return qualityDataInfos; } /// /// 根据质量数据导出Excel /// /// 质量数据传入信息 /// 导出的Excel文件 [HttpGet("toExcel")] public async Task ToExcelAsync([FromQuery] QualityDataInfoSearch input) { if (!input.StartTime.HasValue || !input.EndTime.HasValue || input.StartTime > input.EndTime) { throw Oops.Oh("传参异常:日期范围必须传值!"); } if (string.IsNullOrEmpty(input.EquipmentID)) { throw Oops.Oh("传参异常:设备编号必须传参!"); } var qualityDataInfos = await _qualityDataInfoRep.DetachedEntities .Join(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, b) => new { a, b }) //.Where(o => o.a.CreatedTime.Value.Date >= input.StartTime.Value) //.Where(o => o.a.UpdatedTime.Value.Date <= input.EndTime.Value) .Where(!string.IsNullOrEmpty(input.WorkPieceID), w => w.a.WorkPieceID.Contains(input.WorkPieceID)) .Where(input.EquipmentID.Equals("EOP10") && string.IsNullOrEmpty(input.WorkingProcedure), o => (o.a.OP10QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP10QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP10QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP10QualityState)) || (o.a.OP40QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP40QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP40QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP40QualityState))) .Where(input.EquipmentID.Equals("EOP10") && !string.IsNullOrEmpty(input.WorkingProcedure) && input.WorkingProcedure.Equals("OP10"), o => (o.a.OP10QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP10QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP10QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP10QualityState))) .Where(input.EquipmentID.Equals("EOP10") && !string.IsNullOrEmpty(input.WorkingProcedure) && input.WorkingProcedure.Equals("OP40"), o => (o.a.OP40QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP40QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP40QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP40QualityState))) .Where(input.EquipmentID.Equals("EOP20"), o => o.a.OP20QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP20QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP20QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP20QualityState)) .Where(input.EquipmentID.Equals("EOP30"), o => o.a.OP30QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP30QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP30QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP30QualityState)) .Where(input.EquipmentID.Equals("EOP35"), o => o.a.OP35QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP35QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP35QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP35QualityState)) .Where(input.EquipmentID.Equals("EOP60"), o => o.a.OP60QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP60QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP60QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP60QualityState)) .Where(input.EquipmentID.Equals("EOP80"), o => o.a.OP80QualityReceiveTime.Value.Date >= input.StartTime.Value && o.a.OP80QualityReceiveTime.Value.Date <= input.EndTime.Value && o.a.OP80QualityState == (input.QualityState.HasValue ? input.QualityState.ToString() : o.a.OP80QualityState)) .Where(o => !string.IsNullOrEmpty(o.a.WorkPieceID)) .Select(m => new QualityDataInfoOutput { Id = m.a.Id, WorkPieceID = m.a.WorkPieceID, EquipmentID = input.EquipmentID, //EquipmentName = m.b.EquipmentName, WorkingProcedure = input.WorkingProcedure, QualityState = m.a.QualityState, //QualityStateName = m.a.f.f.Value, QualityStateUpdateMode = m.a.QualityStateUpdateMode, QualityStateUpdateUser = m.a.QualityStateUpdateUser, QualityReceiveTime = m.a.QualityReceiveTime, OfflineTime = m.a.OfflineTime, QualityOP10To1 = m.a.QualityOP10To1, QualityOP40To1 = m.a.QualityOP40To1, QualityOP20To1 = m.a.QualityOP20To1, QualityOP30To1 = m.a.QualityOP30To1, QualityOP30To2 = m.a.QualityOP30To2, QualityOP30To3 = m.a.QualityOP30To3, QualityOP30To4 = m.a.QualityOP30To4, QualityOP30To5 = m.a.QualityOP30To5, QualityOP30To6 = m.a.QualityOP30To6, QualityOP30To7 = m.a.QualityOP30To7, QualityOP30To8 = m.a.QualityOP30To8, QualityOP30To9 = m.a.QualityOP30To9, QualityOP30To10 = m.a.QualityOP30To10, QualityOP30To11 = m.a.QualityOP30To11, QualityOP35To1 = m.a.QualityOP35To1, QualityOP35To2 = m.a.QualityOP35To2, QualityOP60To1 = m.a.QualityOP60To1, QualityOP60To2 = m.a.QualityOP60To2, QualityOP70To1 = m.a.QualityOP70To1, QualityOP70To2 = m.a.QualityOP70To2, QualityOP70To3 = m.a.QualityOP70To3, QualityOP80To1 = m.a.QualityOP80To1, QualityOP80To2 = m.a.QualityOP80To2, QualityOP80To3 = m.a.QualityOP80To3, QualityOP80To4 = m.a.QualityOP80To4, QualityOP80To5 = m.a.QualityOP80To5, QualityOP80To6 = m.a.QualityOP80To6, QualityOP80To7 = m.a.QualityOP80To7, QualityOP80To8 = m.a.QualityOP80To8, QualityOP80To9 = m.a.QualityOP80To9, QualityOP80To10 = m.a.QualityOP80To10, OP10QualityReceiveTime = m.a.OP10QualityReceiveTime, OP20QualityReceiveTime = m.a.OP20QualityReceiveTime, OP30QualityReceiveTime = m.a.OP30QualityReceiveTime, OP35QualityReceiveTime = m.a.OP35QualityReceiveTime, OP40QualityReceiveTime = m.a.OP40QualityReceiveTime, OP60QualityReceiveTime = m.a.OP60QualityReceiveTime, OP80QualityReceiveTime = m.a.OP80QualityReceiveTime, OP10QualityState = m.a.OP10QualityState, OP20QualityState = m.a.OP20QualityState, OP30QualityState = m.a.OP30QualityState, OP40QualityState = m.a.OP40QualityState, OP35QualityState = m.a.OP35QualityState, OP60QualityState = m.a.OP60QualityState, OP80QualityState = m.a.OP80QualityState, Remarks = m.a.Remarks, UpdateTime = m.a.UpdatedTime, }) .ProjectToType() .OrderByDescending(o => o.UpdateTime) .ToListAsync() ; MemoryStream ms = new(); List headers = new List(); List> data = new List>(); string sheetName = ""; switch (input.EquipmentID) { case "EOP10": //var lstOP10 = EntityPropHelper.Mapper(qualityDataInfos); var lstOP10 = qualityDataInfos.Adapt>(); DataConvertUtil.ToExcelData(lstOP10, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; case "EOP20": var lstOP20 = qualityDataInfos.Adapt>(); DataConvertUtil.ToExcelData(lstOP20, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; case "EOP30": var lstOP30 = qualityDataInfos.Adapt>(); DataConvertUtil.ToExcelData(lstOP30, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; case "EOP35": var lstOP35 = qualityDataInfos.Adapt>(); DataConvertUtil.ToExcelData(lstOP35, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; case "EOP40": break; case "EOP60": var lstOP60 = qualityDataInfos.Adapt>(); DataConvertUtil.ToExcelData(lstOP60, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; case "EOP70": break; case "EOP80": var lstOP80 = qualityDataInfos.Adapt>(); DataConvertUtil.ToExcelData(lstOP80, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; default: DataConvertUtil.ToExcelData(qualityDataInfos, _sysDictTypeRep, _sysDictDataRep, out headers, out data, out sheetName); break; } ExcelUtil.ToExcel(headers, data, sheetName, ms); ms.Position = 0; var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName }; } } }