FaceLoginService.cs 11.6 KB
using Hh.Mes.Common;
using Hh.Mes.Common.config;
using Hh.Mes.Common.Http;
using Hh.Mes.Common.Json;
using Hh.Mes.Common.log;
using Hh.Mes.Common.Redis;
using Hh.Mes.Pojo.System;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.EnumEntitys;
using Hh.Mes.POJO.Response;
using Hh.Mes.Service.Repository;
using Microsoft.AspNetCore.Hosting;
using System;
using System.IO;
using System.Linq;
using System.Net;

namespace Hh.Mes.Service
{
    /// <summary>
    /// 人脸识别登陆
    /// </summary>
    public class FaceLoginService: RepositorySqlSugar<sys_user>
    {
        public string baseUrl { get; set; }

        public FaceLoginService()
        {
           baseUrl =ConfigRead.GetInstance.GetAppsetConnection().FaceBaseUrl ;
        }

        /// <summary>
        /// 刷脸登录
        /// </summary>
        public dynamic FaceSearchService(string webcam)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var res = new Response();
                #region  接口图片 识别
                HttpHelper httpHelper = new HttpHelper();
                HttpItem item = new HttpItem()
                {
                    URL = baseUrl + "faceSearch",
                    Method = "post",
                    ContentType = "application/x-www-form-urlencoded",//返回类型    可选项有默认值
                    Postdata = string.Format("file=\"{0}\"&groupId=101", webcam),
                };
                var httpResult = httpHelper.GetHtml(item);
                if (httpResult.StatusCode!= HttpStatusCode.OK)
                {
                    res.Code = -200;
                    res.Message = httpResult.Html;
                    return res;
                }
                var result = DynamicJson.Parse(httpResult.Html);
                #endregion

