yanjinhui
2025-04-11 cd58c94a09b82528956c2607f580355b0c0cc912
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_SystemServices/Sys_UserService.cs
@@ -12,6 +12,16 @@
using System.Net;
using WIDESEAWCS_Core.Caches;
using WIDESEA_ISerialPortRepository;
using Microsoft.AspNetCore.Http;
using SqlSugar;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
using Microsoft.AspNetCore.Builder;
using WIDESEAWCS_DTO.SerialPort;
using WIDESEAWCS_DTO.Telescopic;
using WIDESEAWCS_Common;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System.Security.Policy;
namespace WIDESEAWCS_SystemServices
{
@@ -23,27 +33,139 @@
        private readonly ISys_RoleRepository _RoleRepository;
        private readonly ILoginHistoryRepository _loginHistoryRepository;
        private readonly IPutakeRepository _putakeRepository;
        private readonly IFaceRecognitionRepository _faceRecognitionRepository;
        public Sys_UserService(ISys_UserRepository repository, IUnitOfWorkManage unitOfWorkManage,
            ICacheService cacheService, ISys_MenuService menuService , ISys_RoleRepository roleRepository, ILoginHistoryRepository loginHistoryRepository, IPutakeRepository putakeRepository) : base(repository)
        public Sys_UserService(IFaceRecognitionRepository faceRecognitionRepository, ISys_UserRepository repository, IUnitOfWorkManage unitOfWorkManage,
            ICacheService cacheService, ISys_MenuService menuService, ISys_RoleRepository roleRepository, ILoginHistoryRepository loginHistoryRepository, IPutakeRepository putakeRepository) : base(repository)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _cacheService = cacheService;
            _menuService = menuService;
            _RoleRepository = roleRepository;
            _RoleRepository= roleRepository;
            _RoleRepository = roleRepository;
            _loginHistoryRepository = loginHistoryRepository;
            _putakeRepository = putakeRepository;
            _faceRecognitionRepository = faceRecognitionRepository;
        }
        //#region åŽŸæœ¬ç™»å…¥
        //public WebResponseContent Login(LoginInfo loginInfo)
        //{
        //    WebResponseContent content = new WebResponseContent();
        //    try
        //    {
        //        // BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
        //        string msg = string.Empty;
        //        #region ä¸´æ—¶ä½¿ç”¨
        //        try
        //        {
        //            loginInfo.Password = loginInfo.Password.EncryptDES(AppSecret.User);
        //        }
        //        catch
        //        {
        //        }
        //        #endregion
        //        if (!string.IsNullOrEmpty(loginInfo.path))
        //        {
        //            var gruoid = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault();
        //            if (gruoid == null)
        //            {
        //                return new WebResponseContent { Status = false, Message = "没找到该组" };
        //            }
        //            var faceResult = BaiDuFaceHelper.FaceSearch(loginInfo.path, gruoid);
        //            if (faceResult != null && faceResult.error_code == 0)
        //            {
        //                // èŽ·å–æœ€é«˜åŒ¹é…åº¦çš„ç”¨æˆ·
        //                var bestMatch = faceResult.result.user_list.OrderByDescending(u => u.score).FirstOrDefault();//拿第一个最高的
        //                if (bestMatch != null && double.TryParse(bestMatch.score, out double score) && score > 80) // è®¾å®š80分为可信度阈值
        //                {
        //                    //return new WebResponseContent {Status=true,Data = true,Message="识别登入成功" };
        //                }
        //            }
        //            return WebResponseContent.Instance.Error("人脸识别失败,请重试");
        //        }
        //        UserInfo user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password);
        //        var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);//根据这个用户名来查看用户
        //        if (user != null)
        //        {
        //            object obj = _menuService.GetMenuActionList(user.RoleId);
        //            if (obj is not IEnumerable<object> list)
        //            {
        //                return WebResponseContent.Instance.Error("无登录权限");
        //            }
        //            if (!list.Any())
        //            {
        //                return WebResponseContent.Instance.Error("无登录权限");
        //            }
        //            if (disbled.Enable != 1)
        //            {
        //                return WebResponseContent.Instance.Error("你的账号已被禁用,请联系管理员");
        //            }
        //            string token = JwtHelper.IssueJwt(new TokenModelJwt()
        //            {
        //                UserId = user.UserId,
        //                RoleId = user.RoleId,
        //                UserName = user.UserName,
        //                TenantId = user.TenantId,
        //            });
        //            //登入历史记录
        //            var loghis = new Dt_LoginHistory
        //            {
        //                Account = user.UserName,
        //                TrurName = user.UserTrueName,
        //                CreateDate = DateTime.Now
        //            };
        //            _cacheService.AddOrUpdate(user.UserId.ToString(), token);
        //            _loginHistoryRepository.AddData(loghis);
        //            content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl, ID = user.UserId, RoleId = user.RoleId });
        //        }
        //        else
        //        {
        //            content = WebResponseContent.Instance.Error("账号或密码错误");
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        content = WebResponseContent.Instance.Error(ex.Message);
        //    }
        //    return content;
        //}
        //#endregion
        /// <summary>
        /// äººè„¸è¯†åˆ«ç™»å…¥æŽ¥å£
        /// </summary>
        /// <param name="loginInfo"></param>
        /// <returns></returns>
        public WebResponseContent Login(LoginInfo loginInfo)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
                string msg = string.Empty;
                //string msg = string.Empty;
                #region ä¸´æ—¶ä½¿ç”¨
                try
