jianghaiqing 2 months ago
commit 102f618619

@ -158,6 +158,23 @@ public static partial class Extensions
return reval;
}
/// <summary>
///
/// </summary>
/// <param name="thisValue"></param>
/// <returns></returns>
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;
}
/// <summary>
///
/// </summary>

@ -57,17 +57,31 @@ namespace DS.Module.Core.Filters
if (user != null && tenant != null)
{
ClaimsIdentity identity = new ClaimsIdentity("AuthenticationTypes.Federation");
identity.AddClaims(new List<Claim>
// 认证方式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<Claim>
//{
// 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();
}
}

@ -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")

@ -85,8 +85,8 @@ public static class SqlsugarInstall
// }
// });
//}
var httpContextAccessor = services.GetService<IHttpContextAccessor>();
var user = services.GetService<IUser>();
//var httpContextAccessor = services.GetService<IHttpContextAccessor>();
//var user = services.GetService<IUser>();
//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<IUser>();
var user = services.GetService<IUser>();
//单例参数配置,所有上下文生效
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<ITenantId>(m => m.TenantId == user.GetTenantId());
dbProvider.QueryFilter.AddTableFilter<ITenantId>(m => m.TenantId == long.Parse(user.TenantId));
//全局过滤机构Id
dbProvider.QueryFilter.AddTableFilter<IOrgId>(m => m.OrgId == user.OrgId);
//全局软删除过滤

@ -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
{
get
{
if (_userId == null)
{
var claimValue = GetClaimValueByType("jti").FirstOrDefault();
_userId = claimValue != null ? claimValue.ObjToString() : GetUserId().ToString();
}
return _userId;
}
set
{
_userId = value;
}
}
private string _userName;
public string UserName
{
get
{
if (_userName == null)
{
var claimValue = GetClaimValueByType("UserName").FirstOrDefault();
_userName = claimValue != null ? claimValue.ObjToString() : "管理员";
}
return _userName;
}
set
{
_userName = value;
}
}
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))
public string? GetClaimValueByType(string claimType)
{
return 2;
return Claims.Where(x => x.Type == claimType).Select(x => x.Value).FirstOrDefault();
}
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()
{
//if (_orgId == 0)
//{
// var claimValue = GetClaimValueByType("OrgId").FirstOrDefault();
// _orgId = claimValue != null ? long.Parse(claimValue) : 0;
//}
//return _orgId;
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
private List<Claim>? _claims;
public List<Claim> Claims
{
get
{
if (_tenantId == null)
if (_claims == null || _claims.Count == 0)
{
var tenantIdClaim = GetClaimValueByType("TenantId").FirstOrDefault();
_tenantId = tenantIdClaim != null ? tenantIdClaim.ObjToString() : GetTenantId().ToString();
_claims = GetClaimsIdentity().ToList();
}
return _tenantId;
}
set
{
_tenantId = value;
}
}
// public string CompanyId => GetClaimValueByType("CompanyId").FirstOrDefault().ObjToString();
private string _companyId;
public string CompanyId
{
get
{
if (_companyId == null)
{
var companyIdClaim = GetClaimValueByType("CompanyId").FirstOrDefault();
_companyId = companyIdClaim != null ? companyIdClaim.ObjToString() : "东胜软件";
}
return _companyId;
}
set
{
_companyId = value;
}
}
// 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;
return _claims;
}
}
public UserInfo GetUserInfo()
IEnumerable<Claim> GetClaimsIdentity()
{
var user = _accessor.HttpContext?.User;
if (user == null || !user.Claims.Any())
{
return null;
// return GetDefaultUserInfo();
}
if (_accessor.HttpContext == null) return ArraySegment<Claim>.Empty;
var token = GetToken();
if (string.IsNullOrEmpty(token))
{
return null;
// return GetDefaultUserInfo();
}
var jwtHandler = new JwtSecurityTokenHandler();
if (!jwtHandler.CanReadToken(token))
if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token))
{
return null;
// return GetDefaultUserInfo();
}
JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token);
var userInfoJson = jwtToken.Claims.First().Value;
var userInfo = JsonConvert.DeserializeObject<UserInfo>(userInfoJson);
return userInfo ?? null;
return jwtToken.Claims;
}
public string GetToken()
{
if (_accessor == null || _accessor.HttpContext == null)
else
{
return "东胜软件";
return ArraySegment<Claim>.Empty;
}
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<SysUser>()
// // .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<UserInfo>(temp);
// userInfo = JsonConvert.DeserializeObject<UserInfo>(jwtToken.Claims.First().Value);
// }
// return userInfo;
//}
//public IEnumerable<Claim> 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 优化前
/// <summary>
/// 保持在请求上下文中的所有声明 不为空
/// </summary>
/// <returns></returns>
public IEnumerable<Claim> GetClaimsIdentity()
public bool IsAuthenticated()
{
var claims = new List<Claim>();
var user = _accessor.HttpContext?.User;
if (user != null)
{
claims.AddRange(user.Claims);
return _accessor.HttpContext?.User?.Identity?.IsAuthenticated ?? false;
}
var headers = _accessor.HttpContext?.Request?.Headers;
if (headers != null)
{
foreach (var header in headers)
{
foreach (var value in header.Value)
public string GetToken()
{
if (!string.IsNullOrEmpty(value))
var token = _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", "");
if (!string.IsNullOrWhiteSpace(token))
{
claims.Add(new Claim(header.Key, value));
}
return token;
}
}
}
return claims;
}
#region 键值对获取相应的内容 如果内容不存在则返回默认值 GetClaimValueByType
return "IUser通过GetToken()获取Token意外为空";
/// <summary>
/// 键值对获取相应的内容 如果内容不存在则返回默认值
/// </summary>
/// <param name="ClaimType"></param>
/// <returns></returns>
public List<string> GetClaimValueByType(string ClaimType)
{
var claimsIdentity = GetClaimsIdentity();
// if (claimsIdentity == null || !claimsIdentity.Any(item => item.Type == ClaimType))
// {
// return new List<string> { "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
}

@ -1,5 +1,4 @@
using DS.Module.Core;

namespace DS.Module.UserModule;
/// <summary>
@ -7,57 +6,41 @@ namespace DS.Module.UserModule;
/// </summary>
public interface IUser
{
/// <summary>
/// 获取用户信息
/// </summary>
UserInfo UserInfo { get; }
/// <summary>
/// 获取用户ID
/// </summary>
string UserId { get; }
/// <summary>
/// 获取用户名称
/// </summary>
string UserName { get; }
/// <summary>
/// 获取公司ID
/// </summary>
string CompanyId { get; }
/// <summary>
/// 租户ID
/// </summary>
string TenantId { get; }
/// <summary>
/// 租户名称
/// </summary>
string TenantName { get; }
/// <summary>
/// 机构ID
/// </summary>
long OrgId { get; }
/// <summary>
/// 获取机构ID
/// 返回Token
/// </summary>
long GetOrgId();
/// <summary>
/// 获取公司ID
/// </summary>
string GetCompanyId();
string GetToken();
/// <summary>
/// 获取租户ID
/// 根据Claim类型返回Claim的值
/// </summary>
long GetTenantId();
string? GetClaimValueByType(string claimType);
/// <summary>
/// 获取Token
/// 返回当前用户是否已经过认证
/// </summary>
/// <returns></returns>
string GetToken();
bool IsAuthenticated();
}

@ -17,6 +17,7 @@ public static class UserModuleInstall
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//services.AddTransient<IUser, AspNetUser>();
services.AddScoped<IUser, AspNetUser>();
}
}

