| | | 1 | | using OzonDomains; |
| | | 2 | | using OzonDomains.Models; |
| | | 3 | | using OzonDomains.Models.OrderCarts; |
| | | 4 | | using OzonDomains.Models.OrderCarts.Cart; |
| | | 5 | | using OzonRepositories.Data; |
| | | 6 | | using Services.Builders; |
| | | 7 | | using Services.CacheServices.Cache.OrderSummaryCache; |
| | | 8 | | using Services.SignalRServices; |
| | | 9 | | |
| | | 10 | | namespace Services.DataServices; |
| | | 11 | | |
| | | 12 | | public class OrderCartServices : IDataServices |
| | | 13 | | { |
| | | 14 | | private readonly OrderCartRepository _orderCartRepository; |
| | | 15 | | private readonly OrdersDataServices _ordersDataServices; |
| | | 16 | | private readonly OrderItemRepository _orderItemRepository; |
| | | 17 | | private readonly IOrderSummaryCache _orderSummaryCache; |
| | | 18 | | |
| | | 19 | | |
| | 0 | 20 | | public static readonly Dictionary<string, string> Statuses = new() |
| | 0 | 21 | | { |
| | 0 | 22 | | { "MakeOrderError", "Заказ не создан" }, |
| | 0 | 23 | | { "MakeOrderProgress", "Заказ в стадии оформления" } |
| | 0 | 24 | | }; |
| | | 25 | | |
| | 0 | 26 | | public OrderCartServices(OrderCartRepository orderCartRepository, |
| | 0 | 27 | | OrdersDataServices ordersDataServices, |
| | 0 | 28 | | OrderItemRepository orderItemRepository, |
| | 0 | 29 | | IOrderSummaryCache orderSummaryCache) |
| | | 30 | | { |
| | 0 | 31 | | _orderCartRepository = orderCartRepository; |
| | 0 | 32 | | _ordersDataServices = ordersDataServices; |
| | 0 | 33 | | _orderItemRepository = orderItemRepository; |
| | 0 | 34 | | _orderSummaryCache = orderSummaryCache; |
| | 0 | 35 | | } |
| | | 36 | | |
| | | 37 | | public async Task<List<int>> CreateCartItem(List<StockItem>? selectedStocks) |
| | | 38 | | { |
| | 0 | 39 | | if (selectedStocks == null || selectedStocks.Count == 0) |
| | 0 | 40 | | return new List<int>(); |
| | | 41 | | |
| | 0 | 42 | | List<OrderItem> orderItems = new List<OrderItem>(); |
| | 0 | 43 | | var ordersToUpdate = new List<Order>(); |
| | | 44 | | |
| | 0 | 45 | | foreach (var item in selectedStocks) |
| | | 46 | | { |
| | 0 | 47 | | var orderToCart = await _ordersDataServices.GetOrder(item.OrderId); |
| | 0 | 48 | | if (orderToCart == null) |
| | | 49 | | continue; |
| | | 50 | | |
| | 0 | 51 | | OrderItem newOrderItem = new OrderItem() |
| | 0 | 52 | | { |
| | 0 | 53 | | ItemId = item.StokId ?? "", |
| | 0 | 54 | | Quantity = orderToCart.Quantity ?? 0, |
| | 0 | 55 | | StudioOrderId = orderToCart.Id, |
| | 0 | 56 | | StudioOrder = orderToCart, |
| | 0 | 57 | | ItemStatus = new ItemStatus() |
| | 0 | 58 | | { |
| | 0 | 59 | | Name = "Добавлен в корзину" |
| | 0 | 60 | | } |
| | 0 | 61 | | }; |
| | 0 | 62 | | orderItems.Add(newOrderItem); |
| | 0 | 63 | | ordersToUpdate.Add(orderToCart); |
| | 0 | 64 | | } |
| | | 65 | | |
| | 0 | 66 | | OrderCart newCart = new OrderCart() |
| | 0 | 67 | | { |
| | 0 | 68 | | Provider = "maxi_parts", |
| | 0 | 69 | | OrderItems = orderItems, |
| | 0 | 70 | | CartStatus = new CartStatus() |
| | 0 | 71 | | { |
| | 0 | 72 | | Name = "Новый элемент" |
| | 0 | 73 | | } |
| | 0 | 74 | | }; |
| | | 75 | | |
| | 0 | 76 | | var result = await _orderCartRepository.Add(newCart); |
| | | 77 | | |
| | 0 | 78 | | foreach (var order in ordersToUpdate) |
| | | 79 | | { |
| | 0 | 80 | | var correspondingItem = orderItems.FirstOrDefault(oi => oi.StudioOrderId == order.Id); |
| | 0 | 81 | | if (correspondingItem != null) |
| | | 82 | | { |
| | 0 | 83 | | order.CartItemId = correspondingItem.Id; |
| | | 84 | | } |
| | | 85 | | } |
| | | 86 | | |
| | 0 | 87 | | await _ordersDataServices.SaveChanges(); |
| | 0 | 88 | | var failedOrderIds = await ProcessMaxiPartsOrderAsync(newCart.OrderItems.ToList(), newCart.Id); |
| | | 89 | | |
| | 0 | 90 | | foreach (var failedId in failedOrderIds) |
| | | 91 | | { |
| | 0 | 92 | | var failedItem = newCart.OrderItems.FirstOrDefault(oi => oi.StudioOrderId == failedId); |
| | 0 | 93 | | if (failedItem != null) |
| | | 94 | | { |
| | 0 | 95 | | await _orderItemRepository.Delete(failedItem); |
| | | 96 | | } |
| | | 97 | | } |
| | | 98 | | |
| | 0 | 99 | | return failedOrderIds; |
| | 0 | 100 | | } |
| | | 101 | | |
| | | 102 | | public async Task<List<int>> ProcessMaxiPartsOrderAsync(List<OrderItem> cartItems, int newCartId) |
| | | 103 | | { |
| | 0 | 104 | | var summaryBuilder = new OrderSummaryTableBuilder(); |
| | 0 | 105 | | var failedOrderIds = new List<int>(); |
| | | 106 | | const string reason = "Интеграция MaxiParts/Tradesoft отключена"; |
| | 0 | 107 | | foreach (var item in cartItems) |
| | | 108 | | { |
| | 0 | 109 | | if (item.StudioOrder == null) |
| | | 110 | | continue; |
| | | 111 | | |
| | 0 | 112 | | string shipmentNumber = item.StudioOrder.ShipmentNumber ?? "N/A"; |
| | 0 | 113 | | summaryBuilder.AddRow(shipmentNumber, false, reason); |
| | 0 | 114 | | failedOrderIds.Add(item.StudioOrder.Id); |
| | | 115 | | } |
| | | 116 | | |
| | 0 | 117 | | var htmlTable = summaryBuilder.Build(); |
| | 0 | 118 | | await NotificationService.NotifyAllAsync(htmlTable); |
| | 0 | 119 | | _orderSummaryCache.Set(cartId: newCartId, htmlTable); |
| | | 120 | | |
| | 0 | 121 | | return failedOrderIds; |
| | 0 | 122 | | } |
| | | 123 | | |
| | | 124 | | public List<ItemStatus> GetCartItemStatuses() |
| | | 125 | | { |
| | 0 | 126 | | return _orderItemRepository.GetCartItemStatuses(); |
| | | 127 | | } |
| | | 128 | | |
| | | 129 | | public List<StatusColor> GetStatusColors() |
| | | 130 | | { |
| | 0 | 131 | | return _orderItemRepository.GetStatusColors(); |
| | | 132 | | } |
| | | 133 | | |
| | | 134 | | public void UpdateStatusColor(int statusId, string colorCode) |
| | | 135 | | { |
| | 0 | 136 | | _orderItemRepository.UpdateStatusColor(statusId, colorCode); |
| | 0 | 137 | | } |
| | | 138 | | |
| | | 139 | | public Task<int> SaveChanges() |
| | | 140 | | { |
| | 0 | 141 | | throw new NotImplementedException(); |
| | | 142 | | } |
| | | 143 | | |
| | | 144 | | public void ResetStatusColor(int statusId) |
| | | 145 | | { |
| | 0 | 146 | | _orderItemRepository.ResetStatusColor(statusId); |
| | 0 | 147 | | } |
| | | 148 | | |
| | | 149 | | public async Task<int> DeleteByOrder(int orderId) |
| | | 150 | | { |
| | 0 | 151 | | return await _orderCartRepository.DeleteByOrder(orderId); |
| | 0 | 152 | | } |
| | | 153 | | |
| | | 154 | | /// <summary> |
| | | 155 | | /// Удаляет элементы корзины для нескольких заказов одним запросом (ускорение страницы транзакций). |
| | | 156 | | /// </summary> |
| | | 157 | | public async Task<int> DeleteByOrderIds(int[] orderIds) |
| | | 158 | | { |
| | 0 | 159 | | return await _orderCartRepository.DeleteByOrderIds(orderIds); |
| | 0 | 160 | | } |
| | | 161 | | } |