using Application.Shared.Dtos.Units.Imports; using Domain.Models.Units; using EntityFramework; using Infrastructure.Abstructions; using Infrastructure.Converts; using Infrastructure.Excel; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace BackGround.Hangfire.Jobs.Units { public class ImportUnitsJob : ITransientDependency, IImportUnitsJob { private readonly IParser _excelParser; private readonly FireStationDbContext _context; private readonly IConverter _converter; public ImportUnitsJob(IParser parser, FireStationDbContext context, IConverter converter) { _excelParser = parser; _context = context; _converter = converter; } public async Task Execute(Guid fileId) { var file =await _context.UploadedFiles.Where(u => u.Id == fileId).FirstOrDefaultAsync(); if (file == null) { throw new Exception($"没有找到id为{fileId}的文件"); } var fileUnit = await _context.FileUnits.FirstOrDefaultAsync(f => f.FileId == fileId); if (fileUnit == null) { throw new Exception($"没有找到文件{fileId}的单位关联记录"); } var unitId = fileUnit.UnitId; int uniacid = fileUnit.Uniacid; int groupId = fileUnit.GroupId; var fileName = file.Path; var workBook = _excelParser.ReadExcel(fileName); var industrialEnterprises = _excelParser.ParseExcel(workBook); var tallBuildings = _excelParser.ParseExcel(workBook); var underGrunds = _excelParser.ParseExcel(workBook); var hotels = _excelParser.ParseExcel(workBook); var others = _excelParser.ParseExcel(workBook); var welfareInstitutions = _excelParser.ParseExcel(workBook); var stateOrgans = _excelParser.ParseExcel(workBook); var bPCs = _excelParser.ParseExcel(workBook); var schools = _excelParser.ParseExcel(workBook); var medicalInstitutions = _excelParser.ParseExcel(workBook); var publicEntertainments = _excelParser.ParseExcel(workBook); var markets = _excelParser.ParseExcel(workBook); var inflammableAndExplosiveProductionUnits = _excelParser.ParseExcel(workBook); var inflammableAndExplosiveStores = _excelParser.ParseExcel(workBook); var gasStations = _excelParser.ParseExcel(workBook); var liquefiedGasStations = _excelParser.ParseExcel(workBook); var storages = _excelParser.ParseExcel(workBook); workBook.Close(); await SaveIndustrialEnterprises(industrialEnterprises, uniacid, groupId); await SaveTallBuildings(tallBuildings, uniacid, groupId); await SaveUnderGrounds(underGrunds, uniacid, groupId); await SaveHotels(hotels, uniacid, groupId); await SaveOthers(others, uniacid, groupId); await SaveWelfareInstitution(welfareInstitutions, uniacid, groupId); await SaveStateOrgans(stateOrgans, uniacid, groupId); await SavePBCs(bPCs, uniacid, groupId); await SaveSchools(schools, uniacid, groupId); await SaveMedicalInstitutions(medicalInstitutions, uniacid, groupId); await SavePublicEntertainments(publicEntertainments, uniacid, groupId); await SaveMarkets(markets, uniacid, groupId); await SaveInflammableAndExplosiveProductionUnits(inflammableAndExplosiveProductionUnits, uniacid, groupId); await SaveInflammableAndExplosiveStores(inflammableAndExplosiveStores, uniacid, groupId); await SaveGasStation(gasStations, uniacid, groupId); await SaveLiquefiedGasStations(liquefiedGasStations, uniacid, groupId); await SaveStorages(storages, uniacid, groupId); await _context.SaveChangesAsync(); } private async Task SaveStorages(List storages, int uniacid, int groupId) { var errors = new List(); var existCategory = await GetOrAddCategory(typeof(Storage),groupId,uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var storage in storages) { var existUnit = await unitQuery.Where(u => u.Name == storage.Name && u.LocationName == storage.Area && u.Uniacid==uniacid && u.GroupId==groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = storage.Area, Name = storage.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(storage.RegulatoryLevel), PrincipalName = storage.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = storage.PersonInChargeOfSafetyInfo?.Phone, UseArea=ConvertAreaSizeToInt(storage.Survey.Area), UpdateTime = DateTime.Now, Longitude = ParseGeoPoints(storage.Longitude), Latitude = ParseGeoPoints(storage.Latitude), }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = storage.Area; existUnit.Name = storage.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(storage.RegulatoryLevel); existUnit.PrincipalName = storage.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = storage.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(storage.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(storage.Longitude); existUnit.Latitude = ParseGeoPoints(storage.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveLiquefiedGasStations(List gasStations, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(LiquefiedGasStation), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var gasStation in gasStations) { var existUnit = await unitQuery.Where(u => u.Name == gasStation.Name && u.LocationName == gasStation.Area && u.Uniacid==uniacid && u.GroupId==groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = gasStation.Area, Name = gasStation.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(gasStation.RegulatoryLevel), PrincipalName = gasStation.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = gasStation.PersonInChargeOfSafetyInfo?.Phone, UpdateTime = DateTime.Now, Longitude = ParseGeoPoints(gasStation.Longitude), Latitude = ParseGeoPoints(gasStation.Latitude), }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = gasStation.Area; existUnit.Name = gasStation.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(gasStation.RegulatoryLevel); existUnit.PrincipalName = gasStation.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = gasStation.PersonInChargeOfSafetyInfo?.Phone; existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(gasStation.Longitude); existUnit.Latitude = ParseGeoPoints(gasStation.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveGasStation(List gasStations, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(GasStation), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var gasStation in gasStations) { var existUnit = await unitQuery.Where(u => u.Name == gasStation.Name && u.LocationName == gasStation.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = gasStation.Area, Name = gasStation.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(gasStation.RegulatoryLevel), PrincipalName = gasStation.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = gasStation.PersonInChargeOfSafetyInfo?.Phone, Longitude = ParseGeoPoints(gasStation.Longitude), Latitude = ParseGeoPoints(gasStation.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = gasStation.Area; existUnit.Name = gasStation.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(gasStation.RegulatoryLevel); existUnit.PrincipalName = gasStation.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = gasStation.PersonInChargeOfSafetyInfo?.Phone; existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(gasStation.Longitude); existUnit.Latitude = ParseGeoPoints(gasStation.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveInflammableAndExplosiveStores(List inflammableAndExplosiveStores, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(InflammableAndExplosiveStore), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var inflammableAndExplosiveStore in inflammableAndExplosiveStores) { var existUnit = await unitQuery.Where(u => u.Name == inflammableAndExplosiveStore.Name && u.LocationName == inflammableAndExplosiveStore.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = inflammableAndExplosiveStore.Area, Name = inflammableAndExplosiveStore.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(inflammableAndExplosiveStore.RegulatoryLevel), PrincipalName = inflammableAndExplosiveStore.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = inflammableAndExplosiveStore.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(inflammableAndExplosiveStore.Survey.Area), Longitude = ParseGeoPoints(inflammableAndExplosiveStore.Longitude), Latitude = ParseGeoPoints(inflammableAndExplosiveStore.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = inflammableAndExplosiveStore.Area; existUnit.Name = inflammableAndExplosiveStore.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(inflammableAndExplosiveStore.RegulatoryLevel); existUnit.PrincipalName = inflammableAndExplosiveStore.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = inflammableAndExplosiveStore.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(inflammableAndExplosiveStore.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(inflammableAndExplosiveStore.Longitude); existUnit.Latitude = ParseGeoPoints(inflammableAndExplosiveStore.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveInflammableAndExplosiveProductionUnits(List inflammableAndExplosiveProductionUnits, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(InflammableAndExplosiveProductionUnit), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var inflammableAndExplosiveProductionUnit in inflammableAndExplosiveProductionUnits) { var existUnit = await unitQuery.Where(u => u.Name == inflammableAndExplosiveProductionUnit.Name && u.LocationName == inflammableAndExplosiveProductionUnit.Area && u.Uniacid==uniacid && u.GroupId==groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = inflammableAndExplosiveProductionUnit.Area, Name = inflammableAndExplosiveProductionUnit.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(inflammableAndExplosiveProductionUnit.RegulatoryLevel), PrincipalName = inflammableAndExplosiveProductionUnit.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = inflammableAndExplosiveProductionUnit.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(inflammableAndExplosiveProductionUnit.Survey.Area), Longitude = ParseGeoPoints(inflammableAndExplosiveProductionUnit.Longitude), Latitude = ParseGeoPoints(inflammableAndExplosiveProductionUnit.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = inflammableAndExplosiveProductionUnit.Area; existUnit.Name = inflammableAndExplosiveProductionUnit.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(inflammableAndExplosiveProductionUnit.RegulatoryLevel); existUnit.PrincipalName = inflammableAndExplosiveProductionUnit.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = inflammableAndExplosiveProductionUnit.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(inflammableAndExplosiveProductionUnit.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(inflammableAndExplosiveProductionUnit.Longitude); existUnit.Latitude = ParseGeoPoints(inflammableAndExplosiveProductionUnit.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveMarkets(List markets, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(Market), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var market in markets) { var existUnit = await unitQuery.Where(u => u.Name == market.Name && u.LocationName == market.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = market.Area, Name = market.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(market.RegulatoryLevel), PrincipalName = market.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = market.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(market.Survey.Area), Longitude = ParseGeoPoints(market.Longitude), Latitude = ParseGeoPoints(market.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = market.Area; existUnit.Name = market.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(market.RegulatoryLevel); existUnit.PrincipalName = market.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = market.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(market.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(market.Longitude); existUnit.Latitude = ParseGeoPoints(market.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SavePublicEntertainments(List publicEntertainments, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(PublicEntertainment), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var publicEntertainment in publicEntertainments) { var existUnit = await unitQuery.Where(u => u.Name == publicEntertainment.Name && u.LocationName == publicEntertainment.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = publicEntertainment.Area, Name = publicEntertainment.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(publicEntertainment.RegulatoryLevel), PrincipalName = publicEntertainment.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = publicEntertainment.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(publicEntertainment.Survey.Area), Longitude = ParseGeoPoints(publicEntertainment.Longitude), Latitude = ParseGeoPoints(publicEntertainment.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = publicEntertainment.Area; existUnit.Name = publicEntertainment.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(publicEntertainment.RegulatoryLevel); existUnit.PrincipalName = publicEntertainment.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = publicEntertainment.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(publicEntertainment.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(publicEntertainment.Longitude); existUnit.Latitude = ParseGeoPoints(publicEntertainment.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveMedicalInstitutions(List medicalInstitutions, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(MedicalInstitution), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var medicalInstitution in medicalInstitutions) { var existUnit = await unitQuery.Where(u => u.Name == medicalInstitution.Name && u.LocationName == medicalInstitution.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = medicalInstitution.Area, Name = medicalInstitution.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(medicalInstitution.RegulatoryLevel), PrincipalName = medicalInstitution.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = medicalInstitution.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(medicalInstitution.Survey.Area), UpdateTime = DateTime.Now, Longitude = ParseGeoPoints(medicalInstitution.Longitude), Latitude = ParseGeoPoints(medicalInstitution.Latitude), }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = medicalInstitution.Area; existUnit.Name = medicalInstitution.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(medicalInstitution.RegulatoryLevel); existUnit.PrincipalName = medicalInstitution.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = medicalInstitution.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(medicalInstitution.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(medicalInstitution.Longitude); existUnit.Latitude = ParseGeoPoints(medicalInstitution.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveSchools(List schools, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(School), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var school in schools) { var existUnit = await unitQuery.Where(u => u.Name == school.Name && u.LocationName == school.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid = uniacid, GroupId = groupId, CategoryId = existCategory.Id, LocationName = school.Area, Name = school.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(school.RegulatoryLevel), PrincipalName = school.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = school.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(school.Survey.Area), PeopleNum = ConvertPeopleCount(school.Survey.StudentCount), Longitude = ParseGeoPoints(school.Longitude), Latitude = ParseGeoPoints(school.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = school.Area; existUnit.Name = school.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(school.RegulatoryLevel); existUnit.PrincipalName = school.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = school.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(school.Survey.Area); existUnit.PeopleNum = ConvertPeopleCount(school.Survey.StudentCount); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(school.Longitude); existUnit.Latitude = ParseGeoPoints(school.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SavePBCs(List bPCs, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(BPC), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var bpc in bPCs) { var existUnit = await unitQuery.Where(u => u.Name == bpc.Name && u.LocationName == bpc.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = bpc.Area, Name = bpc.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(bpc.RegulatoryLevel), PrincipalName = bpc.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = bpc.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(bpc.Survey.Area), Longitude = ParseGeoPoints(bpc.Longitude), Latitude = ParseGeoPoints(bpc.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = bpc.Area; existUnit.Name = bpc.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(bpc.RegulatoryLevel); existUnit.PrincipalName = bpc.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = bpc.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(bpc.Survey.Area); existUnit.Longitude = ParseGeoPoints(bpc.Longitude); existUnit.Latitude = ParseGeoPoints(bpc.Latitude); existUnit.UpdateTime = DateTime.Now; _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveStateOrgans(List stateOrgans, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(StateOrgan), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var stateOrgan in stateOrgans) { var existUnit = await unitQuery.Where(u => u.Name == stateOrgan.Name && u.LocationName == stateOrgan.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = stateOrgan.Area, Name = stateOrgan.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(stateOrgan.RegulatoryLevel), PrincipalName = stateOrgan.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = stateOrgan.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(stateOrgan.Survey.Area), Longitude = ParseGeoPoints(stateOrgan.Longitude), Latitude = ParseGeoPoints(stateOrgan.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = stateOrgan.Area; existUnit.Name = stateOrgan.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(stateOrgan.RegulatoryLevel); existUnit.PrincipalName = stateOrgan.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = stateOrgan.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(stateOrgan.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(stateOrgan.Longitude); existUnit.Latitude = ParseGeoPoints(stateOrgan.Latitude); _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveWelfareInstitution(List welfareInstitutions, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(WelfareInstitution), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var welfareInstitution in welfareInstitutions) { var existUnit = await unitQuery.Where(u => u.Name == welfareInstitution.Name && u.LocationName == welfareInstitution.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid = uniacid, GroupId = groupId, CategoryId = existCategory.Id, LocationName = welfareInstitution.Area, Name = welfareInstitution.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(welfareInstitution.RegulatoryLevel), PrincipalName = welfareInstitution.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = welfareInstitution.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(welfareInstitution.Survey.Area), Longitude = ParseGeoPoints(welfareInstitution.Longitude), Latitude = ParseGeoPoints(welfareInstitution.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = welfareInstitution.Area; existUnit.Name = welfareInstitution.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(welfareInstitution.RegulatoryLevel); existUnit.PrincipalName = welfareInstitution.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = welfareInstitution.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(welfareInstitution.Survey.Area); existUnit.UpdateTime = DateTime.Now; existUnit.Longitude = ParseGeoPoints(welfareInstitution.Longitude); existUnit.Latitude = ParseGeoPoints(welfareInstitution.Latitude); _context.Units.Update(existUnit); } try { await _context.SaveChangesAsync(); } catch (Exception e) { } } } private async Task SaveOthers(List others, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(Other), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var other in others) { var existUnit = await unitQuery.Where(u => u.Name == other.Name && u.LocationName == other.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid = uniacid, GroupId = groupId, CategoryId = existCategory.Id, LocationName = other.Area, Name = other.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(other.RegulatoryLevel), PrincipalName = other.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = other.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(other.Survey.Area), PeopleNum = ConvertPeopleCount(other.Survey.EmployeeCount), Longitude = ParseGeoPoints(other.Longitude), Latitude = ParseGeoPoints(other.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = other.Area; existUnit.Name = other.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(other.RegulatoryLevel); existUnit.PrincipalName = other.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = other.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(other.Survey.Area); existUnit.PeopleNum = ConvertPeopleCount(other.Survey.EmployeeCount); existUnit.Longitude = ParseGeoPoints(other.Longitude); existUnit.Latitude = ParseGeoPoints(other.Latitude); existUnit.UpdateTime = DateTime.Now; _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveHotels(List hotels, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(Hotel), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var hotel in hotels) { var existUnit = await unitQuery.Where(u => u.Name == hotel.Name && u.LocationName == hotel.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = hotel.Area, Name = hotel.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(hotel.RegulatoryLevel), PrincipalName = hotel.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = hotel.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(hotel.Survey.Area), PeopleNum = ConvertPeopleCount(hotel.Survey.EmployeeCount), Longitude = ParseGeoPoints(hotel.Longitude), Latitude = ParseGeoPoints(hotel.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = hotel.Area; existUnit.Name = hotel.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(hotel.RegulatoryLevel); existUnit.PrincipalName = hotel.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = hotel.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(hotel.Survey.Area); existUnit.PeopleNum = ConvertPeopleCount(hotel.Survey.EmployeeCount); existUnit.Longitude = ParseGeoPoints(hotel.Longitude); existUnit.Latitude = ParseGeoPoints(hotel.Latitude); existUnit.UpdateTime = DateTime.Now; _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveUnderGrounds(List underGrounds, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(UnderGround), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var underGround in underGrounds) { var existUnit = await unitQuery.Where(u => u.Name == underGround.Name && u.LocationName == underGround.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = underGround.Area, Name = underGround.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(underGround.RegulatoryLevel), PrincipalName = underGround.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = underGround.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(underGround.Survey.Area), Longitude = ParseGeoPoints(underGround.Longitude), Latitude = ParseGeoPoints(underGround.Latitude), UpdateTime =DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = underGround.Area; existUnit.Name = underGround.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(underGround.RegulatoryLevel); existUnit.PrincipalName = underGround.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = underGround.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(underGround.Survey.Area); existUnit.Longitude = ParseGeoPoints(underGround.Longitude); existUnit.Latitude = ParseGeoPoints(underGround.Latitude); existUnit.UpdateTime = DateTime.Now; _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveTallBuildings(List tallBuildings, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(TallBuilding), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var tallBuilding in tallBuildings) { var existUnit = await unitQuery.Where(u => u.Name == tallBuilding.Name && u.LocationName == tallBuilding.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = tallBuilding.Area, Name = tallBuilding.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(tallBuilding.RegulatoryLevel), PrincipalName = tallBuilding.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = tallBuilding.PersonInChargeOfSafetyInfo?.Phone, UseArea = ConvertAreaSizeToInt(tallBuilding.Survey.Area), Longitude = ParseGeoPoints(tallBuilding.Longitude), Latitude = ParseGeoPoints(tallBuilding.Latitude), UpdateTime = DateTime.Now, }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = tallBuilding.Area; existUnit.Name = tallBuilding.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(tallBuilding.RegulatoryLevel); existUnit.PrincipalName = tallBuilding.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = tallBuilding.PersonInChargeOfSafetyInfo?.Phone; existUnit.UseArea = ConvertAreaSizeToInt(tallBuilding.Survey.Area); existUnit.Longitude = ParseGeoPoints(tallBuilding.Longitude); existUnit.Latitude = ParseGeoPoints(tallBuilding.Latitude); existUnit.UpdateTime = DateTime.Now; _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private async Task SaveIndustrialEnterprises(List industrialEnterprises, int uniacid, int groupId) { var existCategory = await GetOrAddCategory(typeof(IndustrialEnterprise), groupId, uniacid); var unitQuery = _context.Units.AsQueryable(); foreach (var industrialEnterprise in industrialEnterprises) { var existUnit = await unitQuery.Where(u => u.Name == industrialEnterprise.Name && u.LocationName == industrialEnterprise.Area && u.Uniacid == uniacid && u.GroupId == groupId).FirstOrDefaultAsync(); if (existUnit == null) { var unit = new Unit { Uniacid=uniacid, GroupId=groupId, CategoryId = existCategory.Id, LocationName = industrialEnterprise.Area, Name = industrialEnterprise.Name, SuperviseLevel = ConvertRegulatoryLevelToInt(industrialEnterprise.RegulatoryLevel), PrincipalName = industrialEnterprise.PersonInChargeOfSafetyInfo?.Name, PrincipalPhoneNum = industrialEnterprise.PersonInChargeOfSafetyInfo?.Phone, CoverArea = ConvertAreaSizeToInt(industrialEnterprise.Survey.AreaCovered), UseArea = ConvertAreaSizeToInt(industrialEnterprise.Survey.BuildUpArea), Longitude= ParseGeoPoints(industrialEnterprise.Longitude), Latitude= ParseGeoPoints(industrialEnterprise.Latitude), UpdateTime = DateTime.Now }; await _context.Units.AddAsync(unit); } else { existUnit.CategoryId = existCategory.Id; existUnit.LocationName = industrialEnterprise.Area; existUnit.Name = industrialEnterprise.Name; existUnit.SuperviseLevel = ConvertRegulatoryLevelToInt(industrialEnterprise.RegulatoryLevel); existUnit.PrincipalName = industrialEnterprise.PersonInChargeOfSafetyInfo?.Name; existUnit.PrincipalPhoneNum = industrialEnterprise.PersonInChargeOfSafetyInfo?.Phone; existUnit.CoverArea = ConvertAreaSizeToInt(industrialEnterprise.Survey.AreaCovered); existUnit.UseArea = ConvertAreaSizeToInt(industrialEnterprise.Survey.BuildUpArea); existUnit.Longitude = ParseGeoPoints(industrialEnterprise.Longitude); existUnit.Latitude = ParseGeoPoints(industrialEnterprise.Latitude); existUnit.UpdateTime = DateTime.Now; _context.Units.Update(existUnit); } await _context.SaveChangesAsync(); } } private short ConvertPeopleCount(string peopleCount) { peopleCount = peopleCount.Replace("人", "").Trim(); return Int16.Parse(peopleCount); } private Int16 ConvertRegulatoryLevelToInt(string regulatoryLevel) { var strValue = regulatoryLevel.Replace("级", "").Trim(); try { return (Int16)_converter.ParseCnToInt(strValue); } catch { throw new Exception($"错误级值:{regulatoryLevel}"); } } private async Task GetOrAddCategory(Type type,int groupId,int uniacid) { var unitCategoryQuery = _context.UnitCategories.AsQueryable(); var sheetName = _excelParser.GetSheetName(type).Trim(); var existCategory = await unitCategoryQuery.FirstOrDefaultAsync(c => c.Name == sheetName && c.GroupId==groupId && c.Uniacid==uniacid); if (existCategory == null) { var maxSort = await unitCategoryQuery.MaxAsync(c => (int?)c.Sort); maxSort = maxSort.HasValue ? maxSort.Value : 0; var unitCategory = new UnitCategory { Sort = maxSort.Value + 1, Name = sheetName, GroupId=groupId, Uniacid=uniacid, UpdateTime = DateTime.Now }; var entity = await _context.UnitCategories.AddAsync(unitCategory); await _context.SaveChangesAsync(); existCategory = entity.Entity; } return existCategory; } private float ParseGeoPoints(string geo) { float.TryParse(geo, out var value); return value; } private int ConvertAreaSizeToInt(string area) { area = area.Trim(); var pattern = "^\\d+\\.?\\d*"; var match = Regex.Match(area, pattern); var value = 0.0; if (match.Success) { value = double.Parse(match.Value); } Converter.AreaUnits sourceUnit; if (area.Contains(Converter.AreaUnits.m2.ToString()) || area.Contains("㎡")||area.Contains("平方米")) { sourceUnit = Converter.AreaUnits.m2; } else if (area.Contains(Converter.AreaUnits.km2.ToString()) || area.Contains("k㎡")||area.Contains("平方公里")) { sourceUnit = Converter.AreaUnits.km2; } else if (area.Contains(Converter.AreaUnits.分.ToString())) { sourceUnit = Converter.AreaUnits.分; } else if (area.Contains(Converter.AreaUnits.亩.ToString())) { sourceUnit = Converter.AreaUnits.亩; } else if (area.Contains(Converter.AreaUnits.公亩.ToString())) { sourceUnit = Converter.AreaUnits.公亩; } else if (area.Contains(Converter.AreaUnits.公顷.ToString())) { sourceUnit = Converter.AreaUnits.公顷; } else if(string.IsNullOrEmpty(area.Replace(match.Value, "").Trim()) ) { sourceUnit = Converter.AreaUnits.m2; } else { throw new Exception($"非法面积值{area}"); } var result = _converter.ConvertArea(value, sourceUnit, Converter.AreaUnits.m2); return (int)result; } } }