using HiTeachCE.Helpers; using HiTeachCE.Models; using HiTeachCE.Services; using IdentityModel; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OpenXmlPowerTools; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using TEAMModelOS.SDK.Context.Exception; using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest; using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse; using TEAMModelOS.SDK.Helper.Common.CollectionHelper; namespace HiTeachCE.Controllers { [Route("api/[controller]")] [ApiController] public class MemberController : BaseController { public MemberService memberService; public LecturerService lecturerService; public OrganizationService organizationService; public ActivationCodeService activationCodeService; public MemberController(MemberService member , LecturerService lecturer,OrganizationService organization,ActivationCodeService activationCode) { memberService = member; lecturerService = lecturer; organizationService = organization; activationCodeService = activationCode; } /// /// 退出组织 必须本人退出 /// /// /// [HttpPost("exit")] [Authorize(Policy = Constant.Role_WebAll)] public BaseJosnRPCResponse Exit(JosnRPCRequest> request) { JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder(); string role = GetLoginUser(JwtClaimTypes.Role); string loginUnionid = GetLoginUser(JwtClaimTypes.Id); bool flag = false; if(request.@params.TryGetValue("unionid",out string unionid) && request.@params.TryGetValue("orgCode",out string orgCode)) { if (unionid.Equals(loginUnionid)) { Expression> mlinq = null; //当前登录人员是否是管理员 mlinq = o => o.orgCode == orgCode; mlinq = o => o.unionid == unionid; List members= memberService.GetList(mlinq); if (members.IsNotEmpty()) { members.ForEach(x => { flag = memberService.Delete(x.id); }); } } } return builder.Data(flag).build(); } /// /// 移除成员 /// /// /// [HttpPost("remove")] [Authorize(Policy = Constant.Role_RootAdmin)] public BaseJosnRPCResponse Remove(JosnRPCRequest request) { JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder(); string role = GetLoginUser(JwtClaimTypes.Role); string unionid = GetLoginUser(JwtClaimTypes.Id); bool flag = false; if (!string.IsNullOrEmpty(request.@params.id)) { Expression> mlinq = null; //当前登录人员是否是管理员 mlinq = o => o.orgCode == request.@params.orgCode; mlinq = o => o.admin == 1; List members = memberService.GetList(mlinq); if (members.IsNotEmpty() ) { if (members.Count == 1 && members[0].unionid.Equals(request.@params.unionid)) { throw new BizException("请保留至少一位管理员!", 2); } } else { throw new BizException("该组织已经没有管理员,请设置管理员",2); } if (role.Contains(Constant.Role_Root)) { flag = memberService.Delete(request.@params.id); } else { List ms= members.Where(x => x.unionid == unionid).ToList(); if (ms.IsNotEmpty()) { flag = memberService.Delete(request.@params.id); } else { throw new BizException("登录账号不是此组织管理员,不能操作此人员", 2); } } } return builder.Data(flag).build(); } /// /// 更新组织成员 /// /// /// [HttpPost("update")] [Authorize(Policy = Constant.Role_RootAdmin)] public BaseJosnRPCResponse Update(JosnRPCRequest request) { JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder(); string role = GetLoginUser(JwtClaimTypes.Role); string unionid = GetLoginUser(JwtClaimTypes.Id); bool flag = false; if (!string.IsNullOrEmpty(request.@params.id)) { Member member= memberService.GetById(request.@params.id); if (member != null) { member.admin = request.@params.admin; member.expires = request.@params.expires; member.status = request.@params.status; member.memberName = request.@params.memberName; if (role.Contains(Constant.Role_Root)) { flag= memberService.Update(member); } else { Expression> mlinq = null; //当前登录人员是否是管理员 mlinq = o => o.unionid == unionid; mlinq = o => o.orgCode == member.orgCode; mlinq = o => o.admin == 1; List members = memberService.GetList(mlinq); if (members.IsNotEmpty()) { flag = memberService.Update(member); } else { throw new BizException("当前登录用户不是该组织的管理员!", 2); } } } } return builder.Data(flag).build(); } /// /// 添加人与 /// /// /// [HttpPost("add")] [Authorize(Policy = Constant.Role_RootAdmin)] public BaseJosnRPCResponse Add(JosnRPCRequest request) { JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder(); string role = GetLoginUser(JwtClaimTypes.Role); string unionid = GetLoginUser(JwtClaimTypes.Id); bool flag = false; Expression> olinq = null; olinq =o => o.code == request.@params.orgCode; olinq = o => o.status ==1; List organizations= organizationService.GetList(olinq); if (organizations.IsNotEmpty()) { Organization organization = organizations[0]; if (organization.type == 1) { long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); Expression> alinq = null; alinq = o => o.orgCode == request.@params.orgCode; alinq = o => o.status == 1; List activationCodes= activationCodeService.GetList(alinq); if (activationCodes.IsNotEmpty()) { ActivationCode activationCode = activationCodes[0]; if (activationCode.expires == -1 || activationCode.expires > time) { Expression> mlinq = null; mlinq = o => o.orgCode == request.@params.orgCode; List members= memberService.GetList(mlinq); if (members.IsNotEmpty() && members.Count >= activationCode.maximum) { throw new BizException("组织机构授权人数达到上限!", 2); } } else { throw new BizException("组织机构授权已经过期!", 2); } } else { throw new BizException("组织机构未被授权!",2); } Expression> linq = null; linq = m => m.cellphone == request.@params.cellphone; List lecturers = lecturerService.GetList(linq); Lecturer lecturer = null; if (!lecturers.IsNotEmpty()) { //新增组织机构管理员 Random random = new Random(); string seed = new string(Constant.az09); string pfx = ""; for (int i = 0; i < 4; i++) { string c = seed.ToCharArray()[random.Next(0, seed.Length)] + ""; seed.Replace(c, ""); pfx = pfx + c; } lecturer = new Lecturer { id = Guid.NewGuid().ToString(), unionid = Guid.NewGuid().ToString("N"), username = request.@params.cellphone + "手机用户", password = "", account = "hitmd-" + request.@params.cellphone.Substring(request.@params.cellphone.Length - 4, 4) + "#" + pfx, areaCode = "86", registerTime = time, status = 1, setaccount = 0, cellphone = request.@params.cellphone }; flag= lecturerService.Insert(lecturer); } else { lecturer = lecturers[0]; } Member member = new Member { id = Guid.NewGuid().ToString(), orgCode = organization.code, admin = 1, expires = -1, status = 1, unionid = lecturer.unionid, createTime = time }; if (role.Contains(Constant.Role_Root)) { flag = memberService.Insert(member); } else { Expression> mlinq = null; //当前登录人员是否是管理员 mlinq = o => o.unionid == unionid; mlinq = o => o.orgCode == organization.code; mlinq = o => o.admin == 1; List members= memberService.GetList(mlinq); if (members.IsNotEmpty()) { flag = memberService.Insert(member); } else { throw new BizException("当前登录用户不是该组织的管理员!", 2); } } } else { throw new BizException("个人用户不允许添加其他成员!",2); } } return builder.Data(flag).build(); } public class MemberDto { [Required(ErrorMessage = "组织机构必须设置")] public string orgCode { get; set; } [Required(ErrorMessage = "手机号必须填写")] public string cellphone { get; set; } [Required(ErrorMessage = "是否组织管理员必须填写")] [Range(0,1, ErrorMessage = "是否组织管理员请输入0~1的整数")] public int admin { get; set; } /// /// 时长-1 永久 ,大于0 按天计算 /// [Required(ErrorMessage = "授权时限必须填写")] [Range(-1, 180, ErrorMessage = "请输入-1~180的整数")] public int expires { get; set; } } /// /// 查看组织成员 /// /// /// [HttpPost("list")] [Authorize(Policy =Constant.Role_RootAdmin)] public BaseJosnRPCResponse list(PaginationJosnRPCRequest> request) { JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder(); string role = GetLoginUser(JwtClaimTypes.Role); string unionid = GetLoginUser(JwtClaimTypes.Id); if (request.@params.data.TryGetValue("orgCode", out string orgCode)) { ///超级管理员可以处理所有的组织 if (role.Contains(Constant.Role_Root)) { Expression> olinq = null; olinq = o => o.orgCode == orgCode; List members= memberService.GetPageList(olinq,request.@params.page); Expression> linq = null; linq = l => l.unionid; List lecturers= lecturerService.GetListIn(linq, members.Select(x => x.unionid).ToArray()); var lecs= lecturers.Select(x => new {x.username,x.unionid,x.status }).ToList(); builder.Data(members).Page(request.@params.page).Extend(new Dictionary { { "lecturers", lecs} }); } else { //普通管理员只能处理自己的组织 Expression> olinq = null; olinq = o => o.orgCode == orgCode; olinq = o => o.unionid == unionid; olinq = o => o.admin == 1; List members = memberService.GetList(olinq); if (members.IsNotEmpty()) { Expression> qlinq = null; qlinq = o => o.orgCode == orgCode; List membersOrg = memberService.GetPageList(qlinq, request.@params.page); Expression> linq = null; linq = l => l.unionid; List lecturers = lecturerService.GetListIn(linq, membersOrg.Select(x => x.unionid).ToArray()); var lecs = lecturers.Select(x => new { x.username, x.unionid, x.status }).ToList(); builder.Data(membersOrg).Page(request.@params.page).Extend(new Dictionary { { "lecturers", lecs } }); } } } return builder.build(); } } }