using System.Text;
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Manager;
using JNPF.Common.Models.VisualDev;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.FriendlyException;
using JNPF.JsonSerialization;
using JNPF.RemoteRequest.Extensions;
using JNPF.Systems.Entitys.Model.DataBase;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev.Engine;
using JNPF.VisualDev.Engine.Core;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using JNPF.VisualDev.Interfaces;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Interfaces.Repository;
using Mapster;
using SqlSugar;
namespace JNPF.VisualDev;
///
/// 在线开发运行服务 .
///
public class RunService : IRunService, ITransient
{
#region 构造
///
/// 服务基础仓储.
///
private readonly ISqlSugarRepository _visualDevRepository; // 在线开发功能实体
///
/// 表单数据解析.
///
private readonly FormDataParsing _formDataParsing;
///
/// 切库.
///
private readonly IDataBaseManager _databaseService;
///
/// 单据.
///
private readonly IBillRullService _billRuleService;
///
/// 缓存管理.
///
private readonly ICacheManager _cacheManager;
///
/// 用户管理.
///
private readonly IUserManager _userManager;
///
/// 数据连接服务.
///
private readonly IDbLinkService _dbLinkService;
///
/// 流程数据.
///
private readonly IFlowTaskRepository _flowTaskRepository;
///
/// 事务.
///
private readonly ITenant _db;
///
/// 构造.
///
public RunService(
ISqlSugarRepository visualDevRepository,
FormDataParsing formDataParsing,
IUserManager userManager,
IDbLinkService dbLinkService,
IDataBaseManager databaseService,
IFlowTaskRepository flowTaskRepository,
ISqlSugarClient context,
IBillRullService billRuleService)
{
_visualDevRepository = visualDevRepository;
_formDataParsing = formDataParsing;
_userManager = userManager;
_databaseService = databaseService;
_dbLinkService = dbLinkService;
_billRuleService = billRuleService;
_flowTaskRepository = flowTaskRepository;
_db = context.AsTenant();
}
#endregion
#region Get
///
/// 列表数据处理.
///
/// 功能实体.
/// 查询参数.
///
///
public async Task>> GetListResult(VisualDevEntity entity, VisualDevModelListQueryInput input, string actionType = "List")
{
PageResult>? realList = new PageResult>() { list = new List>() }; // 返回结果集
TemplateParsingBase templateInfo = new TemplateParsingBase(entity); // 解析模板控件
// 处理查询
Dictionary queryJson = string.IsNullOrEmpty(input.queryJson) ? null : input.queryJson.ToObject>();
if (queryJson != null)
{
foreach (KeyValuePair item in queryJson)
{
if (!templateInfo.ColumnData.searchList.Any(it => it.__vModel__.Equals(item.Key)))
{
var vmodel = templateInfo.AllFieldsModel.Find(it => it.__vModel__.Equals(item.Key));
templateInfo.ColumnData.searchList.Add(vmodel.ToObject());
}
if (!templateInfo.AppColumnData.searchList.Any(it => it.__vModel__.Equals(item.Key)))
{
var vmodel = templateInfo.AllFieldsModel.Find(it => it.__vModel__.Equals(item.Key));
templateInfo.AppColumnData.searchList.Add(vmodel.ToObject());
}
}
}
input.superQueryJson = GetSuperQueryInput(input.superQueryJson);
string? primaryKey = "F_Id"; // 列表主键
// 获取请求端类型,并对应获取 数据权限
DbLinkEntity link = await GetDbLink(entity.DbLinkId);
templateInfo.DbLink = link;
LogicalDelete(templateInfo); // 处理软删除
primaryKey = GetPrimary(link, templateInfo.MainTableName);
bool udp = _userManager.UserOrigin == "pc" ? templateInfo.ColumnData.useDataPermission : templateInfo.AppColumnData.useDataPermission;
var pvalue = await _userManager.GetCondition>(primaryKey, input.menuId, udp);
var pvalueJson = pvalue.ToJsonString();
foreach (var item in templateInfo.AllTableFields)
{
if (pvalueJson.Contains(string.Format("\"FieldName\":\"{0}\",", item.Key)))
pvalueJson.Replace(string.Format("\"FieldName\":\"{0}\",", item.Value), string.Format("\"FieldName\":\"{0}\",", item.Key));
}
pvalue = _visualDevRepository.AsSugarClient().Utilities.JsonToConditionalModels(pvalueJson);
// 所有查询条件
var queryWhere = new List();
var superQueryWhere = new List();
if (input.queryJson.IsNotEmptyOrNull()) queryWhere = GetQueryJson(input.queryJson, _userManager.UserOrigin == "pc" ? templateInfo.ColumnData : templateInfo.AppColumnData);
if (input.superQueryJson.IsNotEmptyOrNull()) superQueryWhere = GetSuperQueryJson(input.superQueryJson);
if (templateInfo.ColumnData.type == 4) await OptimisticLocking(link, templateInfo); // 开启行编辑 处理 开启并发锁定
Dictionary? tableFieldKeyValue = new Dictionary(); // 联表查询 表字段名称 对应 前端字段名称 (应对oracle 查询字段长度不能超过30个)
string? sql = GetListQuerySql(primaryKey, templateInfo, ref input, ref tableFieldKeyValue, pvalue); // 查询sql
// 如果排序字段没有在显示列中,按默认排序
if (input.sidx.IsNotEmptyOrNull() && !templateInfo.ColumnData.columnList.Any(x => x.prop == input.sidx)) input.sidx = string.Empty;
// 处理查询
input.queryJson = GetQueryJson(input.queryJson, _userManager.UserOrigin == "pc" ? templateInfo.ColumnData : templateInfo.AppColumnData).ToJsonString();
input.superQueryJson = GetSuperQueryJson(input.superQueryJson).ToJsonString();
realList = _databaseService.GetInterFaceData(link, sql, input, templateInfo.ColumnData.Adapt(), new List(), tableFieldKeyValue);
// 显示列有子表字段
if ((templateInfo.ColumnData.type != 4 || _userManager.UserOrigin.Equals("app")) && templateInfo.ColumnData.columnList.Any(x => templateInfo.ChildTableFields.ContainsKey(x.__vModel__)) && realList.list.Any())
realList = await GetListChildTable(templateInfo, primaryKey, queryWhere, superQueryWhere, realList, pvalue);
// 处理 自增长ID 流程表单 自增长Id转成 流程Id
if (entity.FlowId.IsNotEmptyOrNull() && entity.EnableFlow.Equals(1) && realList.list.Any())
{
var ids = realList.list.Select(x => x[primaryKey]).ToList();
var newIds = GetPIdsByFlowIds(link, templateInfo, primaryKey, ids.ToObject>(), true);
realList.list.ForEach(item => item[primaryKey] = newIds.First(x => x.Value.Equals(item[primaryKey].ToString())).Key);
}
input.sidx = string.IsNullOrEmpty(input.sidx) ? (templateInfo.ColumnData.defaultSidx == string.Empty ? primaryKey : templateInfo.ColumnData.defaultSidx) : input.sidx;
// 增加前端回显字段 : key_name
var roweditId = SnowflakeIdHelper.NextId();
if (templateInfo.ColumnData.type.Equals(4) && _userManager.UserOrigin.Equals("pc"))
{
realList.list.ForEach(items =>
{
var addItem = new Dictionary();
foreach (var item in items) if (item.Key != "RowIndex") addItem.Add(item.Key + roweditId, item.Value);
foreach (var item in addItem) items.Add(item.Key, item.Value);
});
}
if (realList.list.Any())
{
if (templateInfo.SingleFormData.Any(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()))
realList.list = await _formDataParsing.GetKeyData(templateInfo.SingleFormData.Where(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()).ToList(), realList.list, templateInfo.ColumnData, actionType, templateInfo.WebType, primaryKey);
else
realList.list = await _formDataParsing.GetKeyData(templateInfo.SingleFormData.Where(x => x.__config__.templateJson == null).ToList(), realList.list, templateInfo.ColumnData, actionType, templateInfo.WebType, primaryKey);
// 如果是无表数据并且排序字段不为空,再进行数据排序
if (!templateInfo.IsHasTable && input.sidx.IsNotEmptyOrNull())
{
if (input.sort == "desc")
{
realList.list = realList.list.OrderByDescending(x =>
{
var dic = x as IDictionary;
dic.GetOrAdd(input.sidx, () => null);
return dic[input.sidx];
}).ToList();
}
else
{
realList.list = realList.list.OrderBy(x =>
{
var dic = x as IDictionary;
dic.GetOrAdd(input.sidx, () => null);
return dic[input.sidx];
}).ToList();
}
}
}
if (input.dataType == "0")
{
if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables))
{
}
else
{
realList.pagination = new PageResult();
realList.pagination.total = realList.list.Count;
realList.pagination.pageSize = input.pageSize;
realList.pagination.currentPage = input.currentPage;
realList.list = realList.list.Skip(input.pageSize * (input.currentPage - 1)).Take(input.pageSize).ToList();
}
// 分组表格
if (templateInfo.ColumnData.type == 3 && _userManager.UserOrigin == "pc")
realList.list = CodeGenHelper.GetGroupList(realList.list, templateInfo.ColumnData.groupField, templateInfo.ColumnData.columnList.Find(x => x.__vModel__.ToLower() != templateInfo.ColumnData.groupField.ToLower()).__vModel__);
}
else
{
if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables))
{
}
else
{
realList.pagination = new PageResult();
realList.pagination.total = realList.list.Count;
realList.pagination.pageSize = input.pageSize;
realList.pagination.currentPage = input.currentPage;
realList.list = realList.list.ToList();
}
}
// 增加前端回显字段 : key_name
if (templateInfo.ColumnData.type.Equals(4) && _userManager.UserOrigin.Equals("pc"))
{
var newList = new List>();
realList.list.ForEach(items =>
{
var newItem = new Dictionary();
foreach (var item in items)
{
if (item.Key.Contains(roweditId) && item.Value.IsNotEmptyOrNull())
{
var obj = item.Value;
if (obj.ToString().Contains("[[")) obj = item.Value.ToString().ToObject>>();
else if (obj.ToString().Contains("[")) obj = item.Value.ToString().ToObject>();
var value = items.FirstOrDefault(x => x.Key == item.Key.Replace(roweditId, string.Empty)).Value;
if (value.IsNullOrEmpty()) obj = null;
if (!newItem.ContainsKey(item.Key.Replace(roweditId, string.Empty))) newItem.Add(item.Key.Replace(roweditId, string.Empty), obj);
if (!newItem.ContainsKey(item.Key.Replace(roweditId, string.Empty) + "_name")) newItem.Add(item.Key.Replace(roweditId, string.Empty) + "_name", value);
}
if(item.Key.Equals("flowState") || item.Key.Equals("flowState_name")) newItem.Add(item.Key, item.Value);
if (item.Key.Equals("id") && !newItem.ContainsKey(item.Key)) newItem.Add(item.Key, item.Value);
if (templateInfo.AllFieldsModel.Any(x => x.__vModel__.Equals(item.Key) && x.__config__.jnpfKey.Equals(JnpfKeyConst.TIME))) newItem[item.Key] = items[item.Key];
}
newList.Add(newItem);
});
realList.list = newList;
}
return realList;
}
///
/// 关联表单列表数据处理.
///
/// 功能实体.
/// 查询参数.
///
///
public async Task>> GetRelationFormList(VisualDevEntity entity, VisualDevModelListQueryInput input, string actionType = "List")
{
PageResult>? realList = new PageResult>() { list = new List>() }; // 返回结果集
TemplateParsingBase? templateInfo = new TemplateParsingBase(entity); // 解析模板控件
string? primaryKey = "F_Id"; // 列表主键
List? pvalue = new List(); // 关联表单调用 数据全部放开
DbLinkEntity link = await GetDbLink(entity.DbLinkId);
primaryKey = GetPrimary(link, templateInfo.MainTableName);
Dictionary? tableFieldKeyValue = new Dictionary(); // 联表查询 表字段名称 对应 前端字段名称 (应对oracle 查询字段长度不能超过30个)
string? sql = GetListQuerySql(primaryKey, templateInfo, ref input, ref tableFieldKeyValue, pvalue, true); // 查询sql
// 如果排序字段没有在显示列中,按默认排序
if (input.sidx.IsNotEmptyOrNull() && !templateInfo.ColumnData.columnList.Any(x => x.prop == input.sidx)) input.sidx = string.Empty;
string? queryJson = input.queryJson;
input.queryJson = string.Empty;
realList = _databaseService.GetInterFaceData(link, sql, input, templateInfo.ColumnData.Adapt(), pvalue, tableFieldKeyValue);
input.queryJson = queryJson;
// 处理 自增长ID 流程表单 自增长Id转成 流程Id
if (entity.FlowId.IsNotEmptyOrNull() && entity.EnableFlow.Equals(1) && realList.list.Any())
{
var ids = realList.list.Select(x => x[primaryKey]).ToList();
var newIds = GetPIdsByFlowIds(link, templateInfo, primaryKey, ids.ToObject>(), true);
realList.list.ForEach(item => item[primaryKey] = newIds.First(x => x.Value.Equals(item[primaryKey].ToString())).Key);
}
input.sidx = string.IsNullOrEmpty(input.sidx) ? (templateInfo.ColumnData.defaultSidx == string.Empty ? primaryKey : templateInfo.ColumnData.defaultSidx) : input.sidx;
if (realList.list.Any())
{
if (templateInfo.SingleFormData.Any(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()))
realList.list = await _formDataParsing.GetKeyData(templateInfo.SingleFormData.Where(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()).ToList(), realList.list, templateInfo.ColumnData, actionType, templateInfo.WebType, primaryKey);
realList.list = await _formDataParsing.GetKeyData(templateInfo.SingleFormData.Where(x => !x.__config__.jnpfKey.Equals(JnpfKeyConst.RELATIONFORM) && x.__config__.templateJson == null).ToList(), realList.list, templateInfo.ColumnData, actionType, templateInfo.WebType.ParseToInt(), primaryKey);
if (input.queryJson.IsNotEmptyOrNull())
{
Dictionary? search = input.queryJson.ToObject>();
if (search.FirstOrDefault().Value.IsNotEmptyOrNull())
{
string? keword = search.FirstOrDefault().Value;
List>? newList = new List>();
List? columnName = templateInfo.ColumnData.columnList.Select(x => x.prop).ToList();
realList.list.ForEach(item =>
{
if (item.Where(x => x.Value != null && columnName.Contains(x.Key)).Where(x => x.Value.ToString().Contains(keword)).Any()) newList.Add(item);
});
realList.list = newList;
}
}
if (input.sort == "desc")
{
realList.list = realList.list.OrderByDescending(x =>
{
IDictionary? dic = x as IDictionary;
dic.GetOrAdd(input.sidx, () => null);
return dic[input.sidx];
}).ToList();
}
else
{
realList.list = realList.list.OrderBy(x =>
{
IDictionary? dic = x as IDictionary;
dic.GetOrAdd(input.sidx, () => null);
return dic[input.sidx];
}).ToList();
}
}
if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables))
{
}
else
{
realList.pagination = new PageResult();
realList.pagination.total = realList.list.Count;
realList.pagination.pageSize = input.pageSize;
realList.pagination.currentPage = input.currentPage;
realList.list = realList.list.ToList();
}
return realList;
}
///
/// 获取模型数据信息.
///
///
///
public async Task GetInfo(string id)
{
return await _visualDevRepository.AsSugarClient().Queryable().FirstAsync(m => m.Id == id);
}
///
/// 获取有表详情.
///
/// 主键.
/// 模板实体.
///
public async Task> GetHaveTableInfo(string id, VisualDevEntity templateEntity)
{
TemplateParsingBase templateInfo = new TemplateParsingBase(templateEntity); // 解析模板控件
DbLinkEntity link = await GetDbLink(templateEntity.DbLinkId);
string? mainPrimary = GetPrimary(link, templateInfo.MainTableName);
await OptimisticLocking(link, templateInfo); // 处理 开启 并发锁定
if (id.Equals("0") || id.IsNullOrWhiteSpace()) return new Dictionary();
id = GetPIdsByFlowIds(link, templateInfo, mainPrimary, new List() { id }).First().Value;
Dictionary? tableFieldKeyValue = new Dictionary(); // 联表查询 表字段 别名
var sql = GetInfoQuerySql(id, mainPrimary, templateInfo, ref tableFieldKeyValue); // 获取查询Sql
Dictionary? data = _databaseService.GetInterFaceData(link, sql).ToJsonString().ToObject>>().FirstOrDefault();
if (data == null) return null;
// 记录全部数据
Dictionary dataMap = new Dictionary();
// 查询别名转换
if (templateInfo.AuxiliaryTableFieldsModelList.Any()) foreach (KeyValuePair item in data) dataMap.Add(tableFieldKeyValue[item.Key.ToUpper()], item.Value);
else dataMap = data;
Dictionary newDataMap = new Dictionary();
dataMap = _formDataParsing.GetTableDataInfo(new List>() { dataMap }, templateInfo.FieldsModelList, "detail").FirstOrDefault();
// 处理子表数据
newDataMap = await GetChildTableData(templateInfo, link, dataMap, newDataMap, false);
int dicCount = newDataMap.Keys.Count;
string[] strKey = new string[dicCount];
newDataMap.Keys.CopyTo(strKey, 0);
for (int i = 0; i < strKey.Length; i++)
{
FieldsModel? model = templateInfo.FieldsModelList.Where(m => m.__vModel__ == strKey[i]).FirstOrDefault();
if (model != null)
{
List> tables = newDataMap[strKey[i]].ToObject>>();
List> newTables = new List>();
foreach (Dictionary? item in tables)
{
Dictionary dic = new Dictionary();
foreach (KeyValuePair value in item)
{
FieldsModel? child = model.__config__.children.Find(c => c.__vModel__ == value.Key);
if (child != null) dic.Add(value.Key, value.Value);
}
newTables.Add(dic);
}
if (newTables.Count > 0) newDataMap[strKey[i]] = newTables;
}
}
foreach (KeyValuePair entryMap in dataMap)
{
FieldsModel? model = templateInfo.FieldsModelList.Where(m => m.__vModel__.ToLower() == entryMap.Key.ToLower()).FirstOrDefault();
if (model != null && entryMap.Key.ToLower().Equals(model.__vModel__.ToLower())) newDataMap[entryMap.Key] = entryMap.Value;
}
if (!newDataMap.ContainsKey("id")) newDataMap.Add("id", data[mainPrimary]);
_formDataParsing.GetBARAndQR(templateInfo.FieldsModelList, newDataMap, dataMap); // 处理 条形码 、 二维码 控件
return await _formDataParsing.GetSystemComponentsData(templateInfo.FieldsModelList, newDataMap.ToJsonString());
}
///
/// 获取有表详情转换.
///
/// 主键.
/// 模板实体.
///
///
public async Task GetHaveTableInfoDetails(string id, VisualDevEntity templateEntity, bool isFlowTask = false)
{
TemplateParsingBase? templateInfo = new TemplateParsingBase(templateEntity, isFlowTask); // 解析模板控件
DbLinkEntity link = await GetDbLink(templateEntity.DbLinkId);
string? mainPrimary = GetPrimary(link, templateInfo.MainTableName);
id = GetPIdsByFlowIds(link, templateInfo, mainPrimary, new List() { id }).First().Value;
Dictionary? tableFieldKeyValue = new Dictionary(); // 联表查询 表字段 别名
var sql = GetInfoQuerySql(id, mainPrimary, templateInfo, ref tableFieldKeyValue); // 获取查询Sql
Dictionary? data = _databaseService.GetInterFaceData(link, sql).ToJsonString().ToObject>>().ToObject>>().FirstOrDefault();
if (data == null) return id;
// 记录全部数据
Dictionary dataMap = new Dictionary();
// 查询别名转换
if (templateInfo.AuxiliaryTableFieldsModelList.Any()) foreach (KeyValuePair item in data) dataMap.Add(tableFieldKeyValue[item.Key.ToUpper()], item.Value);
else dataMap = data;
Dictionary newDataMap = new Dictionary();
// 处理子表数据
newDataMap = await GetChildTableData(templateInfo, link, dataMap, newDataMap, true);
int dicCount = newDataMap.Keys.Count;
string[] strKey = new string[dicCount];
newDataMap.Keys.CopyTo(strKey, 0);
for (int i = 0; i < strKey.Length; i++)
{
FieldsModel? model = templateInfo.FieldsModelList.Find(m => m.__vModel__ == strKey[i]);
if (model != null)
{
List> childModelData = new List>();
foreach (Dictionary? item in newDataMap[strKey[i]].ToObject>>())
{
Dictionary dic = new Dictionary();
foreach (KeyValuePair value in item)
{
FieldsModel? child = model.__config__.children.Find(c => c.__vModel__ == value.Key);
if (child != null && value.Value != null)
{
if (child.__config__.jnpfKey.Equals(JnpfKeyConst.DATE))
{
var keyValue = value.Value.ToString();
DateTime dtDate;
if (DateTime.TryParse(keyValue, out dtDate)) dic.Add(value.Key, keyValue.ParseToDateTime().ParseToUnixTime());
else dic.Add(value.Key, value.Value.ToString().TimeStampToDateTime().ParseToUnixTime());
}
else dic.Add(value.Key, value.Value);
}
}
childModelData.Add(dic);
}
if (childModelData.Count > 0)
{
// 将关键字查询传输的id转换成名称
if (model.__config__.children.Any(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()))
newDataMap[strKey[i]] = await _formDataParsing.GetKeyData(model.__config__.children.Where(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()).ToList(), childModelData, templateInfo.ColumnData, "List", 2, "F_Id", dataMap);
newDataMap[strKey[i]] = await _formDataParsing.GetKeyData(model.__config__.children.Where(x => x.__config__.templateJson == null).ToList(), childModelData, templateInfo.ColumnData.ToObject());
}
}
}
List> listEntity = new List>() { dataMap };
// 控件联动
var tempDataMap = new Dictionary();
if (templateInfo.SingleFormData.Any(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()))
tempDataMap = (await _formDataParsing.GetKeyData(templateInfo.SingleFormData.Where(x => x.__config__.templateJson != null && x.__config__.templateJson.Any()).ToList(), listEntity, templateInfo.ColumnData)).FirstOrDefault();
tempDataMap = (await _formDataParsing.GetKeyData(templateInfo.SingleFormData.Where(x => x.__config__.templateJson == null).ToList(), listEntity, templateInfo.ColumnData)).FirstOrDefault();
// 将关键字查询传输的id转换成名称
foreach (var entryMap in tempDataMap)
{
if (entryMap.Value != null)
{
var model = templateInfo.FieldsModelList.Where(m => m.__vModel__.Contains(entryMap.Key)).FirstOrDefault();
if (model != null && entryMap.Key.Equals(model.__vModel__)) newDataMap[entryMap.Key] = entryMap.Value;
else if (templateInfo.FieldsModelList.Where(m => m.__vModel__ == entryMap.Key.Replace("_id", string.Empty)).Any()) newDataMap[entryMap.Key] = entryMap.Value;
}
}
_formDataParsing.GetBARAndQR(templateInfo.FieldsModelList, newDataMap, dataMap); // 处理 条形码 、 二维码 控件
if (!newDataMap.ContainsKey("id")) newDataMap.Add("id", id);
return newDataMap.ToJsonString();
}
#endregion
#region Post
///
/// 创建在线开发功能.
///
/// 功能模板实体.
/// 数据输入.
///
public async Task Create(VisualDevEntity templateEntity, VisualDevModelDataCrInput dataInput)
{
string? mainId = SnowflakeIdHelper.NextId();
DbLinkEntity link = await GetDbLink(templateEntity.DbLinkId);
var haveTableSql = await CreateHaveTableSql(templateEntity, dataInput, mainId);
// 主表自增长Id.
if (haveTableSql.ContainsKey("MainTableReturnIdentity")) haveTableSql.Remove("MainTableReturnIdentity");
try
{
_db.BeginTran();
foreach (var item in haveTableSql) await _databaseService.ExecuteSql(link, item.Key, item.Value); // 新增功能数据
_db.CommitTran();
}
catch (Exception)
{
_db.RollbackTran();
throw;
}
}
///
/// 创建有表SQL.
///
///
///
///
///
public async Task>>> CreateHaveTableSql(VisualDevEntity templateEntity, VisualDevModelDataCrInput dataInput, string mainId)
{
TemplateParsingBase templateInfo = new TemplateParsingBase(templateEntity); // 解析模板控件
templateInfo.DbLink = await GetDbLink(templateEntity.DbLinkId);
return await GetCreateSqlByTemplate(templateInfo, dataInput, mainId);
}
public async Task>>> GetCreateSqlByTemplate(TemplateParsingBase templateInfo, VisualDevModelDataCrInput dataInput, string mainId)
{
Dictionary? allDataMap = dataInput.data.ToObject>();
if (!templateInfo.VerifyTemplate()) throw Oops.Oh(ErrorCode.D1401); // 验证模板
// 处理系统控件(模板开启行编辑)
if (templateInfo.ColumnData.type.Equals(4) && _userManager.UserOrigin.Equals("pc"))
{
templateInfo.GenerateFields.ForEach(item =>
{
if (!allDataMap.ContainsKey(item.__vModel__)) allDataMap.Add(item.__vModel__, string.Empty);
if (item.__config__.jnpfKey.Equals(JnpfKeyConst.CREATETIME) && allDataMap.ContainsKey(item.__vModel__))
{
var value = allDataMap[item.__vModel__].ToString();
allDataMap.Remove(item.__vModel__);
allDataMap.Add(item.__vModel__, DateTime.Now.ToString());
}
});
}
allDataMap = await GenerateFeilds(templateInfo.FieldsModelList.ToJsonString(), allDataMap, true); // 生成系统自动生成字段
DbLinkEntity link = templateInfo.DbLink;
List? tableList = _databaseService.GetFieldList(link, templateInfo.MainTableName); // 获取主表 表结构 信息
DbTableFieldModel? mainPrimary = tableList.Find(t => t.primaryKey); // 主表主键
string? dbType = link?.DbType != null ? link.DbType : _visualDevRepository.AsSugarClient().CurrentConnectionConfig.DbType.ToString();
// 验证唯一值
UniqueVerify(link, templateInfo, allDataMap, mainPrimary?.field, mainId, false);
// 新增SQL
Dictionary>> dictionarySql = new Dictionary>>();
var tableField = new Dictionary(); // 字段和值
templateInfo?.MainTableFieldsModelList.ForEach(item =>
{
if (allDataMap.ContainsKey(item.__vModel__))
{
object? itemData = allDataMap[item.__vModel__];
if (item.__vModel__.IsNotEmptyOrNull() && itemData != null && !string.IsNullOrEmpty(itemData.ToString()) && itemData.ToString() != "[]")
{
var value = _formDataParsing.InsertValueHandle(dbType, tableList, item.__vModel__, itemData, templateInfo.MainTableFieldsModelList);
tableField.Add(item.__vModel__, value);
}
}
});
// 主键策略(雪花Id)
if (templateInfo.FormModel.primaryKeyPolicy.Equals(1)) tableField.Add(mainPrimary?.field, mainId);
// 前端空提交
if (!tableField.Any()) tableField.Add(tableList.Where(x => !x.primaryKey).First().field, null);
// 拼接主表 sql
dictionarySql.Add(templateInfo.MainTableName, new List>() { tableField });
// 流程表单 需要增加字段 F_FlowTaskId
if (templateInfo.visualDevEntity != null && templateInfo.visualDevEntity.EnableFlow.Equals(1))
{
if (!tableList.Any(x => SqlFunc.ToLower(x.field) == "f_flowtaskid"))
{
List? pFieldList = new List() { new DbTableFieldModel() { field = "F_FlowTaskId", fieldName = "流程Id", dataType = "varchar", dataLength = "50", allowNull = 1 } };
_databaseService.AddTableColumn(link, templateInfo.MainTableName, pFieldList);
}
dictionarySql[templateInfo.MainTableName].First().Add("F_FlowTaskId", mainId);
}
// 自增长主键 需要返回的自增id
if (templateInfo.FormModel.primaryKeyPolicy.Equals(2))
{
var mainSql = dictionarySql.First();
mainId = (await _databaseService.ExecuteReturnIdentityAsync(link, mainSql.Key, mainSql.Value)).ToString();
if (mainId.Equals("0")) throw Oops.Oh(ErrorCode.D1402);
tableField.Clear();
dictionarySql.Clear();
tableField.Add("ReturnIdentity", mainId);
dictionarySql.Add("MainTableReturnIdentity", new List>() { tableField });
}
// 拼接副表 sql
if (templateInfo.AuxiliaryTableFieldsModelList.Any())
{
templateInfo.AuxiliaryTableFieldsModelList.Select(x => x.__config__.tableName).Distinct().ToList().ForEach(tbname =>
{
tableField = new Dictionary();
// 主键策略(雪花Id)
if (templateInfo.FormModel.primaryKeyPolicy.Equals(1))
tableField.Add(_databaseService.GetFieldList(link, tbname)?.Find(x => x.primaryKey).field, SnowflakeIdHelper.NextId());
// 外键
tableField.Add(templateInfo?.AllTable?.Find(t => t.table == tbname).tableField, mainId);
// 字段
templateInfo.AuxiliaryTableFieldsModelList.Select(x => x.__vModel__).Where(x => x.Contains("jnpf_" + tbname + "_jnpf_")).ToList().ForEach(item =>
{
object? itemData = allDataMap.Where(x => x.Key == item).Count() > 0 ? allDataMap[item] : null;
if (item.IsNotEmptyOrNull() && itemData != null && !string.IsNullOrEmpty(itemData.ToString()) && itemData.ToString() != "[]")
{
var value = _formDataParsing.InsertValueHandle(dbType, tableList, item, allDataMap[item], templateInfo.FieldsModelList);
tableField.Add(item.ReplaceRegex(@"(\w+)_jnpf_", string.Empty), value);
}
});
dictionarySql.Add(tbname, new List>() { tableField });
});
}
// 拼接子表 sql
foreach (string? item in allDataMap.Where(d => d.Key.ToLower().Contains("tablefield")).Select(d => d.Key).ToList())
{
if (!templateInfo.AllFieldsModel.Any(x => x.__vModel__.Equals(item)) || !templateInfo.AllFieldsModel.Find(x => x.__vModel__.Equals(item)).__config__.jnpfKey.Equals(JnpfKeyConst.TABLE)) continue;
// 查找到该控件数据
object? objectData = allDataMap[item];
List>? model = objectData.ToObject>>();
if (model != null && model.Count > 0)
{
// 利用key去找模板
FieldsModel? fieldsModel = templateInfo.FieldsModelList.Find(f => f.__vModel__ == item);
Engine.Model.TableModel? childTable = templateInfo.AllTable.Find(t => t.table == fieldsModel.__config__.tableName);
tableList = new List();
tableList = _databaseService.GetFieldList(link, childTable?.table);
DbTableFieldModel? childPrimary = tableList.Find(t => t.primaryKey);
foreach (Dictionary? data in model)
{
if (data.Count > 0)
{
tableField = new Dictionary();
// 主键策略(雪花Id)
if (templateInfo.FormModel.primaryKeyPolicy.Equals(1)) tableField.Add(childPrimary.field, SnowflakeIdHelper.NextId());
// 外键
tableField.Add(childTable.tableField, mainId);
// 字段
foreach (KeyValuePair child in data)
{
if (child.Key.IsNotEmptyOrNull() && child.Value != null && child.Value.ToString() != "[]" && child.Value.ToString() != string.Empty)
{
var value = _formDataParsing.InsertValueHandle(dbType, tableList, child.Key, child.Value, fieldsModel?.__config__.children);
tableField.Add(child.Key, value);
}
}
if (dictionarySql.ContainsKey(fieldsModel.__config__.tableName))
dictionarySql[fieldsModel.__config__.tableName].Add(tableField);
else
dictionarySql.Add(fieldsModel.__config__.tableName, new List>() { tableField });
}
}
}
}
// 处理 开启 并发锁定
await OptimisticLocking(link, templateInfo);
return dictionarySql;
}
///
/// 修改在线开发功能.
///
/// 修改ID.
///
///
///
public async Task Update(string id, VisualDevEntity templateEntity, VisualDevModelDataUpInput visualdevModelDataUpForm)
{
TemplateParsingBase templateInfo = new TemplateParsingBase(templateEntity); // 解析模板控件
if (templateInfo.ColumnData.type.Equals(4) && _userManager.UserOrigin.Equals("pc"))
{
// 剔除 [增加前端回显字段 : key_name]
Dictionary oldDataMap = visualdevModelDataUpForm.data.ToObject>();
Dictionary newDataMap = new Dictionary();
foreach (var item in oldDataMap)
{
var key = item.Key.Replace("_name", string.Empty);
if (!newDataMap.ContainsKey(key)) newDataMap.Add(key, oldDataMap[key]);
}
if (newDataMap.Any()) visualdevModelDataUpForm.data = newDataMap.ToJsonString();
}
DbLinkEntity link = await GetDbLink(templateEntity.DbLinkId);
var haveTableSql = await UpdateHaveTableSql(templateEntity, visualdevModelDataUpForm, id);
try
{
_db.BeginTran();
foreach (var item in haveTableSql) await _databaseService.ExecuteSql(link, item); // 修改功能数据
_db.CommitTran();
}
catch (Exception ex)
{
_db.RollbackTran();
throw;
}
}
///
/// 修改有表SQL.
///
///
///
///
///
public async Task> UpdateHaveTableSql(VisualDevEntity templateEntity, VisualDevModelDataUpInput visualdevModelDataUpForm, string id)
{
TemplateParsingBase templateInfo = new TemplateParsingBase(templateEntity); // 解析模板控件
templateInfo.DbLink = await GetDbLink(templateEntity.DbLinkId);
return await GetUpdateSqlByTemplate(templateInfo, visualdevModelDataUpForm, id);
}
public async Task> GetUpdateSqlByTemplate(TemplateParsingBase templateInfo, VisualDevModelDataUpInput visualdevModelDataUpForm, string id)
{
Dictionary? allDataMap = visualdevModelDataUpForm.data.ToObject>();
if (!templateInfo.VerifyTemplate()) throw Oops.Oh(ErrorCode.D1401); // 验证模板
// 处理系统控件(模板开启行编辑)
if (_userManager.UserOrigin.Equals("pc") && templateInfo.ColumnData.type.Equals(4))
{
// 处理显示列和提交的表单数据匹配(行编辑空数据 前端会过滤该控件)
templateInfo.ColumnData.columnList.Where(x => !allDataMap.ContainsKey(x.prop) && x.__config__.visibility.Equals("pc")).ToList()
.ForEach(item => allDataMap.Add(item.prop, string.Empty));
templateInfo.GenerateFields.ForEach(item =>
{
if (!allDataMap.ContainsKey(item.__vModel__)) allDataMap.Add(item.__vModel__, string.Empty);
if (item.__config__.jnpfKey.Equals(JnpfKeyConst.CREATETIME) && allDataMap.ContainsKey(item.__vModel__))
{
var value = allDataMap[item.__vModel__].ToString();
allDataMap.Remove(item.__vModel__);
DateTime dtDate;
if (DateTime.TryParse(value, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", value);
else value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", value.TimeStampToDateTime());
allDataMap.Add(item.__vModel__, value);
}
});
}
allDataMap = await GenerateFeilds(templateInfo.FieldsModelList.ToJsonString(), allDataMap, false); // 生成系统自动生成字段
DbLinkEntity link = templateInfo.DbLink;
List? tableList = _databaseService.GetFieldList(link, templateInfo.MainTableName); // 获取主表 表结构 信息
DbTableFieldModel? mainPrimary = tableList.Find(t => t.primaryKey); // 主表主键
string? dbType = link?.DbType != null ? link.DbType : _visualDevRepository.AsSugarClient().CurrentConnectionConfig.DbType.ToString();
id = GetPIdsByFlowIds(link, templateInfo, mainPrimary.field, new List() { id }).First().Value;
// 验证唯一值
UniqueVerify(link, templateInfo, allDataMap, mainPrimary?.field, id, true);
// 主表查询语句
List mainSql = new List();
var fieldSql = new List(); // key 字段名, value 修改值
// 拼接主表 sql
templateInfo?.MainTableFieldsModelList.ForEach(item =>
{
if (item.__vModel__.IsNotEmptyOrNull() && allDataMap.ContainsKey(item.__vModel__))
fieldSql.Add(string.Format("{0}={1}", item.__vModel__, _formDataParsing.InsertValueHandle(dbType, tableList, item.__vModel__, allDataMap[item.__vModel__], templateInfo.MainTableFieldsModelList, "update")));
});
if (fieldSql.Any()) mainSql.Add(string.Format("update {0} set {1} where {2}='{3}';", templateInfo?.MainTableName, string.Join(",", fieldSql), mainPrimary?.field, id));
// 拼接副表 sql
if (templateInfo.AuxiliaryTableFieldsModelList.Any())
{
templateInfo.AuxiliaryTableFieldsModelList.Select(x => x.__config__.tableName).Distinct().ToList().ForEach(tbname =>
{
List? tableAllField = _databaseService.GetFieldList(link, tbname); // 数据库里获取表的所有字段
List? tableFieldList = templateInfo.AuxiliaryTableFieldsModelList.Where(x => x.__config__.tableName.Equals(tbname)).Select(x => x.__vModel__).ToList();
fieldSql.Clear(); // key 字段名, value 修改值
templateInfo.AuxiliaryTableFieldsModelList.Where(x => x.__config__.tableName.Equals(tbname)).Select(x => x.__vModel__).ToList().ForEach(item =>
{
// 前端未填写数据的字段,默认会找不到字段名,需要验证
object? itemData = allDataMap.Where(x => x.Key == item).Count() > 0 ? allDataMap[item] : null;
if (item.IsNotEmptyOrNull() && itemData != null)
fieldSql.Add(string.Format("{0}={1}", item.ReplaceRegex(@"(\w+)_jnpf_", string.Empty), _formDataParsing.InsertValueHandle(dbType, tableList, item, allDataMap[item], templateInfo.FieldsModelList, "update")));
});
var tableField = templateInfo.AllTable.Find(t => t.table.Equals(tbname)).tableField;
if (fieldSql.Any()) mainSql.Add(string.Format("update {0} set {1} where {2}='{3}';", tbname, string.Join(",", fieldSql), tableField, id));
});
}
// 非行编辑
if (!templateInfo.ColumnData.type.Equals(4))
{
// 删除子表数据
if (templateInfo.AllTable.Any(x => x.typeId.Equals("0")))
{
templateInfo.AllTable.Where(x => x.typeId.Equals("0") && templateInfo.ChildTableFieldsModelList.Select(x => x.__config__.tableName).Contains(x.table))
.ToList().ForEach(item => mainSql.Add(string.Format("delete from {0} where {1}='{2}';", item.table, item.tableField, id))); // 删除所有涉及子表数据 sql
// 拼接子表 sql
foreach (string? item in allDataMap.Where(d => d.Key.ToLower().Contains("tablefield")).Select(d => d.Key).ToList())
{
if (!templateInfo.AllFieldsModel.Any(x => x.__vModel__.Equals(item)) || !templateInfo.AllFieldsModel.Find(x => x.__vModel__.Equals(item)).__config__.jnpfKey.Equals(JnpfKeyConst.TABLE)) continue;
// 查找到该控件数据
object? objectData = allDataMap[item];
List>? model = objectData.ToObject>>();
if (model != null && model.Count > 0)
{
// 利用key去找模板
FieldsModel? fieldsModel = templateInfo.FieldsModelList.Find(f => f.__vModel__ == item);
ConfigModel? fieldsConfig = fieldsModel?.__config__;
StringBuilder childColumn = new StringBuilder();
List