NoteRepository.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using AutoMapper;
  4. using Dapper;
  5. using Datory;
  6. using GxPress.Common.AppOptions;
  7. using GxPress.Common.Page;
  8. using GxPress.Common.Tools;
  9. using GxPress.Entity;
  10. using GxPress.EnumConst;
  11. using GxPress.Repository.Interface.Note;
  12. using GxPress.Request.App.Note;
  13. using GxPress.Request.Web;
  14. using GxPress.Result.App.Note;
  15. using GxPress.Result.Web;
  16. using Microsoft.Extensions.Options;
  17. namespace GxPress.Repository.Implement.Note
  18. {
  19. public class NoteRepository : INoteRepository
  20. {
  21. private readonly Repository<Entity.Note.Note> _repository;
  22. private readonly IMapper _mapper;
  23. private readonly string _connectionString;
  24. private readonly string _databaseTypestr;
  25. public NoteRepository(IOptionsMonitor<DatabaseOptions> dbOptionsAccessor, IMapper mapper)
  26. {
  27. _databaseTypestr = dbOptionsAccessor.CurrentValue.DatabaseType;
  28. _connectionString = dbOptionsAccessor.CurrentValue.ConnectionString;
  29. var databaseType =
  30. StringUtils.ToEnum<DatabaseType>(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql);
  31. var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString);
  32. _repository = new Repository<Entity.Note.Note>(database);
  33. _mapper = mapper;
  34. }
  35. public IDatabase Database => _repository.Database;
  36. public string TableName => _repository.TableName;
  37. public List<TableColumn> TableColumns => _repository.TableColumns;
  38. public async Task<Entity.Note.Note> GetAsync(int id)
  39. {
  40. return await _repository.GetAsync(id);
  41. }
  42. public async Task<bool> DeleteAsync(SqlKata.Query query)
  43. {
  44. return await _repository.DeleteAsync(query) > 0;
  45. }
  46. public async Task<int> InsertAsync(Entity.Note.Note note)
  47. {
  48. return await _repository.InsertAsync(note);
  49. }
  50. public async Task<bool> UpdateAsync(Entity.Note.Note note)
  51. {
  52. return await _repository.UpdateAsync(note);
  53. }
  54. public async Task<bool> UpdateAsync(SqlKata.Query query)
  55. {
  56. return await _repository.UpdateAsync(query) > 0;
  57. }
  58. /// <summary>
  59. /// 设置置顶
  60. /// </summary>
  61. /// <param name="noteId"></param>
  62. /// <returns></returns>
  63. public async Task<bool> SetIsTopAsync(int noteId)
  64. {
  65. var note = await _repository.GetAsync(noteId);
  66. note.IsTop = !note.IsTop;
  67. return await _repository.UpdateAsync(note);
  68. }
  69. /// <summary>
  70. /// 获取笔记分页
  71. /// </summary>
  72. /// <param name="request"></param>
  73. /// <returns></returns>
  74. public async Task<PagedList<NotePageListRequest>> NotePageListAsync(NoteSearchPageListRequest request)
  75. {
  76. var pagedList = new PagedList<NotePageListRequest>();
  77. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  78. var database = new Database(databaseType, _connectionString);
  79. var connection = database.GetConnection();
  80. var result =
  81. await connection
  82. .QueryAsync<NotePageListRequest>(GetCollectionSql(request));
  83. foreach (var item in result)
  84. {
  85. if (string.IsNullOrEmpty(item.FolderName))
  86. {
  87. item.FolderName = item.FolderParentName;
  88. item.FolderId = item.ParentId;
  89. }
  90. else
  91. item.FolderId = item.Id;
  92. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  93. }
  94. pagedList.Items = result;
  95. pagedList.Total = await NotePageListCountAsync(GetCollectionSqlCount(request));
  96. return pagedList;
  97. }
  98. /// <summary>
  99. /// 获取笔记/话题草稿分页
  100. /// </summary>
  101. /// <param name="request"></param>
  102. /// <returns></returns>
  103. public async Task<PagedList<NoteNotFolderPageResult>> NoteTopicDraftPageListAsync(NoteSearchPageListRequest request)
  104. {
  105. request.TypeValue = request.TypeValue == 1 ? 1 : 0;
  106. var pagedList = new PagedList<NoteNotFolderPageResult>();
  107. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  108. var database = new Database(databaseType, _connectionString);
  109. var connection = database.GetConnection();
  110. var sqlStr = string.Empty;
  111. if (!string.IsNullOrEmpty(request.SearchKey))
  112. sqlStr = $@"AND (a.Title LIKE '%1%' OR a.Content LIKE '%1%')";
  113. var sql = $@"SELECT
  114. a.*, b.Name, b.AvatarUrl
  115. FROM
  116. tede_note a
  117. INNER JOIN
  118. tede_user b ON a.UserId = b.Id
  119. WHERE
  120. a.UserId ={request.UserId} AND a.IsDraft = 1 and a.IsTopic={request.TypeValue}
  121. {sqlStr} limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  122. var result =
  123. await connection
  124. .QueryAsync<NoteNotFolderPageResult>(sql);
  125. foreach (var item in result)
  126. {
  127. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  128. }
  129. pagedList.Items = result;
  130. sql = $@"SELECT
  131. count(1)
  132. FROM
  133. tede_note a
  134. INNER JOIN
  135. tede_user b ON a.UserId = b.Id
  136. WHERE
  137. a.UserId ={request.UserId} AND a.IsDraft = 1 and a.IsTopic={ request.TypeValue}
  138. {sqlStr}";
  139. pagedList.Total = await NotePageListCountAsync(sql);
  140. return pagedList;
  141. }
  142. /// <summary>
  143. /// 集合
  144. /// </summary>
  145. /// <param name="request"></param>
  146. /// <returns></returns>
  147. public string GetCollectionSql(NoteSearchPageListRequest request)
  148. {
  149. string sql = "";
  150. var noteTypeId = request.TypeValue == 0 ? AllTypeConst.Note.GetHashCode() : AllTypeConst.TopicNote.GetHashCode();
  151. if (request.VisitUserId > 0)
  152. {
  153. sql =
  154. $@"SELECT a.Id,a.MiddleId,a.RoleId,a.ParentId,a.AttributeValue,(SELECT GROUP_CONCAT(SourceName Separator'、') from tede_user_middle where MiddleType={noteTypeId} and DataSourceId=a.MiddleSonId) as EnjoyUser,(SELECT
  155. COUNT(1)
  156. FROM
  157. tede_analyze
  158. WHERE
  159. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  160. AND SourceId = a.MiddleId
  161. AND AnalyzeType = 1) AS PraiseCount,
  162. (SELECT
  163. COUNT(1)
  164. FROM
  165. tede_analyze
  166. WHERE
  167. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  168. AND SourceId = a.MiddleId
  169. AND AnalyzeType = 1
  170. LIMIT 0 , 1) AS IsPraise,
  171. (SELECT
  172. COUNT(1)
  173. FROM
  174. tede_comment
  175. WHERE
  176. ArticleId = a.MiddleId and pid=0
  177. AND TypeValue = {noteTypeId}) AS CommentCount,
  178. (SELECT
  179. COUNT(1)
  180. FROM
  181. tede_analyze
  182. WHERE
  183. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  184. AND SourceId = a.MiddleId
  185. AND AnalyzeType = 4) AS RetransmissionCount,
  186. (SELECT
  187. COUNT(1)
  188. FROM
  189. tede_analyze
  190. WHERE
  191. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  192. AND SourceId = a.MiddleId
  193. AND AnalyzeType = 4
  194. LIMIT 0 , 1) AS IsRetransmission,
  195. (SELECT
  196. COUNT(1)
  197. FROM
  198. tede_analyze
  199. WHERE
  200. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  201. AND SourceId = a.MiddleId
  202. AND AnalyzeType = 3
  203. LIMIT 0 , 1) AS IsCollect,
  204. (SELECT
  205. COUNT(1)
  206. FROM
  207. tede_analyze
  208. WHERE
  209. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  210. AND SourceId = a.MiddleId
  211. AND AnalyzeType = 3) AS CollectCount,
  212. (SELECT
  213. COUNT(1)
  214. FROM
  215. tede_middle
  216. WHERE
  217. ParentId = a.Id and IsDelete=0) FileCount, b.Title, b.Content,b.ReadCount,b.MediaId,b.CatalogId,
  218. b.ChapterId,c.Name,c.AvatarUrl,c.Nick,d.Name FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id left join tede_user c on c.Id=b.UserId left join tede_department d on d.Id=c.DepartmentId
  219. WHERE a.UserId = {request.VisitUserId} AND a.FolderType ={noteTypeId} AND a.IsDelete = 0";
  220. if (request.FolderId == 0)
  221. sql += @" AND(a.RoleId = 1 OR a.RoleId = 3) AND a.ParentId = 0";
  222. else
  223. sql += $" and a.ParentId={request.FolderId}";
  224. if (!string.IsNullOrEmpty(request.SearchKey))
  225. sql += $@" AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  226. sql +=
  227. $@" OR a.id IN(SELECT MiddleId FROM tede_folder_user WHERE UserId = {request.UserId}) AND a.FolderType ={noteTypeId} AND a.UserId = {request.VisitUserId}";
  228. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  229. sql += $@" AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  230. else if (!string.IsNullOrEmpty(request.SearchKey))
  231. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  232. else
  233. sql += $" and a.ParentId={request.FolderId}";
  234. sql +=
  235. $@" ORDER BY a.AttributeValue desc,a.IsTop DESC, a.LastModifiedDate DESC";
  236. if (request.Page > 0)
  237. sql += $@" limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  238. }
  239. else
  240. {
  241. sql =
  242. $@"SELECT a.Id,a.MiddleId,a.RoleId,a.ParentId,a.AttributeValue,a.UserId,
  243. a.CreatedDate,a.IsTop,a.FolderName,a.FolderType,
  244. (SELECT GROUP_CONCAT(SourceName Separator'、') from tede_user_middle where MiddleType={noteTypeId}
  245. and DataSourceId=a.MiddleSonId) as EnjoyUser,
  246. (SELECT
  247. COUNT(1)
  248. FROM
  249. tede_analyze
  250. WHERE
  251. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  252. AND SourceId = a.MiddleId
  253. AND AnalyzeType = 1) AS PraiseCount,
  254. (SELECT
  255. COUNT(1)
  256. FROM
  257. tede_analyze
  258. WHERE
  259. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  260. AND SourceId = a.MiddleId
  261. AND AnalyzeType = 1
  262. LIMIT 0 , 1) AS IsPraise,
  263. (SELECT
  264. COUNT(1)
  265. FROM
  266. tede_comment
  267. WHERE
  268. UserId = {request.UserId} AND ArticleId = a.MiddleId
  269. AND TypeValue = {noteTypeId}) AS CommentCount,
  270. (SELECT
  271. COUNT(1)
  272. FROM
  273. tede_analyze
  274. WHERE
  275. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  276. AND SourceId = a.MiddleId
  277. AND AnalyzeType = 4) AS RetransmissionCount,
  278. (SELECT
  279. COUNT(1)
  280. FROM
  281. tede_analyze
  282. WHERE
  283. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  284. AND SourceId = a.MiddleId
  285. AND AnalyzeType = 4
  286. LIMIT 0 , 1) AS IsRetransmission,
  287. (SELECT
  288. COUNT(1)
  289. FROM
  290. tede_analyze
  291. WHERE
  292. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  293. AND SourceId = a.MiddleId
  294. AND AnalyzeType = 3
  295. LIMIT 0 , 1) AS IsCollect,
  296. (SELECT
  297. COUNT(1)
  298. FROM
  299. tede_analyze
  300. WHERE
  301. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  302. AND SourceId = a.MiddleId
  303. AND AnalyzeType = 3) AS IsCollect,
  304. (SELECT
  305. COUNT(1)
  306. FROM
  307. tede_middle
  308. WHERE
  309. ParentId = a.Id and IsDelete=0) FileCount, b.Title, b.Content,b.ReadCount,b.MediaId,b.CatalogId,
  310. b.ChapterId,c.Name,c.AvatarUrl,d.Name AS DepartmentName,
  311. (SELECT
  312. FolderName
  313. FROM
  314. tede_middle
  315. WHERE
  316. id = (SELECT
  317. ParentId
  318. FROM
  319. tede_middle
  320. WHERE
  321. MiddleId = a.Id AND FolderType ={noteTypeId})) AS FolderParentName,
  322. (SELECT
  323. Id
  324. FROM
  325. tede_middle
  326. WHERE
  327. id = (SELECT
  328. ParentId
  329. FROM
  330. tede_middle
  331. WHERE
  332. MiddleId = a.Id AND FolderType = {noteTypeId})) AS FolderId
  333. FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id
  334. left join tede_user c on c.Id=b.UserId
  335. left join tede_department d on d.Id=c.DepartmentId
  336. WHERE a.UserId = {request.UserId} AND a.FolderType = {noteTypeId} AND a.IsDelete = 0 ";
  337. if (request.TypeValue == 0)
  338. sql += "and (a.RoleId in(2) or a.AttributeValue=1)";
  339. else
  340. sql += "and (a.RoleId in(1,3) or a.AttributeValue=1)";
  341. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  342. sql += $@" AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  343. else if (!string.IsNullOrEmpty(request.SearchKey))
  344. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%')";
  345. else
  346. sql += $" and a.ParentId={request.FolderId}";
  347. sql +=
  348. $@" ORDER BY a.AttributeValue desc,a.IsTop DESC,a.Sort DESC , a.LastModifiedDate DESC";
  349. if (request.Page > 0)
  350. sql += $@" limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  351. }
  352. return sql;
  353. }
  354. /// <summary>
  355. /// 条数
  356. /// </summary>
  357. /// <param name="request"></param>
  358. /// <returns></returns>
  359. public string GetCollectionSqlCount(NoteSearchPageListRequest request)
  360. {
  361. var noteTypeId = request.TypeValue == 0 ? AllTypeConst.Note.GetHashCode() : AllTypeConst.TopicNote.GetHashCode();
  362. string sql = "";
  363. if (request.VisitUserId > 0)
  364. {
  365. sql =
  366. $@"SELECT count(1) FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id WHERE a.UserId = {request.VisitUserId} AND a.FolderType = {noteTypeId} AND a.IsDelete = 0";
  367. if (request.FolderId == 0)
  368. sql += @" AND(a.RoleId = 1 OR a.RoleId = 3) AND a.ParentId = 0";
  369. else
  370. sql += $" and a.ParentId={request.FolderId}";
  371. if (!string.IsNullOrEmpty(request.SearchKey))
  372. sql += $@" AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  373. sql +=
  374. $@" OR a.id IN(SELECT MiddleId FROM tede_folder_user WHERE UserId = {request.UserId}) AND a.FolderType = {noteTypeId} AND a.UserId = {request.VisitUserId}";
  375. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  376. sql += $@" AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  377. else if (!string.IsNullOrEmpty(request.SearchKey))
  378. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  379. else
  380. sql += $" and a.ParentId={request.FolderId}";
  381. }
  382. else
  383. {
  384. sql =
  385. $@"SELECT count(1) FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id left join tede_user c on c.Id=b.UserId left join tede_department d on d.Id=c.DepartmentId WHERE a.UserId = {request.UserId} AND a.FolderType ={noteTypeId} AND a.IsDelete = 0";
  386. if (request.TypeValue == 0)
  387. sql += " and (a.RoleId in(2) or a.AttributeValue=1)";
  388. else
  389. sql += " and (a.RoleId in(1,3) or a.AttributeValue=1)";
  390. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  391. sql += $@" AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  392. else if (!string.IsNullOrEmpty(request.SearchKey))
  393. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%' or b.UserId in (select Id from tede_user where name like '%{request.SearchKey}%'))";
  394. else
  395. sql += $" and a.ParentId={request.FolderId}";
  396. }
  397. return sql;
  398. }
  399. public async Task<int> NotePageListCountAsync(string sql)
  400. {
  401. var pagedList = new PagedList<NotePageListRequest>();
  402. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  403. var database = new Database(databaseType, _connectionString);
  404. var connection = database.GetConnection();
  405. var result =
  406. await connection
  407. .ExecuteScalarAsync<int>(sql);
  408. return result;
  409. }
  410. /// <summary>
  411. /// 删除笔记
  412. /// </summary>
  413. /// <param name="id"></param>
  414. /// <returns></returns>
  415. public async Task<bool> DeleteAsync(int id) => await _repository.DeleteAsync(id);
  416. /// <summary>
  417. ///查询个人摘录
  418. /// </summary>
  419. /// <param name="request"></param>
  420. /// <returns></returns>
  421. public async Task<PagedList<NoteUserExtractResult>> GetAllByUserId(NoteUserRequest request)
  422. {
  423. var result = new PagedList<NoteUserExtractResult>();
  424. var sql = $@"SELECT
  425. a.Id,
  426. a.CreatedDate,
  427. a.Title,
  428. a.Content,
  429. a.UserId,
  430. a.ReadCount,
  431. a.HtmlContent,
  432. a.MediaId,
  433. a.CatalogId,
  434. a.ChapterId,
  435. (SELECT
  436. COUNT(1)
  437. FROM
  438. tede_analyze
  439. WHERE
  440. UserId = {request.UserId} AND TypeValue = 3
  441. AND SourceId = a.Id
  442. AND AnalyzeType = 1) AS PraiseCount,
  443. (SELECT
  444. COUNT(1)
  445. FROM
  446. tede_analyze
  447. WHERE
  448. UserId = {request.UserId} AND TypeValue = 3
  449. AND SourceId = a.Id
  450. AND AnalyzeType = 1
  451. LIMIT 0 , 1) AS IsPraise,
  452. (SELECT
  453. COUNT(1)
  454. FROM
  455. tede_comment
  456. WHERE
  457. ArticleId = a.Id AND pid = 0
  458. AND TypeValue = 3) AS CommentCount,
  459. (SELECT
  460. COUNT(1)
  461. FROM
  462. tede_analyze
  463. WHERE
  464. UserId = {request.UserId} AND TypeValue = 3
  465. AND SourceId = a.Id
  466. AND AnalyzeType = 4) AS RetransmissionCount,
  467. (SELECT
  468. COUNT(1)
  469. FROM
  470. tede_analyze
  471. WHERE
  472. UserId = {request.UserId} AND TypeValue = 3
  473. AND SourceId = a.Id
  474. AND AnalyzeType = 4
  475. LIMIT 0 , 1) AS IsRetransmission,
  476. b.Name,b.AvatarUrl
  477. FROM
  478. tede_note a
  479. INNER JOIN
  480. tede_user b ON a.UserId = b.Id
  481. WHERE
  482. UserId = {request.UserId} and a.MediaId='{request.MediaId}'
  483. ORDER BY CreatedDate DESC";
  484. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  485. var database = new Database(databaseType, _connectionString);
  486. var connection = database.GetConnection();
  487. result.Items =
  488. await connection
  489. .QueryAsync<NoteUserExtractResult>(sql);
  490. sql = $@"SELECT
  491. count(1)
  492. FROM
  493. tede_note a
  494. INNER JOIN
  495. tede_user b ON a.UserId = b.Id
  496. WHERE
  497. UserId = {request.UserId} and a.MediaId='{request.MediaId}' and a.CatalogId='{request.CatalogId}' and a.ChapterId='{request.ChapterId}'";
  498. result.Total =
  499. await connection.ExecuteScalarAsync<int>(sql);
  500. return result;
  501. }
  502. /// <summary>
  503. /// web页面查询话题
  504. /// </summary>
  505. /// <param name="request"></param>
  506. /// <returns></returns>
  507. public async Task<PagedList<NoteTopicResult>> GetTopicNoteAsync(NoteSearchPageListRequest request)
  508. {
  509. var noteTypeId = GxPress.EnumConst.AllTypeConst.Note.GetHashCode();
  510. var sql = $@"SELECT
  511. a.Id,
  512. a.Title,
  513. a.Content,
  514. a.HtmlContent,
  515. a.CreatedDate,
  516. b.Id as UserId,
  517. b.Name,
  518. b.AvatarUrl,
  519. c.Id,
  520. c.FolderName,
  521. (SELECT
  522. COUNT(1)
  523. FROM
  524. tede_analyze
  525. WHERE
  526. TypeValue ={noteTypeId} AND SourceId = a.Id
  527. AND AnalyzeType = 1) AS PraiseCount,
  528. (SELECT
  529. COUNT(1)
  530. FROM
  531. tede_analyze
  532. WHERE
  533. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  534. AND SourceId = a.Id
  535. AND AnalyzeType = 1
  536. LIMIT 0 , 1) AS IsPraise,
  537. (SELECT
  538. COUNT(1)
  539. FROM
  540. tede_comment
  541. WHERE
  542. ArticleId = a.Id AND TypeValue = {noteTypeId}
  543. AND Pid = 0) AS CommentCount,
  544. (SELECT
  545. COUNT(1)
  546. FROM
  547. tede_analyze
  548. WHERE
  549. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  550. AND SourceId = a.Id
  551. AND AnalyzeType = 4) AS RetransmissionCount,
  552. (SELECT
  553. COUNT(1)
  554. FROM
  555. tede_analyze
  556. WHERE
  557. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  558. AND SourceId = a.Id
  559. AND AnalyzeType = 4
  560. LIMIT 0 , 1) AS IsRetransmission,
  561. (SELECT
  562. COUNT(1)
  563. FROM
  564. tede_analyze
  565. WHERE
  566. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  567. AND SourceId = a.Id
  568. AND AnalyzeType = 3
  569. LIMIT 0 , 1) AS IsCollect
  570. FROM
  571. tede_note a
  572. INNER JOIN
  573. tede_user b ON a.UserId = b.Id
  574. INNER JOIN
  575. tede_middle c ON c.Id = a.FolderId
  576. WHERE
  577. a.IsTopic = 1";
  578. if (!string.IsNullOrEmpty(request.SearchKey))
  579. {
  580. sql += $@" and (b.Name like '%11%' or a.Title like '%11%' or a.Content like '%11%')";
  581. }
  582. sql += $@" AND (a.FolderId IN (SELECT
  583. Id
  584. FROM
  585. tede_middle
  586. WHERE
  587. id IN (SELECT
  588. MiddleId
  589. FROM
  590. tede_folder_user
  591. WHERE
  592. UserId = {request.UserId})
  593. AND RoleId IN (3))
  594. OR a.FolderId IN (SELECT
  595. Id
  596. FROM
  597. tede_middle
  598. WHERE
  599. RoleId IN (1))) ";
  600. sql += $@" limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  601. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  602. var database = new Database(databaseType, _connectionString);
  603. var connection = database.GetConnection();
  604. var result = new PagedList<NoteTopicResult>();
  605. result.Items =
  606. await connection
  607. .QueryAsync<NoteTopicResult, User, Entity.Middle.Middle, NoteTopicResult>(sql,
  608. (noteTopicResult, user, middle) =>
  609. {
  610. noteTopicResult.UserName = user == null ? "" : user.Name;
  611. noteTopicResult.AvatarUrl = user == null ? "" : StringUtils.AddDomainMin(user.AvatarUrl);
  612. noteTopicResult.FolderId = middle == null ? 0 : middle.Id;
  613. noteTopicResult.FolderName = middle == null ? "" : middle.FolderName;
  614. return noteTopicResult;
  615. }, splitOn: "Id,Name,Id");
  616. sql = $@"SELECT
  617. count(1)
  618. FROM
  619. tede_note a
  620. INNER JOIN
  621. tede_user b ON a.UserId = b.Id
  622. INNER JOIN
  623. tede_middle c ON c.Id = a.FolderId
  624. WHERE
  625. a.IsTopic = 1";
  626. if (!string.IsNullOrEmpty(request.SearchKey))
  627. {
  628. sql += $@" and (b.Name like '%11%' or a.Title like '%11%' or a.Content like '%11%')";
  629. }
  630. sql += $@" AND (a.FolderId IN (SELECT
  631. Id
  632. FROM
  633. tede_middle
  634. WHERE
  635. id IN (SELECT
  636. MiddleId
  637. FROM
  638. tede_folder_user
  639. WHERE
  640. UserId = {request.UserId})
  641. AND RoleId IN (3))
  642. OR a.FolderId IN (SELECT
  643. Id
  644. FROM
  645. tede_middle
  646. WHERE
  647. RoleId IN (1))) ";
  648. result.Total =
  649. await connection.ExecuteScalarAsync<int>(sql);
  650. return result;
  651. }
  652. /// <summary>
  653. /// 笔记没有文件夹分页
  654. /// </summary>
  655. /// <param name="request"></param>
  656. /// <returns></returns>
  657. public async Task<PagedList<NoteNotFolderPageResult>> GetNoteNotFolderPageResult(NoteSearchPageListRequest request)
  658. {
  659. var sqlValue = "";
  660. if (!string.IsNullOrEmpty(request.SearchKey))
  661. {
  662. sqlValue += $" and (a.Title like '%{request.SearchKey}%' or a.Content like '%{request.SearchKey}%')";
  663. }
  664. var noteConstValue = GxPress.EnumConst.AllTypeConst.Note.GetHashCode();
  665. var sql = $@"SELECT
  666. a.Id,
  667. a.Title,
  668. a.Content,
  669. a.UserId,
  670. a.CreatedDate,
  671. a.MediaId,
  672. a.ReadCount,
  673. a.IsTop,
  674. (SELECT
  675. FolderName
  676. FROM
  677. tede_middle
  678. WHERE
  679. id = (SELECT
  680. ParentId
  681. FROM
  682. tede_middle
  683. WHERE
  684. MiddleId = a.Id AND FolderType = {noteConstValue})) AS FolderName,
  685. (SELECT
  686. Id
  687. FROM
  688. tede_middle
  689. WHERE
  690. id = (SELECT
  691. ParentId
  692. FROM
  693. tede_middle
  694. WHERE
  695. MiddleId = a.Id AND FolderType = {noteConstValue})) AS FolderId,
  696. (SELECT
  697. COUNT(1)
  698. FROM
  699. tede_analyze
  700. WHERE
  701. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  702. AND SourceId = a.Id
  703. AND AnalyzeType = 1) AS PraiseCount,
  704. (SELECT
  705. COUNT(1)
  706. FROM
  707. tede_analyze
  708. WHERE
  709. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  710. AND SourceId = a.Id
  711. AND AnalyzeType = 1
  712. LIMIT 0 , 1) AS IsPraise,
  713. (SELECT
  714. COUNT(1)
  715. FROM
  716. tede_comment
  717. WHERE
  718. UserId = {request.UserId} AND ArticleId = a.Id
  719. AND TypeValue = {noteConstValue}) AS CommentCount,
  720. (SELECT
  721. COUNT(1)
  722. FROM
  723. tede_analyze
  724. WHERE
  725. UserId = {request.UserId} AND TypeValue ={noteConstValue}
  726. AND SourceId = a.Id
  727. AND AnalyzeType = {noteConstValue}) AS RetransmissionCount,
  728. (SELECT
  729. COUNT(1)
  730. FROM
  731. tede_analyze
  732. WHERE
  733. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  734. AND SourceId = a.Id
  735. AND AnalyzeType = 4
  736. LIMIT 0 , 1) AS IsRetransmission,
  737. (SELECT
  738. COUNT(1)
  739. FROM
  740. tede_analyze
  741. WHERE
  742. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  743. AND SourceId = a.Id
  744. AND AnalyzeType = 3
  745. LIMIT 0 , 1) AS IsCollect,
  746. (SELECT
  747. COUNT(1)
  748. FROM
  749. tede_analyze
  750. WHERE
  751. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  752. AND SourceId = a.Id
  753. AND AnalyzeType = 3) AS IsCollect,
  754. b.Name,
  755. b.AvatarUrl,c.Id,c.MiddleId
  756. FROM
  757. tede_note a
  758. INNER JOIN
  759. tede_user b ON a.UserId = b.Id inner join tede_middle c on c.MiddleId=a.Id
  760. WHERE
  761. a.IsDelete = 0 and a.IsTopic=0 AND a.UserId = {request.UserId} and c.FolderType={noteConstValue} {sqlValue}
  762. ORDER BY a.IsTop desc ,a.LastModifiedDate DESC
  763. limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  764. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  765. var database = new Database(databaseType, _connectionString);
  766. var connection = database.GetConnection();
  767. var result = new PagedList<NoteNotFolderPageResult>();
  768. result.Items =
  769. await connection
  770. .QueryAsync<NoteNotFolderPageResult, User, Entity.Middle.Middle, NoteNotFolderPageResult>(sql,
  771. (result, user, middle) =>
  772. {
  773. result.MiddleId = middle.MiddleId;
  774. result.Id = middle.Id;
  775. result.Name = user == null ? "" : user.Name;
  776. result.AvatarUrl = user == null ? "" : StringUtils.AddDomainMin(user.AvatarUrl);
  777. return result;
  778. }, splitOn: "Id,Id,Name,Id");
  779. sql = $@"SELECT count(1)
  780. FROM
  781. tede_note a
  782. INNER JOIN
  783. tede_user b ON a.UserId = b.Id inner join tede_middle c on c.MiddleId=a.Id
  784. WHERE
  785. a.IsDelete = 0 and a.IsTopic=0 AND a.UserId = {request.UserId} and c.FolderType={noteConstValue} {sqlValue}";
  786. result.Total = await connection.ExecuteScalarAsync<int>(sql);
  787. return result;
  788. }
  789. /// <summary>
  790. /// 获取用户最近使用的文件夹
  791. /// </summary>
  792. /// <param name="userId"></param>
  793. /// <returns></returns>
  794. public async Task<IEnumerable<int>> GetLatelyFolderIdAsync(int userId, bool isTopic)
  795. {
  796. var query = Q.NewQuery();
  797. query.Select(nameof(Entity.Note.Note.FolderId));
  798. query.Where(nameof(Entity.Note.Note.UserId), userId);
  799. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  800. query.Where(nameof(Entity.Note.Note.FolderId), ">", 0);
  801. query.OrderByDesc(nameof(Entity.Note.Note.CreatedDate));
  802. return await _repository.GetAllAsync<int>(query);
  803. }
  804. /// <summary>
  805. /// 获取用户是否存在草稿
  806. /// </summary>
  807. /// <param name="userId"></param>
  808. /// <returns></returns>
  809. public async Task<bool> IsExistsDraftAsync(int userId, bool isTopic)
  810. {
  811. var query = Q.NewQuery();
  812. query.Where(nameof(Entity.Note.Note.UserId), userId);
  813. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  814. query.Where(nameof(Entity.Note.Note.IsDraft), true);
  815. return await _repository.ExistsAsync(query);
  816. }
  817. /// <summary>
  818. /// 获取用户最新的草稿Id
  819. /// </summary>
  820. /// <param name="userId"></param>
  821. /// <returns></returns>
  822. public async Task<int> GetNoteIdByDraftAsync(int userId, bool isTopic)
  823. {
  824. var query = Q.NewQuery();
  825. query.Where(nameof(Entity.Note.Note.UserId), userId);
  826. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  827. query.Where(nameof(Entity.Note.Note.IsDraft), true);
  828. query.OrderByDesc(nameof(Entity.Note.Note.CreatedDate));
  829. query.Select(nameof(Entity.Note.Note.Id));
  830. return await _repository.GetAsync<int>(query);
  831. }
  832. /// <summary>
  833. /// 获取用户最新的草稿Id
  834. /// </summary>
  835. /// <param name="userId"></param>
  836. /// <returns></returns>
  837. public async Task<int> GetDraftCountAsync(int userId, bool isTopic)
  838. {
  839. var query = Q.NewQuery();
  840. query.Where(nameof(Entity.Note.Note.UserId), userId);
  841. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  842. query.Where(nameof(Entity.Note.Note.IsDraft), true);
  843. return await _repository.CountAsync(query);
  844. }
  845. }
  846. }