MemberController.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. using HiTeachCE.Helpers;
  2. using HiTeachCE.Models;
  3. using HiTeachCE.Services;
  4. using IdentityModel;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Microsoft.AspNetCore.Mvc;
  7. using OpenXmlPowerTools;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel.DataAnnotations;
  11. using System.Linq;
  12. using System.Linq.Expressions;
  13. using TEAMModelOS.SDK.Context.Exception;
  14. using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
  15. using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
  16. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  17. namespace HiTeachCE.Controllers
  18. {
  19. [Route("api/[controller]")]
  20. [ApiController]
  21. public class MemberController : BaseController
  22. {
  23. public MemberService memberService;
  24. public LecturerService lecturerService;
  25. public OrganizationService organizationService;
  26. public ActivationCodeService activationCodeService;
  27. public MemberController(MemberService member , LecturerService lecturer,OrganizationService organization,ActivationCodeService activationCode) {
  28. memberService = member;
  29. lecturerService = lecturer;
  30. organizationService = organization;
  31. activationCodeService = activationCode;
  32. }
  33. /// <summary>
  34. /// 退出组织 必须本人退出
  35. /// </summary>
  36. /// <param name="request"></param>
  37. /// <returns></returns>
  38. [HttpPost("exit")]
  39. [Authorize(Policy = Constant.Role_WebAll)]
  40. public BaseJosnRPCResponse Exit(JosnRPCRequest<Dictionary<string,string>> request) {
  41. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  42. string role = GetLoginUser(JwtClaimTypes.Role);
  43. string loginUnionid = GetLoginUser(JwtClaimTypes.Id);
  44. bool flag = false;
  45. if(request.@params.TryGetValue("unionid",out string unionid) &&
  46. request.@params.TryGetValue("orgCode",out string orgCode))
  47. {
  48. if (unionid.Equals(loginUnionid)) {
  49. Expression<Func<Member, bool>> mlinq = null;
  50. //当前登录人员是否是管理员
  51. mlinq = o => o.orgCode == orgCode;
  52. mlinq = o => o.unionid == unionid;
  53. List<Member> members= memberService.GetList(mlinq);
  54. if (members.IsNotEmpty()) {
  55. members.ForEach(x => { flag = memberService.Delete(x.id); });
  56. }
  57. }
  58. }
  59. return builder.Data(flag).build();
  60. }
  61. /// <summary>
  62. /// 移除成员
  63. /// </summary>
  64. /// <param name="request"></param>
  65. /// <returns></returns>
  66. [HttpPost("remove")]
  67. [Authorize(Policy = Constant.Role_RootAdmin)]
  68. public BaseJosnRPCResponse Remove(JosnRPCRequest<Member> request)
  69. {
  70. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  71. string role = GetLoginUser(JwtClaimTypes.Role);
  72. string unionid = GetLoginUser(JwtClaimTypes.Id);
  73. bool flag = false;
  74. if (!string.IsNullOrEmpty(request.@params.id))
  75. {
  76. Expression<Func<Member, bool>> mlinq = null;
  77. //当前登录人员是否是管理员
  78. mlinq = o => o.orgCode == request.@params.orgCode;
  79. mlinq = o => o.admin == 1;
  80. List<Member> members = memberService.GetList(mlinq);
  81. if (members.IsNotEmpty() )
  82. {
  83. if (members.Count == 1 && members[0].unionid.Equals(request.@params.unionid)) {
  84. throw new BizException("请保留至少一位管理员!", 2);
  85. }
  86. }
  87. else {
  88. throw new BizException("该组织已经没有管理员,请设置管理员",2);
  89. }
  90. if (role.Contains(Constant.Role_Root))
  91. {
  92. flag = memberService.Delete(request.@params.id);
  93. }
  94. else
  95. {
  96. List<Member> ms= members.Where(x => x.unionid == unionid).ToList();
  97. if (ms.IsNotEmpty())
  98. {
  99. flag = memberService.Delete(request.@params.id);
  100. }
  101. else {
  102. throw new BizException("登录账号不是此组织管理员,不能操作此人员", 2);
  103. }
  104. }
  105. }
  106. return builder.Data(flag).build();
  107. }
  108. /// <summary>
  109. /// 更新组织成员
  110. /// </summary>
  111. /// <param name="request"></param>
  112. /// <returns></returns>
  113. [HttpPost("update")]
  114. [Authorize(Policy = Constant.Role_RootAdmin)]
  115. public BaseJosnRPCResponse Update(JosnRPCRequest<Member> request) {
  116. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  117. string role = GetLoginUser(JwtClaimTypes.Role);
  118. string unionid = GetLoginUser(JwtClaimTypes.Id);
  119. bool flag = false;
  120. if (!string.IsNullOrEmpty(request.@params.id)) {
  121. Member member= memberService.GetById(request.@params.id);
  122. if (member != null) {
  123. member.admin = request.@params.admin;
  124. member.expires = request.@params.expires;
  125. member.status = request.@params.status;
  126. member.memberName = request.@params.memberName;
  127. if (role.Contains(Constant.Role_Root))
  128. {
  129. flag= memberService.Update(member);
  130. }
  131. else {
  132. Expression<Func<Member, bool>> mlinq = null;
  133. //当前登录人员是否是管理员
  134. mlinq = o => o.unionid == unionid;
  135. mlinq = o => o.orgCode == member.orgCode;
  136. mlinq = o => o.admin == 1;
  137. List<Member> members = memberService.GetList(mlinq);
  138. if (members.IsNotEmpty())
  139. {
  140. flag = memberService.Update(member);
  141. }
  142. else
  143. {
  144. throw new BizException("当前登录用户不是该组织的管理员!", 2);
  145. }
  146. }
  147. }
  148. }
  149. return builder.Data(flag).build();
  150. }
  151. /// <summary>
  152. /// 添加人与
  153. /// </summary>
  154. /// <param name="request"></param>
  155. /// <returns></returns>
  156. [HttpPost("add")]
  157. [Authorize(Policy = Constant.Role_RootAdmin)]
  158. public BaseJosnRPCResponse Add(JosnRPCRequest<MemberDto> request)
  159. {
  160. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  161. string role = GetLoginUser(JwtClaimTypes.Role);
  162. string unionid = GetLoginUser(JwtClaimTypes.Id);
  163. bool flag = false;
  164. Expression<Func<Organization, bool>> olinq = null;
  165. olinq =o => o.code == request.@params.orgCode;
  166. olinq = o => o.status ==1;
  167. List<Organization> organizations= organizationService.GetList(olinq);
  168. if (organizations.IsNotEmpty()) {
  169. Organization organization = organizations[0];
  170. if (organization.type == 1)
  171. {
  172. long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
  173. Expression<Func<ActivationCode, bool>> alinq = null;
  174. alinq = o => o.orgCode == request.@params.orgCode;
  175. alinq = o => o.status == 1;
  176. List<ActivationCode> activationCodes= activationCodeService.GetList(alinq);
  177. if (activationCodes.IsNotEmpty())
  178. {
  179. ActivationCode activationCode = activationCodes[0];
  180. if (activationCode.expires == -1 || activationCode.expires > time)
  181. {
  182. Expression<Func<Member, bool>> mlinq = null;
  183. mlinq = o => o.orgCode == request.@params.orgCode;
  184. List<Member> members= memberService.GetList(mlinq);
  185. if (members.IsNotEmpty() && members.Count >= activationCode.maximum) {
  186. throw new BizException("组织机构授权人数达到上限!", 2);
  187. }
  188. }
  189. else {
  190. throw new BizException("组织机构授权已经过期!", 2);
  191. }
  192. }
  193. else {
  194. throw new BizException("组织机构未被授权!",2);
  195. }
  196. Expression<Func<Lecturer, bool>> linq = null;
  197. linq = m => m.cellphone == request.@params.cellphone;
  198. List<Lecturer> lecturers = lecturerService.GetList(linq);
  199. Lecturer lecturer = null;
  200. if (!lecturers.IsNotEmpty())
  201. {
  202. //新增组织机构管理员
  203. Random random = new Random();
  204. string seed = new string(Constant.az09);
  205. string pfx = "";
  206. for (int i = 0; i < 4; i++)
  207. {
  208. string c = seed.ToCharArray()[random.Next(0, seed.Length)] + "";
  209. seed.Replace(c, "");
  210. pfx = pfx + c;
  211. }
  212. lecturer = new Lecturer
  213. {
  214. id = Guid.NewGuid().ToString(),
  215. unionid = Guid.NewGuid().ToString("N"),
  216. username = request.@params.cellphone + "手机用户",
  217. password = "",
  218. account = "hitmd-" + request.@params.cellphone.Substring(request.@params.cellphone.Length - 4, 4) + "#" + pfx,
  219. areaCode = "86",
  220. registerTime = time,
  221. status = 1,
  222. setaccount = 0,
  223. cellphone = request.@params.cellphone
  224. };
  225. flag= lecturerService.Insert(lecturer);
  226. }
  227. else {
  228. lecturer = lecturers[0];
  229. }
  230. Member member = new Member
  231. {
  232. id = Guid.NewGuid().ToString(),
  233. orgCode = organization.code,
  234. admin = 1,
  235. expires = -1,
  236. status = 1,
  237. unionid = lecturer.unionid,
  238. createTime = time
  239. };
  240. if (role.Contains(Constant.Role_Root))
  241. {
  242. flag = memberService.Insert(member);
  243. }
  244. else
  245. {
  246. Expression<Func<Member, bool>> mlinq = null;
  247. //当前登录人员是否是管理员
  248. mlinq = o => o.unionid == unionid;
  249. mlinq = o => o.orgCode == organization.code;
  250. mlinq = o => o.admin == 1;
  251. List<Member> members= memberService.GetList(mlinq);
  252. if (members.IsNotEmpty())
  253. {
  254. flag = memberService.Insert(member);
  255. }
  256. else {
  257. throw new BizException("当前登录用户不是该组织的管理员!", 2);
  258. }
  259. }
  260. }
  261. else {
  262. throw new BizException("个人用户不允许添加其他成员!",2);
  263. }
  264. }
  265. return builder.Data(flag).build();
  266. }
  267. public class MemberDto {
  268. [Required(ErrorMessage = "组织机构必须设置")]
  269. public string orgCode { get; set; }
  270. [Required(ErrorMessage = "手机号必须填写")]
  271. public string cellphone { get; set; }
  272. [Required(ErrorMessage = "是否组织管理员必须填写")]
  273. [Range(0,1, ErrorMessage = "是否组织管理员请输入0~1的整数")]
  274. public int admin { get; set; }
  275. /// <summary>
  276. /// 时长-1 永久 ,大于0 按天计算
  277. /// </summary>
  278. [Required(ErrorMessage = "授权时限必须填写")]
  279. [Range(-1, 180, ErrorMessage = "请输入-1~180的整数")]
  280. public int expires { get; set; }
  281. }
  282. /// <summary>
  283. /// 查看组织成员
  284. /// </summary>
  285. /// <param name="request"></param>
  286. /// <returns></returns>
  287. [HttpPost("list")]
  288. [Authorize(Policy =Constant.Role_RootAdmin)]
  289. public BaseJosnRPCResponse list(PaginationJosnRPCRequest<Dictionary<string, string>> request) {
  290. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  291. string role = GetLoginUser(JwtClaimTypes.Role);
  292. string unionid = GetLoginUser(JwtClaimTypes.Id);
  293. if (request.@params.data.TryGetValue("orgCode", out string orgCode))
  294. {
  295. ///超级管理员可以处理所有的组织
  296. if (role.Contains(Constant.Role_Root))
  297. {
  298. Expression<Func<Member, bool>> olinq = null;
  299. olinq = o => o.orgCode == orgCode;
  300. List<Member> members= memberService.GetPageList(olinq,request.@params.page);
  301. Expression<Func<Lecturer, object>> linq = null;
  302. linq = l => l.unionid;
  303. List<Lecturer> lecturers= lecturerService.GetListIn(linq, members.Select(x => x.unionid).ToArray());
  304. var lecs= lecturers.Select(x => new {x.username,x.unionid,x.status }).ToList();
  305. builder.Data(members).Page(request.@params.page).Extend(new Dictionary<string, object> { { "lecturers", lecs} });
  306. }
  307. else
  308. {
  309. //普通管理员只能处理自己的组织
  310. Expression<Func<Member, bool>> olinq = null;
  311. olinq = o => o.orgCode == orgCode;
  312. olinq = o => o.unionid == unionid;
  313. olinq = o => o.admin == 1;
  314. List<Member> members = memberService.GetList(olinq);
  315. if (members.IsNotEmpty()) {
  316. Expression<Func<Member, bool>> qlinq = null;
  317. qlinq = o => o.orgCode == orgCode;
  318. List<Member> membersOrg = memberService.GetPageList(qlinq, request.@params.page);
  319. Expression<Func<Lecturer, object>> linq = null;
  320. linq = l => l.unionid;
  321. List<Lecturer> lecturers = lecturerService.GetListIn(linq, membersOrg.Select(x => x.unionid).ToArray());
  322. var lecs = lecturers.Select(x => new { x.username, x.unionid, x.status }).ToList();
  323. builder.Data(membersOrg).Page(request.@params.page).Extend(new Dictionary<string, object> { { "lecturers", lecs } });
  324. }
  325. }
  326. }
  327. return builder.build();
  328. }
  329. }
  330. }