You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
8.2 KiB
C#

using Castle.Core.Internal;
using ClosedXML.Excel;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Wordprocessing;
using Infrastructure;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NUnit.Framework.Internal.Execution;
using OpenAuth.App.Interface;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
namespace OpenAuth.App
{
public class BasicTableService
{
ISqlSugarClient client;
IAuth auth;
public BasicTableService(ISqlSugarClient client,IAuth auth)
{
this.client = client;
this.auth = auth;
}
/// <summary>
/// 创建表
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost]
public string CreateTable([FromBody] CreateTableReq req)
{
string tableName = req.TableName;
List<TableInfo> tableInfo = req.TableInfos;
if(tableName == null||tableInfo.Count==0) {
return "数据不能为空";
}
string sql = @"CREATE TABLE ""public""." + tableName+"("+ "id varchar(255) COLLATE \"pg_catalog\".\"default\" NOT NULL,";
string explanation = "";
int type = 0;
for (int i = 0; i < tableInfo.Count; i++) {
TableInfo table = tableInfo[i];
if ("id".Equals(table.Name.ToLower())){
continue;
}
sql = sql +table.Name+" "+ table.Type;
if (!table.Name.IsNullOrEmpty()) {
explanation = explanation + "COMMENT ON COLUMN \"public\"." + tableName + "." + table.Name + " Is "+"'"+ table.Explanation+"'"+";" ;
}
if ("varchar".Equals(table.Name.ToLower())) {
sql = sql +"("+255+")";
}
if (table.Type.Contains("geom")) {
type = 1;
}
/*if (table.IsNull) {
sql = sql+" "+"NOT NUll";
}*/
sql = sql + ",";
if (tableInfo.Count-1==i) {
sql = sql + "CONSTRAINT "+ tableName +"_pkey PRIMARY KEY (\"id\"));";
}
}
Console.WriteLine(sql);
int count = client.Ado.ExecuteCommand(sql);
Console.WriteLine(count);
string sql1 = "ALTER TABLE \"public\"." + tableName+ " OWNER TO \"postgres\"";
client.Ado.ExecuteCommand(sql1);
addExplain(explanation);
SysUser user = auth.GetCurrentUser().User;
string sql22 = "insert into table_record (\"TableName\",\"Type\",\"ColumnJson\",\"CreateUser\") values('" + tableName+"'," + type+",'"+ String.Join(":",tableInfo.Select(
p=> $"{p.Name},{p.Type},{p.Explanation}"))+ "','"+user.Account+"')";
client.Ado.ExecuteCommand(sql22);
return "创建成功";
}
[HttpPost]
public string CreateView([FromBody] CreateViewReq req) {
int count = client.Ado.ExecuteCommand(req.sql);
return "创建成功";
}
[HttpPost]
public List<TableInfo> UploadExcel(UploadExcelReq req)
{
using (var workbook = new XLWorkbook(req.file.OpenReadStream())){
string tableName = req.tableName;
var wooksheet = workbook.Worksheet(1);
IXLRows row = wooksheet.RowsUsed();
List<IXLRow> rowCells = row.ToList();
IXLRow row1 = rowCells[0];
IXLCells cells = row1.CellsUsed();
string sqltable = @"CREATE TABLE if not exists ""public""." + "table_relation_record " + "(" + "id varchar(255) COLLATE \"pg_catalog\".\"default\" NOT NULL," +
"name varchar(32) COLLATE \"pg_catalog\".\"default\"," +
"relation text COLLATE \"pg_catalog\".\"default\","+
" CONSTRAINT \"table_relation_record_pkey\" PRIMARY KEY (\"id\"))\r\n;" +
"ALTER TABLE \"public\".\"table_relation_record\" OWNER TO \"postgres\";";
addExplain(sqltable);
string sql = @"CREATE TABLE ""public""." + tableName + "(" + "id varchar(255) COLLATE \"pg_catalog\".\"default\" NOT NULL,";
string explanation = "";
List<TableInfo> listTableInfo = new List<TableInfo>();
int k = 0;
JsonObject json = new JsonObject();
foreach (IXLCell cell in row1.CellsUsed())
{
if (cell.GetString().IsNullOrEmpty()) {
break;}
json.Add(cell.GetString(), "cloum" + k);
TableInfo tableInfo = new TableInfo();
tableInfo.Name = "cloum" + k;
tableInfo.Type = "varchar";
// tableInfo.Length = 255;
tableInfo.Explanation = cell.GetString();
listTableInfo.Add(tableInfo);
sql = sql + "cloum" + k + " " + "varchar(255),";
explanation = explanation + "COMMENT ON COLUMN \"public\"." + tableName + "." + "cloum" + k + " Is " + "'" + cell.GetString() + "'" + ";";
k++;
}
Dictionary<String, Object> dict = new Dictionary<String, Object>();
dict.Add("id", Guid.NewGuid());
dict.Add("name", tableName);
dict.Add("relation", json.ToJsonString());
client.Insertable(dict).AS("table_relation_record").ExecuteCommand();
sql = sql + "CONSTRAINT " + tableName + "_pkey PRIMARY KEY (\"id\"));";
string sql1 = "ALTER TABLE \"public\"." + tableName + " OWNER TO \"postgres\"";
addExplain(sql);
addExplain(sql1);
addExplain(explanation);
var count = wooksheet.RowCount();
List<Dictionary<String,Object>> listmap = new List<Dictionary<String, Object>>();
foreach (IXLRow rowValue in wooksheet.RowsUsed()) {
if (rowValue.RowNumber() == 1) {
continue;
}
Dictionary<String, Object> map = new Dictionary<String, Object>();
map.Add("id", Guid.NewGuid());
int g = 0;
foreach (IXLCell cell in rowValue.CellsUsed()) {
map.Add("cloum" + g, cell.GetString());
g++;
}
listmap.Add(map);
}
client.Insertable(listmap).AS(tableName).ExecuteCommand();
return listTableInfo;
}
}
[HttpPost]
public string UpdateTable([FromBody] CreateTableReq req)
{
List<TableInfo> infos = req.TableInfos;
string sql = "";
foreach (TableInfo info in infos) {
if (!info.YuanName.IsNullOrEmpty())
{
sql = sql + @"ALTER TABLE ""public""."+req.TableName+"RENAME COLUMN"+info.YuanName + " TO " + info.Name+ ";";
}
}
if (!sql.IsNullOrEmpty()) { addExplain(sql); }
return "创建成功";
}
public void addExplain(String sql) {
client.Ado.ExecuteCommand(sql);
}
public bool CheckTableExist(string tableName)
{
string sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = '" + tableName + "';";
int count = client.Ado.GetInt(sql);
if (count > 0)
{
return true;
}
else { return false; }
}
}
}