OMSOrderService.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. using Infrastructure.Extensions;
  2. using ZR.Mall.Enum;
  3. using ZR.Mall.Model;
  4. using ZR.Mall.Model.Dto;
  5. using ZR.Mall.Service.IService;
  6. namespace ZR.Mall.Service
  7. {
  8. /// <summary>
  9. /// 订单管理Service业务层处理
  10. /// </summary>
  11. [AppService(ServiceType = typeof(IOMSOrderService))]
  12. public class OMSOrderService : BaseService<OMSOrder>, IOMSOrderService
  13. {
  14. private ISkusService _shopSkusService;
  15. public OMSOrderService(ISkusService shopSkusService)
  16. {
  17. _shopSkusService = shopSkusService;
  18. }
  19. /// <summary>
  20. /// 查询订单管理列表
  21. /// </summary>
  22. /// <param name="parm"></param>
  23. /// <returns></returns>
  24. public PagedInfo<OMSOrderDto> GetList(OMSOrderQueryDto parm)
  25. {
  26. var predicate = QueryExp(parm);
  27. var response = Queryable()
  28. .Includes(x => x.Items)
  29. .Where(predicate.ToExpression())
  30. .ToPage<OMSOrder, OMSOrderDto>(parm);
  31. return response;
  32. }
  33. /// <summary>
  34. /// 查询未发货的订单数
  35. /// </summary>
  36. /// <returns></returns>
  37. public int NotDelivereOrder()
  38. {
  39. return Queryable()
  40. .Where(f => f.OrderStatus == Enum.OrderStatusEnum.Completed && f.DeliveryStatus == Enum.DeliveryStatusEnum.NotDelivered)
  41. .Count();
  42. }
  43. /// <summary>
  44. /// 获取详情
  45. /// </summary>
  46. /// <param name="Id"></param>
  47. /// <returns></returns>
  48. public OMSOrder GetInfo(long Id)
  49. {
  50. var response = Queryable()
  51. .Includes(x => x.Items)
  52. .Where(x => x.Id == Id)
  53. .First();
  54. return response;
  55. }
  56. /// <summary>
  57. /// 修改订单管理
  58. /// </summary>
  59. /// <param name="operType"></param>
  60. /// <param name="model"></param>
  61. /// <returns></returns>
  62. public int UpdateOMSOrder(int operType, OMSOrder model)
  63. {
  64. //修改商家备注
  65. if (operType == 2)
  66. {
  67. return UpdateMerchantNote(model);
  68. }
  69. //修改地址
  70. if (operType == 3)
  71. {
  72. var result = Update(w => w.Id == model.Id, it => new OMSOrder()
  73. {
  74. AddressSnapshot = model.AddressSnapshot,
  75. });
  76. return result;
  77. }
  78. //订单退款
  79. if (operType == 4)
  80. {
  81. //TODO 退款逻辑
  82. throw new CustomException("还未实现");
  83. }
  84. return Update(model, true);
  85. }
  86. /// <summary>
  87. /// 发货
  88. /// </summary>
  89. /// <param name="model"></param>
  90. /// <returns></returns>
  91. public async Task<int> OrderDelivery(OMSOrder model)
  92. {
  93. var dbDate = Context.GetDate();
  94. var result = await UpdateAsync(w => w.OrderNo == model.OrderNo, it => new OMSOrder()
  95. {
  96. DeliveryCompany = model.DeliveryCompany,
  97. DeliveryNo = model.DeliveryNo,
  98. OrderStatus = Enum.OrderStatusEnum.Shipped, // 已发货
  99. DeliveryStatus = Enum.DeliveryStatusEnum.Delivering, // 已发货
  100. ShipTime = dbDate
  101. });
  102. //TODO 发送消息通知用户,订单完整日志
  103. return result;
  104. }
  105. /// <summary>
  106. /// 修改平台备注
  107. /// </summary>
  108. /// <param name="model"></param>
  109. /// <returns></returns>
  110. public int UpdateMerchantNote(OMSOrder model)
  111. {
  112. var result = Update(w => w.OrderNo == model.OrderNo, it => new OMSOrder()
  113. {
  114. MerchantNote = model.MerchantNote,
  115. });
  116. return result;
  117. }
  118. /// <summary>
  119. /// 导出订单管理
  120. /// </summary>
  121. /// <param name="parm"></param>
  122. /// <returns></returns>
  123. public PagedInfo<OMSOrderDto> ExportList(OMSOrderQueryDto parm)
  124. {
  125. parm.PageNum = 1;
  126. parm.PageSize = 100000;
  127. var predicate = QueryExp(parm);
  128. var response = Queryable()
  129. .Where(predicate.ToExpression())
  130. .Select((it) => new OMSOrderDto()
  131. {
  132. }, true)
  133. .Mapper(it =>
  134. {
  135. it.User = $"{it.AddressSnapshot?.UserName} {it.AddressSnapshot?.Phone}";
  136. })
  137. .ToPage(parm);
  138. return response;
  139. }
  140. /// <summary>
  141. /// 导出代发货订单
  142. /// </summary>
  143. /// <param name="parm"></param>
  144. /// <returns></returns>
  145. public async Task<List<DeliveryExpressDto>> ExportWaitDeliveryList(OMSOrderQueryDto parm)
  146. {
  147. parm.PageNum = 1;
  148. parm.PageSize = 100000;
  149. var predicate = Expressionable.Create<OMSOrder>();
  150. predicate = predicate.And(it => it.OrderStatus == Enum.OrderStatusEnum.TobeShipped);
  151. predicate = predicate.And(it => it.DeliveryStatus == Enum.DeliveryStatusEnum.NotDelivered);
  152. predicate = predicate.And(it => it.PayTime >= parm.BeginCreateTime && it.PayTime <= parm.EndCreateTime);
  153. var response = await Queryable()
  154. .Where(predicate.ToExpression())
  155. .Select((it) => new DeliveryExpressDto()
  156. {
  157. DeliveryCompany = it.DeliveryCompany,
  158. DeliveryNo = it.DeliveryNo,
  159. OrderNo = it.OrderNo,
  160. })
  161. .ToListAsync();
  162. return response;
  163. }
  164. /// <summary>
  165. /// 总销售额和订单数
  166. /// </summary>
  167. /// <returns></returns>
  168. public async Task<dynamic> GetTotalSales(OMSOrderQueryDto dto)
  169. {
  170. var result = await Queryable()
  171. //.Where(o => o.OrderStatus == Enum.OrderStatusEnum.Completed)
  172. .WhereIF(dto.BeginCreateTime != null, o => o.PayTime >= dto.BeginCreateTime)
  173. .WhereIF(dto.BeginCreateTime != null, o => o.PayTime <= dto.EndCreateTime)
  174. .Select(o => new
  175. {
  176. TotalSales = SqlFunc.AggregateSum(o.PayAmount),
  177. OrderCount = SqlFunc.AggregateCount(o.Id)
  178. })
  179. .FirstAsync();
  180. return result;
  181. }
  182. /// <summary>
  183. /// 销售趋势(按天)
  184. /// </summary>
  185. /// <param name="dto"></param>
  186. /// <returns></returns>
  187. public async Task<dynamic> GetSaleTreandByDay(OMSOrderQueryDto dto)
  188. {
  189. var trend = await Queryable()
  190. .WhereIF(dto.BeginCreateTime == null, o => o.PayTime >= DateTime.Now.AddDays(-7))
  191. .WhereIF(dto.BeginCreateTime != null, o => o.PayTime >= dto.BeginCreateTime)
  192. .WhereIF(dto.BeginCreateTime != null, o => o.PayTime <= dto.EndCreateTime)
  193. .GroupBy(o => SqlFunc.ToDateShort(o.PayTime))
  194. .OrderBy(o => SqlFunc.ToDateShort(o.PayTime))
  195. .Select(o => new
  196. {
  197. Date = SqlFunc.ToDateShort(o.PayTime),
  198. TotalSales = SqlFunc.AggregateSum(o.PayAmount),
  199. OrderCount = SqlFunc.AggregateCount(o.Id)
  200. })
  201. .ToListAsync();
  202. return trend;
  203. }
  204. /// <summary>
  205. /// 销售排名前10的商品
  206. /// </summary>
  207. /// <param name="dto"></param>
  208. /// <returns></returns>
  209. public async Task<dynamic> GetSaleTopProduct(OMSOrderQueryDto dto)
  210. {
  211. var topProducts = await Context.Queryable<OMSOrderItem>()
  212. .InnerJoin<OMSOrder>((oi, o) => oi.OrderId == o.Id)
  213. .WhereIF(dto.BeginCreateTime != null, (oi, o) => o.PayTime >= dto.BeginCreateTime)
  214. .WhereIF(dto.BeginCreateTime != null, (oi, o) => o.PayTime <= dto.EndCreateTime)
  215. .GroupBy((oi, o) => oi.ProductId)
  216. .OrderBy((oi, o) => SqlFunc.AggregateSum(oi.Quantity), OrderByType.Desc)
  217. .Select((oi, o) => new
  218. {
  219. oi.ProductId,
  220. TotalSold = SqlFunc.AggregateSum(oi.Quantity),
  221. TotalSales = SqlFunc.AggregateSum(oi.Quantity * oi.TotalPrice)
  222. })
  223. .Take(10)
  224. .MergeTable()
  225. .LeftJoin<Product>((it, p) => it.ProductId == p.ProductId)
  226. .Select((it, p) => new
  227. {
  228. p.ProductName,
  229. it.TotalSold,
  230. it.TotalSales
  231. })
  232. .ToListAsync();
  233. return topProducts;
  234. }
  235. /// <summary>
  236. /// 查询导出表达式
  237. /// </summary>
  238. /// <param name="parm"></param>
  239. /// <returns></returns>
  240. private static Expressionable<OMSOrder> QueryExp(OMSOrderQueryDto parm)
  241. {
  242. var predicate = Expressionable.Create<OMSOrder>();
  243. if (parm.OrderStatus == null && parm.BeginCreateTime == null)
  244. {
  245. predicate = predicate.And(it => it.CreateTime >= DateTime.Now.AddDays(-7).ToShortDateString().ParseToDateTime());
  246. }
  247. else
  248. {
  249. predicate = predicate.AndIF(parm.EndCreateTime != null, it => it.CreateTime >= parm.BeginCreateTime && it.CreateTime <= parm.EndCreateTime);
  250. }
  251. predicate = predicate.AndIF(parm.OrderNo.IsNotEmpty(), it => it.OrderNo == parm.OrderNo);
  252. predicate = predicate.AndIF(parm.UserId != null, it => it.UserId == parm.UserId);
  253. predicate = predicate.AndIF(parm.OrderStatus != null, it => it.OrderStatus == parm.OrderStatus);
  254. //predicate = predicate.AndIF(parm.ConfirmStatus != null, it => it.ConfirmStatus == parm.ConfirmStatus);
  255. predicate = predicate.AndIF(parm.DeliveryNo.IsNotEmpty(), it => it.DeliveryNo == parm.DeliveryNo);
  256. predicate = predicate.And(it => it.IsDelete == 0);
  257. //待发货双条件查询
  258. predicate = predicate.AndIF(parm.OrderStatus == Enum.OrderStatusEnum.TobeShipped, it => it.DeliveryStatus == DeliveryStatusEnum.NotDelivered);
  259. return predicate;
  260. }
  261. }
  262. }