OrderService.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. using Ant.Core.Utils;
  2. using Ant.Core.WebApi.Enum;
  3. using Ant.Core.WebApi.Model;
  4. using Central.Control.WebApi.DbEntity;
  5. using Central.Control.WebApi.EFDbContext;
  6. using Central.Control.WebApi.Enum;
  7. using Central.Control.WebApi.Models.Request;
  8. using Central.Control.WebApi.Models.Response;
  9. using Central.Control.WebApi.Service.Interface;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Web;
  14. namespace Central.Control.WebApi.Service
  15. {
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. public class OrderService: IOrderService
  20. {
  21. private readonly IDbContext _dbContent;
  22. private readonly IUserService _userService;
  23. /// <summary>
  24. ///
  25. /// </summary>
  26. /// <param name="dbContent"></param>
  27. public OrderService(
  28. IDbContext dbContent,
  29. IUserService userService)
  30. {
  31. _dbContent = dbContent;
  32. _userService = userService;
  33. }
  34. /// <summary>
  35. /// 下单
  36. /// </summary>
  37. /// <param name="req"></param>
  38. /// <returns></returns>
  39. public ApiResult<OrderResponseDto> Order(OrderRequestDto req)
  40. {
  41. #region 1、验证参数
  42. if (req == null
  43. || req.OrderInfo == null
  44. || req.OrderInfo.Count() == 0)
  45. {
  46. return new ApiResult<OrderResponseDto>(ApiStatusCode.InvalidParameter, "请求参数不正确");
  47. }
  48. #endregion
  49. #region 2、验证相应数据和库存
  50. var productIds = req.OrderInfo.Select(p => p.ProductId).ToList();
  51. var products = _dbContent.Set<YW_Product>().Where(p => p.IsDelete == 0 && p.Sale == Enum.SaleEnum.On && productIds.Contains(p.Id)).ToList();
  52. if (products.Count() <= 0)
  53. {
  54. return new ApiResult<OrderResponseDto>(ApiStatusCode.RecordNotFound, "未找到下单的商品");
  55. }
  56. #endregion
  57. #region 3、库存验证
  58. var session = _userService.GetLoginSession();
  59. var orderId = IdGenerator.NewId();
  60. List<YW_OrderDetails> orderDetailAdds = new List<YW_OrderDetails>();
  61. List<YW_OrderProcess> orderProcessAdds = new List<YW_OrderProcess>();
  62. foreach (var o in req.OrderInfo)
  63. {
  64. var currentProduct = products.FirstOrDefault(p => p.Id == o.ProductId);
  65. if (currentProduct == null)
  66. {
  67. return new ApiResult<OrderResponseDto>(ApiStatusCode.RecordNotFound, $"{o.ProductId}商品不存在");
  68. }
  69. if (currentProduct.Stock < o.Count)
  70. {
  71. return new ApiResult<OrderResponseDto>(ApiStatusCode.Forbidden, $"{currentProduct.Name}商品库存不足,请修改后重新下单");
  72. }
  73. // 扣库存
  74. currentProduct.Stock = currentProduct.Stock - o.Count;
  75. // orderDetails
  76. orderDetailAdds.Add(new YW_OrderDetails()
  77. {
  78. Id = IdGenerator.NewId(),
  79. OrderId = orderId,
  80. ProductId = currentProduct.Id,
  81. Name = currentProduct.Name,
  82. Code = currentProduct.Code,
  83. Img = currentProduct.Img,
  84. Info = currentProduct.Info,
  85. Price = currentProduct.Price,
  86. BuyingPrice = currentProduct.BuyingPrice,
  87. Count = o.Count,
  88. CreateBY = session.UserId
  89. });
  90. }
  91. #endregion
  92. #region 4、下单
  93. YW_Order order = new YW_Order()
  94. {
  95. Id = orderId,
  96. DeviceId = session.UserId,
  97. Price = orderDetailAdds.Sum(p => p.Price * p.Count),
  98. PayStatus = PayStatusEnum.UnPay,
  99. OrderStatus = OrderStatusEnum.UnPay,
  100. PaySerialId = Snowflake.Instance().GetId().ToString(),
  101. CreateBY = session.UserId
  102. };
  103. YW_OrderProcess orderProcess = new YW_OrderProcess()
  104. {
  105. Id = IdGenerator.NewId(),
  106. OrderId = order.Id,
  107. DeviceId = session.UserId,
  108. CurrentOrderStatus = OrderStatusEnum.UnPay,
  109. Message = "下单成功",
  110. CreateBY = session.Id
  111. };
  112. #endregion
  113. #region 5、存库
  114. _dbContent.Set<YW_Order>().Add(order);
  115. _dbContent.Set<YW_OrderProcess>().Add(orderProcess);
  116. _dbContent.Set<YW_OrderDetails>().AddRange(orderDetailAdds);
  117. // 数据库执行 库存已经改过了,会自动保存
  118. _dbContent.SaveChanges();
  119. #endregion
  120. return new ApiResult<OrderResponseDto>(new OrderResponseDto()
  121. {
  122. OrderId = order.Id,
  123. Price = order.Price
  124. });
  125. }
  126. /// <summary>
  127. /// 获取待烧烤的商品列表
  128. /// <returns></returns>
  129. public ApiResult<List<QueueOrderResponseDto>> GetQueueOrders()
  130. {
  131. var orders = _dbContent.Set<YW_Order>()
  132. .Where(p => p.IsDelete == 0
  133. && p.PayStatus == PayStatusEnum.Paid
  134. && p.OrderStatus == OrderStatusEnum.Paid)
  135. .OrderBy(p => p.CreateDT).ToList();
  136. var orderIds = orders.Select(p => p.Id).ToList();
  137. var orderDetails = _dbContent.Set<YW_OrderDetails>().Where(p => p.IsDelete == 0 && orderIds.Contains(p.OrderId)).ToList();
  138. List<QueueOrderResponseDto> result = new List<QueueOrderResponseDto>();
  139. orders.ForEach(item => {
  140. QueueOrderResponseDto resultItem = new QueueOrderResponseDto()
  141. {
  142. OrderId = item.Id,
  143. Price = item.Price,
  144. OrderDetails = orderDetails
  145. .Where(p => p.OrderId == item.Id)
  146. .Select(p => SafeClone<YW_OrderDetails, QueueOrderDetailsDto>.Trans(p))
  147. .ToList()
  148. };
  149. resultItem.OrderDetails?.ForEach(p => p.Img = $"{ProductService.ImagePrefix}{p.Img}");
  150. result.Add(resultItem);
  151. });
  152. return new ApiResult<List<QueueOrderResponseDto>>(result);
  153. }
  154. /// <summary>
  155. /// 回写流程状态
  156. /// </summary>
  157. /// <param name="req"></param>
  158. /// <returns></returns>
  159. public ApiResult OrderProcess(OrderProcessRequestDto req)
  160. {
  161. if (req == null)
  162. {
  163. return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确");
  164. }
  165. var order = _dbContent.Set<YW_Order>().FirstOrDefault(p => p.Id == req.OrderId);
  166. if (order == null)
  167. {
  168. return new ApiResult(ApiStatusCode.InvalidParameter, "未找到相应订单");
  169. }
  170. if (order.PayStatus != PayStatusEnum.Paid)
  171. {
  172. return new ApiResult(ApiStatusCode.InvalidParameter, "未支付订单不能回写流程");
  173. }
  174. if (order.OrderStatus == OrderStatusEnum.UnPay
  175. || order.OrderStatus == OrderStatusEnum.Cancel)
  176. {
  177. return new ApiResult(ApiStatusCode.InvalidParameter, "未支付或已取消订单不能回写流程");
  178. }
  179. var seesion = _userService.GetLoginSession();
  180. // 修改订单状态
  181. order.OrderStatus = req.OrderStatus;
  182. // 记录订单流程
  183. YW_OrderProcess orderProcess = new YW_OrderProcess()
  184. {
  185. Id = IdGenerator.NewId(),
  186. OrderId = req.OrderId,
  187. DeviceId = seesion.UserId,
  188. CurrentOrderStatus = req.OrderStatus,
  189. Message = req.Message,
  190. CreateBY = seesion.UserId
  191. };
  192. _dbContent.Set<YW_OrderProcess>().Add(orderProcess);
  193. _dbContent.SaveChanges();
  194. return new ApiResult();
  195. }
  196. /// <summary>
  197. /// 支付回写(雏形,需要根据实际需要接入支付宝或微信)
  198. /// </summary>
  199. /// <param name="req"></param>
  200. /// <returns></returns>
  201. public ApiResult PayWriteBack(PayWriteBackRequestDto req)
  202. {
  203. if (req == null
  204. || string.IsNullOrWhiteSpace(req.PaySerialId))
  205. {
  206. return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确");
  207. }
  208. var order = _dbContent.Set<YW_Order>().FirstOrDefault(p => p.PaySerialId == req.PaySerialId);
  209. if (order == null)
  210. {
  211. return new ApiResult(ApiStatusCode.InvalidParameter, "未找到相应订单");
  212. }
  213. var status = GetStatusByPayWriteBack(req.PayStatus);
  214. // 修改订单状态
  215. order.PayStatus = status.Item1;
  216. order.OrderStatus = status.Item2;
  217. // 记录订单流程
  218. YW_PayCall payCall = new YW_PayCall()
  219. {
  220. Id = IdGenerator.NewId(),
  221. OrderId = order.Id,
  222. PayStatus = status.Item1,
  223. PaySerialId = req.PaySerialId,
  224. PayAccount = req.PayAccount,
  225. CreateBY = req.PayAccount
  226. };
  227. _dbContent.Set<YW_PayCall>().Add(payCall);
  228. _dbContent.SaveChanges();
  229. return new ApiResult();
  230. }
  231. /// <summary>
  232. ///
  233. /// </summary>
  234. /// <param name="payStatusBack"></param>
  235. /// <returns></returns>
  236. private Tuple<PayStatusEnum, OrderStatusEnum> GetStatusByPayWriteBack(int payStatusBack)
  237. {
  238. // 临时:payStatus 0失败,1成功
  239. PayStatusEnum payStatus = PayStatusEnum.Fail;
  240. OrderStatusEnum orderStatus = OrderStatusEnum.UnPay;
  241. switch (payStatusBack)
  242. {
  243. case 1:// 成功
  244. payStatus = PayStatusEnum.Paid;
  245. orderStatus = OrderStatusEnum.Paid;
  246. break;
  247. default:// 失败
  248. break;
  249. }
  250. return new Tuple<PayStatusEnum, OrderStatusEnum>(payStatus, orderStatus);
  251. }
  252. // public Tuple<bool,string> ProcessOrderStock(int )
  253. }
  254. }