@@ -52,55 +174,109 @@
                }
                catch
                {
                }
                #endregion
                UserInfo user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password);
                var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);//根据这个用户名来查看用户
                if (user != null)
                // å…ˆèŽ·å–ç”¨æˆ·ä¿¡æ¯
                UserInfo user = null;
                if (!string.IsNullOrEmpty(loginInfo.path))
                {
                    object obj = _menuService.GetMenuActionList(user.RoleId);
                    if (obj is not IEnumerable<object> list)
                    // äººè„¸è¯†åˆ«ç™»å½•
                    var groupId = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault();
                    if (groupId == null)
                    {
                        return WebResponseContent.Instance.Error("无登录权限");
                    }
                    if (!list.Any())
                    {
                        return WebResponseContent.Instance.Error("无登录权限");
                    }
                    if (disbled.Enable!=1)
                    {
                        return WebResponseContent.Instance.Error("你的账号已被禁用,请联系管理员");
                        return WebResponseContent.Instance.Error("没找到该人脸识别分组");
                    }
                    string token = JwtHelper.IssueJwt(new TokenModelJwt()
                    var faceResult = BaiDuFaceHelper.FaceSearch(loginInfo.path, groupId);
                    if (faceResult != null && faceResult.error_code == 0)
                    {
                        UserId = user.UserId,
                        RoleId = user.RoleId,
                        UserName = user.UserName,
                        TenantId = user.TenantId,
                    });
                    var loghis = new Dt_LoginHistory
                    {
                        Account = user.UserName,
                        TrurName=user.UserTrueName,
                        CreateDate=DateTime.Now
                        var bestMatch = faceResult.result.user_list.OrderByDescending(u => u.score).FirstOrDefault();
                        string usercount = bestMatch.user_id;
                        if (bestMatch != null && double.TryParse(bestMatch.score, out double score) && score > 80)
                        {
                            //用识别到的 user_id æ¥èŽ·å–ç”¨æˆ·ä¿¡æ¯
                            var faceuser = BaseDal.QueryData(x => x.UserName == usercount).FirstOrDefault(); // èŽ·å–åŒ¹é…çš„ç¬¬ä¸€ä¸ªç”¨æˆ·
                            if (faceuser != null)
                            {
                                // æ‰‹åЍ将 Sys_User æ˜ å°„到 UserInfo
                                user = new UserInfo
                                {
                                    UserId = faceuser.User_Id,
                                    UserName = faceuser.UserName,
                                    UserTrueName = faceuser.UserTrueName,
                                    HeadImageUrl = faceuser.HeadImageUrl,
                                    RoleId = faceuser.Role_Id,
                                    TenantId = faceuser.TenantId,
                                };
                            }
                        }
                    };
                    _cacheService.AddOrUpdate(user.UserId.ToString(), token);
                    _loginHistoryRepository.AddData(loghis);
                    content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl,ID=user.UserId });
                        if (user == null)
                        {
                            return WebResponseContent.Instance.Error("人脸识别失败,请重试");
                        }
                        loginInfo.UserName = user.UserName;
                    }
                }
                else
                {
                    content = WebResponseContent.Instance.Error("账号或密码错误");
                    // å¯†ç ç™»å½•
                    user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password);
                }
                    // å¦‚果找到用户
                    if (user != null)
                    {
                        var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
                        if (disbled.Enable != 1)
                        {
                            return WebResponseContent.Instance.Error("你的账号已被禁用,请联系管理员");
                        }
                        // èŽ·å–è§’è‰²æƒé™
                        object obj = _menuService.GetMenuActionList(user.RoleId);
                        if (obj is not IEnumerable<object> list || !list.Any())
                        {
                            return WebResponseContent.Instance.Error("无登录权限");
                        }
                        // ç”Ÿæˆ JWT Token
                        string token = JwtHelper.IssueJwt(new TokenModelJwt()
                        {
                            UserId = user.UserId,
                            RoleId = user.RoleId,
                            UserName = user.UserName,
                            TenantId = user.TenantId,
                        });
                        // è®°å½•登录历史
                        var loghis = new Dt_LoginHistory
                        {
                            Account = user.UserName,
                            TrurName = user.UserTrueName,
                            CreateDate = DateTime.Now
                        };
                        // ä¿å­˜ç”¨æˆ·ç™»å½•信息
                        _cacheService.AddOrUpdate(user.UserId.ToString(), token);
                        _loginHistoryRepository.AddData(loghis);
                        // è¿”回响应
                        content = WebResponseContent.Instance.OK(data: new
                        {
                            token,
                            userName = user.UserTrueName,
                            img = user.HeadImageUrl,
                            ID = user.UserId,
                            RoleId = user.RoleId
                        });
                    }
                    else
                    {
                        content = WebResponseContent.Instance.Error("账号或密码错误");
                    }
            }
            catch (Exception ex)
            {
@@ -109,6 +285,9 @@
            return content;
        }
        public override WebResponseContent UpdateData(SaveModel saveModel)
        {
@@ -180,6 +359,7 @@
                if (newPwd.Length < 6) return WebResponseContent.Instance.Error("密码不能少于6位");
                int userId = App.User.UserId;
                string userCurrentPwd = BaseDal.QueryFirst(x => x.User_Id == userId, s => s.UserPwd);
                string _oldPwd = oldPwd.EncryptDES(AppSecret.User);
@@ -199,8 +379,8 @@
                    nameof(Sys_User.LastModifyPwdDate),
                    nameof(Sys_User.UserPwd)
                });
                content = WebResponseContent.Instance.OK("密码修改成功");
                //content = WebResponseContent.Instance.OK("密码修改成功");
                content = WebResponseContent.Instance.OK("密码修改成功", userId);
            }
            catch (Exception ex)
            {
@@ -208,6 +388,7 @@
                content = WebResponseContent.Instance.Error("服务器了点问题,请稍后再试");
            }
            return content;
        }
        public WebResponseContent GetUerType()
