public async Task <ResultMessage <bool> > CreateTenant([FromBody] SynchronizeTenantDto input) { var otherSystem = _principalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == "SplitPackageOtherSystemId"); if (string.IsNullOrEmpty(otherSystem?.Value)) { throw new UserFriendlyException("不存在该系统标识"); } return(new ResultMessage <bool>(ResultCode.Success, "success", await _tenantService.CreateTenant(input, long.Parse(otherSystem.Value)))); }
public async Task <bool> CreateTenant(SynchronizeTenantDto dto, long otherSystemId) { using (var unitOfWork = _unitOfWorkManager.Begin()) { var tenant = new Tenant() { TenancyName = dto.TenantName, Name = dto.Name, ApiKey = dto.TenantName, OtherSystemId = otherSystemId }; await _tenantManager.CreateAsync(tenant); await _unitOfWorkManager.Current.SaveChangesAsync(); // To get new tenant's id. // We are working entities of new tenant, so changing tenant filter using (_unitOfWorkManager.Current.SetTenantId(tenant.Id)) { // Create static roles for new tenant CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id)); await _unitOfWorkManager.Current.SaveChangesAsync(); // To get static role ids // Grant all permissions to admin role var adminRole = _roleManager.Roles.Single(r => r.Name == StaticRoleNames.Tenants.Admin); await _roleManager.GrantAllPermissionsAsync(adminRole); // Create admin user for the tenant var adminUser = User.CreateTenantAdminUser(tenant.Id, "*****@*****.**"); adminUser.Password = _passwordHasher.HashPassword(adminUser, User.DefaultPassword); CheckErrors(await _userManager.CreateAsync(adminUser)); await _unitOfWorkManager.Current.SaveChangesAsync(); // To get admin user's id // Assign admin user to role! CheckErrors(await _userManager.AddToRoleAsync(adminUser, adminRole.Name)); List <long> addSet = new List <long>(); foreach (var item in dto.Channels) { var channel = await this._lcRepository.GetAll().IgnoreQueryFilters().FirstAsync(o => o.LogisticBy.LogisticCode == item.LogisticCode && o.ChannelName == item.LogisticChannelCode); var tlc = new TenantLogisticChannel() { TenantId = tenant.Id, LogisticChannelId = channel.Id }; if (item.StepWeight > 0) { tlc.LogisticChannelChange = JsonConvert.SerializeObject(new ChangeFreightRule() { WeightChargeRules = new List <WeightFreight>() { new WeightFreight() { Currency = "AUD", Unit = "g", StartingWeight = item.StartingWeight.Value, EndWeight = 1000000, StartingPrice = item.StartingPrice.Value, StepWeight = item.StepWeight.Value, CostPrice = item.Price.Value, Price = item.Price.Value } } }); } await this._tlcRepository.InsertAsync(tlc); addSet.Add(channel.Id); } await this._eventBus.TriggerAsync(new TenantImportChannelEvent() { TenantId = tenant.Id, AddChannelIds = addSet, RemoveChannelIds = new List <long>() }); await _unitOfWorkManager.Current.SaveChangesAsync(); } await unitOfWork.CompleteAsync(); return(true); } }