Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
 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();
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 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,
     });
 }
Ejemplo n.º 8
0
        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));
 }
Ejemplo n.º 10
0
        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);
            }
        }
Ejemplo n.º 11
0
 private static string ToPointElement(WorkOrderNumber point)
 {
     return(point.ToString());
 }
Ejemplo n.º 12
0
 private static WorkOrderNumber ToModel(WorkerOrderNumberStorageElement storageElement)
 {
     return(WorkOrderNumber.Parse(storageElement.Point));
 }
Ejemplo n.º 13
0
 public WorkOrderBuilder WithNumber(WorkOrderNumber number)
 {
     workOrder.Number = number;
     return(this);
 }