@ -44,4 +44,12 @@ public interface IDataRuleTemplateService
/// <returns></returns>
Task<DataResult<List<CodeDataRuleTemplateRes>>> GetDataRuleTemplateSelectList(string id, string ruleType);
/// <summary>
/// 数据权限模板复制
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public Task<DataResult> BatchCopyDataRuleTemplate(IdModel req);
}

@ -137,7 +137,7 @@ namespace DS.WMS.Core.Code.Method
return await Task.FromResult(DataResult.Failed("权限复制人员不能为空!"));
}
if (db.Queryable<SysUser>().Where(x=> !req.CopyUserIds.Contains(x.Id)).Any()) {
if (db.Queryable<SysUser>().Where(x=> req.CopyUserIds.Contains(x.Id)).Count() == 0) {
return await Task.FromResult(DataResult.Failed("请检查复制人员信息!"));
}
@ -165,6 +165,7 @@ namespace DS.WMS.Core.Code.Method
{
UserId = userInfo.Id,
UserName = userInfo.UserName,
TemplateName = rule.TemplateName,
VisibleTemplateId = rule.VisibleTemplateId,
VisibleRuleScope = rule.VisibleRuleScope,
VisibleRuleScopeName = rule.VisibleRuleScopeName,
@ -257,6 +258,7 @@ namespace DS.WMS.Core.Code.Method
{
UserId = userInfo.Id,
UserName = userInfo.UserName,
TemplateName = currentTemplate.TemplateName,
VisibleTemplateId = currentTemplate.Id,
VisibleRuleScope = currentTemplate.RuleScope,
VisibleRuleScopeName = currentTemplate.RuleScopeName,
@ -363,6 +365,7 @@ namespace DS.WMS.Core.Code.Method
{
UserId = userInfo.Id,
UserName = userInfo.UserName,
TemplateName = currentTemplate.TemplateName,
OperateTemplateId = currentTemplate.Id,
OperateRuleScope = currentTemplate.RuleScope,
OperateRuleScopeName = currentTemplate.RuleScopeName,

@ -64,7 +64,7 @@ public class CodeFormCopyService : IFormCopyService
if (req.Id == 0)
{
if (tenantDb.Queryable<CodeFormCopy>()
.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);
}

@ -65,7 +65,7 @@ public class CodeFormSetService : IFormSetService
if (req.Id == 0)
{
if (tenantDb.Queryable<CodeFormSet>()
.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);
}

@ -65,7 +65,7 @@ public class CodeQuerySetService : IQuerySetService
if (req.Id == 0)
{
if (tenantDb.Queryable<CodeQuerySet>()
.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);
}

@ -57,7 +57,7 @@ public class CodeSequenceService : ICodeSequenceService
if (req.Id == 0)
{
if (tenantDb.Queryable<CodeSequence>().Where(x => x.PermissionId == req.PermissionId && x.OrderNo == req.OrderNo).Any())
if (tenantDb.Queryable<CodeSequence>().Where(x => x.PermissionId == req.PermissionId && x.SequenceName == req.SequenceName).Any())
{
return DataResult.Failed("基础编码已存在!", MultiLanguageConst.SequenceExist);
}

@ -93,7 +93,7 @@ namespace DS.WMS.Core.Code.Method
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var data = await tenantDb.Queryable<CodeDataRuleTemplate>()
.Where(x => x.Id == long.Parse(id) && x.Status == StatusEnum.Enable)
.Where(x => x.Id == long.Parse(id))
.Select<CodeDataRuleTemplateRes>()
.FirstAsync();
return await Task.FromResult(DataResult<CodeDataRuleTemplateRes>.Success(data, MultiLanguageConst.DataQuerySuccess));
@ -127,5 +127,25 @@ namespace DS.WMS.Core.Code.Method
}
return await Task.FromResult(DataResult.Successed("删除成功!", MultiLanguageConst.DataDelSuccess));
}
public async Task<DataResult> BatchCopyDataRuleTemplate(IdModel req)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var list = await tenantDb.Queryable<CodeDataRuleTemplate>().Where(x => req.Ids.Contains(x.Id)).ToListAsync();
var newList = new List<CodeDataRuleTemplate>();
if (list.Count > 0)
{
foreach (var item in list) {
var temp = item.Adapt<CodeDataRuleTemplate>();
temp.Id = 0;
temp.TemplateName = item.TemplateName +"-复制";
newList.Add(temp);
}
await tenantDb.Insertable(newList).ExecuteCommandAsync();
}
return await Task.FromResult(DataResult.Successed("复制成功!", MultiLanguageConst.DataCopySuccess));
}
}
}

