GroupRepository.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using AutoMapper;
  4. using Dapper;
  5. using GxPress.Common.AppOptions;
  6. using GxPress.Common.Exceptions;
  7. using GxPress.Common.Page;
  8. using GxPress.Common.Tools;
  9. using GxPress.Entity;
  10. using GxPress.EnumConst;
  11. using GxPress.Repository.Interface;
  12. using GxPress.Request.App.Group;
  13. using GxPress.Result.App.Group;
  14. using GxPress.Result.App.GroupUser;
  15. using Microsoft.AspNetCore.Hosting;
  16. using Microsoft.Extensions.Options;
  17. using Newtonsoft.Json;
  18. using Datory;
  19. using GxPress.Request.App.Topic;
  20. using SqlKata;
  21. using GxPress.Result.Job;
  22. using System.Linq;
  23. namespace GxPress.Repository.Implement
  24. {
  25. public class GroupRepository : IGroupRepository
  26. {
  27. private readonly Repository<Entity.Group> _repository;
  28. private readonly IMapper _mapper;
  29. private readonly IWebHostEnvironment _environment;
  30. private readonly string _connectionString;
  31. private readonly string _databaseTypeStr;
  32. private readonly Repository<GroupUser> _groupUserRepository;
  33. private readonly Repository<Entity.Middle.Middle> middleRepository;
  34. public GroupRepository(IOptionsMonitor<DatabaseOptions> dbOptionsAccessor, IMapper mapper,
  35. IWebHostEnvironment environment)
  36. {
  37. _databaseTypeStr = dbOptionsAccessor.CurrentValue.DatabaseType;
  38. _connectionString = dbOptionsAccessor.CurrentValue.ConnectionString;
  39. var databaseType =
  40. StringUtils.ToEnum<DatabaseType>(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql);
  41. var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString);
  42. _repository = new Repository<Entity.Group>(database);
  43. _groupUserRepository = new Repository<GroupUser>(database);
  44. middleRepository = new Repository<Entity.Middle.Middle>(database);
  45. _environment = environment;
  46. _mapper = mapper;
  47. }
  48. public IDatabase Database => _repository.Database;
  49. public string TableName => _repository.TableName;
  50. public List<TableColumn> TableColumns => _repository.TableColumns;
  51. public async Task<int> InsertAsync(GroupInRequest request)
  52. {
  53. if (string.IsNullOrEmpty(request.Name))
  54. throw new BusinessException("小组名称不能为空");
  55. var group = new Entity.Group
  56. {
  57. Name = request.Name,
  58. AvatarUrl = request.AvatarUrl,
  59. Introduce = request.Introduce,
  60. IsAdmin = false,
  61. IsUDisturb = false,
  62. QRCoder = request.QRCoder,
  63. IsWords = false,
  64. UserId = request.UserId,
  65. GroupCategroyId = request.GroupCategroyId,
  66. LabelName = request.LabelName,
  67. IsShow = request.IsShow
  68. };
  69. if (!string.IsNullOrEmpty(group.AvatarUrl))
  70. group.AvatarUrl = StringUtils.RemoveDomain(group.AvatarUrl);
  71. var id = await _repository.InsertAsync(group);
  72. //生成二维码
  73. var groupDto = await _repository.GetAsync(id);
  74. var qrCodeData = new { key = QRCodeTypeConst.GroupInfo, value = groupDto.Guid };
  75. var resultPath =
  76. FileHelper.SaveQRCodeFile(StringUtils.GetWebRootPath(_environment.WebRootPath),
  77. JsonConvert.SerializeObject(qrCodeData));
  78. groupDto.QRCoder = resultPath.RelativePath;
  79. groupDto.Sort = id;
  80. await _repository.UpdateAsync(groupDto);
  81. return id;
  82. }
  83. public async Task<IEnumerable<GroupUser>> GetAllAsync(SqlKata.Query query)
  84. {
  85. return await _groupUserRepository.GetAllAsync(query);
  86. }
  87. /// <summary>
  88. /// 修改小组
  89. /// </summary>
  90. /// <param name="request"></param>
  91. /// <returns></returns>
  92. public async Task<bool> UpdateAsync(GroupUpRequest request)
  93. {
  94. var group = await _repository.GetAsync(request.Id);
  95. if (!string.IsNullOrEmpty(request.Name))
  96. group.Name = request.Name;
  97. if (request.GroupCategroyId > 0)
  98. group.GroupCategroyId = request.GroupCategroyId;
  99. if (!string.IsNullOrEmpty(request.AvatarUrl))
  100. {
  101. group.HistoryAvatarUrl = group.AvatarUrl;
  102. group.AvatarUrl = StringUtils.RemoveDomain(request.AvatarUrl);
  103. }
  104. if (!string.IsNullOrEmpty(request.Introduce))
  105. group.Introduce = request.Introduce;
  106. if (!string.IsNullOrEmpty(request.LabelName))
  107. group.LabelName = request.LabelName;
  108. if (request.IsShow > 0)
  109. group.IsShow = request.IsShow == 1;
  110. if (request.IsAdmin > 0)
  111. group.IsAdmin = request.IsAdmin == 1;
  112. if (request.IsWords > 0)
  113. group.IsWords = request.IsWords == 1;
  114. if (request.Sort > 0)
  115. group.Sort = request.Sort;
  116. return await _repository.UpdateAsync(group);
  117. }
  118. /// <summary>
  119. /// 修改小组
  120. /// </summary>
  121. /// <param name="request"></param>
  122. /// <returns></returns>
  123. public async Task<bool> UpdateAsync(Entity.Group group)
  124. {
  125. return await _repository.UpdateAsync(group);
  126. }
  127. /// <summary>
  128. /// 删除小组
  129. /// </summary>
  130. /// <param name="id"></param>
  131. /// <returns></returns>
  132. public async Task<bool> DeleteAsync(int id)
  133. {
  134. return await _repository.DeleteAsync(id);
  135. }
  136. public async Task<bool> DeleteAsync(Query query)
  137. {
  138. return await _repository.DeleteAsync(query) > 0;
  139. }
  140. /// <summary>
  141. /// 查询小组
  142. /// </summary>
  143. /// <param name="request"></param>
  144. /// <returns></returns>
  145. public async Task<IEnumerable<GroupUserFindResult>> FindGroupByGroupFolderId(GroupSearchRequest request)
  146. {
  147. //var pagedList = new PagedList<GroupUserFindResult>();
  148. var groupConst = AllTypeConst.Group.GetHashCode();
  149. var query = new SqlKata.Query("tede_Middle");
  150. query.LeftJoin("tede_group", "tede_group.Id", "tede_Middle.MiddleId");
  151. if (request.GroupFolderId > 0)
  152. query.Where("tede_Middle.ParentId", request.GroupFolderId);
  153. if (!string.IsNullOrEmpty(request.Key))
  154. query.Where(n => n.OrWhereLike("tede_Middle.FolderName", $"%request.Key%").OrWhereLike("tede_group.Name", $"%{request.Key}%"));
  155. if (string.IsNullOrEmpty(request.Key) && request.GroupFolderId == 0)
  156. query.Where("tede_Middle.ParentId", request.GroupFolderId);
  157. query.Where("tede_Middle.UserId", request.UserId);
  158. query.Where("tede_Middle.IsDelete", false);
  159. query.Where("tede_Middle.FolderType", groupConst);
  160. query.Where("tede_Middle.IsTop", true);
  161. query.OrderByDesc("tede_Middle.IsTop");
  162. query.OrderByDesc("tede_Middle.LastModifiedDate");
  163. var topicSharingCountQuery = new SqlKata.Query("tede_group_user");
  164. topicSharingCountQuery.WhereColumns("tede_group_user.GroupId", "=", "tede_Middle.MiddleId");
  165. topicSharingCountQuery.AsCount();
  166. query.Select(topicSharingCountQuery, "TopicSharingCount");
  167. var topicAllCountQuery = new SqlKata.Query("tede_topic");
  168. topicAllCountQuery.WhereColumns("tede_topic.GroupId", "=", "tede_Middle.MiddleId");
  169. topicAllCountQuery.Where("tede_topic.IsDraft", false);
  170. topicAllCountQuery.AsCount();
  171. query.Select(topicAllCountQuery, "TopicAllCount");
  172. var groupCountQuery = new SqlKata.Query("tede_middle as a");
  173. groupCountQuery.WhereColumns("a.parentId", "=", "tede_Middle.Id");
  174. groupCountQuery.AsCount();
  175. query.Select(groupCountQuery, "GroupCount");
  176. var uReadTopicCountQuery = new SqlKata.Query("tede_topic");
  177. uReadTopicCountQuery.WhereColumns("tede_topic.groupId", "=", "tede_group.Id");
  178. var groupUserQuery = new SqlKata.Query("tede_group_user");
  179. groupUserQuery.WhereColumns("tede_group_user.groupId", "=", "tede_group.Id");
  180. groupUserQuery.Where("tede_group_user.userId", request.UserId);
  181. groupUserQuery.Select("ReadDate");
  182. uReadTopicCountQuery.Where("tede_topic.LastModifiedDate", ">", groupUserQuery);
  183. uReadTopicCountQuery.AsCount();
  184. query.Select(uReadTopicCountQuery, "UReadTopicCount");
  185. var categoryNameQuery = new SqlKata.Query("tede_middle as a");
  186. categoryNameQuery.WhereColumns("a.Id", "=", "tede_Middle.ParentId");
  187. categoryNameQuery.Select("a.FolderName");
  188. query.Select(categoryNameQuery, "CategoryName");
  189. var fileCountQuery = new SqlKata.Query("tede_group");
  190. var middleQuery = new SqlKata.Query("tede_Middle as a");
  191. middleQuery.WhereColumns("a.ParentId", "=", "tede_Middle.Id");
  192. middleQuery.Select("a.MiddleId");
  193. fileCountQuery.WhereIn("tede_group.Id", middleQuery);
  194. fileCountQuery.AsCount();
  195. query.Select(fileCountQuery, "FileCount");
  196. query.Select("tede_Middle.{Id,IsTop,FolderName,AttributeValue}",
  197. "tede_group.{Id as GroupId,AvatarUrl,Name as GroupName}");
  198. var result = new List<GroupUserFindResult>();
  199. result.AddRange(await middleRepository.GetAllAsync<GroupUserFindResult>(query));
  200. query = new SqlKata.Query("tede_Middle");
  201. query.LeftJoin("tede_group", "tede_group.Id", "tede_Middle.MiddleId");
  202. if (request.GroupFolderId > 0)
  203. query.Where("tede_Middle.ParentId", request.GroupFolderId);
  204. if (!string.IsNullOrEmpty(request.Key))
  205. query.Where(n => n.OrWhereLike("tede_Middle.FolderName", $"%request.Key%").OrWhereLike("tede_group.Name", $"%{request.Key}%"));
  206. if (string.IsNullOrEmpty(request.Key) && request.GroupFolderId == 0)
  207. query.Where("tede_Middle.ParentId", request.GroupFolderId);
  208. query.Where("tede_Middle.UserId", request.UserId);
  209. query.Where("tede_Middle.IsDelete", false);
  210. query.Where("tede_Middle.FolderType", groupConst);
  211. query.Where("tede_Middle.IsTop", false);
  212. query.OrderByDesc("tede_group.LastModifiedDate");
  213. topicSharingCountQuery = new SqlKata.Query("tede_group_user");
  214. topicSharingCountQuery.WhereColumns("tede_group_user.GroupId", "=", "tede_Middle.MiddleId");
  215. topicSharingCountQuery.AsCount();
  216. query.Select(topicSharingCountQuery, "TopicSharingCount");
  217. topicAllCountQuery = new SqlKata.Query("tede_topic");
  218. topicAllCountQuery.WhereColumns("tede_topic.GroupId", "=", "tede_Middle.MiddleId");
  219. topicAllCountQuery.Where("tede_topic.IsDraft", false);
  220. topicAllCountQuery.AsCount();
  221. query.Select(topicAllCountQuery, "TopicAllCount");
  222. groupCountQuery = new SqlKata.Query("tede_middle as a");
  223. groupCountQuery.WhereColumns("a.parentId", "=", "tede_Middle.Id");
  224. groupCountQuery.AsCount();
  225. query.Select(groupCountQuery, "GroupCount");
  226. uReadTopicCountQuery = new SqlKata.Query("tede_topic");
  227. uReadTopicCountQuery.WhereColumns("tede_topic.groupId", "=", "tede_group.Id");
  228. groupUserQuery = new SqlKata.Query("tede_group_user");
  229. groupUserQuery.WhereColumns("tede_group_user.groupId", "=", "tede_group.Id");
  230. groupUserQuery.Where("tede_group_user.userId", request.UserId);
  231. groupUserQuery.Select("ReadDate");
  232. uReadTopicCountQuery.Where("tede_topic.LastModifiedDate", ">", groupUserQuery);
  233. uReadTopicCountQuery.AsCount();
  234. query.Select(uReadTopicCountQuery, "UReadTopicCount");
  235. categoryNameQuery = new SqlKata.Query("tede_middle as a");
  236. categoryNameQuery.WhereColumns("a.Id", "=", "tede_Middle.ParentId");
  237. categoryNameQuery.Select("a.FolderName");
  238. query.Select(categoryNameQuery, "CategoryName");
  239. fileCountQuery = new SqlKata.Query("tede_group");
  240. middleQuery = new SqlKata.Query("tede_Middle as a");
  241. middleQuery.WhereColumns("a.ParentId", "=", "tede_Middle.Id");
  242. middleQuery.Select("a.MiddleId");
  243. fileCountQuery.WhereIn("tede_group.Id", middleQuery);
  244. fileCountQuery.AsCount();
  245. query.Select(fileCountQuery, "FileCount");
  246. query.Select("tede_Middle.{Id,IsTop,FolderName,AttributeValue}",
  247. "tede_group.{Id as GroupId,AvatarUrl,Name as GroupName}");
  248. result.AddRange(await middleRepository.GetAllAsync<GroupUserFindResult>(query));
  249. return result;
  250. }
  251. /// <summary>
  252. /// 条数
  253. /// </summary>
  254. /// <param name="sql"></param>
  255. /// <returns></returns>
  256. public async Task<int> FindGroupByGroupFolderIdCountAsync(string sql)
  257. {
  258. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  259. var database = new Database(databaseType, _connectionString);
  260. var connection = database.GetConnection();
  261. var result = await connection.ExecuteScalarAsync<int>(sql);
  262. return result;
  263. }
  264. /// <summary>
  265. /// 获取小组详情
  266. /// </summary>
  267. /// <param name="request"></param>
  268. /// <returns></returns>
  269. public async Task<GroupDetailResult> GroupDetailAsync(GroupDetailRequest request)
  270. {
  271. var groupDetail = await _repository.GetAsync(request.GroupId);
  272. if (groupDetail == null)
  273. throw new BusinessException("小组不存在");
  274. if (!string.IsNullOrEmpty(groupDetail.AvatarUrl))
  275. groupDetail.AvatarUrl = StringUtils.AddDomain(groupDetail.AvatarUrl);
  276. if (!string.IsNullOrEmpty(groupDetail.AvatarUrl))
  277. groupDetail.AvatarUrl = StringUtils.AddDomain(groupDetail.AvatarUrl);
  278. if (!string.IsNullOrEmpty(groupDetail.HistoryAvatarUrl))
  279. groupDetail.HistoryAvatarUrl = StringUtils.AddDomain(groupDetail.HistoryAvatarUrl);
  280. var sql =
  281. $@"SELECT a.Id,a.GroupUserRoleId,a.CreatedDate,a.GroupId,b.Id as UserId,b.Name,b.AvatarUrl,b.Email,b.ImId,c.Name as DepartmentName FROM tede_group_user a
  282. inner join tede_user b on a.UserId=b.Id
  283. inner join tede_department c on b.DepartmentId=c.Id
  284. where a.GroupId={request.GroupId} order by a.GroupUserRoleId";
  285. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  286. var database = new Database(databaseType, _connectionString);
  287. var connection = database.GetConnection();
  288. var result =
  289. await connection
  290. .QueryAsync<GroupUserListResult>(sql);
  291. foreach (var item in result)
  292. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  293. var groupDetailResult = _mapper.Map<GroupDetailResult>(groupDetail);
  294. groupDetailResult.GroupUserListResult = result;
  295. var groupUser = await _groupUserRepository.GetAsync(Q.Where(nameof(GroupUser.UserId), request.UserId)
  296. .Where(nameof(GroupUser.GroupId), request.GroupId));
  297. //获取当前用户的权限
  298. groupDetailResult.GroupUserRoleId = groupUser != null ? groupUser.GroupUserRoleId : 0;
  299. groupDetailResult.IsUDisturb = groupUser != null ? groupUser.IsUDisturb : false;
  300. groupDetailResult.IsCreator = groupDetail != null && groupUser != null ? groupDetail.UserId == groupUser.UserId : false;
  301. groupDetailResult.IsUser = groupUser != null ? groupUser.UserId == request.UserId : false;
  302. groupDetailResult.CreatedDate = groupDetail.CreatedDate;
  303. groupDetailResult.QRCoder = StringUtils.AddDomain(groupDetailResult.QRCoder);
  304. if (groupDetailResult.GroupUserListResult != null && groupDetailResult.GroupUserListResult.Count() > 0)
  305. {
  306. var roleIds = new List<GroupUserRoleTyeConst> { GroupUserRoleTyeConst.Admin, GroupUserRoleTyeConst.SuperAdmin };
  307. groupDetailResult.MainMemberListResult = groupDetailResult.GroupUserListResult.Where(n => roleIds.Contains(n.GroupUserRoleId));
  308. groupDetailResult.MainMemberCount = groupDetailResult.MainMemberListResult.Count();
  309. groupDetailResult.CommonMemberListResult = groupDetailResult.GroupUserListResult.Where(n => !roleIds.Contains(n.GroupUserRoleId));
  310. groupDetailResult.CommonMemberCount = groupDetailResult.CommonMemberListResult.Count();
  311. }
  312. return groupDetailResult;
  313. }
  314. /// <summary>
  315. /// 搜索小组成员
  316. /// </summary>
  317. /// <param name="request"></param>
  318. /// <returns></returns>
  319. public async Task<IEnumerable<GroupUserListResult>> SearchGroupUserAsync(TopicDetailListRequest request)
  320. {
  321. string sql =
  322. $@"SELECT a.*, b.Name, b.AvatarUrl, c.Name FROM tede_group_user a INNER JOIN tede_user b ON a.UserId = b.Id INNER JOIN
  323. tede_department c ON b.DepartmentId = c.Id
  324. WHERE a.GroupId = {request.GroupId} and b.Name like '%{request.Key}%'";
  325. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  326. var database = new Database(databaseType, _connectionString);
  327. var connection = database.GetConnection();
  328. var result =
  329. await connection
  330. .QueryAsync<GroupUserListResult, User, Department, GroupUserListResult>(sql,
  331. (groupUserListResult, user, department) =>
  332. {
  333. groupUserListResult.DepartmentName = department.Name;
  334. groupUserListResult.Name = user.Name;
  335. groupUserListResult.AvatarUrl = StringUtils.AddDomainMin(user.AvatarUrl);
  336. return groupUserListResult;
  337. }, splitOn: "Name");
  338. return result;
  339. }
  340. /// <summary>
  341. /// 获取小组详情
  342. /// </summary>
  343. /// <param name="guId"></param>
  344. /// <param name="userId"></param>
  345. /// <returns></returns>
  346. public async Task<GroupDetailResult> GroupDetailByGuIdAsync(string guId, int userId)
  347. {
  348. var groupDetail = await _repository.GetAsync(Q.Where(nameof(Entity.Group.Guid), guId));
  349. if (groupDetail == null)
  350. throw new BusinessException("小组不存在");
  351. if (!string.IsNullOrEmpty(groupDetail.AvatarUrl))
  352. groupDetail.AvatarUrl = StringUtils.AddDomainMin(groupDetail.AvatarUrl);
  353. if (!string.IsNullOrEmpty(groupDetail.QRCoder))
  354. groupDetail.QRCoder = StringUtils.AddDomain(groupDetail.QRCoder);
  355. var sql =
  356. "SELECT a.*,b.Name,b.AvatarUrl,c.Name FROM tede_group_user a inner join tede_user b on a.UserId=b.Id inner join tede_department c on b.DepartmentId=c.Id where a.GroupId=@groupId";
  357. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  358. var database = new Database(databaseType, _connectionString);
  359. var connection = database.GetConnection();
  360. var result =
  361. await connection
  362. .QueryAsync<GroupUserListResult, User, Department, GroupUserListResult>(sql,
  363. (groupUserListResult, user, department) =>
  364. {
  365. groupUserListResult.DepartmentName = department.Name;
  366. groupUserListResult.Name = user.Name;
  367. groupUserListResult.AvatarUrl = StringUtils.AddDomainMin(user.AvatarUrl);
  368. return groupUserListResult;
  369. }, new { groupId = groupDetail.Id }, splitOn: "Name");
  370. var groupDetailResult = _mapper.Map<GroupDetailResult>(groupDetail);
  371. groupDetailResult.GroupUserListResult = result;
  372. var groupUser = await _groupUserRepository.GetAsync(Q.Where(nameof(GroupUser.UserId), userId)
  373. .Where(nameof(GroupUser.Guid), guId));
  374. groupDetailResult.GroupUserRoleId = groupUser?.GroupUserRoleId ?? GroupUserRoleTyeConst.General;
  375. //获取当前用户的权限
  376. return groupDetailResult;
  377. }
  378. /// <summary>
  379. /// 获取用户未读取话题数量
  380. /// </summary>
  381. /// <param name="userId"></param>
  382. /// <param name="groupId"></param>
  383. /// <returns></returns>
  384. public async Task<int> GetUReadCountAsync(int userId, int groupId)
  385. {
  386. string sql =
  387. @"select count(1) from tede_topic a inner join tede_topic_addressee b on a.Id=b.TopicId where b.UserId=@userId and b.IsRead=0 and a.GroupId=@groupId";
  388. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  389. var database = new Database(databaseType, _connectionString);
  390. var connection = database.GetConnection();
  391. var result = await connection.ExecuteScalarAsync<int>(sql, new { userId, groupId });
  392. return result;
  393. }
  394. /// <summary>
  395. /// 获取小组的共享话题数量
  396. /// </summary>
  397. /// <param name="groupId"></param>
  398. /// <returns></returns>
  399. public async Task<int> SharingCountAsync(int groupId)
  400. {
  401. var sql =
  402. $"select count(1) from tede_group_user where GroupId={groupId}";
  403. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  404. var database = new Database(databaseType, _connectionString);
  405. var connection = database.GetConnection();
  406. var result = await connection.ExecuteScalarAsync<int>(sql, new { GroupId = groupId });
  407. return result;
  408. }
  409. public async Task<Entity.Group> GetAsync(int id)
  410. {
  411. return await _repository.GetAsync(id);
  412. }
  413. /// <summary>
  414. /// 是开启管理员同意加入
  415. /// </summary>
  416. /// <param name="groupId"></param>
  417. /// <returns></returns>
  418. public async Task<bool> SetGroupIsAdminAsync(int groupId)
  419. {
  420. var group = await GetAsync(groupId);
  421. return await _repository.UpdateAsync(Q.Set(nameof(Entity.Group.IsAdmin), !group.IsAdmin)
  422. .Where(nameof(Entity.Group.Id), groupId)) > 0;
  423. }
  424. /// <summary>
  425. /// 是否禁言
  426. /// </summary>
  427. /// <param name="groupId"></param>
  428. /// <returns></returns>
  429. public async Task<bool> SetGroupIsWordsAsync(int groupId)
  430. {
  431. var group = await GetAsync(groupId);
  432. return await _repository.UpdateAsync(Q.Set(nameof(Entity.Group.IsWords), !group.IsWords)
  433. .Where(nameof(Entity.Group.Id), groupId)) > 0;
  434. }
  435. public async Task<List<JobGroupResult>> ElasticSearchGroup()
  436. {
  437. var sql = @"select a.Id,a.GuId,a.UserId,b.Id,b.Name,b.AvatarUrl,b.CreatedDate,c.Name from tede_middle a
  438. inner join tede_group b on a.MiddleId=b.Id
  439. inner join tede_user c on c.Id=b.UserId
  440. where a.FolderType=7 and a.IsUpload=0 order by a.CreatedDate desc limit 0,100";
  441. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  442. var database = new Database(databaseType, _connectionString);
  443. var connection = database.GetConnection();
  444. var items = await connection
  445. .QueryAsync<JobGroupResult, Entity.Group, User, JobGroupResult>(sql,
  446. (jobGroupResult, group, user) =>
  447. {
  448. jobGroupResult.MiddleId = jobGroupResult.Id;
  449. jobGroupResult.Id = group.Id;
  450. jobGroupResult.Name = group != null ? group.Name : "";
  451. jobGroupResult.AvatarUrl = group != null ? group.AvatarUrl : "";
  452. return jobGroupResult;
  453. },
  454. splitOn: "Id,Id,Name");
  455. return items.ToList();
  456. }
  457. /// <summary>
  458. /// 根据广场类别查询小组
  459. /// </summary>
  460. /// <param name="categoryId"></param>
  461. /// <returns></returns>
  462. public async Task<IEnumerable<SearchGroupDetailResult>> GetAllAsync(int categoryId, int userId)
  463. {
  464. var sql = $@"SELECT
  465. a.Id,
  466. a.Name,
  467. a.AvatarUrl,
  468. a.Introduce,
  469. a.IsAdmin,
  470. (SELECT
  471. COUNT(1)
  472. FROM
  473. tede_group_user
  474. WHERE
  475. GroupId = a.Id) AS UserCount,
  476. (SELECT
  477. COUNT(1)
  478. FROM
  479. tede_topic
  480. WHERE
  481. GroupId = a.Id) AS TopicCount
  482. FROM
  483. tede_group a
  484. WHERE
  485. a.GroupCategroyId = {categoryId} and a.IsShow=1 order by a.Sort desc";
  486. if (userId > 0)
  487. {
  488. sql = $@"SELECT
  489. a.Id,
  490. a.Name,
  491. a.AvatarUrl,
  492. a.Introduce,
  493. a.IsAdmin,
  494. (SELECT
  495. COUNT(1)
  496. FROM
  497. tede_group_user
  498. WHERE
  499. GroupId = a.Id) AS UserCount,
  500. (SELECT
  501. COUNT(1)
  502. FROM
  503. tede_topic
  504. WHERE
  505. GroupId = a.Id) AS TopicCount,
  506. (SELECT
  507. COUNT(1)
  508. FROM
  509. tede_group_user
  510. WHERE
  511. GroupId = a.Id AND UserId = {userId}
  512. LIMIT 1) AS IsUser,
  513. (SELECT
  514. count(1)
  515. FROM
  516. tede_admin_verify
  517. WHERE
  518. SourceType = 1 AND VerifyType = 3
  519. AND UserId = {userId}
  520. AND DisposeType = 0
  521. AND SourceId = a.Id limit 1) as IsApply
  522. FROM
  523. tede_group a where a.GroupCategroyId = {categoryId} and a.IsShow=1 order by a.Sort desc";
  524. }
  525. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  526. var database = new Database(databaseType, _connectionString);
  527. var connection = database.GetConnection();
  528. var result = await connection.QueryAsync<SearchGroupDetailResult>(sql);
  529. //return await _repository.GetAllAsync(Q.Where(nameof(Entity.Group.GroupCategroyId), categoryId));
  530. return result;
  531. }
  532. /// <summary>
  533. /// 用户小组列表
  534. /// </summary>
  535. /// <param name="userId"></param>
  536. /// <returns></returns>
  537. public async Task<IEnumerable<UserGroupList>> GetAllByUserIdAsync(int userId)
  538. {
  539. var groupConstValue = AllTypeConst.Group.GetHashCode();
  540. string sql = $@"SELECT
  541. b.*,
  542. (SELECT
  543. COUNT(1)
  544. FROM
  545. tede_group_user
  546. WHERE
  547. GroupId = a.MiddleId) AS UserCount
  548. FROM
  549. tede_middle a
  550. INNER JOIN
  551. tede_group b ON a.MiddleId = b.Id
  552. WHERE
  553. a.FolderType ={groupConstValue} AND a.UserId ={userId}
  554. AND a.IsDelete = 0";
  555. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  556. var database = new Database(databaseType, _connectionString);
  557. var connection = database.GetConnection();
  558. var items = await connection
  559. .QueryAsync<UserGroupList>(sql);
  560. foreach (var item in items)
  561. item.AvatarUrl = StringUtils.AddDomain(item.AvatarUrl);
  562. return items;
  563. }
  564. /// <summary>
  565. /// 或者最近使用的小组
  566. /// </summary>
  567. /// <param name="userId"></param>
  568. /// <returns></returns>
  569. public async Task<IEnumerable<LatelyGroupDetailResult>> GetLatelyGroupDetailResultAsync(int userId)
  570. {
  571. string sql = $@"
  572. SELECT
  573. a.Id,
  574. a.Name,
  575. a.AvatarUrl,
  576. (SELECT
  577. COUNT(1)
  578. FROM
  579. tede_group_user
  580. WHERE
  581. GroupId = a.Id) AS UserCount
  582. FROM
  583. tede_group a
  584. INNER JOIN
  585. tede_middle b ON a.Id = b.MiddleId
  586. WHERE
  587. b.UserId = {userId} AND b.FolderType = {AllTypeConst.Group.GetHashCode()}
  588. AND b.IsDelete = 0
  589. AND a.Id IN (SELECT
  590. GroupId
  591. FROM
  592. tede_topic
  593. WHERE
  594. GroupId > 0 AND UserId = {userId}
  595. ORDER BY CreatedDate DESC)";
  596. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  597. var database = new Database(databaseType, _connectionString);
  598. var connection = database.GetConnection();
  599. var items = await connection
  600. .QueryAsync<LatelyGroupDetailResult>(sql);
  601. foreach (var item in items)
  602. {
  603. item.AvatarUrl = StringUtils.AddDomain(item.AvatarUrl);
  604. item.TypeValue = UserlinkConst.MyGroup.GetHashCode();
  605. item.TypeId = UserlinkConst.System.GetHashCode();
  606. }
  607. return items;
  608. }
  609. /// <summary>
  610. /// 小组列表 搜索专用
  611. /// </summary>
  612. /// <param name="userId"></param>
  613. /// <returns></returns>
  614. public async Task<IEnumerable<UserGroupResult>> GetUserGroupListAsync(int userId)
  615. {
  616. var result = new List<UserGroupResult>();
  617. string sql = $@"SELECT
  618. b.*
  619. FROM
  620. tede_group_user a
  621. INNER JOIN
  622. tede_group b ON a.GroupId = b.Id
  623. WHERE
  624. a.UserId = {userId}
  625. ORDER BY b.CreatedDate DESC";
  626. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  627. var database = new Database(databaseType, _connectionString);
  628. var connection = database.GetConnection();
  629. var items = await connection
  630. .QueryAsync<Entity.Group>(sql);
  631. result.Add(new UserGroupResult
  632. {
  633. Id = -1,
  634. Name = "全网公开"
  635. });
  636. result.Add(new UserGroupResult
  637. {
  638. Id = -2,
  639. Name = "我的小组"
  640. });
  641. foreach (var item in items)
  642. {
  643. result.Add(new UserGroupResult
  644. {
  645. Id = item.Id,
  646. Name = item.Name
  647. });
  648. }
  649. return result;
  650. }
  651. /// <summary>
  652. /// 获取小组列表
  653. /// </summary>
  654. /// <returns></returns>
  655. public async Task<IEnumerable<GroupDetailResult>> GetGroupDetailResults(string keyWord)
  656. {
  657. string sqlStr = string.Empty;
  658. if (!string.IsNullOrWhiteSpace(keyWord))
  659. sqlStr += $" and a.Name like '%{keyWord}%'";
  660. string sql = $@"SELECT
  661. a.*, b.PiazzaName AS CategroyName, c.Name AS UserName
  662. FROM
  663. tede_group a
  664. INNER JOIN
  665. tede_user c ON a.UserId = c.Id
  666. LEFT JOIN
  667. tede_group_piazza b ON a.GroupCategroyId = b.Id Where 1=1 {sqlStr}
  668. ORDER BY a.Sort DESC , a.CreatedDate DESC";
  669. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  670. var database = new Database(databaseType, _connectionString);
  671. var connection = database.GetConnection();
  672. var result = await connection
  673. .QueryAsync<GroupDetailResult>(sql);
  674. foreach (var item in result)
  675. {
  676. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  677. item.QRCoder = StringUtils.AddDomainMin(item.QRCoder);
  678. }
  679. return result;
  680. }
  681. /// <summary>
  682. /// 小组广场搜索
  683. /// </summary>
  684. /// <param name="keyWord"></param>
  685. /// <param name="userId"></param>
  686. /// <returns></returns>
  687. public async Task<IEnumerable<SearchGroupDetailResult>> GetSearchGroupAsync(string keyWord, int userId)
  688. {
  689. string sqlStr = string.Empty;
  690. if (!string.IsNullOrWhiteSpace(keyWord))
  691. sqlStr += $" and a.Name like '%{keyWord}%'";
  692. string sql = $@"SELECT
  693. a.Id,
  694. a.Name,
  695. a.AvatarUrl,
  696. a.Introduce,
  697. a.IsAdmin,
  698. (SELECT
  699. COUNT(1)
  700. FROM
  701. tede_group_user
  702. WHERE
  703. GroupId = a.Id) AS UserCount,
  704. (SELECT
  705. COUNT(1)
  706. FROM
  707. tede_topic
  708. WHERE
  709. GroupId = a.Id) as TopicCount,
  710. (SELECT
  711. COUNT(1)
  712. FROM
  713. tede_group_user
  714. WHERE
  715. GroupId = a.Id AND UserId = {userId}
  716. LIMIT 1) AS IsUser,
  717. (SELECT
  718. count(1)
  719. FROM
  720. tede_admin_verify
  721. WHERE
  722. SourceType = 1 AND VerifyType = 3
  723. AND UserId = {userId}
  724. AND DisposeType = 0
  725. AND SourceId = a.Id limit 1) as IsApply
  726. FROM
  727. tede_group a
  728. WHERE
  729. a.IsShow = 1 {sqlStr}
  730. ORDER BY a.Sort DESC";
  731. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  732. var database = new Database(databaseType, _connectionString);
  733. var connection = database.GetConnection();
  734. var result = await connection
  735. .QueryAsync<SearchGroupDetailResult>(sql);
  736. foreach (var item in result)
  737. {
  738. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  739. item.Introduce = string.IsNullOrWhiteSpace(item.Introduce) ? string.Empty : item.Introduce;
  740. }
  741. return result;
  742. }
  743. }
  744. }