using JNPF.Common.Const;
using JNPF.Common.Extension;
using JNPF.Common.Models;
using JNPF.Common.Security;
using JNPF.Systems.Entitys.System;
using JNPF.VisualDev.Engine.Model;
using JNPF.VisualDev.Entitys;
using Mapster;
namespace JNPF.VisualDev.Engine.Core;
///
/// 模板解析 基础类.
///
public class TemplateParsingBase
{
public TemplateParsingBase() { }
///
/// 模板实体.
///
public VisualDevEntity visualDevEntity { get; set; }
///
/// 页面类型 (1、纯表单,2、表单加列表,3、表单列表工作流).
///
public int WebType { get; set; }
///
/// 是否有表 (true 有表, false 无表).
///
public bool IsHasTable { get; set; }
///
/// 表单配置JSON模型.
///
public FormDataModel? FormModel { get; set; }
///
/// 列配置JSON模型.
///
public ColumnDesignModel ColumnData { get; set; }
///
/// App列配置JSON模型.
///
public ColumnDesignModel AppColumnData { get; set; }
///
/// 所有控件集合.
///
public List AllFieldsModel { get; set; }
///
/// 所有控件集合(已剔除布局控件).
///
public List FieldsModelList { get; set; }
///
/// 主表控件集合.
///
public List MainTableFieldsModelList { get; set; }
///
/// 副表控件集合.
///
public List AuxiliaryTableFieldsModelList { get; set; }
///
/// 子表控件集合.
///
public List ChildTableFieldsModelList { get; set; }
///
/// 主/副表控件集合(列表展示数据控件).
///
public List SingleFormData { get; set; }
///
/// 所有表.
///
public List AllTable { get; set; }
///
/// 主表.
///
public TableModel? MainTable { get; set; }
///
/// 主表 表名.
///
public string? MainTableName { get; set; }
///
/// 主/副表 系统生成控件集合.
///
public List GenerateFields { get; set; }
///
/// 主表 vModel 字段 字典.
/// Key : vModel , Value : 主表.vModel.
///
public Dictionary MainTableFields { get; set; }
///
/// 副表 vModel 字段 字典.
/// Key : vModel , Value : 副表.vModel.
///
public Dictionary AuxiliaryTableFields { get; set; }
///
/// 子表 vModel 字段 字典.
/// Key : 设计子表-vModel , Value : 子表.vModel.
///
public Dictionary ChildTableFields { get; set; }
///
/// 所有表 vModel 字段 字典.
/// Key : 设计子表-vModel , Value : 表.vModel.
///
public Dictionary AllTableFields { get; set; }
///
/// 功能名称.
///
public string FullName { get; set; }
///
/// 主表主键名.
///
public string MainPrimary { get; set; }
///
/// 数据库连接.
///
public DbLinkEntity DbLink { get; set; }
///
/// 导入模式.(1 仅新增,2 更新和新增数据).
///
public string dataType { get; set; } = "1";
///
/// 导入数据列表.
///
public List selectKey { get; set; }
///
/// 模板解析帮助 构造 (功能表单).
///
/// 表单Json.
/// 涉及表Json.
///
public TemplateParsingBase(string formJson, string tables, bool isFlowTask = false)
{
InitByFormType(formJson, tables, 2);
}
///
/// 模板解析帮助 构造.
///
/// 表单Json.
/// 涉及表Json.
/// 表单类型(1:系统表单 2:自定义表单).
public TemplateParsingBase(string formJson, string tables, int formType)
{
InitByFormType(formJson, tables, formType);
}
///
/// 模板解析帮助 构造.
///
/// 功能实体
///
public TemplateParsingBase(VisualDevEntity entity, bool isFlowTask = false)
{
visualDevEntity = entity;
WebType = entity.WebType;
if (entity.FlowId.IsNotEmptyOrNull() && entity.EnableFlow.Equals(1)) WebType = 3;
FormDataModel formModel = entity.FormData.ToObject();
FormModel = formModel; // 表单Json模型
IsHasTable = !string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables); // 是否有表
AllFieldsModel = GetInDataFieldsModel(formModel.fields.ToJsonString().ToObject>()); // 所有控件集合
FieldsModelList = GetInDataFieldsModel(formModel.fields); // 已剔除布局控件集合
MainTable = entity.Tables.ToList().Find(m => m.typeId.Equals("1")); // 主表
MainTableName = MainTable?.table; // 主表名称
AddChlidTableFeildsModel();
// 处理旧控件 部分没有 tableName
FieldsModelList.Where(x => string.IsNullOrWhiteSpace(x.__config__.tableName)).ToList().ForEach(item =>
{
if (item.__vModel__.Contains("_jnpf_")) item.__config__.tableName = item.__vModel__.ReplaceRegex(@"_jnpf_(\w+)", string.Empty).Replace("jnpf_", string.Empty); // 副表
else item.__config__.tableName = MainTableName != null ? MainTableName : string.Empty; // 主表
});
AllTable = entity.Tables.ToObject>(); // 所有表
AuxiliaryTableFieldsModelList = FieldsModelList.Where(x => x.__vModel__.Contains("_jnpf_")).ToList(); // 单控件副表集合
ChildTableFieldsModelList = FieldsModelList.Where(x => x.__config__.jnpfKey == "table").ToList(); // 子表集合
MainTableFieldsModelList = FieldsModelList.Except(AuxiliaryTableFieldsModelList).Except(ChildTableFieldsModelList).ToList(); // 主表控件集合
SingleFormData = FieldsModelList.Where(x => x.__config__.jnpfKey != "table").ToList(); // 非子表集合
GenerateFields = GetGenerateFields(); // 系统生成控件
MainTableFields = new Dictionary();
AuxiliaryTableFields = new Dictionary();
ChildTableFields = new Dictionary();
AllTableFields = new Dictionary();
MainTableFieldsModelList.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
MainTableFields.Add(x.__vModel__, x.__config__.tableName + "." + x.__vModel__);
AllTableFields.Add(x.__vModel__, x.__config__.tableName + "." + x.__vModel__);
});
AuxiliaryTableFieldsModelList.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
AuxiliaryTableFields.Add(x.__vModel__, x.__vModel__.Replace("_jnpf_", ".").Replace("jnpf_", string.Empty));
AllTableFields.Add(x.__vModel__, x.__vModel__.Replace("_jnpf_", ".").Replace("jnpf_", string.Empty));
});
ChildTableFieldsModelList.ForEach(item =>
{
item.__config__.children.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
ChildTableFields.Add(item.__vModel__ + "-" + x.__vModel__, item.__config__.tableName + "." + x.__vModel__);
AllTableFields.Add(item.__vModel__ + "-" + x.__vModel__, item.__config__.tableName + "." + x.__vModel__);
});
});
if (!string.IsNullOrWhiteSpace(entity.ColumnData)) ColumnData = entity.ColumnData.ToObject(); // 列配置模型
else ColumnData = new ColumnDesignModel();
if (!string.IsNullOrWhiteSpace(entity.AppColumnData)) AppColumnData = entity.AppColumnData.ToObject(); // 列配置模型
else AppColumnData = new ColumnDesignModel();
if (AppColumnData.columnList != null && AppColumnData.columnList.Any())
{
AppColumnData.columnList.ForEach(item =>
{
var addColumn = ColumnData.columnList.Find(x => x.prop == item.prop);
if (addColumn == null) ColumnData.columnList.Add(item);
});
}
if (AppColumnData.searchList != null && AppColumnData.searchList.Any())
{
AppColumnData.searchList.ForEach(item =>
{
var addSearch = ColumnData.searchList.Find(x => x.__config__.jnpfKey == item.__config__.jnpfKey);
if (addSearch == null) ColumnData.searchList.Add(item);
});
}
if (ColumnData.searchList != null && ColumnData.searchList.Any())
{
ColumnData.searchList.Where(x => x.__config__.jnpfKey == JnpfKeyConst.CASCADER).ToList().ForEach(item =>
{
var it = SingleFormData.FirstOrDefault(x => x.__vModel__ == item.__vModel__);
if (it != null) item.multiple = it.props.props.multiple;
});
}
FullName = entity.FullName;
if (ColumnData.uploaderTemplateJson != null && ColumnData.uploaderTemplateJson.selectKey != null)
{
dataType = ColumnData.uploaderTemplateJson.dataType;
selectKey = new List();
// 列顺序
AllFieldsModel.ForEach(item =>
{
if (ColumnData.uploaderTemplateJson.selectKey.Any(x => x.Equals(item.__vModel__))) selectKey.Add(item.__vModel__);
});
}
}
///
/// 模板解析帮助 构造(代码生成用).
///
/// 数据连接.
/// 控件集合.
/// 主/副/子 表.
/// 主表主键.
/// 页面类型 (1、纯表单,2、表单加列表,3、表单列表工作流).
/// 主键策略(1 雪花ID 2 自增长ID).
/// 导入导出数据列名集合.
/// 导入类型 1 新增, 2 新增和修改.
/// 是否开启流程 1 开启.
public TemplateParsingBase(
DbLinkEntity dblink,
List fieldList,
List tables,
string mainPrimary,
int webType,
int primaryKeyPolicy,
List uploaderKey,
string _dataType, int enableFlow = 0)
{
if (enableFlow.Equals(1)) visualDevEntity = new VisualDevEntity() { EnableFlow = 1 };
DbLink = dblink;
AllTable = tables.ToObject>(); // 所有表
FieldsModelList = fieldList;
AllFieldsModel = FieldsModelList.Copy();
MainTable = AllTable.Find(m => m.typeId.Equals("1")); // 主表
MainTableName = MainTable?.table; // 主表名称
MainPrimary = mainPrimary;
AddCodeGenChlidTableFeildsModel();
// 处理旧控件 部分没有 tableName
FieldsModelList.Where(x => string.IsNullOrWhiteSpace(x.__config__.tableName)).ToList().ForEach(item =>
{
if (item.__vModel__.Contains("_jnpf_")) item.__config__.tableName = item.__vModel__.ReplaceRegex(@"_jnpf_(\w+)", string.Empty).Replace("jnpf_", string.Empty); // 副表
else item.__config__.tableName = MainTableName != null ? MainTableName : string.Empty; // 主表
});
AuxiliaryTableFieldsModelList = FieldsModelList.Where(x => x.__vModel__.Contains("_jnpf_")).ToList(); // 单控件副表集合
ChildTableFieldsModelList = FieldsModelList.Where(x => x.__config__.jnpfKey == "table").ToList(); // 子表集合
MainTableFieldsModelList = FieldsModelList.Except(AuxiliaryTableFieldsModelList).Except(ChildTableFieldsModelList).ToList(); // 主表控件集合
SingleFormData = FieldsModelList.Where(x => x.__config__.jnpfKey != "table").ToList(); // 非子表集合
GenerateFields = GetGenerateFields(); // 系统生成控件
MainTableFields = new Dictionary();
AuxiliaryTableFields = new Dictionary();
ChildTableFields = new Dictionary();
AllTableFields = new Dictionary();
MainTableFieldsModelList.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
MainTableFields.Add(x.__vModel__, x.__config__.tableName + "." + x.__vModel__);
AllTableFields.Add(x.__vModel__, x.__config__.tableName + "." + x.__vModel__);
});
AuxiliaryTableFieldsModelList.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
AuxiliaryTableFields.Add(x.__vModel__, x.__vModel__.Replace("_jnpf_", ".").Replace("jnpf_", string.Empty));
AllTableFields.Add(x.__vModel__, x.__vModel__.Replace("_jnpf_", ".").Replace("jnpf_", string.Empty));
});
ChildTableFieldsModelList.ForEach(item =>
{
item.__config__.children.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
ChildTableFields.Add(item.__vModel__ + "-" + x.__vModel__, item.__config__.tableName + "." + x.__vModel__);
AllTableFields.Add(item.__vModel__ + "-" + x.__vModel__, item.__config__.tableName + "." + x.__vModel__);
});
});
WebType = webType;
FormModel = new FormDataModel();
FormModel.primaryKeyPolicy = primaryKeyPolicy;
ColumnData = new ColumnDesignModel();
ColumnData.type = 1;
AppColumnData = new ColumnDesignModel();
selectKey = uploaderKey;
dataType = _dataType;
}
///
/// 验证模板.
///
/// true 通过.
public bool VerifyTemplate()
{
if (FieldsModelList != null && FieldsModelList.Any(x => x.__config__.jnpfKey == "table"))
{
foreach (FieldsModel? item in ChildTableFieldsModelList)
{
FieldsModel? tc = AuxiliaryTableFieldsModelList.Find(x => x.__vModel__.Contains(item.__config__.tableName + "_jnpf_"));
if (tc != null) return false;
}
}
return true;
}
///
/// 获取带数据转换的控件
/// 移除模板内的布局类型控件.
///
/// 组件集合.
/// 带数据的控件.
public List GetInDataFieldsModel(List fieldsModelList)
{
List? template = new List();
// 将模板内的无限children解析出来
// 不包含子表children
foreach (FieldsModel? item in fieldsModelList)
{
ConfigModel? config = item.__config__;
switch (config.jnpfKey)
{
case JnpfKeyConst.TABLE: // 表格
template.Add(item);
break;
case JnpfKeyConst.ROW: // 卡片
case JnpfKeyConst.CARD: // 栅格布局
template.AddRange(GetInDataFieldsModel(config.children));
break;
case JnpfKeyConst.COLLAPSE: // 折叠面板
case JnpfKeyConst.TAB: // Tab标签
config.children.ForEach(item => template.AddRange(GetInDataFieldsModel(item.__config__.children)));
break;
case JnpfKeyConst.JNPFTEXT: // 文本
case JnpfKeyConst.DIVIDER: // 分割线
case JnpfKeyConst.BUTTON: // 按钮
case JnpfKeyConst.GROUPTITLE: // 分组标题
case JnpfKeyConst.ALERT:
case JnpfKeyConst.LINK: // 链接
break;
default:
template.Add(item);
break;
}
}
return template;
}
///
/// 获取系统生成字段空格键.
///
///
public List GetGenerateFields()
{
// 系统生成字段 key
var gfList = new List() { JnpfKeyConst.BILLRULE, JnpfKeyConst.CREATEUSER, JnpfKeyConst.CREATETIME, JnpfKeyConst.MODIFYUSER, JnpfKeyConst.MODIFYTIME, JnpfKeyConst.CURRPOSITION, JnpfKeyConst.CURRORGANIZE, JnpfKeyConst.UPLOADFZ };
return SingleFormData.Where(x => gfList.Contains(x.__config__.jnpfKey)).ToList();
}
///
/// 处理子表内的控件 添加到所有控件.
///
private void AddChlidTableFeildsModel()
{
var ctList = new List();
AllFieldsModel.Where(x => x.__config__.jnpfKey.Equals(JnpfKeyConst.TABLE)).ToList().ForEach(item =>
{
item.__config__.children.Where(it => it.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(it => it.__vModel__ = item.__vModel__ + "-" + it.__vModel__);
ctList.AddRange(GetInDataFieldsModel(item.__config__.children));
});
AllFieldsModel.AddRange(ctList);
}
///
/// 处理子表内的控件 添加到所有控件.
///
private void AddCodeGenChlidTableFeildsModel()
{
var ctList = new List();
AllFieldsModel.Where(x => x.__config__.jnpfKey.Equals(JnpfKeyConst.TABLE)).ToList().ForEach(item =>
{
item.__config__.children.Where(it => it.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(it =>
{
it.__config__.label = it.__config__.label.Replace(it.__vModel__, item.__vModel__ + "-" + it.__vModel__);
it.__vModel__ = item.__vModel__ + "-" + it.__vModel__;
});
ctList.AddRange(item.__config__.children);
});
AllFieldsModel.AddRange(ctList);
}
///
/// 根据表单类型初始化.
///
/// 表单Json.
/// 涉及表Json.
/// 表单类型(1:系统表单 2:自定义表单).
private void InitByFormType(string formJson, string tables, int formType)
{
if (formType.Equals(1))
{
AllFieldsModel = new List();
var fields = formJson.ToObject>>();
fields.ForEach(it =>
{
if (it.ContainsKey("filedId"))
AllFieldsModel.Add(new FieldsModel() { __vModel__ = it["filedId"].ToString(), __config__ = new ConfigModel() { label = it["filedName"].ToString(), jnpfKey = JnpfKeyConst.COMINPUT } });
});
FieldsModelList = AllFieldsModel;
}
else
{
FormDataModel formModel = formJson.ToObject();
FormModel = formModel; // 表单Json模型
IsHasTable = !string.IsNullOrEmpty(tables) && !"[]".Equals(tables); // 是否有表
AllFieldsModel = GetInDataFieldsModel(formModel.fields.ToJsonString().ToObject>()); // 所有控件集合
FieldsModelList = GetInDataFieldsModel(formModel.fields); // 已剔除布局控件集合
MainTable = tables.ToList().Find(m => m.typeId.Equals("1")); // 主表
MainTableName = MainTable?.table; // 主表名称
AddChlidTableFeildsModel();
// 处理旧控件 部分没有 tableName
FieldsModelList.Where(x => string.IsNullOrWhiteSpace(x.__config__.tableName)).ToList().ForEach(item =>
{
if (item.__vModel__.Contains("_jnpf_")) item.__config__.tableName = item.__vModel__.ReplaceRegex(@"_jnpf_(\w+)", string.Empty).Replace("jnpf_", string.Empty); // 副表
else item.__config__.tableName = MainTableName != null ? MainTableName : string.Empty; // 主表
});
AllTable = tables.ToObject>(); // 所有表
AuxiliaryTableFieldsModelList = FieldsModelList.Where(x => x.__vModel__.Contains("_jnpf_")).ToList(); // 单控件副表集合
ChildTableFieldsModelList = FieldsModelList.Where(x => x.__config__.jnpfKey == "table").ToList(); // 子表集合
MainTableFieldsModelList = FieldsModelList.Except(AuxiliaryTableFieldsModelList).Except(ChildTableFieldsModelList).ToList(); // 主表控件集合
SingleFormData = FieldsModelList.Where(x => x.__config__.jnpfKey != "table").ToList(); // 非子表集合
GenerateFields = GetGenerateFields(); // 系统生成控件
MainTableFields = new Dictionary();
AuxiliaryTableFields = new Dictionary();
ChildTableFields = new Dictionary();
AllTableFields = new Dictionary();
MainTableFieldsModelList.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
MainTableFields.Add(x.__vModel__, x.__config__.tableName + "." + x.__vModel__);
AllTableFields.Add(x.__vModel__, x.__config__.tableName + "." + x.__vModel__);
});
AuxiliaryTableFieldsModelList.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
AuxiliaryTableFields.Add(x.__vModel__, x.__vModel__.Replace("_jnpf_", ".").Replace("jnpf_", string.Empty));
AllTableFields.Add(x.__vModel__, x.__vModel__.Replace("_jnpf_", ".").Replace("jnpf_", string.Empty));
});
ChildTableFieldsModelList.ForEach(item =>
{
item.__config__.children.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(x =>
{
ChildTableFields.Add(item.__vModel__ + "-" + x.__vModel__, item.__config__.tableName + "." + x.__vModel__);
AllTableFields.Add(item.__vModel__ + "-" + x.__vModel__, item.__config__.tableName + "." + x.__vModel__);
});
});
ColumnData = new ColumnDesignModel();
AppColumnData = new ColumnDesignModel();
}
}
}