NoteRepository.cs 47 KB

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