@ -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
{
/// <summary>
/// 报表生成上下文
/// </summary>
public class ReportContext
{
/// <summary>
/// 服务提供程序
/// </summary>
public IServiceProvider ServiceProvider { get; internal set; }
/// <summary>
/// 获取主库访问对象
/// </summary>
public ISqlSugarClient Db { get; internal set; }
/// <summary>
/// 获取租户库访问对象
/// </summary>
public ISqlSugarClient TenantDb { get; internal set; }
/// <summary>
/// 请求用户
/// </summary>
public IUser User { get; internal set; }
/// <summary>
/// 操作结果,用于记录错误信息
/// </summary>
public DataResult? ErrorResult { get; set; }
/// <summary>
/// 业务类型
/// </summary>
public BusinessType BusinessType { get; set; } = BusinessType.OceanShippingExport;
/// <summary>
/// 业务ID
/// </summary>
public long[] Ids { get; set; } = [];
}
}

@ -96,12 +96,13 @@ public interface IFeeRecordService
Task WriteBackStatusAsync(long businessId, BusinessType businessType);
/// <summary>
/// 获取费用核算单打印信息
/// 获取费用打印信息
/// </summary>
/// <param name="providerName">数据提供程序</param>
/// <param name="businessType">业务类型</param>
/// <param name="idArray">费用记录ID</param>
/// <returns></returns>
Task<DataResult<CostAccountingForm>> GetPrintInfoAsync(BusinessType businessType, params long[] idArray);
Task<DataResult<dynamic>> GetPrintInfoAsync(string providerName, BusinessType businessType, params long[] idArray);
/// <summary>
/// 设置发票启用状态

@ -0,0 +1,17 @@
using DS.WMS.Core.Fee.Dtos;
namespace DS.WMS.Core.Fee.Interface
{
/// <summary>
/// 用于输出报表的数据提供程序
/// </summary>
public interface IReportProvider
{
/// <summary>
/// 返回所需的JSON格式的数据
/// </summary>
/// <param name="context">报表输出上下文</param>
/// <returns></returns>
Task<dynamic?> GetDataAsync(ReportContext context);
}
}

