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