using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Threading.Tasks; using JiepeiWMS.AuthHelper.OverWrite; using JiepeiWMS.Common.Config; using JiepeiWMS.Common.Helper; using JiepeiWMS.Common.HttpContextUser; using JiepeiWMS.Filter; using JiepeiWMS.IRepository.UnitOfWork; using JiepeiWMS.IServices; using JiepeiWMS.Model; using JiepeiWMS.Model.Models; using JiepeiWMS.Model.ViewModels; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace JiepeiWMS.Controllers { /// /// 用户管理 /// [Route("api/[controller]/[action]")] [ApiController] [Authorize(Permissions.Name)] public class UserController : ControllerBase { private readonly IUnitOfWork _unitOfWork; readonly ISysUserInfoServices _sysUserInfoServices; readonly IUserRoleServices _userRoleServices; readonly IRoleServices _roleServices; private readonly IUser _user; private readonly ILogger _logger; private readonly IDepartmentServices _departmentServices; private readonly IUserSysOrgServices _BllUserSysOrg; private readonly ISysOrgServices _BllSysOrg; /// /// 构造函数 /// public UserController(IUnitOfWork unitOfWork, ISysUserInfoServices sysUserInfoServices, IUserRoleServices userRoleServices, IRoleServices roleServices, IUser user, ILogger logger, IDepartmentServices departmentServices, IUserSysOrgServices BllUserSysOrg, ISysOrgServices BllSysOrg) { _unitOfWork = unitOfWork; _sysUserInfoServices = sysUserInfoServices; _userRoleServices = userRoleServices; _roleServices = roleServices; _user = user; _logger = logger; _departmentServices = departmentServices; _BllUserSysOrg = BllUserSysOrg; _BllSysOrg = BllSysOrg; } /// /// 获取全部用户 /// /// /// /// // GET: api/User [HttpGet] public async Task>> Get(int page = 1, string key = "") { if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) { key = ""; } int intPageSize = 20; var data = await _sysUserInfoServices.QueryPage(a => a.uStatus >= 0 && ((a.uLoginName != null && a.uLoginName.Contains(key.Trim())) || (a.uRealName != null && a.uRealName.Contains(key.Trim())) || (a.JobNo != null && a.JobNo.Contains(key.Trim())) ), page, intPageSize, " uID desc "); #region MyRegion // 这里可以封装到多表查询,此处简单处理 var allUserRoles = await _userRoleServices.Query(d => d.IsDeleted == false); var allRoles = await _roleServices.Query(d => d.IsDeleted == false); var allSysOrgIds = await _BllUserSysOrg.Query(); var sysUserInfos = data.data; foreach (var item in sysUserInfos) { var currentUserRoles = allUserRoles.Where(d => d.UserId == item.uID).Select(d => d.RoleId).ToList(); item.RIDs = currentUserRoles; item.RoleNames = allRoles.Where(d => currentUserRoles.Contains(d.Id)).Select(d => d.Name).ToList(); item.SysOrgIds = allSysOrgIds.Where(t => t.UserId == item.uID).Select(t => t.SysOrgId).ToList(); if (item.DepartmentId > 0) { var departmentModel = await _departmentServices.QueryById(item.DepartmentId); if (departmentModel != null) item.DepartMentName = departmentModel.Name; } item.uLoginPWD = ""; } data.data = sysUserInfos; #endregion return new MessageModel>() { msg = "获取成功", success = data.dataCount >= 0, response = data }; } // GET: api/User/5 [HttpGet("{id}")] [AllowAnonymous] public string Get(string id) { _logger.LogError("test wrong"); return "value"; } // GET: api/User/5 /// /// 获取用户详情根据token /// 【无权限】 /// /// 令牌 /// [HttpGet] [AllowAnonymous] public async Task> GetInfoByToken(string token) { var data = new MessageModel(); if (!string.IsNullOrEmpty(token)) { var tokenModel = JwtHelper.SerializeJwt(token); if (tokenModel != null && tokenModel.Uid > 0) { var userinfo = await _sysUserInfoServices.QueryById(tokenModel.Uid); if (userinfo != null) { data.response = userinfo; data.success = true; data.msg = "获取成功"; } } } return data; } /// /// 添加一个用户 /// /// /// // POST: api/User [HttpPost] public async Task> Post([FromBody] sysUserInfo sysUserInfo) { var data = new MessageModel(); var userInfoModel = await _sysUserInfoServices.GetModel(x => x.JobNo == sysUserInfo.JobNo); if (userInfoModel != null) { data.msg = "已有相同工号"; return data; } if (sysUserInfo!=null&&string.IsNullOrEmpty(sysUserInfo.Mobile)) { sysUserInfo.Mobile = "15000000000"; } sysUserInfo.uLoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.uLoginPWD); var id = await _sysUserInfoServices.Add(sysUserInfo); //更新主体关系 if (sysUserInfo.SysOrgIds.Count > 0) { var vals = new List(); foreach (var SysOrgId in sysUserInfo.SysOrgIds) { vals.Add(new { UserId = sysUserInfo.uID, SysOrgId = SysOrgId }); } _BllUserSysOrg.UpdateJoinInfo( "UserSysOrg", new List { "UserId", "SysOrgId" }, vals, new List { "UserId" }, new List { new { UserId = sysUserInfo.uID } } ); } data.success = id > 0; if (data.success) { data.response = id.ObjToString(); data.msg = "添加成功"; } return data; } /// /// 更新用户与角色 /// /// /// // PUT: api/User/5 [HttpPut] public async Task> Put([FromBody] sysUserInfo sysUserInfo) { // 这里使用事务处理 var data = new MessageModel(); try { _unitOfWork.BeginTran(); var userInfoModel = await _sysUserInfoServices.GetModel(x => x.JobNo == sysUserInfo.JobNo && x.uID != sysUserInfo.uID); if (userInfoModel != null) { data.msg = "工号已存在"; return data; } if (sysUserInfo != null && string.IsNullOrEmpty(sysUserInfo.Mobile)) { sysUserInfo.Mobile = "15000000000"; } if (sysUserInfo != null && sysUserInfo.uID > 0) { if (sysUserInfo.RIDs.Count > 0) { // 无论 Update Or Add , 先删除当前用户的全部 U_R 关系 var usreroles = (await _userRoleServices.Query(d => d.UserId == sysUserInfo.uID)).Select(d => d.Id.ToString()).ToArray(); if (usreroles.Count() > 0) { var isAllDeleted = await _userRoleServices.DeleteByIds(usreroles); } // 然后再执行添加操作 var userRolsAdd = new List(); sysUserInfo.RIDs.ForEach(rid => { userRolsAdd.Add(new UserRole(sysUserInfo.uID, rid)); }); await _userRoleServices.Add(userRolsAdd); } //更新主体关系 if (sysUserInfo.SysOrgIds.Count > 0) { var vals = new List(); foreach (var SysOrgId in sysUserInfo.SysOrgIds) { vals.Add(new { UserId = sysUserInfo.uID, SysOrgId = SysOrgId }); } _BllUserSysOrg.UpdateJoinInfo( "UserSysOrg", new List { "UserId", "SysOrgId" }, vals, new List { "UserId" }, new List { new { UserId = sysUserInfo.uID } } ); sysUserInfo.SysOrgId = sysUserInfo.SysOrgIds.FirstOrDefault(); } var olduser = await _sysUserInfoServices.QueryById(sysUserInfo.uID); if (!string.IsNullOrEmpty(sysUserInfo.uLoginPWD)) { sysUserInfo.uLoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.uLoginPWD); } else { sysUserInfo.uLoginPWD = olduser.uLoginPWD; } data.success = await _sysUserInfoServices.Update(sysUserInfo); _unitOfWork.CommitTran(); if (data.success) { data.msg = "更新成功"; data.response = sysUserInfo?.uID.ObjToString(); } } } catch (Exception e) { _unitOfWork.RollbackTran(); _logger.LogError(e, e.Message); } return data; } /// /// 修改密码 /// /// /// // PUT: api/User/5 [HttpPut] public async Task> PutPwd([FromBody] sysUserInfo sysUserInfo) { var data = new MessageModel(); try { var userInfoModel = await _sysUserInfoServices.GetModel(x => x.uID == _user.ID); if (userInfoModel != null) { if (userInfoModel.uLoginPWD != MD5Helper.MD5Encrypt32(sysUserInfo.uLoginPWD)) { data.msg = "旧密码输入不正确请重新输入,若忘记旧密码请联系管理员修改!"; return data; throw new Exception("旧密码输入不正确请重新输入,若忘记旧密码请联系管理员修改!"); } userInfoModel.uLoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.uLoginPWDNew); userInfoModel.uRealName = sysUserInfo.uRealName; userInfoModel.uRemark = sysUserInfo.uRemark; data.success = await _sysUserInfoServices.Update(userInfoModel); if (data.success) { data.msg = "更新成功"; data.response = userInfoModel?.uID.ObjToString(); } } } catch (Exception ex) { _logger.LogError(ex, ex.Message); } return data; } /// /// 删除用户 /// /// /// // DELETE: api/ApiWithActions/5 [HttpDelete] public async Task> Delete(int id) { var data = new MessageModel(); if (id > 0) { var userDetail = await _sysUserInfoServices.QueryById(id); userDetail.tdIsDelete = true; data.success = await _sysUserInfoServices.Update(userDetail); if (data.success) { data.msg = "删除成功"; data.response = userDetail?.uID.ObjToString(); } } return data; } /// /// 导入用户表格 /// [HttpPost] [AllowAnonymous] public async Task> ImportUserInfo([FromForm] IFormCollection files) { var data = new MessageModel(); var importUserInfoModel = new ImportUserInfoViewModels(); var importUserInfoList = new List(); try { //创建事务 _unitOfWork.BeginTran(); var path = Directory.GetCurrentDirectory(); var fileFolder = Path.Combine(path, "ImportFile"); if (!Directory.Exists(fileFolder)) Directory.CreateDirectory(fileFolder); FormFileCollection fileCollection = (FormFileCollection)files.Files; foreach (var file in fileCollection) { var fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + Path.GetExtension(file.FileName); var filePath = Path.Combine(fileFolder, fileName); using (var stream = new FileStream(filePath, FileMode.Create)) { file.CopyTo(stream); } var dtExcel = ExcelHelper.ImportExcel(filePath); foreach (DataRow myRow in dtExcel.Rows) { if (string.IsNullOrWhiteSpace(myRow[0].ToString())) continue; if (string.IsNullOrWhiteSpace(myRow[1].ToString())) continue; if (string.IsNullOrWhiteSpace(myRow[2].ToString())) continue; if (string.IsNullOrWhiteSpace(myRow[3].ToString())) continue; importUserInfoModel = new ImportUserInfoViewModels() { JobNo = myRow[0].ToString(), OrgName = myRow[1].ToString(), DepartmentName = myRow[2].ToString(), Name = myRow[3].ToString(), }; importUserInfoList.Add(importUserInfoModel); } foreach (var item in importUserInfoList) { var now = DateTime.Now; var departmentModel = await _departmentServices.GetModel(x => x.Name == item.DepartmentName); var sysOrgModel = await _BllSysOrg.GetShortName(item.OrgName); var Account = PinYinHelper.ConvertToAllSpell(item.Name); //匹配名称和用户名 var productListModel = await _sysUserInfoServices.GetModel(x => x.uLoginName == Account && x.uRealName == item.Name); if (productListModel != null) { //更新用户表 productListModel.JobNo = item.JobNo; productListModel.DepartmentId = departmentModel == null ? 0 : departmentModel.Id; await _sysUserInfoServices.Update(productListModel); var vals = new List(); vals.Add(new { UserId = productListModel.uID, SysOrgId = sysOrgModel == null ? 0 : sysOrgModel.Id }); _BllUserSysOrg.UpdateJoinInfo( "UserSysOrg", new List { "UserId", "SysOrgId" }, vals, new List { "UserId" }, new List { new { UserId = productListModel.uID } } ); } else { //添加用户表 var sysUserInfo = new sysUserInfo { uLoginName = Account, uLoginPWD = MD5Helper.MD5Encrypt32("123456"), uRealName = item.Name, uStatus = 0, uCreateTime = now, uUpdateTime = now, uLastErrTime = now, uErrorCount = 0, name = item.Name, sex = 1, age = 0, birth = now, tdIsDelete = false, JobNo = item.JobNo, DepartmentId = departmentModel == null ? 0 : departmentModel.Id, SysOrgId = sysOrgModel == null ? 0 : sysOrgModel.Id }; var result = await _sysUserInfoServices.Add(sysUserInfo); if (result > 0) { var vals = new List(); vals.Add(new { UserId = result, SysOrgId = sysOrgModel == null ? 0 : sysOrgModel.Id }); _BllUserSysOrg.UpdateJoinInfo( "UserSysOrg", new List { "UserId", "SysOrgId" }, vals, new List { "UserId" }, new List { new { UserId = result } } ); //添加用户角色关联表 var roleModel = await _roleServices.GetModel(x => x.Name == RoleConfig.SaleProductionStaff); if (roleModel != null) { // 无论 Update Or Add , 先删除当前用户的全部 U_R 关系 var usreroles = (await _userRoleServices.Query(d => d.UserId == result)).Select(d => d.Id.ToString()).ToArray(); if (usreroles.Count() > 0) { var isAllDeleted = await _userRoleServices.DeleteByIds(usreroles); } // 然后再执行添加操作 await _sysUserInfoServices.InitializePermission(Account, sysOrgModel == null ? 0 : sysOrgModel.Id, RoleConfig.SaleProductionStaff); } } } } } _unitOfWork.CommitTran(); data.response = 1.ObjToString(); data.msg = "导入用户成功"; data.success = true; return data; } catch (Exception ex) { _unitOfWork.RollbackTran(); data.msg = ex.Message; data.response = 0.ObjToString(); data.status = 500; return data; } } /// /// 绑定用户 /// /// 用户名 /// 工号 /// 性别 /// 主体ID /// 手机号 /// [HttpGet, AllowAnonymous, AuthKeySecret] public async Task> BindingUser(string realName, string jobNo, int sex, int orgId) { var msg = string.Empty; if (string.IsNullOrWhiteSpace(realName)) { msg = "realName必须设置值"; goto ErrorResult; } if (string.IsNullOrWhiteSpace(jobNo)) { msg = "jobNo必须设置值"; goto ErrorResult; } if (sex < 0 || sex > 2) { msg = "sex值是0女或1男"; goto ErrorResult; } if (orgId <= 0) { msg = "orgId必须设置值"; goto ErrorResult; } //if (string.IsNullOrWhiteSpace(mobile)) //{ // msg = "Mobile必须设置值"; // goto ErrorResult; //} var result = await _sysUserInfoServices.BindingUser(realName, jobNo, sex, orgId); msg = result.Item1; if (!string.IsNullOrEmpty(msg)) { goto ErrorResult; } return new MessageModel() { msg = "绑定用户成功", success = true, response = result.Item2.ObjToString() }; ErrorResult: return new MessageModel() { msg = msg, success = false }; } /// /// 初始化菜单 /// /// 用户名 /// 主体ID /// 角色名称 /// [HttpGet, AllowAnonymous] public async Task> InitializePermission(string realName, int orgId, string roleName) { var msg = string.Empty; if (string.IsNullOrWhiteSpace(realName)) { msg = "realName必须设置值"; goto ErrorResult; } if (orgId <= 0) { msg = "orgId必须设置值"; goto ErrorResult; } if (string.IsNullOrWhiteSpace(roleName)) { msg = "roleName必须设置值"; goto ErrorResult; } var result = await _sysUserInfoServices.InitializePermission(realName, orgId, roleName); msg = result.Item1; if (!string.IsNullOrEmpty(msg)) { goto ErrorResult; } return new MessageModel() { msg = "初始化菜单成功", success = true, response = result.Item2.ObjToString() }; ErrorResult: return new MessageModel() { msg = msg, success = false }; } } }