using NCC.Common.Configuration;
using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Common.Helper;
using NCC.Common.Util;
using NCC.DataEncryption;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.Extend.Entitys.common_extend;
using NCC.Extend.Entitys.Dto.Document;
using NCC.FriendlyException;
using NCC.System.Entitys.Permission;
using NCC.System.Interfaces.Common;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace NCC.Extend
{
///
/// 知识管理
/// 版 本:V1.20.15
/// 版 权:Wesley(https://www.NCCsoft.com)
/// 作 者:NCC开发平台组
/// 日 期:2022-03-16
///
[ApiDescriptionSettings(Tag = "Extend", Name = "Document", Order = 601)]
[Route("api/extend/[controller]")]
public class DocumentService : IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _documentRepository;
private readonly IFileService _fileService;
private readonly SqlSugarScope db;// 核心对象:拥有完整的SqlSugar全部功能
private readonly IUserManager _userManager;
///
///
///
///
///
///
public DocumentService(ISqlSugarRepository documentRepository, IFileService fileService, IUserManager userManager)
{
_documentRepository = documentRepository;
_fileService = fileService;
_userManager = userManager;
db = documentRepository.Context;
}
#region Get
///
/// 列表(文件夹树)
///
///
[HttpGet("FolderTree/{id}")]
public async Task GetFolderTree(string id)
{
var data = (await _documentRepository.Entities.Where(x => x.CreatorUserId == _userManager.UserId && x.Type == 0 && x.DeleteMark == 0).ToListAsync()).Adapt>();
data.Add(new DocumentFolderTreeOutput
{
id = "0",
fullName = "全部文档",
parentId = "-1",
icon = "fa fa-folder",
});
if (!id.Equals("0"))
{
data.RemoveAll(x => x.id == id);
}
var treeList = data.ToTree("-1");
return new { list = treeList };
}
///
/// 列表(全部文档)
///
/// 请求参数
/// 文档层级
///
[HttpGet("")]
public async Task GetAllList([FromQuery] KeywordInput input, string parentId)
{
var data = (await _documentRepository.Entities.Where(m => m.CreatorUserId == _userManager.UserId && m.ParentId == parentId && m.DeleteMark == 0).WhereIF(input.keyword.IsNotEmptyOrNull(), t => t.FullName.Contains(input.keyword)).OrderBy(x=>x.CreatorTime,OrderByType.Desc).ToListAsync()).Adapt>();
return new { list = data };
}
///
/// 列表(我的分享)
///
/// 请求参数
///
[HttpGet("Share")]
public async Task GetShareOutList([FromQuery] KeywordInput input)
{
var data = (await _documentRepository.Entities.Where(m => m.CreatorUserId == _userManager.UserId && m.IsShare > 0 && m.DeleteMark == 0).WhereIF(input.keyword.IsNotEmptyOrNull(), t => t.FullName.Contains(input.keyword)).OrderBy(x => x.CreatorTime, OrderByType.Desc).ToListAsync()).Adapt>();
return new { list = data };
}
///
/// 列表(共享给我)
///
/// 请求参数
///
[HttpGet("ShareTome")]
public async Task GetShareTomeList([FromQuery] KeywordInput input)
{
var output = await db.Queryable((a, b, c) => new JoinQueryInfos(JoinType.Left, a.Id == b.DocumentId, JoinType.Left, a.CreatorUserId == c.Id)).Where((a, b, c) => a.DeleteMark == 0 && b.ShareUserId == _userManager.UserId).WhereIF(input.keyword.IsNotEmptyOrNull(), a => a.FullName.Contains(input.keyword)).Select((a, b, c) => new DocumentShareTomeOutput()
{
shareTime = a.ShareTime,
fileSize = a.FileSize,
fullName = a.FullName,
id = a.Id,
creatorUserId =SqlFunc.MergeString(c.RealName,"/", c.Account),
fileExtension = a.FileExtension
}).MergeTable().OrderBy(a => a.shareTime, OrderByType.Desc).ToListAsync();
return new { list = output };
}
///
/// 列表(回收站)
///
/// 请求参数
///
[HttpGet("Trash")]
public async Task GetTrashList([FromQuery] KeywordInput input)
{
var data = (await _documentRepository.Entities.Where(m => m.CreatorUserId == _userManager.UserId && m.DeleteMark == 1).WhereIF(input.keyword.IsNotEmptyOrNull(), t => t.FullName.Contains(input.keyword)).OrderBy(x=>x.CreatorTime,OrderByType.Desc).ToListAsync()).Adapt>();
return new { list = data };
}
///
/// 列表(共享人员)
///
/// 文档主键
///
[HttpGet("ShareUser/{documentId}")]
public async Task GetShareUserList(string documentId)
{
var data = (await db.Queryable().Where(x => x.DocumentId == documentId).OrderBy(x => x.ShareTime, OrderByType.Desc).ToListAsync()).Adapt>();
return new { list = data };
}
///
/// 信息
///
/// 主键值
///
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
var data = (await _documentRepository.FirstOrDefaultAsync(x => x.Id == id && x.DeleteMark == 0)).Adapt();
data.fullName = data.fullName.Remove(data.fullName.LastIndexOf('.'));
return data;
}
#endregion
#region Post
///
/// 新建
///
/// 实体对象
///
[HttpPost("")]
public async Task Create([FromBody] DocumentCrInput input)
{
if (await _documentRepository.AnyAsync(x => x.FullName == input.fullName && x.Type == 0 && x.DeleteMark != 1))
throw NCCException.Oh(ErrorCode.COM1004);
var entity = input.Adapt();
entity.DeleteMark = 0;
var isOk = await _documentRepository.Context.Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1000);
}
///
/// 更新
///
/// 主键值
/// 实体对象
///
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] DocumentUpInput input)
{
if (await _documentRepository.AnyAsync(x => x.Id != id && x.Type==input.type&& x.FullName == input.fullName && x.DeleteMark != 1))
throw NCCException.Oh(ErrorCode.COM1004);
var entity = input.Adapt();
var isOk = await _documentRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1001);
}
///
/// 删除
///
/// 主键值
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entity = await _documentRepository.FirstOrDefaultAsync(x => x.Id == id && x.DeleteMark !=1);
if (entity == null)
throw NCCException.Oh(ErrorCode.COM1005);
var isOk = await _documentRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1002);
}
///
/// 上传文件
///
///
[HttpPost("Uploader")]
public async Task Uploader([FromForm] DocumentUploaderInput input)
{
#region 上传图片
if (await _documentRepository.AnyAsync(x => x.FullName == input.file.FileName && x.Type == 1 && x.DeleteMark !=1))
throw NCCException.Oh(ErrorCode.D8002);
Thread.Sleep(1000);
_fileService.UploadFile("document", input.file);
#endregion
#region 保存数据
var entity = new DocumentEntity();
entity.Type = 1;
entity.FullName = input.file.FileName;
entity.ParentId = input.parentId;
entity.FileExtension = Path.GetExtension(input.file.FileName).Replace(".", "");
entity.FilePath = _fileService.GetPathByType("document") + input.file.FileName;
entity.FileSize = input.file.Length.ToString();
entity.DeleteMark = 0;
var isOk = await _documentRepository.Context.Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.D8001);
#endregion
}
#region WebUploader
#endregion
///
/// 下载文件
///
/// 主键值
[HttpPost("Download/{id}")]
public async Task Download(string id)
{
var entity = await _documentRepository.FirstOrDefaultAsync(x => x.Id == id && x.DeleteMark == 0);
if (entity == null)
throw NCCException.Oh(ErrorCode.D8000);
var fileName = _userManager.UserId + "|" + entity.FilePath + "|document";
var output = new
{
name = entity.FullName,
url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
};
return output;
}
///
/// 回收站(彻底删除)
///
/// 主键值
///
[HttpDelete("Trash/{id}")]
public async Task TrashDelete(string id)
{
var list = await _documentRepository.Entities.Where(m =>m.ParentId==id&& m.CreatorUserId == _userManager.UserId && m.DeleteMark == 0).ToListAsync();
foreach (var item in list)
{
if (item.Type == 1)
{
FileHelper.DeleteFile(FileVariable.DocumentFilePath + item.FilePath);
}
var isOk = await _documentRepository.Context.Updateable(item).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1002);
}
}
///
/// 回收站(还原文件)
///
/// 主键值
///
[HttpPost("Trash/{id}/Actions/Recovery")]
public async Task TrashRecovery(string id)
{
var entity = await _documentRepository.FirstOrDefaultAsync(x => x.Id == id);
entity.DeleteMark = 0;
entity.DeleteTime = null;
entity.DeleteUserId = null;
var isOk = await _documentRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1001);
}
///
/// 共享文件(创建)
///
/// 共享文件id
/// 共享人
///
[HttpPost("{id}/Actions/Share")]
public async Task ShareCreate(string id, [FromBody] DocumentActionsShareInput input)
{
try
{
var userIds = input.userId.Split(",");
List documentShareEntityList = new List();
foreach (var item in userIds)
{
documentShareEntityList.Add(new DocumentShareEntity
{
Id = YitIdHelper.NextId().ToString(),
DocumentId = id,
ShareUserId = item,
ShareTime = DateTime.Now,
});
}
var entity =await _documentRepository.FirstOrDefaultAsync(x => x.Id == id&&x.DeleteMark==0);
entity.IsShare = documentShareEntityList.Count;
entity.ShareTime = DateTime.Now;
db.BeginTran();
db.Deleteable().Where(x => x.DocumentId == id).ExecuteCommand();
db.Insertable(documentShareEntityList).ExecuteCommand();
var isOk = await _documentRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1001);
db.CommitTran();
}
catch (Exception)
{
db.RollbackTran();
}
}
///
/// 共享文件(取消)
///
/// 主键值
///
[HttpDelete("{id}/Actions/Share")]
public async Task ShareCancel(string id)
{
try
{
var entity = await _documentRepository.FirstOrDefaultAsync(x => x.Id == id && x.DeleteMark == 0);
entity.IsShare = 0;
entity.ShareTime = DateTime.Now;
db.BeginTran();
db.Deleteable().Where(x => x.DocumentId == id).ExecuteCommand();
var isOk = await _documentRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1001);
db.CommitTran();
}
catch (Exception)
{
throw;
}
}
///
/// 文件/夹移动到
///
/// 主键值
/// 将要移动到Id
///
[HttpPut("{id}/Actions/MoveTo/{toId}")]
public async Task MoveTo(string id, string toId)
{
var entity = await _documentRepository.FirstOrDefaultAsync(x => x.Id == id);
var entityTo = await _documentRepository.FirstOrDefaultAsync(x => x.Id == toId);
if (id == toId && entity.Type == 0 && entityTo.Type == 0)
throw NCCException.Oh(ErrorCode.Ex0002);
if (entityTo.IsNotEmptyOrNull()&&id == entityTo.ParentId&&entity.Type==0 && entityTo.Type == 0)
throw NCCException.Oh(ErrorCode.Ex0005);
entity.ParentId = toId;
var isOk = await _documentRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
if (isOk < 1)
throw NCCException.Oh(ErrorCode.COM1001);
}
#endregion
}
}