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.Waters { public class ImportWaterJob : ITransientDependency, IImportWaterJob { private readonly IParser _excelParser; private readonly FireStationDbContext _context; private readonly IConverter _converter; public ImportWaterJob(IParser parser, FireStationDbContext context, IConverter converter) { _excelParser = parser; _context = context; _converter = converter; } public async Task Execute(Guid fileId,int categoryId) { 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 waterQuery = _context.Water.AsEnumerable(); var workBook = _excelParser.ReadExcel(fileName); var parseResult = _excelParser.ParseExcel(workBook); if (parseResult.Any()) { var currentArea = string.Empty; foreach (var result in parseResult) { try { if (!string.IsNullOrEmpty(result.Area)) { currentArea = result.Area; } var existWater = waterQuery.FirstOrDefault(w => w.LocationName == currentArea + result.Street + result.Position); if (existWater == null) { var waterEntity = BuildWater(result, currentArea, uniacid, groupId,categoryId); await _context.Water.AddAsync(waterEntity); } else { var water = BuildWater(result, currentArea, uniacid, groupId,categoryId); existWater.Longitude = water.Longitude; existWater.Latitude = water.Latitude; existWater.UpdateTime = water.UpdateTime; existWater.InstallDate = water.InstallDate; existWater.Status = water.Status; _context.Water.Update(existWater); } await _context.SaveChangesAsync(); } catch(Exception e) { throw e; } } } } private Domain.Models.Waters.Water BuildWater(Application.Shared.Dtos.Waters.Imports.Water waterDto, string area, int uniacid, int groupId,int categoryId) { var water = new Domain.Models.Waters.Water { Uniacid=uniacid, GroupId=groupId, LocationName = area + waterDto.Street + waterDto.Position, CategoryId=categoryId, UpdateTime = DateTime.Now }; if (waterDto.Point != null) { var pattern = "\\d+\\.?\\d*"; if (float.TryParse(waterDto.Point.EastLongitude,out var longitudevalue)) { water.Longitude = longitudevalue; } else { var match= Regex.Match(waterDto.Point.EastLongitude, pattern); if (match.Success) { water.Longitude = float.Parse(match.Value); } else throw new Exception($"经度值{waterDto.Point?.EastLongitude}有误"); } if (float.TryParse(waterDto.Point.NorthLatitude, out var latitudeValue)) { water.Latitude = latitudeValue; } else { var match = Regex.Match(waterDto.Point.NorthLatitude, pattern); if (match.Success) { water.Longitude = float.Parse(match.Value); } else throw new Exception($"纬度值{waterDto.Point?.EastLongitude}有误"); } } if (!string.IsNullOrEmpty(waterDto.ConstructionDate)) { water.InstallDate = waterDto.ConstructionDate; } if (!string.IsNullOrEmpty(waterDto.WaterStatus)) { if (waterDto.WaterStatus.Contains("不好用")) { water.Status = 2; } else if (waterDto.WaterStatus.Contains("好用")) { water.Status = 1; } else if (waterDto.WaterStatus.Contains("坏")) { water.Status = 0; } else { water.Status = 2; } } return water; } } }