1. 雪花ID使用配置项
2. 使用自定义日志格式 3. 修复数据模型和新建流程的bug
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"AppSettings": {
|
"AppSettings": {
|
||||||
"InjectMiniProfiler": true,
|
"InjectMiniProfiler": true,
|
||||||
"SupportPackageNamePrefixs": ["Tnb"]
|
"SupportPackageNamePrefixs": [ "Tnb" ]
|
||||||
},
|
},
|
||||||
"Kestrel": {
|
"Kestrel": {
|
||||||
"Endpoints": {
|
"Endpoints": {
|
||||||
@@ -9,5 +9,13 @@
|
|||||||
"Url": "http://localhost:9231"
|
"Url": "http://localhost:9231"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"YitId": {
|
||||||
|
"WorkerId": 1, //必须 全局唯一,必须 程序设定,理论最大值 2^WorkerIdBitLength-1
|
||||||
|
"WorkerIdBitLength": 4, //机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 16]
|
||||||
|
"SeqBitLength": 4 //序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒基础生成的ID个数
|
||||||
|
},
|
||||||
|
"UnifyResultSettings": {
|
||||||
|
"ShowExceptionDetail": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"ConfigId": "default",
|
"ConfigId": "default",
|
||||||
"DBName": "tnb",
|
"DBName": "tnb_bas",
|
||||||
"DBType": "PostgreSQL", //MySql;SqlServer;Oracle;PostgreSQL;Dm;Kdbndp;Sqlite;
|
"DBType": "PostgreSQL", //MySql;SqlServer;Oracle;PostgreSQL;Dm;Kdbndp;Sqlite;
|
||||||
"Host": "localhost",
|
"Host": "localhost",
|
||||||
"Port": "9202",
|
"Port": "9202",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
//"DefaultConnection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.19)(PORT=1521))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME=JNPFCLOUD)));User Id=JNPFCLOUD;Password=JNPFCLOUD"
|
//"DefaultConnection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.19)(PORT=1521))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME=JNPFCLOUD)));User Id=JNPFCLOUD;Password=JNPFCLOUD"
|
||||||
//PostgreSQL
|
//PostgreSQL
|
||||||
//"DefaultConnection": "PORT=5432;DATABASE=java_boot_dev_postgresql;HOST=192.168.0.103;PASSWORD=123456;USER ID=postgres"
|
//"DefaultConnection": "PORT=5432;DATABASE=java_boot_dev_postgresql;HOST=192.168.0.103;PASSWORD=123456;USER ID=postgres"
|
||||||
"DefaultConnection": "server=localhost;port=9202;database=tnb;uid=totong;pwd=IPANyxGSKxIXg0dBM;pooling=true;"
|
"DefaultConnection": "server=localhost;port=9202;database=tnb_bas;uid=totong;pwd=IPANyxGSKxIXg0dBM;pooling=true;"
|
||||||
//MySql
|
//MySql
|
||||||
//"DefaultConnection": "server=192.168.0.10;Database=netcore_test;Uid=netcore_test;Pwd=jhpGB3A88CF57fBC;AllowLoadLocalInfile=true"
|
//"DefaultConnection": "server=192.168.0.10;Database=netcore_test;Uid=netcore_test;Pwd=jhpGB3A88CF57fBC;AllowLoadLocalInfile=true"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using JNPF;
|
using JNPF;
|
||||||
|
using JNPF.Logging;
|
||||||
|
using Spire.Xls;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
|
|
||||||
namespace Microsoft.Extensions.DependencyInjection;
|
namespace Microsoft.Extensions.DependencyInjection;
|
||||||
@@ -39,33 +41,33 @@ public static class SqlSugarConfigureExtensions
|
|||||||
|
|
||||||
services.AddSqlSugar(connectConfigList, client =>
|
services.AddSqlSugar(connectConfigList, client =>
|
||||||
{
|
{
|
||||||
//connectConfigList.ForEach(config =>
|
//connectConfigList.ForEach(config =>
|
||||||
//{
|
//{
|
||||||
// var db = ((SqlSugarScope)client).GetConnectionScope((string)config.ConfigId);
|
// var db = ((SqlSugarScope)client).GetConnectionScope((string)config.ConfigId);
|
||||||
|
|
||||||
// // 设置超时时间
|
// // 设置超时时间
|
||||||
// db.Ado.CommandTimeOut = 30;
|
// db.Ado.CommandTimeOut = 30;
|
||||||
|
|
||||||
// // 打印SQL语句
|
// // 打印SQL语句
|
||||||
// db.Aop.OnLogExecuting = (sql, pars) =>
|
// db.Aop.OnLogExecuting = (sql, pars) =>
|
||||||
// {
|
// {
|
||||||
// if (sql.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase))
|
// var oldColor = Console.ForegroundColor;
|
||||||
// Console.ForegroundColor = ConsoleColor.Green;
|
// Console.ForegroundColor = ConsoleColor.Green;
|
||||||
// if (sql.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase))
|
// var finalSql = UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, sql, pars);
|
||||||
// Console.ForegroundColor = ConsoleColor.White;
|
// Console.WriteLine($"【{DateTime.Now.ToString("HH:mm:ss.fff")}——SQL执行完成】{db.Ado.SqlExecutionTime.TotalMilliseconds} ms");
|
||||||
// if (sql.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase))
|
// Console.WriteLine(finalSql);
|
||||||
// Console.ForegroundColor = ConsoleColor.Blue;
|
// Console.ForegroundColor = oldColor;
|
||||||
// Console.WriteLine("【" + DateTime.Now + "——执行SQL】\r\n" + UtilMethods.GetSqlString(config.DbType, sql, pars) + "\r\n");
|
// if (db.Ado.SqlExecutionTime.TotalMilliseconds > 3000)
|
||||||
// App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
|
// {
|
||||||
// };
|
// Log.Warning($"慢查询: {db.Ado.SqlExecutionTime.TotalMilliseconds}ms, SQL: " + finalSql);
|
||||||
// db.Aop.OnError = (ex) =>
|
// }
|
||||||
// {
|
// Console.WriteLine();
|
||||||
// Console.ForegroundColor = ConsoleColor.Red;
|
// };
|
||||||
// var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
|
// db.Aop.OnError = (ex) =>
|
||||||
// Console.WriteLine("【" + DateTime.Now + "——错误SQL】\r\n" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n");
|
// {
|
||||||
// App.PrintToMiniProfiler("SqlSugar", "Error", $"{ex.Message}{Environment.NewLine}{ex.Sql}{pars}{Environment.NewLine}");
|
// Log.Error(UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres));
|
||||||
// };
|
// };
|
||||||
//});
|
//});
|
||||||
});
|
});
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
using JNPF.Common.Security;
|
||||||
|
|
||||||
Serve.Run(RunOptions.Default
|
Serve.Run(RunOptions.Default
|
||||||
.AddWebComponent<WebComponent>().WithArgs(args));
|
.AddWebComponent<WebComponent>().WithArgs(args));
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ using System.Xml;
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Top.Api;
|
using Top.Api;
|
||||||
|
using JNPF.Common.Security;
|
||||||
|
|
||||||
namespace JNPF.API.Entry;
|
namespace JNPF.API.Entry;
|
||||||
|
|
||||||
@@ -207,6 +208,8 @@ public class Startup : AppStartup
|
|||||||
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
|
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
SnowflakeIdHelper.InitYitIdWorker();
|
||||||
|
|
||||||
serviceProvider.GetRequiredService<ITimeTaskService>().StartTimerJob();
|
serviceProvider.GetRequiredService<ITimeTaskService>().StartTimerJob();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,7 +229,13 @@ public class Startup : AppStartup
|
|||||||
}
|
}
|
||||||
private string LoggerFileFormat(LogMessage msg)
|
private string LoggerFileFormat(LogMessage msg)
|
||||||
{
|
{
|
||||||
return $"{LoggerLevelName(msg.LogLevel)} {msg.LogDateTime.ToString(DATEFORMAT)} {msg.ThreadId}# {msg.Message}";
|
var txt = $"{LoggerLevelName(msg.LogLevel)} {msg.LogDateTime.ToString(DATEFORMAT)} {msg.ThreadId}# {msg.Message}";
|
||||||
|
if (msg.Exception != null)
|
||||||
|
{
|
||||||
|
//var EXCEPTION_SEPARATOR_WITHCOLOR = AppendWithColor(default, EXCEPTION_SEPARATOR, logLevelColors).ToString();
|
||||||
|
txt += $"{Environment.NewLine}{msg.Exception}";
|
||||||
|
}
|
||||||
|
return txt;
|
||||||
}
|
}
|
||||||
private string LoggerConsoleFormat(LogMessage msg)
|
private string LoggerConsoleFormat(LogMessage msg)
|
||||||
{
|
{
|
||||||
@@ -236,7 +245,12 @@ public class Startup : AppStartup
|
|||||||
LogLevel.Error => "\u001b[1m\u001b[31m",
|
LogLevel.Error => "\u001b[1m\u001b[31m",
|
||||||
_ => "\u001b[39m\u001b[22m"
|
_ => "\u001b[39m\u001b[22m"
|
||||||
};
|
};
|
||||||
return $"{fclr}{LoggerLevelName(msg.LogLevel)}\u001b[49m \u001b[36m{msg.LogDateTime.ToString(DATEFORMAT)}\u001b[49m \u001b[39m\u001b[22m{msg.ThreadId}#\u001b[49m {fclr}{msg.Message}\u001b[49m";
|
var txt = $"{fclr}{LoggerLevelName(msg.LogLevel)}\u001b[49m \u001b[36m{msg.LogDateTime.ToString(DATEFORMAT)}\u001b[49m \u001b[39m\u001b[22m{msg.ThreadId}#\u001b[49m {fclr}{msg.Message}\u001b[49m";
|
||||||
|
if (msg.Exception != null)
|
||||||
|
{
|
||||||
|
//var EXCEPTION_SEPARATOR_WITHCOLOR = AppendWithColor(default, EXCEPTION_SEPARATOR, logLevelColors).ToString();
|
||||||
|
txt += $"{Environment.NewLine}{fclr}{msg.Exception}\u001b[49m";
|
||||||
|
}
|
||||||
|
return txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<!--<ItemGroup>
|
||||||
<None Remove="lib\regworkerid_lib_v1.3.1\yitidgengo.dll" />
|
<None Remove="lib\regworkerid_lib_v1.3.1\yitidgengo.dll" />
|
||||||
<None Remove="lib\regworkerid_lib_v1.3.1\yitidgengo.so" />
|
<None Remove="lib\regworkerid_lib_v1.3.1\yitidgengo.so" />
|
||||||
<None Remove="sensitive-words.txt" />
|
<None Remove="sensitive-words.txt" />
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
<EmbeddedResource Include="lib\regworkerid_lib_v1.3.1\yitidgengo.dll" />
|
<EmbeddedResource Include="lib\regworkerid_lib_v1.3.1\yitidgengo.dll" />
|
||||||
<EmbeddedResource Include="lib\regworkerid_lib_v1.3.1\yitidgengo.so" />
|
<EmbeddedResource Include="lib\regworkerid_lib_v1.3.1\yitidgengo.so" />
|
||||||
<EmbeddedResource Include="sensitive-words.txt" />
|
<EmbeddedResource Include="sensitive-words.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>-->
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="IGeekFan.AspNetCore.Knife4jUI" Version="0.0.13" />
|
<PackageReference Include="IGeekFan.AspNetCore.Knife4jUI" Version="0.0.13" />
|
||||||
@@ -42,10 +42,4 @@
|
|||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
25
apihost/Tnb.API.Entry/_install.bat
Normal file
25
apihost/Tnb.API.Entry/_install.bat
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
@echo off
|
||||||
|
%1 %2
|
||||||
|
ver|find "5.">nul&&goto :Admin
|
||||||
|
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
|
||||||
|
|
||||||
|
:Admin
|
||||||
|
cd /d %~dp0
|
||||||
|
echo --------------------------------
|
||||||
|
echo 1 --- install
|
||||||
|
echo 2 --- uninstall
|
||||||
|
echo --------------------------------
|
||||||
|
setlocal
|
||||||
|
set svcName=ToTong.TNB.Master
|
||||||
|
set binPath=Tnb.API.Entry.exe
|
||||||
|
set /p mode=input number to choise:
|
||||||
|
if %mode%==1 (
|
||||||
|
sc create %svcName% binpath=%~dp0%binPath% displayname=%svcName% start= auto
|
||||||
|
sc description %svcName% %svcName%
|
||||||
|
net start %svcName%
|
||||||
|
) else if %mode%==2 (
|
||||||
|
net stop %svcName%
|
||||||
|
sc delete %svcName%
|
||||||
|
)
|
||||||
|
endlocal
|
||||||
|
pause
|
||||||
@@ -28,7 +28,7 @@ public class DataBaseManager : IDataBaseManager, ITransient
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化客户端.
|
/// 初始化客户端.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static SqlSugarScope? _sqlSugarClient;
|
private static SqlSugarScope _sqlSugarClient;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用户管理器.
|
/// 用户管理器.
|
||||||
@@ -785,7 +785,7 @@ public class DataBaseManager : IDataBaseManager, ITransient
|
|||||||
sb.Append(@"select a.relname F_TABLE,a.n_live_tup F_SUM,b.description F_TABLENAME from sys_stat_user_tables a left outer join sys_description b on a.relid = b.objoid where a.schemaname='public' and b.objsubid='0'");
|
sb.Append(@"select a.relname F_TABLE,a.n_live_tup F_SUM,b.description F_TABLENAME from sys_stat_user_tables a left outer join sys_description b on a.relid = b.objoid where a.schemaname='public' and b.objsubid='0'");
|
||||||
break;
|
break;
|
||||||
case "postgresql":
|
case "postgresql":
|
||||||
sb.Append(@"select cast(relname as varchar) as F_TABLE,reltuples as F_SUM, cast(obj_description(relfilenode,'pg_class') as varchar) as F_TABLENAME from pg_class c inner join pg_namespace n on n.oid = c.relnamespace and nspname='public' inner join pg_tables z on z.tablename=c.relname where relkind = 'r' and relname not like 'pg_%' and relname not like 'sql_%' and schemaname='public' order by relname");
|
sb.Append(@"select cast(relname as varchar) as F_TABLE, cast(reltuples as varchar) as F_SUM, cast(obj_description(relfilenode,'pg_class') as varchar) as F_TABLENAME from pg_class c inner join pg_namespace n on n.oid = c.relnamespace and nspname='public' inner join pg_tables z on z.tablename=c.relname where relkind = 'r' and relname not like 'pg_%' and relname not like 'sql_%' and schemaname='public' order by relname");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Exception("不支持");
|
throw new Exception("不支持");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using JNPF.Common.Cache;
|
using JNPF.Common.Cache;
|
||||||
|
using JNPF.Common.Const;
|
||||||
|
using JNPF.FriendlyException;
|
||||||
using Yitter.IdGenerator;
|
using Yitter.IdGenerator;
|
||||||
|
|
||||||
namespace JNPF.Common.Security;
|
namespace JNPF.Common.Security;
|
||||||
@@ -9,59 +11,56 @@ namespace JNPF.Common.Security;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class SnowflakeIdHelper
|
public class SnowflakeIdHelper
|
||||||
{
|
{
|
||||||
// 定义dll路径
|
// 定义dll路径
|
||||||
public const string RegWorkerId_DLL_NAME = "lib\\regworkerid_lib_v1.3.1\\yitidgengo.dll";
|
public const string RegWorkerId_DLL_NAME = "lib\\regworkerid_lib_v1.3.1\\yitidgengo.dll";
|
||||||
|
|
||||||
// 根据文档定义三个接口
|
// 根据文档定义三个接口
|
||||||
|
|
||||||
// 注册一个 WorkerId,会先注销所有本机已注册的记录
|
// 注册一个 WorkerId,会先注销所有本机已注册的记录
|
||||||
// ip: redis 服务器地址
|
// ip: redis 服务器地址
|
||||||
// port: redis 端口
|
// port: redis 端口
|
||||||
// password: redis 访问密码,可为空字符串“”
|
// password: redis 访问密码,可为空字符串“”
|
||||||
// maxWorkerId: 最大 WorkerId
|
// maxWorkerId: 最大 WorkerId
|
||||||
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "RegisterOne", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
|
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "RegisterOne", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
|
||||||
private static extern ushort RegisterOne(string ip, int port, string password, int maxWorkerId);
|
private static extern ushort RegisterOne(string ip, int port, string password, int maxWorkerId);
|
||||||
|
|
||||||
// 注销本机已注册的 WorkerId
|
// 注销本机已注册的 WorkerId
|
||||||
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "UnRegister", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
|
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "UnRegister", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
|
||||||
private static extern void UnRegister();
|
private static extern void UnRegister();
|
||||||
|
|
||||||
// 检查本地WorkerId是否有效(0-有效,其它-无效)
|
// 检查本地WorkerId是否有效(0-有效,其它-无效)
|
||||||
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "Validate", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
|
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "Validate", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
|
||||||
private static extern int Validate(int workerId);
|
private static extern int Validate(int workerId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 缓存配置.
|
/// 初始化YitId配置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static CacheOptions _cacheOptions = App.GetConfig<CacheOptions>("Cache", true);
|
public static void InitYitIdWorker()
|
||||||
|
{
|
||||||
/// <summary>
|
//var option = new IdGeneratorOptions
|
||||||
/// 生成ID.
|
//{
|
||||||
/// </summary>
|
// WorkerId = 1, //必须 全局唯一,必须 程序设定,理论最大值 2^WorkerIdBitLength-1
|
||||||
/// <returns></returns>
|
// //BaseTime = new DateTime(2023, 1, 1, 0, 0, 0, DateTimeKind.Utc), //用生成ID时的系统时间与基础时间的差值(毫秒数)作为生成ID的时间戳
|
||||||
public static string NextId()
|
// WorkerIdBitLength = 16, //机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 16]
|
||||||
|
// //SeqBitLength = 4, //序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒基础生成的ID个数
|
||||||
|
// //MinSeqNumber = 5, //最小序列数,默认值5,取值范围 [5, MaxSeqNumber]
|
||||||
|
// //MaxSeqNumber 最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0
|
||||||
|
//};
|
||||||
|
var option = App.GetConfig<IdGeneratorOptions>("YitId");
|
||||||
|
if (option.WorkerId == 0)
|
||||||
{
|
{
|
||||||
// 这个if判断在高并发的情况下可能会有问题
|
CacheOptions _cacheOptions = App.GetConfig<CacheOptions>("Cache", true);
|
||||||
if (YitIdHelper.IdGenInstance == null)
|
option.WorkerId = RegisterOne(_cacheOptions.ip, _cacheOptions.port, _cacheOptions.password, 63);
|
||||||
{
|
|
||||||
UnRegister();
|
|
||||||
|
|
||||||
// 如果不用自动注册WorkerId的话,直接传一个数值就可以了
|
|
||||||
var workerId = RegisterOne(_cacheOptions.ip, _cacheOptions.port, _cacheOptions.password, 63);
|
|
||||||
|
|
||||||
// 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId:
|
|
||||||
var options = new IdGeneratorOptions(workerId);
|
|
||||||
options.WorkerIdBitLength = 16; // 默认值6,限定 WorkerId 最大值为2^6-1,即默认最多支持64个节点。
|
|
||||||
options.SeqBitLength = 6; // 默认值6,限制每毫秒生成的ID个数。若生成速度超过5万个/秒,建议加大 SeqBitLength 到 10。
|
|
||||||
// options.BaseTime = Your_Base_Time; // 如果要兼容老系统的雪花算法,此处应设置为老系统的BaseTime。
|
|
||||||
// ...... 其它参数参考 IdGeneratorOptions 定义。
|
|
||||||
|
|
||||||
// 保存参数(务必调用,否则参数设置不生效):
|
|
||||||
YitIdHelper.SetIdGenerator(options);
|
|
||||||
|
|
||||||
// 以上过程只需全局一次,且应在生成ID之前完成。
|
|
||||||
}
|
|
||||||
|
|
||||||
return YitIdHelper.NextId().ToString();
|
|
||||||
}
|
}
|
||||||
|
YitIdHelper.SetIdGenerator(option);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成ID.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string NextId()
|
||||||
|
{
|
||||||
|
return YitIdHelper.NextId().ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,12 +17,16 @@
|
|||||||
<PackageReference Include="System.Diagnostics.PerformanceCounter" Version="6.0.0" />
|
<PackageReference Include="System.Diagnostics.PerformanceCounter" Version="6.0.0" />
|
||||||
<PackageReference Include="System.Management" Version="6.0.0" />
|
<PackageReference Include="System.Management" Version="6.0.0" />
|
||||||
<PackageReference Include="NPOI" Version="2.5.5" />
|
<PackageReference Include="NPOI" Version="2.5.5" />
|
||||||
<PackageReference Include="Tnb.SqlSugar" Version="2023.3.10.2014" />
|
|
||||||
<PackageReference Include="UAParser" Version="3.1.47" />
|
<PackageReference Include="UAParser" Version="3.1.47" />
|
||||||
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
|
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
|
||||||
<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.0" />
|
<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Tnb.SqlSugar" Version="2023.3.14.2031" />
|
||||||
|
<!--<ProjectReference Include="..\..\..\Tnb.Core\src\Tnb.SqlSugar\Tnb.SqlSugar.csproj" />-->
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<!--<ItemGroup>
|
<!--<ItemGroup>
|
||||||
<PackageReference Update="Roslynator.Analyzers" Version="4.1.0">
|
<PackageReference Update="Roslynator.Analyzers" Version="4.1.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
|||||||
@@ -33,309 +33,309 @@ namespace JNPF.Systems;
|
|||||||
[Route("api/system/[controller]")]
|
[Route("api/system/[controller]")]
|
||||||
public class DataBaseService : IDynamicApiController, ITransient
|
public class DataBaseService : IDynamicApiController, ITransient
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 服务基础仓储.
|
/// 服务基础仓储.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly ISqlSugarRepository<DbLinkEntity> _repository;
|
public readonly ISqlSugarRepository<DbLinkEntity> _repository;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 数据连接服务.
|
/// 数据连接服务.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly IDbLinkService _dbLinkService;
|
private readonly IDbLinkService _dbLinkService;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件服务.
|
/// 文件服务.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly IFileManager _fileManager;
|
private readonly IFileManager _fileManager;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 数据库管理.
|
/// 数据库管理.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly IDataBaseManager _dataBaseManager;
|
private readonly IDataBaseManager _dataBaseManager;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用户管理.
|
/// 用户管理.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化一个<see cref="DataBaseService"/>类型的新实例.
|
/// 初始化一个<see cref="DataBaseService"/>类型的新实例.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DataBaseService(
|
public DataBaseService(
|
||||||
ISqlSugarRepository<DbLinkEntity> repository,
|
ISqlSugarRepository<DbLinkEntity> repository,
|
||||||
IDbLinkService dbLinkService,
|
IDbLinkService dbLinkService,
|
||||||
IFileManager fileManager,
|
IFileManager fileManager,
|
||||||
IDataBaseManager dataBaseManager,
|
IDataBaseManager dataBaseManager,
|
||||||
IUserManager userManager)
|
IUserManager userManager)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
_dbLinkService = dbLinkService;
|
||||||
|
_fileManager = fileManager;
|
||||||
|
_dataBaseManager = dataBaseManager;
|
||||||
|
_userManager = userManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region GET
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表名列表.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">连接Id.</param>
|
||||||
|
/// <param name="input">过滤条件.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{id}/Tables")]
|
||||||
|
public async Task<dynamic> GetList(string id, [FromQuery] KeywordInput input)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(id);
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var tables = _dataBaseManager.GetDBTableList(tenantLink);
|
||||||
|
//tables = tables.Where((x, i) => tables.FindIndex(z => z.Name == x.Name) == i).ToList();
|
||||||
|
//var output = tables.Adapt<List<DatabaseTableListOutput>>();
|
||||||
|
if (!string.IsNullOrEmpty(input.keyword))
|
||||||
|
tables = tables.FindAll(d => d.table.ToLower().Contains(input.keyword.ToLower()) || (d.tableName.IsNotEmptyOrNull() && d.tableName.ToLower().Contains(input.keyword.ToLower())));
|
||||||
|
if (tenantLink.DbType.ToLower().Equals("dm"))
|
||||||
{
|
{
|
||||||
_repository = repository;
|
GetTableCount(tables, tenantLink);
|
||||||
_dbLinkService = dbLinkService;
|
}
|
||||||
_fileManager = fileManager;
|
return new { list = tables.OrderBy(x => x.table).ToList() };
|
||||||
_dataBaseManager = dataBaseManager;
|
//try
|
||||||
_userManager = userManager;
|
//{
|
||||||
|
//}
|
||||||
|
//catch (Exception ex)
|
||||||
|
//{
|
||||||
|
// return new { list = new List<DatabaseTableListOutput>() };
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预览数据.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">请求参数.</param>
|
||||||
|
/// <param name="linkId">连接Id.</param>
|
||||||
|
/// <param name="tableName">表名.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{linkId}/Table/{tableName}/Preview")]
|
||||||
|
public async Task<dynamic> GetData([FromQuery] DatabaseTablePreviewQuery input, string linkId, string tableName)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
StringBuilder dbSql = new StringBuilder();
|
||||||
|
dbSql.AppendFormat("SELECT * FROM {0} WHERE 1=1", tableName);
|
||||||
|
if (!string.IsNullOrEmpty(input.field) && !string.IsNullOrEmpty(input.keyword))
|
||||||
|
dbSql.AppendFormat(" AND {0} like '%{1}%'", input.field, input.keyword);
|
||||||
|
|
||||||
|
return await _dataBaseManager.GetDataTablePage(tenantLink, dbSql.ToString(), input.currentPage, input.pageSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字段列表.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="linkId">连接Id.</param>
|
||||||
|
/// <param name="tableName">表名.</param>
|
||||||
|
/// <param name="type">字段类型.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{linkId}/Tables/{tableName}/Fields")]
|
||||||
|
public async Task<dynamic> GetFieldList(string linkId, string tableName, [FromQuery] string type)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var data = _dataBaseManager.GetFieldList(tenantLink, tableName).Adapt<List<TableFieldOutput>>();
|
||||||
|
if (type.Equals("1"))
|
||||||
|
{
|
||||||
|
data.ForEach(item =>
|
||||||
|
{
|
||||||
|
item.field = item.field.ReplaceRegex("^f_", string.Empty).ParseToPascalCase().ToLowerCase();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#region GET
|
return new { list = data };
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 表名列表.
|
/// 信息.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id">连接Id.</param>
|
/// <param name="linkId">连接Id.</param>
|
||||||
/// <param name="input">过滤条件.</param>
|
/// <param name="tableName">主键值.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{id}/Tables")]
|
[HttpGet("{linkId}/Table/{tableName}")]
|
||||||
public async Task<dynamic> GetList(string id, [FromQuery] KeywordInput input)
|
public async Task<dynamic> GetInfo(string linkId, string tableName)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var output = _dataBaseManager.GetDataBaseTableInfo(tenantLink, tableName);
|
||||||
|
var data = _dataBaseManager.GetData(tenantLink, tableName);
|
||||||
|
output.hasTableData = data.Rows.Count > 0;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取数据库表字段下拉框列表(弃用).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="linkId">连接Id.</param>
|
||||||
|
/// <param name="tableName">表名.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{linkId}/Tables/{tableName}/Fields/Selector")]
|
||||||
|
public async Task<dynamic> SelectorData(string linkId, string tableName)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var data = _dataBaseManager.GetDBTableList(tenantLink).FindAll(m => m.table == tableName).Adapt<List<DatabaseTableFieldsSelectorOutput>>();
|
||||||
|
return new { list = data };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 导出.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="linkId">连接ID.</param>
|
||||||
|
/// <param name="tableName">表名称.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{linkId}/Table/{tableName}/Action/Export")]
|
||||||
|
public async Task<dynamic> ActionsExport(string linkId, string tableName)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var data = _dataBaseManager.GetDataBaseTableInfo(tenantLink, tableName);
|
||||||
|
var jsonStr = data.ToJsonString();
|
||||||
|
return await _fileManager.Export(jsonStr, data.tableInfo.table, ExportFileType.bdb);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region POST
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="linkId">连接Id.</param>
|
||||||
|
/// <param name="tableName">表名.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpDelete("{linkId}/Table/{tableName}")]
|
||||||
|
[UnitOfWork]
|
||||||
|
public async Task Delete(string linkId, string tableName)
|
||||||
|
{
|
||||||
|
if (IsSysTable(tableName))
|
||||||
|
throw Oops.Oh(ErrorCode.D1504);
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var data = _dataBaseManager.GetData(tenantLink, tableName);
|
||||||
|
if (data.Rows.Count > 0)
|
||||||
|
throw Oops.Oh(ErrorCode.D1508);
|
||||||
|
if (!_dataBaseManager.Delete(tenantLink, tableName))
|
||||||
|
throw Oops.Oh(ErrorCode.D1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 新建.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="linkId">连接Id.</param>
|
||||||
|
/// <param name="input">请求参数.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("{linkId}/Table")]
|
||||||
|
[UnitOfWork]
|
||||||
|
public async Task Create(string linkId, [FromBody] DatabaseTableInfoOutput input)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
if (_dataBaseManager.IsAnyTable(tenantLink, input.tableInfo.newTable))
|
||||||
|
throw Oops.Oh(ErrorCode.D1503);
|
||||||
|
var tableInfo = input.tableInfo.Adapt<DbTableModel>();
|
||||||
|
tableInfo.table = input.tableInfo.newTable;
|
||||||
|
var tableFieldList = input.tableFieldList.Adapt<List<DbTableFieldModel>>();
|
||||||
|
if (!await _dataBaseManager.Create(tenantLink, tableInfo, tableFieldList))
|
||||||
|
throw Oops.Oh(ErrorCode.D1501);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 更新.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="linkId">连接Id.</param>
|
||||||
|
/// <param name="input">请求参数.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPut("{linkId}/Table")]
|
||||||
|
[UnitOfWork]
|
||||||
|
public async Task Update(string linkId, [FromBody] DatabaseTableUpInput input)
|
||||||
|
{
|
||||||
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
|
var oldFieldList = _dataBaseManager.GetFieldList(tenantLink, input.tableInfo.table).Adapt<List<TableFieldOutput>>();
|
||||||
|
oldFieldList = _dataBaseManager.ViewDataTypeConversion(oldFieldList, _dataBaseManager.ToDbType(tenantLink.DbType));
|
||||||
|
var oldTableInfo = _dataBaseManager.GetDBTableList(tenantLink).Find(m => m.table == input.tableInfo.table).Adapt<DbTableModel>();
|
||||||
|
var data = _dataBaseManager.GetData(tenantLink, input.tableInfo.table);
|
||||||
|
if (data.Rows.Count > 0)
|
||||||
|
throw Oops.Oh(ErrorCode.D1508);
|
||||||
|
var tableInfo = input.tableInfo.Adapt<DbTableModel>();
|
||||||
|
tableInfo.table = input.tableInfo.newTable;
|
||||||
|
if (IsSysTable(tableInfo.table))
|
||||||
|
throw Oops.Oh(ErrorCode.D1504);
|
||||||
|
var tableFieldList = input.tableFieldList.Adapt<List<DbTableFieldModel>>();
|
||||||
|
if (!input.tableInfo.table.Equals(input.tableInfo.newTable) && _dataBaseManager.IsAnyTable(tenantLink, input.tableInfo.newTable))
|
||||||
|
throw Oops.Oh(ErrorCode.D1503);
|
||||||
|
if (!await _dataBaseManager.Update(tenantLink, input.tableInfo.table, tableInfo, tableFieldList))
|
||||||
{
|
{
|
||||||
try
|
await _dataBaseManager.Create(tenantLink, oldTableInfo, oldFieldList.Adapt<List<DbTableFieldModel>>());
|
||||||
{
|
throw Oops.Oh(ErrorCode.D1502);
|
||||||
var link = await _dbLinkService.GetInfo(id);
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var tables = _dataBaseManager.GetDBTableList(tenantLink);
|
|
||||||
//tables = tables.Where((x, i) => tables.FindIndex(z => z.Name == x.Name) == i).ToList();
|
|
||||||
//var output = tables.Adapt<List<DatabaseTableListOutput>>();
|
|
||||||
if (!string.IsNullOrEmpty(input.keyword))
|
|
||||||
tables = tables.FindAll(d => d.table.ToLower().Contains(input.keyword.ToLower()) || (d.tableName.IsNotEmptyOrNull() && d.tableName.ToLower().Contains(input.keyword.ToLower())));
|
|
||||||
if (tenantLink.DbType.ToLower().Equals("dm"))
|
|
||||||
{
|
|
||||||
GetTableCount(tables, tenantLink);
|
|
||||||
}
|
|
||||||
return new { list = tables.OrderBy(x => x.table).ToList() };
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return new { list = new List<DatabaseTableListOutput>() };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 预览数据.
|
/// 更新.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input">请求参数.</param>
|
/// <param name="linkId">连接Id.</param>
|
||||||
/// <param name="linkId">连接Id.</param>
|
/// <param name="input">请求参数.</param>
|
||||||
/// <param name="tableName">表名.</param>
|
/// <returns></returns>
|
||||||
/// <returns></returns>
|
[HttpPut("{linkId}/addFields")]
|
||||||
[HttpGet("{linkId}/Table/{tableName}/Preview")]
|
[UnitOfWork]
|
||||||
public async Task<dynamic> GetData([FromQuery] DatabaseTablePreviewQuery input, string linkId, string tableName)
|
public async Task AddFields(string linkId, [FromBody] DatabaseTableUpInput input)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
var link = await _dbLinkService.GetInfo(linkId);
|
||||||
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
_dataBaseManager.AddTableColumn(tenantLink, input.tableInfo.table, input.tableFieldList.Adapt<List<DbTableFieldModel>>());
|
||||||
StringBuilder dbSql = new StringBuilder();
|
|
||||||
dbSql.AppendFormat("SELECT * FROM {0} WHERE 1=1", tableName);
|
|
||||||
if (!string.IsNullOrEmpty(input.field) && !string.IsNullOrEmpty(input.keyword))
|
|
||||||
dbSql.AppendFormat(" AND {0} like '%{1}%'", input.field, input.keyword);
|
|
||||||
|
|
||||||
return await _dataBaseManager.GetDataTablePage(tenantLink, dbSql.ToString(), input.currentPage, input.pageSize);
|
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
/// <summary>
|
|
||||||
/// 字段列表.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接Id.</param>
|
|
||||||
/// <param name="tableName">表名.</param>
|
|
||||||
/// <param name="type">字段类型.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("{linkId}/Tables/{tableName}/Fields")]
|
|
||||||
public async Task<dynamic> GetFieldList(string linkId, string tableName, [FromQuery] string type)
|
|
||||||
{
|
{
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
throw Oops.Oh(ErrorCode.D1510);
|
||||||
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var data = _dataBaseManager.GetFieldList(tenantLink, tableName).Adapt<List<TableFieldOutput>>();
|
|
||||||
if (type.Equals("1"))
|
|
||||||
{
|
|
||||||
data.ForEach(item =>
|
|
||||||
{
|
|
||||||
item.field = item.field.ReplaceRegex("^f_", string.Empty).ParseToPascalCase().ToLowerCase();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return new { list = data };
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 信息.
|
/// 导入.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="linkId">连接Id.</param>
|
/// <param name="linkid"></param>
|
||||||
/// <param name="tableName">主键值.</param>
|
/// <param name="file"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{linkId}/Table/{tableName}")]
|
[HttpPost("{linkid}/Action/Import")]
|
||||||
public async Task<dynamic> GetInfo(string linkId, string tableName)
|
public async Task ActionsImport(string linkid, IFormFile file)
|
||||||
|
{
|
||||||
|
var fileType = Path.GetExtension(file.FileName).Replace(".", string.Empty);
|
||||||
|
if (!fileType.ToLower().Equals(ExportFileType.bdb.ToString()))
|
||||||
|
throw Oops.Oh(ErrorCode.D3006);
|
||||||
|
var josn = _fileManager.Import(file);
|
||||||
|
var data = josn.ToObject<DatabaseTableInfoOutput>();
|
||||||
|
if (data == null || data.tableFieldList == null || data.tableInfo == null)
|
||||||
|
throw Oops.Oh(ErrorCode.D3006);
|
||||||
|
data.tableInfo.newTable = data.tableInfo.table;
|
||||||
|
await Create(linkid, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region PrivateMethod
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否系统表.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="table"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private bool IsSysTable(string table)
|
||||||
|
{
|
||||||
|
string[] byoTable =
|
||||||
{
|
{
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var output = _dataBaseManager.GetDataBaseTableInfo(tenantLink, tableName);
|
|
||||||
var data = _dataBaseManager.GetData(tenantLink, tableName);
|
|
||||||
output.hasTableData = data.Rows.Count > 0;
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取数据库表字段下拉框列表(弃用).
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接Id.</param>
|
|
||||||
/// <param name="tableName">表名.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("{linkId}/Tables/{tableName}/Fields/Selector")]
|
|
||||||
public async Task<dynamic> SelectorData(string linkId, string tableName)
|
|
||||||
{
|
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
if (string.IsNullOrEmpty(tableName)) return new PageResult();
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var data = _dataBaseManager.GetDBTableList(tenantLink).FindAll(m => m.table == tableName).Adapt<List<DatabaseTableFieldsSelectorOutput>>();
|
|
||||||
return new { list = data };
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 导出.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接ID.</param>
|
|
||||||
/// <param name="tableName">表名称.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("{linkId}/Table/{tableName}/Action/Export")]
|
|
||||||
public async Task<dynamic> ActionsExport(string linkId, string tableName)
|
|
||||||
{
|
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var data = _dataBaseManager.GetDataBaseTableInfo(tenantLink, tableName);
|
|
||||||
var jsonStr = data.ToJsonString();
|
|
||||||
return await _fileManager.Export(jsonStr, data.tableInfo.table, ExportFileType.bdb);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region POST
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接Id.</param>
|
|
||||||
/// <param name="tableName">表名.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpDelete("{linkId}/Table/{tableName}")]
|
|
||||||
[UnitOfWork]
|
|
||||||
public async Task Delete(string linkId, string tableName)
|
|
||||||
{
|
|
||||||
if (IsSysTable(tableName))
|
|
||||||
throw Oops.Oh(ErrorCode.D1504);
|
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var data = _dataBaseManager.GetData(tenantLink, tableName);
|
|
||||||
if (data.Rows.Count > 0)
|
|
||||||
throw Oops.Oh(ErrorCode.D1508);
|
|
||||||
if (!_dataBaseManager.Delete(tenantLink, tableName))
|
|
||||||
throw Oops.Oh(ErrorCode.D1500);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 新建.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接Id.</param>
|
|
||||||
/// <param name="input">请求参数.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("{linkId}/Table")]
|
|
||||||
[UnitOfWork]
|
|
||||||
public async Task Create(string linkId, [FromBody] DatabaseTableInfoOutput input)
|
|
||||||
{
|
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
if (_dataBaseManager.IsAnyTable(tenantLink, input.tableInfo.newTable))
|
|
||||||
throw Oops.Oh(ErrorCode.D1503);
|
|
||||||
var tableInfo = input.tableInfo.Adapt<DbTableModel>();
|
|
||||||
tableInfo.table = input.tableInfo.newTable;
|
|
||||||
var tableFieldList = input.tableFieldList.Adapt<List<DbTableFieldModel>>();
|
|
||||||
if (!await _dataBaseManager.Create(tenantLink, tableInfo, tableFieldList))
|
|
||||||
throw Oops.Oh(ErrorCode.D1501);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 更新.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接Id.</param>
|
|
||||||
/// <param name="input">请求参数.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPut("{linkId}/Table")]
|
|
||||||
[UnitOfWork]
|
|
||||||
public async Task Update(string linkId, [FromBody] DatabaseTableUpInput input)
|
|
||||||
{
|
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
var oldFieldList = _dataBaseManager.GetFieldList(tenantLink, input.tableInfo.table).Adapt<List<TableFieldOutput>>();
|
|
||||||
oldFieldList = _dataBaseManager.ViewDataTypeConversion(oldFieldList, _dataBaseManager.ToDbType(tenantLink.DbType));
|
|
||||||
var oldTableInfo = _dataBaseManager.GetDBTableList(tenantLink).Find(m => m.table == input.tableInfo.table).Adapt<DbTableModel>();
|
|
||||||
var data = _dataBaseManager.GetData(tenantLink, input.tableInfo.table);
|
|
||||||
if (data.Rows.Count > 0)
|
|
||||||
throw Oops.Oh(ErrorCode.D1508);
|
|
||||||
var tableInfo = input.tableInfo.Adapt<DbTableModel>();
|
|
||||||
tableInfo.table = input.tableInfo.newTable;
|
|
||||||
if (IsSysTable(tableInfo.table))
|
|
||||||
throw Oops.Oh(ErrorCode.D1504);
|
|
||||||
var tableFieldList = input.tableFieldList.Adapt<List<DbTableFieldModel>>();
|
|
||||||
if (!input.tableInfo.table.Equals(input.tableInfo.newTable) && _dataBaseManager.IsAnyTable(tenantLink, input.tableInfo.newTable))
|
|
||||||
throw Oops.Oh(ErrorCode.D1503);
|
|
||||||
if (!await _dataBaseManager.Update(tenantLink, input.tableInfo.table, tableInfo, tableFieldList))
|
|
||||||
{
|
|
||||||
await _dataBaseManager.Create(tenantLink, oldTableInfo, oldFieldList.Adapt<List<DbTableFieldModel>>());
|
|
||||||
throw Oops.Oh(ErrorCode.D1502);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 更新.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkId">连接Id.</param>
|
|
||||||
/// <param name="input">请求参数.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPut("{linkId}/addFields")]
|
|
||||||
[UnitOfWork]
|
|
||||||
public async Task AddFields(string linkId, [FromBody] DatabaseTableUpInput input)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var link = await _dbLinkService.GetInfo(linkId);
|
|
||||||
var tenantLink = link ?? _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
|
|
||||||
_dataBaseManager.AddTableColumn(tenantLink, input.tableInfo.table, input.tableFieldList.Adapt<List<DbTableFieldModel>>());
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw Oops.Oh(ErrorCode.D1510);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 导入.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="linkid"></param>
|
|
||||||
/// <param name="file"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("{linkid}/Action/Import")]
|
|
||||||
public async Task ActionsImport(string linkid, IFormFile file)
|
|
||||||
{
|
|
||||||
var fileType = Path.GetExtension(file.FileName).Replace(".", string.Empty);
|
|
||||||
if (!fileType.ToLower().Equals(ExportFileType.bdb.ToString()))
|
|
||||||
throw Oops.Oh(ErrorCode.D3006);
|
|
||||||
var josn = _fileManager.Import(file);
|
|
||||||
var data = josn.ToObject<DatabaseTableInfoOutput>();
|
|
||||||
if (data == null || data.tableFieldList == null || data.tableInfo == null)
|
|
||||||
throw Oops.Oh(ErrorCode.D3006);
|
|
||||||
data.tableInfo.newTable = data.tableInfo.table;
|
|
||||||
await Create(linkid, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region PrivateMethod
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否系统表.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="table"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private bool IsSysTable(string table)
|
|
||||||
{
|
|
||||||
string[] byoTable =
|
|
||||||
{
|
|
||||||
"base_appdata",
|
"base_appdata",
|
||||||
"base_authorize",
|
"base_authorize",
|
||||||
"base_billrule",
|
"base_billrule",
|
||||||
@@ -476,28 +476,28 @@ public class DataBaseService : IDynamicApiController, ITransient
|
|||||||
"wform_warehousereceiptentry",
|
"wform_warehousereceiptentry",
|
||||||
"wform_workcontactsheet"
|
"wform_workcontactsheet"
|
||||||
};
|
};
|
||||||
return ((IList)byoTable).Contains(table.ToLower());
|
return ((IList)byoTable).Contains(table.ToLower());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取表条数.
|
/// 获取表条数.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="tableList"></param>
|
/// <param name="tableList"></param>
|
||||||
private void GetTableCount(List<DatabaseTableListOutput> tableList, DbLinkEntity link)
|
private void GetTableCount(List<DatabaseTableListOutput> tableList, DbLinkEntity link)
|
||||||
|
{
|
||||||
|
var _sqlSugarClient = _dataBaseManager.ChangeDataBase(link);
|
||||||
|
foreach (var item in tableList)
|
||||||
{
|
{
|
||||||
var _sqlSugarClient = _dataBaseManager.ChangeDataBase(link);
|
try
|
||||||
foreach (var item in tableList)
|
{
|
||||||
{
|
item.sum = _sqlSugarClient.Queryable<dynamic>().AS(item.table).Count();
|
||||||
try
|
}
|
||||||
{
|
catch (Exception ex)
|
||||||
item.sum = _sqlSugarClient.Queryable<dynamic>().AS(item.table).Count();
|
{
|
||||||
}
|
item.sum = 0;
|
||||||
catch (Exception ex)
|
}
|
||||||
{
|
|
||||||
item.sum = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -166,11 +166,11 @@ public class FlowTemplateService : IFlowTemplateService, IDynamicApiController,
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input">请求参数.</param>
|
/// <param name="input">请求参数.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{id}/FlowJsonList")]
|
[HttpGet("FlowJsonList/{id}")]
|
||||||
public async Task<dynamic> GetFlowJsonList(string id, [FromQuery] FlowTemplateListQuery input)
|
public async Task<dynamic> GetFlowJsonList(string id, [FromQuery] FlowTemplateListQuery input)
|
||||||
{
|
{
|
||||||
var whereLambda = LinqExpression.And<FlowTemplateJsonEntity>();
|
var whereLambda = LinqExpression.And<FlowTemplateJsonEntity>();
|
||||||
whereLambda = whereLambda.And(x => x.DeleteMark == null && x.TemplateId == id);
|
whereLambda = whereLambda.And(x => x.DeleteMark == null && x.Id == id);
|
||||||
var start = new DateTime();
|
var start = new DateTime();
|
||||||
var end = new DateTime();
|
var end = new DateTime();
|
||||||
if (input.endTime != null && input.startTime != null)
|
if (input.endTime != null && input.startTime != null)
|
||||||
|
|||||||
Reference in New Issue
Block a user