Exemple #1
0
        public async Task <TResult> Handle(TCommand request, CancellationToken cancellationToken)
        {
            //Validation
            Type     typeValidation    = typeof(TCommand);
            Assembly assembly          = Assembly.GetAssembly(typeValidation);
            var      validatorBaseType = typeof(AbstractValidator <>).MakeGenericType(typeValidation);
            var      validatorType     = assembly.GetTypes().FirstOrDefault(type => type.IsSubclassOf(validatorBaseType));

            if (validatorType != null)
            {
                var validator            = Activator.CreateInstance(validatorType);
                var method               = validatorBaseType.GetMethods().Where(m => m.Name == "Validate" && m.GetParameters()[0].ParameterType == typeValidation).First();
                ValidationResult results = (ValidationResult)method.Invoke(validator, new object[] { request });
                if (!results.IsValid)
                {
                    List <APIResult> returnErrors = new List <APIResult>();
                    foreach (var error in results.Errors)
                    {
                        returnErrors.Add(new APIResult()
                        {
                            Result       = -1,
                            ErrorMessage = error.ErrorMessage
                        });
                    }
                    throw new BusinessException(JsonConvert.SerializeObject(returnErrors));
                }
            }
            if (request.CmdStyle == CommandStyles.Normal)
            {
                return(await HandleCommand(request, cancellationToken));
            }
            else if (request.CmdStyle == CommandStyles.Transaction)
            {
                if (CachingCommandTransaction.TryGetValue(request.CommandId, out CachingCommandTransactionModel transModel))
                {
                    return(await HandleCommandTransaction(request, transModel, cancellationToken));
                }
                else
                {
                    var conn = DALHelper.GetConnection();
                    conn.Open();
                    var trans = conn.BeginTransaction();
                    transModel = new CachingCommandTransactionModel()
                    {
                        Connection  = conn,
                        Transaction = trans
                    };
                    if (CachingCommandTransaction.TrySetValue(request.CommandId, transModel))
                    {
                        return(await HandleCommandTransaction(request, transModel, cancellationToken));
                    }
                    else
                    {
                        throw new BusinessException("Common.CachingData.SetError");
                    }
                }
            }
            else if (request.CmdStyle == CommandStyles.CommitTransaction)
            {
                if (!CachingCommandTransaction.TryGetValue(request.CommandId, out CachingCommandTransactionModel transModel))
                {
                    throw new BusinessException("Common.CachingData.GetError");
                }

                transModel.Transaction.Commit();
                transModel.Transaction.Dispose();
                transModel.Connection.Dispose();

                //Remove TransModel
                CachingCommandTransaction.TryRemoveCaching <CachingCommandTransactionModel>(request.CommandId);
                return(default(TResult));
            }
            else //Rollback Transaction
            {
                if (!CachingCommandTransaction.TryGetValue(request.CommandId, out CachingCommandTransactionModel transModel))
                {
                    throw new BusinessException("Common.CachingData.GetError");
                }

                transModel.Transaction.Rollback();
                transModel.Transaction.Dispose();
                transModel.Connection.Dispose();

                //Remove TransModel
                CachingCommandTransaction.TryRemoveCaching <CachingCommandTransactionModel>(request.CommandId);
                return(default(TResult));
            }
        }
