liaoxujun@qq.com
2023-09-01 a7981690ac9480ce932c9a9436e952022165e2a9
DocumentServiceAPI.Application/UserAndLogin/LogInController.cs
@@ -1,10 +1,18 @@
using DocumentServiceAPI.Application.UserAndLogin.Services;
using DocumentServiceAPI.Application.UserAndLogin.ViewMode;
using DocumentServiceAPI.Model.cyDocumentModel;
using DocumentServiceAPI.Model.UserInfoModel;
using DocumentServiceAPI.Utility;
using Furion.DynamicApiController;
using Furion.JsonSerialization;
using Microsoft.AspNetCore.Http;
using Microsoft.IdentityModel.Tokens;
using NetTaste;
using Newtonsoft.Json.Linq;
using Swashbuckle.AspNetCore.Annotations;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -16,6 +24,7 @@
    /// </summary>
    [ApiDescriptionSettings("LogInAndUser")]
    [DynamicApiController]
    public class LogInController
    {
     private   TokenService _tokenService;
@@ -26,150 +35,201 @@
         }
        /// <summary>
        /// 登录 1 输入员工账户或者租户账户,2 选择租户账户,3 选择公司
        /// 当密码为空时,带入用户中心token即可实现登录
        /// </summary>
        /// <returns>登录信息</returns>
        [HttpPost("LogoIn")]
        public async Task<RetLoginVM> LogoIn (LoginPsWordIN Parma)
        public async Task<RetLoginVM> LogoIn (  LoginPsWordIN Parma)
        {
              bool needtoken=false;
            if (Parma.TenantId==null)
            //zctok校验成功是否标志
            bool IsTokenPass=false;
               if(string.IsNullOrEmpty(Parma.PassWord))
            {
                //如果还没确定租户ID 需要先确定租户ID
                List<TenderVM>Tender = await _userService.GetUserTenderList(Parma.ITCode);
                switch (Tender.Count)
                {
                    case 0:
                        throw Oops.Oh($"账户或者密码错误");
                    case 1:
                         needtoken = await _userService.CheckPsw(Tender[0].TenderId, Tender[0].EmployeeID,Parma.PassWord);
                        if(!needtoken)
                            throw Oops.Oh($"账户或者密码错误");
                        if (Parma.UnitID == null)
                        {
                            var Units = await _userService.GetUserUnitInfo(Parma.TenantId ?? 0);
                            if (Units.Count == 0)
                            {
                                //没有公司
                                needtoken = true;
                            }
                            else if (Units.Count == 1)
                            {
                                Parma.UnitID = Units[0].UnitID;
                                needtoken = true;
                            }
                            else
                            {
                                //其他需要用户选择租户
                                return new RetLoginVM
                                {
                                    NeedNext = true,
                                    Units = Units,
                                };
                            }
                var Request = App.HttpContext.Request;
                string stoken = Request.Headers["Authorization"];
                if (stoken == null)
                    throw Oops.Oh("没有输入密码");
                stoken = stoken.Replace("Bearer ", "");
                var isvale = _tokenService.CheckJwt(stoken, out SecurityToken securityToken);
                JwtSecurityToken jwtToken = securityToken as JwtSecurityToken;
                string itcode = jwtToken.Claims.FirstOrDefault(claim => claim.Type == "sub")?.Value;
                if (isvale == false)
                    throw Oops.Oh("登录信息出错");
                if(Parma.ITCode!= itcode)
                    throw Oops.Oh("用户名错误");
                IsTokenPass=true;
            }
                bool needtoken = false;
                if (Parma.TenantId == null)
                {
                    //如果还没确定租户ID 需要先确定租户ID
                    List<TenderVM> Tender = await _userService.GetUserTenderList(Parma.ITCode);
                    switch (Tender.Count)
                    {
                        case 0:
                            throw Oops.Oh($"账户或者密码错误");
                        case 1:
                        if (!IsTokenPass)
                        {
                            needtoken = await _userService.CheckPsw(Tender[0].TenderId, Tender[0].EmployeeID, Parma.PassWord);
                            if (!needtoken)
                                throw Oops.Oh($"账户或者密码错误");
                        }
                        Parma.TenantId = Tender[0].TenderId;
                        break;
                    default:
                            Parma.TenantId = Tender[0].TenderId;
                            Parma.employeeID = Tender[0].EmployeeID;
                            if (Parma.UnitID == null)
                            {
                                List<UnitVM> Units = await _userService.GetUserUnitList(Parma.TenantId ?? 0);
                                if (Units.Count == 0)
                                {
                                    //没有公司
                                    needtoken = true;
                                }
                                else if (Units.Count == 1)
                                {
                                    Parma.UnitID = Units[0].UnitID;
                                    needtoken = true;
                                }
                                else
                                {
                                    //其他需要用户选择租户
                                    return new RetLoginVM
                                    {
                                        NeedNext = true,
                                        Units = Units,
                                    };
                                }
                            }
                            break;
                        default:
                            //其他需要用户选择租户
                            return new RetLoginVM
                            {
                                NeedNext = true,
                                Tenants = Tender,
                            };
                    }
                }
                else if (Parma.UnitID == null)
                {
                    var Units = await _userService.GetUserUnitList(Parma.TenantId ?? 0);
                    if (Units.Count == 0)
                    {
                        //没有公司
                        needtoken = true;
                    }
                    else if (Units.Count == 1) {
                        Parma.UnitID = Units[0].UnitID;
                        needtoken = true;
                    }
                    else
                    {
                        //其他需要用户选择租户
                        return new RetLoginVM
                        {
                            NeedNext = true,
                            Tenders = Tender,
                            Units = Units,
                        };
                    }
                }
            }
            else if(Parma.UnitID==null)
            {
                var Units = await _userService.GetUserUnitInfo(Parma.TenantId??0);
                if(Units.Count==0)
                if (needtoken || Parma.UnitID != null)
                {
                    //没有公司
                    needtoken = true;
                }
                else if (Units.Count==1) {
                    Parma.UnitID= Units[0].UnitID;
                    needtoken = true;
                }
                else
                    TenderVM Tender = (await _userService.GetUserTenderList(Parma.ITCode)).Where(x => x.TenderId == Parma.TenantId && x.EmployeeID == Parma.employeeID).SingleOrDefault();
                    if (Tender == null)
                    {
                        throw Oops.Oh($"账户密码或者租户选择错误");
                    }
                if (!IsTokenPass)
                {
                    //其他需要用户选择租户
                    needtoken = await _userService.CheckPsw(Tender.TenderId, Tender.EmployeeID, Parma.PassWord);
                    if (!needtoken)
                        throw Oops.Oh($"账户或者密码错误");
                }
                 var hasPermissions=   await _userService.TenderHasPermissions(Tender.TenderId);
                if(!hasPermissions)
                {
                    throw Oops.Oh($"集团用账号:{Tender.ItCode}使用期限已经过期或者没有使用权限");
                }
                    var token = _tokenService.CreateToken(new Model.JwtInfo
                    {
                        EID = Tender.EmployeeID,
                        LogInSource = Parma.Form,
                        TEID = Tender.TenderId,
                        UID = Parma.UnitID,
                    });
                    return new RetLoginVM
                    {
                        NeedNext = true,
                       Units = Units,
                        NeedNext = false,
                        Token = token,
                    };
                }
                throw Oops.Oh($"参数错误");
            }
            if(needtoken|| Parma.UnitID!=null)
        }
        /// <summary>
        /// 是否是用户租户,或者是员工
        /// </summary>
        /// <param name="ITCode">账号</param>
        /// <returns>  返回true 代表是, false代表不是</returns>
        [HttpGet("IDIsEmployee")]
        public async Task<bool> IDIsEmployee(string ITCode, [FromServices] ISqlSugarClient db)
        {
          var ad=  ITCode.TryValidate(ValidationTypes.PhoneNumber);
            if(!ad.IsValid)
            {
                TenderVM Tender = (await _userService.GetUserTenderList(Parma.ITCode)).Where(x=>x.TenderId==Parma.TenantId&&x.EmployeeID==Parma.employeeID).SingleOrDefault();
                if(Tender==null)
                {
                    throw Oops.Oh($"账户密码或者租户选择错误");
                }
                needtoken = await _userService.CheckPsw(Tender. TenderId, Tender.EmployeeID, Parma.PassWord);
                if (!needtoken)
                    throw Oops.Oh($"账户或者密码错误");
              var token=  _tokenService.CreateToken(new Model.JwtInfo
                {
                    EID = Tender.EmployeeID,
                    LogInSource = Parma.Form,
                    TID = Tender.TenderId,
                    UID = Parma.UnitID,
                });
                return new RetLoginVM
                {
                    NeedNext = false,
                   Token = token,
                };
                throw Oops.Oh("请输入正确的账号");
            }
            throw Oops.Oh($"参数错误");
          var count= await db.Queryable<TenantInfo>().Where(x=>x.ItCode==ITCode&&x.IsEn==true&&x.IsDel==false).WithCache(600).CountAsync();
            if (count > 0)
                return true;
            count=await db.Queryable<Document_EmployeeInfo>().Where(x=>x.UserName==ITCode).WithCache(600).CountAsync();
            if (count > 0)
                return true;
            return false;
        }
        /// <summary>
        /// 获取公司列表
        /// </summary>
        /// <returns>登录信息</returns>
        public bool GetUnitList()
        {
            return true;
        }
        /// <summary>
        /// 获取公司列表
        /// </summary>
        /// <returns>登录信息</returns>
        public bool GetTenantInfoList()
        {
            return true;
        }
        public string Get()
        {
            return $"Hello {nameof(Furion)}";
        }
    }
}