UserService.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. using DapperORMCore.Context.DataContext;
  2. using DapperORMCore.Context.Extend;
  3. using DapperORMCore.Model.BaseModel;
  4. using DapperORMCore.Model.CoreModel;
  5. using DapperORMCore.String.Consts;
  6. using DapperORMCore.String.Enums;
  7. using NXWMS.IService.NXWMS;
  8. using NXWMS.Model.AppModels.Condition;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Text;
  12. using WestDistance.DapperORM.Repository.Repositorys;
  13. using DapperORMCore.Context;
  14. using NXWMS.Code;
  15. using System.Linq;
  16. using System.Security.Claims;
  17. using System.IdentityModel.Tokens.Jwt;
  18. using Microsoft.IdentityModel.Tokens;
  19. using Microsoft.IdentityModel.Logging;
  20. using Microsoft.Extensions.Configuration;
  21. using NXWMS.String.Enums;
  22. using System.Data;
  23. using NXWMS.Code.Converter;
  24. using NXWMS.DataAccess.Entity;
  25. using DapperORMCore.Repository.IRepositorys;
  26. using DapperORMCore.Dapper.BaseModel;
  27. using NXWMS.IService.NXWMS.SysSettings;
  28. using NXWMS.Model.AppModels.Result.SysSettings;
  29. using NXWMS.Model.AppModels.Condition.SysSettings;
  30. using NXWMS.Model.Common;
  31. namespace NXWMS.Service.NXWMS.SysSettings
  32. {
  33. /// <summary>
  34. /// 用户接口
  35. /// </summary>
  36. [AutoInject(typeof(IUserService), InjectType.Scope)]
  37. public class UserService : ServiceBase, IUserService
  38. {
  39. /// <summary>
  40. /// 系统操作仓储中转
  41. /// </summary>
  42. private IDataRepositoryContext _dataContext;
  43. /// <summary>
  44. /// SQL节点仓储
  45. /// </summary>
  46. private ISQLNodeRepository _iSQLNodeRepository;
  47. /// <summary>
  48. /// 配置
  49. /// </summary>
  50. private IConfiguration _configuration;
  51. /// <summary>
  52. /// 主键服务
  53. /// </summary>
  54. private ISequenceService _sequenceService;
  55. public UserService(IDataRepositoryContext dataRepositoryContext, IConfiguration configuration, ISequenceService sequenceService, ISQLNodeRepository iSQLNodeRepository)
  56. {
  57. this._dataContext = dataRepositoryContext;
  58. this._configuration = configuration;
  59. this._iSQLNodeRepository = iSQLNodeRepository;
  60. this._sequenceService = sequenceService;
  61. }
  62. public OperateResultInfo<PageQueryResultInfo<UserResult>> GetList(UserSearchCondition info)
  63. {
  64. var sqlAndBuilder = new StringBuilder();
  65. var sqlOrBuilder = new StringBuilder();
  66. var sql = $@"SELECT
  67. GenderName = CASE WHEN Gender=0 THEN '男' ELSE '女' END,
  68. CreateName = (SELECT USER_NAME FROM SYS_USER A WHERE A.USER_ID=CREATE_BY),
  69. UpdateName = (SELECT USER_NAME FROM SYS_USER B WHERE B.USER_ID=UPDATE_BY),
  70. UsedFlagName = {_iSQLNodeRepository.GetEnumIntCaseString<UsedFlag>("USED_FLAG")},
  71. {info.ItemSQL} FROM SYS_USER WHERE 1=1 AND DEL_FLAG = 0 ";
  72. sqlAndBuilder = info.UserId != null ?
  73. info.UserId > 0 ?
  74. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_ID", info.UserId, DBOperationString._Equal)) :
  75. sqlAndBuilder : sqlAndBuilder;
  76. sqlAndBuilder = info.IsUsed == null ?
  77. sqlAndBuilder :
  78. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USED_FLAG", info.IsUsed, DBOperationString._Equal));
  79. sqlAndBuilder = string.IsNullOrWhiteSpace(info.Address) ?
  80. sqlAndBuilder :
  81. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("ADDRESS", info.Address, DBOperationString._ContainIn));
  82. sqlAndBuilder = string.IsNullOrWhiteSpace(info.Email) ?
  83. sqlAndBuilder :
  84. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("EMAIL", info.Email, DBOperationString._ContainIn));
  85. sqlAndBuilder = info.Gender == null ?
  86. sqlAndBuilder :
  87. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("GENDER", info.Gender, DBOperationString._ContainIn));
  88. sqlAndBuilder = string.IsNullOrWhiteSpace(info.IphoneNumber) ?
  89. sqlAndBuilder :
  90. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("PHONE_NUMBER", info.IphoneNumber, DBOperationString._ContainIn));
  91. sqlAndBuilder = string.IsNullOrWhiteSpace(info.JobTitle) ?
  92. sqlAndBuilder :
  93. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("JOB_TITLE", info.JobTitle, DBOperationString._ContainIn));
  94. sqlOrBuilder = string.IsNullOrWhiteSpace(info.UserInfo) ?
  95. sqlOrBuilder :
  96. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("USER_CODE", info.UserInfo, DBOperationString._ContainIn));
  97. sqlOrBuilder = string.IsNullOrWhiteSpace(info.UserInfo) ?
  98. sqlOrBuilder :
  99. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("USER_NAME", info.UserInfo, DBOperationString._ContainIn));
  100. sqlOrBuilder = string.IsNullOrWhiteSpace(info.UserInfo) ?
  101. sqlOrBuilder :
  102. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("NICK_NAME", info.UserInfo, DBOperationString._ContainIn));
  103. sql = sql + (sqlAndBuilder.Length > 0 ? _iSQLNodeRepository.GetAndString(sqlAndBuilder, false) : "");
  104. sql = sql + (sqlOrBuilder.Length > 0 ? _iSQLNodeRepository.GetOrString(sqlOrBuilder, false) : "");
  105. IEnumerable<UserResult> result;
  106. IEnumerable<UserResult> totalResult;
  107. totalResult = new DataRepository<UserResult>(_dataContext).Query(sql);
  108. if (info.PageIndex == 0 || info.PageSize == 0)
  109. {
  110. result = totalResult.ToList();
  111. }
  112. else
  113. {
  114. result = new DataRepository<UserResult>(_dataContext).QueryPage(sql,
  115. "CREATE_TIME", info.PageSize, info.PageIndex, true);
  116. }
  117. return SuccessStatus(new PageQueryResultInfo<UserResult>
  118. {
  119. RowData = result,
  120. PageConditionInfo = info,
  121. TotalCount = totalResult.Count(),
  122. TotalPageCount = (int)Math.Ceiling((double)totalResult.Count() / info.PageSize)
  123. });
  124. }
  125. public OperateResultInfo Deleted(UserCondition info)
  126. {
  127. var sqlAndBuilder = new StringBuilder();
  128. sqlAndBuilder = info.UserId != null ?
  129. info.UserId > 0 ?
  130. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_ID", info.UserId, DBOperationString._Equal)) :
  131. sqlAndBuilder : sqlAndBuilder;
  132. sqlAndBuilder = string.IsNullOrWhiteSpace(info.UserCode) ?
  133. sqlAndBuilder :
  134. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_CODE", info.UserCode, DBOperationString._Equal));
  135. sqlAndBuilder = string.IsNullOrWhiteSpace(info.UserIds) ?
  136. sqlAndBuilder :
  137. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("USER_ID", info.UserIds, DBOperationString._In));
  138. if (sqlAndBuilder.Length == 0)
  139. {
  140. return FailMessageStatus("参数错误!");
  141. }
  142. var now = DateTime.Now;
  143. var sql = $@"UPDATE SYS_USER SET DEL_FLAG=1,UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  144. WHERE 1=1 {sqlAndBuilder}";
  145. var affectedRows = new DataRepository<SYS_USER>(_dataContext).Execute(sql);
  146. return GetStatus(affectedRows, info.UserIds.Split(',').Length);
  147. }
  148. public OperateResultInfo Remove(UserCondition info)
  149. {
  150. var whereList = GetFieldKeyList(info);
  151. var result = new DataRepository<SYS_USER>(_dataContext).Query(whereList).FirstOrDefault();
  152. if (result != null)
  153. {
  154. var affectedRows = 0;
  155. if (info.UserId != null)
  156. {
  157. affectedRows = new DataRepository<SYS_USER>(_dataContext).Remove("USER_ID", info.UserId.ToString());
  158. }
  159. if (!string.IsNullOrWhiteSpace(info.UserCode))
  160. {
  161. affectedRows = new DataRepository<SYS_USER>(_dataContext).Remove("USER_CODE", info.UserCode);
  162. }
  163. return GetStatus(affectedRows);
  164. }
  165. return FailMessageStatus("未查找到数据!");
  166. }
  167. public OperateResultInfo Add(UserCondition info)
  168. {
  169. if (info == null)
  170. {
  171. return CustomStatus(OperateStatus.ParameterError);
  172. }
  173. //接口中特定错误状态不加了,,既然要简单.
  174. if (new DataRepository<SYS_USER>(_dataContext).Query().Where(m => m.USER_CODE == info.UserCode
  175. && m.DEL_FLAG == 0 && m.USED_FLAG == 1).Any())
  176. {
  177. return FailMessageStatus("用户编码已经存在,请输入其它编码!");
  178. }
  179. var now = DateTime.Now;
  180. var entity = new SYS_USER();
  181. entity.USER_CODE = info.UserCode;
  182. entity.USER_NAME = info.UserName;
  183. entity.PASSWORD = info.Password;
  184. entity.NICK_NAME = info.NickName;
  185. entity.JOB_TITLE = info.JobTitle;
  186. entity.PHONE_NUMBER = info.PhoneNumber;
  187. entity.ADDRESS = info.Address;
  188. entity.EMAIL = info.Email;
  189. entity.GENDER = info.Gender;
  190. entity.ROLE_CODE = info.RoleCode;
  191. entity.CREATE_BY = info.OperationUserId;
  192. entity.CREATE_TIME = now;
  193. entity.UPDATE_BY = info.OperationUserId;
  194. entity.UPDATE_TIME = now;
  195. entity.PASSWORD = _configuration["default:user_password"];
  196. var affectedRows = new DataRepository<SYS_USER>(_dataContext).Add(entity, new string[1] { "USER_ID" });
  197. return GetStatus(affectedRows);
  198. }
  199. public OperateResultInfo Edit(UserCondition info)
  200. {
  201. if (info.UserId == null && string.IsNullOrWhiteSpace(info.UserCode))
  202. {
  203. return FailMessageStatus("参数错误!");
  204. }
  205. var whereList = new List<FieldKeyInfo>()
  206. .AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserId, EnumCSharpPropertyType.STRING, DBOperationString._Equal,
  207. info.UserId != null)
  208. .AddFieldKeyInfo(nameof(SYS_USER.USER_CODE), info.UserCode, EnumCSharpPropertyType.STRING, DBOperationString._In,
  209. !string.IsNullOrWhiteSpace(info.UserCode));
  210. var result = new DataRepository<SYS_USER>(_dataContext).Query(whereList).FirstOrDefault();
  211. if (result != null)
  212. {
  213. var now = DateTime.Now;
  214. result.NICK_NAME = info.NickName;
  215. result.USER_NAME = info.UserName;
  216. result.PASSWORD = info.Password;
  217. result.JOB_TITLE = info.JobTitle;
  218. result.GENDER = info.Gender;
  219. result.ADDRESS = info.Address;
  220. result.USED_FLAG = Convert.ToInt32(info.IsUsed);
  221. result.USER_ID = result.USER_ID;
  222. result.ROLE_CODE = info.RoleCode;
  223. result.UPDATE_BY = info.OperationUserId;
  224. result.UPDATE_TIME = now;
  225. var affectedRows = new DataRepository<SYS_USER>(_dataContext).Update(result, "USER_ID", "NEWID");
  226. return GetStatus(affectedRows);
  227. }
  228. return FailMessageStatus("未查找到数据!");
  229. }
  230. public OperateResultInfo<UserLoginResult> Login(UserLoginCondition info)
  231. {
  232. if (info == null)
  233. {
  234. return FailStatus(new UserLoginResult());
  235. }
  236. var whereList = new List<FieldKeyInfo>().AddFieldKeyInfo(nameof(SYS_USER.USER_CODE), info.AccountNumber,
  237. EnumCSharpPropertyType.STRING, DBOperationString._Equal);
  238. var result = new DataRepository<SYS_USER>(_dataContext).Query(whereList).FirstOrDefault();
  239. if (result == null)
  240. {
  241. return FailStatus(new UserLoginResult
  242. {
  243. LoginStatus = EnumLoginStatus.AccountFail
  244. });
  245. }
  246. if (result.DEL_FLAG == 1)
  247. {
  248. return FailStatus(new UserLoginResult
  249. {
  250. LoginStatus = EnumLoginStatus.AccountDeleted
  251. });
  252. }
  253. if (result.USED_FLAG == 0)
  254. {
  255. return FailStatus(new UserLoginResult
  256. {
  257. LoginStatus = EnumLoginStatus.AccountDisable
  258. });
  259. }
  260. if (result.PASSWORD.ToLower() != info.Password.ToLower())
  261. {
  262. return FailStatus(new UserLoginResult
  263. {
  264. LoginStatus = EnumLoginStatus.PasswordFail
  265. });
  266. }
  267. SYS_ROLE ruleInfo = new SYS_ROLE();
  268. if (!string.IsNullOrWhiteSpace(result.ROLE_CODE))
  269. {
  270. ruleInfo = new DataRepository<SYS_ROLE>(_dataContext).Query("ROLE_CODE", result.ROLE_CODE).FirstOrDefault();
  271. }
  272. DateTime expiredTime;
  273. if (info.SysType != EnumSysType.PDA)
  274. {
  275. expiredTime = DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["secure_config:expired_minute"]));
  276. }
  277. else
  278. {
  279. expiredTime = DateTime.Now.AddYears(1);
  280. }
  281. var claims = new[]
  282. {
  283. new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
  284. new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(expiredTime).ToUnixTimeSeconds()}"),
  285. new Claim(JwtRegisteredClaimNames.Sub,info.AccountNumber),
  286. };
  287. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["secure_config:secure_key"]));
  288. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  289. var jwtSecurityToken = new JwtSecurityToken(
  290. issuer: _configuration["secure_config:Issuer"],
  291. audience: _configuration["secure_config:audience"],
  292. claims: claims,
  293. expires: expiredTime,
  294. signingCredentials: creds);
  295. return SuccessStatus(new UserLoginResult
  296. {
  297. WMSAllowLoginFlag = Convert.ToBoolean(ruleInfo.WMS_ALLOW_LOGIN_FLAG),
  298. PDAAllowLoginFlag = Convert.ToBoolean(ruleInfo.PDA_ALLOW_LOGIN_FLAG),
  299. WCSAllowLoginFlag = Convert.ToBoolean(ruleInfo.WCS_ALLOW_LOGIN_FLAG),
  300. LoginStatus = EnumLoginStatus.Success,
  301. UserInfo = new UserInfoResult
  302. {
  303. NickName = result.NICK_NAME,
  304. UserCode = result.USER_CODE,
  305. UserId = result.USER_ID,
  306. UserName = result.USER_NAME
  307. }, //TODO 没有做,
  308. TokenResult = new TokenResult
  309. {
  310. Ticket = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken),
  311. OverdueTime = jwtSecurityToken.ValidTo
  312. }
  313. }); ; ;
  314. }
  315. /// <summary>
  316. /// 修改密码
  317. /// </summary>
  318. /// <param name="info"></param>
  319. /// <returns></returns>
  320. public OperateResultInfo UpdatePS(UserCondition info)
  321. {
  322. if (info == null)
  323. {
  324. return FailMessageStatus("参数错误!");
  325. }
  326. if (info.UserId == null || info.Password.Length != 32)
  327. {
  328. return FailMessageStatus("参数错误!");
  329. }
  330. var whereList = new List<FieldKeyInfo>().AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserId,
  331. EnumCSharpPropertyType.INT, DBOperationString._Equal);
  332. var result = new DataRepository<SYS_USER>(_dataContext).Query(whereList).FirstOrDefault();
  333. if (result == null)
  334. {
  335. return FailMessageStatus("参数错误!");
  336. }
  337. var now = DateTime.Now;
  338. var entity = new SYS_USER
  339. {
  340. PASSWORD = info.Password,
  341. UPDATE_BY = info.OperationUserId,
  342. UPDATE_TIME = now,
  343. USER_ID = info.UserId.Value,
  344. };
  345. new DataRepository<SYS_USER>(_dataContext).Update(entity, "USER_ID", "NEWID");
  346. return SuccessStatus();
  347. }
  348. #region Private
  349. /// <summary>
  350. /// 条件统一下,用统一筛选
  351. /// </summary>
  352. /// <param name="userCondition"></param>
  353. /// <returns></returns>
  354. private List<FieldKeyInfo> GetFieldKeyList(UserCondition info)
  355. {
  356. var whereList = new List<FieldKeyInfo>();
  357. if (info.UserId != null)
  358. {
  359. if (info.UserId > 0)
  360. {
  361. whereList = whereList.AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserId,
  362. EnumCSharpPropertyType.STRING, DBOperationString._Equal);
  363. }
  364. }
  365. if (!string.IsNullOrWhiteSpace(info.UserIds))
  366. {
  367. whereList = whereList.AddFieldKeyInfo(nameof(SYS_USER.USER_ID), info.UserIds,
  368. EnumCSharpPropertyType.STRING, DBOperationString._In);
  369. }
  370. if (!string.IsNullOrWhiteSpace(info.UserCode))
  371. {
  372. whereList = whereList.AddFieldKeyInfo(nameof(SYS_USER.USER_CODE), info.UserCode,
  373. EnumCSharpPropertyType.STRING, DBOperationString._Equal);
  374. }
  375. return whereList;
  376. }
  377. #endregion
  378. }
  379. }