using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AutoMapper; using Dapper; using GxPress.Common.AppOptions; using GxPress.Common.Page; using GxPress.Common.Tools; using GxPress.Entity; using GxPress.Repository.Interface; using GxPress.Request.App.Topic; using GxPress.Result.App.Topic; using Microsoft.Extensions.Options; using Datory; using GxPress.Entity.Topic; using GxPress.Result; using SqlKata; using GxPress.Result.Job; namespace GxPress.Repository.Implement { public class TopicRepository : ITopicRepository { private readonly Repository _repository; private readonly Repository _topicAddresseeRepository; private readonly Repository _topicCommentRepository; private readonly Repository _userRepository; private readonly Repository _topicAnalyzeRepository; private readonly IMapper _mapper; private readonly string _connectionString; private readonly string _databaseTypeStr; private readonly Repository _groupUserRepository; private readonly Repository _visitRepository; public TopicRepository(IOptionsMonitor dbOptionsAccessor, IMapper mapper) { _databaseTypeStr = dbOptionsAccessor.CurrentValue.DatabaseType; _connectionString = dbOptionsAccessor.CurrentValue.ConnectionString; var databaseType = StringUtils.ToEnum(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql); var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString); _repository = new Repository(database); _topicAddresseeRepository = new Repository(database); _topicCommentRepository = new Repository(database); _userRepository = new Repository(database); _topicAnalyzeRepository = new Repository(database); _groupUserRepository = new Repository(database); _visitRepository = new Repository(database); _mapper = mapper; } public TopicRepository() { } public IDatabase Database => _repository.Database; public string TableName => _repository.TableName; public List TableColumns => _repository.TableColumns; /// /// 根据userId获取话题 /// /// /// public async Task> GetTopicByUserIdAsync(TopicPageSearchRequest request) { var query = Q.NewQuery(); if (request.UserId > 0) { query.Where(nameof(Entity.Topic.Topic.UserId), request.UserId); } if (!string.IsNullOrEmpty(request.Keyword)) { var like = $"%{request.Keyword}%"; query.WhereLike(nameof(Entity.Topic.Topic.Title), like); } var pagedList = new PagedList { Total = await _repository.CountAsync(query) }; var list = await _repository.GetAllAsync(query.ForPage(request.Page, request.PerPage)); pagedList.Items = list; return pagedList; } /// /// APP列表显示用 /// /// /// public List GetListAsync(List contentJsonDataList) { var result = new List(); if (contentJsonDataList.Count > 0) { //查询文本 var txtType = contentJsonDataList.FirstOrDefault(n => n.Type == 1); if (txtType != null) result.Add(txtType); //拼接图片 var imgType = contentJsonDataList.FindAll(n => n.Type == 2); if (imgType.Any()) { foreach (var item in imgType) { //判断图片数量 if (result.Count(n => n.Type == 2) > 8) break; result.Add(item); } } } return result; } /// /// 根据GroupId获取通知 /// /// /// public async Task> FindTopicByGroupIdAsync(TopicDetailListRequest request) { //用户收件人 var resultData = new PagedList(); var showKey = $@"SELECT a.*,(SELECT COUNT(1) FROM ccpph.tede_analyze WHERE TypeValue =1 AND SourceId = a.Id AND AnalyzeType = 1) AS PraiseCount, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 1 AND SourceId = a.Id AND AnalyzeType = 1 LIMIT 0 , 1) AS IsPraise, (SELECT COUNT(1) FROM ccpph.tede_comment WHERE ArticleId = a.Id and pid=0 AND TypeValue = 1) AS CommentCount, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 1 AND SourceId = a.Id AND AnalyzeType = 4) AS RetransmissionCount, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 1 AND SourceId = a.Id AND AnalyzeType = 4 LIMIT 0 , 1) AS IsRetransmission, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 1 AND SourceId = a.Id AND AnalyzeType = 4 LIMIT 0 , 1) AS IsCollect, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 1 AND SourceId = a.Id AND AnalyzeType = 4) AS CollectCount,b.Name,b.AvatarUrl,c.Name FROM"; var countSql = $"SELECT count(1) FROM ccpph.tede_topic a inner join ccpph.tede_user b on a.UserId=b.Id inner join ccpph.tede_Department c on c.Id=b.DepartmentId where a.GroupId={request.GroupId}"; var sql = $"{showKey} ccpph.tede_topic a inner join ccpph.tede_user b on a.UserId=b.Id inner join ccpph.tede_Department c on c.Id=b.DepartmentId where a.GroupId={request.GroupId}"; var strValue = ""; if (!string.IsNullOrEmpty(request.Key)) strValue += $" and (a.Title like '%{request.Key}%' or a.Content like '%{request.Key}%' or b.Name like '%{request.Key}%')"; sql += $"{strValue} order by a.CreatedDate DESC LIMIT @page , @pageSize"; countSql += $"{strValue}"; var databaseType = StringUtils.ToEnum(_databaseTypeStr, DatabaseType.MySql); var database = new Database(databaseType, _connectionString); var connection = database.GetConnection(); var result = connection .Query(sql, (topicListPageResult, user, department) => { topicListPageResult.DepartmentName = department.Name; topicListPageResult.UserName = user.Name; topicListPageResult.AvatarUrl = StringUtils.AddDomainMin(user.AvatarUrl); return topicListPageResult; }, new { page = (request.Page - 1) * request.PerPage, pageSize = request.PerPage }, splitOn: "Name"); resultData.Total = await connection.ExecuteScalarAsync(countSql); var topicListPageResults = result as TopicListPageResult[] ?? result.ToArray(); resultData.Items = topicListPageResults; return resultData; } /// /// 根据小组ID获取话题数量 /// /// /// public async Task GetGroupTopicCountAsync(int groupId) { return await _repository.CountAsync(Q.Where(nameof(Entity.Topic.Topic.GroupId), groupId)); } /// /// 根据ID获取话题 /// /// /// public async Task GetAsync(int id) { return await _repository.GetAsync(id); } public async Task CountAsync(Query query) { return await _repository.CountAsync(query); } public async Task> GetAllAsync(Query query) { return await _repository.GetAllAsync(query); } public async Task InsertAsync(Entity.Topic.Topic topic) { return await _repository.InsertAsync(topic); } public async Task DeleteAsync(int id) { return await _repository.DeleteAsync(id); } public async Task UpdateAsync(Entity.Topic.Topic topic) { return await _repository.UpdateAsync(topic); } /// /// 执行话题 /// /// public async Task> ExecuteTopic() { string sql = "select a.*,b.UserId,b.Id,c.Name,d.AvatarUrl from ccpph.tede_topic a inner join ccpph.tede_topic_addressee b on a.Id=b.TopicId inner join ccpph.tede_user c on c.Id=b.UserId inner join ccpph.tede_user d on d.Id=a.UserId where b.IsUpload=0 order by a.CreatedDate desc limit 0,100"; var databaseType = StringUtils.ToEnum(_databaseTypeStr, DatabaseType.MySql); var database = new Database(databaseType, _connectionString); var connection = database.GetConnection(); var result = await connection.QueryAsync(sql, (jobTopicResult, topicAddressee, user, userDto) => { jobTopicResult.UserId = topicAddressee.UserId; jobTopicResult.Name = user.Name; jobTopicResult.AvatarUrl = userDto.AvatarUrl; jobTopicResult.TopicAddresseeId = topicAddressee.Id; return jobTopicResult; }, splitOn: "UserId,Name,AvatarUrl"); connection.Dispose(); return result.ToList(); } /// /// 新版 获取换题列表 /// /// /// public async Task> GetTopicPage(TopicPageSearchRequest request) { var result = new PagedList(); var databaseType = StringUtils.ToEnum(_databaseTypeStr, DatabaseType.MySql); var database = new Database(databaseType, _connectionString); var connection = database.GetConnection(); result.Items = await connection.QueryAsync(AssembleSql(request), (topicListPageResult, user) => { topicListPageResult.UserName = user != null ? user.Name : ""; topicListPageResult.AvatarUrl = user != null ? StringUtils.AddDomainMin(user.AvatarUrl) : ""; topicListPageResult.FolderResult.Id = topicListPageResult.FolderId; topicListPageResult.FolderResult.FolderName = topicListPageResult.FolderName; return topicListPageResult; }, splitOn: "Id,Name"); result.Total = await connection.ExecuteScalarAsync(AssembleSqlCount(request)); connection.Dispose(); return result; } public string AssembleSql(TopicPageSearchRequest request) { var sql = $@"SELECT a.*, (SELECT FolderName FROM tede_middle WHERE id = c.ParentId) AS FolderName, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE TypeValue = 3 AND SourceId = a.Id AND AnalyzeType = 1) AS PraiseCount, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 3 AND SourceId = a.Id AND AnalyzeType = 1 LIMIT 0 , 1) AS IsPraise, (SELECT COUNT(1) FROM ccpph.tede_comment WHERE ArticleId = a.Id AND TypeValue = 3 AND Pid = 0) AS CommentCount, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 3 AND SourceId = a.Id AND AnalyzeType = 4) AS RetransmissionCount, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 3 AND SourceId = a.Id AND AnalyzeType = 4 LIMIT 0 , 1) AS IsRetransmission, (SELECT COUNT(1) FROM ccpph.tede_analyze WHERE UserId = {request.UserId} AND TypeValue = 3 AND SourceId = a.Id AND AnalyzeType = 3 LIMIT 0 , 1) AS IsCollect, b.Name, b.AvatarUrl,c.ParentId as FolderId FROM ccpph.tede_note a INNER JOIN ccpph.tede_user b ON a.UserId = b.Id INNER JOIN ccpph.tede_middle c ON c.MiddleId = a.Id INNER JOIN ccpph.tede_middle d ON d.Id = c.ParentId WHERE c.FolderType = 4 and c.IsDelete=0 and c.ParentId>0 AND (d.RoleId=1 or d.id IN (SELECT MiddleId FROM ccpph.tede_folder_user WHERE UserId = {request.UserId}))"; if (request.TopicGroupIds.Count > 0) { var topicGroupId = ""; foreach (var item in request.TopicGroupIds) { topicGroupId += $"{item},"; } topicGroupId = topicGroupId.Remove(topicGroupId.Length - 1, 1); sql += $@" AND a.UserId IN (SELECT UserId FROM tede_topic_group_user WHERE TopicGroupId IN ({topicGroupId}))"; } if (!string.IsNullOrWhiteSpace(request.Keyword)) { sql += $@" AND (b.Name LIKE '%{request.Keyword}%' OR a.Title LIKE '%{request.Keyword}%' OR a.HtmlContent LIKE '%{request.Keyword}%')"; } sql += $@" ORDER BY a.CreatedDate DESC LIMIT {(request.Page - 1) * request.PerPage} , {request.PerPage}"; return sql; } public string AssembleSqlCount(TopicPageSearchRequest request) { var sql = $@"SELECT count(1) FROM ccpph.tede_note a INNER JOIN ccpph.tede_user b ON a.UserId = b.Id INNER JOIN ccpph.tede_middle c ON c.MiddleId = a.Id INNER JOIN ccpph.tede_middle d ON d.Id = c.ParentId WHERE c.FolderType = 4 and c.IsDelete=0 and c.ParentId>0 AND (d.RoleId=1 or d.id IN (SELECT MiddleId FROM ccpph.tede_folder_user WHERE UserId = {request.UserId}))"; if (request.TopicGroupIds.Count > 0) { var topicGroupId = ""; foreach (var item in request.TopicGroupIds) { topicGroupId += $"{item},"; } topicGroupId = topicGroupId.Remove(topicGroupId.Length - 1, 1); sql += $@" AND a.UserId IN (SELECT UserId FROM tede_topic_group_user WHERE TopicGroupId IN ({topicGroupId}))"; } if (!string.IsNullOrWhiteSpace(request.Keyword)) { sql += $@" AND (b.Name LIKE '%{request.Keyword}%' OR a.Title LIKE '%{request.Keyword}%' OR a.HtmlContent LIKE '%{request.Keyword}%')"; } return sql; } } }