NoteRepository.cs 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  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. var sqlStr = $"a.Id";
  154. if (request.FolderId > 0)
  155. sqlStr = "a.ParentId";
  156. sql =
  157. $@"SELECT a.Id,a.MiddleId,a.RoleId,a.ParentId,a.AttributeValue,a.UserId,
  158. a.CreatedDate,a.IsTop,a.FolderName,a.FolderType,
  159. (SELECT GROUP_CONCAT(SourceName Separator'、') from tede_user_middle where MiddleType={noteTypeId}
  160. and DataSourceId=a.MiddleSonId) as EnjoyUser,
  161. (SELECT
  162. COUNT(1)
  163. FROM
  164. tede_analyze
  165. WHERE
  166. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  167. AND SourceId = a.MiddleId
  168. AND AnalyzeType = 1) AS PraiseCount,
  169. (SELECT
  170. COUNT(1)
  171. FROM
  172. tede_analyze
  173. WHERE
  174. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  175. AND SourceId = a.MiddleId
  176. AND AnalyzeType = 1
  177. LIMIT 0 , 1) AS IsPraise,
  178. (SELECT
  179. COUNT(1)
  180. FROM
  181. tede_comment
  182. WHERE
  183. UserId = {request.UserId} AND ArticleId = a.MiddleId
  184. AND TypeValue = {noteTypeId}) AS CommentCount,
  185. (SELECT
  186. COUNT(1)
  187. FROM
  188. tede_analyze
  189. WHERE
  190. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  191. AND SourceId = a.MiddleId
  192. AND AnalyzeType = 4) AS RetransmissionCount,
  193. (SELECT
  194. COUNT(1)
  195. FROM
  196. tede_analyze
  197. WHERE
  198. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  199. AND SourceId = a.MiddleId
  200. AND AnalyzeType = 4
  201. LIMIT 0 , 1) AS IsRetransmission,
  202. (SELECT
  203. COUNT(1)
  204. FROM
  205. tede_analyze
  206. WHERE
  207. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  208. AND SourceId = a.MiddleId
  209. AND AnalyzeType = 3
  210. LIMIT 0 , 1) AS IsCollect,
  211. (SELECT
  212. COUNT(1)
  213. FROM
  214. tede_analyze
  215. WHERE
  216. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  217. AND SourceId = a.MiddleId
  218. AND AnalyzeType = 3) AS IsCollect,
  219. (SELECT
  220. COUNT(1)
  221. FROM
  222. tede_middle
  223. WHERE
  224. ParentId = a.Id and IsDelete=0) FileCount, b.Title, b.Content,b.ReadCount,b.MediaId,b.CatalogId,
  225. b.ChapterId,c.Name,c.AvatarUrl,d.Name AS DepartmentName,
  226. (SELECT
  227. FolderName
  228. FROM
  229. tede_middle
  230. WHERE
  231. id = (SELECT
  232. ParentId
  233. FROM
  234. tede_middle
  235. WHERE
  236. MiddleId = a.Id AND FolderType ={noteTypeId})) AS FolderParentName,
  237. (SELECT
  238. Id
  239. FROM
  240. tede_middle
  241. WHERE
  242. id = (SELECT
  243. ParentId
  244. FROM
  245. tede_middle
  246. WHERE
  247. MiddleId = a.Id AND FolderType = {noteTypeId})) AS FolderId
  248. FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id
  249. left join tede_user c on c.Id=b.UserId
  250. left join tede_department d on d.Id=c.DepartmentId
  251. WHERE
  252. a.FolderType = {noteTypeId} AND a.userId = {request.VisitUserId}
  253. AND a.IsDelete = 0
  254. AND (a.UserId IN (SELECT
  255. Id
  256. FROM
  257. tede_user
  258. WHERE
  259. 1 = a.RoleId)
  260. OR a.UserId IN (SELECT
  261. Id
  262. FROM
  263. tede_user
  264. WHERE
  265. 0 = a.RoleId)
  266. OR {sqlStr} IN (SELECT
  267. MiddleId
  268. FROM
  269. tede_folder_user
  270. WHERE
  271. UserId = {request.UserId} AND MiddleId = {sqlStr}))";
  272. if (request.TypeValue == 0)
  273. sql += "and (a.RoleId in(2) or a.AttributeValue=1)";
  274. else
  275. sql += "and (a.RoleId in(1,3) or a.AttributeValue=1)";
  276. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  277. 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}%'))";
  278. else if (!string.IsNullOrEmpty(request.SearchKey))
  279. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%')";
  280. else
  281. sql += $" and a.ParentId={request.FolderId}";
  282. sql +=
  283. $@" ORDER BY a.IsSystemDefault desc,a.AttributeValue desc,a.IsTop DESC,a.Sort DESC , a.LastModifiedDate DESC";
  284. if (request.Page > 0)
  285. sql += $@" limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  286. }
  287. else
  288. {
  289. sql =
  290. $@"SELECT a.Id,a.MiddleId,a.RoleId,a.ParentId,a.AttributeValue,a.UserId,
  291. a.CreatedDate,a.IsTop,a.FolderName,a.FolderType,
  292. (SELECT GROUP_CONCAT(SourceName Separator'、') from tede_user_middle where MiddleType={noteTypeId}
  293. and DataSourceId=a.MiddleSonId) as EnjoyUser,
  294. (SELECT
  295. COUNT(1)
  296. FROM
  297. tede_analyze
  298. WHERE
  299. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  300. AND SourceId = a.MiddleId
  301. AND AnalyzeType = 1) AS PraiseCount,
  302. (SELECT
  303. COUNT(1)
  304. FROM
  305. tede_analyze
  306. WHERE
  307. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  308. AND SourceId = a.MiddleId
  309. AND AnalyzeType = 1
  310. LIMIT 0 , 1) AS IsPraise,
  311. (SELECT
  312. COUNT(1)
  313. FROM
  314. tede_comment
  315. WHERE
  316. UserId = {request.UserId} AND ArticleId = a.MiddleId
  317. AND TypeValue = {noteTypeId}) AS CommentCount,
  318. (SELECT
  319. COUNT(1)
  320. FROM
  321. tede_analyze
  322. WHERE
  323. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  324. AND SourceId = a.MiddleId
  325. AND AnalyzeType = 4) AS RetransmissionCount,
  326. (SELECT
  327. COUNT(1)
  328. FROM
  329. tede_analyze
  330. WHERE
  331. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  332. AND SourceId = a.MiddleId
  333. AND AnalyzeType = 4
  334. LIMIT 0 , 1) AS IsRetransmission,
  335. (SELECT
  336. COUNT(1)
  337. FROM
  338. tede_analyze
  339. WHERE
  340. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  341. AND SourceId = a.MiddleId
  342. AND AnalyzeType = 3
  343. LIMIT 0 , 1) AS IsCollect,
  344. (SELECT
  345. COUNT(1)
  346. FROM
  347. tede_analyze
  348. WHERE
  349. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  350. AND SourceId = a.MiddleId
  351. AND AnalyzeType = 3) AS IsCollect,
  352. (SELECT
  353. COUNT(1)
  354. FROM
  355. tede_middle
  356. WHERE
  357. ParentId = a.Id and IsDelete=0) FileCount, b.Title, b.Content,b.ReadCount,b.MediaId,b.CatalogId,
  358. b.ChapterId,c.Name,c.AvatarUrl,d.Name AS DepartmentName,
  359. (SELECT
  360. FolderName
  361. FROM
  362. tede_middle
  363. WHERE
  364. id = (SELECT
  365. ParentId
  366. FROM
  367. tede_middle
  368. WHERE
  369. MiddleId = a.Id AND FolderType ={noteTypeId})) AS FolderParentName,
  370. (SELECT
  371. Id
  372. FROM
  373. tede_middle
  374. WHERE
  375. id = (SELECT
  376. ParentId
  377. FROM
  378. tede_middle
  379. WHERE
  380. MiddleId = a.Id AND FolderType = {noteTypeId})) AS FolderId
  381. FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id
  382. left join tede_user c on c.Id=b.UserId
  383. left join tede_department d on d.Id=c.DepartmentId
  384. WHERE a.UserId = {request.UserId} AND a.FolderType = {noteTypeId} AND a.IsDelete = 0 ";
  385. if (request.TypeValue == 0)
  386. sql += "and (a.RoleId in(2) or a.AttributeValue=1)";
  387. else
  388. sql += "and (a.RoleId in(1,3) or a.AttributeValue=1)";
  389. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  390. 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}%'))";
  391. else if (!string.IsNullOrEmpty(request.SearchKey))
  392. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%')";
  393. else
  394. sql += $" and a.ParentId={request.FolderId}";
  395. sql +=
  396. $@" ORDER BY a.AttributeValue desc,a.IsTop DESC,a.Sort DESC , a.LastModifiedDate DESC";
  397. if (request.Page > 0)
  398. sql += $@" limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  399. }
  400. return sql;
  401. }
  402. /// <summary>
  403. /// 条数
  404. /// </summary>
  405. /// <param name="request"></param>
  406. /// <returns></returns>
  407. public string GetCollectionSqlCount(NoteSearchPageListRequest request)
  408. {
  409. var noteTypeId = request.TypeValue == 0 ? AllTypeConst.Note.GetHashCode() : AllTypeConst.TopicNote.GetHashCode();
  410. string sql = "";
  411. if (request.VisitUserId > 0)
  412. {
  413. var sqlStr = $"a.Id";
  414. if (request.FolderId > 0)
  415. sqlStr = "a.ParentId";
  416. sql =
  417. $@"SELECT count(1)
  418. FROM tede_middle a LEFT JOIN tede_note b ON a.MiddleId = b.Id
  419. left join tede_user c on c.Id=b.UserId
  420. left join tede_department d on d.Id=c.DepartmentId
  421. WHERE
  422. a.FolderType = {noteTypeId} AND a.userId = {request.VisitUserId}
  423. AND a.IsDelete = 0
  424. AND (a.UserId IN (SELECT
  425. Id
  426. FROM
  427. tede_user
  428. WHERE
  429. 1 = a.RoleId)
  430. OR a.UserId IN (SELECT
  431. Id
  432. FROM
  433. tede_user
  434. WHERE
  435. 0 = a.RoleId)
  436. OR {sqlStr} IN (SELECT
  437. MiddleId
  438. FROM
  439. tede_folder_user
  440. WHERE
  441. UserId = {request.UserId} AND MiddleId = {sqlStr}))";
  442. if (request.TypeValue == 0)
  443. sql += "and (a.RoleId in(2) or a.AttributeValue=1)";
  444. else
  445. sql += "and (a.RoleId in(1,3) or a.AttributeValue=1)";
  446. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  447. 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}%'))";
  448. else if (!string.IsNullOrEmpty(request.SearchKey))
  449. sql += $@" and a.ParentId={request.FolderId} AND(b.Title LIKE '%{request.SearchKey}%' OR a.FolderName LIKE '%{request.SearchKey}%' or b.Content LIKE '%{request.SearchKey}%')";
  450. else
  451. sql += $" and a.ParentId={request.FolderId}";
  452. }
  453. else
  454. {
  455. sql =
  456. $@"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";
  457. if (request.TypeValue == 0)
  458. sql += " and (a.RoleId in(2) or a.AttributeValue=1)";
  459. else
  460. sql += " and (a.RoleId in(1,3) or a.AttributeValue=1)";
  461. if (request.FolderId == 0 && !string.IsNullOrEmpty(request.SearchKey))
  462. 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}%'))";
  463. else if (!string.IsNullOrEmpty(request.SearchKey))
  464. 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}%'))";
  465. else
  466. sql += $" and a.ParentId={request.FolderId}";
  467. }
  468. return sql;
  469. }
  470. public async Task<int> NotePageListCountAsync(string sql)
  471. {
  472. var pagedList = new PagedList<NotePageListRequest>();
  473. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  474. var database = new Database(databaseType, _connectionString);
  475. var connection = database.GetConnection();
  476. var result =
  477. await connection
  478. .ExecuteScalarAsync<int>(sql);
  479. return result;
  480. }
  481. /// <summary>
  482. /// 删除笔记
  483. /// </summary>
  484. /// <param name="id"></param>
  485. /// <returns></returns>
  486. public async Task<bool> DeleteAsync(int id) => await _repository.DeleteAsync(id);
  487. /// <summary>
  488. ///查询个人摘录
  489. /// </summary>
  490. /// <param name="request"></param>
  491. /// <returns></returns>
  492. public async Task<PagedList<NoteUserExtractResult>> GetAllByUserId(NoteUserRequest request)
  493. {
  494. var result = new PagedList<NoteUserExtractResult>();
  495. var sql = $@"SELECT
  496. a.Id,
  497. a.CreatedDate,
  498. a.Title,
  499. a.Content,
  500. a.UserId,
  501. a.ReadCount,
  502. a.HtmlContent,
  503. a.MediaId,
  504. a.CatalogId,
  505. a.ChapterId,
  506. (SELECT
  507. COUNT(1)
  508. FROM
  509. tede_analyze
  510. WHERE
  511. UserId = {request.UserId} AND TypeValue = 3
  512. AND SourceId = a.Id
  513. AND AnalyzeType = 1) AS PraiseCount,
  514. (SELECT
  515. COUNT(1)
  516. FROM
  517. tede_analyze
  518. WHERE
  519. UserId = {request.UserId} AND TypeValue = 3
  520. AND SourceId = a.Id
  521. AND AnalyzeType = 1
  522. LIMIT 0 , 1) AS IsPraise,
  523. (SELECT
  524. COUNT(1)
  525. FROM
  526. tede_comment
  527. WHERE
  528. ArticleId = a.Id AND pid = 0
  529. AND TypeValue = 3) AS CommentCount,
  530. (SELECT
  531. COUNT(1)
  532. FROM
  533. tede_analyze
  534. WHERE
  535. UserId = {request.UserId} AND TypeValue = 3
  536. AND SourceId = a.Id
  537. AND AnalyzeType = 4) AS RetransmissionCount,
  538. (SELECT
  539. COUNT(1)
  540. FROM
  541. tede_analyze
  542. WHERE
  543. UserId = {request.UserId} AND TypeValue = 3
  544. AND SourceId = a.Id
  545. AND AnalyzeType = 4
  546. LIMIT 0 , 1) AS IsRetransmission,
  547. b.Name,b.AvatarUrl
  548. FROM
  549. tede_note a
  550. INNER JOIN
  551. tede_user b ON a.UserId = b.Id
  552. WHERE
  553. UserId = {request.UserId} and a.MediaId='{request.MediaId}'
  554. ORDER BY CreatedDate DESC";
  555. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  556. var database = new Database(databaseType, _connectionString);
  557. var connection = database.GetConnection();
  558. result.Items =
  559. await connection
  560. .QueryAsync<NoteUserExtractResult>(sql);
  561. sql = $@"SELECT
  562. count(1)
  563. FROM
  564. tede_note a
  565. INNER JOIN
  566. tede_user b ON a.UserId = b.Id
  567. WHERE
  568. UserId = {request.UserId} and a.MediaId='{request.MediaId}' and a.CatalogId='{request.CatalogId}' and a.ChapterId='{request.ChapterId}'";
  569. result.Total =
  570. await connection.ExecuteScalarAsync<int>(sql);
  571. return result;
  572. }
  573. /// <summary>
  574. /// web页面查询话题
  575. /// </summary>
  576. /// <param name="request"></param>
  577. /// <returns></returns>
  578. public async Task<PagedList<NoteTopicResult>> GetTopicNoteAsync(NoteSearchPageListRequest request)
  579. {
  580. var noteTypeId = GxPress.EnumConst.AllTypeConst.Note.GetHashCode();
  581. var sql = $@"SELECT
  582. a.Id,
  583. a.Title,
  584. a.Content,
  585. a.HtmlContent,
  586. a.CreatedDate,
  587. b.Id as UserId,
  588. b.Name,
  589. b.AvatarUrl,
  590. c.Id,
  591. c.FolderName,
  592. (SELECT
  593. COUNT(1)
  594. FROM
  595. tede_analyze
  596. WHERE
  597. TypeValue ={noteTypeId} AND SourceId = a.Id
  598. AND AnalyzeType = 1) AS PraiseCount,
  599. (SELECT
  600. COUNT(1)
  601. FROM
  602. tede_analyze
  603. WHERE
  604. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  605. AND SourceId = a.Id
  606. AND AnalyzeType = 1
  607. LIMIT 0 , 1) AS IsPraise,
  608. (SELECT
  609. COUNT(1)
  610. FROM
  611. tede_comment
  612. WHERE
  613. ArticleId = a.Id AND TypeValue = {noteTypeId}
  614. AND Pid = 0) AS CommentCount,
  615. (SELECT
  616. COUNT(1)
  617. FROM
  618. tede_analyze
  619. WHERE
  620. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  621. AND SourceId = a.Id
  622. AND AnalyzeType = 4) AS RetransmissionCount,
  623. (SELECT
  624. COUNT(1)
  625. FROM
  626. tede_analyze
  627. WHERE
  628. UserId = {request.UserId} AND TypeValue ={noteTypeId}
  629. AND SourceId = a.Id
  630. AND AnalyzeType = 4
  631. LIMIT 0 , 1) AS IsRetransmission,
  632. (SELECT
  633. COUNT(1)
  634. FROM
  635. tede_analyze
  636. WHERE
  637. UserId = {request.UserId} AND TypeValue = {noteTypeId}
  638. AND SourceId = a.Id
  639. AND AnalyzeType = 3
  640. LIMIT 0 , 1) AS IsCollect
  641. FROM
  642. tede_note a
  643. INNER JOIN
  644. tede_user b ON a.UserId = b.Id
  645. INNER JOIN
  646. tede_middle c ON c.Id = a.FolderId
  647. WHERE
  648. a.IsTopic = 1";
  649. if (!string.IsNullOrEmpty(request.SearchKey))
  650. {
  651. sql += $@" and (b.Name like '%11%' or a.Title like '%11%' or a.Content like '%11%')";
  652. }
  653. sql += $@" AND (a.FolderId IN (SELECT
  654. Id
  655. FROM
  656. tede_middle
  657. WHERE
  658. id IN (SELECT
  659. MiddleId
  660. FROM
  661. tede_folder_user
  662. WHERE
  663. UserId = {request.UserId})
  664. AND RoleId IN (3))
  665. OR a.FolderId IN (SELECT
  666. Id
  667. FROM
  668. tede_middle
  669. WHERE
  670. RoleId IN (1))) ";
  671. sql += $@" limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  672. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  673. var database = new Database(databaseType, _connectionString);
  674. var connection = database.GetConnection();
  675. var result = new PagedList<NoteTopicResult>();
  676. result.Items =
  677. await connection
  678. .QueryAsync<NoteTopicResult, User, Entity.Middle.Middle, NoteTopicResult>(sql,
  679. (noteTopicResult, user, middle) =>
  680. {
  681. noteTopicResult.UserName = user == null ? "" : user.Name;
  682. noteTopicResult.AvatarUrl = user == null ? "" : StringUtils.AddDomainMin(user.AvatarUrl);
  683. noteTopicResult.FolderId = middle == null ? 0 : middle.Id;
  684. noteTopicResult.FolderName = middle == null ? "" : middle.FolderName;
  685. return noteTopicResult;
  686. }, splitOn: "Id,Name,Id");
  687. sql = $@"SELECT
  688. count(1)
  689. FROM
  690. tede_note a
  691. INNER JOIN
  692. tede_user b ON a.UserId = b.Id
  693. INNER JOIN
  694. tede_middle c ON c.Id = a.FolderId
  695. WHERE
  696. a.IsTopic = 1";
  697. if (!string.IsNullOrEmpty(request.SearchKey))
  698. {
  699. sql += $@" and (b.Name like '%11%' or a.Title like '%11%' or a.Content like '%11%')";
  700. }
  701. sql += $@" AND (a.FolderId IN (SELECT
  702. Id
  703. FROM
  704. tede_middle
  705. WHERE
  706. id IN (SELECT
  707. MiddleId
  708. FROM
  709. tede_folder_user
  710. WHERE
  711. UserId = {request.UserId})
  712. AND RoleId IN (3))
  713. OR a.FolderId IN (SELECT
  714. Id
  715. FROM
  716. tede_middle
  717. WHERE
  718. RoleId IN (1))) ";
  719. result.Total =
  720. await connection.ExecuteScalarAsync<int>(sql);
  721. return result;
  722. }
  723. /// <summary>
  724. /// 笔记没有文件夹分页
  725. /// </summary>
  726. /// <param name="request"></param>
  727. /// <returns></returns>
  728. public async Task<PagedList<NoteNotFolderPageResult>> GetNoteNotFolderPageResult(NoteSearchPageListRequest request)
  729. {
  730. var sqlValue = "";
  731. if (!string.IsNullOrEmpty(request.SearchKey))
  732. {
  733. sqlValue += $" and (a.Title like '%{request.SearchKey}%' or a.Content like '%{request.SearchKey}%')";
  734. }
  735. var noteConstValue = GxPress.EnumConst.AllTypeConst.Note.GetHashCode();
  736. var sql = $@"SELECT
  737. a.Id,
  738. a.Title,
  739. a.Content,
  740. a.UserId,
  741. a.CreatedDate,
  742. a.MediaId,
  743. a.ReadCount,
  744. a.IsTop,
  745. (SELECT
  746. FolderName
  747. FROM
  748. tede_middle
  749. WHERE
  750. id = (SELECT
  751. ParentId
  752. FROM
  753. tede_middle
  754. WHERE
  755. MiddleId = a.Id AND FolderType = {noteConstValue})) AS FolderName,
  756. (SELECT
  757. Id
  758. FROM
  759. tede_middle
  760. WHERE
  761. id = (SELECT
  762. ParentId
  763. FROM
  764. tede_middle
  765. WHERE
  766. MiddleId = a.Id AND FolderType = {noteConstValue})) AS FolderId,
  767. (SELECT
  768. COUNT(1)
  769. FROM
  770. tede_analyze
  771. WHERE
  772. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  773. AND SourceId = a.Id
  774. AND AnalyzeType = 1) AS PraiseCount,
  775. (SELECT
  776. COUNT(1)
  777. FROM
  778. tede_analyze
  779. WHERE
  780. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  781. AND SourceId = a.Id
  782. AND AnalyzeType = 1
  783. LIMIT 0 , 1) AS IsPraise,
  784. (SELECT
  785. COUNT(1)
  786. FROM
  787. tede_comment
  788. WHERE
  789. UserId = {request.UserId} AND ArticleId = a.Id
  790. AND TypeValue = {noteConstValue}) AS CommentCount,
  791. (SELECT
  792. COUNT(1)
  793. FROM
  794. tede_analyze
  795. WHERE
  796. UserId = {request.UserId} AND TypeValue ={noteConstValue}
  797. AND SourceId = a.Id
  798. AND AnalyzeType = {noteConstValue}) AS RetransmissionCount,
  799. (SELECT
  800. COUNT(1)
  801. FROM
  802. tede_analyze
  803. WHERE
  804. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  805. AND SourceId = a.Id
  806. AND AnalyzeType = 4
  807. LIMIT 0 , 1) AS IsRetransmission,
  808. (SELECT
  809. COUNT(1)
  810. FROM
  811. tede_analyze
  812. WHERE
  813. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  814. AND SourceId = a.Id
  815. AND AnalyzeType = 3
  816. LIMIT 0 , 1) AS IsCollect,
  817. (SELECT
  818. COUNT(1)
  819. FROM
  820. tede_analyze
  821. WHERE
  822. UserId = {request.UserId} AND TypeValue = {noteConstValue}
  823. AND SourceId = a.Id
  824. AND AnalyzeType = 3) AS IsCollect,
  825. b.Name,
  826. b.AvatarUrl,c.Id,c.MiddleId
  827. FROM
  828. tede_note a
  829. INNER JOIN
  830. tede_user b ON a.UserId = b.Id inner join tede_middle c on c.MiddleId=a.Id
  831. WHERE
  832. a.IsDelete = 0 and a.IsTopic=0 AND a.UserId = {request.UserId} and c.FolderType={noteConstValue} {sqlValue}
  833. ORDER BY a.IsTop desc ,a.LastModifiedDate DESC
  834. limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  835. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypestr, DatabaseType.MySql);
  836. var database = new Database(databaseType, _connectionString);
  837. var connection = database.GetConnection();
  838. var result = new PagedList<NoteNotFolderPageResult>();
  839. result.Items =
  840. await connection
  841. .QueryAsync<NoteNotFolderPageResult, User, Entity.Middle.Middle, NoteNotFolderPageResult>(sql,
  842. (result, user, middle) =>
  843. {
  844. result.MiddleId = middle.MiddleId;
  845. result.Id = middle.Id;
  846. result.Name = user == null ? "" : user.Name;
  847. result.AvatarUrl = user == null ? "" : StringUtils.AddDomainMin(user.AvatarUrl);
  848. return result;
  849. }, splitOn: "Id,Id,Name,Id");
  850. sql = $@"SELECT count(1)
  851. FROM
  852. tede_note a
  853. INNER JOIN
  854. tede_user b ON a.UserId = b.Id inner join tede_middle c on c.MiddleId=a.Id
  855. WHERE
  856. a.IsDelete = 0 and a.IsTopic=0 AND a.UserId = {request.UserId} and c.FolderType={noteConstValue} {sqlValue}";
  857. result.Total = await connection.ExecuteScalarAsync<int>(sql);
  858. return result;
  859. }
  860. /// <summary>
  861. /// 获取用户最近使用的文件夹
  862. /// </summary>
  863. /// <param name="userId"></param>
  864. /// <returns></returns>
  865. public async Task<IEnumerable<int>> GetLatelyFolderIdAsync(int userId, bool isTopic)
  866. {
  867. var query = Q.NewQuery();
  868. query.Select(nameof(Entity.Note.Note.FolderId));
  869. query.Where(nameof(Entity.Note.Note.UserId), userId);
  870. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  871. query.Where(nameof(Entity.Note.Note.FolderId), ">", 0);
  872. query.OrderByDesc(nameof(Entity.Note.Note.CreatedDate));
  873. return await _repository.GetAllAsync<int>(query);
  874. }
  875. /// <summary>
  876. /// 获取用户是否存在草稿
  877. /// </summary>
  878. /// <param name="userId"></param>
  879. /// <returns></returns>
  880. public async Task<bool> IsExistsDraftAsync(int userId, bool isTopic)
  881. {
  882. var query = Q.NewQuery();
  883. query.Where(nameof(Entity.Note.Note.UserId), userId);
  884. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  885. query.Where(nameof(Entity.Note.Note.IsDraft), true);
  886. return await _repository.ExistsAsync(query);
  887. }
  888. /// <summary>
  889. /// 获取用户最新的草稿Id
  890. /// </summary>
  891. /// <param name="userId"></param>
  892. /// <returns></returns>
  893. public async Task<int> GetNoteIdByDraftAsync(int userId, bool isTopic)
  894. {
  895. var query = Q.NewQuery();
  896. query.Where(nameof(Entity.Note.Note.UserId), userId);
  897. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  898. query.Where(nameof(Entity.Note.Note.IsDraft), true);
  899. query.OrderByDesc(nameof(Entity.Note.Note.CreatedDate));
  900. query.Select(nameof(Entity.Note.Note.Id));
  901. return await _repository.GetAsync<int>(query);
  902. }
  903. /// <summary>
  904. /// 获取用户最新的草稿Id
  905. /// </summary>
  906. /// <param name="userId"></param>
  907. /// <returns></returns>
  908. public async Task<int> GetDraftCountAsync(int userId, bool isTopic)
  909. {
  910. var query = Q.NewQuery();
  911. query.Where(nameof(Entity.Note.Note.UserId), userId);
  912. query.Where(nameof(Entity.Note.Note.IsTopic), isTopic);
  913. query.Where(nameof(Entity.Note.Note.IsDraft), true);
  914. return await _repository.CountAsync(query);
  915. }
  916. }
  917. }