Infrastructure/OpenAuth.App/BaseApp/FormScheme/FormHelpers/FormHelper.cs

1445 lines
62 KiB
C#

using Infrastructure;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json.Linq;
using OpenAuth.App.FormScheme.Response;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace OpenAuth.App.FormScheme.FormHelpers
{
public static class FormHelper
{
/// <summary>
/// 获取保存sql语句
/// </summary>
/// <param name="formSchemeModel"></param>
/// <param name="dataJson"></param>
/// <param name="pkey"></param>
/// <param name="pkeyValue"></param>
/// <param name="isUpdate"></param>
/// <returns></returns>
public static List<FormDbTable> GetSaveSql(FormSchemeModel formSchemeModel, JObject dataJson, string pkey, string pkeyValue, bool isUpdate)
{
List<FormDbTable> list = new List<FormDbTable>();
// 获取主子表
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
List<FormDbTableInfo> childrenTables = formSchemeModel.Db.FindAll(t => t.Type == "chlid");
// 对表组件按表进行分类
Dictionary<string, List<FormComponentModel>> tableMap = new Dictionary<string, List<FormComponentModel>>();
Dictionary<string, FormComponentModel> girdTableMap = new Dictionary<string, FormComponentModel>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Components)
{
if (string.IsNullOrEmpty(component.Table))
{
continue;
}
if (!tableMap.ContainsKey(component.Table))
{
tableMap[component.Table] = new List<FormComponentModel>();
}
if (component.Type == "gridtable")
{
tableMap[component.Table].AddRange(component.children);
girdTableMap.Add(component.Table, component);
}
else
{
if (component.Prop == pkey)
{
pkey = component.Field;
}
tableMap[component.Table].Add(component);
}
}
}
if (isUpdate)
{
list.Add(GetUpDateSql(mainTable, tableMap, dataJson, pkey, pkeyValue));
foreach (var childTable in childrenTables)
{
if (tableMap.ContainsKey(childTable.Name))
{
var rComponent = tableMap[childTable.RelationName].Find(t => t.Field == childTable.RelationField);
if (girdTableMap.ContainsKey(childTable.Name))
{
list.Add(GetDeleteSql(childTable, dataJson, rComponent));
// 新增
FormComponentModel newComponent = new FormComponentModel();
newComponent.Prop = rComponent.Prop;
newComponent.Field = childTable.Field;
tableMap[childTable.Name].Add(newComponent);
List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name].Prop].ToString().ToObject<List<JObject>>();
foreach (var girdData in girdDataJson)
{
girdData.Add(newComponent.Prop, dataJson[newComponent.Prop]);
list.Add(GetInsertSql(childTable, tableMap, girdData));
}
}
else
{
list.Add(GetUpDateSql(childTable, tableMap, dataJson, childTable.Field, dataJson[rComponent.Prop].ToString()));
}
}
}
}
else
{
list.Add(GetInsertSql(mainTable, tableMap, dataJson));
foreach (var childTable in childrenTables)
{
var rComponent = tableMap[childTable.RelationName].Find(t => t.Field.ToLower() == childTable.RelationField.ToLower());
FormComponentModel newComponent = new FormComponentModel();
newComponent.Prop = rComponent.Prop;
newComponent.Field = childTable.Field;
tableMap[childTable.Name].Add(newComponent);
if (girdTableMap.ContainsKey(childTable.Name))
{
// 编辑表格
List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name].Prop].ToString().ToObject<List<JObject>>();
foreach (var girdData in girdDataJson)
{
girdData.Add(newComponent.Prop, dataJson[newComponent.Prop]);
list.Add(GetInsertSql(childTable, tableMap, girdData));
}
}
else
{
list.Add(GetInsertSql(childTable, tableMap, dataJson));
}
}
}
return list;
}
/// <summary>
/// 获取保存sql语句
/// </summary>
/// <param name="formSchemeModel"></param>
/// <param name="dataJson"></param>
/// <param name="pkey"></param>
/// <param name="pkeyValue"></param>
/// <param name="isUpdate"></param>
/// <returns></returns>
public static List<FormDbTable> GetSaveSqlNew(FormSchemeNewModel formSchemeModel, JObject dataJson, string pkey, string pkeyValue, bool isUpdate)
{
List<FormDbTable> list = new List<FormDbTable>();
// 获取主子表
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
List<FormDbTableInfo> childrenTables = formSchemeModel.Db.FindAll(t => t.Type == "chlid");
// 对表组件按表进行分类
Dictionary<string, List<FormComponentNewModel>> tableMap = new Dictionary<string, List<FormComponentNewModel>>();
//Dictionary<string, FormComponentNewModel> girdTableMap = new Dictionary<string, FormComponentNewModel>();
Dictionary<string, FormComponentNewModel> girdTableMap = new Dictionary<string, FormComponentNewModel>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Schemas)
{
if (component == null || component.ComponentProps == null || string.IsNullOrEmpty(component.ComponentProps.DataTable))
{
//if(component.Component == "Grid1")
//{
// foreach (var column in component.Columns)
// {
// tableMap[component.ComponentProps.DataTable].AddRange(column.children);
// }
//}
//else
//{
// continue;
//}
continue;
}
if (!tableMap.ContainsKey(component.ComponentProps.DataTable))
{
tableMap[component.ComponentProps.DataTable] = new List<FormComponentNewModel>();
}
if (component.Component == "Grid")
{
//tableMap[component.ComponentProps.DataTable].AddRange(component.children);
//girdTableMap.Add(component.ComponentProps.DataTable, component);
foreach (var column in component.Columns)
{
tableMap[component.ComponentProps.DataTable].AddRange(column.children);
//girdTableMap.Add(component.ComponentProps.DataTable, column);
if (girdTableMap.ContainsKey(component.ComponentProps.DataTable))
{
//girdTableMap[component.ComponentProps.DataTable].children.AddRange(column.children);
}
else
{
girdTableMap.Add(component.ComponentProps.DataTable, component);
}
}
}
else
{
if (component.Field == pkey)
{
pkey = component.Field;
}
tableMap[component.ComponentProps.DataTable].Add(component);
}
}
}
if (isUpdate)
{
list.Add(GetUpDateSqlNew(mainTable, tableMap, dataJson, pkey, pkeyValue));
foreach (var childTable in childrenTables)
{
if (tableMap.ContainsKey(childTable.Name))
{
var rComponent = tableMap[childTable.RelationName].Find(t => t.ComponentProps.FieldName == childTable.RelationField);
if (girdTableMap.ContainsKey(childTable.Name))
{
list.Add(GetDeleteSqlNew(childTable, dataJson, rComponent));
// 新增
FormComponentNewModel newComponent = new FormComponentNewModel();
//newComponent.ComponentProps.FieldName = rComponent.ComponentProps.FieldName;
newComponent.ComponentProps = new ComponentPropsModel();
newComponent.ComponentProps.DataTable = childTable.Name;
newComponent.ComponentProps.FieldName = childTable.Field;
//newComponent.Field = childTable.Field;
newComponent.Field = rComponent.Field;
tableMap[childTable.Name].Add(newComponent);
//for (int i = 0; i < girdTableMap[childTable.Name].Count; i++)
//{
// // 编辑表格
// List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name][i].Field].ToString().ToObject<List<JObject>>();
// foreach (var girdData in girdDataJson)
// {
// //girdData.Add(newComponent.ComponentProps.FieldName, dataJson[newComponent.ComponentProps.FieldName]);
// list.Add(GetInsertSqlNew(childTable, tableMap, girdData));
// }
//}
// List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name].ComponentProps.FieldName].ToString().ToObject<List<JObject>>();
List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name].Field].ToString().ToObject<List<JObject>>();
foreach (var girdData in girdDataJson)
{
girdData.Add(newComponent.Field, dataJson[newComponent.Field]);
list.Add(GetInsertSqlNew(childTable, tableMap, girdData));
}
}
else
{
list.Add(GetUpDateSqlNew(childTable, tableMap, dataJson, childTable.Field, dataJson[rComponent.Field].ToString()));
}
}
}
}
else
{
list.Add(GetInsertSqlNew(mainTable, tableMap, dataJson));
foreach (var childTable in childrenTables)
{
var rComponent = tableMap[childTable.RelationName].Find(t => t.ComponentProps.FieldName == childTable.RelationField);
FormComponentNewModel newComponent = new FormComponentNewModel() { };
newComponent.Field = rComponent.Field;
newComponent.ComponentProps = new ComponentPropsModel();
//newComponent.ComponentProps.DataTable = rComponent.ComponentProps.DataTable;
//newComponent.ComponentProps.FieldName = rComponent.ComponentProps.FieldName;
newComponent.ComponentProps.DataTable = childTable.Name;
newComponent.ComponentProps.FieldName = childTable.Field;
//newComponent.Field = childTable.Field;
tableMap[childTable.Name].Add(newComponent);
if (girdTableMap.ContainsKey(childTable.Name))
{
//for(int i=0;i< girdTableMap[childTable.Name].Count; i++)
//{
// // 编辑表格
// List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name][i].Field].ToString().ToObject<List<JObject>>();
// foreach (var girdData in girdDataJson)
// {
// //girdData.Add(newComponent.ComponentProps.FieldName, dataJson[newComponent.ComponentProps.FieldName]);
// list.Add(GetInsertSqlNew(childTable, tableMap, girdData));
// }
//}
List<JObject> girdDataJson = dataJson[girdTableMap[childTable.Name].Field].ToString().ToObject<List<JObject>>();
foreach (var girdData in girdDataJson)
{
girdData.Add(newComponent.Field, dataJson[newComponent.Field]);
list.Add(GetInsertSqlNew(childTable, tableMap, girdData));
}
}
else
{
list.Add(GetInsertSqlNew(childTable, tableMap, dataJson));
}
}
}
return list;
}
/// <summary>
/// 获取表单查询方法
/// </summary>
/// <param name="formSchemeModel"></param>
/// <param name="queryJson"></param>
/// <returns></returns>
public static FormDbTable GetQuerySql(FormSchemeModel formSchemeModel, string queryJson)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
StringBuilder str = new StringBuilder();
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
int mainTableIndex = formSchemeModel.Db.FindIndex(t => t.Type == "main");
if (formSchemeModel.FormType == 1)
{
str.Append($"select * from ({mainTable.Sql})t ");
}
else
{
Dictionary<string, List<FormComponentModel>> tableMap = new Dictionary<string, List<FormComponentModel>>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Components)
{
if (component.Type != "gridtable")
{
if (string.IsNullOrEmpty(component.Table))
{
continue;
}
if (!tableMap.ContainsKey(component.Table))
{
tableMap[component.Table] = new List<FormComponentModel>();
}
tableMap[component.Table].Add(component);
}
}
}
str.Append("SELECT ");
var mainComponents = tableMap[mainTable.Name];
foreach (var component in mainComponents)
{
str.Append(string.Format("t.{1} as {1}{0},", mainTableIndex, component.Field));
}
str.Append(GetQueryColumns(formSchemeModel.Db, tableMap, mainTable.Name));
str.Append("FROM ");
str.Append(string.Format("{0} t ", mainTable.Name));
str.Append(GetQueryLeftTable(formSchemeModel.Db, tableMap, mainTable.Name, mainTableIndex));
}
str.Append(" WHERE 1=1 {LEARUN_SASSID} ");
// 添加参数
// 对表组件按表进行分类
Dictionary<string, FormComponentModel> componentMap = new Dictionary<string, FormComponentModel>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Components)
{
if (string.IsNullOrEmpty(component.Table))
{
continue;
}
if (!componentMap.ContainsKey(component.Prop))
{
componentMap.Add(component.Prop, component);
}
}
}
var queryParam = queryJson.ToJObject();
int index = 0;
foreach (var item in queryParam.Properties())
{
componentMap.TryGetValue(item.Name, out var component);
if (component != null && !string.IsNullOrEmpty(component.Table) && !queryParam[component.Prop].IsEmpty())
{
int tableIndex = formSchemeModel.Db.FindIndex(t => t.Name == component.Table);
FormDbTableInfo table = formSchemeModel.Db[tableIndex];
string tIndex = tableIndex + "";
if (table.Name == mainTable.Name)
{
tIndex = "";
}
switch (component.Type)
{
case "userSelect":
case "departmentSelect":
case "companySelect":
case "company":
case "department":
case "createuser":
case "modifyuser":
case "select":
str.Append($" AND t{tIndex}.{component.Field} in ('{queryParam[component.Prop].ToString().Replace(",", "','")}') ");
break;
case "input":
case "textarea":
case "texteditor":
res.DbParameter.Add(new SugarParameter($"p_{index}", $"%{queryParam[component.Prop].ToString()}%"));
str.Append($" AND t{tIndex}.{component.Field} like @p_{index} ");
break;
case "time":
case "datetime":
case "createtime":
case "modifytime":
var value = queryParam[component.Prop].ToString().Split(" - ");
res.DbParameter.Add(GetMyDbParameter($"p_{index}", value[0], component.CsType));
res.DbParameter.Add(GetMyDbParameter($"p_{index + 1}", value[1], component.CsType));
str.Append($" AND(t{tIndex}.{component.Field} >= @p_{index} AND t{tIndex}.{component.Field} <= @p_{index + 1} ) ");
index++;
break;
default:
res.DbParameter.Add(GetMyDbParameter($"p_{index}", queryParam[component.Prop].ToString(), component.CsType));
str.Append($" AND t{tIndex}.{component.Field} = @p_{index} ");
break;
}
index++;
}
}
res.Sql = str.ToString().Replace(",FROM", " FROM");
return res;
}
public static FormDbTable GetQuerySqlNew(FormSchemeNewModel formSchemeModel, string queryJson)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
StringBuilder str = new StringBuilder();
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
int mainTableIndex = formSchemeModel.Db.FindIndex(t => t.Type == "main");
if (formSchemeModel.FormType == 1)
{
str.Append($"select * from ({mainTable.Sql})t ");
}
else
{
Dictionary<string, List<FormComponentNewModel>> tableMap = new Dictionary<string, List<FormComponentNewModel>>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Schemas)
{
if (component.Component != "Grid")
{
if (component == null || component.ComponentProps == null || string.IsNullOrEmpty(component.ComponentProps.DataTable))
{
continue;
}
if (!tableMap.ContainsKey(component.ComponentProps.DataTable))
{
tableMap[component.ComponentProps.DataTable] = new List<FormComponentNewModel>();
}
tableMap[component.ComponentProps.DataTable].Add(component);
}
}
}
str.Append("SELECT ");
var mainComponents = tableMap[mainTable.Name];
foreach (var component in mainComponents)
{
if (component.ComponentProps.FieldName == "geom")
{
str.Append(string.Format("st_astext( t{0}.\"{1}\") as \"{2}\",", mainTableIndex, component.ComponentProps.FieldName, component.Field));
}
else
{
str.Append(string.Format("t{0}.\"{1}\" as \"{2}\",", mainTableIndex, component.ComponentProps.FieldName, component.Field));
}
////str.Append(string.Format("t{0}.\"{1}\" as \"{1}{0}\",", mainTableIndex, component.ComponentProps.FieldName));
//str.Append(string.Format("t{0}.\"{1}\" as \"{2}\",", mainTableIndex, component.ComponentProps.FieldName, component.Field));
}
str.Append(GetQueryColumnsNew(formSchemeModel.Db, tableMap, mainTable.Name));
//str = new StringBuilder(str.ToString().Substring(0, str.Length - 1));
str.Append("FROM ");
str.Append(string.Format("\"{0}\" t{1} ", mainTable.Name, mainTableIndex));
//不查询子表信息
//str.Append(GetQueryLeftTableNew(formSchemeModel.Db, tableMap, mainTable.Name, mainTableIndex));
}
str.Append(" WHERE 1=1 {LEARUN_SASSID} ");
// 添加参数
// 对表组件按表进行分类
Dictionary<string, FormComponentNewModel> componentMap = new Dictionary<string, FormComponentNewModel>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Schemas)
{
if (component == null || component.ComponentProps == null || string.IsNullOrEmpty(component.ComponentProps.DataTable))
{
continue;
}
if (!componentMap.ContainsKey(component.Field))
{
componentMap.Add(component.Field, component);
}
}
}
var queryParam = queryJson.ToJObject();
int index = 0;
foreach (var item in queryParam.Properties())
{
componentMap.TryGetValue(item.Name, out var component);
if (component != null && !string.IsNullOrEmpty(component.ComponentProps.DataTable) && !queryParam[component.Field].IsEmpty())
{
//int tableIndex = formSchemeModel.Db.FindIndex(t => t.Name == component.Field);
int tableIndex = formSchemeModel.Db.FindIndex(t => t.Name == component.ComponentProps.DataTable);
FormDbTableInfo table = formSchemeModel.Db[tableIndex];
string tIndex = tableIndex + "";
//if (table.Name == mainTable.Name)
//{
// tIndex = "";
//}
switch (component.Component)
{
case "userSelect":
case "departmentSelect":
case "companySelect":
case "company":
case "department":
case "createuser":
case "modifyuser":
case "select":
str.Append($" AND t{tIndex}.\"{component.Field}\" in ('{queryParam[component.Component].ToString().Replace(",", "','")}') ");
break;
case "Input":
case "InputTextArea":
case "texteditor":
res.DbParameter.Add(new SugarParameter($"p_{index}", $"%{queryParam[component.Field].ToString()}%"));
//str.Append($" AND t{tIndex}.{component.Field} like @p_{index} ");
str.Append($" AND t{tIndex}.\"{component.ComponentProps.FieldName}\" like @p_{index} ");
break;
case "time":
case "datetime":
case "createtime":
case "modifytime":
var value = queryParam[component.Field].ToString().Split(" - ");
res.DbParameter.Add(GetMyDbParameter($"p_{index}", value[0], component.CsType));
res.DbParameter.Add(GetMyDbParameter($"p_{index + 1}", value[1], component.CsType));
str.Append($" AND(t{tIndex}.\"{component.ComponentProps.FieldName}\" >= @p_{index} AND t{tIndex}.{component.ComponentProps.FieldName} <= @p_{index + 1} ) ");
index++;
break;
case "RangePicker":
var valuep = queryParam[component.Field].ToString().Split(" - ");
res.DbParameter.Add(GetMyDbParameter($"p_{index}", valuep[0], component.CsType));
res.DbParameter.Add(GetMyDbParameter($"p_{index + 1}", valuep[1], component.CsType));
str.Append($" AND(t{tIndex}.\"{component.ComponentProps.FieldName}\" >= @p_{index} AND t{tIndex}.{component.ComponentProps.FieldName} <= @p_{index + 1} ) ");
index++;
break;
default:
res.DbParameter.Add(GetMyDbParameter($"p_{index}", queryParam[component.Field].ToString(), component.CsType));
str.Append($" AND t{tIndex}.\"{component.ComponentProps.FieldName}\" = @p_{index} ");
break;
}
index++;
}
}
res.Sql = str.ToString().Replace(",FROM", " FROM").Replace("{LEARUN_SASSID}", " ");
return res;
}
/// <summary>
/// 获取更新sql语句
/// </summary>
/// <param name="table">表</param>
/// <param name="tableMap">组件集合</param>
/// <param name="dataJson">表单数据</param>
/// <param name="pkey">主键</param>
/// <param name="pkeyValue">主键值</param>
/// <returns></returns>
private static FormDbTable GetUpDateSql(FormDbTableInfo table, Dictionary<string, List<FormComponentModel>> tableMap, JObject dataJson, string pkey, string pkeyValue)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
res.TableName = table.Name;
res.ExecuteType = ExecuteType.Update;
res.Pkey = pkey.ToUpper();
bool isPkey = false;
var formComponents = tableMap[table.Name];
foreach (var component in formComponents)
{
if (!string.IsNullOrEmpty(component.Field))
{
if (res.DbParameter.Find(t => t.ParameterName == component.Field.ToUpper()) != null)
{
// 参数添加过则不再添加
continue;
}
if (!dataJson[component.Prop].IsEmpty())
{
res.DbParameter.Add(GetMyDbParameter(component.Field.ToUpper(), dataJson[component.Prop].ToString(), component.CsType));
}
else
{
res.DbParameter.Add(new SugarParameter(component.Field.ToUpper(), null));
}
if (component.Field.ToUpper() == pkey.ToUpper())
{
isPkey = true;
if (res.DbParameter[res.DbParameter.Count - 1].Value == null)
{
res.DbParameter[res.DbParameter.Count - 1].Value = pkeyValue;
}
}
}
}
if (!isPkey)
{
res.DbParameter.Add(new SugarParameter(pkey.ToUpper(), pkeyValue));
}
return res;
}
private static FormDbTable GetUpDateSqlNew(FormDbTableInfo table, Dictionary<string, List<FormComponentNewModel>> tableMap, JObject dataJson, string pkey, string pkeyValue)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
res.TableName = table.Name;
res.ExecuteType = ExecuteType.Update;
res.Pkey = pkey;
bool isPkey = false;
var formComponents = tableMap[table.Name];
foreach (var component in formComponents)
{
if (!string.IsNullOrEmpty(component.ComponentProps.FieldName))
{
if (res.DbParameter.Find(t => t.ParameterName == component.Field) != null)
{
// 参数添加过则不再添加
continue;
}
//if (dataJson[component.Field] != null && !dataJson[component.Field].IsEmpty())
if (!dataJson[component.Field].IsEmpty())
{
res.DbParameter.Add(GetMyDbParameter(component.ComponentProps.FieldName, dataJson[component.Field].ToString(), component.CsType));
}
else
{
//如果传过来的值为"",需要判断下字符类型
if (dataJson[component.Field] != null && dataJson[component.Field].ToString() == "" && component.CsType == "string")
{
res.DbParameter.Add(GetMyDbParameter(component.ComponentProps.FieldName, dataJson[component.Field].ToString(), component.CsType));
}
//只更新上传的数据,表单其他的不更新
//res.DbParameter.Add(new SugarParameter(component.ComponentProps.FieldName, null));
}
if (component.ComponentProps.FieldName == pkey)
{
isPkey = true;
if (res.DbParameter[res.DbParameter.Count - 1].Value == null)
{
res.DbParameter[res.DbParameter.Count - 1].Value = pkeyValue;
}
}
}
}
if (!isPkey)
{
res.DbParameter.Add(new SugarParameter(pkey, pkeyValue));
}
return res;
}
private static FormDbTable GetDeleteSql(FormDbTableInfo table, JObject dataJson, FormComponentModel component)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
res.TableName = table.Name;
res.ExecuteType = ExecuteType.Delete;
res.DbParameter.Add(GetMyDbParameter(table.Field.ToUpper(), dataJson[component.Prop].ToString(), component.CsType));
return res;
}
private static FormDbTable GetDeleteSqlNew(FormDbTableInfo table, JObject dataJson, FormComponentNewModel component)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
res.TableName = table.Name;
res.ExecuteType = ExecuteType.Delete;
res.DbParameter.Add(GetMyDbParameter(table.Field, dataJson[component.Field].ToString(), component.CsType));
return res;
}
private static void GetDeleteSqlNew(List<FormDbTable> list, List<FormDbTableInfo> db, string pTableName)
{
var tables = db.FindAll(t => t.RelationName == pTableName);
foreach (var table in tables)
{
var sql = new StringBuilder();
sql.Append($" DELETE FROM {table.Name} WHERE {table.Field}= @keyValue ");
list.Add(new FormDbTable
{
Sql = sql.ToString(),
RelationField = table.RelationField,
RelationName = table.RelationName,
TableName = table.Name
});
GetDeleteSqlNew(list, db, table.Name);
}
}
/// <summary>
/// 获取删除语句
/// </summary>
/// <param name="formSchemeModel"></param>
/// <param name="pkey"></param>
/// <returns></returns>
public static List<FormDbTable> GetDeleteSqlNew(FormSchemeNewModel formSchemeModel, string pkey)
{
List<FormDbTable> list = new List<FormDbTable>();
// 获取主子表
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
var sql = new StringBuilder();
//sql.Append($" DELETE FROM {mainTable.Name} WHERE {pkey}= @keyValue " + "{LEARUN_SASSID_NOTT}");
sql.Append($" DELETE FROM {mainTable.Name} WHERE \"{pkey}\"= @keyValue ");
list.Add(new FormDbTable
{
Sql = sql.ToString(),
TableName = mainTable.Name
});
GetDeleteSqlNew(list, formSchemeModel.Db, mainTable.Name);
return list;
}
/// <summary>
/// 获取新增sql语句
/// </summary>
/// <param name="table">表</param>
/// <param name="tableMap">组件集合</param>
/// <param name="dataJson">表单数据</param>
/// <returns></returns>
private static FormDbTable GetInsertSql(FormDbTableInfo table, Dictionary<string, List<FormComponentModel>> tableMap, JObject dataJson)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
res.TableName = table.Name;
res.ExecuteType = ExecuteType.Insert;
foreach (var component in tableMap[table.Name])
{
if (!string.IsNullOrEmpty(component.Field) && !dataJson[component.Prop].IsEmpty())
{
if (res.DbParameter.Find(t => t.ParameterName == component.Field) != null)
{
continue;
}
res.DbParameter.Add(GetMyDbParameter(component.Field, dataJson[component.Prop].ToString(), component.CsType));
}
}
return res;
}
/// <summary>
/// 获取新增sql语句
/// </summary>
/// <param name="table">表</param>
/// <param name="tableMap">组件集合</param>
/// <param name="dataJson">表单数据</param>
/// <returns></returns>
private static FormDbTable GetInsertSqlNew(FormDbTableInfo table, Dictionary<string, List<FormComponentNewModel>> tableMap, JObject dataJson)
{
FormDbTable res = new FormDbTable();
res.DbParameter = new List<SugarParameter>();
res.TableName = table.Name;
res.ExecuteType = ExecuteType.Insert;
foreach (var component in tableMap[table.Name])
{
if (!string.IsNullOrEmpty(component.Field) && !dataJson[component.Field].IsEmpty())
{
if (res.DbParameter.Find(t => t.ParameterName == component.Field) != null)
{
continue;
}
res.DbParameter.Add(GetMyDbParameter(component.ComponentProps.FieldName, dataJson[component.Field].ToString(), component.CsType));
}
}
return res;
}
private static string GetQueryColumns(List<FormDbTableInfo> db, Dictionary<string, List<FormComponentModel>> tableMap, string pTableName)
{
StringBuilder str = new StringBuilder();
var tables = db.FindAll(t => t.RelationName == pTableName && tableMap.ContainsKey(t.Name));
foreach (var table in tables)
{
int tableIndex = db.FindIndex(t => t.Name == table.Name);
var components = tableMap[table.Name];
foreach (var component in components)
{
if (!string.IsNullOrEmpty(component.Field))
{
str.Append(string.Format("t{0}.{1} as {1}{0},", tableIndex, component.Field));
}
}
str.Append(GetQueryColumns(db, tableMap, table.Name));
}
return str.ToString();
}
private static string GetQueryColumnsNew(List<FormDbTableInfo> db, Dictionary<string, List<FormComponentNewModel>> tableMap, string pTableName)
{
StringBuilder str = new StringBuilder();
var tables = db.FindAll(t => t.RelationName == pTableName && tableMap.ContainsKey(t.Name));
foreach (var table in tables)
{
//只查主表信息
if (table.Type == "main")
{
int tableIndex = db.FindIndex(t => t.Name == table.Name);
var components = tableMap[table.Name];
foreach (var component in components)
{
if (!string.IsNullOrEmpty(component.ComponentProps.DataTable))
{
//str.Append(string.Format("t{0}.\"{1}\" as \"{1}{0}\",", tableIndex, component.ComponentProps.FieldName));
str.Append(string.Format("t{0}.\"{1}\" as \"{2}\",", tableIndex, component.ComponentProps.FieldName, component.Field));
}
}
str.Append(GetQueryColumnsNew(db, tableMap, table.Name));
}
//int tableIndex = db.FindIndex(t => t.Name == table.Name);
//var components = tableMap[table.Name];
//foreach (var component in components)
//{
// if (!string.IsNullOrEmpty(component.ComponentProps.DataTable))
// {
// //str.Append(string.Format("t{0}.\"{1}\" as \"{1}{0}\",", tableIndex, component.ComponentProps.FieldName));
// str.Append(string.Format("t{0}.\"{1}\" as \"{2}\",", tableIndex, component.ComponentProps.FieldName, component.Field));
// }
//}
//str.Append(GetQueryColumnsNew(db, tableMap, table.Name));
}
return str.ToString();
}
private static string GetQueryLeftTable(List<FormDbTableInfo> db, Dictionary<string, List<FormComponentModel>> tableMap, string pTableName, int pTableIndex)
{
StringBuilder str = new StringBuilder();
var tables = db.FindAll(t => t.RelationName == pTableName && tableMap.ContainsKey(t.Name));
foreach (var table in tables)
{
int tableIndex = db.FindIndex(t => t.Name == table.Name);
str.Append(string.Format(" LEFT JOIN {0} t{1} ON t{1}.{2} = t{3}.{4} ", table.Name, tableIndex, table.Field, pTableIndex, table.RelationField));
str.Append(GetQueryLeftTable(db, tableMap, table.Name, tableIndex));
}
return str.ToString();
}
private static string GetQueryLeftTableNew(List<FormDbTableInfo> db, Dictionary<string, List<FormComponentNewModel>> tableMap, string pTableName, int pTableIndex)
{
StringBuilder str = new StringBuilder();
var tables = db.FindAll(t => t.RelationName == pTableName && tableMap.ContainsKey(t.Name));
foreach (var table in tables)
{
int tableIndex = db.FindIndex(t => t.Name == table.Name);
str.Append(string.Format(" LEFT JOIN \"{0}\" t{1} ON t{1}.\"{2}\" = t{3}.\"{4}\" ", table.Name, tableIndex, table.Field, pTableIndex, table.RelationField));
str.Append(GetQueryLeftTableNew(db, tableMap, table.Name, tableIndex));
}
return str.ToString();
}
public static bool IsEmpty(this object value)
{
if (value != null && !string.IsNullOrEmpty(value.ToString()))
{
return false;
}
return true;
}
public static SugarParameter GetMyDbParameter(string parameterName, string value, string csType)
{
string _csType = csType;
switch (csType)
{
case "int":
_csType = "System.Int32";
break;
case "long":
_csType = "System.Int64";
break;
case "short":
_csType = "System.Int16";
break;
case "bool":
_csType = "System.Boolean";
break;
case "float":
_csType = "System.Single";
break;
case "text":
_csType = "";
break;
default:
if (!string.IsNullOrEmpty(csType))
{
_csType = $"System.{StringExtension.FirstUpper(csType)}";
}
break;
}
if (_csType == "System.TimeSpan")
{
return new SugarParameter(parameterName, TimeSpan.Parse(value));
}
else if (_csType == "System.Guid")
{
return new SugarParameter(parameterName, Guid.Parse(value));
}
else
{
return new SugarParameter(parameterName, string.IsNullOrEmpty(_csType) ? value : Convert.ChangeType(value, System.Type.GetType(_csType)));
}
}
/// <summary>
/// 获取表单查询方法
/// </summary>
/// <param name="formSchemeModel"></param>
/// <param name="pkey"></param>
/// <returns></returns>
public static List<FormDbTable> GetQuery(FormSchemeModel formSchemeModel, string pkey)
{
List<FormDbTable> list = new List<FormDbTable>();
StringBuilder str = new StringBuilder();
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
// 对表组件按表进行分类
Dictionary<string, List<FormComponentModel>> tableMap = new Dictionary<string, List<FormComponentModel>>();
Dictionary<string, FormComponentModel> girdTableMap = new Dictionary<string, FormComponentModel>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Components)
{
if (string.IsNullOrEmpty(component.Table))
{
continue;
}
if (!tableMap.ContainsKey(component.Table))
{
tableMap[component.Table] = new List<FormComponentModel>();
}
if (component.Type == "gridtable")
{
tableMap[component.Table].AddRange(component.children);
girdTableMap.Add(component.Table, component);
}
else
{
if (component.Prop == pkey)
{
pkey = component.Field;
}
tableMap[component.Table].Add(component);
}
}
}
str.Append("SELECT ");
var mainComponents = tableMap[mainTable.Name];
foreach (var component in mainComponents)
{
str.Append($" {component.Field},");
}
str.Append($"FROM {mainTable.Name} t where {pkey} = @keyValue " + "{LEARUN_SASSID}");
list.Add(new FormDbTable
{
Sql = str.ToString().Replace(",FROM", " FROM"),
TableName = mainTable.Name
});
GetQuery(list, formSchemeModel.Db, mainTable.Name, tableMap, girdTableMap);
return list;
}
/// <summary>
/// 获取表单查询方法
/// </summary>
/// <param name="formSchemeModel"></param>
/// <param name="pkey"></param>
/// <returns></returns>
public static List<FormDbTable> GetQueryNew(FormSchemeNewModel formSchemeModel, string pkey)
{
List<FormDbTable> list = new List<FormDbTable>();
StringBuilder str = new StringBuilder();
// 主数据库
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
// 对表组件按表进行分类
Dictionary<string, List<FormComponentNewModel>> tableMap = new Dictionary<string, List<FormComponentNewModel>>();
Dictionary<string, FormComponentNewModel> girdTableMap = new Dictionary<string, FormComponentNewModel>();
foreach (var tab in formSchemeModel.FormInfo.TabList)
{
foreach (var component in tab.Schemas)
{
if (component == null || component.ComponentProps == null || string.IsNullOrEmpty(component.ComponentProps.DataTable))
{
//if(component.Component == "Grid1")
//{
// foreach (var column in component.Columns)
// {
// tableMap[component.ComponentProps.DataTable].AddRange(column.children);
// }
//}
//else
//{
// continue;
//}
continue;
}
if (!tableMap.ContainsKey(component.ComponentProps.DataTable))
{
tableMap[component.ComponentProps.DataTable] = new List<FormComponentNewModel>();
}
if (component.Component == "Grid")
{
//tableMap[component.ComponentProps.DataTable].AddRange(component.children);
//girdTableMap.Add(component.ComponentProps.DataTable, component);
foreach (var column in component.Columns)
{
tableMap[component.ComponentProps.DataTable].AddRange(column.children);
if (girdTableMap.ContainsKey(component.ComponentProps.DataTable))
{
//girdTableMap[component.ComponentProps.DataTable].AddRange(column);
}
else
{
girdTableMap.Add(component.ComponentProps.DataTable, column);
}
}
}
else
{
if (component.ComponentProps.FieldName == pkey)
{
pkey = component.ComponentProps.FieldName;
}
//添加关联键
tableMap[component.ComponentProps.DataTable].Add(component);
}
}
}
str.Append("SELECT ");
var mainComponents = tableMap[mainTable.Name];
foreach (var component in mainComponents)
{
if (component.ComponentProps.FieldName == "geom")
{
str.Append($" st_astext(\"{component.ComponentProps.FieldName}\") as " + component.Field + ",");
}
else
{
str.Append($" \"{component.ComponentProps.FieldName}\" as " + component.Field + ",");
}
//str.Append($" \"{component.ComponentProps.FieldName}\" as " + component.Field + ",");
}
//pkey = mainComponents.Where(t => t.ComponentProps.FieldName == pkey).First()?.Field;
pkey = mainComponents.Where(t => t.ComponentProps.FieldName == pkey).First()?.ComponentProps.FieldName;
//str.Append($"FROM \"{mainTable.Name}\" t where \"{pkey}\" = @keyValue " + "{LEARUN_SASSID}");
str.Append($"FROM \"{mainTable.Name}\" t where \"{pkey}\" = @keyValue ");
list.Add(new FormDbTable
{
Sql = str.ToString().Replace(",FROM", " FROM"),
TableName = mainTable.Name
});
GetQueryNew(list, formSchemeModel.Db, mainTable.Name, tableMap, girdTableMap);
return list;
}
private static void GetQuery(List<FormDbTable> list, List<FormDbTableInfo> db, string pTableName, Dictionary<string, List<FormComponentModel>> tableMap, Dictionary<string, FormComponentModel> girdTableMap)
{
var tables = db.FindAll(t => t.RelationName == pTableName);
foreach (var table in tables)
{
StringBuilder str = new StringBuilder();
str.Append("SELECT ");
var components = tableMap[table.Name];
foreach (var column in components)
{
str.Append($" {column.Field},");
}
str.Append($"FROM {table.Name} where {table.Field} = @keyValue ");
if (girdTableMap.ContainsKey(table.Name))
{
var componentModel = girdTableMap[table.Name];
if (!string.IsNullOrEmpty(componentModel.OrderId))
{
if (componentModel.isDESC)
{
str.Append($" order by {componentModel.OrderId} DESC ");
}
else
{
str.Append($" order by {componentModel.OrderId} ");
}
}
}
list.Add(new FormDbTable
{
Sql = str.ToString().Replace(",FROM", " FROM"),
RelationField = table.RelationField,
RelationName = table.RelationName,
TableName = table.Name
});
GetQuery(list, db, table.Name, tableMap, girdTableMap);
}
}
private static void GetQueryNew(List<FormDbTable> list, List<FormDbTableInfo> db, string pTableName, Dictionary<string, List<FormComponentNewModel>> tableMap, Dictionary<string, FormComponentNewModel> girdTableMap)
{
var tables = db.FindAll(t => t.RelationName == pTableName);
foreach (var table in tables)
{
StringBuilder str = new StringBuilder();
str.Append("SELECT ");
var components = tableMap[table.Name];
foreach (var column in components)
{
//新加
var field = components.Where(t => t.ComponentProps.FieldName == column.ComponentProps.FieldName).First();
if (field.ComponentProps.FieldName == "geom")
{
str.Append($" st_astext(\"{column.ComponentProps.FieldName}\") as " + field.Field + ",");
}
else
{
str.Append($" \"{column.ComponentProps.FieldName}\" as " + field.Field + ",");
}
//str.Append($" \"{column.ComponentProps.FieldName}\" as " + field.Field + ",");
}
// var ffield = components.Where(t => t.ComponentProps.FieldName == table.Field).First()?.Field;
//str.Append($"FROM \"{table.Name}\" where \"{table.Field}\" = @keyValue ");
str.Append($"FROM \"{table.Name}\" where \"{table.Field}\" = @keyValue ");
if (girdTableMap.ContainsKey(table.Name))
{
var componentModel = girdTableMap[table.Name];
if (!string.IsNullOrEmpty(componentModel.OrderId))
{
if (componentModel.isDESC)
{
str.Append($" order by \"{componentModel.OrderId}\" DESC ");
}
else
{
str.Append($" order by \"{componentModel.OrderId}\" ");
}
}
}
list.Add(new FormDbTable
{
Sql = str.ToString().Replace(",FROM", " FROM"),
//RelationField = table.RelationField,
RelationField = table.Field,
RelationName = table.RelationName,
TableName = table.Name
});
GetQueryNew(list, db, table.Name, tableMap, girdTableMap);
}
}
public static string GetCsType(DbType dbtype, string dbType)
{
string csType = "string";
switch (dbType.ToLower())
{
case "varchar":
csType = "string";
break;
case "varchar2":
csType = "string";
break;
case "char":
case "nchar":
case "nvarchar":
case "nvarchar2":
csType = "string";
break;
case "text":
csType = "string";
break;
case "ntext":
case "longtext":
case "clob":
case "nclog":
csType = "text";
break;
case "int2":
csType = "int";
break;
case "integer":
csType = "int";
break;
case "int4":
csType = "int";
break;
case "mediumint":// mysql
case "year":
csType = "int";
break;
case "bigint":
csType = "long";
break;
case "smallint":
csType = "short";
break;
case "bit":
csType = "bool";
break;
case "tinyint":
csType = "byte";
break;
case "decimal":
csType = "decimal";
break;
case "numeric":
csType = "decimal";
break;
case "number":
csType = "int";
break;
case "number(8,2)":
csType = "double";
break;
case "money":
case "bool":
csType = "bool";
break;
case "smallmoney":
csType = "decimal";
break;
case "real":
case "double":
if (dbtype == DbType.MySql)
{
csType = "double";
}
else
{
csType = "float";
}
break;
case "float":
if (dbtype == DbType.MySql)
{
csType = "float";
}
else
{
csType = "double";
}
break;
case "float4":
csType = "double";
break;
case "float8":
csType = "double";
break;
case "date":
csType = "DateTime";
break;
case "datetime":
csType = "DateTime";
break;
case "datetime2":
csType = "DateTime";
break;
case "smalldatetime":
csType = "DateTime";
break;
case "datetimeoffset":
csType = "DateTimeOffset";
break;
case "time":
//csType = "TimeSpan";
//break;
csType = "DateTime";
break;
case "timestamp":
if (dbtype == DbType.MySql)
{
csType = "DateTime";
}
else
{
csType = "DateTime";
}
break;
case "binary":
case "varbinary":
case "image":
case "tinyblob":
case "blob":
case "mediumblob":
case "longblob":
csType = "byte[]";
break;
case "uniqueidentifier":
csType = "Guid";
break;
case "variant":
csType = "Object";
break;
case "timestamp without time zone":
csType = "TimeSpan";
break;
// mysql
case "set":
case "enum":
csType = "Enum";
break;
case "point":
case "linestring":
case "polygon":
case "geometry":
case "multipoint":
case "multilinestring":
case "multipolygon":
//case "geometrycollection":
// csType = "MygisGeometry";
case "geometrycollection":
csType = "string";
break;
}
return csType;
}
/// <summary>
///
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string SqlFilters(string source)
{
if (string.IsNullOrEmpty(source))
{
return source;
}
//去除执行SQL语句的命令关键字
// source = Regex.Replace(source, "select", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "insert", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "update", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "delete", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "drop", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "truncate", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "declare", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "xp_cmdshell", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "/add", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "net user", "", RegexOptions.IgnoreCase);
//去除执行存储过程的命令关键字
source = Regex.Replace(source, "exec", "", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "execute", "", RegexOptions.IgnoreCase);
//去除系统存储过程或扩展存储过程关键字
source = Regex.Replace(source, "xp_", "x p_", RegexOptions.IgnoreCase);
source = Regex.Replace(source, "sp_", "s p_", RegexOptions.IgnoreCase);
//防止16进制注入
source = Regex.Replace(source, "0x", "0 x", RegexOptions.IgnoreCase);
return source;
}
}
}