MemberController.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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 && o.unionid == unionid;
  52. List<Member> members= memberService.GetList(mlinq);
  53. if (members.IsNotEmpty()) {
  54. members.ForEach(x => { flag = memberService.Delete(x.id); });
  55. }
  56. }
  57. else
  58. {
  59. throw new BizException("必须本人退出组织!",2);
  60. }
  61. }
  62. return builder.Data(flag).build();
  63. }
  64. /// <summary>
  65. /// 移除成员
  66. /// </summary>
  67. /// <param name="request"></param>
  68. /// <returns></returns>
  69. [HttpPost("remove")]
  70. [Authorize(Policy = Constant.Role_RootAdmin)]
  71. public BaseJosnRPCResponse Remove(JosnRPCRequest<Member> request)
  72. {
  73. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  74. string role = GetLoginUser(JwtClaimTypes.Role);
  75. string unionid = GetLoginUser(JwtClaimTypes.Id);
  76. bool flag = false;
  77. if (!string.IsNullOrEmpty(request.@params.id))
  78. {
  79. Expression<Func<Member, bool>> mlinq = null;
  80. //当前登录人员是否是管理员
  81. mlinq = o => o.orgCode == request.@params.orgCode && o.admin == 1; ;
  82. List<Member> members = memberService.GetList(mlinq);
  83. if (members.IsNotEmpty() )
  84. {
  85. if (members.Count == 1 && members[0].unionid.Equals(request.@params.unionid)) {
  86. throw new BizException("请保留至少一位管理员!", 2);
  87. }
  88. }
  89. else {
  90. throw new BizException("该组织已经没有管理员,请设置管理员",2);
  91. }
  92. if (role.Contains(Constant.Role_Root))
  93. {
  94. flag = memberService.Delete(request.@params.id);
  95. }
  96. else
  97. {
  98. List<Member> ms= members.Where(x => x.unionid == unionid).ToList();
  99. if (ms.IsNotEmpty())
  100. {
  101. flag = memberService.Delete(request.@params.id);
  102. }
  103. else {
  104. throw new BizException("登录账号不是此组织管理员,不能操作此人员", 2);
  105. }
  106. }
  107. }
  108. return builder.Data(flag).build();
  109. }
  110. /// <summary>
  111. /// 更新组织成员
  112. /// </summary>
  113. /// <param name="request"></param>
  114. /// <returns></returns>
  115. [HttpPost("update")]
  116. [Authorize(Policy = Constant.Role_RootAdmin)]
  117. public BaseJosnRPCResponse Update(JosnRPCRequest<Member> request) {
  118. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  119. string role = GetLoginUser(JwtClaimTypes.Role);
  120. string unionid = GetLoginUser(JwtClaimTypes.Id);
  121. bool flag = false;
  122. if (!string.IsNullOrEmpty(request.@params.id)) {
  123. Member member= memberService.GetById(request.@params.id);
  124. if (member != null) {
  125. member.admin = request.@params.admin;
  126. // member.expires = request.@params.expires;
  127. member.status = request.@params.status;
  128. member.memberName = request.@params.memberName;
  129. if (role.Contains(Constant.Role_Root))
  130. {
  131. flag= memberService.Update(member);
  132. }
  133. else {
  134. Expression<Func<Member, bool>> mlinq = null;
  135. //当前登录人员是否是管理员
  136. mlinq = o => o.unionid == unionid && o.orgCode == member.orgCode && 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&& o.status == 1;
  166. List<Organization> organizations= organizationService.GetList(olinq);
  167. if (organizations.IsNotEmpty())
  168. {
  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 && o.status == 1;
  175. List<ActivationCode> activationCodes = activationCodeService.GetList(alinq);
  176. int maximum = 0;
  177. long expires = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
  178. if (activationCodes.IsNotEmpty())
  179. {
  180. ActivationCode activationCode = activationCodes[0];
  181. maximum = activationCode.maximum;
  182. if (activationCode.expires > time)
  183. {
  184. expires = activationCode.expires;
  185. }
  186. else
  187. {
  188. throw new BizException("组织机构授权已经过期!", 2);
  189. }
  190. }
  191. else
  192. {
  193. throw new BizException("组织机构未被授权!", 2);
  194. }
  195. Dictionary<string, object> addPhone = new Dictionary<string, object>();
  196. List<string> phones = new List<string>();
  197. foreach (string cellphone in request.@params.cellphone)
  198. {
  199. Expression<Func<Member, bool>> cmlinq = null;
  200. cmlinq = o => o.orgCode == request.@params.orgCode;
  201. List<Member> membersc = memberService.GetList(cmlinq);
  202. if (membersc.IsNotEmpty() && membersc.Count >= maximum)
  203. {
  204. // addPhone.Add("addPhone", phones);
  205. //builder.Extend(addPhone);
  206. flag = false;
  207. break;
  208. }
  209. Expression<Func<Lecturer, bool>> linq = null;
  210. linq = m => m.cellphone == cellphone;
  211. List<Lecturer> lecturers = lecturerService.GetList(linq);
  212. Lecturer lecturer = null;
  213. if (!lecturers.IsNotEmpty())
  214. {
  215. //新增组织机构管理员
  216. Random random = new Random();
  217. string seed = new string(Constant.az09);
  218. string pfx = "";
  219. for (int i = 0; i < 4; i++)
  220. {
  221. string c = seed.ToCharArray()[random.Next(0, seed.Length)] + "";
  222. seed.Replace(c, "");
  223. pfx = pfx + c;
  224. }
  225. lecturer = new Lecturer
  226. {
  227. id = Guid.NewGuid().ToString(),
  228. unionid = Guid.NewGuid().ToString("N"),
  229. username = cellphone + "手机用户",
  230. password = "",
  231. account = "hitmd-" + cellphone.Substring(cellphone.Length - 4, 4) + "#" + pfx,
  232. areaCode = "86",
  233. registerTime = time,
  234. status = 1,
  235. setaccount = 0,
  236. cellphone = cellphone,
  237. avatar = "https://cdhabook.teammodel.cn/avatar/usertile" + random.Next(10, 44) + ".png"
  238. };
  239. flag = lecturerService.Insert(lecturer);
  240. }
  241. else
  242. {
  243. lecturer = lecturers[0];
  244. }
  245. Expression<Func<Member, bool>> melinq = null;
  246. melinq = m => m.unionid == lecturer.unionid && m.orgCode == organization.code;
  247. List<Member> membersEx = memberService.GetList(melinq);
  248. if (!membersEx.IsNotEmpty())
  249. {
  250. Member member = new Member
  251. {
  252. id = Guid.NewGuid().ToString(),
  253. orgCode = organization.code,
  254. admin = request.@params.admin,
  255. // expires = -1,
  256. status = 1,
  257. unionid = lecturer.unionid,
  258. createTime = time
  259. };
  260. //if (request.@params.expires > 0)
  261. //{
  262. // member.expires = time + request.@params.expires * 60 * 60 * 24;
  263. //}
  264. //else
  265. //{
  266. // member.expires = request.@params.expires;
  267. //}
  268. if (role.Contains(Constant.Role_Root))
  269. {
  270. flag = memberService.Insert(member);
  271. }
  272. else
  273. {
  274. Expression<Func<Member, bool>> mlinq = null;
  275. //当前登录人员是否是管理员
  276. mlinq = o => o.unionid == unionid && o.orgCode == organization.code && o.admin == 1;
  277. List<Member> members = memberService.GetList(mlinq);
  278. if (members.IsNotEmpty())
  279. {
  280. flag = memberService.Insert(member);
  281. }
  282. else
  283. {
  284. // throw new BizException("当前登录用户不是该组织的管理员!", 2);
  285. }
  286. }
  287. phones.Add(lecturer.cellphone);
  288. }
  289. }
  290. addPhone.Add("addPhone", phones);
  291. builder.Extend(addPhone);
  292. }
  293. else
  294. {
  295. throw new BizException("个人用户不允许添加其他成员!", 2);
  296. }
  297. }
  298. else {
  299. throw new BizException("组织机构不存在或禁用!", 2);
  300. }
  301. return builder.Data(flag).build();
  302. }
  303. public class MemberDto {
  304. [Required(ErrorMessage = "组织机构必须设置")]
  305. public string orgCode { get; set; }
  306. [Required(ErrorMessage = "手机号必须填写")]
  307. public List<string> cellphone { get; set; }
  308. [Required(ErrorMessage = "是否组织管理员必须填写")]
  309. [Range(0,1, ErrorMessage = "是否组织管理员请输入0~1的整数")]
  310. public int admin { get; set; }
  311. /// <summary>
  312. /// 时长-1 永久 ,大于0 按天计算
  313. /// </summary>
  314. //[Required(ErrorMessage = "授权时限必须填写")]
  315. //[Range(-1, 3650, ErrorMessage = "请输入-1~3650的整数")]
  316. //public int expires { get; set; }
  317. }
  318. /// <summary>
  319. /// 查看组织成员
  320. /// </summary>
  321. /// <param name="request"></param>
  322. /// <returns></returns>
  323. [HttpPost("list")]
  324. [Authorize(Policy =Constant.Role_RootAdmin)]
  325. public BaseJosnRPCResponse list(PaginationJosnRPCRequest<Dictionary<string, string>> request) {
  326. JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
  327. string role = GetLoginUser(JwtClaimTypes.Role);
  328. string unionid = GetLoginUser(JwtClaimTypes.Id);
  329. if (request.@params.data.TryGetValue("orgCode", out string orgCode))
  330. {
  331. ///超级管理员可以处理所有的组织
  332. if (role.Contains(Constant.Role_Root))
  333. {
  334. Expression<Func<Member, bool>> olinq = null;
  335. olinq = o => o.orgCode == orgCode;
  336. List<Member> members= memberService.GetPageList(olinq,request.@params.page);
  337. dynamic lecs =new List<Lecturer>();
  338. if (members.IsNotEmpty()) {
  339. Expression<Func<Lecturer, object>> linq = null;
  340. linq = l => l.unionid;
  341. List<Lecturer> lecturers = lecturerService.GetListIn(linq, members.Select(x => x.unionid).ToArray());
  342. lecs = lecturers.Select(x => new { x.username, x.unionid, x.status,x.cellphone }).ToList();
  343. }
  344. builder.Data(members).Page(request.@params.page).Extend(new Dictionary<string, object> { { "lecturers", lecs} });
  345. }
  346. else
  347. {
  348. //普通管理员只能处理自己的组织
  349. Expression<Func<Member, bool>> olinq = null;
  350. olinq = o => o.orgCode == orgCode && o.unionid == unionid && o.admin == 1;
  351. List<Member> members = memberService.GetList(olinq);
  352. if (members.IsNotEmpty()) {
  353. Expression<Func<Member, bool>> qlinq = null;
  354. qlinq = o => o.orgCode == orgCode;
  355. List<Member> membersOrg = memberService.GetPageList(qlinq, request.@params.page);
  356. dynamic lecs = new List<Lecturer>();
  357. if (membersOrg.IsNotEmpty()) {
  358. Expression<Func<Lecturer, object>> linq = null;
  359. linq = l => l.unionid;
  360. List<Lecturer> lecturers = lecturerService.GetListIn(linq, membersOrg.Select(x => x.unionid).ToArray());
  361. lecs = lecturers.Select(x => new { x.username, x.unionid, x.status, x.cellphone }).ToList();
  362. }
  363. builder.Data(membersOrg).Page(request.@params.page).Extend(new Dictionary<string, object> { { "lecturers", lecs } });
  364. }
  365. }
  366. }
  367. return builder.build();
  368. }
  369. }
  370. }