Exemple #2
0
 public virtual Task <TResult> HandleCommandTransaction(TCommand request, CachingCommandTransactionModel trans, CancellationToken cancellationToken)
 {
     return(default(Task <TResult>));
 }
        public override async Task <int> HandleCommandTransaction(UpdateCommand request, CachingCommandTransactionModel trans, CancellationToken cancellationToken)
        {
            if ((request.Direction != 1 && request.Direction != 2) || request.CollectionId == 0 || string.IsNullOrEmpty(request.TraceCode) || request.Quantity <= 0)
            {
                throw new BusinessException("AddWrongInformation");
            }

            var employee = await WebHelper.HttpGet <Employee>(GlobalConfiguration.APIGateWayURI, AppUrl.GetEmployeeByUser, request.LoginSession.AccessToken);

            if (employee == null)
            {
                throw new NotPermissionException();
            }
            var collection = (await collectionQueries.GetsByEmployeeId(employee.Id)).FirstOrDefault(c => c.Id == request.CollectionId);

            if (collection == null)
            {
                throw new NotPermissionException();
            }


            collectionInventoryQueries.JoinTransaction(trans.Connection, trans.Transaction);
            collectionInventoryRepository.JoinTransaction(trans.Connection, trans.Transaction);
            collectionInventoryHistoryRepository.JoinTransaction(trans.Connection, trans.Transaction);

            var inventory = await collectionInventoryQueries.GetByTraceCode(request.TraceCode);

            if (inventory == null)
            {
                if (request.Direction == 0)
                {
                    throw new BusinessException("Collection.Inventory.TraceCode.NotExisted");
                }

                await collectionInventoryRepository.Add(new MDM.UI.Collections.Models.CollectionInventory()
                {
                    CollectionId = request.CollectionId,
                    ProductId    = request.ProductId,
                    UoMId        = request.UoMId,
                    TraceCode    = request.TraceCode,
                    Quantity     = request.Quantity,
                    ModifiedBy   = request.LoginSession.Id,
                    ModifiedDate = DateTime.Now
                });

                await collectionInventoryHistoryRepository.Add(new MDM.UI.Collections.Models.CollectionInventoryHistory()
                {
                    TraceCode    = request.TraceCode,
                    CollectionId = request.CollectionId,
                    ProductId    = request.ProductId,
                    UoMId        = request.UoMId,
                    Direction    = request.Direction,
                    Quantity     = request.Quantity,
                    LastQuantity = request.Quantity,
                    CreatedDate  = DateTime.Now,
                    CreatedBy    = request.LoginSession.Id,
                    Reason       = request.Reason
                });
            }
            else
            {
                if (request.CollectionId != inventory.CollectionId)
                {
                    throw new BusinessException("Collection.Inventory.TraceCode.NotSameCollection");
                }

                var quantity = inventory.Quantity + (request.Direction == 1 ? request.Quantity : -request.Quantity);
                if (request.Direction == 0 && quantity < 0)
                {
                    throw new BusinessException("Collection.Inventory.TraceCode.NotEnoughQuantity");
                }

                if (quantity == 0)
                {
                    await collectionInventoryRepository.Delete(inventory.Id);
                }
                else
                {
                    inventory.Quantity     = quantity;
                    inventory.ModifiedDate = DateTime.Now;
                    inventory.ModifiedBy   = request.LoginSession.Id;
                    await collectionInventoryRepository.Update(inventory);
                }
                await collectionInventoryHistoryRepository.Add(new MDM.UI.Collections.Models.CollectionInventoryHistory()
                {
                    TraceCode    = request.TraceCode,
                    CollectionId = request.CollectionId,
                    ProductId    = request.ProductId,
                    UoMId        = request.UoMId,
                    Direction    = request.Direction,
                    Quantity     = request.Quantity,
                    LastQuantity = quantity,
                    CreatedDate  = DateTime.Now,
                    CreatedBy    = request.LoginSession.Id,
                    Reason       = request.Reason
                });
            }

            return(0);
        }
Exemple #4
0
        public override async Task <int> HandleCommandTransaction(UpdateItemStatusCommand request, CachingCommandTransactionModel trans, CancellationToken cancellationToken)
        {
            if (request.OrderId == 0 && request.OrderItemId == 0)
            {
                throw new BusinessException("OrderItem.NotExisted");
            }

            if (!Enum.IsDefined(typeof(RetailerOrderStatuses), request.StatusId))
            {
                throw new BusinessException("Order.NotExistedStatus");
            }

            retailerOrderQueries.JoinTransaction(trans.Connection, trans.Transaction);

            var order = await retailerOrderQueries.Get(request.OrderId);

            if (order != null)
            {
                if (request.StatusId == (int)RetailerOrderStatuses.Canceled && order.StatusId != (int)RetailerOrderStatuses.Ordered)
                {
                    //Cancel the order that is comfirmed.
                    throw new BusinessException("Order.CantCanceled");
                }
                else if (order.StatusId <= request.StatusId)
                {
                    //wrong step; dump data
                    throw new BusinessException("Order.WrongStep");
                }

                retailerOrderRepository.JoinTransaction(trans.Connection, trans.Transaction);
                var item = order.Items.FirstOrDefault(i => i.Id == request.OrderItemId);
                if (item == null)
                {
                    throw new BusinessException("OrderItem.NotExisted");
                }

                item.StatusId = request.StatusId;

                await retailerOrderRepository.UpdateItem(item);

                await retailerOrderRepository.AddAudit(new UI.Models.RetailerOrderAudit()
                {
                    RetailerId          = order.RetailerId,
                    RetailerOrderId     = order.Id,
                    RetailerOrderItemId = item.Id,
                    StatusId            = request.StatusId,
                    CreatedBy           = request.LoginSession.Id,
                    CreatedDate         = DateTime.Now,
                    Note = string.Empty
                });

                order.StatusId = request.StatusId;
                order          = UpdateBuild(order, request.LoginSession);
                return(await retailerOrderRepository.Update(order));
            }

            throw new BusinessException("OrderItem.NotExisted");
        }
