using Infrastructure.Attribute; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using ARW.Model; using ARW.Repository; using ARW.Repository.Business.OrderManage.Orders; using ARW.Service.Api.IBusinessService.OrderManage.Orders; using ARW.Model.Dto.Api.OrderManage.Orders; using ARW.Model.Models.Business.OrderManage.Orders; using ARW.Model.Vo.Api.OrderManage.Orders; using ARW.Repository.Business.OrderManage.OrderGoodss; using ARW.Repository.Business.GoodsManager.Goodss; using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSkus; using ARW.Repository.Business.GoodsManager.GoodsSpecs.Specs; using ARW.Repository.Business.GoodsManager.GoodsSpecs.SpecValues; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.SpecValues; namespace ARW.Service.Api.BusinessService.OrderManage.Orders { /// /// 订单接口实现类Api /// /// @author lwh /// @date 2023-09-01 /// [AppService(ServiceType = typeof(IOrderServiceApi), ServiceLifetime = LifeTime.Transient)] public class OrderServiceImplApi : BaseService, IOrderServiceApi { private readonly OrderRepository _OrderRepository; private readonly OrderGoodsRepository _OrderGoodsRepository; private readonly GoodsRepository _GoodsRepository; private readonly GoodsSkuRepository _GoodsSkuRepository; private readonly SpecRepository _SpecRepository; private readonly SpecValueRepository _SpecValueRepository; public OrderServiceImplApi(OrderRepository OrderRepository, OrderGoodsRepository orderGoodsRepository, GoodsRepository goodsRepository, GoodsSkuRepository goodsSkuRepository, SpecRepository specRepository, SpecValueRepository specValueRepository) { this._OrderRepository = OrderRepository; _OrderGoodsRepository = orderGoodsRepository; _GoodsRepository = goodsRepository; _GoodsSkuRepository = goodsSkuRepository; _SpecRepository = specRepository; _SpecValueRepository = specValueRepository; } #region Api接口代码 /// /// 查询订单列表(Api) /// /// /// public async Task> GetOrderListApi(OrderQueryDtoApi parm) { //开始拼装查询条件d var predicate = Expressionable.Create(); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.OrderNumber), s => s.OrderNumber.Contains(parm.OrderNumber)); predicate = predicate.AndIF(parm.OrderStatus != 0, s => s.OrderStatus == parm.OrderStatus); predicate = predicate.AndIF(parm.PayType != null, s => s.PayType == parm.PayType); predicate = predicate.AndIF(parm.PayStatus != null, s => s.PayStatus == parm.PayStatus); predicate = predicate.AndIF(parm.DeliveryType != null, s => s.DeliveryType == parm.DeliveryType); predicate = predicate.AndIF(parm.DeliveryStatus != null, s => s.DeliveryStatus == parm.DeliveryStatus); predicate = predicate.AndIF(parm.ReceiptStatus != null, s => s.ReceiptStatus == parm.ReceiptStatus); var query = _OrderRepository .Queryable() .Where(predicate.ToExpression()) .OrderBy(s => s.Create_time, OrderByType.Desc) .Select(s => new OrderVoApi { OrderId = s.OrderId, OrderGuid = s.OrderGuid, OrderNo = s.OrderNumber, GoodsTotalAmoun = s.GoodsTotalAmoun, OrderAmount = s.OrderAmount, PayPrice = s.PayPrice, PayStatus = s.PayStatus, ExpressPrice = s.ExpressPrice, DeliveryStatus = s.DeliveryStatus, ReceiptStatus = s.ReceiptStatus, OrderStatus = s.OrderStatus, IsComment = s.IsComment, }); var list = await query.ToPageAsync(parm); foreach (var item in list.Result) { var goodsList = new List(); var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == item.OrderGuid); foreach (var _item in orderGoodsList) { var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == _item.GoodsGuid); var orderGood = new OrderGoodsApiVo { GoodsGuId = good.GoodsGuid, Thumb = good.GoodsPicture.Split(',').First(), Title = good.GoodsName, SkuId = _item.GoodsSkuId, Price = _item.GoodsPrice, BuyQuantity = _item.GoodsTotalNum }; if (_item.GoodsSkuId != 0) orderGood.Specifications = await GetGoodsSpecList(_item.GoodsSkuId); goodsList.Add(orderGood); } item.GoodsList = goodsList; } return list; } /// /// 待付款取消订单 /// /// /// public async Task WaitPayCancelOrder(OrderDtoApi parm) { // 找到该订单的商品,如果是下单立减库存,将库存加回来 var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == parm.OrderGuid); foreach (var item in orderGoodsList) { var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == item.GoodsGuid); if(good.GoodsDeductStockType == 1) { if(item.GoodsSkuId != 0) { var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == item.GoodsSkuId); sku.GoodsSkuStockNum += item.GoodsTotalNum; good.GoodsTotalInventory += item.GoodsTotalNum; await _GoodsSkuRepository.UpdateAsync(sku); await _GoodsRepository.UpdateAsync(good); } else { good.GoodsTotalInventory += item.GoodsTotalNum; await _GoodsRepository.UpdateAsync(good); } } } var res = await _OrderRepository.UpdateAsync(f => new Order { OrderStatus = 2, IsSettled = 2, }, f => f.OrderGuid == parm.OrderGuid); if (res) return "取消订单成功"; else return "取消订单失败!"; } /// /// 已付款取消订单 /// /// /// public async Task PayCancelOrder(OrderDtoApi parm) { var res = await _OrderRepository.UpdateAsync(f => new Order { OrderStatus = 3, }, f => f.OrderGuid == parm.OrderGuid); if (res) return "取消订单成功"; else return "取消订单失败!"; } /// /// 确认收货 /// /// /// public async Task ConfirmReceipt(OrderDtoApi parm) { // 收货状态 => 已收货 // 订单状态 => 已完成 // 订单结算状态 => 已结算 var res = await _OrderRepository.UpdateAsync(f => new Order { ReceiptStatus = 2, ReceiptTime = DateTime.Now, OrderStatus = 4, IsSettled = 2, }, f => f.OrderGuid == parm.OrderGuid); if (res) return "确认收货成功"; else return "收货失败!"; } /// /// 查询订单详情(Api) /// /// /// public async Task GetOrderDetails(OrderDtoApi parm) { var query = _OrderRepository .Queryable() .Where(s => s.OrderGuid == parm.OrderGuid) .Select(s => new OrderApiDetailsVo { OrderId = s.OrderId, OrderGuid = s.OrderGuid, PaymentGuid = s.PaymentGuid, CustomerGuid = s.CustomerGuid, OrderNumber = s.OrderNumber, GoodsTotalAmoun = s.GoodsTotalAmoun, OrderAmount = s.OrderAmount, CouponGuid = s.CouponGuid, CouponMoney = s.CouponMoney, PointsMoney = s.PointsMoney, PointsNum = s.PointsNum, PayPrice = s.PayPrice, UpdatePrice = s.UpdatePrice, OrderRemark = s.OrderRemark, PayType = s.PayType, PayStatus = s.PayStatus, PayTime = s.PayTime, DeliveryType = s.DeliveryType, ExpressPrice = s.ExpressPrice, LogisticsCompanyGuid = s.LogisticsCompanyGuid, LogisticsCompany = s.LogisticsCompany, LogisticsTrackingNumber = s.LogisticsTrackingNumber, DeliveryStatus = s.DeliveryStatus, DeliveryTime = s.DeliveryTime, ReceiptStatus = s.ReceiptStatus, ReceiptTime = s.ReceiptTime, OrderStatus = s.OrderStatus, PointsBonus = s.PointsBonus, IsSettled = s.IsSettled, TransactionId = s.TransactionId, IsComment = s.IsComment, OrderSource = s.OrderSource, }).Take(1); return await query.ToJsonAsync(); } #region 业务方法调用 /// /// 获取商品规格 /// /// 规格id /// public async Task> GetGoodsSpecList(int? skuId) { var list = new List(); var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == skuId); if (sku.SpecValueId != 0) { var orderGoodsSpecApiVo1 = await GetGoodsSpec(sku, 1); list.Add(orderGoodsSpecApiVo1); if (sku.SpecSecondValueId != 0) { var orderGoodsSpecApiVo2 = await GetGoodsSpec(sku, 2); list.Add(orderGoodsSpecApiVo2); if (sku.SpecThirdValueId != 0) { var orderGoodsSpecApiVo3 = await GetGoodsSpec(sku, 3); list.Add(orderGoodsSpecApiVo3); } } } return list; } public async Task GetGoodsSpec(GoodsSku sku, int level) { var orderGoodsSpecApiVo = new OrderGoodsSpecApiVo(); var specValue = new SpecValue(); switch (level) { case 1: specValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == sku.SpecValueId); orderGoodsSpecApiVo = await GetSpecValue(specValue); break; case 2: specValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == sku.SpecSecondValueId); orderGoodsSpecApiVo = await GetSpecValue(specValue); break; case 3: specValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == sku.SpecThirdValueId); orderGoodsSpecApiVo = await GetSpecValue(specValue); break; default: break; } return orderGoodsSpecApiVo; } public async Task GetSpecValue(SpecValue specValue) { var spec = await _SpecRepository.GetFirstAsync(s => s.SpecId == specValue.SpecId); OrderGoodsSpecApiVo orderGoodsSpecApiVo = new() { SpecTitle = spec.SpecName, SpecValue = specValue.SpecValueName }; return orderGoodsSpecApiVo; } #endregion #endregion } }