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
}
}