Exemple #5
0
        public async Task <TResult> Handle(TCommand request, CancellationToken cancellationToken)
        {
            //Validation
            Type     typeValidation    = typeof(TCommand);
            Assembly assembly          = Assembly.GetAssembly(typeValidation);
            var      validatorBaseType = typeof(AbstractValidator <>).MakeGenericType(typeValidation);
            var      validatorType     = assembly.GetTypes().FirstOrDefault(type => type.IsSubclassOf(validatorBaseType));

            if (validatorType != null)
            {
                var validator            = Activator.CreateInstance(validatorType);
                var method               = validatorBaseType.GetMethods().First(m => m.Name == "Validate" && m.GetParameters()[0].ParameterType == typeValidation);
                ValidationResult results = (ValidationResult)method.Invoke(validator, new object[] { request });
                if (!results.IsValid)
                {
                    IEnumerable <ApiResult> returnErrors = from error
                                                           in results.Errors
                                                           select new ApiResult()
                    {
                        Result = -1, ErrorMessage = error.ErrorMessage
                    };

                    throw new BusinessException(JsonConvert.SerializeObject(returnErrors));
                }
            }
            CachingCommandTransactionModel transModel = null;

            switch (request.CmdStyle)
            {
            case CommandStyles.Normal:
                return(await HandleCommand(request, cancellationToken));

            case CommandStyles.Transaction:
                if (CachingCommandTransaction.TryGetValue(CachingConstant.CACHINGCOMMAND, request.CommandId, out transModel))
                {
                    return(await HandleCommandTransaction(request, transModel, cancellationToken));
                }

                var conn = DalHelper.GetConnection();
                conn.Open();
                var trans = conn.BeginTransaction();
                transModel = new CachingCommandTransactionModel()
                {
                    Connection  = conn,
                    Transaction = trans
                };
                if (!CachingCommandTransaction.TrySetValue(CachingConstant.CACHINGCOMMAND, request.CommandId, transModel))
                {
                    throw new BusinessException("Common.CachingData.SetError");
                }

                return(await HandleCommandTransaction(request, transModel, cancellationToken));

            case CommandStyles.CommitTransaction:
                if (!CachingCommandTransaction.TryGetValue(CachingConstant.CACHINGCOMMAND, request.CommandId, out transModel))
                {
                    throw new BusinessException("Common.CachingData.GetError");
                }

                transModel.Transaction.Commit();
                transModel.Transaction.Dispose();
                transModel.Connection.Dispose();

                //Remove TransModel
                CachingCommandTransaction.TryRemoveValue <CachingCommandTransactionModel>(CachingConstant.CACHINGCOMMAND, request.CommandId);
                return(default);

            default:
                if (!CachingCommandTransaction.TryGetValue(CachingConstant.CACHINGCOMMAND, request.CommandId, out transModel))
                {
                    throw new BusinessException("Common.CachingData.GetError");
                }

                transModel.Transaction.Rollback();
                transModel.Transaction.Dispose();
                transModel.Connection.Dispose();

                //Remove TransModel
                CachingCommandTransaction.TryRemoveValue <CachingCommandTransactionModel>(CachingConstant.CACHINGCOMMAND, request.CommandId);
                return(default);
            }
        }