@ -927,110 +927,33 @@ namespace DS.WMS.Core.Fee.Method
}
/// <summary>
/// 获取费用核算单打印信息
/// 获取费用打印信息
/// </summary>
/// <param name="providerName"></param>
/// <param name="businessType">业务类型</param>
/// <param name="idArray">费用记录ID</param>
/// <returns></returns>
public async Task<DataResult<CostAccountingForm>> GetPrintInfoAsync(BusinessType businessType, params long[] idArray)
public async Task<DataResult<dynamic>> GetPrintInfoAsync(string providerName, 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<CostAccountingForm>.Failed(string.Format(
MultiLanguageConst.BusinessNotSupported, businessType.GetDescription()));
}
Type type = Type.GetType(providerName, false);
if (type == null)
return DataResult<dynamic>.Failed("未能找到数据提供程序");
if (form != null)
var provider = Fasterflect.ConstructorExtensions.CreateInstance(type) as IReportProvider;
var context = new ReportContext
{
long UserId = long.Parse(User.UserId);
form.Creator = Db.Queryable<SysUser>().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<FeeRecord> {
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<CostAccountingForm>.Success(form);
}
//获取海运出口打印数据
async Task<CostAccountingForm> GetOceanShippingExportAsync(params long[] idArray)
{
CostAccountingForm form = null;
var list = await TenantDb.Queryable<FeeRecord>().InnerJoin<SeaExport>((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()
BusinessType = businessType,
Ids = idArray,
Db = Db,
TenantDb = TenantDb,
User = User,
ServiceProvider = ServiceProvider
};
var data = provider.GetDataAsync(context);
if (context.ErrorResult == null)
return DataResult<dynamic>.Success(data);
return form;
return DataResult<dynamic>.Failed(context.ErrorResult.Message, context.ErrorResult.MultiCode);
}
/// <summary>

@ -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
{
/// <summary>
/// 费用核算单
/// </summary>
public class CostAccountingReport : IReportProvider
{
public async Task<dynamic?> 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<SysUser>().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<IFeeCurrencyExchangeService>();
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<CostAccountingForm> GetOceanShippingExportAsync(ISqlSugarClient tenantDb, params long[] idArray)
{
CostAccountingForm form = null;
var list = await tenantDb.Queryable<FeeRecord>().InnerJoin<SeaExport>((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;
}
}
}

@ -275,13 +275,15 @@ public class ClientInfoService : ServiceBase, IClientInfoService
if (request.OtherQueryCondition?.ClientTag != null)
{
//合并到主查询条件
var props = Array.FindAll(request.OtherQueryCondition.ClientTag.GetType().GetProperties(), x => x.Name.StartsWith("Is") && x.PropertyType == typeof(bool));
List<IConditionalModel> list = [];
foreach (var prop in props)
{
object val = prop.Get(request.OtherQueryCondition.ClientTag);
if (val != null && val is bool value && value)
{
whereList.Add(new ConditionalModel
list.Add(new ConditionalModel
{
ConditionalType = ConditionalType.Equal,
FieldName = "ct." + prop.Name,
@ -289,6 +291,8 @@ public class ClientInfoService : ServiceBase, IClientInfoService
});
}
}
query = query.Where(list);
}
var result = await query.Select((c, c1, c2, ct) => new ClientInfoRes

@ -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);

@ -104,7 +104,7 @@ public class CommonService : ICommonService
public DataResult<CurrentUserViewModel> 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<DataResult<CurrentUserViewModel>> GetClientUserInfo()
{
var userId = long.Parse(user.UserId);
var tenantId = user.GetTenantId();
var tenantId = long.Parse(user.TenantId);
//取第一个机构
var orgRelations = await db.Queryable<SysOrgUser>().Filter(null, true)
.LeftJoin<SysOrg>((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<RefreshTokenRes> ChangeOrg(string id)
{
var userId = user.UserId;
var tenantId = user.GetTenantId();
var tenantId = long.Parse(user.TenantId);
var sysUser = db.Queryable<SysUser>().First(x => x.Id == long.Parse(userId));
if (sysUser.IsNull())
{
@ -614,7 +614,7 @@ public class CommonService : ICommonService
public async Task<DataResult<List<RouteItem>>> GetClientUserPermissionByToken()
{
List<RouteItem> list = new List<RouteItem>();
_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);
@ -1447,7 +1447,7 @@ public class CommonService : ICommonService
var userInfo = db.Queryable<SysUser>().First(x => x.Id == long.Parse(user.UserId));
if (userInfo.UserType == 0)
{
return db.Queryable<T>(); //超级管理员特权
return tenantDb.Queryable<T>(); //超级管理员特权
}
var moduleName = typeof(T).Name.ToLower();
@ -1461,18 +1461,18 @@ public class CommonService : ICommonService
if ((long)rule.VisibleTemplateId == 0)
{
return db.Queryable<T>();
return tenantDb.Queryable<T>();
}
var ruleInfo = tenantDb.Queryable<CodeDataRuleTemplate>().First(x => x.Id == (long)rule.VisibleTemplateId);
if (ruleInfo.DataRules.IsNull())
{
return db.Queryable<T>();
return tenantDb.Queryable<T>();
}
if (ruleInfo.RuleScope == "all")
{
return db.Queryable<T>().ClearFilter<IOrgId>();
return tenantDb.Queryable<T>().ClearFilter<IOrgId>();
}
if (ruleInfo.RuleScope == "none")
{
@ -1488,18 +1488,30 @@ public class CommonService : ICommonService
}
if (ruleInfo.RuleScope == "self_dept")
{
if (String.IsNullOrEmpty(userInfo.DeptName))
{
SqlSugar.Check.ExceptionEasy("NO Operation", "当前员工没有默认归属部门!");
}
var deptUsers = db.Queryable<SysUser>().Where(x => x.DeptId == userInfo.DeptId).Select(x => x.Id).ToList();
ruleInfo.DataRules = ruleInfo.DataRules.Replace(DataRuleConst.LoginDept, string.Join(",", deptUsers));
}
if (ruleInfo.RuleScope == "select_org")
{
var orgUsers = db.Queryable<SysUser>().Where(x => x.DefaultOrgId == userInfo.DefaultOrgId).Select(x => x.Id).ToList();
ruleInfo.DataRules = ruleInfo.DataRules.Replace(DataRuleConst.LoginDept, string.Join(",", orgUsers));
//var orgUsers = db.Queryable<SysUser>().Where(x => x.DefaultOrgId == userInfo.DefaultOrgId).Select(x => x.Id).ToList();
//ruleInfo.DataRules = ruleInfo.DataRules.Replace(DataRuleConst.LoginDept, string.Join(",", orgUsers));
var conditions1 = ruleInfo.DataRules.ConvertSqlSugarExpression();
var conditionalModels1 =
db.ConfigQuery.Context.Utilities.JsonToConditionalModels(
JsonConvert.SerializeObject(conditions1));
return db.Queryable<T>().ClearFilter<IOrgId>().Where(conditionalModels1);
return tenantDb.Queryable<T>().ClearFilter<IOrgId>().Where(conditionalModels1);
}
if (ruleInfo.RuleScope == "select_user")
{
var conditions2 = ruleInfo.DataRules.ConvertSqlSugarExpression();
var conditionalModels2 =
db.ConfigQuery.Context.Utilities.JsonToConditionalModels(
JsonConvert.SerializeObject(conditions2));
return tenantDb.Queryable<T>().ClearFilter<IOrgId>().Where(conditionalModels2);
}
#endregion
@ -1509,7 +1521,7 @@ public class CommonService : ICommonService
var conditionalModels =
db.ConfigQuery.Context.Utilities.JsonToConditionalModels(
JsonConvert.SerializeObject(conditions));
return db.Queryable<T>().Where(conditionalModels);
return tenantDb.Queryable<T>().Where(conditionalModels);
}
#region 获取数据库表及字段属性

@ -7,9 +7,11 @@ using DS.Module.DjyServiceStatus;
using DS.Module.SqlSugar;
using DS.Module.UserModule;
using DS.WMS.Core.Code.Dtos;
using DS.WMS.Core.Flow.Entity;
using DS.WMS.Core.Map.Dtos;
using DS.WMS.Core.Op.Dtos;
using DS.WMS.Core.Op.Entity;
using DS.WMS.Core.Op.Entity.TaskInteraction;
using DS.WMS.Core.Op.Interface;
using DS.WMS.Core.TaskPlat.Dtos;
using DS.WMS.Core.TaskPlat.Entity;
@ -97,6 +99,8 @@ namespace DS.WMS.Core.TaskPlat.Method
//任务不考虑OrgId,这里去掉
tenantDb.QueryFilter.Clear<IOrgId>();
var masterDb = serviceProvider.GetRequiredService<ISqlSugarClient>();
try
{
var taskList = await tenantDb.Queryable<TaskBaseInfo>().Where(x => taskIds.Contains(x.Id)).ToListAsync(x => new
@ -137,8 +141,12 @@ namespace DS.WMS.Core.TaskPlat.Method
});
allocationList.AddRange(allots);
}
// 用于更新工作流的任务
var userIdStr = string.Join(',', userInfo.Select(x => x.RecvUserId));
var businessIdList = taskList.Where(x => x.OUT_BS_NO != null && x.OUT_BS_NO != 0).Select(x => x.OUT_BS_NO).Distinct().ToList();
await tenantDb.Ado.BeginTranAsync();
//await tenantDb.Ado.BeginTranAsync();
await tenantDb.AsTenant().BeginTranAsync();
var idList = await tenantDb.Queryable<TaskBaseAllocation>().Where(x => taskIdList.Contains(x.TaskId)).Select(x => x.Id).ToListAsync();
await tenantDb.Deleteable<TaskBaseAllocation>(x => idList.Contains(x.Id)).ExecuteCommandAsync();
@ -149,12 +157,40 @@ namespace DS.WMS.Core.TaskPlat.Method
.SetColumns(x => x.IS_PUBLIC == 0)
.Where(x => taskIdList.Contains(x.Id))
.ExecuteCommandAsync();
foreach (var item in taskList)
{
if (item.OUT_BS_NO is not null or 0 && Enum.TryParse(typeof(TaskBaseTypeEnum), item.TASK_TYPE, out object? taskType))
{
await tenantDb.Updateable<BusinessTask>()
.SetColumns(x => x.RecvUsers == userIdStr)
.Where(x => x.BusinessId == item.OUT_BS_NO && x.TaskType == (TaskBaseTypeEnum)taskType)
.ExecuteCommandAsync();
await tenantDb.Ado.CommitTranAsync();
var id = await masterDb.Queryable<FlowInstance>()
.ClearFilter(typeof(ITenantId))
.Where(y => y.BusinessId == item.OUT_BS_NO && y.AuditType == (TaskBaseTypeEnum)taskType)
.OrderByDescending(y => y.Id)
.Select(y => y.Id)
.FirstAsync();
if (id != 0)
{
await masterDb.Updateable<FlowInstance>()
.SetColumns(x => x.MakerList == userIdStr)
.Where(x => x.Id == id)
.ExecuteCommandAsync();
}
}
}
//await tenantDb.Ado.CommitTranAsync();
await tenantDb.AsTenant().CommitTranAsync();
}
catch (Exception)
{
await tenantDb.Ado.RollbackTranAsync();
//await tenantDb.Ado.RollbackTranAsync();
await tenantDb.AsTenant().RollbackTranAsync();
throw;
}
}

@ -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<SeaExport>().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<SeaExport>().Where(x => x.Id > 232).ToSqlString();
TaskBaseInfo taskInfo = null;
@ -2613,6 +2613,12 @@ namespace DS.WMS.Core.TaskPlat.Method
portLoadTaskIdList = temp.Select(x => x.TASK_ID).ToArray();
}
}
//// 下属任务统计
//var underTaskQueryable = tenantDb.Queryable<TaskBaseInfo>()
// .LeftJoin<TaskBaseAllocation>((t, a) => t.Id == a.TaskId)
// .LeftJoin<SeaExport>((t, a, s) => t.OUT_BS_NO == s.Id);
//任务列表分组统计
var queryable = tenantDb.Queryable<TaskBaseInfo>()
@ -3099,7 +3105,19 @@ namespace DS.WMS.Core.TaskPlat.Method
/// </summary>
public async Task<DataResult> 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<SeaExport>().Where(x => x.Id > 232).ToSqlString();
var t11 = tenantDb.ContextID;
switch (testType)
{

@ -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
/// <param name="model">费用记录ID</param>
/// <returns></returns>
[HttpPost, Route("GetPrintInfo")]
public async Task<DataResult<CostAccountingForm>> GetPrintInfoAsync(IdModel model)
public async Task<DataResult<dynamic>> GetPrintInfoAsync(IdModel model)
{
if (model == null || model.Ids?.Length == 0)
return DataResult<CostAccountingForm>.Failed("参数无效", MultiLanguageConst.IllegalRequest);
return DataResult<dynamic>.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);
}
/// <summary>

@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>D:\Publish\DS8\FeeApi</_PublishTargetUrl>
<History>True|2024-09-13T02:44:56.1241214Z||;False|2024-09-13T10:44:26.6088271+08:00||;False|2024-09-13T10:44:06.1615137+08:00||;False|2024-09-13T10:43:19.2432517+08:00||;False|2024-09-13T10:38:18.1663387+08:00||;True|2024-09-06T18:49:17.9435308+08:00||;True|2024-09-06T17:01:39.6646353+08:00||;True|2024-09-06T10:27:36.9990456+08:00||;True|2024-09-06T09:48:23.4236094+08:00||;True|2024-09-05T13:57:23.8452431+08:00||;True|2024-09-05T10:21:34.6675149+08:00||;True|2024-09-05T09:12:44.5610882+08:00||;True|2024-09-04T10:07:38.3707398+08:00||;True|2024-09-04T09:52:47.0574599+08:00||;True|2024-09-03T16:41:23.7516960+08:00||;True|2024-09-03T15:22:31.8718097+08:00||;True|2024-09-03T10:01:09.7656702+08:00||;False|2024-09-03T09:46:46.8956531+08:00||;True|2024-09-02T17:07:41.0268500+08:00||;True|2024-09-02T13:50:22.0203254+08:00||;True|2024-09-02T13:34:23.3441546+08:00||;True|2024-08-30T11:25:14.7431645+08:00||;True|2024-08-29T16:38:26.3491372+08:00||;True|2024-08-29T16:32:31.8580864+08:00||;False|2024-08-29T16:30:41.4763198+08:00||;True|2024-08-09T09:18:05.8484398+08:00||;True|2024-08-09T08:45:38.7858906+08:00||;True|2024-08-05T11:37:07.3133020+08:00||;True|2024-07-24T16:45:58.2272340+08:00||;True|2024-07-24T15:48:52.0128987+08:00||;True|2024-07-23T17:41:01.7494842+08:00||;True|2024-07-23T17:25:11.8773492+08:00||;True|2024-07-23T17:07:16.5460273+08:00||;True|2024-07-22T08:59:23.3235603+08:00||;True|2024-07-12T17:35:11.1225017+08:00||;True|2024-07-11T11:40:17.3581147+08:00||;True|2024-07-04T17:20:50.0175739+08:00||;True|2024-07-02T11:26:14.2092751+08:00||;True|2024-07-02T09:21:51.3513605+08:00||;True|2024-07-01T17:47:56.0407256+08:00||;True|2024-07-01T16:42:55.7374984+08:00||;True|2024-07-01T15:49:58.9266967+08:00||;True|2024-07-01T14:35:48.1117178+08:00||;True|2024-07-01T11:41:52.2969338+08:00||;True|2024-07-01T11:13:02.6561160+08:00||;True|2024-06-28T15:28:43.1470725+08:00||;True|2024-06-28T15:16:20.1999596+08:00||;True|2024-06-28T15:14:56.2534743+08:00||;True|2024-06-28T15:02:41.3033806+08:00||;True|2024-06-28T13:37:28.2462742+08:00||;True|2024-06-28T11:06:30.7400535+08:00||;True|2024-06-26T15:24:17.1939896+08:00||;True|2024-06-26T14:33:06.3530466+08:00||;True|2024-06-26T09:45:24.4055568+08:00||;True|2024-06-25T15:45:57.6052473+08:00||;True|2024-06-25T10:17:17.7408916+08:00||;False|2024-06-25T10:16:23.5639654+08:00||;False|2024-06-25T10:15:28.3857721+08:00||;False|2024-06-25T10:10:59.5536995+08:00||;False|2024-06-25T10:07:10.4050937+08:00||;True|2024-06-24T15:22:18.2672769+08:00||;True|2024-06-24T15:01:04.8153621+08:00||;False|2024-06-24T15:00:29.9618848+08:00||;True|2024-06-24T14:07:19.9401637+08:00||;False|2024-06-24T14:06:36.1250570+08:00||;True|2024-06-21T15:13:57.4273503+08:00||;True|2024-06-21T15:04:37.8218608+08:00||;True|2024-06-21T14:12:48.0266638+08:00||;True|2024-06-21T13:52:30.0950155+08:00||;True|2024-06-20T11:02:42.9508506+08:00||;True|2024-06-19T11:43:01.1899282+08:00||;True|2024-06-19T11:23:01.2938141+08:00||;True|2024-06-18T08:51:21.6222152+08:00||;True|2024-06-17T09:20:35.0804494+08:00||;True|2024-06-17T08:41:58.1319484+08:00||;True|2024-06-17T08:38:09.0137102+08:00||;True|2024-06-14T15:19:45.7395180+08:00||;True|2024-06-14T14:38:49.7094421+08:00||;True|2024-06-14T14:27:39.2815370+08:00||;True|2024-06-14T09:42:21.5397525+08:00||;True|2024-06-13T16:03:39.8475642+08:00||;True|2024-06-13T14:12:10.1725629+08:00||;True|2024-06-13T10:46:52.6971321+08:00||;True|2024-06-11T17:03:44.8328978+08:00||;True|2024-06-06T17:41:51.1810315+08:00||;True|2024-06-06T10:57:27.8273617+08:00||;True|2024-06-04T14:23:21.3742450+08:00||;True|2024-05-31T17:01:42.4717460+08:00||;True|2024-05-31T13:56:03.0734064+08:00||;True|2024-05-31T08:45:52.3549394+08:00||;True|2024-05-30T17:16:32.8907958+08:00||;True|2024-05-30T16:18:06.9957657+08:00||;True|2024-05-29T15:44:18.4051203+08:00||;True|2024-05-29T15:11:03.1518632+08:00||;True|2024-05-29T14:52:26.0823495+08:00||;True|2024-05-29T11:17:20.2245101+08:00||;True|2024-05-29T08:36:28.9569161+08:00||;True|2024-05-28T08:44:31.4427261+08:00||;False|2024-05-28T08:44:02.5254826+08:00||;True|2024-05-27T15:16:32.9413631+08:00||;</History>
<History>True|2024-09-13T06:31:12.4598160Z||;True|2024-09-13T10:44:56.1241214+08:00||;False|2024-09-13T10:44:26.6088271+08:00||;False|2024-09-13T10:44:06.1615137+08:00||;False|2024-09-13T10:43:19.2432517+08:00||;False|2024-09-13T10:38:18.1663387+08:00||;True|2024-09-06T18:49:17.9435308+08:00||;True|2024-09-06T17:01:39.6646353+08:00||;True|2024-09-06T10:27:36.9990456+08:00||;True|2024-09-06T09:48:23.4236094+08:00||;True|2024-09-05T13:57:23.8452431+08:00||;True|2024-09-05T10:21:34.6675149+08:00||;True|2024-09-05T09:12:44.5610882+08:00||;True|2024-09-04T10:07:38.3707398+08:00||;True|2024-09-04T09:52:47.0574599+08:00||;True|2024-09-03T16:41:23.7516960+08:00||;True|2024-09-03T15:22:31.8718097+08:00||;True|2024-09-03T10:01:09.7656702+08:00||;False|2024-09-03T09:46:46.8956531+08:00||;True|2024-09-02T17:07:41.0268500+08:00||;True|2024-09-02T13:50:22.0203254+08:00||;True|2024-09-02T13:34:23.3441546+08:00||;True|2024-08-30T11:25:14.7431645+08:00||;True|2024-08-29T16:38:26.3491372+08:00||;True|2024-08-29T16:32:31.8580864+08:00||;False|2024-08-29T16:30:41.4763198+08:00||;True|2024-08-09T09:18:05.8484398+08:00||;True|2024-08-09T08:45:38.7858906+08:00||;True|2024-08-05T11:37:07.3133020+08:00||;True|2024-07-24T16:45:58.2272340+08:00||;True|2024-07-24T15:48:52.0128987+08:00||;True|2024-07-23T17:41:01.7494842+08:00||;True|2024-07-23T17:25:11.8773492+08:00||;True|2024-07-23T17:07:16.5460273+08:00||;True|2024-07-22T08:59:23.3235603+08:00||;True|2024-07-12T17:35:11.1225017+08:00||;True|2024-07-11T11:40:17.3581147+08:00||;True|2024-07-04T17:20:50.0175739+08:00||;True|2024-07-02T11:26:14.2092751+08:00||;True|2024-07-02T09:21:51.3513605+08:00||;True|2024-07-01T17:47:56.0407256+08:00||;True|2024-07-01T16:42:55.7374984+08:00||;True|2024-07-01T15:49:58.9266967+08:00||;True|2024-07-01T14:35:48.1117178+08:00||;True|2024-07-01T11:41:52.2969338+08:00||;True|2024-07-01T11:13:02.6561160+08:00||;True|2024-06-28T15:28:43.1470725+08:00||;True|2024-06-28T15:16:20.1999596+08:00||;True|2024-06-28T15:14:56.2534743+08:00||;True|2024-06-28T15:02:41.3033806+08:00||;True|2024-06-28T13:37:28.2462742+08:00||;True|2024-06-28T11:06:30.7400535+08:00||;True|2024-06-26T15:24:17.1939896+08:00||;True|2024-06-26T14:33:06.3530466+08:00||;True|2024-06-26T09:45:24.4055568+08:00||;True|2024-06-25T15:45:57.6052473+08:00||;True|2024-06-25T10:17:17.7408916+08:00||;False|2024-06-25T10:16:23.5639654+08:00||;False|2024-06-25T10:15:28.3857721+08:00||;False|2024-06-25T10:10:59.5536995+08:00||;False|2024-06-25T10:07:10.4050937+08:00||;True|2024-06-24T15:22:18.2672769+08:00||;True|2024-06-24T15:01:04.8153621+08:00||;False|2024-06-24T15:00:29.9618848+08:00||;True|2024-06-24T14:07:19.9401637+08:00||;False|2024-06-24T14:06:36.1250570+08:00||;True|2024-06-21T15:13:57.4273503+08:00||;True|2024-06-21T15:04:37.8218608+08:00||;True|2024-06-21T14:12:48.0266638+08:00||;True|2024-06-21T13:52:30.0950155+08:00||;True|2024-06-20T11:02:42.9508506+08:00||;True|2024-06-19T11:43:01.1899282+08:00||;True|2024-06-19T11:23:01.2938141+08:00||;True|2024-06-18T08:51:21.6222152+08:00||;True|2024-06-17T09:20:35.0804494+08:00||;True|2024-06-17T08:41:58.1319484+08:00||;True|2024-06-17T08:38:09.0137102+08:00||;True|2024-06-14T15:19:45.7395180+08:00||;True|2024-06-14T14:38:49.7094421+08:00||;True|2024-06-14T14:27:39.2815370+08:00||;True|2024-06-14T09:42:21.5397525+08:00||;True|2024-06-13T16:03:39.8475642+08:00||;True|2024-06-13T14:12:10.1725629+08:00||;True|2024-06-13T10:46:52.6971321+08:00||;True|2024-06-11T17:03:44.8328978+08:00||;True|2024-06-06T17:41:51.1810315+08:00||;True|2024-06-06T10:57:27.8273617+08:00||;True|2024-06-04T14:23:21.3742450+08:00||;True|2024-05-31T17:01:42.4717460+08:00||;True|2024-05-31T13:56:03.0734064+08:00||;True|2024-05-31T08:45:52.3549394+08:00||;True|2024-05-30T17:16:32.8907958+08:00||;True|2024-05-30T16:18:06.9957657+08:00||;True|2024-05-29T15:44:18.4051203+08:00||;True|2024-05-29T15:11:03.1518632+08:00||;True|2024-05-29T14:52:26.0823495+08:00||;True|2024-05-29T11:17:20.2245101+08:00||;True|2024-05-29T08:36:28.9569161+08:00||;True|2024-05-28T08:44:31.4427261+08:00||;False|2024-05-28T08:44:02.5254826+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

@ -87,4 +87,17 @@ public class CodeDataRuleTemplateController : ApiController
var res =await _invokeService.BatchDelDataRuleTemplate(req);
return res;
}
/// <summary>
/// 批量复制
/// </summary>
/// <param name="req">Ids</param>
/// <returns></returns>
[HttpPost]
[Route("BatchCopyDataRuleTemplate")]
public async Task<DataResult> BatchCopyDataRuleTemplate([FromBody] IdModel req)
{
var res = await _invokeService.BatchCopyDataRuleTemplate(req);
return res;
}
}

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<NameOfLastUsedPublishProfile>D:\Code\DS\ds8-solution-pro\ds-wms-service\DS.WMS.MainApi\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
<NameOfLastUsedPublishProfile>D:\Code\ds8-solution-pro\ds-wms-service\DS.WMS.MainApi\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
</PropertyGroup>
</Project>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<NameOfLastUsedPublishProfile>E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
<NameOfLastUsedPublishProfile>D:\Source\Repos\DS8\ds-wms-service\DS.WMS.OpApi\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
<Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
</PropertyGroup>

Loading…
Cancel
Save