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 && o.unionid == unionid; List members= memberService.GetList(mlinq); if (members.IsNotEmpty()) { members.ForEach(x => { flag = memberService.Delete(x.id); }); } } else { throw new BizException("必须本人退出组织!",2); } } 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 && 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 && o.orgCode == member.orgCode && 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&& 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 && o.status == 1; List activationCodes = activationCodeService.GetList(alinq); int maximum = 0; long expires = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); if (activationCodes.IsNotEmpty()) { ActivationCode activationCode = activationCodes[0]; maximum = activationCode.maximum; if (activationCode.expires > time) { expires = activationCode.expires; } else { throw new BizException("组织机构授权已经过期!", 2); } } else { throw new BizException("组织机构未被授权!", 2); } Dictionary addPhone = new Dictionary(); List phones = new List(); foreach (string cellphone in request.@params.cellphone) { Expression> cmlinq = null; cmlinq = o => o.orgCode == request.@params.orgCode; List membersc = memberService.GetList(cmlinq); if (membersc.IsNotEmpty() && membersc.Count >= maximum) { // addPhone.Add("addPhone", phones); //builder.Extend(addPhone); flag = false; break; } Expression> linq = null; linq = m => m.cellphone == 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 = cellphone + "手机用户", password = "", account = "hitmd-" + cellphone.Substring(cellphone.Length - 4, 4) + "#" + pfx, areaCode = "86", registerTime = time, status = 1, setaccount = 0, cellphone = cellphone, avatar = "https://cdhabook.teammodel.cn/avatar/usertile" + random.Next(10, 44) + ".png" }; flag = lecturerService.Insert(lecturer); } else { lecturer = lecturers[0]; } Expression> melinq = null; melinq = m => m.unionid == lecturer.unionid && m.orgCode == organization.code; List membersEx = memberService.GetList(melinq); if (!membersEx.IsNotEmpty()) { Member member = new Member { id = Guid.NewGuid().ToString(), orgCode = organization.code, admin = request.@params.admin, // expires = -1, status = 1, unionid = lecturer.unionid, createTime = time }; //if (request.@params.expires > 0) //{ // member.expires = time + request.@params.expires * 60 * 60 * 24; //} //else //{ // member.expires = request.@params.expires; //} if (role.Contains(Constant.Role_Root)) { flag = memberService.Insert(member); } else { Expression> mlinq = null; //当前登录人员是否是管理员 mlinq = o => o.unionid == unionid && o.orgCode == organization.code && o.admin == 1; List members = memberService.GetList(mlinq); if (members.IsNotEmpty()) { flag = memberService.Insert(member); } else { // throw new BizException("当前登录用户不是该组织的管理员!", 2); } } phones.Add(lecturer.cellphone); } } addPhone.Add("addPhone", phones); builder.Extend(addPhone); } 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 List cellphone { get; set; } [Required(ErrorMessage = "是否组织管理员必须填写")] [Range(0,1, ErrorMessage = "是否组织管理员请输入0~1的整数")] public int admin { get; set; } /// /// 时长-1 永久 ,大于0 按天计算 /// //[Required(ErrorMessage = "授权时限必须填写")] //[Range(-1, 3650, ErrorMessage = "请输入-1~3650的整数")] //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); dynamic lecs =new List(); if (members.IsNotEmpty()) { Expression> linq = null; linq = l => l.unionid; List lecturers = lecturerService.GetListIn(linq, members.Select(x => x.unionid).ToArray()); lecs = lecturers.Select(x => new { x.username, x.unionid, x.status,x.cellphone }).ToList(); } builder.Data(members).Page(request.@params.page).Extend(new Dictionary { { "lecturers", lecs} }); } else { //普通管理员只能处理自己的组织 Expression> olinq = null; olinq = o => o.orgCode == orgCode && o.unionid == unionid && 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); dynamic lecs = new List(); if (membersOrg.IsNotEmpty()) { Expression> linq = null; linq = l => l.unionid; List lecturers = lecturerService.GetListIn(linq, membersOrg.Select(x => x.unionid).ToArray()); lecs = lecturers.Select(x => new { x.username, x.unionid, x.status, x.cellphone }).ToList(); } builder.Data(membersOrg).Page(request.@params.page).Extend(new Dictionary { { "lecturers", lecs } }); } } } return builder.build(); } } }