using Ant.Core.Utils; using Ant.Core.WebApi.Enum; using Ant.Core.WebApi.Model; using Central.Control.WebApi.DbEntity; using Central.Control.WebApi.EFDbContext; using Central.Control.WebApi.Enum; using Central.Control.WebApi.Models.Request; using Central.Control.WebApi.Models.Response; using Central.Control.WebApi.Service.Interface; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Central.Control.WebApi.Service { /// /// /// public class OrderService: IOrderService { private readonly IDbContext _dbContent; private readonly IUserService _userService; /// /// /// /// public OrderService( IDbContext dbContent, IUserService userService) { _dbContent = dbContent; _userService = userService; } /// /// 下单 /// /// /// public ApiResult Order(OrderRequestDto req) { #region 1、验证参数 if (req == null || req.OrderInfo == null || req.OrderInfo.Count() == 0) { return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确"); } #endregion #region 2、验证相应数据和库存 var productIds = req.OrderInfo.Select(p => p.ProductId).ToList(); var products = _dbContent.Set().Where(p => p.IsDelete == 0 && p.Sale == Enum.SaleEnum.On && productIds.Contains(p.Id)).ToList(); if (products.Count() <= 0) { return new ApiResult(ApiStatusCode.RecordNotFound, "未找到下单的商品"); } #endregion #region 3、库存验证 var session = _userService.GetLoginSession(); var orderId = IdGenerator.NewId(); List orderDetailAdds = new List(); List orderProcessAdds = new List(); foreach (var o in req.OrderInfo) { var currentProduct = products.FirstOrDefault(p => p.Id == o.ProductId); if (currentProduct == null) { return new ApiResult(ApiStatusCode.RecordNotFound, $"{o.ProductId}商品不存在"); } if (currentProduct.Stock < o.Count) { return new ApiResult(ApiStatusCode.Forbidden, $"{currentProduct.Name}商品库存不足,请修改后重新下单"); } // 扣库存 currentProduct.Stock = currentProduct.Stock - o.Count; // orderDetails orderDetailAdds.Add(new YW_OrderDetails() { Id = IdGenerator.NewId(), OrderId = orderId, ProductId = currentProduct.Id, Name = currentProduct.Name, Code = currentProduct.Code, Img = currentProduct.Img, Info = currentProduct.Info, Price = currentProduct.Price, BuyingPrice = currentProduct.BuyingPrice, Count = o.Count, CreateBY = session.UserId }); } #endregion #region 4、下单 YW_Order order = new YW_Order() { Id = orderId, DeviceId = session.UserId, Price = orderDetailAdds.Sum(p => p.Price * p.Count), PayStatus = PayStatusEnum.UnPay, OrderStatus = OrderStatusEnum.UnPay, PaySerialId = Snowflake.Instance().GetId().ToString(), CreateBY = session.UserId }; YW_OrderProcess orderProcess = new YW_OrderProcess() { Id = IdGenerator.NewId(), OrderId = order.Id, DeviceId = session.UserId, CurrentOrderStatus = OrderStatusEnum.UnPay, Message = "下单成功", CreateBY = session.Id }; #endregion #region 5、存库 _dbContent.Set().Add(order); _dbContent.Set().Add(orderProcess); _dbContent.Set().AddRange(orderDetailAdds); // 数据库执行 库存已经改过了,会自动保存 _dbContent.SaveChanges(); #endregion return new ApiResult(new OrderResponseDto() { OrderId = order.Id, Price = order.Price }); } /// /// 获取待烧烤的商品列表 /// public ApiResult> GetQueueOrders() { var orders = _dbContent.Set() .Where(p => p.IsDelete == 0 && p.PayStatus == PayStatusEnum.Paid && p.OrderStatus == OrderStatusEnum.Paid) .OrderBy(p => p.CreateDT).ToList(); var orderIds = orders.Select(p => p.Id).ToList(); var orderDetails = _dbContent.Set().Where(p => p.IsDelete == 0 && orderIds.Contains(p.OrderId)).ToList(); List result = new List(); orders.ForEach(item => { QueueOrderResponseDto resultItem = new QueueOrderResponseDto() { OrderId = item.Id, Price = item.Price, OrderDetails = orderDetails .Where(p => p.OrderId == item.Id) .Select(p => SafeClone.Trans(p)) .ToList() }; resultItem.OrderDetails?.ForEach(p => p.Img = $"{ProductService.ImagePrefix}{p.Img}"); result.Add(resultItem); }); return new ApiResult>(result); } /// /// 回写流程状态 /// /// /// public ApiResult OrderProcess(OrderProcessRequestDto req) { if (req == null) { return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确"); } var order = _dbContent.Set().FirstOrDefault(p => p.Id == req.OrderId); if (order == null) { return new ApiResult(ApiStatusCode.InvalidParameter, "未找到相应订单"); } if (order.PayStatus != PayStatusEnum.Paid) { return new ApiResult(ApiStatusCode.InvalidParameter, "未支付订单不能回写流程"); } if (order.OrderStatus == OrderStatusEnum.UnPay || order.OrderStatus == OrderStatusEnum.Cancel) { return new ApiResult(ApiStatusCode.InvalidParameter, "未支付或已取消订单不能回写流程"); } var seesion = _userService.GetLoginSession(); // 修改订单状态 order.OrderStatus = req.OrderStatus; // 记录订单流程 YW_OrderProcess orderProcess = new YW_OrderProcess() { Id = IdGenerator.NewId(), OrderId = req.OrderId, DeviceId = seesion.UserId, CurrentOrderStatus = req.OrderStatus, Message = req.Message, CreateBY = seesion.UserId }; _dbContent.Set().Add(orderProcess); _dbContent.SaveChanges(); return new ApiResult(); } /// /// 支付回写(雏形,需要根据实际需要接入支付宝或微信) /// /// /// public ApiResult PayWriteBack(PayWriteBackRequestDto req) { if (req == null || string.IsNullOrWhiteSpace(req.PaySerialId)) { return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确"); } var order = _dbContent.Set().FirstOrDefault(p => p.PaySerialId == req.PaySerialId); if (order == null) { return new ApiResult(ApiStatusCode.InvalidParameter, "未找到相应订单"); } var status = GetStatusByPayWriteBack(req.PayStatus); // 修改订单状态 order.PayStatus = status.Item1; order.OrderStatus = status.Item2; // 记录订单流程 YW_PayCall payCall = new YW_PayCall() { Id = IdGenerator.NewId(), OrderId = order.Id, PayStatus = status.Item1, PaySerialId = req.PaySerialId, PayAccount = req.PayAccount, CreateBY = req.PayAccount }; _dbContent.Set().Add(payCall); _dbContent.SaveChanges(); return new ApiResult(); } /// /// /// /// /// private Tuple GetStatusByPayWriteBack(int payStatusBack) { // 临时:payStatus 0失败,1成功 PayStatusEnum payStatus = PayStatusEnum.Fail; OrderStatusEnum orderStatus = OrderStatusEnum.UnPay; switch (payStatusBack) { case 1:// 成功 payStatus = PayStatusEnum.Paid; orderStatus = OrderStatusEnum.Paid; break; default:// 失败 break; } return new Tuple(payStatus, orderStatus); } // public Tuple ProcessOrderStock(int ) } }