KnowledgeCommonController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. using Hotline.KnowledgeBase;
  2. using Hotline.Permissions;
  3. using Hotline.Settings;
  4. using Hotline.Settings.Hotspots;
  5. using Hotline.Share.Dtos.Knowledge;
  6. using MapsterMapper;
  7. using Microsoft.AspNetCore.Mvc;
  8. using SqlSugar;
  9. using XF.Domain.Authentications;
  10. using XF.Domain.Exceptions;
  11. using XF.Domain.Repository;
  12. namespace Hotline.Api.Controllers
  13. {
  14. /// <summary>
  15. ///
  16. /// </summary>
  17. public class KnowledgeCommonController : BaseController
  18. {
  19. #region 注入
  20. private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
  21. private readonly IKnowledgeTypeDomainService _knowledgeTypeDomainService;
  22. private readonly IRepository<KnowledgeStandard> _knowledgeStandardRepository;
  23. private readonly IMapper _mapper;
  24. private readonly ISessionContext _sessionContext;
  25. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  26. private readonly IRepository<Hotspot> _hotspotTypeRepository;
  27. /// <summary>
  28. ///
  29. /// </summary>
  30. /// <param name="knowledgeTypeRepository"></param>
  31. /// <param name="knowledgeTypeDomainService"></param>
  32. /// <param name="knowledgeStandardRepository"></param>
  33. /// <param name="mapper"></param>
  34. public KnowledgeCommonController(IRepository<KnowledgeType> knowledgeTypeRepository, IKnowledgeTypeDomainService knowledgeTypeDomainService,
  35. IRepository<KnowledgeStandard> knowledgeStandardRepository, ISessionContext sessionContext,
  36. IMapper mapper, ISystemOrganizeRepository systemOrganizeRepository, IRepository<Hotspot> hotspotTypeRepository)
  37. {
  38. _knowledgeTypeRepository = knowledgeTypeRepository;
  39. _knowledgeTypeDomainService = knowledgeTypeDomainService;
  40. _knowledgeStandardRepository = knowledgeStandardRepository;
  41. _mapper = mapper;
  42. _sessionContext = sessionContext;
  43. _systemOrganizeRepository = systemOrganizeRepository;
  44. _hotspotTypeRepository = hotspotTypeRepository;
  45. }
  46. #endregion
  47. #region 知识分类
  48. /// <summary>
  49. ///知识分类- 新增
  50. /// </summary>
  51. /// <param name="dto"></param>
  52. /// <returns></returns>
  53. [HttpPost("add")]
  54. public async Task<string> AddType([FromBody] AddKnowledgeTypeDto dto)
  55. {
  56. return await _knowledgeTypeDomainService.AddType(dto, HttpContext.RequestAborted);
  57. }
  58. /// <summary>
  59. ///知识分类- 编辑
  60. /// </summary>
  61. /// <param name="dto"></param>
  62. /// <returns></returns>
  63. [HttpPut("update")]
  64. public async Task UpdateType([FromBody] UpdateKnowledgeTypeDto dto)
  65. {
  66. await _knowledgeTypeDomainService.UpdateType(dto, HttpContext.RequestAborted);
  67. }
  68. /// <summary>
  69. /// 知识分类-新增、编辑初始化
  70. /// </summary>
  71. /// <param name="Id"></param>
  72. /// <param name="ParentId"></param>
  73. /// <returns></returns>
  74. [HttpGet("init")]
  75. public async Task<KnowledgeTypeDto> InitType(string Id, string ParentId)
  76. {
  77. return await _knowledgeTypeDomainService.InitType(Id, ParentId, HttpContext.RequestAborted);
  78. }
  79. /// <summary>
  80. /// 知识分类-查询详情
  81. /// </summary>
  82. /// <param name="Id"></param>
  83. /// <returns></returns>
  84. [HttpGet("info/{Id}")]
  85. public async Task<KnowledgeType> GetType(string Id)
  86. {
  87. var types = await _knowledgeTypeRepository.Queryable()
  88. .Includes(x => x.KnowledgeTypeOrgs)
  89. .Where(x => x.Id == Id)
  90. .FirstAsync(HttpContext.RequestAborted);
  91. if (types is null)
  92. throw UserFriendlyException.SameMessage("查询失败!");
  93. return types;
  94. }
  95. /// <summary>
  96. /// 知识分类-删除
  97. /// </summary>
  98. /// <param name="Id"></param>
  99. /// <returns></returns>
  100. [HttpDelete("remove")]
  101. public async Task RemoveType(string Id)
  102. {
  103. await _knowledgeTypeDomainService.RemoveType(Id, HttpContext.RequestAborted);
  104. }
  105. /// <summary>
  106. /// 知识分类-启用、禁用切换
  107. /// </summary>
  108. /// <param name="Id"></param>
  109. /// <returns></returns>
  110. [HttpPut("changestate")]
  111. public async Task ChangeStateType(string Id)
  112. {
  113. await _knowledgeTypeDomainService.ChangeStateType(Id, HttpContext.RequestAborted);
  114. }
  115. /// <summary>
  116. /// 知识分类-禁用,并且下架知识
  117. /// </summary>
  118. /// <param name="Id"></param>
  119. /// <returns></returns>
  120. [HttpPut("changestateandoffshelf")]
  121. public async Task TypeChangeStateAndOffShelf(string Id)
  122. {
  123. await _knowledgeTypeDomainService.ChangeStateTypeAndOffShelf(Id, HttpContext.RequestAborted);
  124. }
  125. /// <summary>
  126. /// 知识分类- 获取层级分类
  127. /// </summary>
  128. /// <param name="IsEnable">不传查询所有</param>
  129. /// <returns></returns>
  130. [HttpGet("treelist")]
  131. public async Task<List<KnowledgeTypeDto>> GetTreeList(bool? IsEnable, string? Attribution)
  132. {
  133. var query = _knowledgeTypeRepository.Queryable();
  134. if (!_sessionContext.OrgIsCenter)
  135. query.Where(d => d.Orgs.Any(s => s.Id == _sessionContext.RequiredOrgId));
  136. return await query.WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable)
  137. .Select(x => new KnowledgeTypeDto()
  138. {
  139. Id = x.Id.SelectAll(),
  140. KnowledgeNum = SqlFunc.Subqueryable<KnowledgeRelationType>().LeftJoin<Knowledge>((kr, k) => kr.KnowledgeId == k.Id)
  141. .Where((kr, k) => kr.KnowledgeTypeSpliceName.StartsWith(x.SpliceName))
  142. .WhereIF(!string.IsNullOrEmpty(Attribution), (kr, k) => k.Attribution == Attribution).DistinctCount(kr => kr.KnowledgeId)
  143. })
  144. .OrderBy(x => x.Sort)
  145. .ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id);
  146. }
  147. //[HttpGet("treelist")]
  148. //public async Task<List<KnowledgeTypeDto>> GetTreeList(bool? IsEnable, string? Attribution)
  149. //{
  150. // return await _knowledgeTypeRepository.Queryable()
  151. // .WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable)
  152. // .Where(x => SqlFunc.Subqueryable<KnowledgeTypeOrg>().Where(to => to.TypeId == x.Id && to.OrgId == _sessionContext.RequiredOrgId).Any()
  153. // || SqlFunc.Subqueryable<KnowledgeTypeOrg>().Where(to => to.TypeId == x.Id).NotAny())
  154. // .Select(x => new KnowledgeTypeDto()
  155. // {
  156. // Id = x.Id.SelectAll(),
  157. // KnowledgeNum = SqlFunc.Subqueryable<KnowledgeRelationType>().LeftJoin<Knowledge>((kr, k) => kr.KnowledgeId == k.Id)
  158. // .Where((kr, k) => kr.KnowledgeTypeSpliceName.StartsWith(x.SpliceName))
  159. // .WhereIF(!string.IsNullOrEmpty(Attribution), (kr, k) => k.Attribution == Attribution).DistinctCount(kr => kr.KnowledgeId)
  160. // })
  161. // .OrderBy(x => x.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id);
  162. //}
  163. /// <summary>
  164. /// 知识部门
  165. /// </summary>
  166. /// <param name="IsEnable">不传查询所有</param>
  167. /// <returns></returns>
  168. [HttpGet("treelist/org")]
  169. public async Task<List<KnowledgeOrgDto>> GetTreeList(string? Attribution)
  170. {
  171. //await Db.Queryable<SystemOrganize>()
  172. // .Where(it => it.Id.StartsWith(orgCode))
  173. // .OrderBy(d => d.Id)
  174. // .ToTreeAsync(it => it.Children, it => it.ParentId, orgCode.Length > 6 ? orgCode.Substring(0, orgCode.Length - 3) : null);
  175. var orgCode = _sessionContext.RequiredOrgId;
  176. var query = _systemOrganizeRepository.Queryable().WhereIF(!_sessionContext.OrgIsCenter, it => it.Id.StartsWith(_sessionContext.RequiredOrgId))
  177. .Select(it => new KnowledgeOrgDto()
  178. {
  179. Id = it.Id.SelectAll(),
  180. KnowledgeNum = SqlFunc.Subqueryable<Knowledge>()
  181. .Where(k => k.CreatorOrgId.StartsWith(it.Id))
  182. .WhereIF(!string.IsNullOrEmpty(Attribution), k => k.Attribution == Attribution).DistinctCount(k => k.Id)
  183. }).OrderBy(d => d.Id);
  184. if (_sessionContext.OrgIsCenter)
  185. {
  186. return await query.ToTreeAsync(x => x.Children, it => it.ParentId, null);
  187. }
  188. return await query.ToTreeAsync(it => it.Children, it => it.ParentId, orgCode.Length > 6 ? orgCode.Substring(0, orgCode.Length - 3) : null);
  189. }
  190. /// <summary>
  191. /// 查询子项
  192. /// </summary>
  193. [HttpGet("treelist/hotspot")]
  194. public async Task<IReadOnlyList<KnowledgeHotSpotDto>> GetChildren([FromQuery] string? id, string? Attribution)
  195. {
  196. var list = await _hotspotTypeRepository.Queryable()
  197. .WhereIF(!string.IsNullOrEmpty(id), x => x.ParentId == id)
  198. .WhereIF(string.IsNullOrEmpty(id), x => x.ParentId == null || x.ParentId == "")
  199. .OrderBy(d => d.HotSpotName)
  200. .Select(x => new KnowledgeHotSpotDto
  201. {
  202. Id = x.Id.SelectAll(),
  203. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.Id).NotAny(),
  204. KnowledgeNum = SqlFunc.Subqueryable<Knowledge>().LeftJoin<Hotspot>((k, h) => k.HotspotId == h.Id)
  205. .Where((k, h) => h.HotSpotFullName.StartsWith(x.HotSpotFullName))
  206. .WhereIF(!string.IsNullOrEmpty(Attribution), (k, h) => k.Attribution == Attribution).DistinctCount(k => k.Id)
  207. }).ToListAsync();
  208. return list;
  209. }
  210. /// <summary>
  211. /// 名称检索热点树形
  212. /// </summary>
  213. /// <param name="name"></param>
  214. /// <returns></returns>
  215. [HttpGet("treelist/children-hasname")]
  216. public async Task<IReadOnlyList<KnowledgeHotSpotDto>> GetChildrenHasName([FromQuery] string Name, string? Attribution)
  217. {
  218. var arr = _hotspotTypeRepository.Queryable()
  219. .WhereIF(!string.IsNullOrEmpty(Name), x => x.HotSpotFullName.Contains(Name)).Select(x => x.Id).ToList().Cast<object>().ToArray();
  220. //.ToTreeAsync(x => x.Children, it => it.ParentId, null);
  221. return await _hotspotTypeRepository.Queryable().Select(x => new KnowledgeHotSpotDto
  222. {
  223. Id = x.Id.SelectAll(),
  224. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.Id).NotAny(),
  225. KnowledgeNum = SqlFunc.Subqueryable<Knowledge>().LeftJoin<Hotspot>((k, h) => k.HotspotId == h.Id)
  226. .Where((k, h) => h.HotSpotFullName.StartsWith(x.HotSpotFullName))
  227. .WhereIF(!string.IsNullOrEmpty(Attribution), (k, h) => k.Attribution == Attribution).DistinctCount(k => k.Id)
  228. }).ToTreeAsync(x => x.Children, it => it.ParentId, "", arr);
  229. }
  230. /// <summary>
  231. /// 知识分类- 只获取一级
  232. /// </summary>
  233. /// <param name="ParentId">不传默认查询第一级</param>
  234. /// <param name="IsEnable">不传查询所有,包含已经禁用的</param>
  235. /// <returns></returns>
  236. [HttpGet("typelist")]
  237. public async Task<List<KnowledgeType>> GetTypeList(string? ParentId, bool? IsEnable)
  238. {
  239. return await _knowledgeTypeRepository
  240. .Queryable()
  241. .Where(p => p.ParentId == ParentId)
  242. .WhereIF(IsEnable.HasValue, p => p.IsEnable == IsEnable)
  243. .OrderByDescending(p => p.Sort)
  244. .ToListAsync();
  245. }
  246. #endregion
  247. #region 编写规范
  248. /// <summary>
  249. /// 编写规范-查询详情
  250. /// </summary>
  251. /// <returns></returns>
  252. [HttpGet("info-standard")]
  253. public async Task<KnowledgeStandard> GetStandard()
  254. {
  255. var sandard = await _knowledgeStandardRepository.Queryable().FirstAsync();
  256. if (sandard == null)
  257. {
  258. KnowledgeStandard standard = new()
  259. {
  260. Title = "",
  261. Content = ""
  262. };
  263. var Id = await _knowledgeStandardRepository.AddAsync(standard, HttpContext.RequestAborted);
  264. return await _knowledgeStandardRepository.GetAsync(Id, HttpContext.RequestAborted);
  265. }
  266. return sandard;
  267. }
  268. /// <summary>
  269. /// 编写规范-修改
  270. /// </summary>
  271. /// <param name="dto"></param>
  272. /// <returns></returns>
  273. [HttpPut("update-standard")]
  274. public async Task UpdateStandard([FromBody] UpdateKnowledgeStandardDto dto)
  275. {
  276. var standard = await _knowledgeStandardRepository.GetAsync(dto.Id);
  277. _mapper.Map(dto, standard);
  278. await _knowledgeStandardRepository.UpdateAsync(standard, HttpContext.RequestAborted);
  279. }
  280. #endregion
  281. }
  282. }