TopicRepository.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using AutoMapper;
  5. using Dapper;
  6. using GxPress.Common.AppOptions;
  7. using GxPress.Common.Page;
  8. using GxPress.Common.Tools;
  9. using GxPress.Entity;
  10. using GxPress.Repository.Interface;
  11. using GxPress.Request.App.Topic;
  12. using GxPress.Result.App.Topic;
  13. using Microsoft.Extensions.Options;
  14. using Datory;
  15. using GxPress.Entity.Topic;
  16. using GxPress.Result;
  17. using SqlKata;
  18. using GxPress.Result.Job;
  19. namespace GxPress.Repository.Implement
  20. {
  21. public class TopicRepository : ITopicRepository
  22. {
  23. private readonly Repository<Entity.Topic.Topic> _repository;
  24. private readonly Repository<TopicAddressee> _topicAddresseeRepository;
  25. private readonly Repository<TopicComment> _topicCommentRepository;
  26. private readonly Repository<User> _userRepository;
  27. private readonly Repository<TopicAnalyze> _topicAnalyzeRepository;
  28. private readonly IMapper _mapper;
  29. private readonly string _connectionString;
  30. private readonly string _databaseTypeStr;
  31. private readonly Repository<GroupUser> _groupUserRepository;
  32. private readonly Repository<Entity.Visit.Visit> _visitRepository;
  33. public TopicRepository(IOptionsMonitor<DatabaseOptions> dbOptionsAccessor, IMapper mapper)
  34. {
  35. _databaseTypeStr = dbOptionsAccessor.CurrentValue.DatabaseType;
  36. _connectionString = dbOptionsAccessor.CurrentValue.ConnectionString;
  37. var databaseType = StringUtils.ToEnum<DatabaseType>(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql);
  38. var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString);
  39. _repository = new Repository<Entity.Topic.Topic>(database);
  40. _topicAddresseeRepository = new Repository<TopicAddressee>(database);
  41. _topicCommentRepository = new Repository<TopicComment>(database);
  42. _userRepository = new Repository<User>(database);
  43. _topicAnalyzeRepository = new Repository<TopicAnalyze>(database);
  44. _groupUserRepository = new Repository<GroupUser>(database);
  45. _visitRepository = new Repository<Entity.Visit.Visit>(database);
  46. _mapper = mapper;
  47. }
  48. public TopicRepository()
  49. {
  50. }
  51. public IDatabase Database => _repository.Database;
  52. public string TableName => _repository.TableName;
  53. public List<TableColumn> TableColumns => _repository.TableColumns;
  54. /// <summary>
  55. /// 根据userId获取话题
  56. /// </summary>
  57. /// <param name="request"></param>
  58. /// <returns></returns>
  59. public async Task<PagedList<Entity.Topic.Topic>> GetTopicByUserIdAsync(TopicPageSearchRequest request)
  60. {
  61. var query = Q.NewQuery();
  62. if (request.UserId > 0)
  63. {
  64. query.Where(nameof(Entity.Topic.Topic.UserId), request.UserId);
  65. }
  66. if (!string.IsNullOrEmpty(request.Keyword))
  67. {
  68. var like = $"%{request.Keyword}%";
  69. query.WhereLike(nameof(Entity.Topic.Topic.Title), like);
  70. }
  71. var pagedList = new PagedList<Entity.Topic.Topic>
  72. {
  73. Total = await _repository.CountAsync(query)
  74. };
  75. var list = await _repository.GetAllAsync(query.ForPage(request.Page, request.PerPage));
  76. pagedList.Items = list;
  77. return pagedList;
  78. }
  79. /// <summary>
  80. /// APP列表显示用
  81. /// </summary>
  82. /// <param name="contentJsonDataList"></param>
  83. /// <returns></returns>
  84. public List<ContentJsonData> GetListAsync(List<ContentJsonData> contentJsonDataList)
  85. {
  86. var result = new List<ContentJsonData>();
  87. if (contentJsonDataList.Count > 0)
  88. {
  89. //查询文本
  90. var txtType = contentJsonDataList.FirstOrDefault(n => n.Type == 1);
  91. if (txtType != null)
  92. result.Add(txtType);
  93. //拼接图片
  94. var imgType = contentJsonDataList.FindAll(n => n.Type == 2);
  95. if (imgType.Any())
  96. {
  97. foreach (var item in imgType)
  98. {
  99. //判断图片数量
  100. if (result.Count(n => n.Type == 2) > 8)
  101. break;
  102. result.Add(item);
  103. }
  104. }
  105. }
  106. return result;
  107. }
  108. /// <summary>
  109. /// 根据GroupId获取通知
  110. /// </summary>
  111. /// <param name="request"></param>
  112. /// <returns></returns>
  113. public async Task<PagedList<TopicListPageResult>> FindTopicByGroupIdAsync(TopicDetailListRequest request)
  114. {
  115. //用户收件人
  116. var resultData = new PagedList<TopicListPageResult>();
  117. var showKey = $@"SELECT a.*,(SELECT
  118. COUNT(1)
  119. FROM
  120. ccpph.tede_analyze
  121. WHERE
  122. TypeValue =1
  123. AND SourceId = a.Id
  124. AND AnalyzeType = 1) AS PraiseCount,
  125. (SELECT
  126. COUNT(1)
  127. FROM
  128. ccpph.tede_analyze
  129. WHERE
  130. UserId = {request.UserId} AND TypeValue = 1
  131. AND SourceId = a.Id
  132. AND AnalyzeType = 1
  133. LIMIT 0 , 1) AS IsPraise,
  134. (SELECT
  135. COUNT(1)
  136. FROM
  137. ccpph.tede_comment
  138. WHERE
  139. ArticleId = a.Id and pid=0
  140. AND TypeValue = 1) AS CommentCount,
  141. (SELECT
  142. COUNT(1)
  143. FROM
  144. ccpph.tede_analyze
  145. WHERE
  146. UserId = {request.UserId} AND TypeValue = 1
  147. AND SourceId = a.Id
  148. AND AnalyzeType = 4) AS RetransmissionCount,
  149. (SELECT
  150. COUNT(1)
  151. FROM
  152. ccpph.tede_analyze
  153. WHERE
  154. UserId = {request.UserId} AND TypeValue = 1
  155. AND SourceId = a.Id
  156. AND AnalyzeType = 4
  157. LIMIT 0 , 1) AS IsRetransmission,
  158. (SELECT
  159. COUNT(1)
  160. FROM
  161. ccpph.tede_analyze
  162. WHERE
  163. UserId = {request.UserId} AND TypeValue = 1
  164. AND SourceId = a.Id
  165. AND AnalyzeType = 4
  166. LIMIT 0 , 1) AS IsCollect,
  167. (SELECT
  168. COUNT(1)
  169. FROM
  170. ccpph.tede_analyze
  171. WHERE
  172. UserId = {request.UserId} AND TypeValue = 1
  173. AND SourceId = a.Id
  174. AND AnalyzeType = 4) AS CollectCount,b.Name,b.AvatarUrl,c.Name FROM";
  175. var countSql = $"SELECT count(1) FROM ccpph.tede_topic a inner join ccpph.tede_user b on a.UserId=b.Id inner join ccpph.tede_Department c on c.Id=b.DepartmentId where a.GroupId={request.GroupId}";
  176. var sql =
  177. $"{showKey} ccpph.tede_topic a inner join ccpph.tede_user b on a.UserId=b.Id inner join ccpph.tede_Department c on c.Id=b.DepartmentId where a.GroupId={request.GroupId}";
  178. var strValue = "";
  179. if (!string.IsNullOrEmpty(request.Key))
  180. strValue += $" and (a.Title like '%{request.Key}%' or a.Content like '%{request.Key}%' or b.Name like '%{request.Key}%')";
  181. sql += $"{strValue} order by a.CreatedDate DESC LIMIT @page , @pageSize";
  182. countSql += $"{strValue}";
  183. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  184. var database = new Database(databaseType, _connectionString);
  185. var connection = database.GetConnection();
  186. var result =
  187. connection
  188. .Query<TopicListPageResult, User, Department, TopicListPageResult>(sql,
  189. (topicListPageResult, user, department) =>
  190. {
  191. topicListPageResult.DepartmentName = department.Name;
  192. topicListPageResult.UserName = user.Name;
  193. topicListPageResult.AvatarUrl = StringUtils.AddDomainMin(user.AvatarUrl);
  194. return topicListPageResult;
  195. }, new { page = (request.Page - 1) * request.PerPage, pageSize = request.PerPage }, splitOn: "Name");
  196. resultData.Total = await connection.ExecuteScalarAsync<int>(countSql);
  197. var topicListPageResults = result as TopicListPageResult[] ?? result.ToArray();
  198. resultData.Items = topicListPageResults;
  199. return resultData;
  200. }
  201. /// <summary>
  202. /// 根据小组ID获取话题数量
  203. /// </summary>
  204. /// <param name="groupId"></param>
  205. /// <returns></returns>
  206. public async Task<int> GetGroupTopicCountAsync(int groupId)
  207. {
  208. return await _repository.CountAsync(Q.Where(nameof(Entity.Topic.Topic.GroupId), groupId));
  209. }
  210. /// <summary>
  211. /// 根据ID获取话题
  212. /// </summary>
  213. /// <param name="id"></param>
  214. /// <returns></returns>
  215. public async Task<Entity.Topic.Topic> GetAsync(int id)
  216. {
  217. return await _repository.GetAsync(id);
  218. }
  219. public async Task<int> CountAsync(Query query)
  220. {
  221. return await _repository.CountAsync(query);
  222. }
  223. public async Task<IEnumerable<Entity.Topic.Topic>> GetAllAsync(Query query)
  224. {
  225. return await _repository.GetAllAsync(query);
  226. }
  227. public async Task<int> InsertAsync(Entity.Topic.Topic topic)
  228. {
  229. return await _repository.InsertAsync(topic);
  230. }
  231. public async Task<bool> DeleteAsync(int id)
  232. {
  233. return await _repository.DeleteAsync(id);
  234. }
  235. public async Task<bool> UpdateAsync(Entity.Topic.Topic topic)
  236. {
  237. return await _repository.UpdateAsync(topic);
  238. }
  239. /// <summary>
  240. /// 执行话题
  241. /// </summary>
  242. /// <returns></returns>
  243. public async Task<List<JobTopicResult>> ExecuteTopic()
  244. {
  245. string sql = "select a.*,b.UserId,b.Id,c.Name,d.AvatarUrl from ccpph.tede_topic a inner join ccpph.tede_topic_addressee b on a.Id=b.TopicId inner join ccpph.tede_user c on c.Id=b.UserId inner join ccpph.tede_user d on d.Id=a.UserId where b.IsUpload=0 order by a.CreatedDate desc limit 0,100";
  246. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  247. var database = new Database(databaseType, _connectionString);
  248. var connection = database.GetConnection();
  249. var result = await connection.QueryAsync<JobTopicResult, TopicAddressee, User, User, JobTopicResult>(sql, (jobTopicResult, topicAddressee, user, userDto) =>
  250. {
  251. jobTopicResult.UserId = topicAddressee.UserId;
  252. jobTopicResult.Name = user.Name;
  253. jobTopicResult.AvatarUrl = userDto.AvatarUrl;
  254. jobTopicResult.TopicAddresseeId = topicAddressee.Id;
  255. return jobTopicResult;
  256. }, splitOn: "UserId,Name,AvatarUrl");
  257. connection.Dispose();
  258. return result.ToList();
  259. }
  260. /// <summary>
  261. /// 新版 获取换题列表
  262. /// </summary>
  263. /// <param name="request"></param>
  264. /// <returns></returns>
  265. public async Task<PagedList<TopicListPageResult>> GetTopicPage(TopicPageSearchRequest request)
  266. {
  267. var result = new PagedList<TopicListPageResult>();
  268. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  269. var database = new Database(databaseType, _connectionString);
  270. var connection = database.GetConnection();
  271. result.Items = await connection.QueryAsync<TopicListPageResult, User, TopicListPageResult>(AssembleSql(request), (topicListPageResult, user) =>
  272. {
  273. topicListPageResult.UserName = user != null ? user.Name : "";
  274. topicListPageResult.AvatarUrl = user != null ? StringUtils.AddDomainMin(user.AvatarUrl) : "";
  275. topicListPageResult.FolderResult.Id = topicListPageResult.FolderId;
  276. topicListPageResult.FolderResult.FolderName = topicListPageResult.FolderName;
  277. return topicListPageResult;
  278. }, splitOn: "Id,Name");
  279. result.Total = await connection.ExecuteScalarAsync<int>(AssembleSqlCount(request));
  280. connection.Dispose();
  281. return result;
  282. }
  283. public string AssembleSql(TopicPageSearchRequest request)
  284. {
  285. var sql = $@"SELECT
  286. a.*,
  287. (SELECT
  288. FolderName
  289. FROM
  290. tede_middle
  291. WHERE
  292. id = c.ParentId) AS FolderName,
  293. (SELECT
  294. COUNT(1)
  295. FROM
  296. ccpph.tede_analyze
  297. WHERE
  298. TypeValue = 3
  299. AND SourceId = a.Id
  300. AND AnalyzeType = 1) AS PraiseCount,
  301. (SELECT
  302. COUNT(1)
  303. FROM
  304. ccpph.tede_analyze
  305. WHERE
  306. UserId = {request.UserId} AND TypeValue = 3
  307. AND SourceId = a.Id
  308. AND AnalyzeType = 1
  309. LIMIT 0 , 1) AS IsPraise,
  310. (SELECT
  311. COUNT(1)
  312. FROM
  313. ccpph.tede_comment
  314. WHERE
  315. ArticleId = a.Id AND TypeValue = 3
  316. AND Pid = 0) AS CommentCount,
  317. (SELECT
  318. COUNT(1)
  319. FROM
  320. ccpph.tede_analyze
  321. WHERE
  322. UserId = {request.UserId} AND TypeValue = 3
  323. AND SourceId = a.Id
  324. AND AnalyzeType = 4) AS RetransmissionCount,
  325. (SELECT
  326. COUNT(1)
  327. FROM
  328. ccpph.tede_analyze
  329. WHERE
  330. UserId = {request.UserId} AND TypeValue = 3
  331. AND SourceId = a.Id
  332. AND AnalyzeType = 4
  333. LIMIT 0 , 1) AS IsRetransmission,
  334. (SELECT
  335. COUNT(1)
  336. FROM
  337. ccpph.tede_analyze
  338. WHERE
  339. UserId = {request.UserId} AND TypeValue = 3
  340. AND SourceId = a.Id
  341. AND AnalyzeType = 3
  342. LIMIT 0 , 1) AS IsCollect,
  343. b.Name, b.AvatarUrl,c.ParentId as FolderId
  344. FROM
  345. ccpph.tede_note a
  346. INNER JOIN
  347. ccpph.tede_user b ON a.UserId = b.Id
  348. INNER JOIN
  349. ccpph.tede_middle c ON c.MiddleId = a.Id
  350. INNER JOIN
  351. ccpph.tede_middle d ON d.Id = c.ParentId
  352. WHERE
  353. c.FolderType = 4 and c.IsDelete=0
  354. and c.ParentId>0 AND (d.RoleId=1 or d.id IN (SELECT
  355. MiddleId
  356. FROM
  357. ccpph.tede_folder_user
  358. WHERE
  359. UserId = {request.UserId}))";
  360. if (request.TopicGroupIds.Count > 0)
  361. {
  362. var topicGroupId = "";
  363. foreach (var item in request.TopicGroupIds)
  364. {
  365. topicGroupId += $"{item},";
  366. }
  367. topicGroupId = topicGroupId.Remove(topicGroupId.Length - 1, 1);
  368. sql += $@" AND a.UserId IN (SELECT
  369. UserId
  370. FROM
  371. tede_topic_group_user
  372. WHERE
  373. TopicGroupId IN ({topicGroupId}))";
  374. }
  375. if (!string.IsNullOrWhiteSpace(request.Keyword))
  376. {
  377. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  378. OR a.Title LIKE '%{request.Keyword}%'
  379. OR a.HtmlContent LIKE '%{request.Keyword}%')";
  380. }
  381. sql += $@" ORDER BY a.CreatedDate DESC
  382. LIMIT {(request.Page - 1) * request.PerPage} , {request.PerPage}";
  383. return sql;
  384. }
  385. public string AssembleSqlCount(TopicPageSearchRequest request)
  386. {
  387. var sql = $@"SELECT count(1) FROM
  388. ccpph.tede_note a
  389. INNER JOIN
  390. ccpph.tede_user b ON a.UserId = b.Id
  391. INNER JOIN
  392. ccpph.tede_middle c ON c.MiddleId = a.Id
  393. INNER JOIN
  394. ccpph.tede_middle d ON d.Id = c.ParentId
  395. WHERE
  396. c.FolderType = 4 and c.IsDelete=0
  397. and c.ParentId>0 AND (d.RoleId=1 or d.id IN (SELECT
  398. MiddleId
  399. FROM
  400. ccpph.tede_folder_user
  401. WHERE
  402. UserId = {request.UserId}))";
  403. if (request.TopicGroupIds.Count > 0)
  404. {
  405. var topicGroupId = "";
  406. foreach (var item in request.TopicGroupIds)
  407. {
  408. topicGroupId += $"{item},";
  409. }
  410. topicGroupId = topicGroupId.Remove(topicGroupId.Length - 1, 1);
  411. sql += $@" AND a.UserId IN (SELECT
  412. UserId
  413. FROM
  414. tede_topic_group_user
  415. WHERE
  416. TopicGroupId IN ({topicGroupId}))";
  417. }
  418. if (!string.IsNullOrWhiteSpace(request.Keyword))
  419. {
  420. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  421. OR a.Title LIKE '%{request.Keyword}%'
  422. OR a.HtmlContent LIKE '%{request.Keyword}%')";
  423. }
  424. return sql;
  425. }
  426. }
  427. }