UserService.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using AutoMapper;
  7. using GxPress.Common.Exceptions;
  8. using GxPress.Common.Page;
  9. using GxPress.Entity;
  10. using GxPress.Repository.Interface;
  11. using GxPress.Request.App.User;
  12. using GxPress.Request.User;
  13. using GxPress.Result.User;
  14. using GxPress.Service.Interface;
  15. using GxPress.Service.Interface.IM;
  16. using Microsoft.AspNetCore.Hosting;
  17. using OfficeOpenXml;
  18. using Datory;
  19. using GxPress.Common.Tools;
  20. using GxPress.Result.App.User;
  21. using GxPress.Repository.Interface.WorkFlow;
  22. using GxPress.Request.App.Flow;
  23. using GxPress.Repository.Interface.WaitHandle;
  24. using GxPress.Request.AddressBookGroup;
  25. using GxPress.Repository.Interface.DepartmentUser;
  26. using GxPress.Repository.Interface.Friends;
  27. using GxPress.EnumConst;
  28. using GxPress.Result.Department;
  29. using GxPress.Service.Interface.Reply;
  30. using GxPress.Repository.Interface.AdminVerify;
  31. using GxPress.Service.Interface.Praise;
  32. using Microsoft.Extensions.Caching.Distributed;
  33. using GxPress.Common.Encrypt;
  34. using Newtonsoft.Json;
  35. using GxPress.Result;
  36. namespace GxPress.Service.Implement
  37. {
  38. public class UserService : IUserService
  39. {
  40. private readonly IUserRepository _userRepository;
  41. private readonly IDepartmentRepository _departmentRepository;
  42. private readonly IAddressBookGroupRepository _addressBookGroupRepository;
  43. private readonly IAddressBookGroupUserRepository addressBookGroupUserRepository;
  44. private IWebHostEnvironment _webHostEnvironment;
  45. private readonly IBlacklistUserRepository _blacklistUserRepository;
  46. private readonly IRoleRepository _roleRepository;
  47. private readonly IIMService _imService;
  48. private readonly IMapper _mapper;
  49. private readonly IFlowRepository _flowRepository;
  50. private readonly IFlowTodoRepository _flowTodoRepository;
  51. private readonly IWaitHandleRepository waitHandleRepository;
  52. private readonly IDepartmentUserRepository departmentUserRepository;
  53. private readonly IFriendsRepository friendsRepository;
  54. private readonly IGroupChatUserRepository groupChatUserRepository;
  55. private readonly IGroupUserRepository groupUserRepository;
  56. private readonly IOftenContactRepository oftenContactRepository;
  57. private readonly IAdminVerifyRepository adminVerifyRepository;
  58. private readonly IReplyService replyService;
  59. private readonly IPraiseService praiseService;
  60. private readonly IDistributedCache _cache;
  61. private readonly IGroupRepository groupRepository;
  62. private readonly IGroupChatRepository groupChatRepository;
  63. public UserService(IUserRepository userRepository, IDepartmentRepository departmentRepository,
  64. IAddressBookGroupRepository addressBookGroupRepository, IBlacklistUserRepository blacklistUserRepository,
  65. IMapper mapper, IWebHostEnvironment webHostEnvironment,
  66. IRoleRepository roleRepository, IIMService imService,
  67. IFlowRepository flowRepository, IFlowTodoRepository flowTodoRepository,
  68. IWaitHandleRepository waitHandleRepository, IDepartmentUserRepository departmentUserRepository,
  69. IFriendsRepository friendsRepository, IGroupChatUserRepository groupChatUserRepository,
  70. IGroupUserRepository groupUserRepository, IAddressBookGroupUserRepository addressBookGroupUserRepository,
  71. IOftenContactRepository oftenContactRepository, IReplyService replyService,
  72. IAdminVerifyRepository adminVerifyRepository,
  73. IPraiseService praiseService, IDistributedCache _cache,
  74. IGroupRepository groupRepository, IGroupChatRepository groupChatRepository)
  75. {
  76. _userRepository = userRepository;
  77. _departmentRepository = departmentRepository;
  78. _addressBookGroupRepository = addressBookGroupRepository;
  79. _blacklistUserRepository = blacklistUserRepository;
  80. _mapper = mapper;
  81. _webHostEnvironment = webHostEnvironment;
  82. _roleRepository = roleRepository;
  83. _imService = imService;
  84. _flowRepository = flowRepository;
  85. _flowTodoRepository = flowTodoRepository;
  86. this.waitHandleRepository = waitHandleRepository;
  87. this.departmentUserRepository = departmentUserRepository;
  88. this.friendsRepository = friendsRepository;
  89. this.groupChatUserRepository = groupChatUserRepository;
  90. this.groupUserRepository = groupUserRepository;
  91. this.addressBookGroupUserRepository = addressBookGroupUserRepository;
  92. this.oftenContactRepository = oftenContactRepository;
  93. this.replyService = replyService;
  94. this.adminVerifyRepository = adminVerifyRepository;
  95. this.praiseService = praiseService;
  96. this._cache = _cache;
  97. this.groupRepository = groupRepository;
  98. this.groupChatRepository = groupChatRepository;
  99. }
  100. /// <summary>
  101. /// 根据部门ID获取自建ID获取用户列表
  102. /// </summary>
  103. /// <param name="request"></param>
  104. /// <returns></returns>
  105. public async Task<IEnumerable<UserInfoResult>> FindUser(FindUserRequest request)
  106. {
  107. var userInfoResults = new List<UserInfoResult>();
  108. if (request.TypeId == 1)
  109. {
  110. //获取部门
  111. List<Entity.Department> departments = new List<Entity.Department>();
  112. foreach (var item in request.ItemId)
  113. {
  114. if (item > 0)
  115. {
  116. var users = await _userRepository.GetUserByDepartmentIdAsync(item);
  117. userInfoResults.AddRange(users.Select(user => _mapper.Map<UserInfoResult>(user)).ToList());
  118. }
  119. departments = await _departmentRepository.GetDepartmentByPid(item, departments);
  120. }
  121. foreach (var department in departments)
  122. {
  123. //获取部门下面的员工
  124. var users = await _userRepository.GetUserByDepartmentIdAsync(department.Id);
  125. userInfoResults.AddRange(users.Select(user => _mapper.Map<UserInfoResult>(user)).ToList());
  126. }
  127. }
  128. //查询自建用户
  129. if (request.TypeId == 2)
  130. {
  131. var users = new List<User>();
  132. foreach (var item in request.ItemId)
  133. {
  134. if (item > 0)
  135. {
  136. users.AddRange(await _addressBookGroupRepository.GetUserByAddressBookGroupIdAsync(item));
  137. }
  138. users = await _addressBookGroupRepository.GetUserByAddressBookGroupPidAsync(users, item,
  139. request.UserId);
  140. }
  141. userInfoResults.AddRange(users.Select(user => _mapper.Map<UserInfoResult>(user)).ToList());
  142. }
  143. foreach (var item in userInfoResults)
  144. {
  145. if (item == null)
  146. continue;
  147. item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  148. }
  149. return userInfoResults.Distinct();
  150. }
  151. /// <summary>
  152. /// 根据ID查询用户数据
  153. /// </summary>
  154. /// <param name="userId"></param>
  155. /// <param name="blackUserId"></param>
  156. /// <returns></returns>
  157. public async Task<UserDetail> GetUserByIdAsync(int userId, int blackUserId)
  158. {
  159. var user = await _userRepository.GetAsync(blackUserId);
  160. if (user == null)
  161. {
  162. throw new BusinessException("用户id有误");
  163. }
  164. var userDetail = _mapper.Map<UserDetail>(user);
  165. // if (user.DepartmentId > 0)
  166. // {
  167. // var department = await _departmentRepository.GetAsync(user.DepartmentId);
  168. // userDetail.DepartmentName = department.Name;
  169. // }
  170. userDetail.AvatarUrl = StringUtils.AddDomainMin(userDetail.AvatarUrl);
  171. userDetail.HistoryAvatarUrl = StringUtils.AddDomainMin(userDetail.HistoryAvatarUrl);
  172. userDetail.IsBlack = await _blacklistUserRepository.FindUserIsBlack(userId, blackUserId);
  173. return userDetail;
  174. }
  175. /// <summary>
  176. /// 生成excel
  177. /// </summary>
  178. /// <returns></returns>
  179. public async Task<string> ExcelUserAsync(List<int> userIds)
  180. {
  181. string sWebRootFolder = _webHostEnvironment.WebRootPath;
  182. string sFileName = $"{Guid.NewGuid()}.xlsx";
  183. FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
  184. using (ExcelPackage package = new ExcelPackage(file))
  185. {
  186. // 添加worksheet
  187. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("员工信息"); //添加头
  188. worksheet.Cells[1, 1].Value = "姓名";
  189. worksheet.Cells[1, 2].Value = "手机号码";
  190. worksheet.Cells[1, 3].Value = "邮箱"; //添加值
  191. worksheet.Cells[1, 4].Value = "性别"; //添加值
  192. worksheet.Cells[1, 5].Value = "部门"; //添加值
  193. worksheet.Cells[1, 6].Value = "角色"; //添加值
  194. //获取用户
  195. var users = await _userRepository.FindAllUserAsync(Q.WhereIn(nameof(User.Id), userIds));
  196. var enumerable = users as User[] ?? users.ToArray();
  197. for (int i = 0; i < enumerable.Count(); i++)
  198. {
  199. var index = i + 2;
  200. worksheet.Cells["A" + index].Value = enumerable[i].Name;
  201. worksheet.Cells["B" + index].Value = enumerable[i].Phone;
  202. worksheet.Cells["C" + index].Value = enumerable[i].Email;
  203. worksheet.Cells["D" + index].Value = enumerable[i].Gender == "Male" ? "男" : "女";
  204. //获取部门
  205. var department = await _departmentRepository.GetAsync(enumerable[i].DepartmentId);
  206. worksheet.Cells["E" + index].Value = department == null ? "" : department.Name;
  207. //获取角色
  208. var role = await _roleRepository.GetAsync(enumerable[i].RoleId);
  209. worksheet.Cells["F" + index].Value = role == null ? "" : role.Name;
  210. }
  211. package.Save();
  212. }
  213. return Path.Combine(sWebRootFolder, sFileName);
  214. }
  215. /// <summary>
  216. /// 用户分页列表
  217. /// </summary>
  218. /// <param name="request"></param>
  219. /// <returns></returns>
  220. public async Task<PagedList<UserResult>> GetPagedListAsync(UserPageSearchRequest request)
  221. {
  222. var pagedList = new PagedList<UserResult>
  223. {
  224. Total = await GetCountAsync(request.DepartmentId, request.RoleId, request.Keyword)
  225. };
  226. var list = await _userRepository.GetPageUserResultAsync(request);
  227. var items = list.Select(user => _mapper.Map<UserResult>(user)).ToList();
  228. foreach (var item in items)
  229. {
  230. item.AvatarUrl = StringUtils.AddDomain(item.AvatarUrl);
  231. // var departmentName = string.Empty;
  232. // //获取部门
  233. // departmentName =
  234. // await _departmentRepository.GetDepartmentFullPathAsync(item.DepartmentId, departmentName);
  235. // item.DepartmentName = departmentName;
  236. item.DepartmentIds = await departmentUserRepository.GetDepartmentIdsAsync(item.Id);
  237. var role = await _roleRepository.GetAsync(item.RoleId);
  238. if (role != null)
  239. item.RoleName = role.Name;
  240. }
  241. pagedList.Items = items;
  242. return pagedList;
  243. }
  244. public async Task<int> GetCountAsync(int departmentId, int roleId, string keyword)
  245. {
  246. var query = Q.NewQuery();
  247. if (departmentId > 0)
  248. {
  249. var userIds = await departmentUserRepository.GetUserIdsAsync(departmentId);
  250. query.WhereIn(nameof(User.Id), userIds);
  251. query.Where(nameof(User.DepartmentId), departmentId);
  252. }
  253. if (roleId > 0)
  254. {
  255. query.Where(nameof(User.RoleId), roleId);
  256. }
  257. if (!string.IsNullOrEmpty(keyword))
  258. {
  259. keyword = "%" + keyword + "%";
  260. query.Where(q =>
  261. q.WhereLike(nameof(User.Name), keyword)
  262. .OrWhereLike(nameof(User.Email), keyword)
  263. .OrWhereLike(nameof(User.Phone), keyword)
  264. );
  265. }
  266. return await _userRepository.CountAsync(query);
  267. }
  268. /// <summary>
  269. /// Set the limit and offset for a given page.
  270. /// </summary>
  271. /// <param name="page"></param>
  272. /// <param name="perPage"></param>
  273. /// <param name="departmentId"></param>
  274. /// <param name="roleId"></param>
  275. /// <param name="keyword"></param>
  276. /// <returns></returns>
  277. public async Task<IEnumerable<User>> GetPageListAsync(int page, int perPage, int departmentId, int roleId,
  278. string keyword)
  279. {
  280. var query = Q.ForPage(page, perPage);
  281. if (departmentId > 0)
  282. {
  283. var userIds = await departmentUserRepository.GetUserIdsAsync(departmentId);
  284. query.WhereIn(nameof(User.Id), userIds);
  285. //query.Where(nameof(User.DepartmentId), departmentId);
  286. }
  287. if (roleId > 0)
  288. {
  289. query.Where(nameof(User.RoleId), roleId);
  290. }
  291. if (!string.IsNullOrEmpty(keyword))
  292. {
  293. keyword = "%" + keyword + "%";
  294. query.Where(q =>
  295. q.WhereLike(nameof(User.Name), keyword)
  296. .OrWhereLike(nameof(User.Email), keyword)
  297. .OrWhereLike(nameof(User.Phone), keyword)
  298. );
  299. }
  300. return await _userRepository.GetAllAsync(query);
  301. }
  302. public async Task<PagedList<User>> GetPageListAsync(UserPageSearchRequest request)
  303. {
  304. var result = new PagedList<User>();
  305. var query = Q.ForPage(request.Page, request.PerPage);
  306. if (request.DepartmentId > 0)
  307. {
  308. var userIds = await departmentUserRepository.GetUserIdsAsync(request.DepartmentId);
  309. query.WhereIn(nameof(User.Id), userIds);
  310. //query.Where(nameof(User.DepartmentId), request.DepartmentId);
  311. }
  312. if (request.RoleId > 0)
  313. {
  314. query.Where(nameof(User.RoleId), request.RoleId);
  315. }
  316. if (!string.IsNullOrEmpty(request.Keyword))
  317. {
  318. request.Keyword = "%" + request.Keyword + "%";
  319. query.Where(q =>
  320. q.WhereLike(nameof(User.Name), request.Keyword)
  321. .OrWhereLike(nameof(User.Email), request.Keyword)
  322. .OrWhereLike(nameof(User.Phone), request.Keyword)
  323. );
  324. }
  325. result.Items = await _userRepository.GetAllAsync(query);
  326. result.Total = await _userRepository.CountAsync(query);
  327. return result;
  328. }
  329. /// <summary>
  330. /// 删除用户
  331. /// </summary>
  332. /// <param name="userIds"></param>
  333. /// <returns></returns>
  334. public async Task<bool> DeleteUsersAsync(IEnumerable<int> userIds)
  335. {
  336. var enumerable = userIds as int[] ?? userIds.ToArray();
  337. foreach (var userId in enumerable)
  338. {
  339. var user = await _userRepository.GetAsync(userId);
  340. if (user != null)
  341. {
  342. await _imService.DeleteUserAsync(user.ImId);
  343. }
  344. }
  345. return await _userRepository.DeleteUsersAsync(enumerable);
  346. }
  347. /// <summary>
  348. /// 获取用户未读数据
  349. /// </summary>
  350. /// <param name="userId"></param>
  351. /// <returns></returns>
  352. public async Task<UserCountResult> GetUserCountAsync(int userId)
  353. {
  354. var result = await _userRepository.GetUserCountAsync(userId);
  355. #region 私信未读数据
  356. //我收到的赞
  357. var praiseCount = await praiseService.GetPraiseUReadCountAsync(userId);
  358. //回复我的
  359. var replyUReadCount = await replyService.GetReplyUReadCountAsync(userId);
  360. //验证信息数量
  361. var uReadVerifyCount = await adminVerifyRepository.UReadVerifyCountAsync(userId);
  362. if (uReadVerifyCount > 0)
  363. uReadVerifyCount = 1;
  364. if ((praiseCount + replyUReadCount) >= 1)
  365. replyUReadCount = 1;
  366. result.UReadChatCount = replyUReadCount + uReadVerifyCount;
  367. #endregion
  368. //工作我的审批未操作数量
  369. var request = new FlowListRequest();
  370. result.FlowAuditUReadCount = await _userRepository.GetUserUReadFlowTodoCountAsync(userId);
  371. //待办事项未执行数量
  372. result.WaitHandleUFinishCount = await waitHandleRepository.GetUFinishAsync(userId);
  373. return result;
  374. }
  375. /// <summary>
  376. /// 获取用户的通讯录
  377. /// </summary>
  378. /// <param name="userId"></param>
  379. /// <returns></returns>
  380. public async Task<UserLinkResult> GetUserLinkResultAsync(int userId)
  381. {
  382. //获取用户
  383. var user = await _userRepository.GetAsync(userId);
  384. //单位通讯录
  385. var userLinkResult = new List<UserLinkModelResult>();
  386. var departmentIds = await departmentUserRepository.GetDepartmentIdsAsync(userId);
  387. if (departmentIds.Count() > 0)
  388. {
  389. var userLinkModelAttributeResult = new List<UserLinkModelAttributeResult>();
  390. var departments = await _departmentRepository.GetUserInDepartmentAsync(departmentIds.ToList());
  391. foreach (var department in departments)
  392. {
  393. //var userInfoResults = await GetUserInfoByDepartentResult(department.Id);
  394. userLinkModelAttributeResult.Add(new UserLinkModelAttributeResult
  395. {
  396. Id = department.Id,
  397. Name = department.Name,
  398. UserCount = await GetUserInfoByDepartmentCountResult(department.Id, departmentIds),
  399. TypeId = UserlinkConst.Work.GetHashCode(),
  400. TypeValue = 0,
  401. });
  402. }
  403. //单位通讯录
  404. userLinkResult.Add(new UserLinkModelResult
  405. {
  406. TypeId = UserlinkConst.Work.GetHashCode(),
  407. Name = UserlinkConst.Work.GetDescriptionOriginal(),
  408. Items = userLinkModelAttributeResult
  409. });
  410. }
  411. //系统通讯录 查询我的小组和群聊
  412. //var groupUserCount=await
  413. userLinkResult.Add(
  414. new UserLinkModelResult
  415. {
  416. TypeId = UserlinkConst.System.GetHashCode(),
  417. Name = UserlinkConst.System.GetDescriptionOriginal(),
  418. Items = new List<UserLinkModelAttributeResult>{
  419. new UserLinkModelAttributeResult{
  420. Id=0,
  421. Name=UserlinkConst.MyGroup.GetDescriptionOriginal(),
  422. TypeValue=UserlinkConst.MyGroup.GetHashCode(),
  423. TypeId= UserlinkConst.System.GetHashCode(),
  424. UserCount=await groupRepository.GetJoinGroupCountAsync(userId)
  425. },
  426. new UserLinkModelAttributeResult{
  427. Id=0,
  428. Name=UserlinkConst.MyGroupChat.GetDescriptionOriginal(),
  429. TypeId= UserlinkConst.System.GetHashCode(),
  430. TypeValue=UserlinkConst.MyGroupChat.GetHashCode(),
  431. UserCount=await groupChatRepository.GetJoinGroupChatCountAsync(userId)
  432. }
  433. }
  434. }
  435. );
  436. //自建通讯录
  437. var addressBookGroupList = await _addressBookGroupRepository.GetAddressBookGroupListAsync(
  438. new AddressBookGroupSearchRequest { ParendId = 0, UserId = userId });
  439. var systemLinkModelAttributeResults = new List<UserLinkModelAttributeResult>();
  440. foreach (var item in addressBookGroupList)
  441. systemLinkModelAttributeResults.Add(new UserLinkModelAttributeResult
  442. {
  443. Id = item.Id,
  444. Name = item.GroupName,
  445. TypeId = UserlinkConst.My.GetHashCode(),
  446. UserCount = item.UserCount
  447. });
  448. if (addressBookGroupList.Count() > 0)
  449. //自建通讯录
  450. userLinkResult.Add(
  451. new UserLinkModelResult
  452. {
  453. TypeId = UserlinkConst.My.GetHashCode(),
  454. Name = UserlinkConst.My.GetDescriptionOriginal(),
  455. Items = systemLinkModelAttributeResults
  456. }
  457. );
  458. userLinkResult.Add(
  459. //其他
  460. new UserLinkModelResult
  461. {
  462. TypeId = UserlinkConst.Other.GetHashCode(),
  463. Name = UserlinkConst.Other.GetDescriptionOriginal(),
  464. Items = new List<UserLinkModelAttributeResult>()
  465. }
  466. );
  467. //获取用户好友
  468. var userIds = await friendsRepository.GetFriendsIdsAsync(userId, 0);
  469. var result = new UserLinkResult()
  470. {
  471. Items = userLinkResult,
  472. FriendUsers = await _userRepository.GetUserInfoResultsAsync(userIds),
  473. LatelyChatUsers = await GetLatelyChatUsersAsync(userId)
  474. };
  475. // if (result.FriendUsers != null && result.FriendUsers.Count() > 0)
  476. // foreach (var item in result.FriendUsers)
  477. // item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
  478. return result;
  479. }
  480. /// <summary>
  481. /// 获取最近聊天用户
  482. /// </summary>
  483. /// <param name="userId"></param>
  484. /// <returns></returns>
  485. public async Task<IEnumerable<UserInfoResult>> GetLatelyChatUsersAsync(int userId)
  486. {
  487. var userIds = await oftenContactRepository.GetAllAsync(userId);
  488. var item = await _userRepository.GetUserInfoResultsAsync(userIds);
  489. foreach (var userInfo in item)
  490. {
  491. userInfo.TypeId = 0; userInfo.TypeValue = 0;
  492. }
  493. return item;
  494. }
  495. /// <summary>
  496. /// 获取好友列表
  497. /// </summary>
  498. /// <param name="userId"></param>
  499. /// <param name="keyWord"></param>
  500. /// <returns></returns>
  501. public async Task<IEnumerable<UserInfoResult>> GetFriendUserInfoResult(int userId, string keyWord)
  502. {
  503. //获取用户好友
  504. var userIds = await friendsRepository.GetFriendsIdsAsync(userId, 0);
  505. return await _userRepository.GetUserInfoResultsAsync(userIds, keyWord);
  506. }
  507. /// <summary>
  508. /// 更新用户信息
  509. /// </summary>
  510. /// <param name="id"></param>
  511. /// <param name="request"></param>
  512. /// <returns></returns>
  513. public async Task<bool> UpdateAsync(int id, UserInfoRequest request)
  514. {
  515. var user = await _userRepository.GetAsync(id);
  516. if (user == null) throw new BusinessException("该用户不存在");
  517. if (request.DepartmentId != null && request.DepartmentId.Count() > 0)
  518. await departmentUserRepository.AddDepartmentUserAsync(request.DepartmentId, id);
  519. if (!string.IsNullOrEmpty(request.DepartmentName))
  520. user.DepartmentName = request.DepartmentName;
  521. if (!string.IsNullOrEmpty(request.Nick))
  522. user.Nick = request.Nick;
  523. if (!string.IsNullOrEmpty(request.Description))
  524. user.Description = request.Description;
  525. if (!string.IsNullOrEmpty(request.Gender))
  526. user.Gender = request.Gender;
  527. if (!string.IsNullOrEmpty(request.Name))
  528. user.Name = request.Name;
  529. if (!string.IsNullOrEmpty(request.Position))
  530. user.Position = request.Position;
  531. if (request.RoleId > 0)
  532. user.RoleId = request.RoleId;
  533. if (!string.IsNullOrEmpty(request.Signature))
  534. user.Signature = request.Signature;
  535. //用户头像
  536. if (!string.IsNullOrEmpty(request.AvatarUrl))
  537. {
  538. user.HistoryAvatarUrl = user.AvatarUrl;
  539. user.AvatarUrl = StringUtils.RemoveDomain(request.AvatarUrl);
  540. }
  541. user.Email = request.Email;
  542. if (!string.IsNullOrWhiteSpace(request.Phone))
  543. user.Phone = request.Phone;
  544. user.QRCoder = StringUtils.RemoveDomain(user.QRCoder);
  545. if (request.IsDisable > 0)
  546. user.IsDisable = request.IsDisable == 1;
  547. if (request.IsFreeze > 0)
  548. user.IsFreeze = request.IsFreeze == 1;
  549. if (request.IsVip > 0)
  550. user.IsVip = request.IsVip == 1;
  551. if (request.IsLeader > 0)
  552. user.IsLeader = request.IsLeader == 1;
  553. if (request.IsMute > 0)
  554. user.IsMute = request.IsMute == 1;
  555. if (!string.IsNullOrWhiteSpace(request.DisableTiem))
  556. user.DisableTiem = Convert.ToDateTime(request.DisableTiem);
  557. if (request.IsNotice > 0)
  558. user.IsNotice = request.IsNotice == 1;
  559. return await _userRepository.UpdateAsync(user);
  560. }
  561. public async Task<UserInfoResult> GetUserInfoAsync(int id)
  562. {
  563. var result = await _userRepository.GetUserInfoAsync(id);
  564. result.DepartmentIds = await departmentUserRepository.GetDepartmentIdsAsync(id);
  565. return result;
  566. }
  567. /// <summary>
  568. /// 查询不是好友的用户
  569. /// </summary>
  570. /// <returns></returns>
  571. public async Task<IEnumerable<UserInfoResult>> FindUserInfoNoFriendsResultAsync(int userId, string keyword)
  572. {
  573. var userIds = await friendsRepository.GetFriendsIdsAsync(userId, -1);
  574. var userIdsList = userIds.ToList();
  575. userIdsList.Add(userId);
  576. //判断是否有部门
  577. if (await departmentUserRepository.IsExistsAsync(userId))
  578. //获取部门数据
  579. userIdsList.AddRange(await departmentUserRepository.GetUserIdsAsync());
  580. var result = await _userRepository.GetUserInfoNoFriendsResults(keyword, userIdsList);
  581. return result;
  582. }
  583. /// <summary>
  584. /// 搜索好友和部门用户
  585. /// </summary>
  586. /// <param name="keyword"></param>
  587. /// <param name="userIds"></param>
  588. /// <returns></returns>
  589. public async Task<IEnumerable<UserInfoResult>> GetSearchUserInfoResults(int userId, string keyword)
  590. {
  591. var userIds = await friendsRepository.GetFriendsIdsAsync(userId, -1);
  592. var userIdsList = userIds.ToList();
  593. userIdsList.Add(userId);
  594. //判断是否有部门
  595. if (await departmentUserRepository.IsExistsAsync(userId))
  596. //获取部门数据
  597. userIdsList.AddRange(await departmentUserRepository.GetUserIdsAsync());
  598. var result = await _userRepository.GetSearchUserInfoResults(keyword, userIdsList);
  599. return result;
  600. }
  601. /// <summary>
  602. /// 用户注册
  603. /// </summary>
  604. /// <param name="request"></param>
  605. /// <returns></returns>
  606. public async Task<bool> RegisterAsync(RegisterRequest request)
  607. {
  608. if (string.IsNullOrEmpty(request.Phone) && (string.IsNullOrEmpty(request.Code) || string.IsNullOrEmpty(request.PassWord)))
  609. throw new BusinessException("必填项为空");
  610. var query = Q.NewQuery();
  611. query.Where(nameof(Entity.User.Phone), request.Phone);
  612. query.Where(nameof(Entity.User.IsDelete), false);
  613. if (await _userRepository.ExistsAsync(query))
  614. throw new BusinessException("手机号码已经存在");
  615. var key = $"login:{request.Phone}";
  616. var code = await _cache.GetStringAsync(key);
  617. if (string.IsNullOrEmpty(code))
  618. throw new BusinessException("验证码已过期");
  619. code = code.Replace("\"", "");
  620. if (!request.Code.Equals(code, StringComparison.OrdinalIgnoreCase))
  621. throw new BusinessException("验证码错误");
  622. var user = new Entity.User
  623. {
  624. Phone = request.Phone,
  625. Gender = "Male",
  626. OpenId = request.OpenId,
  627. PassWord = string.IsNullOrEmpty(request.PassWord) ? "" : EncryptProvider.Md5(request.PassWord)
  628. };
  629. var userId = await _userRepository.InsertAsync(user);
  630. return userId > 0;
  631. }
  632. /// <summary>
  633. /// 用户注册
  634. /// </summary>
  635. /// <param name="request"></param>
  636. /// <returns></returns>
  637. public async Task<AppResultJson<UserSignInResult>> JsonRegisterAsync(RegisterRequest request)
  638. {
  639. var result = new AppResultJson<UserSignInResult>()
  640. {
  641. Code = StatusCodeConst.SucceedCode.GetHashCode(),
  642. Success = true
  643. };
  644. if (string.IsNullOrEmpty(request.Phone) && (string.IsNullOrEmpty(request.Code) || string.IsNullOrEmpty(request.PassWord)))
  645. {
  646. result.Code = StatusCodeConst.ErrorCode.GetHashCode();
  647. result.Msg = "必填项为空";
  648. result.Success = false;
  649. return result;
  650. }
  651. var query = Q.NewQuery();
  652. query.Where(nameof(Entity.User.Phone), request.Phone);
  653. query.Where(nameof(Entity.User.IsDelete), false);
  654. if (await _userRepository.ExistsAsync(query))
  655. {
  656. result.Code = StatusCodeConst.RegisterCode.GetHashCode();
  657. result.Success = false;
  658. result.Msg = "手机号码已经存在";
  659. return result;
  660. }
  661. var key = $"login:{request.Phone}";
  662. var code = await _cache.GetStringAsync(key);
  663. if (string.IsNullOrEmpty(code))
  664. {
  665. result.Code = StatusCodeConst.ErrorCode.GetHashCode();
  666. result.Success = false;
  667. result.Msg = "验证码已过期";
  668. return result;
  669. }
  670. code = code.Replace("\"", "");
  671. if (!request.Code.Equals(code, StringComparison.OrdinalIgnoreCase))
  672. {
  673. result.Code = StatusCodeConst.ErrorCode.GetHashCode();
  674. result.Success = false;
  675. result.Msg = "验证码错误";
  676. return result;
  677. }
  678. var user = new Entity.User
  679. {
  680. Phone = request.Phone,
  681. Gender = "Male",
  682. OpenId = request.OpenId,
  683. PassWord = string.IsNullOrEmpty(request.PassWord) ? "" : EncryptProvider.Md5(request.PassWord)
  684. };
  685. var userId = await _userRepository.InsertAsync(user);
  686. return result;
  687. }
  688. /// <summary>
  689. /// 用户注册
  690. /// </summary>
  691. /// <param name="request"></param>
  692. /// <returns></returns>
  693. public async Task<bool> FindPasswordAsync(RegisterRequest request)
  694. {
  695. if (string.IsNullOrEmpty(request.Phone) || string.IsNullOrEmpty(request.Code) || string.IsNullOrEmpty(request.PassWord))
  696. throw new BusinessException("必填项为空");
  697. var query = Q.NewQuery();
  698. query.Where(nameof(Entity.User.Phone), request.Phone);
  699. if (!await _userRepository.ExistsAsync(query))
  700. throw new BusinessException("手机号码不经存在");
  701. var key = $"login:{request.Phone}";
  702. var code = _cache.GetString(key).Replace("\"", "");
  703. if (string.IsNullOrEmpty(code))
  704. throw new BusinessException("验证码已过期");
  705. if (!request.Code.Equals(code, StringComparison.OrdinalIgnoreCase))
  706. throw new BusinessException("验证码错误");
  707. var user = await _userRepository.GetAsync(query);
  708. user.PassWord = EncryptProvider.Md5(request.PassWord);
  709. return await _userRepository.UpdateAsync(user);
  710. }
  711. /// <summary>
  712. /// 根据部门ID获取用户
  713. /// </summary>
  714. /// <param name="departentId"></param>
  715. /// <returns></returns>
  716. public async Task<IEnumerable<UserInfoResult>> GetUserInfoByDepartentResult(int departentId)
  717. {
  718. var departentList = new List<DepartmentResult>();
  719. var departent = await _departmentRepository.GetDepartmentById(departentId, departentList);
  720. var userIds = await departmentUserRepository.GetUserIdsAsync(departent.Select(n => n.Id));
  721. var result = await _userRepository.GetUserInfoResultsAsync(userIds);
  722. return result;
  723. }
  724. public async Task<int> GetUserInfoByDepartmentCountResult(int departentId, IEnumerable<int> departmentIds)
  725. {
  726. var departentList = new List<DepartmentResult>();
  727. var departent = await _departmentRepository.GetDepartmentById(departentId, departentList);
  728. var departents = departent.Where(n => departmentIds.Contains(n.Id));
  729. var userIds = await departmentUserRepository.GetUserIdsAsync(departents.Select(n => n.Id));
  730. var result = await _userRepository.GetUserInfoResultsAsync(userIds);
  731. return result.Count();
  732. }
  733. /// <summary>
  734. /// 获取群聊和小组的用户
  735. /// </summary>
  736. /// <param name="typeValue"></param>
  737. /// <param name="id"></param>
  738. /// <param name="keyword"></param>
  739. /// <returns></returns>
  740. public async Task<IEnumerable<UserInfoResult>> GetGroupOrGroupChatUserInfosResult(UserInfoByGroupoRoGroupChatResult request)
  741. {
  742. if (request.Id == 0)
  743. return await GetAllGroupOrGroupChatUserInfosResult(request);
  744. //群聊
  745. if (request.TypeValue == UserlinkConst.MyGroupChat.GetHashCode())
  746. {
  747. var groupChatUsers = await groupChatUserRepository.GetAllAsync(Q.Where(nameof(Entity.GroupChatUser.GroupChatId), request.Id));
  748. var result = await _userRepository.GetSearchUserInfoResults(request.Keyword, groupChatUsers.Select(n => n.UserId));
  749. return result;
  750. }
  751. //小组
  752. if (request.TypeValue == UserlinkConst.MyGroup.GetHashCode())
  753. {
  754. var groupUsers = await groupUserRepository.GetAllAsync(Q.Where(nameof(Entity.GroupUser.GroupId), request.Id));
  755. var result = await _userRepository.GetSearchUserInfoResults(request.Keyword, groupUsers.Select(n => n.UserId));
  756. return result;
  757. }
  758. //自建小组
  759. if (request.TypeValue == UserlinkConst.My.GetHashCode())
  760. {
  761. var addressGroupUsers = await addressBookGroupUserRepository.GetAllAsync(Q.Where(nameof(Entity.AddressBookGroupUser.AddressBookGroupId), request.Id));
  762. var result = await _userRepository.GetSearchUserInfoResults(request.Keyword, addressGroupUsers.Select(n => n.UserId));
  763. return result;
  764. }
  765. return null;
  766. }
  767. /// <summary>
  768. /// 获取群聊和小组的用户
  769. /// </summary>
  770. /// <param name="typeValue"></param>
  771. /// <param name="id"></param>
  772. /// <param name="keyword"></param>
  773. /// <returns></returns>
  774. public async Task<IEnumerable<UserInfoResult>> GetAllGroupOrGroupChatUserInfosResult(UserInfoByGroupoRoGroupChatResult request)
  775. {
  776. //群聊
  777. if (request.TypeValue == UserlinkConst.MyGroupChat.GetHashCode())
  778. {
  779. var groupIds = await groupChatUserRepository.GetAllAsync(Q.Where(nameof(Entity.GroupChatUser.UserId), request.UserId));
  780. var groupChatUsers = await groupChatUserRepository.GetAllAsync(Q.WhereIn(nameof(Entity.GroupChatUser.GroupChatId), groupIds.Select(n => n.GroupChatId)));
  781. var result = await _userRepository.GetSearchUserInfoResults(request.Keyword, groupChatUsers.Select(n => n.UserId));
  782. return result;
  783. }
  784. //小组
  785. if (request.TypeValue == UserlinkConst.MyGroup.GetHashCode())
  786. {
  787. var groupIds = await groupUserRepository.GetAllAsync(Q.Where(nameof(Entity.GroupUser.UserId), request.UserId));
  788. var groupUsers = await groupUserRepository.GetAllAsync(Q.WhereIn(nameof(Entity.GroupUser.GroupId), groupIds.Select(n => n.GroupId)));
  789. var result = await _userRepository.GetSearchUserInfoResults(request.Keyword, groupUsers.Select(n => n.UserId));
  790. return result;
  791. }
  792. //自建小组
  793. if (request.TypeValue == UserlinkConst.My.GetHashCode())
  794. {
  795. var addressBookGroupIds = await addressBookGroupUserRepository.GetAllAsync(Q.Where(nameof(Entity.AddressBookGroupUser.UserId), request.UserId));
  796. var addressGroupUsers = await addressBookGroupUserRepository.GetAllAsync(Q.WhereIn(nameof(Entity.AddressBookGroupUser.AddressBookGroupId), addressBookGroupIds.Select(n => n.AddressBookGroupId)));
  797. var result = await _userRepository.GetSearchUserInfoResults(request.Keyword, addressGroupUsers.Select(n => n.UserId));
  798. return result;
  799. }
  800. return null;
  801. }
  802. /// <summary>
  803. /// 添加用户
  804. /// </summary>
  805. /// <param name="request"></param>
  806. /// <returns></returns>
  807. public async Task<int> InsertUserAsync(UserInfoRequest request)
  808. {
  809. var user = new Entity.User()
  810. {
  811. Phone = request.Phone,
  812. Name = request.Name,
  813. Nick = request.Nick,
  814. IsNotice = request.IsNotice == 1,
  815. RoleId = request.RoleId,
  816. Gender = request.Gender,
  817. Email = request.Email,
  818. Signature = request.Signature,
  819. Description = request.Description,
  820. Position = request.Position
  821. };
  822. if (user == null) throw new Exception("用户不能为空");
  823. //if (string.IsNullOrEmpty(user.Name)) throw new Exception("用户不能为空");
  824. if (!string.IsNullOrEmpty(user.Phone) &&
  825. await _userRepository.ExistsAsync(Q.Where(nameof(User.Phone), user.Phone).Where(nameof(User.IsDelete), false)))
  826. {
  827. throw new Exception("用户手机号已存在,请更换手机号");
  828. }
  829. if (request.DepartmentId.Count() == 0)
  830. throw new Exception("请选择部门");
  831. //头像处理
  832. user.AvatarUrl = StringUtils.RemoveDomain(user.AvatarUrl);
  833. user.IsUpload = false;
  834. user.Id = await _userRepository.InsertAsync(user);
  835. //插入部门
  836. await departmentUserRepository.AddDepartmentUserAsync(request.DepartmentId, user.Id);
  837. user = await _userRepository.GetAsync(user.Id);
  838. //创建二维码
  839. var qrCodeData = new { key = QRCodeTypeConst.UserInfo, value = user.Guid };
  840. var resultPath =
  841. FileHelper.SaveQRCodeFile(StringUtils.GetWebRootPath(_webHostEnvironment.WebRootPath),
  842. JsonConvert.SerializeObject(qrCodeData));
  843. user.QRCoder = resultPath.RelativePath;
  844. await _userRepository.UpdateAsync(user);
  845. return user.Id;
  846. }
  847. /// <summary>
  848. /// 更新excel用户数据
  849. /// </summary>
  850. /// <param name="request"></param>
  851. /// <returns></returns>
  852. public async Task<bool> UpdateUserExcelAsync(List<User> request)
  853. {
  854. try
  855. {
  856. var departmentReuslt = new Request.Department.DepartmentUserInRequest()
  857. {
  858. UserIds = new List<int>(),
  859. DepartmentId = 0
  860. };
  861. foreach (var item in request)
  862. {
  863. var user = await _userRepository.GetAsync(Q.Where(nameof(User.Phone), item.Phone));
  864. if (user != null)
  865. {
  866. continue;
  867. }
  868. var userId = await _userRepository.InsertAsync(item);
  869. user = await _userRepository.GetAsync(userId);
  870. var resultPath =
  871. FileHelper.SaveQRCodeFile(StringUtils.GetWebRootPath(_webHostEnvironment.WebRootPath), item.Guid);
  872. user.QRCoder = resultPath.RelativePath;
  873. await _userRepository.UpdateAsync(user);
  874. await _userRepository.CreateMiUserAsync(item);
  875. departmentReuslt.UserIds.Add(userId);
  876. departmentReuslt.DepartmentId = item.DepartmentId;
  877. }
  878. //插入部门
  879. await departmentUserRepository.AddDepartmentUserAsync(departmentReuslt);
  880. }
  881. catch (Exception e)
  882. {
  883. throw new BusinessException(e.Message);
  884. }
  885. return true;
  886. }
  887. }
  888. }