using DapperORMCore.Context.DataContext; using DapperORMCore.Context.Extend; using DapperORMCore.Model.BaseModel; using DapperORMCore.Model.CoreModel; using DapperORMCore.String.Consts; using DapperORMCore.String.Enums; using NXWMS.IService.NXWMS; using NXWMS.Model.AppModels.Condition; using System; using System.Collections.Generic; using System.Text; using WestDistance.DapperORM.Repository.Repositorys; using DapperORMCore.Context; using NXWMS.Code; using System.Linq; using System.Security.Claims; using System.IdentityModel.Tokens.Jwt; using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Logging; using Microsoft.Extensions.Configuration; using NXWMS.String.Enums; using System.Data; using NXWMS.Code.Converter; using NXWMS.DataAccess.Entity; using DapperORMCore.Repository.IRepositorys; using DapperORMCore.Dapper.BaseModel; using NXWMS.IService.NXWMS.SysSettings; using NXWMS.Model.AppModels.Result.SysSettings; using NXWMS.Model.AppModels.Condition.SysSettings; using NXWMS.Model.Common; namespace NXWMS.Service.NXWMS.SysSettings { /// /// 用户接口 /// [AutoInject(typeof(IUserService), InjectType.Scope)] public class UserService : ServiceBase, IUserService { /// /// 系统操作仓储中转 /// private IDataRepositoryContext _dataContext; /// /// SQL节点仓储 /// private ISQLNodeRepository _iSQLNodeRepository; /// /// 配置 /// private IConfiguration _configuration; /// /// 主键服务 /// private ISequenceService _sequenceService; public UserService(IDataRepositoryContext dataRepositoryContext, IConfiguration configuration, ISequenceService sequenceService, ISQLNodeRepository iSQLNodeRepository) { this._dataContext = dataRepositoryContext; this._configuration = configuration; this._iSQLNodeRepository = iSQLNodeRepository; this._sequenceService = sequenceService; } public OperateResultInfo> GetList(UserSearchCondition info) { var sqlAndBuilder = new StringBuilder(); var sqlOrBuilder = new StringBuilder(); var sql = $@"SELECT GenderName = CASE WHEN Gender=0 THEN '男' ELSE '女' END, CreateName = (SELECT USER_NAME FROM SYS_USER A WHERE A.USER_ID=CREATE_BY), UpdateName = (SELECT USER_NAME FROM SYS_USER B WHERE B.USER_ID=UPDATE_BY), UsedFlagName = {_iSQLNodeRepository.GetEnumIntCaseString("USED_FLAG")}, {info.ItemSQL} FROM SYS_USER WHERE 1=1 AND DEL_FLAG = 0 "; sqlAndBuilder = info.UserId != null ? info.UserId > 0 ? sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_ID", info.UserId, DBOperationString._Equal)) : sqlAndBuilder : sqlAndBuilder; sqlAndBuilder = info.IsUsed == null ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USED_FLAG", info.IsUsed, DBOperationString._Equal)); sqlAndBuilder = string.IsNullOrWhiteSpace(info.Address) ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("ADDRESS", info.Address, DBOperationString._ContainIn)); sqlAndBuilder = string.IsNullOrWhiteSpace(info.Email) ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("EMAIL", info.Email, DBOperationString._ContainIn)); sqlAndBuilder = info.Gender == null ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("GENDER", info.Gender, DBOperationString._ContainIn)); sqlAndBuilder = string.IsNullOrWhiteSpace(info.IphoneNumber) ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("PHONE_NUMBER", info.IphoneNumber, DBOperationString._ContainIn)); sqlAndBuilder = string.IsNullOrWhiteSpace(info.JobTitle) ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("JOB_TITLE", info.JobTitle, DBOperationString._ContainIn)); sqlOrBuilder = string.IsNullOrWhiteSpace(info.UserInfo) ? sqlOrBuilder : sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("USER_CODE", info.UserInfo, DBOperationString._ContainIn)); sqlOrBuilder = string.IsNullOrWhiteSpace(info.UserInfo) ? sqlOrBuilder : sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("USER_NAME", info.UserInfo, DBOperationString._ContainIn)); sqlOrBuilder = string.IsNullOrWhiteSpace(info.UserInfo) ? sqlOrBuilder : sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("NICK_NAME", info.UserInfo, DBOperationString._ContainIn)); sql = sql + (sqlAndBuilder.Length > 0 ? _iSQLNodeRepository.GetAndString(sqlAndBuilder, false) : ""); sql = sql + (sqlOrBuilder.Length > 0 ? _iSQLNodeRepository.GetOrString(sqlOrBuilder, false) : ""); IEnumerable result; IEnumerable totalResult; totalResult = new DataRepository(_dataContext).Query(sql); if (info.PageIndex == 0 || info.PageSize == 0) { result = totalResult.ToList(); } else { result = new DataRepository(_dataContext).QueryPage(sql, "CREATE_TIME", info.PageSize, info.PageIndex, true); } return SuccessStatus(new PageQueryResultInfo { RowData = result, PageConditionInfo = info, TotalCount = totalResult.Count(), TotalPageCount = (int)Math.Ceiling((double)totalResult.Count() / info.PageSize) }); } public OperateResultInfo Deleted(UserCondition info) { var sqlAndBuilder = new StringBuilder(); sqlAndBuilder = info.UserId != null ? info.UserId > 0 ? sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_ID", info.UserId, DBOperationString._Equal)) : sqlAndBuilder : sqlAndBuilder; sqlAndBuilder = string.IsNullOrWhiteSpace(info.UserCode) ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_CODE", info.UserCode, DBOperationString._Equal)); sqlAndBuilder = string.IsNullOrWhiteSpace(info.UserIds) ? sqlAndBuilder : sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_ID", info.UserIds, DBOperationString._In)); if (sqlAndBuilder.Length == 0) { return FailMessageStatus("参数错误!"); } var now = DateTime.Now; var sql = $@"UPDATE SYS_USER SET DEL_FLAG=1,UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}' WHERE 1=1 {sqlAndBuilder}"; var affectedRows = new DataRepository(_dataContext).Execute(sql); return GetStatus(affectedRows, info.UserIds.Split(',').Length); } public OperateResultInfo Remove(UserCondition info) { var whereList = GetFieldKeyList(info); var result = new DataRepository(_dataContext).Query(whereList).FirstOrDefault(); if (result != null) { var affectedRows = 0; if (info.UserId != null) { affectedRows = new DataRepository(_dataContext).Remove("USER_ID", info.UserId.ToString()); } if (!string.IsNullOrWhiteSpace(info.UserCode)) { affectedRows = new DataRepository(_dataContext).Remove("USER_CODE", info.UserCode); } return GetStatus(affectedRows); } return FailMessageStatus("未查找到数据!"); } public OperateResultInfo Add(UserCondition info) { if (info == null) { return CustomStatus(OperateStatus.ParameterError); } //接口中特定错误状态不加了,,既然要简单. if (new DataRepository(_dataContext).Query().Where(m => m.USER_CODE == info.UserCode && m.DEL_FLAG == 0 && m.USED_FLAG == 1).Any()) { return FailMessageStatus("用户编码已经存在,请输入其它编码!"); } var now = DateTime.Now; var entity = new SYS_USER(); entity.USER_CODE = info.UserCode; entity.USER_NAME = info.UserName; entity.PASSWORD = info.Password; entity.NICK_NAME = info.NickName; entity.JOB_TITLE = info.JobTitle; entity.PHONE_NUMBER = info.PhoneNumber; entity.ADDRESS = info.Address; entity.EMAIL = info.Email; entity.GENDER = info.Gender; entity.ROLE_CODE = info.RoleCode; entity.CREATE_BY = info.OperationUserId; entity.CREATE_TIME = now; entity.UPDATE_BY = info.OperationUserId; entity.UPDATE_TIME = now; entity.PASSWORD = _configuration["default:user_password"]; var affectedRows = new DataRepository(_dataContext).Add(entity, new string[1] { "USER_ID" }); return GetStatus(affectedRows); } public OperateResultInfo Edit(UserCondition info) { if (info.UserId == null && string.IsNullOrWhiteSpace(info.UserCode)) { return FailMessageStatus("参数错误!"); } var whereList = new List() .AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserId, EnumCSharpPropertyType.STRING, DBOperationString._Equal, info.UserId != null) .AddFieldKeyInfo(nameof(SYS_USER.USER_CODE), info.UserCode, EnumCSharpPropertyType.STRING, DBOperationString._In, !string.IsNullOrWhiteSpace(info.UserCode)); var result = new DataRepository(_dataContext).Query(whereList).FirstOrDefault(); if (result != null) { var now = DateTime.Now; result.NICK_NAME = info.NickName; result.USER_NAME = info.UserName; result.PASSWORD = info.Password; result.JOB_TITLE = info.JobTitle; result.GENDER = info.Gender; result.ADDRESS = info.Address; result.USED_FLAG = Convert.ToInt32(info.IsUsed); result.USER_ID = result.USER_ID; result.ROLE_CODE = info.RoleCode; result.UPDATE_BY = info.OperationUserId; result.UPDATE_TIME = now; var affectedRows = new DataRepository(_dataContext).Update(result, "USER_ID", "NEWID"); return GetStatus(affectedRows); } return FailMessageStatus("未查找到数据!"); } public OperateResultInfo Login(UserLoginCondition info) { if (info == null) { return FailStatus(new UserLoginResult()); } var whereList = new List().AddFieldKeyInfo(nameof(SYS_USER.USER_CODE), info.AccountNumber, EnumCSharpPropertyType.STRING, DBOperationString._Equal); var result = new DataRepository(_dataContext).Query(whereList).FirstOrDefault(); if (result == null) { return FailStatus(new UserLoginResult { LoginStatus = EnumLoginStatus.AccountFail }); } if (result.DEL_FLAG == 1) { return FailStatus(new UserLoginResult { LoginStatus = EnumLoginStatus.AccountDeleted }); } if (result.USED_FLAG == 0) { return FailStatus(new UserLoginResult { LoginStatus = EnumLoginStatus.AccountDisable }); } if (result.PASSWORD.ToLower() != info.Password.ToLower()) { return FailStatus(new UserLoginResult { LoginStatus = EnumLoginStatus.PasswordFail }); } SYS_ROLE ruleInfo = new SYS_ROLE(); if (!string.IsNullOrWhiteSpace(result.ROLE_CODE)) { ruleInfo = new DataRepository(_dataContext).Query("ROLE_CODE", result.ROLE_CODE).FirstOrDefault(); } DateTime expiredTime; if (info.SysType != EnumSysType.PDA) { expiredTime = DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["secure_config:expired_minute"])); } else { expiredTime = DateTime.Now.AddYears(1); } var claims = new[] { new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") , new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(expiredTime).ToUnixTimeSeconds()}"), new Claim(JwtRegisteredClaimNames.Sub,info.AccountNumber), }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["secure_config:secure_key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var jwtSecurityToken = new JwtSecurityToken( issuer: _configuration["secure_config:Issuer"], audience: _configuration["secure_config:audience"], claims: claims, expires: expiredTime, signingCredentials: creds); return SuccessStatus(new UserLoginResult { WMSAllowLoginFlag = Convert.ToBoolean(ruleInfo.WMS_ALLOW_LOGIN_FLAG), PDAAllowLoginFlag = Convert.ToBoolean(ruleInfo.PDA_ALLOW_LOGIN_FLAG), WCSAllowLoginFlag = Convert.ToBoolean(ruleInfo.WCS_ALLOW_LOGIN_FLAG), LoginStatus = EnumLoginStatus.Success, UserInfo = new UserInfoResult { NickName = result.NICK_NAME, UserCode = result.USER_CODE, UserId = result.USER_ID, UserName = result.USER_NAME }, //TODO 没有做, TokenResult = new TokenResult { Ticket = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken), OverdueTime = jwtSecurityToken.ValidTo } }); ; ; } /// /// 修改密码 /// /// /// public OperateResultInfo UpdatePS(UserCondition info) { if (info == null) { return FailMessageStatus("参数错误!"); } if (info.UserId == null || info.Password.Length != 32) { return FailMessageStatus("参数错误!"); } var whereList = new List().AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserId, EnumCSharpPropertyType.INT, DBOperationString._Equal); var result = new DataRepository(_dataContext).Query(whereList).FirstOrDefault(); if (result == null) { return FailMessageStatus("参数错误!"); } var now = DateTime.Now; var entity = new SYS_USER { PASSWORD = info.Password, UPDATE_BY = info.OperationUserId, UPDATE_TIME = now, USER_ID = info.UserId.Value, }; new DataRepository(_dataContext).Update(entity, "USER_ID", "NEWID"); return SuccessStatus(); } #region Private /// /// 条件统一下,用统一筛选 /// /// /// private List GetFieldKeyList(UserCondition info) { var whereList = new List(); if (info.UserId != null) { if (info.UserId > 0) { whereList = whereList.AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserId, EnumCSharpPropertyType.STRING, DBOperationString._Equal); } } if (!string.IsNullOrWhiteSpace(info.UserIds)) { whereList = whereList.AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserIds, EnumCSharpPropertyType.STRING, DBOperationString._In); } if (!string.IsNullOrWhiteSpace(info.UserCode)) { whereList = whereList.AddFieldKeyInfo(nameof(SYS_USER.USER_CODE), info.UserCode, EnumCSharpPropertyType.STRING, DBOperationString._Equal); } return whereList; } #endregion } }