using NCC.Common.Enum; using NCC.Dependency; using NCC.DynamicApiController; using NCC.FriendlyException; using NCC.VisualData.Entity; using NCC.VisualData.Entitys.Dto.ScreenDataSource; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NCC.VisualData { /// /// 业务实现:大屏 /// [ApiDescriptionSettings(Tag = "BladeVisual", Name = "db", Order = 160)] [Route("api/blade-visual/[controller]")] public class ScreenDataSourceService : IDynamicApiController, ITransient { private readonly ISqlSugarRepository _visualDBRepository; /// /// 初始化一个类型的新实例 /// public ScreenDataSourceService(ISqlSugarRepository visualDBRepository) { _visualDBRepository = visualDBRepository; } #region Get /// /// 分页 /// /// [HttpGet("list")] public async Task GetList([FromQuery] ScreenDataSourceListQueryInput input) { var data = await _visualDBRepository.Entities.Select(v => new { id = v.Id, name = v.Name, driverClass = v.DriverClass, password = v.Password, remark = v.Remark, url = v.Url, username = v.UserName, isDeleted = v.IsDeleted }).MergeTable().Select().Where(v => v.isDeleted.Equals(0)).ToPagedListAsync(input.current, input.size); return new { current = data.pagination.PageIndex, pages = data.pagination.Total / data.pagination.PageSize, records = data.list, size = data.pagination.PageSize, total = data.pagination.Total }; } /// /// 详情 /// /// [HttpGet("detail")] public async Task GetInfo(string id) { var entity = await _visualDBRepository.SingleAsync(v => v.Id == id && v.IsDeleted == "0"); var data = entity.Adapt(); return data; } /// /// 下拉数据源 /// /// [HttpGet("db-list")] public async Task GetDBList() { var data = await _visualDBRepository.Entities.Select(v => new { id = v.Id, name = v.Name, driverClass = v.DriverClass }).MergeTable().Select().ToListAsync(); return data; } #endregion #region Post /// /// 新增与修改 /// /// [HttpPost("submit")] public async Task Submit([FromBody] ScreenDataSourceUpInput input) { var entity = input.Adapt(); var isOk = 0; if (input.id == null) isOk = await _visualDBRepository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteCommandAsync(); else isOk = await _visualDBRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000); } /// /// 新增 /// /// /// [HttpPost("save")] public async Task Create([FromBody] ScreenDataSourceCrInput input) { var entity = input.Adapt(); var isOk = await _visualDBRepository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000); } /// /// 修改 /// /// /// [HttpPost("update")] public async Task Update([FromBody] ScreenDataSourceUpInput input) { var entity = input.Adapt(); var isOk = await _visualDBRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); } /// /// 删除 /// /// [HttpPost("remove")] public async Task Delete(string ids) { var entity = await _visualDBRepository.SingleAsync(v => v.Id == ids && v.IsDeleted == "0"); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); var isOk = await _visualDBRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002); } /// /// 数据源测试连接 /// /// [HttpPost("db-test")] public dynamic Test([FromBody] ScreenDataSourceUpInput input) { try { var db = _visualDBRepository.Context; db.AddConnection(new ConnectionConfig() { ConfigId = input.id, DbType = ToDbTytpe(input.driverClass), ConnectionString = ToConnectionString(input.driverClass, input.url, input.name, input.password), InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true }); db.ChangeDatabase(input.id); db.Open(); db.Close(); return Task.FromResult(true); } catch (Exception) { throw NCCException.Oh(ErrorCode.D1507); } } /// /// 动态执行SQL /// /// [HttpPost("dynamic-query")] public async Task Query([FromBody] ScreenDataSourceDynamicQueryInput input) { var entity = await _visualDBRepository.SingleAsync(v => v.Id == input.id && v.IsDeleted == "0"); var db = _visualDBRepository.Context; db.AddConnection(new ConnectionConfig() { ConfigId = input.id, DbType = ToDbTytpe(entity.DriverClass), ConnectionString = ToConnectionString(entity.DriverClass, entity.Url, entity.UserName, entity.Password), InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true }); db.ChangeDatabase(input.id); var table = await db.Ado.GetDataTableAsync(input.sql); return table; } #endregion #region PrivateMethod /// /// 转换数据库类型 /// /// /// private SqlSugar.DbType ToDbTytpe(string dbType) { switch (dbType) { case "org.postgresql.Driver": return SqlSugar.DbType.PostgreSQL; case "com.mysql.cj.jdbc.Driver": return SqlSugar.DbType.MySql; case "oracle.jdbc.OracleDriver": return SqlSugar.DbType.Oracle; case "com.microsoft.sqlserver.jdbc.SQLServerDriver": return SqlSugar.DbType.SqlServer; default: throw NCCException.Oh(ErrorCode.D1505); } } /// /// 转换连接字符串 /// /// private string ToConnectionString(string driverClass, string url, string name, string password) { switch (driverClass) { case "org.postgresql.Driver": return string.Format(url, name, password); case "com.mysql.cj.jdbc.Driver": return string.Format(url, name, password); case "oracle.jdbc.OracleDriver": return string.Format(url, name, password); case "com.microsoft.sqlserver.jdbc.SQLServerDriver": return string.Format(url, name, password); default: throw NCCException.Oh(ErrorCode.D1505); } } #endregion } }