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();
}
}
}