2026-01-10 13:47:54 +08:00

297 lines
10 KiB
C#

using Infrastructure.Extensions;
using RIZO.Mall.Enum;
using RIZO.Mall.Model;
using RIZO.Mall.Model.Dto;
using RIZO.Mall.Service.IService;
namespace RIZO.Mall.Service
{
/// <summary>
/// 订单管理Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IOMSOrderService))]
public class OMSOrderService : BaseService<OMSOrder>, IOMSOrderService
{
private ISkusService _shopSkusService;
public OMSOrderService(ISkusService shopSkusService)
{
_shopSkusService = shopSkusService;
}
/// <summary>
/// 查询订单管理列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<OMSOrderDto> GetList(OMSOrderQueryDto parm)
{
var predicate = QueryExp(parm);
var response = Queryable()
.Includes(x => x.Items)
.Where(predicate.ToExpression())
.ToPage<OMSOrder, OMSOrderDto>(parm);
return response;
}
/// <summary>
/// 查询未发货的订单数
/// </summary>
/// <returns></returns>
public int NotDelivereOrder()
{
return Queryable()
.Where(f => f.OrderStatus == Enum.OrderStatusEnum.TobeShipped && f.DeliveryStatus == Enum.DeliveryStatusEnum.NotDelivered)
.Count();
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public OMSOrder GetInfo(long Id)
{
var response = Queryable()
.Includes(x => x.Items)
.Where(x => x.Id == Id)
.First();
return response;
}
/// <summary>
/// 修改订单管理
/// </summary>
/// <param name="operType"></param>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateOMSOrder(int operType, OMSOrder model)
{
//修改商家备注
if (operType == 2)
{
return UpdateMerchantNote(model);
}
//修改地址
if (operType == 3)
{
var result = Update(w => w.OrderNo == model.OrderNo, it => new OMSOrder()
{
AddressSnapshot = model.AddressSnapshot,
});
return result;
}
//订单退款
if (operType == 4)
{
//TODO 退款逻辑
throw new CustomException("还未实现");
}
return Update(model, true);
}
/// <summary>
/// 发货
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<int> OrderDelivery(OMSOrder model)
{
var dbDate = Context.GetDate();
if (model.DeliveryStatus != DeliveryStatusEnum.NotDelivered)
{
return -1;//已发货
}
if (model.AddressSnapshot == null)
{
return -2; // 地址信息不能为空
}
var result = await UpdateAsync(w => w.OrderNo == model.OrderNo, it => new OMSOrder()
{
DeliveryCompany = model.DeliveryCompany,
DeliveryNo = model.DeliveryNo,
OrderStatus = OrderStatusEnum.Shipped, // 已发货
DeliveryStatus = DeliveryStatusEnum.Delivering, // 已发货
ShipTime = dbDate
});
//TODO 发送消息通知用户,订单完整日志
return result;
}
/// <summary>
/// 修改平台备注
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateMerchantNote(OMSOrder model)
{
var result = Update(w => w.OrderNo == model.OrderNo, it => new OMSOrder()
{
MerchantNote = model.MerchantNote,
});
return result;
}
/// <summary>
/// 导出订单管理
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<OMSOrderDto> 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;
}
/// <summary>
/// 导出代发货订单
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public async Task<List<DeliveryExpressDto>> ExportWaitDeliveryList(OMSOrderQueryDto parm)
{
parm.PageNum = 1;
parm.PageSize = 100000;
var predicate = Expressionable.Create<OMSOrder>();
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;
}
/// <summary>
/// 总销售额和订单数
/// </summary>
/// <returns></returns>
public async Task<dynamic> 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;
}
/// <summary>
/// 销售趋势(按天)
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<dynamic> 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;
}
/// <summary>
/// 销售排名前10的商品
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<dynamic> GetSaleTopProduct(OMSOrderQueryDto dto)
{
var topProducts = await Context.Queryable<OMSOrderItem>()
.InnerJoin<OMSOrder>((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<Product>((it, p) => it.ProductId == p.ProductId)
.Select((it, p) => new
{
p.ProductName,
it.TotalSold,
it.TotalSales
})
.ToListAsync();
return topProducts;
}
/// <summary>
/// 查询导出表达式
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
private static Expressionable<OMSOrder> QueryExp(OMSOrderQueryDto parm)
{
var predicate = Expressionable.Create<OMSOrder>();
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;
}
}
}