private async Task <WorkerOrderNumberStatus?> GetStatus(Guid shopId, WorkOrderNumber number) { var searchNumber = ToPointElement(number); var pointElement = await storage.FirstOrDefaultAsync(x => x.ShopId == shopId && x.Point == searchNumber); return(pointElement?.Status); }
private async Task <WorkOrderNumber> FindFirstAvailableNumber(Guid shopId, WorkOrderNumber number) { while (true) { var searchNumber = ToPointElement(number); var points = (await storage.Table .Where(x => x.ShopId == shopId && x.Point.CompareTo(searchNumber) >= 0) .Take(1000) .ExecuteAsync()) .Select(ToModel) .ToArray(); foreach (var point in points) { if (number < point) { return(number); } if (number == WorkOrderNumber.Max) { number = WorkOrderNumber.Min; break; } number += 1; } if (points.Length < 1000) { return(number); } } }
public async Task FreeNumberAsync(Guid shopId, WorkOrderNumber number) { using (await locker.LockAsync(GetLockId(shopId))) { var searchNumber = ToPointElement(number); await storage.DeleteAsync(x => x.ShopId == shopId && x.Point == searchNumber); } }
private static WorkerOrderNumberStorageElement ToStorageElement(Guid shopId, WorkOrderNumber point, WorkerOrderNumberStatus status) { return(new WorkerOrderNumberStorageElement { ShopId = shopId, Point = ToPointElement(point), Status = status, }); }
public void OrderTest(string lessSeries, int lessNumber, string greaterSeries, int greaterNumber) { var less = new WorkOrderNumber(lessSeries, lessNumber); var greater = new WorkOrderNumber(greaterSeries, greaterNumber); (less < greater).Should().BeTrue(); (greater < less).Should().BeFalse(); (greater > less).Should().BeTrue(); (less > greater).Should().BeFalse(); }
public async Task <bool> TryMakeNumberUsedAsync(Guid shopId, WorkOrderNumber number) { using (await locker.LockAsync(GetLockId(shopId))) { if (await GetStatus(shopId, number) == WorkerOrderNumberStatus.Used) { return(false); } await storage.WriteAsync(ToStorageElement(shopId, number, WorkerOrderNumberStatus.Used)); return(true); } }
private WorkOrder ToModelInfo(WorkOrderStorageElement storageElement) { return(new WorkOrder { Id = storageElement.OrderId, DocumentStatus = (WorkOrderDocumentStatus)Enum.Parse(typeof(WorkOrderDocumentStatus), storageElement.DocumentStatus), Status = (WorkOrderStatus)Enum.Parse(typeof(WorkOrderStatus), storageElement.Status), Number = WorkOrderNumber.Parse(storageElement.OrderNumber), TotalSum = storageElement.TotalSum, ReceptionDate = mapper.Map <DateTime>(storageElement.ReceptionDate), FirstProductId = storageElement.FirstProductId, ClientId = storageElement.ClientId, }); }
public async Task <WorkOrderNumber?> GetLastWorkOrderNumberAsync(Guid shopId) { var serializedNumber = await storage.FirstOrDefaultAsync(x => x.ShopId == shopId, x => x.OrderNumber); return(serializedNumber != null?WorkOrderNumber.Parse(serializedNumber) : (WorkOrderNumber?)null); }
public void ParseTest(string value, string expectedSeries, int expectedNumber) { WorkOrderNumber.Parse(value).Should().BeEquivalentTo(new WorkOrderNumber(expectedSeries, expectedNumber)); }
public async Task <WorkOrderNumber> ReserveFirstAvailableNumberAsync(Guid shopId, WorkOrderNumber startNumber) { using (await locker.LockAsync(GetLockId(shopId))) { if (await GetStatus(shopId, startNumber) == null) { await storage.WriteAsync(ToStorageElement(shopId, startNumber, WorkerOrderNumberStatus.Reserved)); return(startNumber); } var findFromNumber = startNumber == WorkOrderNumber.Max ? WorkOrderNumber.Min : startNumber + 1; var number = await FindFirstAvailableNumber(shopId, findFromNumber); await storage.WriteAsync(ToStorageElement(shopId, number, WorkerOrderNumberStatus.Reserved), (int)72.Hours().TotalSeconds); return(number); } }
private static string ToPointElement(WorkOrderNumber point) { return(point.ToString()); }
private static WorkOrderNumber ToModel(WorkerOrderNumberStorageElement storageElement) { return(WorkOrderNumber.Parse(storageElement.Point)); }
public WorkOrderBuilder WithNumber(WorkOrderNumber number) { workOrder.Number = number; return(this); }