@@ -236,11 +417,16 @@
            {
                return new WebResponseContent { Status = false, Message="失败"+ex };
                return new WebResponseContent { Status = false, Message = "失败" + ex };
            }
        }
        /// <summary>
        /// æ ¹æ®ç”¨æˆ·ç»„来查看当前作业的权限
        /// </summary>
        /// <param name="userId">用户id</param>
        /// <param name="group">用户分组</param>
        /// <returns></returns>
        public WebResponseContent PermissionView(int userId, string group)
        {
            try
@@ -292,5 +478,518 @@
            }
        }
        /// <summary>
        /// å›¾ç‰‡æ–‡ä»¶å
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        public WebResponseContent SaveFiles(IFormCollection files)
        {
            if (files == null || files.Files.Count == 0)
                return new WebResponseContent { Status = false, Message = "请上传文件" };
            // 1. ç¡®ä¿å­˜å‚¨ç›®å½•存在
            string baseDirectory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image");
            if (!Directory.Exists(baseDirectory))
                Directory.CreateDirectory(baseDirectory);
            try
            {
                var file = files.Files[0]; // åªå¤„理第一个文件
                string fileName = file.FileName; // ç›´æŽ¥ä½¿ç”¨å‰ç«¯çš„æ–‡ä»¶å
                string fullFilePath = Path.Combine(baseDirectory, fileName);
                // 2. ä¿å­˜æ–‡ä»¶ï¼ˆå¦‚果存在,则覆盖)
                using (var stream = new FileStream(fullFilePath, FileMode.Create))
                {
                    file.CopyTo(stream);
                }
                // 3. è¿”回文件名
                return new WebResponseContent { Status = true, Message = "文件上传成功", Data = fileName };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "上传文件失败:" + ex.Message };
            }
        }
        /// <summary>
        /// æ›´æ–°å¯†ç 
        /// </summary>
        /// <param name="id"></param>
        /// <param name="oldPwd"></param>
        /// <param name="newPwd"></param>
        /// <returns></returns>
        public WebResponseContent UpdatePwd(int id, string oldPwd, string newPwd)
        {
            WebResponseContent content = new WebResponseContent();
            oldPwd = oldPwd?.Trim();
            newPwd = newPwd?.Trim();
            try
            {
                if (string.IsNullOrEmpty(oldPwd)) return content.Error("旧密码不能为空");
                if (string.IsNullOrEmpty(newPwd)) return content.Error("新密码不能为空");
                if (newPwd.Length < 6) return content.Error("密码不能少于6位");
                // èŽ·å–ç”¨æˆ·å½“å‰å¯†ç 
                string userCurrentPwd = BaseDal.QueryFirst(x => x.User_Id == id, s => s.UserPwd) ?? "";
                if (string.IsNullOrEmpty(userCurrentPwd)) return content.Error("用户不存在或密码未设置");
                //// è¿›è¡Œå¯†ç åŠ å¯†å¯¹æ¯”
                //string _oldPwd = oldPwd.EncryptDES(AppSecret.User);
                //if (_oldPwd != userCurrentPwd) return content.Error("旧密码不正确");
                // ç”Ÿæˆæ–°å¯†ç åР坆值
                string _newPwd = newPwd.EncryptDES(AppSecret.User);
                if (userCurrentPwd == _newPwd) return content.Error("新密码不能与旧密码相同");
                // æ›´æ–°å¯†ç 
                bool isUpdated = BaseDal.UpdateData(new Sys_User
                {
                    User_Id = id,
                    UserPwd = _newPwd,
                    LastModifyPwdDate = DateTime.Now
                }, new List<string>
        {
            nameof(Sys_User.LastModifyPwdDate),
            nameof(Sys_User.UserPwd)
        });
                if (!isUpdated)
                {
                    return content.Error("密码修改失败,请稍后重试");
                }
                return content.OK("密码修改成功", id);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"修改密码异常: {ex.Message}");
                return content.Error($"服务器错误: {ex.Message}");
            }
        }
        public WebResponseContent Upuserbase(UserDTO userDTO)
        {
            try
            {
                var user = BaseDal.QueryData(x => x.User_Id == userDTO.id).FirstOrDefault();
                if (user == null)
                {
                    return new WebResponseContent { Status = false, Message = "没找到该用户" };
                }
                user.UserTrueName = userDTO.usertruename;
                user.PhoneNo = userDTO.phone;
                user.HeadImageUrl = userDTO.files;
                BaseDal.UpdateData(user); // ç¡®ä¿æ›´æ–°åˆ°æ•°æ®åº“
                return new WebResponseContent { Status = true, Data = user };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "失败:" + ex };
            }
        }
        /// <summary>
        /// æŸ¥çœ‹ç”¨æˆ·ä¿¡æ¯å’Œäººè„¸è¯†åˆ«è¡¨
        /// </summary>
        /// <param name="paginationDTO"></param>
        /// <returns></returns>
        public WebResponseContent GetUserFace(PaginationDTO paginationDTO)
        {
            try
            {
                int totalCount = 0;
                var sys = Db.Queryable<Sys_User>();
                var face = _faceRecognitionRepository.Db.Queryable<Dt_FaceRecognition>();
                if (face == null)
                {
                    return new WebResponseContent { Status = false, Message = "数据为空" };
                }
                var query = sys.LeftJoin<Dt_FaceRecognition>((a, b) => a.Log_id == b.GroupID);
                if (!string.IsNullOrEmpty(paginationDTO.searchKeyword))
                {
                    query = query.Where((a, b) =>
                        a.UserName.Contains(paginationDTO.searchKeyword) ||
                        a.UserTrueName.Contains(paginationDTO.searchKeyword) ||
                        a.PhoneNo.Contains(paginationDTO.searchKeyword) ||
                        a.RoleName.Contains(paginationDTO.searchKeyword) ||
                        a.Role_Id.ToString().Contains(paginationDTO.searchKeyword)
                    );
                }
                if (paginationDTO.startDate.HasValue && paginationDTO.endDate.HasValue)
                {
                    query = query.Where((a, b) => a.CreateDate >= paginationDTO.startDate && a.CreateDate <= paginationDTO.endDate);
                }
                var result = query.Select((a, b) => new
                {
                    a.Log_id,
                    a.User_Id,
                    a.UserName,
                    a.UserTrueName,
                    a.UserPwd,
                    a.PhoneNo,
                    a.Role_Id,
                    a.RoleName,
                    a.HeadImageUrl,
                    a.Enable,
                    a.CreateDate,
                    a.Face_token,
                    b.GroupID,
                }).ToPageList(paginationDTO.pageIndex, paginationDTO.pageSize, ref totalCount);
                return new WebResponseContent
                {
                    Status = true,
                    Data = new
                    {
                        TotalCount = totalCount,//总数
                        PageIndex = paginationDTO.pageIndex,//页数
                        PaseSize = paginationDTO.pageSize,//一页多少数据
                        Items = result//返回字段
                    }
                };
            }
            catch (Exception)
            {
                throw;
            }
        }
        /// <summary>
        /// æ·»åŠ ç”¨æˆ·
        /// </summary>
        /// <param name="addUserDTO"></param>
        /// <returns></returns>
        public WebResponseContent AdduserData(AddUserDTO addUserDTO)
        {
            try
            {
                if (addUserDTO == null)
                {
                    return new WebResponseContent { Status = false, Message = "请求数据为空,可能是 JSON è§£æžå¤±è´¥" };
                }
                var list = BaseDal.QueryData(a => a.UserName == addUserDTO.username).FirstOrDefault();
                if (list != null)
                {
                    return new WebResponseContent { Status = false, Message = "账号重复,请重新录入" };
                }
                var face = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault(); ;
                var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo
                {
                    ImgPath = addUserDTO.path,
                    user_id = addUserDTO.username,
                    group_id = face // è¿™é‡Œåº”该填百度人脸库分组
                   // group_id = baiduResult.result.log_id
                });
                // åˆ¤æ–­ç™¾åº¦è¿”回是否成功
                if (baiduResult == null || baiduResult.error_code != 0)
                {
                    return new WebResponseContent { Status = false, Data = "人脸注册失败:" + baiduResult.error_msg };
                }
                // åˆ›å»ºç”¨æˆ·æ•°æ®
                var sys = new Sys_User
                {
                    UserName = addUserDTO.username,
                    UserTrueName=addUserDTO.usertruename,
                    HeadImageUrl=addUserDTO.path,
                    Log_id = baiduResult.log_id,
                    Face_token = baiduResult.result.face_token,
                    PhoneNo = addUserDTO.phoneno,
                    Role_Id = addUserDTO.roleid,
                    RoleName = addUserDTO.rolename,
                    Enable = addUserDTO.enable,
                    UserPwd= "j79rYYvCz4vdhcboB1Ausg==",
                    CreateDate=DateTime.Now
                };
                BaseDal.AddData(sys);
                return new WebResponseContent { Status = true, Data = sys };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "失败" + ex };
            }
        }
        /// <summary>
        ///百度云 æ›´æ–°ç”¨æˆ·
        /// </summary>
        /// <param name="addUserDTO"></param>
        /// <returns></returns>
        public WebResponseContent UpuserData(AddUserDTO addUserDTO)
        {
            try
            {
                // 1. æŸ¥è¯¢ç”¨æˆ·
                var userList = BaseDal.QueryData();
                var sys = userList.FirstOrDefault(x => x.User_Id == addUserDTO.id);
                if (sys == null)
                {
                    return new WebResponseContent { Status = false, Message = "没找到该用户" };
                }
                // 2. æ£€æŸ¥è´¦å·æ˜¯å¦ä¿®æ”¹ï¼Œå¹¶åˆ¤æ–­æ˜¯å¦é‡å¤//StringComparison.OrdinalIgnoreCase:表示忽略大小写进行比较,比如 "admin" å’Œ "ADMIN" ä¹Ÿè®¤ä¸ºæ˜¯ç›¸ç­‰çš„
                if (!string.Equals(sys.UserName, addUserDTO.username))
                {
                    var existUser = userList.FirstOrDefault(a => a.UserName == addUserDTO.username);
                    if (existUser != null)
                    {
                        return new WebResponseContent { Status = false, Message = "账号重复,请重新录入" };
                    }
                    sys.UserName = addUserDTO.username; // ç¡®è®¤å¯ä»¥æ”¹æ—¶æ‰ä¿®æ”¹
                }
                // 3. æ›´æ–°å…¶ä»–用户信息
                sys.UserTrueName = addUserDTO.usertruename;
                sys.PhoneNo = addUserDTO.phoneno;
                sys.Role_Id = addUserDTO.roleid;
                sys.RoleName = addUserDTO.rolename;
                sys.Enable = addUserDTO.enable;
                // 4. æŸ¥è¯¢äººè„¸åº“分组 ID
                var faceGroupID = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault();
                // 5. åˆ¤æ–­æ˜¯å¦éœ€è¦æ›´æ–°äººè„¸ä¿¡æ¯Equals æ˜¯ .NET ä¸­ç”¨äºŽæ¯”较两个对象是否相等
                if (!string.Equals(sys.HeadImageUrl, addUserDTO.path)) // æœ‰æ–°å›¾ç‰‡æ‰å¤„理人脸注册=> å‰é¢çš„写法等于=if (sys.HeadImageUrl!=addUserDTO.path)
                {
                    var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo
                    {
                        ImgPath = addUserDTO.path,
                        user_id = sys.UserName,
                        group_id = faceGroupID
                    });
                    // 6. åˆ¤æ–­ç™¾åº¦ API æ˜¯å¦æˆåŠŸ
                    if (baiduResult == null || baiduResult.error_code != 0)
                    {
                        return new WebResponseContent { Status = false, Message = "人脸更新失败:" + baiduResult.error_msg };
                    }
                    // 7. æ›´æ–°äººè„¸ç›¸å…³å­—段
                    sys.Log_id = baiduResult.log_id;
                    sys.HeadImageUrl = addUserDTO.path;
                    sys.Face_token = baiduResult.result.face_token;
                }
                // 8. æ›´æ–°æ•°æ®åº“
                BaseDal.UpdateData(sys);
                return new WebResponseContent { Status = true, Data = sys };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "失败:" + ex.Message };
            }
        }
        /// <summary>
        /// åˆ é™¤
        /// </summary>
        /// <param name="deleteUserDTO"></param>
        /// <returns></returns>
        public WebResponseContent DeleteUserData(string account)
        {
            try
            {
                // 2. æŸ¥è¯¢äººè„¸åº“分组 ID
                var faceGroupID = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault();
                WIDESEAWCS_Common.DeleteUserImg deleteUserImg = new WIDESEAWCS_Common.DeleteUserImg();
                deleteUserImg.group_id = faceGroupID;
                deleteUserImg.user_id = account;
                string apiResult = BaiDuFaceHelper.DeleteUser(deleteUserImg);//只要给用户账号和用户组id
                // 2. è§£æžè¿”回结果,判断删除是否成功
                dynamic resultObj = JsonConvert.DeserializeObject(apiResult);
                if (resultObj.error_code == 0)
                {
                   // ç™¾åº¦åˆ é™¤æˆåŠŸåŽï¼Œåˆ é™¤æ•°æ®åº“ä¸­çš„ç”¨æˆ·
                    var user = BaseDal.QueryData(x=>x.UserName== account);
                    if (user != null)
                    {
                        BaseDal.DeleteData(user);
                    }
                    return WebResponseContent.Instance.OK("用户删除成功");
                }
                else
                {
                    return WebResponseContent.Instance.Error("百度 API åˆ é™¤å¤±è´¥ï¼š" + resultObj.error_msg);
                }
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("删除用户失败:" + ex.Message);
            }
        }
        public WebResponseContent SaveFaceFiles(IFormCollection files)
        {
            if (files == null || files.Files.Count == 0)
                return new WebResponseContent { Status = false, Message = "请上传文件" };
            // 1. ç¡®ä¿å­˜å‚¨ç›®å½•存在
            string baseDirectory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "UploadfaceImage");
            if (!Directory.Exists(baseDirectory))
                Directory.CreateDirectory(baseDirectory);
            try
            {
                var file = files.Files[0]; // åªå¤„理第一个文件
                string fileName = file.FileName; // ç›´æŽ¥ä½¿ç”¨å‰ç«¯çš„æ–‡ä»¶å
                string fullFilePath = Path.Combine(baseDirectory, fileName);
                // 2. ä¿å­˜æ–‡ä»¶ï¼ˆå¦‚果存在,则覆盖)
                using (var stream = new FileStream(fullFilePath, FileMode.Create))
                {
                    file.CopyTo(stream);
                }
                // 3. è¿”回文件名
                return new WebResponseContent { Status = true, Message = "文件上传成功", Data = fileName };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "上传文件失败:" + ex.Message };
            }
        }
        /// <summary>
        /// åˆ é™¤æ•°æ®åº“中没有使用的图片
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent CleanUnusedImages()
        {
            try
            {
                // èŽ·å–æ–‡ä»¶çš„å®Œæ•´è·¯å¾„
                string pathimage = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image");
                // å¦‚果文件夹不存在,返回错误信息
                if (!Directory.Exists(pathimage))
                {
                    return new WebResponseContent { Status = false, Message = "图片文件夹不存在" };
                }
                // **使用 HashSet æé«˜æŸ¥æ‰¾æ•ˆçއ**
                var userImageSet = BaseDal.QueryData(x => !string.IsNullOrEmpty(x.HeadImageUrl))
                                          .Select(x => x.HeadImageUrl)
                                          .ToHashSet(); // **提升查询速度**
                // èŽ·å–æ–‡ä»¶å¤¹ä¸­çš„æ‰€æœ‰å›¾ç‰‡æ–‡ä»¶ï¼ˆæ–‡ä»¶åï¼‰
                var imageFiles = Directory.GetFiles(pathimage)
                                          .Select(Path.GetFileName)
                                          .ToList();
                int deletedCount = 0;
                foreach (var file in imageFiles)
                {
                    // **HashSet æŸ¥è¯¢ O(1)**
                    if (!userImageSet.Contains(file))
                    {
                        string filePath = Path.Combine(pathimage, file);
                        try
                        {
                            File.Delete(filePath);
                            deletedCount++;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"无法删除文件 {file}: {ex.Message}");
                        }
                    }
                }
                return new WebResponseContent { Status = true, Message = $"清理完成,删除了 {deletedCount} å¼ æœªä½¿ç”¨çš„图片" };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = $"清理失败: {ex.Message}" };
            }
        }
        /// <summary>
        /// äººè„¸åˆ é™¤ï¼ˆåˆ é™¤ç”¨æˆ·çš„æŸä¸€å¼ äººè„¸ï¼Œå¦‚果该用户只有一张人脸图片,则同时删除用户。)
        /// </summary>
        /// <param name="addUserDTO"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent DeleteUserIsface(string account)
        {
            try
            {
                // 1. æŸ¥è¯¢äººè„¸åº“分组 ID
                var faceGroupID = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault();
                //2.查询要删那个用户的
                var user = BaseDal.QueryData(x => x.UserName == account).FirstOrDefault();
                if (user == null)
                {
                    return new WebResponseContent { Status = false, Message = "用户不存在,请检查账号是否输入正确" };
                }
                WIDESEAWCS_Common.DeleteUserImg deleteUserImg = new WIDESEAWCS_Common.DeleteUserImg();
                deleteUserImg.group_id = faceGroupID;
                deleteUserImg.user_id = account;
                deleteUserImg.face_token = user.Face_token;
                deleteUserImg.log_id=user.Log_id;
                string apiResult = BaiDuFaceHelper.DeleteUserImg(deleteUserImg);//给用户账号/用户组id/Face_token/Log_id
                // 2. è§£æžè¿”回结果,判断删除是否成功
                dynamic resultObj = JsonConvert.DeserializeObject(apiResult);
                if (resultObj.error_code == 0)
                {
                    if (user != null)
                    {
                        BaseDal.DeleteData(user);
                    }
                    return WebResponseContent.Instance.OK("删除成功");
                }
                else
                {
                    return WebResponseContent.Instance.Error("百度 API åˆ é™¤å¤±è´¥ï¼š" + resultObj.error_msg);
                }
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("删除用户失败:" + ex.Message);
            }
        }
    }
}