                if (result.code==0)
                {
                    string name = result.data.name;
                    string temp= name.Replace("\\", "");
                    string username= temp.Replace('"',' ').Trim();
                    var reSysuser= GetSysUserByName(username);
                    if (reSysuser == null)
                    {
                        res.Code = -100;
                        res.Message = "人脸信息未绑定!请在系统管理-用户管理维护!";
                        return res;
                    }
                    else {
                        res.Code = 200;
                        res.Result = reSysuser;
                        res.Message = "ok";
                        return res;
                    }
                }
                else
                {
                    res.Code = -200;
                    res.Message = "人脸识别不匹配或者人脸信息未绑定,请在系统管理-用户管理维护!";
                    return res;
                }
            });
        }

        /// <summary>
        /// 刷卡登录
        /// </summary>
        public dynamic IdCardSearchService(string idCard)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var res = new Response();
                //查找卡号
                var user=Context.Queryable<sys_user>().First(x => x.idcard == idCard);
                if (user==null)
                {
                    res.Code = 500;
                    res.Message = "工卡信息未绑定!请在系统管理-用户管理维护!";
                    return res;
                }
                res.Result = user;
                return res;
            });
        }

        /// <summary>
        /// 第3方登入 
        /// </summary>
        public dynamic OtherLoginNew(string loginName)
        {
            var res = new Response(false);
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var cli = new RedisBase();
            
                #region  before
                if (string.IsNullOrEmpty(loginName))
                {
                    res.Message = "第三方参数【loginName】传入为空!";
                    return res;
                }

                var user = GetSysUserByName(loginName);
                if (user == null)
                {
                    res.Code = 500;
                    res.Message = $"第三方登入没有查询到您的用户信息,或者在系统管理=>用户管理新增次用户!请核实信息【loginName】{loginName}!";
                    return res;
                }
                #endregion

                #region redis
                var token = Guid.NewGuid().ToString("N");
                var currentSession = new UserAuthSession
                {
                    Account = user.account,
                    Name = user.name,
                    Sex = user.sex,
                    Idcard = user.idcard,

                    Token = token,
                    CreateTime = DateTime.Now,
                };
                //创建Session
                cli.SetT(token, currentSession, cli.dayTime);

                #endregion
                UserOnlineAction(token, user.account, user.name);

                res.Code = 200;
                res.Result = currentSession;
                res.Token = token;
                res.Status = true;
                res.Message = "ok";
                return res;
            });
        }


        #region 用户管理绑卡 

        /// <summary>
        /// 绑定登入图片和工卡
        /// </summary>
        /// <param name="name">账号</param>
        /// <param name="webcam">图片base64</param>
        /// <param name="jobCard">卡号</param>
        /// <param name="edit">更新的标识, true不调用接口</param>
        public dynamic FaceSearchAdd(string name, string webcam, string jobCard, bool edit,byte[] imageBytes, IHostingEnvironment environment)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var res = new Response();
                string path = "";
                if (Context.Queryable<sys_user>().Where(x => x.account != name && x.idcard == jobCard).Any())
                {
                    res.Code = 500;
                    res.Message = "此卡号已被绑定!";
                    return res;
                }
                #region 图片 识别是否是人脸
                if (imageBytes.Length > 0)
                {
                    var item = new HttpItem()
                {
                    URL = baseUrl + "faceAdd",
                    Method = "post",
                    ContentType = "application/x-www-form-urlencoded",
                    Postdata = string.Format("file={0}&groupId=101&name={1}", webcam, name),
                };
                var httpHelper = new HttpHelper();
                var httpResult = httpHelper.GetHtml(item);
                if (httpResult.StatusCode != HttpStatusCode.OK)
                {
                    res.Code = 500;
                    res.Message = httpResult.Html;
                    return res;
                }
                var result = DynamicJson.Parse(httpResult.Html);
                #endregion

                #region 前置判断
                if (result.code != 0)
                {
                    res.Code = -200;
                    res.Status = false;
                    res.Message = result.message;
                    return res;
                }

                var isExist = Context.Queryable<user_face_info>().Where(x => x.name == name).Any();
                if (!isExist)
                {
                    res.Code = 500;
                    res.Message = "人脸信息识别更新识别";
                    return res;
                }
               
                    #endregion

                #region  写入数据库

                    #region 保存文件

                    var upFloder = Path.Combine(environment.ContentRootPath + "\\wwwroot", uploadFolder);
                    var suffix = ".png";
                    var newFileName = Guid.NewGuid().ToString("N") + suffix;
                    base.SaveFile(imageBytes, upFloder + "\\" + newFileName);
                    path = "/" + uploadFolder + "/" + newFileName;

                }

                #endregion
                UpdateSysUser(name, path, jobCard);
                var isOk = Context.SaveQueues();
                res.Code = isOk > 0 ? 200 : 500;
                res.Status = isOk > 0;
                res.Message = isOk > 0 ? "绑定身份认证:操作成功" : "绑定身份认证:失败,反复出现请联系管理员!";
                return res;

                #endregion
            });
        }


        /// <summary>
        ///删除用户 清空人脸识别user_face_info表  清空用户关联SysRelevance表
        /// </summary>
        /// <param name="ids"></param>
        public void DeleteById(int[] ids)
        {
            var accountList = Context.Queryable<sys_user>().Where(t => ids.Contains(t.id)).Select(t => t.account).ToList();
            var relkeyList = new string[] { Define.USERROLE, Define.USERORG, Define.USERELEMENT, Define.USERMODULE };
            Context.Deleteable<user_face_info>().Where(t => accountList.Contains(t.name)).AddQueue();
            Context.Deleteable<SysRelevance>().Where(t => ids.Contains(t.FirstId.Value) && relkeyList.Contains(t.RelKey)).AddQueue();
            Context.Deleteable<sys_user>().In(ids).AddQueue();
            base.Context.SaveQueues();
        }
        #endregion


        private sys_user GetSysUserByName(string name)
        {
            return Context.Queryable<sys_user>().First(x => x.account == name);
        }


        /// <summary>
        ///  更新用户表
        /// </summary>
        private void UpdateSysUser(string account, string webcam, string jobCard)
        {
            var user = new sys_user()
            {
                idcard = jobCard,
                facePicture = string.IsNullOrEmpty( webcam)?null: webcam
            };
            Context.Updateable(user).IgnoreColumns(ignoreAllNullColumns: true).Where(x => x.account == account).AddQueue();
        }


        private void UserOnlineAction(string token, string account,string name)
        {
            var ip = ComputerHelp.GetAddressIP();
            var userOnline = base.Context.Queryable<sys_user_online>().First(u => u.ipaddr.Equals(ip) && u.account.Equals(account)); 
            var dateTime = DateTime.Now;
            if (userOnline != null)
            {
                var temp = new sys_user_online()
                {
                    token = token,
                    loginTime = dateTime,
                    lastAccessTime = dateTime,
                };
                userOnline.token = token;
                userOnline.loginTime = dateTime;
                userOnline.lastAccessTime = dateTime;
                base.Context.Updateable(temp).Where(x => x.id == userOnline.id).AddQueue();
            }
            else
            {
                var temp = new sys_user_online
                {
                    token = token,
                    account = account,
                    name = name,
                    ipaddr = ip,
                    browser = "第3方登入",
                    loginTime = dateTime,
                    lastAccessTime = dateTime,
                };
                base.Context.Insertable(temp).AddQueue();
            }

            var sysLoginLog = new sys_login_log
            {
                token = token,
                account = account,
                name = name,
                ipaddr = ip,
                browser = "第3方登入",
                loginTime = dateTime,
            };
            base.Context.Insertable(sysLoginLog).AddQueue();
            base.Context.SaveQueues();
        }

    }
}