diff --git a/ds-wms-service/DS.Module.Core/Extensions/Extensions.cs b/ds-wms-service/DS.Module.Core/Extensions/Extensions.cs index 21a43ec7..894c5286 100644 --- a/ds-wms-service/DS.Module.Core/Extensions/Extensions.cs +++ b/ds-wms-service/DS.Module.Core/Extensions/Extensions.cs @@ -158,6 +158,23 @@ public static partial class Extensions return reval; } + /// + /// + /// + /// + /// + public static long ObjToLong(this object thisValue) + { + long reval = 0; + if (thisValue == null) return 0; + if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + + return reval; + } + /// /// /// diff --git a/ds-wms-service/DS.Module.Core/Filters/ApiUserFilter.cs b/ds-wms-service/DS.Module.Core/Filters/ApiUserFilter.cs index a664f443..522ee333 100644 --- a/ds-wms-service/DS.Module.Core/Filters/ApiUserFilter.cs +++ b/ds-wms-service/DS.Module.Core/Filters/ApiUserFilter.cs @@ -57,17 +57,31 @@ namespace DS.Module.Core.Filters if (user != null && tenant != null) { - ClaimsIdentity identity = new ClaimsIdentity("AuthenticationTypes.Federation"); - identity.AddClaims(new List + // 认证方式1:生成Token赋值到httpContext.Headers["Authorization"] + var tokenModel = new JwtHelper.JwtTokenModel { - new Claim(JwtRegisteredClaimNames.Jti, user.Id.ToString()), - new Claim("UserName", user.UserName), - new Claim("TenantId", user.TenantId.ToString()), - new Claim("TenantName", tenant.Name), - new Claim("OrgId", user.DefaultOrgId.ToString()), - }); - ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(identity); - httpContext.User = claimsPrincipal; + Uid = user!.Id.ToString(), + Name = user.UserName, + OrgId = user.DefaultOrgId.ToString(), + TenantId = user.TenantId.ToString(), + TenantName = tenant!.Name, + }; + var token = JwtHelper.Encrypt(tokenModel, false, true); + + httpContext!.Request.Headers["Authorization"] = "Bearer " + token; + + // 认证方式2:生成ClaimsIdentity赋值到httpContext.User + //ClaimsIdentity identity = new ClaimsIdentity("AuthenticationTypes.Federation"); + //identity.AddClaims(new List + //{ + // new Claim(JwtRegisteredClaimNames.Jti, user.Id.ToString()), + // new Claim("UserName", user.UserName), + // new Claim("TenantId", user.TenantId.ToString()), + // new Claim("TenantName", tenant.Name), + // new Claim("OrgId", user.DefaultOrgId.ToString()), + //}); + //ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(identity); + //httpContext.User = claimsPrincipal; return next(); } } diff --git a/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs b/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs index c3a1be1e..a684bb0c 100644 --- a/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs +++ b/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs @@ -56,7 +56,7 @@ namespace DS.Module.SqlSugar { var orgId = ((dynamic)entityInfo.EntityValue).OrgId; if (orgId == null || orgId == 0) - entityInfo.SetValue(user.GetOrgId()); + entityInfo.SetValue(user.OrgId); } if (entityInfo.PropertyName == "CreateBy") diff --git a/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs b/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs index 34265a63..1035c738 100644 --- a/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs +++ b/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs @@ -85,8 +85,8 @@ public static class SqlsugarInstall // } // }); //} - var httpContextAccessor = services.GetService(); - var user = services.GetService(); + //var httpContextAccessor = services.GetService(); + //var user = services.GetService(); //if (user.IsNullOrEmpty()) //{ // user = new AspNetUser(httpContextAccessor) @@ -110,7 +110,7 @@ public static class SqlsugarInstall var dbProvider = db.GetConnectionScope((string)c.ConfigId); - // var user = services.GetService(); + var user = services.GetService(); //单例参数配置,所有上下文生效 dbProvider.Ado.CommandTimeOut = 30; dbProvider.Aop.OnLogExecuting = (sql, pars) => @@ -189,7 +189,7 @@ public static class SqlsugarInstall { var orgId = ((dynamic)entityInfo.EntityValue).OrgId; if (orgId == null || orgId == 0) - entityInfo.SetValue(user.GetOrgId()); + entityInfo.SetValue(user.OrgId); } if (entityInfo.PropertyName == "CreateBy") @@ -273,7 +273,7 @@ public static class SqlsugarInstall }; //全局过滤租户 - dbProvider.QueryFilter.AddTableFilter(m => m.TenantId == user.GetTenantId()); + dbProvider.QueryFilter.AddTableFilter(m => m.TenantId == long.Parse(user.TenantId)); //全局过滤机构Id dbProvider.QueryFilter.AddTableFilter(m => m.OrgId == user.OrgId); //全局软删除过滤 diff --git a/ds-wms-service/DS.Module.UserModule/AspNetUser.cs b/ds-wms-service/DS.Module.UserModule/AspNetUser.cs index 52d73534..7df89035 100644 --- a/ds-wms-service/DS.Module.UserModule/AspNetUser.cs +++ b/ds-wms-service/DS.Module.UserModule/AspNetUser.cs @@ -1,7 +1,5 @@ -using DS.Module.Core; -using DS.Module.Core.Extensions; +using DS.Module.Core.Extensions; using Microsoft.AspNetCore.Http; -using Newtonsoft.Json; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; @@ -16,439 +14,67 @@ public class AspNetUser : IUser _accessor = accessor; } - public UserInfo UserInfo => GetUserInfo(); + public string UserId => GetClaimValueByType("jti") ?? "90001"; + public string UserName => GetClaimValueByType("UserName") ?? "IUser获取UserName意外为空"; + public string TenantId => GetClaimValueByType("TenantId") ?? "90002"; + public string TenantName => GetClaimValueByType("TenantName") ?? "IUser获取TenantName意外为空"; + public long OrgId => GetClaimValueByType("OrgId")?.ObjToLong() ?? 90003; - //public string GetToken() - //{ - // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); - //} - //public string UserId => GetClaimValueByType("jti").FirstOrDefault().ObjToString(); - private string _userId; - public string UserId + + public string? GetClaimValueByType(string claimType) { - get - { - if (_userId == null) - { - var claimValue = GetClaimValueByType("jti").FirstOrDefault(); - _userId = claimValue != null ? claimValue.ObjToString() : GetUserId().ToString(); - } - return _userId; - } - set - { - _userId = value; - } + return Claims.Where(x => x.Type == claimType).Select(x => x.Value).FirstOrDefault(); } - private string _userName; - public string UserName + private List? _claims; + public List Claims { get { - if (_userName == null) + if (_claims == null || _claims.Count == 0) { - var claimValue = GetClaimValueByType("UserName").FirstOrDefault(); - _userName = claimValue != null ? claimValue.ObjToString() : "管理员"; + _claims = GetClaimsIdentity().ToList(); } - return _userName; - } - set - { - _userName = value; + return _claims; } } - private string _tenantName; - public string TenantName - { - get - { - if (_tenantName == null) - { - var claimValue = GetClaimValueByType("TenantName").FirstOrDefault(); - _tenantName = claimValue != null ? claimValue.ObjToString() : "系统租户"; - } - return _tenantName; - } - set - { - _tenantName = value; - } - } - public long GetTenantId() - { - var token = GetToken(); - if (string.IsNullOrEmpty(token)) - { - return 2; - } - - var jwtHandler = new JwtSecurityTokenHandler(); - if (!jwtHandler.CanReadToken(token)) - { - return 3; - } - JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - var tenantIdClaim = jwtToken.Claims.FirstOrDefault(x => x.Type == "TenantId"); - - return tenantIdClaim != null ? Convert.ToInt64(tenantIdClaim.Value) : 4; - } - - //public long GetTenantId() - //{ - // // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); - // var tenantId = String.Empty; - // var token = _accessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() - // ?? _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() - // ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() - // ?? _accessor.HttpContext?.Request.Cookies["Token"]; - // // token校验 - // var jwtHandler = new JwtSecurityTokenHandler(); - // if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) - // { - // JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - - // tenantId = jwtToken.Claims.First(x => x.Type == "TenantId").Value; - // } - - // return Convert.ToInt64(tenantId); - //} - - public long GetOrgId() + IEnumerable GetClaimsIdentity() { - //if (_orgId == 0) - //{ - // var claimValue = GetClaimValueByType("OrgId").FirstOrDefault(); - // _orgId = claimValue != null ? long.Parse(claimValue) : 0; - //} - //return _orgId; - + if (_accessor.HttpContext == null) return ArraySegment.Empty; + var token = GetToken(); - if (string.IsNullOrEmpty(token)) - { - return 5; - } - - var jwtHandler = new JwtSecurityTokenHandler(); - if (!jwtHandler.CanReadToken(token)) - { - return 6; - } - - JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - var orgIdClaim = jwtToken.Claims.FirstOrDefault(x => x.Type == "OrgId"); - - return orgIdClaim != null ? Convert.ToInt64(orgIdClaim.Value) : 7; - } - - public long GetUserId() - { - var token = GetToken(); - if (string.IsNullOrEmpty(token)) - { - return 8; - } - - var jwtHandler = new JwtSecurityTokenHandler(); - if (!jwtHandler.CanReadToken(token)) - { - return 9; - } - - JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - var userIdClaim = jwtToken.Claims.FirstOrDefault(x => x.Type == "jti"); - - return userIdClaim != null ? Convert.ToInt64(userIdClaim.Value) : 10; - } - - //public long GetOrgId() - //{ - // // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); - // var orgId = String.Empty; - // var token = _accessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() - // ?? _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() - // ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() - // ?? _accessor.HttpContext?.Request.Cookies["Token"]; - // // token校验 - // var jwtHandler = new JwtSecurityTokenHandler(); - // if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) - // { - // JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - - // orgId = jwtToken.Claims.First(x => x.Type == "OrgId").Value; - // } - // return Convert.ToInt64(orgId); - //} - - //public string GetCompanyId() - //{ - // // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); - // var companyId = String.Empty; - // var token = _accessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() - // ?? _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() - // ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() - // ?? _accessor.HttpContext?.Request.Cookies["Token"]; - // // token校验 - // var jwtHandler = new JwtSecurityTokenHandler(); - // if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) - // { - // JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - - // companyId = jwtToken.Claims.First(x => x.Type == "OrgId").Value; - // } - // return companyId; - //} - - public string GetCompanyId() - { - var token = GetToken(); - if (string.IsNullOrEmpty(token)) - { - return string.Empty; - } var jwtHandler = new JwtSecurityTokenHandler(); - if (!jwtHandler.CanReadToken(token)) - { - return string.Empty; - } - - JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - var companyIdClaim = jwtToken.Claims.FirstOrDefault(x => x.Type == "OrgId"); - - return companyIdClaim?.Value ?? "0000000001"; - } - - //public string TenantId => GetClaimValueByType("TenantId").FirstOrDefault().ObjToString(); - private string _tenantId; - - public string TenantId - { - get + if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token)) { - if (_tenantId == null) - { - var tenantIdClaim = GetClaimValueByType("TenantId").FirstOrDefault(); - _tenantId = tenantIdClaim != null ? tenantIdClaim.ObjToString() : GetTenantId().ToString(); - } - return _tenantId; + JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); + return jwtToken.Claims; } - set + else { - _tenantId = value; + return ArraySegment.Empty; } } - - // public string CompanyId => GetClaimValueByType("CompanyId").FirstOrDefault().ObjToString(); - private string _companyId; - - public string CompanyId + public bool IsAuthenticated() { - get - { - if (_companyId == null) - { - var companyIdClaim = GetClaimValueByType("CompanyId").FirstOrDefault(); - _companyId = companyIdClaim != null ? companyIdClaim.ObjToString() : "东胜软件"; - } - return _companyId; - } - set - { - _companyId = value; - } + return _accessor.HttpContext?.User?.Identity?.IsAuthenticated ?? false; } - - // public string OrgId => GetClaimValueByType("OrgId").FirstOrDefault().ObjToString(); - private long _orgId; - - public long OrgId - { - get - { - if (_orgId == 0) - { - var orgIdClaim = GetClaimValueByType("OrgId").FirstOrDefault(); - _orgId = orgIdClaim != null ? long.Parse(orgIdClaim) : GetOrgId(); - } - return _orgId; - } - set - { - _orgId = value; - } - } - - public UserInfo GetUserInfo() - { - var user = _accessor.HttpContext?.User; - if (user == null || !user.Claims.Any()) - { - return null; - // return GetDefaultUserInfo(); - } - - var token = GetToken(); - if (string.IsNullOrEmpty(token)) - { - return null; - // return GetDefaultUserInfo(); - } - - var jwtHandler = new JwtSecurityTokenHandler(); - if (!jwtHandler.CanReadToken(token)) - { - return null; - // return GetDefaultUserInfo(); - } - - JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - var userInfoJson = jwtToken.Claims.First().Value; - var userInfo = JsonConvert.DeserializeObject(userInfoJson); - - return userInfo ?? null; - } - public string GetToken() { - if (_accessor == null || _accessor.HttpContext == null) - { - return "东胜软件"; - } - - var request = _accessor.HttpContext.Request; - - var authorizationHeader = request.Headers["Authorization"].FirstOrDefault(); - if (!string.IsNullOrEmpty(authorizationHeader)) - { - return authorizationHeader.Split(" ").Last(); - } - - return request.Headers["X-Token"].FirstOrDefault() - ?? request.Query["Token"].FirstOrDefault() - ?? request.Cookies["Token"] - ?? "东胜软件"; - } - - #region 优化前 - - //public string GetToken() - //{ - // var headers = _accessor.HttpContext?.Request?.Headers; - // if (headers != null && headers.ContainsKey("Authorization")) - // { - // return headers["Authorization"].ToString().Replace("Bearer ", ""); - // } - // return null; - //} - //public UserInfo GetUserInfo() - //{ - // if (_accessor.HttpContext.User.Claims == null) - // { - // return new UserInfo() - // { - // CompanyId = "1", - // CompanyName = "初始化", - // Token = "初始化", - // UserCode = "初始化", - // UserId = "00000000", - // UserName = "初始化", - // }; - // } - - // //var json = _accessor.HttpContext.User.Claims; - // //获取上传token,可自定义扩展 - // var httphedad = _accessor.HttpContext.Request; - // var token = httphedad.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() - // ?? httphedad.Headers["X-Token"].FirstOrDefault() - // ?? httphedad.Query["Token"].FirstOrDefault() - // ?? httphedad.Cookies["Token"]; - // // token校验 - // var jwtHandler = new JwtSecurityTokenHandler(); - // var userInfo = new UserInfo(); - // if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) - // { - // JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); - // var UserId = jwtToken.Claims.First().Value; - // // userInfo = db.Queryable() - // // .Where(a => - // // a.Deleted == false && a.Id == user.Id) - // // .Select(a => new UserInfo - // // { - // // UserId = a.Id, UserCode = a.UserCode, UserName = a.NickName, - // // // OrgId = a.OrgId.ToString(), CompanyName = a.CustomerName - // // }).First(); - // // var t1 = JsonConvert.DeserializeObject(temp); - // userInfo = JsonConvert.DeserializeObject(jwtToken.Claims.First().Value); - // } - - // return userInfo; - //} - - //public IEnumerable GetClaimsIdentity() - //{ - // var claims = _accessor.HttpContext.User.Claims.ToList(); - // var headers = _accessor.HttpContext.Request.Headers; - // foreach (var header in headers) - // { - // claims.Add(new Claim(header.Key, header.Value)); - // } - // return claims; - //} - - #endregion 优化前 - - /// - /// 保持在请求上下文中的所有声明 不为空 - /// - /// - public IEnumerable GetClaimsIdentity() - { - var claims = new List(); - var user = _accessor.HttpContext?.User; - if (user != null) + var token = _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", ""); + if (!string.IsNullOrWhiteSpace(token)) { - claims.AddRange(user.Claims); + return token; } + return "IUser通过GetToken()获取Token意外为空"; - var headers = _accessor.HttpContext?.Request?.Headers; - if (headers != null) - { - foreach (var header in headers) - { - foreach (var value in header.Value) - { - if (!string.IsNullOrEmpty(value)) - { - claims.Add(new Claim(header.Key, value)); - } - } - } - } - - return claims; - } - - #region 键值对获取相应的内容 如果内容不存在则返回默认值 GetClaimValueByType - - /// - /// 键值对获取相应的内容 如果内容不存在则返回默认值 - /// - /// - /// - public List GetClaimValueByType(string ClaimType) - { - var claimsIdentity = GetClaimsIdentity(); - // if (claimsIdentity == null || !claimsIdentity.Any(item => item.Type == ClaimType)) - // { - // return new List { "jti", "TenantId", "CompanyId", "OrgId" }; // 返回包含默认参数的列表 - // } - - return claimsIdentity.Where(item => item.Type == ClaimType).Select(item => item.Value).ToList(); + //有需要再返回 + //return _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() + // ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() + // ?? _accessor.HttpContext?.Request.Cookies["Token"] + // ?? "东胜软件"; } - - #endregion 键值对获取相应的内容 如果内容不存在则返回默认值 GetClaimValueByType } \ No newline at end of file diff --git a/ds-wms-service/DS.Module.UserModule/IUser.cs b/ds-wms-service/DS.Module.UserModule/IUser.cs index 931cc274..fc97627f 100644 --- a/ds-wms-service/DS.Module.UserModule/IUser.cs +++ b/ds-wms-service/DS.Module.UserModule/IUser.cs @@ -1,5 +1,4 @@ -using DS.Module.Core; - + namespace DS.Module.UserModule; /// @@ -7,57 +6,41 @@ namespace DS.Module.UserModule; /// public interface IUser { - /// - /// 获取用户信息 - /// - UserInfo UserInfo { get; } - /// /// 获取用户ID /// string UserId { get; } - /// /// 获取用户名称 /// string UserName { get; } - /// - /// 获取公司ID - /// - string CompanyId { get; } /// /// 租户ID /// string TenantId { get; } - /// /// 租户名称 /// string TenantName { get; } + /// /// 机构ID /// long OrgId { get; } /// - /// 获取机构ID - /// - long GetOrgId(); - - /// - /// 获取公司ID + /// 返回Token /// - string GetCompanyId(); + string GetToken(); /// - /// 获取租户ID + /// 根据Claim类型返回Claim的值 /// - long GetTenantId(); - + string? GetClaimValueByType(string claimType); + /// - /// 获取Token + /// 返回当前用户是否已经过认证 /// - /// - string GetToken(); + bool IsAuthenticated(); } \ No newline at end of file diff --git a/ds-wms-service/DS.Module.UserModule/UserModuleInstall.cs b/ds-wms-service/DS.Module.UserModule/UserModuleInstall.cs index 1a7cb518..9ed07247 100644 --- a/ds-wms-service/DS.Module.UserModule/UserModuleInstall.cs +++ b/ds-wms-service/DS.Module.UserModule/UserModuleInstall.cs @@ -17,6 +17,7 @@ public static class UserModuleInstall if (services == null) throw new ArgumentNullException(nameof(services)); services.AddSingleton(); + //services.AddTransient(); services.AddScoped(); } } \ No newline at end of file diff --git a/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormCopyService.cs b/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormCopyService.cs index a183b957..a6271c2d 100644 --- a/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormCopyService.cs +++ b/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormCopyService.cs @@ -64,7 +64,7 @@ public class CodeFormCopyService : IFormCopyService if (req.Id == 0) { if (tenantDb.Queryable() - .Where(x => x.OrgId == user.GetOrgId() && x.PermissionId == req.PermissionId && x.CreateBy == long.Parse(user.UserId)).Any()) + .Where(x => x.OrgId == user.OrgId && x.PermissionId == req.PermissionId && x.CreateBy == long.Parse(user.UserId)).Any()) { return DataResult.Failed("表单复制字段设置已存在!", MultiLanguageConst.FormCopyExist); } diff --git a/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormSetService.cs b/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormSetService.cs index 87882597..f1df413a 100644 --- a/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormSetService.cs +++ b/ds-wms-service/DS.WMS.Core/Code/Method/CodeFormSetService.cs @@ -65,7 +65,7 @@ public class CodeFormSetService : IFormSetService if (req.Id == 0) { if (tenantDb.Queryable() - .Where(x => x.OrgId == user.GetOrgId() && x.PermissionId == req.PermissionId && x.FormNo == req.FormNo).Any()) + .Where(x => x.OrgId == user.OrgId && x.PermissionId == req.PermissionId && x.FormNo == req.FormNo).Any()) { return DataResult.Failed("表单设置已存在!", MultiLanguageConst.FormSetExist); } diff --git a/ds-wms-service/DS.WMS.Core/Code/Method/CodeQuerySetService.cs b/ds-wms-service/DS.WMS.Core/Code/Method/CodeQuerySetService.cs index f22e17f8..eba2ac4e 100644 --- a/ds-wms-service/DS.WMS.Core/Code/Method/CodeQuerySetService.cs +++ b/ds-wms-service/DS.WMS.Core/Code/Method/CodeQuerySetService.cs @@ -65,7 +65,7 @@ public class CodeQuerySetService : IQuerySetService if (req.Id == 0) { if (tenantDb.Queryable() - .Where(x => x.OrgId == user.GetOrgId() && x.PermissionId == req.PermissionId && x.TagNo == req.TagNo).Any()) + .Where(x => x.OrgId == user.OrgId && x.PermissionId == req.PermissionId && x.TagNo == req.TagNo).Any()) { return DataResult.Failed("查询条件设置已存在!", MultiLanguageConst.QuerySetExist); } diff --git a/ds-wms-service/DS.WMS.Core/Code/Method/CodeSequenceService.cs b/ds-wms-service/DS.WMS.Core/Code/Method/CodeSequenceService.cs index d83570fb..62ba96da 100644 --- a/ds-wms-service/DS.WMS.Core/Code/Method/CodeSequenceService.cs +++ b/ds-wms-service/DS.WMS.Core/Code/Method/CodeSequenceService.cs @@ -57,7 +57,7 @@ public class CodeSequenceService : ICodeSequenceService if (req.Id == 0) { - if (tenantDb.Queryable().Where(x => x.PermissionId == req.PermissionId && x.OrderNo == req.OrderNo).Any()) + if (tenantDb.Queryable().Where(x => x.PermissionId == req.PermissionId && x.SequenceName == req.SequenceName).Any()) { return DataResult.Failed("基础编码已存在!", MultiLanguageConst.SequenceExist); } diff --git a/ds-wms-service/DS.WMS.Core/Fee/Dtos/ReportContext.cs b/ds-wms-service/DS.WMS.Core/Fee/Dtos/ReportContext.cs new file mode 100644 index 00000000..68cecea5 --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Fee/Dtos/ReportContext.cs @@ -0,0 +1,48 @@ +using DS.Module.Core; +using DS.Module.UserModule; +using DS.WMS.Core.Op.Entity; +using SqlSugar; + +namespace DS.WMS.Core.Fee.Dtos +{ + /// + /// 报表生成上下文 + /// + public class ReportContext + { + /// + /// 服务提供程序 + /// + public IServiceProvider ServiceProvider { get; internal set; } + + /// + /// 获取主库访问对象 + /// + public ISqlSugarClient Db { get; internal set; } + + /// + /// 获取租户库访问对象 + /// + public ISqlSugarClient TenantDb { get; internal set; } + + /// + /// 请求用户 + /// + public IUser User { get; internal set; } + + /// + /// 操作结果,用于记录错误信息 + /// + public DataResult? ErrorResult { get; set; } + + /// + /// 业务类型 + /// + public BusinessType BusinessType { get; set; } = BusinessType.OceanShippingExport; + + /// + /// 业务ID + /// + public long[] Ids { get; set; } = []; + } +} diff --git a/ds-wms-service/DS.WMS.Core/Fee/Interface/IFeeRecordService.cs b/ds-wms-service/DS.WMS.Core/Fee/Interface/IFeeRecordService.cs index 0c3b8950..57b0dee0 100644 --- a/ds-wms-service/DS.WMS.Core/Fee/Interface/IFeeRecordService.cs +++ b/ds-wms-service/DS.WMS.Core/Fee/Interface/IFeeRecordService.cs @@ -96,12 +96,13 @@ public interface IFeeRecordService Task WriteBackStatusAsync(long businessId, BusinessType businessType); /// - /// 获取费用核算单打印信息 + /// 获取费用打印信息 /// + /// 数据提供程序 /// 业务类型 /// 费用记录ID /// - Task> GetPrintInfoAsync(BusinessType businessType, params long[] idArray); + Task> GetPrintInfoAsync(string providerName, BusinessType businessType, params long[] idArray); /// /// 设置发票启用状态 diff --git a/ds-wms-service/DS.WMS.Core/Fee/Interface/IReportProvider.cs b/ds-wms-service/DS.WMS.Core/Fee/Interface/IReportProvider.cs new file mode 100644 index 00000000..81f69d00 --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Fee/Interface/IReportProvider.cs @@ -0,0 +1,17 @@ +using DS.WMS.Core.Fee.Dtos; + +namespace DS.WMS.Core.Fee.Interface +{ + /// + /// 用于输出报表的数据提供程序 + /// + public interface IReportProvider + { + /// + /// 返回所需的JSON格式的数据 + /// + /// 报表输出上下文 + /// + Task GetDataAsync(ReportContext context); + } +} diff --git a/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs b/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs index e1cb5cb2..09e3a304 100644 --- a/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs +++ b/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs @@ -222,7 +222,7 @@ namespace DS.WMS.Core.Fee.Method item.Quantity = ctn == null ? 0 : ctn.CtnNum.GetValueOrDefault(); break; } - } + } //计算税费 item.SetTax(); @@ -927,110 +927,33 @@ namespace DS.WMS.Core.Fee.Method } /// - /// 获取费用核算单打印信息 + /// 获取费用打印信息 /// + /// /// 业务类型 /// 费用记录ID /// - public async Task> GetPrintInfoAsync(BusinessType businessType, params long[] idArray) - { - CostAccountingForm form = null; - switch (businessType) - { - case BusinessType.OceanShippingExport: - form = await GetOceanShippingExportAsync(idArray); - break; - case BusinessType.OceanShippingImport: - - break; - default: - return DataResult.Failed(string.Format( - MultiLanguageConst.BusinessNotSupported, businessType.GetDescription())); - } - - if (form != null) - { - long UserId = long.Parse(User.UserId); - form.Creator = Db.Queryable().Where(x => x.Id == UserId).Select(x => x.UserName).First(); - - form.ReceivableRMB = form.Details.FindAll(x => x.Type == FeeType.Receivable && x.Currency == FeeCurrency.RMB_CODE).Sum(x => x.Amount); - form.PayableRMB = form.Details.FindAll(x => x.Type == FeeType.Payable && x.Currency == FeeCurrency.RMB_CODE).Sum(x => x.Amount); - form.ReceivableUSD = form.Details.FindAll(x => x.Type == FeeType.Receivable && x.Currency == FeeCurrency.USD_CODE).Sum(x => x.Amount); - form.PayableUSD = form.Details.FindAll(x => x.Type == FeeType.Payable && x.Currency == FeeCurrency.USD_CODE).Sum(x => x.Amount); - form.ReceivableOther = form.Details.FindAll(x => x.Type == FeeType.Receivable && (x.Currency != FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE)).Sum(x => x.Amount); - form.PayableOther = form.Details.FindAll(x => x.Type == FeeType.Payable && (x.Currency == FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE)).Sum(x => x.Amount); - - //获取美元汇率 - var fees = new List { - new FeeRecord { Currency = FeeCurrency.USD_CODE, FeeType = FeeType.Receivable }, - new FeeRecord { Currency = FeeCurrency.USD_CODE, FeeType = FeeType.Payable } - }; - await FetchExchangeRateAsync(fees); - form.ExchangeRate = fees[0].ExchangeRate.HasValue ? fees[0].ExchangeRate.Value : 1; - form.TotalReceivable = Math.Round(form.ReceivableUSD * form.ExchangeRate, 4, MidpointRounding.ToEven) + form.ReceivableRMB + form.ReceivableOther; - form.TotalPayable = Math.Round(form.PayableUSD * form.ExchangeRate, 4, MidpointRounding.ToEven) + form.PayableRMB + form.PayableOther; - } - - return DataResult.Success(form); - } - - //获取海运出口打印数据 - async Task GetOceanShippingExportAsync(params long[] idArray) + public async Task> GetPrintInfoAsync(string providerName, BusinessType businessType, params long[] idArray) { - CostAccountingForm form = null; - var list = await TenantDb.Queryable().InnerJoin((x, y) => x.BusinessId == y.Id) - .Where((x, y) => idArray.Contains(x.Id) - //&& x.FeeStatus == FeeStatus.SettlementCompleted - ).Select((x, y) => new - { - x.FeeType, - x.FeeName, - x.Currency, - x.ExchangeRate, - x.Amount, - x.CustomerName, - y.CustomerNo, //业务编号 - y.AccountDate, //会计期间 - y.ETA, - y.ETD, - y.Voyno, - y.MBLNO, - y.Carrier, - y.LoadPort, - y.DischargePort, - y.CntrTotal, //Volume - y.IssueType //放单方式 - }).ToListAsync(); - - if (list.Count == 0) - return form; + Type type = Type.GetType(providerName, false); + if (type == null) + return DataResult.Failed("未能找到数据提供程序"); - var item = list[0]; - form = new CostAccountingForm + var provider = Fasterflect.ConstructorExtensions.CreateInstance(type) as IReportProvider; + var context = new ReportContext { - BusinessNo = item.CustomerNo, - AccountingPeriod = item.AccountDate, - ETA = item.ETA, - ETD = item.ETD, - Voy = item.Voyno, - MBLNo = item.MBLNO, - Carrier = item.Carrier, - POL = item.LoadPort, - POD = item.DischargePort, - Volume = item.CntrTotal, - ReleaseType = item.IssueType, - PrintTime = DateTime.Now, - Details = list.Select(x => new CostAccountingDetail - { - Amount = x.Amount, - Currency = x.Currency, - CustomerName = x.CustomerName, - FeeName = x.FeeName, - Type = x.FeeType - }).ToList() + BusinessType = businessType, + Ids = idArray, + Db = Db, + TenantDb = TenantDb, + User = User, + ServiceProvider = ServiceProvider }; + var data = provider.GetDataAsync(context); + if (context.ErrorResult == null) + return DataResult.Success(data); - return form; + return DataResult.Failed(context.ErrorResult.Message, context.ErrorResult.MultiCode); } /// diff --git a/ds-wms-service/DS.WMS.Core/Fee/Method/ReportProviders/CostAccountingReport.cs b/ds-wms-service/DS.WMS.Core/Fee/Method/ReportProviders/CostAccountingReport.cs new file mode 100644 index 00000000..da389dca --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Fee/Method/ReportProviders/CostAccountingReport.cs @@ -0,0 +1,123 @@ +using DS.Module.Core; +using DS.WMS.Core.Fee.Dtos; +using DS.WMS.Core.Fee.Entity; +using DS.WMS.Core.Fee.Interface; +using DS.WMS.Core.Op.Entity; +using DS.WMS.Core.Sys.Entity; +using Masuit.Tools.Systems; +using Microsoft.Extensions.DependencyInjection; +using SqlSugar; + +namespace DS.WMS.Core.Fee.Method.ReportProviders +{ + /// + /// 费用核算单 + /// + public class CostAccountingReport : IReportProvider + { + public async Task GetDataAsync(ReportContext context) + { + CostAccountingForm? form = null; + switch (context.BusinessType) + { + case BusinessType.OceanShippingExport: + form = await GetOceanShippingExportAsync(context.TenantDb, context.Ids); + break; + case BusinessType.OceanShippingImport: + + break; + default: + context.ErrorResult = DataResult.Failed(string.Format(MultiLanguageConst.GetDescription( + MultiLanguageConst.BusinessNotSupported), context.BusinessType.GetDescription())); + break; + } + + if (form != null) + { + long UserId = long.Parse(context.User.UserId); + form.Creator = context.Db.Queryable().Where(x => x.Id == UserId).Select(x => x.UserName).First(); + + form.ReceivableRMB = form.Details.FindAll(x => x.Type == FeeType.Receivable && x.Currency == FeeCurrency.RMB_CODE).Sum(x => x.Amount); + form.PayableRMB = form.Details.FindAll(x => x.Type == FeeType.Payable && x.Currency == FeeCurrency.RMB_CODE).Sum(x => x.Amount); + form.ReceivableUSD = form.Details.FindAll(x => x.Type == FeeType.Receivable && x.Currency == FeeCurrency.USD_CODE).Sum(x => x.Amount); + form.PayableUSD = form.Details.FindAll(x => x.Type == FeeType.Payable && x.Currency == FeeCurrency.USD_CODE).Sum(x => x.Amount); + form.ReceivableOther = form.Details.FindAll(x => x.Type == FeeType.Receivable && (x.Currency != FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE)).Sum(x => x.Amount); + form.PayableOther = form.Details.FindAll(x => x.Type == FeeType.Payable && (x.Currency == FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE)).Sum(x => x.Amount); + + //获取美元汇率 + var currencyService = context.ServiceProvider.GetRequiredService(); + var exchange = new ExchangeRate + { + CurrencyFrom = FeeCurrency.USD_CODE, + CurrencyTo = FeeCurrency.RMB_CODE + }; + exchange = (await currencyService.GetExchangeRateAsync(exchange))?.Data; + + form.ExchangeRate = exchange.Rate; + form.TotalReceivable = Math.Round(form.ReceivableUSD * form.ExchangeRate, 4, MidpointRounding.ToEven) + form.ReceivableRMB + form.ReceivableOther; + form.TotalPayable = Math.Round(form.PayableUSD * form.ExchangeRate, 4, MidpointRounding.ToEven) + form.PayableRMB + form.PayableOther; + } + + return form; + } + + //获取海运出口打印数据 + static async Task GetOceanShippingExportAsync(ISqlSugarClient tenantDb, params long[] idArray) + { + CostAccountingForm form = null; + var list = await tenantDb.Queryable().InnerJoin((x, y) => x.BusinessId == y.Id) + .Where((x, y) => idArray.Contains(x.Id) + //&& x.FeeStatus == FeeStatus.SettlementCompleted + ).Select((x, y) => new + { + x.FeeType, + x.FeeName, + x.Currency, + x.ExchangeRate, + x.Amount, + x.CustomerName, + y.CustomerNo, //业务编号 + y.AccountDate, //会计期间 + y.ETA, + y.ETD, + y.Voyno, + y.MBLNO, + y.Carrier, + y.LoadPort, + y.DischargePort, + y.CntrTotal, //Volume + y.IssueType //放单方式 + }).ToListAsync(); + + if (list.Count == 0) + return form; + + var item = list[0]; + form = new CostAccountingForm + { + BusinessNo = item.CustomerNo, + AccountingPeriod = item.AccountDate, + ETA = item.ETA, + ETD = item.ETD, + Voy = item.Voyno, + MBLNo = item.MBLNO, + Carrier = item.Carrier, + POL = item.LoadPort, + POD = item.DischargePort, + Volume = item.CntrTotal, + ReleaseType = item.IssueType, + PrintTime = DateTime.Now, + Details = list.Select(x => new CostAccountingDetail + { + Amount = x.Amount, + Currency = x.Currency, + CustomerName = x.CustomerName, + FeeName = x.FeeName, + Type = x.FeeType + }).ToList() + }; + + return form; + } + } +} diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs index c7757341..78dba382 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs @@ -463,7 +463,7 @@ namespace DS.WMS.Core.Op.Method.TaskInteraction { BusinessTask task = await GetQuery(request.BusinessId, request.BusinessType, request.TaskType).FirstAsync(); if (task == null) - return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData)); + return DataResult.FailedWithDesc(nameof(MultiLanguageConst.TaskNotExists)); if (task.TaskStatus == TaskStatusEnum.Complete) return DataResult.FailedWithDesc(nameof(MultiLanguageConst.TaskCompleted)); //if (task.TaskStatus == TaskStatusEnum.Cancel) @@ -869,16 +869,20 @@ namespace DS.WMS.Core.Op.Method.TaskInteraction if (callback.FlowStatus == FlowStatusEnum.Reject) { var task = await GetQuery(callback.BusinessId, callback.BusinessType, callback.AuditType.Value).FirstAsync(); - //创建驳回任务以进行通知 - await CreateTaskAsync(new TaskCreationRequest + var request = new TaskCreationRequest { BusinessId = callback.BusinessId, BusinessType = callback.BusinessType, TaskTypeName = GetRejectedType(callback.AuditType.Value).ToString(), RecvUserIdList = [task.CreateBy] //通知任务发起人 - }); + }; + //创建驳回任务以进行通知 + await CreateTaskAsync(request); + + //更新任务描述为驳回原因 + await SetTaskBaseDescription(callback.BusinessId, request.TaskType, callback.RejectReason); - remark += ";驳回理由:" + callback.RejectReason; + remark += ";驳回原因:" + callback.RejectReason; } long userId = long.Parse(User.UserId); diff --git a/ds-wms-service/DS.WMS.Core/Sys/Method/CommonService.cs b/ds-wms-service/DS.WMS.Core/Sys/Method/CommonService.cs index 6aeeee64..e1e52b0d 100644 --- a/ds-wms-service/DS.WMS.Core/Sys/Method/CommonService.cs +++ b/ds-wms-service/DS.WMS.Core/Sys/Method/CommonService.cs @@ -104,7 +104,7 @@ public class CommonService : ICommonService public DataResult GetUserInfo() { var userId = long.Parse(user.UserId); - var tenantId = user.GetTenantId(); + var tenantId = long.Parse(user.TenantId); var tokenModel = new JwtHelper.JwtTokenModel { Uid = user.UserId, @@ -292,7 +292,7 @@ public class CommonService : ICommonService } var userId = long.Parse(user.UserId); - var tenantId = user.GetTenantId(); + var tenantId = long.Parse(user.TenantId); var tokenModel = new JwtHelper.JwtTokenModel { @@ -507,7 +507,7 @@ public class CommonService : ICommonService public async Task> GetClientUserInfo() { var userId = long.Parse(user.UserId); - var tenantId = user.GetTenantId(); + var tenantId = long.Parse(user.TenantId); //取第一个机构 var orgRelations = await db.Queryable().Filter(null, true) .LeftJoin((a, b) => a.OrgId == b.Id) @@ -526,7 +526,7 @@ public class CommonService : ICommonService { Uid = user.UserId, Name = userInfo.UserName, - OrgId = user.GetOrgId().ToString(), + OrgId = user.OrgId.ToString(), TenantId = tenantId.ToString(), TenantName = tenant.Name }; @@ -544,7 +544,7 @@ public class CommonService : ICommonService // ClientId = a.ClientId, IsUseSystem = a.IsUseSystem, RefreshToken = refreshToken, - OrgId = user.GetOrgId().ToString(), + OrgId = user.OrgId.ToString(), Tel = a.Tel, Email = a.Email, Phone = a.Phone, @@ -575,7 +575,7 @@ public class CommonService : ICommonService public DataResult ChangeOrg(string id) { var userId = user.UserId; - var tenantId = user.GetTenantId(); + var tenantId = long.Parse(user.TenantId); var sysUser = db.Queryable().First(x => x.Id == long.Parse(userId)); if (sysUser.IsNull()) { @@ -614,7 +614,7 @@ public class CommonService : ICommonService public async Task>> GetClientUserPermissionByToken() { List list = new List(); - _logger.LogInformation("GetClientUserPermissionByToken临时日志:user.UserId={userId},user.TenantId={TenantId},user.GetTenantId={GetTenantId}", user.UserId, user.TenantId, user.GetTenantId()); + _logger.LogInformation("GetClientUserPermissionByToken临时日志:user.UserId={userId},user.TenantId={TenantId}", user.UserId, user.TenantId); var userId = long.Parse(user.UserId); diff --git a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs index 07de76ba..fb708220 100644 --- a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs +++ b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs @@ -260,14 +260,14 @@ namespace DS.WMS.Core.TaskPlat.Method logger.LogInformation("批次={no} 接收到创建任务报文 报文={msg}", batchNo, JsonConvert.SerializeObject(info)); SqlSugarScopeProvider tenantDb = saasDbService.GetBizDbScopeById(user.TenantId); - //var sql = tenantDb.Queryable().Where(x => x.Id > 232 ).ToSqlString(); - //var a = user.UserId; - //var aa = user.TenantId; - //var a343 = user.GetTenantId(); - //var sfdfd = user.TenantName; - //var b = user.GetOrgId(); - //var b232 = user.OrgId; + // 人员信息测试用 + //var a1 = user.UserId; + //var b1 = user.UserName; + //var c1 = user.TenantId; + //var d1 = user.TenantName; + //var e1 = user.OrgId; + //var sql = tenantDb.Queryable().Where(x => x.Id > 232).ToSqlString(); TaskBaseInfo taskInfo = null; @@ -3105,7 +3105,19 @@ namespace DS.WMS.Core.TaskPlat.Method /// public async Task TestTaskFlow(string taskType, long taskId, int testType) { + var tenantDb = saasDbService.GetBizDbScopeById(user.TenantId); + + + // 人员信息测试用 + var a1 = user.UserId; + var b1 = user.UserName; + var c1 = user.TenantId; + var d1 = user.TenantName; + var e1 = user.OrgId; + var sql = tenantDb.Queryable().Where(x => x.Id > 232).ToSqlString(); + + var t11 = tenantDb.ContextID; switch (testType) { diff --git a/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeRecordController.cs b/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeRecordController.cs index cdc86f1c..f73793fc 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeRecordController.cs +++ b/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeRecordController.cs @@ -3,6 +3,7 @@ using DS.Module.Core.Data; using DS.WMS.Core.Fee.Dtos; using DS.WMS.Core.Fee.Entity; using DS.WMS.Core.Fee.Interface; +using DS.WMS.Core.Fee.Method.ReportProviders; using DS.WMS.Core.Op.Entity; using Microsoft.AspNetCore.Mvc; @@ -204,12 +205,16 @@ namespace DS.WMS.FeeApi.Controllers /// 费用记录ID /// [HttpPost, Route("GetPrintInfo")] - public async Task> GetPrintInfoAsync(IdModel model) + public async Task> GetPrintInfoAsync(IdModel model) { if (model == null || model.Ids?.Length == 0) - return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); + return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); - return await _feeService.GetPrintInfoAsync((BusinessType)model.BusinessType.Value, model.Ids); + string providerName = model.Value?.ToString(); + if (string.IsNullOrEmpty(providerName)) + providerName = typeof(CostAccountingReport).AssemblyQualifiedName; + + return await _feeService.GetPrintInfoAsync(providerName, (BusinessType)model.BusinessType.Value, model.Ids); } ///