using DOAN.Model.MES.order; using Infrastructure.Attribute; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DOAN.Service.MES.SmartScreen.Order.IService; using DOAN.Model.MES.order.Dto; using MathNet.Numerics.Distributions; using NPOI.SS.Formula.Functions; using DOAN.Model.MES.SmartScreen.Order.Dto; using DOAN.Model.MES.product; using DOAN.Model.MES.base_; namespace DOAN.Service.MES.SmartScreen.Order { /// /// 采购订单Service业务层处理 /// [AppService(ServiceType = typeof(IOrderSmartService), ServiceLifetime = LifeTime.Transient)] public class OrderSmartService : BaseService, IOrderSmartService { public LargeScreenOrderDto GetLargeScreenOrder() { // 当前日期 DateTime now = DateTime.Now; // 当前月份的第一天 00:00:00 DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1); // 当前月份的最后一天 23:59:59 DateTime lastDayOfMonth = new DateTime(now.Year, now.Month, 1) .AddMonths(1) .AddSeconds(-1); var response = Queryable().ToList(); LargeScreenOrderDto largeScreenOrderDto = new LargeScreenOrderDto(); largeScreenOrderDto.OrderTotalNum = response.Count; largeScreenOrderDto.IncompleteOrderNum = response.Where(o=>o.Orderindicator!=1).Count(); largeScreenOrderDto.CompletedOrderNum = response.Where(o => o.Orderindicator == 1).Count(); largeScreenOrderDto.MonthOrderTotalNum = response.Where(o=>o.DeliveryDate>= firstDayOfMonth&&o.DeliveryDate <= lastDayOfMonth).Count(); largeScreenOrderDto.MonthIncompleteOrderNum = response.Where(o => o.DeliveryDate >= firstDayOfMonth && o.DeliveryDate <= lastDayOfMonth && o.Orderindicator !=1).Count(); largeScreenOrderDto.MonthCompletedOrderNum = response.Where(o => o.DeliveryDate >= firstDayOfMonth && o.DeliveryDate <= lastDayOfMonth && o.Orderindicator == 1).Count(); return largeScreenOrderDto; } public List GetOrderProgress() { var mainQuery = Queryable() // 使用链式 Join 并明确指定别名和关联条件 .InnerJoin((order, pw) => order.OrderNoMes == pw.CustomerOrder) .InnerJoin((order, pw, pr) => pw.Workorder == pr.FkWorkorder) .InnerJoin((order, pw, pr, bp) => pr.ProcessId == bp.Id) // 按订单号分组 .GroupBy((order, pw, pr, bp) => order.OrderNoMes) // 主查询字段选择 .Select((order, pw, pr, bp) => new OrderProgressDto { OrderNo = order.OrderNoMes, MaterialName = order.MaterialName, PlanNum = order.DemandQuantity, // 保留子查询占位符,后续通过 SplitTable 填充 productionProcesses = new List() }); // 子查询(获取工序明细) var subQuery = Queryable() .InnerJoin((order, pw) => order.OrderNoMes == pw.CustomerOrder) .InnerJoin((order, pw, pr) => pw.Workorder == pr.FkWorkorder) .InnerJoin((order, pw, pr, bp) => pr.ProcessId == bp.Id) .Select((order, pw, pr, bp) => new ProductionProcesses { OrderNo = order.OrderNoMes, // 必须包含关联字段 ProcessName = bp.Name, Num = pr.FinishedNum }); // 使用 Mapper 进行结果合并 var result = mainQuery.MergeTable() // 合并主查询 .Mapper(mainResult => { // 根据 OrderNo 关联子查询 mainResult.productionProcesses = subQuery .Where(sub => sub.OrderNo == mainResult.OrderNo) .ToList(); }).ToList(); return result; } } }