using Hotline.Application.Knowledge;
using Hotline.KnowledgeBase;
using Hotline.Permissions;
using Hotline.Settings;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.Knowledge;
using Hotline.Share.Enums.KnowledgeBase;
using Hotline.Users;
using MapsterMapper;
using Microsoft.AspNetCore.Mvc;
using XF.Domain.Authentications;
using XF.Domain.Exceptions;
using XF.Utility.EnumExtensions;
namespace Hotline.Api.Controllers
{
///
///
///
public class KnowledgeApplyController : BaseController
{
#region 注入
private readonly IKnowledgeRepository _knowledgeRepository;
private readonly IKnowledgeApplyRepository _knowledgeApplyRepository;
private readonly ISessionContext _sessionContext;
private readonly IMapper _mapper;
private readonly IKnowApplication _knowApplication;
private readonly IUserRepository _userRepository;
private readonly ISystemOrganizeRepository _systemOrganizeRepository;
///
///
///
///
///
///
///
///
///
///
public KnowledgeApplyController(IKnowledgeRepository knowledgeRepository, IKnowledgeApplyRepository knowledgeApplyRepository, ISessionContext sessionContext
, IMapper mapper, IKnowApplication knowApplication, IUserRepository userRepository, ISystemOrganizeRepository systemOrganizeRepository)
{
_knowledgeRepository = knowledgeRepository;
_knowledgeApplyRepository = knowledgeApplyRepository;
_sessionContext = sessionContext;
_mapper = mapper;
_knowApplication = knowApplication;
_userRepository = userRepository;
_systemOrganizeRepository = systemOrganizeRepository;
}
#endregion
#region 知识申请基础
///
/// 知识申请-发起申请
///
///
///
[Permission(EPermission.KnowledgeApplyAdd)]
[HttpPost("add")]
public async Task AddApply([FromBody] KnowledgeApplyDto dto)
{
var ka = _mapper.Map(dto);
ka.Status = EKnowledgeApplyStatus.Handling;
return await _knowledgeApplyRepository.AddAsync(ka, HttpContext.RequestAborted);
}
///
/// 知识申请-修改申请
///
///
///
[Permission(EPermission.KnowledgeUpdateAdd)]
[HttpPut("update")]
public async Task UpdateApply([FromBody] UpdateKnowledgeApplyDto dto)
{
var ka = _mapper.Map(dto);
await _knowledgeApplyRepository.UpdateAsync(ka, HttpContext.RequestAborted);
}
///
///知识申请-信息办理
///
///
///
[Permission(EPermission.KnowApplyHandle)]
[HttpPut("handle")]
public async Task HandleApply([FromBody] KnowledgeApplyHandleDto dto)
{
//查询申请信息
var handle = await _knowledgeApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
if (handle is null || handle.Status != EKnowledgeApplyStatus.Handling)
throw UserFriendlyException.SameMessage("办理失败");
if (string.IsNullOrEmpty(dto.Code))
{
var know = await _knowledgeRepository.GetAsync(dto.KnowledgeId, HttpContext.RequestAborted);
handle.Code = know?.Code;
}
handle.Status = EKnowledgeApplyStatus.Succeed;
handle.HandleTime = DateTime.Now;
handle.KnowledgeId = dto.KnowledgeId;
handle.Code = dto.Code;
handle.Opinion = dto.Opinion;
handle.Processor = _sessionContext.UserName;
handle.ProcessorId = _sessionContext.RequiredUserId;
//修改办理信息
await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
}
///
///知识申请- 撤销操作
///
///
///
[Permission(EPermission.KnowledgeApplyRevoke)]
[HttpPut("apply-handle/{Id}")]
public async Task RevokeApply(string Id)
{
var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
if (handle is null)
throw UserFriendlyException.SameMessage("申请信息撤销失败");
if (handle.Status != EKnowledgeApplyStatus.Handling)
throw UserFriendlyException.SameMessage("只能撤销办理中的申请");
handle.Status = EKnowledgeApplyStatus.Revert;
handle.RevokeTime = DateTime.Now;
await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
}
///
/// 知识申请-退回操作
///
///
///
[Permission(EPermission.KnowledgeApplyReturn)]
[HttpPut("return")]
public async Task ReturnApply([FromBody] KnowledgeApplyReturnDto dto)
{
//查询申请信息
var handle = await _knowledgeApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
if (handle is null)
throw UserFriendlyException.SameMessage("退回失败");
if (handle.Status != EKnowledgeApplyStatus.Handling)
throw UserFriendlyException.SameMessage("只能退回办理中的申请");
if (string.IsNullOrEmpty(dto.Opinion))
throw UserFriendlyException.SameMessage("退回原因不能为空");
handle.Status = EKnowledgeApplyStatus.Failed;
handle.ReturnTime = DateTime.Now;
handle.HandleTime = DateTime.Now;
handle.Opinion = dto.Opinion;
await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
}
///
/// 删除申请
///
///
///
[Permission(EPermission.KnowledgeApplyDelete)]
[HttpDelete("remove")]
public async Task RemoveApply(string Id)
{
var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
if (handle is null)
throw UserFriendlyException.SameMessage("申请不存在");
if (handle.Status != EKnowledgeApplyStatus.Revert && handle.Status != EKnowledgeApplyStatus.Failed)
throw UserFriendlyException.SameMessage("只能删除已退回或者撤回的知识申请");
await _knowledgeApplyRepository.RemoveAsync(handle, false, HttpContext.RequestAborted);
}
///
/// 知识申请-查询详情
///
///
///
[HttpGet("info/{Id}")]
public async Task GetApply(string Id)
{
var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
if (handle is null)
throw UserFriendlyException.SameMessage("申请信息查询失败");
DataKnowledgeApplyDto dataKnowledgeApplyDto = new();
_mapper.Map(handle, dataKnowledgeApplyDto);
var user = await _userRepository.GetAsync(handle.CreatorId, HttpContext.RequestAborted);
if (user != null)
dataKnowledgeApplyDto.CreationName = user.Name;
var organize = await _systemOrganizeRepository.GetAsync(handle.CreatorOrgId, HttpContext.RequestAborted);
if (organize != null)
dataKnowledgeApplyDto.CreationBMName = organize.OrgName;
//这里查询最新的版本
if (!string.IsNullOrEmpty(handle.Code))
{
var knowledge = await _knowledgeRepository
.Queryable()
.Where(p => p.Code == handle.Code && p.IsDeleted == false && (p.Status == EKnowledgeStatus.OnShelf || p.Status == EKnowledgeStatus.OffShelf))
.OrderByDescending(p => p.Version)
.Take(1)
.FirstAsync();
if (knowledge != null)
{
dataKnowledgeApplyDto.KBID = knowledge.Id;
dataKnowledgeApplyDto.KBTitle = knowledge.Title;
}
}
////这里查询对应的版本
//var knowledge = await _knowledgeRepository.GetAsync(p => p.Id == handle.KnowledgeId, HttpContext.RequestAborted);
//if (knowledge != null)
//{
// dataKnowledgeApplyDto.KBID = knowledge.Id;
// dataKnowledgeApplyDto.KBTitle = knowledge.Title;
//}
return dataKnowledgeApplyDto;
}
#endregion
#region 我的知识申请
///
/// 知识申请页面枚举值
///
///
[HttpGet("apply-base-data")]
public async Task