NoteRepository.cs 48 KB

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