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
}
};
}
}