NoteRepository.cs 48 KB

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