You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							330 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							330 lines
						
					
					
						
							13 KiB
						
					
					
				
								using Microsoft.Data.SqlClient;
							 | 
						|
								using Microsoft.Extensions.Configuration;
							 | 
						|
								using Microsoft.Extensions.Logging;
							 | 
						|
								using Newtonsoft.Json;
							 | 
						|
								using Newtonsoft.Json.Converters;
							 | 
						|
								using Npgsql;
							 | 
						|
								using Oracle.ManagedDataAccess.Client;
							 | 
						|
								using Shentun.Utilities;
							 | 
						|
								using System;
							 | 
						|
								using System.Collections.Generic;
							 | 
						|
								using System.Data.Common;
							 | 
						|
								using System.IdentityModel.Tokens.Jwt;
							 | 
						|
								using System.Linq;
							 | 
						|
								using System.Linq.Dynamic.Core.Tokenizer;
							 | 
						|
								using System.Net.Http.Headers;
							 | 
						|
								using System.Text;
							 | 
						|
								using System.Threading.Tasks;
							 | 
						|
								
							 | 
						|
								namespace Shentun.WebPeis.PlugIns
							 | 
						|
								{
							 | 
						|
								    public class PlugInsBase
							 | 
						|
								    {
							 | 
						|
								        protected IConfiguration? AppConfig;
							 | 
						|
								        protected IConfiguration? InterfaceConfig;
							 | 
						|
								        protected string? AppConnctionStr;
							 | 
						|
								        private string? _appBaseAddress;
							 | 
						|
								        private static string? _accesToken;
							 | 
						|
								        protected string? AppUser;
							 | 
						|
								        protected string? AppPassword;
							 | 
						|
								
							 | 
						|
								        protected string? InterfaceSql;
							 | 
						|
								        protected string? InterfaceSqlKeyColumn;
							 | 
						|
								        protected string? InterfaceDbType;
							 | 
						|
								        protected string? InterfaceConnctionStr;
							 | 
						|
								
							 | 
						|
								        protected string? InterfaceWebApiUrl;
							 | 
						|
								
							 | 
						|
								        protected Guid ItemColumnReferenceId;
							 | 
						|
								        protected Guid AsbitemColumnReferenceId;
							 | 
						|
								        protected Guid DepartmentColumnReferenceId;
							 | 
						|
								        protected Guid UserColumnReferenceId;
							 | 
						|
								        protected ILogger<PlugInsBase> Logger;
							 | 
						|
								        static PlugInsBase()
							 | 
						|
								        {
							 | 
						|
								            Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
							 | 
						|
								        }
							 | 
						|
								        public PlugInsBase()
							 | 
						|
								        {
							 | 
						|
								            Init();
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        public PlugInsBase(string parmValue)
							 | 
						|
								        {
							 | 
						|
								            Init();
							 | 
						|
								
							 | 
						|
								            Init(parmValue);
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								        public void Init()
							 | 
						|
								        {
							 | 
						|
								            AppConfig = new ConfigurationBuilder()
							 | 
						|
								           .SetBasePath(DirectoryHelper.GetAppDirectory()) // 设置基础路径为当前目录
							 | 
						|
								           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
							 | 
						|
								           .Build();
							 | 
						|
								            AppConnctionStr = AppConfig.GetSection("ConnectionStrings")
							 | 
						|
								                .GetSection("Default").Value;
							 | 
						|
								            _appBaseAddress = AppConfig.GetSection("App")
							 | 
						|
								                .GetSection("SelfUrl").Value;
							 | 
						|
								            AppUser = AppConfig.GetSection("App")
							 | 
						|
								               .GetSection("SelfUser").Value;
							 | 
						|
								            AppPassword = AppConfig.GetSection("App")
							 | 
						|
								               .GetSection("SelfPassword").Value;
							 | 
						|
								
							 | 
						|
								            using var loggerFactory = LoggerFactory.Create(builder =>
							 | 
						|
								            {
							 | 
						|
								
							 | 
						|
								            });
							 | 
						|
								            Logger = loggerFactory.CreateLogger<PlugInsBase>();
							 | 
						|
								        }
							 | 
						|
								        public void Init(string parmValue)
							 | 
						|
								        {
							 | 
						|
								            var configurationBuilder = new ConfigurationBuilder()
							 | 
						|
								              .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
							 | 
						|
								            InterfaceConfig = configurationBuilder.Build();
							 | 
						|
								            //如果接口配置里面配置了用户名密码,则用接口中的覆盖本地配置
							 | 
						|
								            var appUser = InterfaceConfig.GetSection("App").GetSection("User").Value;
							 | 
						|
								            if(!string.IsNullOrWhiteSpace(appUser))
							 | 
						|
								            {
							 | 
						|
								                AppUser = appUser;
							 | 
						|
								            }
							 | 
						|
								            var appPassword = InterfaceConfig.GetSection("App").GetSection("Password").Value;
							 | 
						|
								            if (!string.IsNullOrWhiteSpace(appPassword))
							 | 
						|
								            {
							 | 
						|
								                AppPassword = appPassword;
							 | 
						|
								            }
							 | 
						|
								            //设置接口有关配置
							 | 
						|
								            InterfaceSql = InterfaceConfig.GetSection("Interface").GetSection("Sql").Value;
							 | 
						|
								            InterfaceSqlKeyColumn = InterfaceConfig.GetSection("Interface").GetSection("SqlKeyColumn").Value;
							 | 
						|
								            InterfaceDbType = InterfaceConfig.GetSection("Interface").GetSection("DbType").Value;
							 | 
						|
								            InterfaceWebApiUrl = InterfaceConfig.GetSection("Interface").GetSection("WebApiUrl").Value;
							 | 
						|
								
							 | 
						|
								            InterfaceConnctionStr = InterfaceConfig.GetSection("Interface").GetSection("ConnectionStrings").Value;
							 | 
						|
								
							 | 
						|
								            var itemColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
							 | 
						|
								                 .GetSection("ItemColumnReferenceId").Value;
							 | 
						|
								            if (!string.IsNullOrWhiteSpace(itemColumnReferenceIdStr))
							 | 
						|
								            {
							 | 
						|
								                ItemColumnReferenceId = new Guid(itemColumnReferenceIdStr);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            var asbItemColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
							 | 
						|
								                .GetSection("AsbitemColumnReferenceId").Value;
							 | 
						|
								            if (!string.IsNullOrWhiteSpace(asbItemColumnReferenceIdStr))
							 | 
						|
								            {
							 | 
						|
								                AsbitemColumnReferenceId = new Guid(asbItemColumnReferenceIdStr);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            var departmentColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
							 | 
						|
								                 .GetSection("DepartmentColumnReferenceId").Value;
							 | 
						|
								            if (!string.IsNullOrWhiteSpace(departmentColumnReferenceIdStr))
							 | 
						|
								            {
							 | 
						|
								                DepartmentColumnReferenceId = new Guid(departmentColumnReferenceIdStr);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            var userColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
							 | 
						|
								                 .GetSection("UserColumnReferenceId").Value;
							 | 
						|
								            if (!string.IsNullOrWhiteSpace(userColumnReferenceIdStr))
							 | 
						|
								            {
							 | 
						|
								                UserColumnReferenceId = new Guid(userColumnReferenceIdStr);
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        protected DbConnection CreateInterfaceDbConnect()
							 | 
						|
								        {
							 | 
						|
								            DbConnection conn;
							 | 
						|
								            if (string.IsNullOrWhiteSpace(InterfaceConnctionStr))
							 | 
						|
								            {
							 | 
						|
								                throw new ArgumentException("数据连接设置中的DbType不能为空");
							 | 
						|
								            }
							 | 
						|
								            InterfaceDbType = InterfaceDbType.ToLower();
							 | 
						|
								            //Logger.LogInformation("数据库类型:" + InterfaceDbType);
							 | 
						|
								            if (InterfaceDbType == "sqlserver")
							 | 
						|
								            {
							 | 
						|
								                //Logger.LogInformation("调用sqlserver:" + InterfaceDbType);
							 | 
						|
								                conn = new SqlConnection(InterfaceConnctionStr);
							 | 
						|
								            }
							 | 
						|
								            else if (InterfaceDbType == "postgres")
							 | 
						|
								            {
							 | 
						|
								                //Logger.LogInformation("调用postgres:" + InterfaceDbType);
							 | 
						|
								                conn = new NpgsqlConnection(InterfaceConnctionStr);
							 | 
						|
								            }
							 | 
						|
								            else if (InterfaceDbType == "oracle")
							 | 
						|
								            {
							 | 
						|
								                //Logger.LogInformation("调用oracle:" + InterfaceDbType);
							 | 
						|
								                conn = new OracleConnection(InterfaceConnctionStr);
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                throw new ArgumentException("数据连接设置中的DbType不支持");
							 | 
						|
								            }
							 | 
						|
								            return conn;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        public async Task<TOut> CallAppServiceAsync<TInput, TOut>(string url, TInput data, string method = "post")
							 | 
						|
								        {
							 | 
						|
								            if(string.IsNullOrWhiteSpace(_appBaseAddress))
							 | 
						|
								            {
							 | 
						|
								                throw new Exception("_appBaseAddress不能为空");
							 | 
						|
								            }
							 | 
						|
								            string baseAddress = _appBaseAddress;
							 | 
						|
								            await CheckLoginAsync();
							 | 
						|
								            using (var httpClientHandler = new HttpClientHandler())
							 | 
						|
								            {
							 | 
						|
								                using (var httpClient = new HttpClient(httpClientHandler))
							 | 
						|
								                {
							 | 
						|
								                    httpClient.BaseAddress = new Uri(baseAddress);
							 | 
						|
								
							 | 
						|
								                    httpClient.DefaultRequestHeaders.Accept.Add(
							 | 
						|
								                      new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
							 | 
						|
								                    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accesToken);
							 | 
						|
								                    IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
							 | 
						|
								                    timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
							 | 
						|
								                    var sendData = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented, timeFormat);
							 | 
						|
								                    using (HttpContent httpContent = new StringContent(sendData))
							 | 
						|
								                    {
							 | 
						|
								                        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
							 | 
						|
								                        HttpResponseMessage response = null;
							 | 
						|
								                        if (method == "post")
							 | 
						|
								                        {
							 | 
						|
								                            response = await httpClient.PostAsync(url, httpContent);
							 | 
						|
								                        }
							 | 
						|
								                        else
							 | 
						|
								                        {
							 | 
						|
								                            response = await httpClient.GetAsync(url);
							 | 
						|
								                        }
							 | 
						|
								
							 | 
						|
								                        string result;
							 | 
						|
								                        if (!response.IsSuccessStatusCode)
							 | 
						|
								                        {
							 | 
						|
								                            result = response.Content.ReadAsStringAsync().Result;
							 | 
						|
								                            throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result);
							 | 
						|
								                        }
							 | 
						|
								                        result = await response.Content.ReadAsStringAsync();
							 | 
						|
								
							 | 
						|
								                        var resultDto = JsonConvert.DeserializeObject< WebApiOutDto<TOut>>(result);
							 | 
						|
								
							 | 
						|
								                        if (resultDto.Code == -1)
							 | 
						|
								                        {
							 | 
						|
								                            throw new Exception($"调用WebApi失败,返回-1,消息:" + resultDto.Message);
							 | 
						|
								                        }
							 | 
						|
								                        return resultDto.Data;
							 | 
						|
								
							 | 
						|
								                    }
							 | 
						|
								
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        public virtual async Task DoWorkAsync()
							 | 
						|
								        {
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        public virtual Task DoWork()
							 | 
						|
								        {
							 | 
						|
								            return Task.CompletedTask;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        public async virtual Task<WebApiOutDto<LoginOutDataDto>> LoginAsync()
							 | 
						|
								        {
							 | 
						|
								            if(string.IsNullOrWhiteSpace(AppUser))
							 | 
						|
								            {
							 | 
						|
								                throw new Exception("SelfUser不能为空");
							 | 
						|
								            }
							 | 
						|
								            if (string.IsNullOrWhiteSpace(AppPassword))
							 | 
						|
								            {
							 | 
						|
								                throw new Exception("SelfPassword不能为空");
							 | 
						|
								            }
							 | 
						|
								            var relult = await LoginAsync(AppUser, AppPassword);
							 | 
						|
								            return relult;
							 | 
						|
								        }
							 | 
						|
								        public async Task<WebApiOutDto<LoginOutDataDto>> LoginAsync(string userId, string password)
							 | 
						|
								        {
							 | 
						|
								            if (string.IsNullOrWhiteSpace(userId))
							 | 
						|
								            {
							 | 
						|
								                throw new Exception("用户ID不能为空");
							 | 
						|
								            }
							 | 
						|
								            if (string.IsNullOrWhiteSpace(password))
							 | 
						|
								            {
							 | 
						|
								                throw new Exception("密码不能为空");
							 | 
						|
								            }
							 | 
						|
								            using (var httpClientHandler = new HttpClientHandler())
							 | 
						|
								            {
							 | 
						|
								                using (var httpClient = new HttpClient(httpClientHandler))
							 | 
						|
								                {
							 | 
						|
								                    httpClient.BaseAddress = new Uri(_appBaseAddress);
							 | 
						|
								
							 | 
						|
								                    httpClient.DefaultRequestHeaders.Accept.Add(
							 | 
						|
								                      new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
							 | 
						|
								                    var url = "api/identity/users/login";
							 | 
						|
								                    var loginUser = new LoginInputDto()
							 | 
						|
								                    {
							 | 
						|
								                        UserName = userId,
							 | 
						|
								                        Password = password
							 | 
						|
								                    };
							 | 
						|
								                    var sendData = JsonConvert.SerializeObject(loginUser);
							 | 
						|
								                    using (HttpContent httpContent = new StringContent(sendData))
							 | 
						|
								                    {
							 | 
						|
								                        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
							 | 
						|
								                        HttpResponseMessage response = await httpClient.PostAsync(url, httpContent);
							 | 
						|
								                        string result;
							 | 
						|
								                        if (!response.IsSuccessStatusCode)
							 | 
						|
								                        {
							 | 
						|
								                            result = response.Content.ReadAsStringAsync().Result;
							 | 
						|
								                            throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result);
							 | 
						|
								                        }
							 | 
						|
								                        result = await response.Content.ReadAsStringAsync();
							 | 
						|
								                        var restultDto = JsonConvert.DeserializeObject<WebApiOutDto<LoginOutDataDto>>(result);
							 | 
						|
								                        if (restultDto == null)
							 | 
						|
								                        {
							 | 
						|
								                            throw new Exception("返回结果是空");
							 | 
						|
								                        }
							 | 
						|
								                        if (restultDto.Code != 1)
							 | 
						|
								                        {
							 | 
						|
								                            throw new Exception($"登录失败{restultDto.Message}");
							 | 
						|
								                        }
							 | 
						|
								                        _accesToken = restultDto.Data.access_token;
							 | 
						|
								                        return restultDto;
							 | 
						|
								                    }
							 | 
						|
								
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        private async Task CheckLoginAsync()
							 | 
						|
								        {
							 | 
						|
								            if (string.IsNullOrWhiteSpace(_accesToken))
							 | 
						|
								            {
							 | 
						|
								                await LoginAsync();
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                var handler = new JwtSecurityTokenHandler();
							 | 
						|
								                var payload = handler.ReadJwtToken(_accesToken).Payload;
							 | 
						|
								                var claims = payload.Claims;
							 | 
						|
								                var exp = claims.First(claim => claim.Type == "exp").Value;
							 | 
						|
								                if (exp == null)
							 | 
						|
								                {
							 | 
						|
								                    await LoginAsync();
							 | 
						|
								                }
							 | 
						|
								                else
							 | 
						|
								                {
							 | 
						|
								                    if (long.TryParse(exp, out var expires))
							 | 
						|
								                    {
							 | 
						|
								                        var expireTime = DateTimeOffset.FromUnixTimeSeconds(expires).LocalDateTime;
							 | 
						|
								                        if (expireTime <= DateTime.Now)
							 | 
						|
								                        {
							 | 
						|
								                            await LoginAsync();
							 | 
						|
								                        }
							 | 
						|
								                    }
							 | 
						|
								                    else
							 | 
						|
								                    {
							 | 
						|
								                        await LoginAsync();
							 | 
						|
								                    }
							 | 
						|
								
							 | 
						|
								                }
							 | 
						|
								
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 |