diff --git a/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12ServiceStatisticsController.cs b/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12ServiceStatisticsController.cs index 675e6cb7..1352b0c3 100644 --- a/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12ServiceStatisticsController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12ServiceStatisticsController.cs @@ -1,9 +1,9 @@ using Microsoft.AspNetCore.Mvc; -using ZR.Model.Dto; -using ZR.Model.Business; -using ZR.Service.Business.IBusinessService; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; +using ZR.Model.Business; +using ZR.Model.Dto; +using ZR.Service.Business.IBusinessService; //创建时间:2025-01-02 namespace ZR.Admin.WebApi.Controllers @@ -20,7 +20,9 @@ namespace ZR.Admin.WebApi.Controllers /// private readonly IQcGp12ServiceStatisticsService _QcGp12ServiceStatisticsService; - public QcGp12ServiceStatisticsController(IQcGp12ServiceStatisticsService QcGp12ServiceStatisticsService) + public QcGp12ServiceStatisticsController( + IQcGp12ServiceStatisticsService QcGp12ServiceStatisticsService + ) { _QcGp12ServiceStatisticsService = QcGp12ServiceStatisticsService; } @@ -32,12 +34,83 @@ namespace ZR.Admin.WebApi.Controllers /// [HttpGet("list")] [ActionPermissionFilter(Permission = "business:qcgp12servicestatistics:list")] - public IActionResult QueryQcGp12ServiceStatistics([FromQuery] QcGp12ServiceStatisticsQueryDto parm) + public IActionResult QueryQcGp12ServiceStatistics( + [FromQuery] QcGp12ServiceStatisticsQueryDto parm + ) { var response = _QcGp12ServiceStatisticsService.GetList(parm); return SUCCESS(response); } + /// + /// 查询质量GP12统计报表业务模块列表 + /// + /// + /// + [HttpPost("GetReviseList")] + [AllowAnonymous] + public IActionResult GetReviseList([FromBody] QcGp12ServiceStatisticsQueryDto parm) + { + var response = _QcGp12ServiceStatisticsService.GetReviseList(parm); + + // 初始化统计数据 + int totalRequireNumber = 0; + int totalQualifiedNumber = 0; + int totalPolishNumber = 0; + int totalDamoNumber = 0; + int totalBaofeiNumber = 0; + int totalListCount = 0; + + // 将动态属性转换为字典并合并到主对象中,并计算统计数据 + var resultWithDefects = response + .Select(item => + { + var itemDict = new Dictionary(); + foreach (var prop in typeof(QcGp12ServiceStatisticsDto).GetProperties()) + { + itemDict[prop.Name] = prop.GetValue(item); + } + + // 添加动态属性 + foreach (var dynamicProp in item.DynamicProperties) + { + itemDict[dynamicProp.Key] = dynamicProp.Value; + } + + // 累加统计数据 + totalRequireNumber += Convert.ToInt32(item.RequireNumber); + totalQualifiedNumber += Convert.ToInt32(item.QualifiedNumber); + totalPolishNumber += Convert.ToInt32(item.PolishNumber); + totalDamoNumber += Convert.ToInt32(item.DamoNumber); + totalBaofeiNumber += Convert.ToInt32(item.BaofeiNumber); + totalListCount += 1; + return itemDict; + }) + .ToList(); + + // 计算合格率 + double qualifiedRate = + totalRequireNumber > 0 + ? (double)totalQualifiedNumber / totalRequireNumber * 150 + : 0; + totalListCount = totalListCount / 3; + // 创建统计数据字典 + var statistics = new Dictionary + { + { "TotalRequireNumber", totalRequireNumber }, + { "TotalQualifiedNumber", totalQualifiedNumber }, + { "QualifiedRate", $"{qualifiedRate:F2}%" }, + { "TotalPolishNumber", totalPolishNumber }, + { "TotalDamoNumber", totalDamoNumber }, + { "TotalBaofeiNumber", totalBaofeiNumber }, + { "TotalListCount", totalListCount } + }; + + // 返回包含数据和统计数据的对象 + var result = new { list = resultWithDefects, statistics = statistics }; + + return SUCCESS(result); + } /// /// 查询质量GP12统计报表业务模块详情 @@ -49,7 +122,7 @@ namespace ZR.Admin.WebApi.Controllers public IActionResult GetQcGp12ServiceStatistics(string Id) { var response = _QcGp12ServiceStatisticsService.GetInfo(Id); - + var info = response.Adapt(); return SUCCESS(info); } @@ -77,7 +150,9 @@ namespace ZR.Admin.WebApi.Controllers [HttpPut] [ActionPermissionFilter(Permission = "business:qcgp12servicestatistics:edit")] [Log(Title = "质量GP12统计报表业务模块", BusinessType = BusinessType.UPDATE)] - public IActionResult UpdateQcGp12ServiceStatistics([FromBody] QcGp12ServiceStatisticsDto parm) + public IActionResult UpdateQcGp12ServiceStatistics( + [FromBody] QcGp12ServiceStatisticsDto parm + ) { var modal = parm.Adapt().ToUpdate(HttpContext); var response = _QcGp12ServiceStatisticsService.UpdateQcGp12ServiceStatistics(modal); @@ -95,15 +170,14 @@ namespace ZR.Admin.WebApi.Controllers public IActionResult DeleteQcGp12ServiceStatistics(string ids) { int[] idsArr = Tools.SpitIntArrary(ids); - if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } + if (idsArr.Length <= 0) + { + return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); + } var response = _QcGp12ServiceStatisticsService.Delete(idsArr); return ToResponse(response); } - - - - } -} \ No newline at end of file +} diff --git a/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs b/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs index fadad186..60fee99a 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs @@ -1,12 +1,41 @@ using System.ComponentModel.DataAnnotations; +using ZR.Model.Business; namespace ZR.Model.Dto { /// /// 质量GP12统计报表业务模块查询对象 /// - public class QcGp12ServiceStatisticsQueryDto : PagerInfo + public class QcGp12ServiceStatisticsQueryDto : PagerInfo { + public string WorkOrder { get; set; } + + public string PartNumber { get; set; } + + public string Description { get; set; } + + public string Team { get; set; } + + public string SiteNo { get; set; } + + public string ComNo { get; set; } + + /// + /// 查询排序字段(1-工单号 2-零件号 3-合格率 4-开始时间) + /// + public int StatisticsOrderType { get; set; } + + public int? IsOnetime { get; set; } + + public int? IsBack { get; set; } + + public int? IsPolish { get; set; } + + public int? IsOut { get; set; } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } } /// @@ -14,7 +43,6 @@ namespace ZR.Model.Dto /// public class QcGp12ServiceStatisticsDto { - [Required(ErrorMessage = "序号不能为空")] public string Id { get; set; } public string WorkOrder { get; set; } @@ -79,7 +107,18 @@ namespace ZR.Model.Dto public DateTime? UpdatedTime { get; set; } - - + // 动态属性存储 + public Dictionary DynamicProperties { get; set; } = new Dictionary(); } -} \ No newline at end of file + + public static class QcGp12ServiceStatisticsDtoExtensions + { + public static void AddDynamicProperty(this QcGp12ServiceStatisticsDto dto, string propertyName, object value) + { + if (!dto.DynamicProperties.ContainsKey(propertyName)) + { + dto.DynamicProperties[propertyName] = value; + } + } + } +} diff --git a/ZR.Service/mes/qc/IService/IQcGp12ServiceStatisticsService.cs b/ZR.Service/mes/qc/IService/IQcGp12ServiceStatisticsService.cs index 1e2276c3..7ee83ac5 100644 --- a/ZR.Service/mes/qc/IService/IQcGp12ServiceStatisticsService.cs +++ b/ZR.Service/mes/qc/IService/IQcGp12ServiceStatisticsService.cs @@ -11,8 +11,20 @@ namespace ZR.Service.Business.IBusinessService /// public interface IQcGp12ServiceStatisticsService : IBaseService { + /// + /// 获取原始数据 + /// + /// + /// PagedInfo GetList(QcGp12ServiceStatisticsQueryDto parm); + /// + /// 获取修正格式后的列表数据 + /// + /// + /// + List GetReviseList(QcGp12ServiceStatisticsQueryDto parm); + QcGp12ServiceStatistics GetInfo(string Id); QcGp12ServiceStatistics AddQcGp12ServiceStatistics(QcGp12ServiceStatistics parm); diff --git a/ZR.Service/mes/qc/QcGp12Service.cs b/ZR.Service/mes/qc/QcGp12Service.cs index 59dfd251..18965b51 100644 --- a/ZR.Service/mes/qc/QcGp12Service.cs +++ b/ZR.Service/mes/qc/QcGp12Service.cs @@ -75,10 +75,10 @@ namespace ZR.Service.Business return labelAnalysisDto; } - // 零件号解析 + // 标签的零件号解析 public string DoAnalyzePartnumber(string label) { - // 外箱标签零件号抓取 + // 标签零件号抓取 var predicate = Expressionable .Create() .And(it => it.Code == "PartNumber") @@ -104,11 +104,11 @@ namespace ZR.Service.Business return ""; } - // 数量解析 + // 标签的数量解析 public int DoAnalyzeQuantity(string label) { int result = 0; - // 外箱标签零件号抓取 + // 标签零件号抓取 var predicate = Expressionable .Create() .And(it => it.Code == "Quantity") diff --git a/ZR.Service/mes/qc/QcGp12ServiceStatisticsService.cs b/ZR.Service/mes/qc/QcGp12ServiceStatisticsService.cs index 7440b4a3..9c9e2127 100644 --- a/ZR.Service/mes/qc/QcGp12ServiceStatisticsService.cs +++ b/ZR.Service/mes/qc/QcGp12ServiceStatisticsService.cs @@ -1,21 +1,27 @@ using System; -using SqlSugar; +using System.Linq; using Infrastructure.Attribute; using Infrastructure.Extensions; +using Newtonsoft.Json; +using SqlSugar; using ZR.Model; -using ZR.Model.Dto; using ZR.Model.Business; +using ZR.Model.Dto; using ZR.Repository; using ZR.Service.Business.IBusinessService; -using System.Linq; namespace ZR.Service.Business { /// /// 质量GP12统计报表业务模块Service业务层处理 /// - [AppService(ServiceType = typeof(IQcGp12ServiceStatisticsService), ServiceLifetime = LifeTime.Transient)] - public class QcGp12ServiceStatisticsService : BaseService, IQcGp12ServiceStatisticsService + [AppService( + ServiceType = typeof(IQcGp12ServiceStatisticsService), + ServiceLifetime = LifeTime.Transient + )] + public class QcGp12ServiceStatisticsService + : BaseService, + IQcGp12ServiceStatisticsService { /// /// 查询质量GP12统计报表业务模块列表 @@ -33,7 +39,6 @@ namespace ZR.Service.Business return response; } - /// /// 获取详情 /// @@ -41,9 +46,7 @@ namespace ZR.Service.Business /// public QcGp12ServiceStatistics GetInfo(string Id) { - var response = Queryable() - .Where(x => x.Id == Id) - .First(); + var response = Queryable().Where(x => x.Id == Id).First(); return response; } @@ -102,5 +105,112 @@ namespace ZR.Service.Business return Update(model, true); } + public List GetReviseList(QcGp12ServiceStatisticsQueryDto parm) + { + var predicate = Expressionable + .Create() + .AndIF( + !string.IsNullOrEmpty(parm.WorkOrder), + x => x.WorkOrder.Contains(parm.WorkOrder) + ) + .AndIF( + !string.IsNullOrEmpty(parm.PartNumber), + x => x.PartNumber.Contains(parm.PartNumber) + ) + .AndIF( + !string.IsNullOrEmpty(parm.Description), + x => x.Description.Contains(parm.Description) + ) + .AndIF(!string.IsNullOrEmpty(parm.Team), x => x.Team == parm.Team) + .AndIF(!string.IsNullOrEmpty(parm.SiteNo), x => x.SiteNo == parm.SiteNo) + .AndIF(!string.IsNullOrEmpty(parm.ComNo), x => x.ComNo == parm.ComNo) + .AndIF(parm.IsOnetime.HasValue, x => x.IsOnetime == parm.IsOnetime.Value) + .AndIF(parm.IsBack.HasValue, x => x.IsBack == parm.IsBack.Value) + .AndIF(parm.IsPolish.HasValue, x => x.IsPolish == parm.IsPolish.Value) + .AndIF(parm.IsOut.HasValue, x => x.IsOut == parm.IsOut.Value) + .AndIF( + parm.StartTime.HasValue && parm.EndTime.HasValue, + x => x.StartTime >= parm.StartTime.Value && x.StartTime <= parm.EndTime.Value + ) + .And(x => x.Status == "1") + .ToExpression(); + var query = Context.Queryable().Where(predicate); + var result = query + .OrderByIF(parm.StatisticsOrderType == 1, it => it.WorkOrder) + .OrderByIF(parm.StatisticsOrderType == 2, it => it.PartNumber) + .OrderByIF(parm.StatisticsOrderType == 3, it => it.QualifiedRate, OrderByType.Desc) + .OrderByIF(parm.StatisticsOrderType == 4, it => it.StartTime) + .OrderBy(it => it.GroupCode) + .OrderBy(it => it.GroupSort) + .ToList(); + List defectList = Context.Queryable().ToList(); + var resultList = new List(); + foreach (var item in result) + { + var dto = new QcGp12ServiceStatisticsDto + { + Id = item.Id, + WorkOrder = item.WorkOrder, + PartNumber = item.PartNumber, + Description = item.Description, + Specification = item.Specification, + Color = item.Color, + Team = item.Team, + SiteNo = item.SiteNo, + ComNo = item.ComNo, + IsOnetime = item.IsOnetime, + IsBack = item.IsBack, + IsPolish = item.IsPolish, + IsOut = item.IsOut, + StartTime = item.StartTime, + EndTime = item.EndTime, + Label = item.Label, + RequireNumber = item.RequireNumber, + QualifiedNumber = item.QualifiedNumber, + QualifiedRate = item.QualifiedRate, + PolishNumber = item.PolishNumber, + DamoNumber = item.DamoNumber, + BaofeiNumber = item.BaofeiNumber, + GroupCode = item.GroupCode, + GroupSort = item.GroupSort, + GroupDefectJson = item.GroupDefectJson, + Type = item.Type, + Status = item.Status, + Remark = item.Remark, + CreatedBy = item.CreatedBy, + CreatedTime = item.CreatedTime, + UpdatedBy = item.UpdatedBy, + UpdatedTime = item.UpdatedTime + }; + // 解析 GroupDefectJson + if (!string.IsNullOrEmpty(item.GroupDefectJson)) + { + try + { + var defects = JsonConvert.DeserializeObject< + List + >(item.GroupDefectJson); + foreach (var defect in defects) + { + var baseDefect = defectList.FirstOrDefault(d => + d.Code == defect.DefectCode + ); + if (baseDefect != null) + { + var propertyName = $"{defect.DefectCode}"; + dto.AddDynamicProperty(propertyName, defect.DefectNum); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"Error parsing GroupDefectJson: {ex.Message}"); + } + } + resultList.Add(dto); + } + + return resultList; + } } -} \ No newline at end of file +}