KnowledgeApplyController.cs 13 KB

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