using System.Data; using System.Text; using Infrastructure; using Infrastructure.Extensions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using NetTopologySuite.Geometries; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.FormScheme; using OpenAuth.App.Interface; using OpenAuth.App.ServiceApp.Request; using OpenAuth.App.ServiceApp.Response; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using SqlSugar; using Yitter.IdGenerator; namespace OpenAuth.App.ServiceApp.AchievementManage; /// /// 成果管理 /// public class AchievementManageApp : SqlSugarBaseApp { public AchievementManageApp(ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth, FormSchemeApp formSchemeApp, IOptions setOptions) : base(unitWork, repository, auth) { } //添加成果 public Response AddImageexif(List exifs) { using var client = Repository.AsSugarClient(); var user = _auth.GetCurrentUser().User; var list = new List(); foreach (var item in exifs) { var model = item.MapTo(); model.Id = YitIdHelper.NextId(); var coordinate = new Coordinate(item.Lng, item.Lat); // model.Gemo = new Point(coordinate); model.UserId = user?.Id.ToString() ?? ""; model.Name = user?.Name ?? ""; model.TaskId = item.TaskId; list.Add(model); } var flag = client.Ado.UseTran(() => { if (list.Count > 0) { var taskId = list.First().TaskId; client.Insertable(list).ExecuteCommand(); client.Updateable() .SetColumns(a => a.ImageCount == a.ImageCount + list.Count) .Where(a => a.Id == taskId) .ExecuteCommand(); } }); if (flag.IsSuccess) { return new Response { Result = true }; } else { return new Response { Result = false, Message = "操作失败" }; } } /// /// 判读 /// /// /// public async Task> IntactById(long id) { using var client = Repository.AsSugarClient(); var count = await client.Updateable() .SetColumns(a => a.Intact == true) .Where(a => a.Id == id).ExecuteCommandAsync(); if (count > 0) { return new Response() { Result = true, Message = "判读成功" }; } else { return new Response() { Result = false, Message = "判读失败" }; } } /// /// 添加任务 /// /// /// public async Task> AddTask() { using var client = Repository.AsSugarClient(); await client.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); // 构建配置 var configuration = builder.Build(); var imgDir = configuration["FlyImageDir"]; // 获取所有子目录 var dirInfo = new DirectoryInfo(imgDir); // 获取所有文件,包括子目录中的文件 var files = dirInfo.GetFiles("MetaData.txt", SearchOption.AllDirectories); foreach (var file in files) { var meta = await File.ReadAllTextAsync(file.FullName); var obj = JsonConvert.DeserializeObject(meta); var flyer = obj["peopleName"]?.ToString(); //无人机飞手 var workPosition = obj["workPositon"]?.ToString(); //位置 var imgCount = obj["imgCount"].ToInt(); //图片数量 var flyTime = obj["timeDom"].ToDateTime(); // 航飞时间 var dateDir = file.Directory?.Parent?.Name; var count = await client.Queryable() .Where(a => a.WorkPosition.Equals(workPosition)) .Where(a => a.TaskDate.Equals(dateDir)) .CountAsync(); if (count > 0) { continue; } var id = YitIdHelper.NextId(); var task = new DroneFlyingTask { Id = id, TaskDate = dateDir, CreateTime = DateTime.Now, TaskName = workPosition + dateDir, ImageCount = imgCount, Flyer = flyer, FlyTime = flyTime, WorkPosition = workPosition }; var effect = await client.Insertable(task).IgnoreColumnsNull().ExecuteCommandAsync(); if (effect <= 0) throw new Exception("保存记录失败"); var path = file.DirectoryName; if (string.IsNullOrEmpty(path)) { throw new Exception("文件路径应包含日期/位置"); } Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var posContent = await File.ReadAllLinesAsync(Path.Combine(path, "POS.txt"), Encoding.GetEncoding("gbk")); List imageRecords = new List(posContent.Length); foreach (var line in posContent) { // 郯城2-1.JPG,34.680657300,118.347714600,552.1300 var el = line.Split(","); var fileName = el[0]; var lng = double.Parse(el[2]); var lat = double.Parse(el[1]); // 图片全路径 var imagePath = Path.Combine(path, fileName); //上传文件 var basePath = AppContext.BaseDirectory; // 项目运行目录 var dirPath = DateTime.Now.ToString("yyyyMMdd"); // 目标文件目录 var uploadPath = Path.Combine(basePath, dirPath); if (!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } var destinationFile = GenerateId.GenerateOrderNumber() + Path.GetExtension(imagePath).ToLower(); // 路径 文件名 后缀名 var destinationPath = Path.Combine(uploadPath, destinationFile); var accessUrlPart = Path.Combine(dirPath, destinationFile); File.Copy(imagePath, destinationPath, true); var fileRecord = new SysUploadFile { Id = SnowFlakeSingle.instance.getID(), FilePath = destinationPath, FileName = fileName, FileSize = file.Length.ToInt(), CreateUserName = _auth.GetUserName(), FileType = Path.GetExtension(fileName), Extension = Path.GetExtension(fileName), CreateTime = DateTime.Now, }; client.Insertable(fileRecord); var image = new DroneShpImageexif { UploadTime = DateTime.Now, TaskName = workPosition + dateDir, Id = YitIdHelper.NextId(), TaskId = id, Geometry = new Point(lng, lat), Path = accessUrlPart, WorkPosition = workPosition, Flyer = flyer, FlyTime = flyTime }; imageRecords.Add(image); } int effectB = await client.Insertable(imageRecords).ExecuteCommandAsync(); if (effectB == 0) { throw new Exception("保存失败"); } } await client.Ado.CommitTranAsync(); return new Response { Result = true, Message = "操作成功" }; } /// /// 获取列表 /// /// /// /// /// /// /// /// public async Task>>> ListTask(int pageIndex, int pageSize, string taskName, string beginDate, string endDate, string createUser) { using var client = Repository.AsSugarClient(); //返回值 RefAsync total = 0; var beginTime = Convert.ToDateTime(beginDate); var endTime = Convert.ToDateTime(endDate); var data = await client.Queryable() .LeftJoin((a, u) => a.CreateUserId == u.Id.ToString()) .WhereIF(!string.IsNullOrEmpty(taskName), (a) => a.TaskName.Contains(taskName)) .WhereIF(!string.IsNullOrEmpty(beginDate), (a) => SqlFunc.Between(a.FlyTime, beginTime, endTime)) .WhereIF(!string.IsNullOrEmpty(createUser), (a, u) => u.Name.Contains(createUser)) .OrderByDescending(a => a.CreateTime) .Select((a, u) => new TaskResp { Id = a.Id, TaskName = a.TaskName, ImageCount = a.ImageCount, TaskDate = a.TaskDate, CreateTime = a.CreateTime, WorkPosition = a.WorkPosition, Flyer = a.Flyer, FlyTime = a.FlyTime }).ToPageListAsync(pageIndex, pageSize, total); // 遍历添加字段 foreach (var taskResp in data) { var taskId = taskResp.Id; var query = @"SELECT ST_AsText(""Geometry"") as ""Geometry"" FROM drone_shp_imageexif where ""TaskId"" = " + taskId; taskResp.geometry = client.Ado.SqlQuery(query).First(); } return new Response>> { Result = new PageInfo> { Items = data, Total = total } }; } /// /// 获取列表 /// /// /// /// /// /// /// /// public async Task>>> ListDroneShpImageexif(int pageIndex, int pageSize, long taskId, string beginDate, string endDate) { using var client = Repository.AsSugarClient(); //返回值 RefAsync total = 0; var beginTime = Convert.ToDateTime(beginDate); var endTime = Convert.ToDateTime(endDate); // 原生SQL查询 var query = @"SELECT ""Id"", ST_AsText(""Geometry"") as ""Geometry"",""Path"",""UploadTime"",""TaskId"",""WorkPosition"",""Flyer"",""FlyTime"",""TaskName"" FROM drone_shp_imageexif"; // 执行查询并映射结果 var entities = await client.SqlQueryable(query) .WhereIF(taskId != 0, (t) => t.TaskId == taskId) .WhereIF(!string.IsNullOrEmpty(beginDate), (a) => SqlFunc.Between(a.UploadTime, beginTime, endTime)) .OrderByDescending(t => t.UploadTime) .Select(a => new DroneShpImageResp { Id = a.Id.SelectAll() }) .ToPageListAsync(pageIndex, pageSize, total); return new Response>> { Result = new PageInfo> { Items = entities, Total = total } }; } }