Esempio n. 1
0
        private static string NewNumber(INumberedEntity entity, NumberedEntityOption option, IUnitOfWork uow)
        {
            var key = CreateEntityKey(entity, option.Fields, uow);

            uow.AcquireDistributedLock(key);

            var number = option.Start.ToString(CultureInfo.InvariantCulture);

            var numberedEntity = uow.Set <NumberedEntity>().AsNoTracking().FirstOrDefault(a => a.EntityName == key);

            if (numberedEntity == null)
            {
                uow.ExecuteSqlRawCommand(
                    "INSERT INTO [dbo].[NumberedEntity]([EntityName], [NextValue]) VALUES(@p0,@p1)",
                    key,
                    option.Start + option.IncrementBy);
            }
            else
            {
                number = numberedEntity.NextValue.ToString(CultureInfo.InvariantCulture);
                uow.ExecuteSqlRawCommand(
                    "UPDATE [dbo].[NumberedEntity] SET [NextValue] = @p0 WHERE [Id] = @p1 ",
                    numberedEntity.NextValue + option.IncrementBy, numberedEntity.Id);
            }

            if (!string.IsNullOrEmpty(option.Prefix))
            {
                number = option.Prefix + number;
            }

            return(number);
        }
        private string BuildEntityKey(INumberedEntity entity, NumberedEntityOption option)
        {
            var type = entity.GetType();

            var key = $"{type.FullName}";

            foreach (var fieldName in option.FieldNames)
            {
                var value = _uow.Entry(entity).Property(fieldName).CurrentValue;
                switch (value)
                {
                case DateTimeOffset dateTimeOffset:
                    value = dateTimeOffset.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                    break;

                case DateTime dateTime:
                    value = dateTime.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                    break;
                }

                key += $"_{fieldName}_{value}";
            }

            if (typeof(ITenantEntity).IsAssignableFrom(type))
            {
                key = $"Tenant_{_tenant.Value.Name}_{key}";
            }

            return(key);
        }
Esempio n. 3
0
        private string BuildEntityKey(INumberedEntity entity, NumberedEntityOption option, IUnitOfWork uow)
        {
            var type = entity.GetType();

            var key = $"{type.FullName}";

            foreach (var fieldName in option.FieldNames)
            {
                var value = uow.Entry(entity).Property(fieldName).CurrentValue;
                switch (value)
                {
                case DateTimeOffset dateTimeOffset:
                    value = dateTimeOffset.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                    break;

                case DateTime dateTime:
                    value = dateTime.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                    break;
                }

                key += $"_{fieldName}_{value}";
            }

            return(key);
        }
        private string BuildNumber(INumberedEntity entity, NumberedEntityOption option)
        {
            var key = BuildEntityKey(entity, option);

            _uow.AcquireDistributedLock(key);

            var number = option.Start.ToString();

            var numberedEntity = _uow.Set <NumberedEntity>().AsNoTracking().FirstOrDefault(a => a.EntityName == key);

            if (numberedEntity == null)
            {
                _uow.ExecuteSqlCommand(
                    "INSERT INTO [dbo].[NumberedEntity]([EntityName], [NextNumber]) VALUES(@p0,@p1)",
                    key,
                    option.Start + option.IncrementBy);
            }
            else
            {
                number = numberedEntity.NextNumber.ToString();
                _uow.ExecuteSqlCommand(
                    "UPDATE [dbo].[NumberedEntity] SET [NextNumber] = @p0 WHERE [Id] = @p1 ",
                    numberedEntity.NextNumber + option.IncrementBy, numberedEntity.Id);
            }

            if (!string.IsNullOrEmpty(option.Prefix))
            {
                number = option.Prefix + number;
            }

            return(number);
        }
Esempio n. 5
0
        private bool IsUniqueNumber(INumberedEntity entity, string number, NumberedEntityOption option, IUnitOfWork uow)
        {
            using (var command = uow.Connection.CreateCommand())
            {
                var parameterNames = option.FieldNames.Aggregate(string.Empty,
                                                                 (current, fieldName) => current + $"AND [t0].[{fieldName}] = @{fieldName} ");

                var tableName = uow.Entry(entity).Metadata.GetTableName();
                command.CommandText = $@"SELECT
                    (CASE
                WHEN EXISTS(
                    SELECT NULL AS [EMPTY]
                        FROM [{tableName}] AS [t0]
                        WHERE [t0].[Number] = @Number {parameterNames}
                ) THEN 1
                ELSE 0
                END) [Value]";

                var parameter = command.CreateParameter();
                parameter.ParameterName = "@Number";
                parameter.Value         = number;
                parameter.DbType        = DbType.String;
                command.Parameters.Add(parameter);

                foreach (var fieldName in option.FieldNames)
                {
                    var p = command.CreateParameter();

                    var value = uow.Entry(entity).Property(fieldName).CurrentValue;
                    switch (value)
                    {
                    case DateTimeOffset dateTimeOffset:
                        value = dateTimeOffset.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                        break;

                    case DateTime dateTime:
                        value = dateTime.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                        break;
                    }

                    p.Value         = value;
                    p.ParameterName = $"@{fieldName}";
                    p.DbType        = SqlHelper.TypeMap[value.GetType()];

                    command.Parameters.Add(p);
                }

                command.Transaction = uow.Transaction.GetDbTransaction();

                var result = command.ExecuteScalar();

                return(!Convert.ToBoolean(result));
            }
        }