KnowledgeApplyController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. using Hotline.Application.Knowledge;
  2. using Hotline.KnowledgeBase;
  3. using Hotline.Permissions;
  4. using Hotline.Settings;
  5. using Hotline.Share.Dtos;
  6. using Hotline.Share.Dtos.Knowledge;
  7. using Hotline.Share.Enums.KnowledgeBase;
  8. using Hotline.Users;
  9. using MapsterMapper;
  10. using Microsoft.AspNetCore.Mvc;
  11. using XF.Domain.Authentications;
  12. using XF.Domain.Exceptions;
  13. using XF.Domain.Repository;
  14. using XF.Utility.EnumExtensions;
  15. namespace Hotline.Api.Controllers
  16. {
  17. /// <summary>
  18. ///
  19. /// </summary>
  20. public class KnowledgeApplyController : BaseController
  21. {
  22. #region 注入
  23. private readonly IRepositoryWorkflow<Knowledge> _knowledgeRepository;
  24. private readonly IRepository<KnowledgeApply> _knowledgeApplyRepository;
  25. private readonly ISessionContext _sessionContext;
  26. private readonly IMapper _mapper;
  27. private readonly IKnowApplication _knowApplication;
  28. private readonly IRepository<User> _userRepository;
  29. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  30. private readonly IKnowledgeDomainService _knowledgeDomainService;
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. /// <param name="knowledgeRepository"></param>
  35. /// <param name="knowledgeApplyRepository"></param>
  36. /// <param name="sessionContext"></param>
  37. /// <param name="mapper"></param>
  38. /// <param name="knowApplication"></param>
  39. /// <param name="userRepository"></param>
  40. /// <param name="systemOrganizeRepository"></param>
  41. /// <param name="knowledgeDomainService"></param>
  42. public KnowledgeApplyController(IRepositoryWorkflow<Knowledge> knowledgeRepository, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext
  43. , IMapper mapper, IKnowApplication knowApplication, IRepository<User> userRepository, ISystemOrganizeRepository systemOrganizeRepository, IKnowledgeDomainService knowledgeDomainService)
  44. {
  45. _knowledgeRepository = knowledgeRepository;
  46. _knowledgeApplyRepository = knowledgeApplyRepository;
  47. _sessionContext = sessionContext;
  48. _mapper = mapper;
  49. _knowApplication = knowApplication;
  50. _userRepository = userRepository;
  51. _systemOrganizeRepository = systemOrganizeRepository;
  52. _knowledgeDomainService = knowledgeDomainService;
  53. }
  54. #endregion
  55. #region 知识申请基础
  56. /// <summary>
  57. /// 知识申请-发起申请
  58. /// </summary>
  59. /// <param name="dto"></param>
  60. /// <returns></returns>
  61. [HttpPost("add")]
  62. public async Task<string> AddApply([FromBody] KnowledgeApplyDto dto)
  63. {
  64. var ka = _mapper.Map<KnowledgeApply>(dto);
  65. ka.Status = EKnowledgeApplyStatus.Handling;
  66. return await _knowledgeApplyRepository.AddAsync(ka, HttpContext.RequestAborted);
  67. }
  68. /// <summary>
  69. /// 知识申请-修改申请
  70. /// </summary>
  71. /// <param name="dto"></param>
  72. /// <returns></returns>
  73. [HttpPut("update")]
  74. public async Task UpdateApply([FromBody] UpdateKnowledgeApplyDto dto)
  75. {
  76. var ka = _mapper.Map<KnowledgeApply>(dto);
  77. ka.Status = EKnowledgeApplyStatus.Handling;
  78. await _knowledgeApplyRepository.UpdateAsync(ka, HttpContext.RequestAborted);
  79. }
  80. /// <summary>
  81. ///知识申请-信息办理
  82. /// </summary>
  83. /// <param name="dto"></param>
  84. /// <returns></returns>
  85. [HttpPut("handle")]
  86. public async Task HandleApply([FromBody] KnowledgeApplyHandleDto dto)
  87. {
  88. //查询申请信息
  89. var handle = await _knowledgeApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  90. if (handle is null || handle.Status != EKnowledgeApplyStatus.Handling)
  91. throw UserFriendlyException.SameMessage("办理失败");
  92. if (string.IsNullOrEmpty(dto.Code))
  93. {
  94. var know = await _knowledgeRepository.GetAsync(dto.KnowledgeId, HttpContext.RequestAborted);
  95. dto.Code = know?.Code;
  96. }
  97. handle.Status = EKnowledgeApplyStatus.Succeed;
  98. handle.HandleTime = DateTime.Now;
  99. handle.KnowledgeId = dto.KnowledgeId;
  100. handle.Code = dto.Code;
  101. handle.Opinion = dto.Opinion;
  102. handle.Processor = _sessionContext.UserName;
  103. handle.ProcessorId = _sessionContext.RequiredUserId;
  104. //修改办理信息
  105. await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
  106. }
  107. /// <summary>
  108. ///知识申请- 撤销操作
  109. /// </summary>
  110. /// <param name="Id"></param>
  111. /// <returns></returns>
  112. [HttpPut("apply-handle/{Id}")]
  113. public async Task RevokeApply(string Id)
  114. {
  115. var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
  116. if (handle is null)
  117. throw UserFriendlyException.SameMessage("申请信息撤销失败");
  118. if (handle.Status != EKnowledgeApplyStatus.Handling)
  119. throw UserFriendlyException.SameMessage("只能撤销办理中的申请");
  120. handle.Status = EKnowledgeApplyStatus.Revert;
  121. handle.RevokeTime = DateTime.Now;
  122. await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
  123. }
  124. /// <summary>
  125. /// 知识申请-退回操作
  126. /// </summary>
  127. /// <param name="dto"></param>
  128. /// <returns></returns>
  129. [HttpPut("return")]
  130. public async Task ReturnApply([FromBody] KnowledgeApplyReturnDto dto)
  131. {
  132. //查询申请信息
  133. var handle = await _knowledgeApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  134. if (handle is null)
  135. throw UserFriendlyException.SameMessage("退回失败");
  136. if (handle.Status != EKnowledgeApplyStatus.Handling)
  137. throw UserFriendlyException.SameMessage("只能退回办理中的申请");
  138. if (string.IsNullOrEmpty(dto.Opinion))
  139. throw UserFriendlyException.SameMessage("退回原因不能为空");
  140. handle.Status = EKnowledgeApplyStatus.Failed;
  141. handle.ReturnTime = DateTime.Now;
  142. handle.HandleTime = DateTime.Now;
  143. handle.Opinion = dto.Opinion;
  144. await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
  145. }
  146. /// <summary>
  147. /// 删除申请
  148. /// </summary>
  149. /// <param name="Id"></param>
  150. /// <returns></returns>
  151. [HttpDelete("remove")]
  152. public async Task RemoveApply(string Id)
  153. {
  154. var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
  155. if (handle is null)
  156. throw UserFriendlyException.SameMessage("申请不存在");
  157. if (handle.Status != EKnowledgeApplyStatus.Revert && handle.Status != EKnowledgeApplyStatus.Failed)
  158. throw UserFriendlyException.SameMessage("只能删除已退回或者撤回的知识申请");
  159. await _knowledgeApplyRepository.RemoveAsync(handle, false, HttpContext.RequestAborted);
  160. }
  161. /// <summary>
  162. /// 知识申请-查询详情
  163. /// </summary>
  164. /// <param name="Id"></param>
  165. /// <returns></returns>
  166. [HttpGet("info/{Id}")]
  167. public async Task<DataKnowledgeApplyDto> GetApply(string Id)
  168. {
  169. var handle = await _knowledgeApplyRepository.GetAsync(Id, HttpContext.RequestAborted);
  170. if (handle is null)
  171. throw UserFriendlyException.SameMessage("申请信息查询失败");
  172. DataKnowledgeApplyDto dataKnowledgeApplyDto = new();
  173. _mapper.Map(handle, dataKnowledgeApplyDto);
  174. var user = await _userRepository.GetAsync(handle.CreatorId, HttpContext.RequestAborted);
  175. if (user != null)
  176. dataKnowledgeApplyDto.CreationName = user.Name;
  177. var organize = await _systemOrganizeRepository.GetAsync(handle.CreatorOrgId, HttpContext.RequestAborted);
  178. if (organize != null)
  179. dataKnowledgeApplyDto.CreationBMName = organize.Name;
  180. //审批中,更新审批查询最新的审批通过数据
  181. if (handle.Status == EKnowledgeApplyStatus.Handling && handle.KnowledgeApplyType == EApplyType.Update)
  182. {
  183. //查询当前数据的Code
  184. var know = await _knowledgeDomainService.KnowledgeInfo(handle.KnowledgeId, HttpContext.RequestAborted);
  185. if (know != null)
  186. {
  187. //根据Code查询最新数据
  188. var knowledge = await _knowledgeRepository
  189. .Queryable()
  190. .Where(p => p.Code == know.Code && (p.Status == EKnowledgeStatus.OnShelf || p.Status == EKnowledgeStatus.OffShelf))
  191. .OrderByDescending(p => p.Version)
  192. .Take(1)
  193. .FirstAsync();
  194. if (knowledge != null)
  195. {
  196. dataKnowledgeApplyDto.KBID = knowledge.Id;
  197. dataKnowledgeApplyDto.KBTitle = knowledge.Title;
  198. dataKnowledgeApplyDto.KnowledgeId = knowledge.Id;
  199. }
  200. }
  201. }//审批通过的查询对应版本的数据
  202. else if (handle.Status == EKnowledgeApplyStatus.Succeed)
  203. {
  204. //这里查询对应的版本
  205. var knowledge = await _knowledgeDomainService.KnowledgeInfo(handle.KnowledgeId, HttpContext.RequestAborted);
  206. if (knowledge != null)
  207. {
  208. dataKnowledgeApplyDto.KBID = knowledge.Id;
  209. dataKnowledgeApplyDto.KBTitle = knowledge.Title;
  210. }
  211. }
  212. return dataKnowledgeApplyDto;
  213. }
  214. #endregion
  215. #region 我的知识申请
  216. /// <summary>
  217. /// 知识申请页面枚举值
  218. /// </summary>
  219. /// <returns></returns>
  220. [HttpGet("apply-base-data")]
  221. public async Task<object> ApplyBaseData()
  222. {
  223. return new
  224. {
  225. EKnowledgeApplyStatus = EnumExts.GetDescriptions<EKnowledgeApplyStatus>(),
  226. EKnowledgeApplyType = EnumExts.GetDescriptions<EApplyType>()
  227. };
  228. }
  229. /// <summary>
  230. /// 我的知识申请--全部
  231. /// </summary>
  232. /// <returns></returns>
  233. [HttpGet()]
  234. public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList([FromQuery] KnowledgeApplyPagedDto dto)
  235. {
  236. return await _knowApplication.GetApplyList(dto, HttpContext.RequestAborted);
  237. }
  238. #endregion
  239. #region 知识申请处理查询
  240. /// <summary>
  241. /// 申请处理查询
  242. /// </summary>
  243. /// <returns></returns>
  244. [HttpGet("handlelist")]
  245. public async Task<PagedDto<KnowledgeApplyHandlePageDto>> AllHandle([FromQuery] KnowledgeHandlePagedDto dto)
  246. {
  247. return await _knowApplication.GetApplyHandleList(dto, HttpContext.RequestAborted);
  248. }
  249. #endregion
  250. }
  251. }