using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.FriendlyException;
using NCC.Extend.Interfaces.UavSite;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NCC.Extend.Entitys;
using NCC.Extend.Entitys.Dto.UavSite;
using Yitter.IdGenerator;
using NCC.Common.Helper;
using NCC.JsonSerialization;
using NCC.System.Entitys.Permission;
namespace NCC.Extend.UavSite
{
///
/// 无人机场地管理服务
///
[ApiDescriptionSettings(Tag = "无人机场地管理服务", Name = "UavSite", Order = 200)]
[Route("api/Extend/[controller]")]
public class UavSiteService : IUavSiteService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _uavSiteRepository;
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
///
/// 初始化一个类型的新实例
///
public UavSiteService(
ISqlSugarRepository uavSiteRepository,
IUserManager userManager)
{
_uavSiteRepository = uavSiteRepository;
_db = _uavSiteRepository.Context;
_userManager = userManager;
}
#region 获取无人机场地管理
///
/// 获取无人机场地管理
///
/// 参数
///
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
var output = entity.Adapt();
return output;
}
#endregion
#region 获取无人机场地管理列表
///
/// 获取无人机场地管理列表
///
/// 请求参数
///
[HttpGet("")]
public async Task GetList([FromQuery] UavSiteListQueryInput input)
{
var sidx = input.sidx == null ? "id" : input.sidx;
// 第一步:获取基础场地数据
var siteData = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.siteName), p => p.SiteName.Contains(input.siteName))
.WhereIF(!string.IsNullOrEmpty(input.creatorId), p => p.CreatorId.Equals(input.creatorId))
.Select(it => new UavSiteListOutput
{
id = it.Id,
siteName = it.SiteName,
address = it.Address,
lng = it.Lng,
lat = it.Lat,
remark = it.Remark,
creatorId = it.CreatorId,
creatorName = "", // 先设为空,后面单独查询
deviceCount = SqlFunc.Subqueryable()
.Where(device => device.SiteId == it.Id)
.Count()
}).OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
// 第二步:单独查询用户名称
if (siteData.list?.Any() == true)
{
var creatorIds = siteData.list.Where(x => !string.IsNullOrEmpty(x.creatorId))
.Select(x => x.creatorId).Distinct().ToList();
if (creatorIds.Any())
{
var users = await _db.Queryable()
.Where(u => creatorIds.Contains(u.Id))
.Select(u => new { u.Id, u.RealName, u.Account })
.ToListAsync();
// 更新用户名称
foreach (var site in siteData.list)
{
if (!string.IsNullOrEmpty(site.creatorId))
{
var user = users.FirstOrDefault(u => u.Id == site.creatorId);
site.creatorName = user != null ? $"{user.RealName}/{user.Account}" : site.creatorId;
}
else
{
site.creatorName = "-";
}
}
}
}
return PageResult.SqlSugarPageResult(siteData);
}
#endregion
#region 新建无人机场地管理
///
/// 新建无人机场地管理
///
/// 参数
///
[HttpPost("")]
public async Task Create([FromBody] UavSiteCrInput input)
{
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
entity.CreatorId = _userManager.UserId;
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
}
#endregion
#region 更新无人机场地管理
///
/// 更新无人机场地管理
///
/// 主键
/// 参数
///
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] UavSiteUpInput input)
{
var entity = input.Adapt();
var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
}
#endregion
#region 删除无人机场地管理
///
/// 删除无人机场地管理
///
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
}
#endregion
}
}