using Infrastructure.Extensions; using ZR.Mall.Enum; using ZR.Mall.Model; using ZR.Mall.Model.Dto; using ZR.Mall.Service.IService; namespace ZR.Mall.Service { /// /// 订单管理Service业务层处理 /// [AppService(ServiceType = typeof(IOMSOrderService))] public class OMSOrderService : BaseService, IOMSOrderService { private ISkusService _shopSkusService; public OMSOrderService(ISkusService shopSkusService) { _shopSkusService = shopSkusService; } /// /// 查询订单管理列表 /// /// /// public PagedInfo GetList(OMSOrderQueryDto parm) { var predicate = QueryExp(parm); var response = Queryable() .Includes(x => x.Items) .Where(predicate.ToExpression()) .ToPage(parm); return response; } /// /// 查询未发货的订单数 /// /// public int NotDelivereOrder() { return Queryable() .Where(f => f.OrderStatus == Enum.OrderStatusEnum.Completed && f.DeliveryStatus == Enum.DeliveryStatusEnum.NotDelivered) .Count(); } /// /// 获取详情 /// /// /// public OMSOrder GetInfo(long Id) { var response = Queryable() .Includes(x => x.Items) .Where(x => x.Id == Id) .First(); return response; } /// /// 修改订单管理 /// /// /// /// public int UpdateOMSOrder(int operType, OMSOrder model) { //修改商家备注 if (operType == 2) { return UpdateMerchantNote(model); } //修改地址 if (operType == 3) { var result = Update(w => w.Id == model.Id, it => new OMSOrder() { AddressSnapshot = model.AddressSnapshot, }); return result; } //订单退款 if (operType == 4) { //TODO 退款逻辑 throw new CustomException("还未实现"); } return Update(model, true); } /// /// 发货 /// /// /// public async Task OrderDelivery(OMSOrder model) { var dbDate = Context.GetDate(); var result = await UpdateAsync(w => w.OrderNo == model.OrderNo, it => new OMSOrder() { DeliveryCompany = model.DeliveryCompany, DeliveryNo = model.DeliveryNo, OrderStatus = Enum.OrderStatusEnum.Shipped, // 已发货 DeliveryStatus = Enum.DeliveryStatusEnum.Delivering, // 已发货 ShipTime = dbDate }); //TODO 发送消息通知用户,订单完整日志 return result; } /// /// 修改平台备注 /// /// /// public int UpdateMerchantNote(OMSOrder model) { var result = Update(w => w.OrderNo == model.OrderNo, it => new OMSOrder() { MerchantNote = model.MerchantNote, }); return result; } /// /// 导出订单管理 /// /// /// public PagedInfo ExportList(OMSOrderQueryDto parm) { parm.PageNum = 1; parm.PageSize = 100000; var predicate = QueryExp(parm); var response = Queryable() .Where(predicate.ToExpression()) .Select((it) => new OMSOrderDto() { }, true) .Mapper(it => { it.User = $"{it.AddressSnapshot?.UserName} {it.AddressSnapshot?.Phone}"; }) .ToPage(parm); return response; } /// /// 导出代发货订单 /// /// /// public async Task> ExportWaitDeliveryList(OMSOrderQueryDto parm) { parm.PageNum = 1; parm.PageSize = 100000; var predicate = Expressionable.Create(); predicate = predicate.And(it => it.OrderStatus == Enum.OrderStatusEnum.TobeShipped); predicate = predicate.And(it => it.DeliveryStatus == Enum.DeliveryStatusEnum.NotDelivered); predicate = predicate.And(it => it.PayTime >= parm.BeginCreateTime && it.PayTime <= parm.EndCreateTime); var response = await Queryable() .Where(predicate.ToExpression()) .Select((it) => new DeliveryExpressDto() { DeliveryCompany = it.DeliveryCompany, DeliveryNo = it.DeliveryNo, OrderNo = it.OrderNo, }) .ToListAsync(); return response; } /// /// 总销售额和订单数 /// /// public async Task GetTotalSales(OMSOrderQueryDto dto) { var result = await Queryable() //.Where(o => o.OrderStatus == Enum.OrderStatusEnum.Completed) .WhereIF(dto.BeginCreateTime != null, o => o.PayTime >= dto.BeginCreateTime) .WhereIF(dto.BeginCreateTime != null, o => o.PayTime <= dto.EndCreateTime) .Select(o => new { TotalSales = SqlFunc.AggregateSum(o.PayAmount), OrderCount = SqlFunc.AggregateCount(o.Id) }) .FirstAsync(); return result; } /// /// 销售趋势(按天) /// /// /// public async Task GetSaleTreandByDay(OMSOrderQueryDto dto) { var trend = await Queryable() .WhereIF(dto.BeginCreateTime == null, o => o.PayTime >= DateTime.Now.AddDays(-7)) .WhereIF(dto.BeginCreateTime != null, o => o.PayTime >= dto.BeginCreateTime) .WhereIF(dto.BeginCreateTime != null, o => o.PayTime <= dto.EndCreateTime) .GroupBy(o => SqlFunc.ToDateShort(o.PayTime)) .OrderBy(o => SqlFunc.ToDateShort(o.PayTime)) .Select(o => new { Date = SqlFunc.ToDateShort(o.PayTime), TotalSales = SqlFunc.AggregateSum(o.PayAmount), OrderCount = SqlFunc.AggregateCount(o.Id) }) .ToListAsync(); return trend; } /// /// 销售排名前10的商品 /// /// /// public async Task GetSaleTopProduct(OMSOrderQueryDto dto) { var topProducts = await Context.Queryable() .InnerJoin((oi, o) => oi.OrderId == o.Id) .WhereIF(dto.BeginCreateTime != null, (oi, o) => o.PayTime >= dto.BeginCreateTime) .WhereIF(dto.BeginCreateTime != null, (oi, o) => o.PayTime <= dto.EndCreateTime) .GroupBy((oi, o) => oi.ProductId) .OrderBy((oi, o) => SqlFunc.AggregateSum(oi.Quantity), OrderByType.Desc) .Select((oi, o) => new { oi.ProductId, TotalSold = SqlFunc.AggregateSum(oi.Quantity), TotalSales = SqlFunc.AggregateSum(oi.Quantity * oi.TotalPrice) }) .Take(10) .MergeTable() .LeftJoin((it, p) => it.ProductId == p.ProductId) .Select((it, p) => new { p.ProductName, it.TotalSold, it.TotalSales }) .ToListAsync(); return topProducts; } /// /// 查询导出表达式 /// /// /// private static Expressionable QueryExp(OMSOrderQueryDto parm) { var predicate = Expressionable.Create(); if (parm.OrderStatus == null && parm.BeginCreateTime == null) { predicate = predicate.And(it => it.CreateTime >= DateTime.Now.AddDays(-7).ToShortDateString().ParseToDateTime()); } else { predicate = predicate.AndIF(parm.EndCreateTime != null, it => it.CreateTime >= parm.BeginCreateTime && it.CreateTime <= parm.EndCreateTime); } predicate = predicate.AndIF(parm.OrderNo.IsNotEmpty(), it => it.OrderNo == parm.OrderNo); predicate = predicate.AndIF(parm.UserId != null, it => it.UserId == parm.UserId); predicate = predicate.AndIF(parm.OrderStatus != null, it => it.OrderStatus == parm.OrderStatus); //predicate = predicate.AndIF(parm.ConfirmStatus != null, it => it.ConfirmStatus == parm.ConfirmStatus); predicate = predicate.AndIF(parm.DeliveryNo.IsNotEmpty(), it => it.DeliveryNo == parm.DeliveryNo); predicate = predicate.And(it => it.IsDelete == 0); //待发货双条件查询 predicate = predicate.AndIF(parm.OrderStatus == Enum.OrderStatusEnum.TobeShipped, it => it.DeliveryStatus == DeliveryStatusEnum.NotDelivered); return predicate; } } }