Files
tnb.server/visualdev/Tnb.VisualDev.Engine/Core/FormDataParsing.cs

2155 lines
115 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Manager;
using JNPF.Common.Models;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.RemoteRequest;
using JNPF.RemoteRequest.Extensions;
using JNPF.Systems.Entitys.Model.DataBase;
using JNPF.Systems.Entitys.Model.DataInterFace;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.UnifyResult;
using JNPF.VisualDev.Engine.Enum.VisualDevModelData;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using JNPF.VisualDev.Interfaces;
using JNPF.WorkFlow.Entitys.Entity;
using Mapster;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace JNPF.VisualDev.Engine.Core;
/// <summary>
/// 模板表单列表数据解析.
/// </summary>
public class FormDataParsing : ITransient
{
#region
/// <summary>
/// 用户管理.
/// </summary>
private readonly IUserManager _userManager;
/// <summary>
/// 切库.
/// </summary>
private readonly IDataBaseManager _databaseService;
/// <summary>
/// 数据接口.
/// </summary>
private readonly IDataInterfaceService _dataInterfaceService;
/// <summary>
/// 缓存管理.
/// </summary>
private readonly ICacheManager _cacheManager;
/// <summary>
/// 服务基础仓储.
/// </summary>
private readonly ISqlSugarRepository<VisualDevEntity> _db;
/// <summary>
/// 构造.
/// </summary>
/// <param name="userManager"></param>
/// <param name="cacheManager"></param>
/// <param name="databaseService"></param>
/// <param name="dataInterfaceService"></param>
/// <param name="context"></param>
public FormDataParsing(
IUserManager userManager,
ICacheManager cacheManager,
IDataBaseManager databaseService,
IDataInterfaceService dataInterfaceService,
ISqlSugarRepository<VisualDevEntity> context)
{
_userManager = userManager;
_cacheManager = cacheManager;
_databaseService = databaseService;
_dataInterfaceService = dataInterfaceService;
_db = context;
}
#endregion
#region
/// <summary>
/// 控制模板数据转换.
/// </summary>
/// <param name="data">数据.</param>
/// <param name="fieldsModel">数据模板.</param>
/// <param name="actionType">操作类型(List-列表值,create-创建值,update-更新值,detail-详情值,transition-过渡值,query-查询).</param>
/// <returns>object.</returns>
public object TemplateControlsDataConversion(object data, FieldsModel fieldsModel, string? actionType = null)
{
if (fieldsModel == null || data == null || data.Equals("[]") || data.ToString().Equals("[]") || string.IsNullOrEmpty(data.ToString())) return string.Empty;
try
{
object conversionData = new object();
switch (fieldsModel.__config__.jnpfKey)
{
case JnpfKeyConst.SWITCH: // 开关
conversionData = data.ParseToInt();
break;
case JnpfKeyConst.RATE: // 评分
case JnpfKeyConst.NUMINPUT:
if (fieldsModel.precision.IsNullOrEmpty()) fieldsModel.precision = 0; // 数字输入
if (data.ToString().Contains("."))
{
var len = data.ToString().Split('.').Last().Length;
if (fieldsModel.precision > len) fieldsModel.precision = len;
conversionData = data.ToString().Substring(0, data.ToString().IndexOf(".") + (int)fieldsModel.precision);
}
else conversionData = data;
break;
case JnpfKeyConst.JNPFAMOUNT:
conversionData = data.ParseToDecimal(); // 金额输入
break;
case JnpfKeyConst.CHECKBOX: // 多选框组
{
switch (actionType)
{
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject<List<object>>();
else conversionData = data;
break;
}
}
break;
case JnpfKeyConst.SELECT: // 下拉选择
{
switch (actionType)
{
case "transition":
conversionData = data;
break;
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else conversionData = data;
break;
default:
if (fieldsModel.multiple && actionType != "query")
{
if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject<List<object>>();
else if (data.ToString().Contains(",")) conversionData = string.Join(",", data.ToString().Split(',').ToArray());
else conversionData = data.ToString();
}
else
{
conversionData = data;
}
break;
}
}
break;
case JnpfKeyConst.TIME: // 时间选择
{
conversionData = data;
}
break;
case JnpfKeyConst.TIMERANGE: // 时间范围
{
switch (actionType)
{
case "transition":
conversionData = data;
break;
default:
conversionData = data.ToString().ToObject<List<object>>();
break;
}
}
break;
case JnpfKeyConst.DATE: // 日期选择
{
switch (actionType)
{
case "List":
DateTime dtDate;
if (DateTime.TryParse(data.ToString(), out dtDate))
conversionData = data.ToString();
else
conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data.ToString().TimeStampToDateTime());
break;
case "create":
conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data.ToString().TimeStampToDateTime());
break;
case "detail":
conversionData = data;
break;
default:
try
{
DateTime.Parse(data.ToString());
conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", data.ToString());
}
catch
{
conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", data.ToString().TimeStampToDateTime());
}
break;
}
}
break;
case JnpfKeyConst.DATERANGE: // 日期范围
{
switch (actionType)
{
case "transition":
conversionData = data;
break;
default:
conversionData = data.ToString().ToObject<List<object>>();
break;
}
}
break;
case JnpfKeyConst.CREATETIME: // 创建时间
case JnpfKeyConst.MODIFYTIME: // 修改时间
{
switch (actionType)
{
case "create":
conversionData = data.ToString();
break;
default:
DateTime dtDate;
if (DateTime.TryParse(data.ToString(), out dtDate))
conversionData = data.ToString();
else
conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data.ToString().TimeStampToDateTime());
break;
}
}
break;
case JnpfKeyConst.UPLOADFZ: // 文件上传
switch (actionType)
{
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
if (data.ToJsonString() != "[]")
{
if (data is List<FileControlsModel>) conversionData = data.ToJsonString().ToObject<List<FileControlsModel>>();
else conversionData = data.ToString().ToObject<List<FileControlsModel>>();
}
else
{
conversionData = null;
}
break;
}
break;
case JnpfKeyConst.UPLOADIMG: // 图片上传
{
switch (actionType)
{
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
if (data.ToJsonString() != "[]") conversionData = data.ToString().ToObject<List<FileControlsModel>>();
else conversionData = null;
break;
}
}
break;
case JnpfKeyConst.SLIDER: // 滑块
if (fieldsModel.range) conversionData = data.ToString().ToObject<List<object>>();
else conversionData = data.ParseToInt();
break;
case JnpfKeyConst.ADDRESS: // 省市区联动
{
switch (actionType)
{
case "transition":
conversionData = data;
break;
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
conversionData = data.ToString().ToObject<List<object>>();
break;
}
}
break;
case JnpfKeyConst.TABLE: // 设计子表
break;
case JnpfKeyConst.CASCADER: // 级联
switch (actionType)
{
case "transition":
conversionData = data;
break;
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
{
if (fieldsModel.props.props.multiple) conversionData = data.ToString().ToObject<List<object>>();
else if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject<List<object>>();
else conversionData = data;
}
break;
}
break;
case JnpfKeyConst.COMSELECT: // 公司组件
{
switch (actionType)
{
case "transition":
{
conversionData = data;
}
break;
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
case "List":
{
if (fieldsModel.multiple)
{
conversionData = data.ToString().ToObject<List<List<object>>>();
}
else
{
conversionData = data;
}
}
break;
default:
{
if (fieldsModel.multiple)
{
conversionData = data.ToString().ToObject<List<List<object>>>();
}
else
{
conversionData = data.ToString().ToObject<List<object>>();
}
}
break;
}
}
break;
case JnpfKeyConst.GROUPSELECT: // 分组
case JnpfKeyConst.ROLESELECT: // 角色
case JnpfKeyConst.DEPSELECT: // 部门组件
case JnpfKeyConst.POSSELECT: // 岗位组件
case JnpfKeyConst.USERSELECT: // 用户组件
case JnpfKeyConst.USERSSELECT: // 新用户组件
case JnpfKeyConst.TREESELECT: // 树形选择
{
switch (actionType)
{
case "transition":
conversionData = data;
break;
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString();
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
if (fieldsModel.multiple) conversionData = data.ToString().ToObject<List<object>>();
else conversionData = data;
break;
}
}
break;
case JnpfKeyConst.POPUPTABLESELECT: // 下拉表格
{
switch (actionType)
{
case "transition":
conversionData = data;
break;
case "update":
case "create":
if (data.GetType().Name.ToLower().Equals("string")) conversionData = data;
else if (data.ToString().Contains("[")) conversionData = data.ToJsonString();
else conversionData = data;
break;
default:
if (fieldsModel.multiple) conversionData = data.ToString().ToObject<List<object>>();
else conversionData = data;
break;
}
}
break;
default:
conversionData = data;
break;
}
return conversionData;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取有表单条数据.
/// </summary>
/// <param name="dataList"></param>
/// <param name="fieldsModels"></param>
/// <param name="actionType"></param>
/// <returns></returns>
public List<Dictionary<string, object>> GetTableDataInfo(List<Dictionary<string, object>> dataList, List<FieldsModel> fieldsModels, string actionType)
{
// 转换表字符串成数组
foreach (var dataMap in dataList)
{
int dicCount = dataMap.Keys.Count;
string[] strKey = new string[dicCount];
dataMap.Keys.CopyTo(strKey, 0);
for (int i = 0; i < strKey.Length; i++)
{
var dataValue = dataMap[strKey[i]];
if (dataValue != null && !string.IsNullOrEmpty(dataValue.ToString()))
{
var model = fieldsModels.Find(f => f.__vModel__.Equals(strKey[i]));
if (model != null)
{
dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, actionType);
}
}
}
}
return dataList;
}
/// <summary>
/// 解析处理 Sql 插入数据的 value.
/// </summary>
/// <param name="dbType">数据库 类型.</param>
/// <param name="_tableList">表数据.</param>
/// <param name="field">前端字段名.</param>
/// <param name="data">插入的数据.</param>
/// <param name="_fieldsModelList">控件集合.</param>
/// <param name="actionType">操作类型.</param>
/// <returns>string.</returns>
public object InsertValueHandle(string dbType, List<DbTableFieldModel> _tableList, string field, object data, List<FieldsModel> _fieldsModelList, string actionType = "create")
{
// 根据KEY查找模板
FieldsModel? model = _fieldsModelList.Find(f => f.__vModel__ == field);
// 单独处理 Oracle,Kdbndp 日期格式转换
if (!actionType.Equals("create") && dbType == "Oracle" && _tableList.Find(x => x.dataType == "DateTime" && x.field == field.ReplaceRegex(@"(\w+)_jnpf_", string.Empty)) != null)
{
return string.Format("to_date('{0}','yyyy-mm-dd HH24/MI/SS')", TemplateControlsDataConversion(data, model, actionType));
}
else
{
var res = TemplateControlsDataConversion(data, model, actionType);
if (actionType.Equals("create"))
{
if (model.__config__.jnpfKey.Equals(JnpfKeyConst.CREATETIME) || model.__config__.jnpfKey.Equals(JnpfKeyConst.DATE))
return res.ToString().ParseToDateTime();
else if (model.__config__.jnpfKey.Equals(JnpfKeyConst.NUMINPUT))
return res;
else return res.ToString();
}
else
{
res = res.IsNullOrEmpty() ? "null" : string.Format("'{0}'", res);
return res;
}
}
}
#endregion
#region
/// <summary>
/// 获取可视化开发模板可缓存数据.
/// </summary>
/// <param name="moldelId">模型id.</param>
/// <param name="formData">模板数据结构.</param>
/// <returns>控件缓存数据.</returns>
public async Task<Dictionary<string, object>> GetVisualDevCaCheData(List<FieldsModel> formData)
{
Dictionary<string, object> templateData = new Dictionary<string, object>();
string? cacheKey = CommonConst.VISUALDEV + _userManager.TenantId + "_";
// 获取或设置控件缓存数据
foreach (FieldsModel? model in formData)
{
if (model != null && model.__vModel__ != null)
{
ConfigModel configModel = model.__config__;
string fieldCacheKey = cacheKey + configModel.renderKey + "_" + model.__vModel__;
switch (configModel.jnpfKey)
{
case JnpfKeyConst.RADIO: // 单选框
case JnpfKeyConst.SELECT: // 下拉框
case JnpfKeyConst.CHECKBOX: // 复选框
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<Dictionary<string, string>>? list = new List<Dictionary<string, string>>();
if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) list = await GetDictionaryList(configModel.dictionaryType);
if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) list = await GetDynamicList(model);
if (vModelType.STATIC.GetDescription() == configModel.dataType)
{
foreach (Dictionary<string, object>? item in model.__slot__.options)
{
Dictionary<string, string> option = new Dictionary<string, string>();
option.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString());
list.Add(option);
}
}
templateData.Add(fieldCacheKey, list);
_cacheManager.Set(fieldCacheKey, list, TimeSpan.FromMinutes(3));
}
break;
case JnpfKeyConst.TREESELECT: // 树形选择
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<Dictionary<string, string>>? list = new List<Dictionary<string, string>>();
if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) list = await GetDictionaryList(configModel.dictionaryType);
if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) list = await GetDynamicList(model);
if (vModelType.STATIC.GetDescription() == configModel.dataType) list = GetStaticList(model);
templateData.Add(fieldCacheKey, list);
_cacheManager.Set(fieldCacheKey, list, TimeSpan.FromMinutes(3));
}
break;
case JnpfKeyConst.CASCADER: // 级联选择
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<Dictionary<string, string>>? list = new List<Dictionary<string, string>>();
if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) list = await GetDictionaryList(configModel.dictionaryType);
if (vModelType.STATIC.GetDescription() == configModel.dataType) list = GetStaticList(model);
if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) list = await GetDynamicList(model);
templateData.Add(fieldCacheKey, list);
_cacheManager.Set(fieldCacheKey, list, TimeSpan.FromMinutes(3));
}
break;
case JnpfKeyConst.DEPSELECT: // 部门
await GetOrgList(fieldCacheKey, JnpfKeyConst.DEPSELECT, templateData);
break;
case JnpfKeyConst.COMSELECT: // 公司
await GetOrgList(fieldCacheKey, JnpfKeyConst.COMSELECT, templateData);
break;
case JnpfKeyConst.CURRORGANIZE: // 所属组织
await GetOrgList(fieldCacheKey, JnpfKeyConst.CURRORGANIZE, templateData);
break;
case JnpfKeyConst.DICTIONARY: // 数据字典
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<Dictionary<string, string>>? vlist = await GetDictionaryList();
templateData.Add(fieldCacheKey, vlist);
_cacheManager.Set(fieldCacheKey, vlist, TimeSpan.FromMinutes(3));
}
break;
case JnpfKeyConst.POSSELECT: // 岗位
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<PositionEntity>? positionEntityList = await _db.AsSugarClient().Queryable<PositionEntity>().Where(u => u.DeleteMark == null).ToListAsync();
List<Dictionary<string, string>> positionList = new List<Dictionary<string, string>>();
foreach (PositionEntity? item in positionEntityList)
{
Dictionary<string, string> position = new Dictionary<string, string>();
position.Add(item.Id, item.FullName);
positionList.Add(position);
}
templateData.Add(fieldCacheKey, positionList);
_cacheManager.Set(fieldCacheKey, positionList, TimeSpan.FromMinutes(3));
}
break;
case JnpfKeyConst.GROUPSELECT: // 分组
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<GroupEntity>? positionEntityList = await _db.AsSugarClient().Queryable<GroupEntity>().Where(u => u.DeleteMark == null).ToListAsync();
List<Dictionary<string, string>> positionList = new List<Dictionary<string, string>>();
foreach (GroupEntity? item in positionEntityList)
{
Dictionary<string, string> position = new Dictionary<string, string>();
position.Add(item.Id, item.FullName);
positionList.Add(position);
}
templateData.Add(fieldCacheKey, positionList);
_cacheManager.Set(fieldCacheKey, positionList, TimeSpan.FromMinutes(3));
}
break;
case JnpfKeyConst.ROLESELECT: // 角色
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<RoleEntity>? positionEntityList = await _db.AsSugarClient().Queryable<RoleEntity>().Where(u => u.DeleteMark == null).ToListAsync();
List<Dictionary<string, string>> positionList = new List<Dictionary<string, string>>();
foreach (RoleEntity? item in positionEntityList)
{
Dictionary<string, string> position = new Dictionary<string, string>();
position.Add(item.Id, item.FullName);
positionList.Add(position);
}
templateData.Add(fieldCacheKey, positionList);
_cacheManager.Set(fieldCacheKey, positionList, TimeSpan.FromMinutes(3));
}
break;
}
}
}
#region
if (formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.ADDRESS).Any())
{
bool level3 = formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.ADDRESS && x.level == 3).Any();
string? addCacheKey = CommonConst.VISUALDEV + "_address1";
string? addCacheKey2 = CommonConst.VISUALDEV + "_address2";
if (level3)
{
if (_cacheManager.Exists(addCacheKey2))
{
templateData.Add(addCacheKey2, _cacheManager.Get(addCacheKey2).ToObject<List<Dictionary<string, object>>>());
}
else
{
List<ProvinceEntity>? addressEntityList = await _db.AsSugarClient().Queryable<ProvinceEntity>().Select(x => new ProvinceEntity { Id = x.Id, ParentId = x.ParentId, Type = x.Type, FullName = x.FullName }).ToListAsync();
// 处理省市区树
addressEntityList.Where(x => x.Type == "1").ToList().ForEach(item => item.QuickQuery = item.FullName);
addressEntityList.Where(x => x.Type == "2").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName);
addressEntityList.Where(x => x.Type == "3").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName);
addressEntityList.Where(x => x.Type == "4").ToList().ForEach(item =>
{
ProvinceEntity? it = addressEntityList.Find(x => x.Id == item.ParentId);
if (it != null) item.QuickQuery = it.QuickQuery + "/" + item.FullName;
});
// 分开 省市区街道 数据
List<Dictionary<string, string>> addressList = new List<Dictionary<string, string>>();
foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "4").ToList())
{
Dictionary<string, string> address = new Dictionary<string, string>();
address.Add(item.Id, item.QuickQuery);
addressList.Add(address);
}
var noTypeList = addressEntityList.Where(x => x.Type.IsNullOrWhiteSpace()).ToList();
foreach (ProvinceEntity? item in noTypeList) item.QuickQuery = GetAddressByPList(noTypeList, item);
foreach (ProvinceEntity? item in noTypeList)
{
Dictionary<string, string> address = new Dictionary<string, string>();
address.Add(item.Id, item.QuickQuery);
addressList.Add(address);
}
// 缓存七天
_cacheManager.Set(addCacheKey2, addressList, TimeSpan.FromDays(7));
templateData.Add(addCacheKey2, addressList);
}
}
if (_cacheManager.Exists(addCacheKey))
{
templateData.Add(addCacheKey, _cacheManager.Get(addCacheKey).ToObject<List<Dictionary<string, object>>>());
}
else
{
List<ProvinceEntity>? addressEntityList = await _db.AsSugarClient().Queryable<ProvinceEntity>().Select(x => new ProvinceEntity { Id = x.Id, ParentId = x.ParentId, Type = x.Type, FullName = x.FullName }).ToListAsync();
// 处理省市区树
addressEntityList.Where(x => x.Type == "1").ToList().ForEach(item => item.QuickQuery = item.FullName);
addressEntityList.Where(x => x.Type == "2").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName);
addressEntityList.Where(x => x.Type == "3").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName);
// 分开 省市区街道 数据
List<Dictionary<string, string>> addressList = new List<Dictionary<string, string>>();
foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "1").ToList())
{
Dictionary<string, string> address = new Dictionary<string, string>();
address.Add(item.Id, item.QuickQuery);
addressList.Add(address);
}
foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "2").ToList())
{
Dictionary<string, string> address = new Dictionary<string, string>();
address.Add(item.Id, item.QuickQuery);
addressList.Add(address);
}
foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "3").ToList())
{
Dictionary<string, string> address = new Dictionary<string, string>();
address.Add(item.Id, item.QuickQuery);
addressList.Add(address);
}
var noTypeList = addressEntityList.Where(x => x.Type.IsNullOrWhiteSpace()).ToList();
foreach (ProvinceEntity? item in noTypeList) item.QuickQuery = GetAddressByPList(noTypeList, item);
foreach (ProvinceEntity? item in noTypeList)
{
Dictionary<string, string> address = new Dictionary<string, string>();
address.Add(item.Id, item.QuickQuery);
addressList.Add(address);
}
// 缓存七天
_cacheManager.Set(addCacheKey, addressList, TimeSpan.FromDays(7));
templateData.Add(addCacheKey, addressList);
}
}
#endregion
#region
if (formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.USERSELECT).Any())
{
string? userCacheKey = CommonConst.VISUALDEV + "_userSelect";
if (_cacheManager.Exists(userCacheKey))
{
templateData.Add(userCacheKey, _cacheManager.Get(userCacheKey).ToObject<List<Dictionary<string, object>>>());
}
else
{
List<UserEntity>? userEntityList = await _db.AsSugarClient().Queryable<UserEntity>().Where(x => x.DeleteMark == null).Select(x => new UserEntity() { Id = x.Id, RealName = x.RealName, Account = x.Account }).ToListAsync();
List<Dictionary<string, string>> userList = new List<Dictionary<string, string>>();
foreach (UserEntity? item in userEntityList)
{
Dictionary<string, string> user = new Dictionary<string, string>();
user.Add(item.Id, item.RealName + "/" + item.Account);
userList.Add(user);
}
// 缓存30分钟
_cacheManager.Set(userCacheKey, userList, TimeSpan.FromMinutes(30));
templateData.Add(userCacheKey, userList);
}
}
if (formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.USERSSELECT).Any())
{
string? userCacheKey = CommonConst.VISUALDEV + "_usersSelect";
if (_cacheManager.Exists(userCacheKey))
{
templateData.Add(userCacheKey, _cacheManager.Get(userCacheKey).ToObject<List<Dictionary<string, object>>>());
}
else
{
var addList = new List<Dictionary<string, string>>();
(await _db.AsSugarClient().Queryable<UserEntity>().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.RealName, x.Account }).ToListAsync()).ForEach(item =>
{
Dictionary<string, string> user = new Dictionary<string, string>();
user.Add(item.Id + "--user", item.RealName + "/" + item.Account);
addList.Add(user);
});
(await _db.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item =>
{
Dictionary<string, string> user = new Dictionary<string, string>();
user.Add(item.Id + "--company", item.FullName);
user.Add(item.Id + "--department", item.FullName);
addList.Add(user);
});
(await _db.AsSugarClient().Queryable<RoleEntity>().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item =>
{
Dictionary<string, string> user = new Dictionary<string, string>();
user.Add(item.Id + "--role", item.FullName);
addList.Add(user);
});
(await _db.AsSugarClient().Queryable<PositionEntity>().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item =>
{
Dictionary<string, string> user = new Dictionary<string, string>();
user.Add(item.Id + "--position", item.FullName);
addList.Add(user);
});
(await _db.AsSugarClient().Queryable<GroupEntity>().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item =>
{
Dictionary<string, string> user = new Dictionary<string, string>();
user.Add(item.Id + "--group", item.FullName);
addList.Add(user);
});
// 缓存30分钟
_cacheManager.Set(userCacheKey, addList, TimeSpan.FromMinutes(30));
templateData.Add(userCacheKey, addList);
}
}
#endregion
return templateData;
}
/// <summary>
/// 获取缓存 根据控件key.
/// </summary>
/// <param name="fieldCacheKey"></param>
/// <param name="templateData"></param>
/// <returns></returns>
private bool GetCacheValues(string fieldCacheKey, Dictionary<string, object> templateData)
{
if (_cacheManager.Exists(fieldCacheKey))
{
List<Dictionary<string, object>>? list = _cacheManager.Get(fieldCacheKey).ToObject<List<Dictionary<string, object>>>();
templateData.Add(fieldCacheKey, list);
return true;
}
return false;
}
/// <summary>
/// 处理组织信息.
/// </summary>
/// <param name="fieldCacheKey"></param>
/// <param name="orgType"></param>
/// <param name="templateData"></param>
/// <returns></returns>
private async Task GetOrgList(string fieldCacheKey, string orgType, Dictionary<string, object> templateData)
{
if (!GetCacheValues(fieldCacheKey, templateData))
{
List<OrganizeEntity>? dep_organizeEntityList = await _db.AsSugarClient().Queryable<OrganizeEntity>().Where(d => d.EnabledMark == 1 && d.DeleteMark == null)
.WhereIF(orgType.Equals(JnpfKeyConst.DEPSELECT), d => d.Category.Equals("department")).ToListAsync();
List<Dictionary<string, object>> vlist = new List<Dictionary<string, object>>();
foreach (OrganizeEntity? item in dep_organizeEntityList)
{
Dictionary<string, object> organize = new Dictionary<string, object>();
if (orgType.Equals(JnpfKeyConst.DEPSELECT)) organize.Add(item.Id, item.FullName); // 部门
if (orgType.Equals(JnpfKeyConst.COMSELECT)) organize.Add(item.Id, new string[] { item.OrganizeIdTree, item.FullName }); // 公司
if (orgType.Equals(JnpfKeyConst.CURRORGANIZE)) organize.Add(item.Id, new string[] { item.OrganizeIdTree, item.Category, item.FullName }); // 所属组织
vlist.Add(organize);
}
templateData.Add(fieldCacheKey, vlist);
_cacheManager.Set(fieldCacheKey, vlist, TimeSpan.FromMinutes(3));
}
}
/// <summary>
/// 处理远端数据.
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
private async Task<List<Dictionary<string, string>>> GetDynamicList(FieldsModel model)
{
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
// 获取远端数据
DataInterfaceEntity? dynamic = await _dataInterfaceService.GetInfo(model.__config__.propsUrl);
if (dynamic == null) return list;
var propsValue = string.Empty;
var propsLabel = string.Empty;
var children = string.Empty;
if (model.__config__.jnpfKey.Equals(JnpfKeyConst.TREESELECT) || model.__config__.jnpfKey.Equals(JnpfKeyConst.CASCADER))
{
propsValue = model.props.props.value;
propsLabel = model.props.props.label;
children = model.props.props.children;
}
else
{
propsValue = model.__config__.props.value;
propsLabel = model.__config__.props.label;
children = model.__config__.props.children;
}
switch (dynamic.DataType)
{
// SQL数据
case 1:
{
// 远端数据 配置参数
List<SugarParameter>? parameter = new List<SugarParameter>();
if (_userManager.ToKen != null)
{
parameter.Add(new SugarParameter("@user", _userManager.UserId));
parameter.Add(new SugarParameter("@organization", _userManager?.User?.OrganizeId));
var subordinates = _userManager.Subordinates;
subordinates.Add(_userManager.UserId);
parameter.Add(new SugarParameter("@currentUsersAndSubordinates", subordinates));
var subsidiary = _userManager.Subsidiary;
subsidiary.Add(_userManager.User.OrganizeId);
parameter.Add(new SugarParameter("@currentOrganizationAndSuborganization", subsidiary));
var chargeorganization = _userManager.DataScope.Where(x => x.organizeId == _userManager.User.OrganizeId && x.Select).ToList().FirstOrDefault();
parameter.Add(new SugarParameter("@chargeorganization", chargeorganization?.organizeId));
subsidiary = _userManager.DataScope.Select(x => x.organizeId).Intersect(_userManager.Subsidiary).ToList();
parameter.Add(new SugarParameter("@currentChargeorganizationAndSuborganization", subsidiary));
}
DbLinkEntity? linkEntity = await _db.AsSugarClient().Queryable<DbLinkEntity>().Where(m => m.Id == dynamic.DBLinkId && m.DeleteMark == null).FirstAsync();
if (linkEntity == null) linkEntity = _databaseService.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
_dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary<string, string>());
System.Data.DataTable? dt = _databaseService.GetInterFaceData(linkEntity, dynamic.Query, parameter.ToArray());
List<Dictionary<string, object>> dynamicDataList = dt.ToJsonString().ToObject<List<Dictionary<string, object>>>();
foreach (Dictionary<string, object>? item in dynamicDataList)
{
Dictionary<string, string> dynamicDic = new Dictionary<string, string>();
dynamicDic.Add(item[propsValue]?.ToString(), item[propsLabel]?.ToString());
list.Add(dynamicDic);
}
}
break;
// 静态数据
case 2:
{
foreach (var data in JValue.Parse(dynamic.Query))
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic[data.Value<string>(propsValue)] = data.Value<string>(propsLabel);
list.Add(dic);
if (children != null && data.Value<object>(children) != null && data.Value<object>(children).ToString().IsNotEmptyOrNull())
list.AddRange(GetDynamicInfiniteData(data.Value<object>(children).ToString(), model.props.props));
}
}
break;
// Api数据
case 3:
{
// 获取远端数据
var dynamicList = await _dataInterfaceService.GetInfo(model.__config__.propsUrl);
if (dynamicList == null) break;
var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + model.__config__.jnpfKey + "_" + model.__config__.renderKey;
switch (dynamicList.DataType)
{
case 1: // SQL数据
{
_dataInterfaceService.ReplaceParameterValue(dynamicList, new Dictionary<string, string>());
var pObj = await _dataInterfaceService.GetData(dynamicList);
list = pObj.ToJsonString().ToObject<List<Dictionary<string, string>>>();
}
break;
case 2: // 静态数据
{
foreach (var data in JValue.Parse(dynamicList.Query))
{
list.Add(new Dictionary<string, string>() { { data.Value<string>(propsValue), data.Value<string>(propsLabel) } });
if (children != null && data.Value<object>(children) != null && data.Value<object>(children).ToString() != "")
list.AddRange(GetDynamicInfiniteData(data.Value<object>(children).ToString(), model.props.props));
}
}
break;
case 3: // Api数据
{
var result = await GetApiDataByTypePreview(dynamicList); // 请求接口
list = result.ContainsKey("list") ? result["list"].ToObject<List<Dictionary<string, string>>>() : new List<Dictionary<string, string>>();
if ((list == null || !list.Any()) && result.ContainsKey("data"))
{
var newList = result["data"].ToObject<Dictionary<string, object>>().ContainsKey("list") ? result["data"]["list"].ToObject<List<Dictionary<string, object>>>() : new List<Dictionary<string, object>>();
foreach (var data in JValue.Parse(newList.ToJsonString()))
{
list.Add(new Dictionary<string, string>() { { data.Value<string>(propsValue), data.Value<string>(propsLabel) } });
if (children != null && data.Value<object>(children) != null && data.Value<object>(children).ToString() != "")
list.AddRange(GetDynamicInfiniteData(data.Value<object>(children).ToString(), model.props.props));
}
}
}
break;
}
}
break;
}
return list;
}
/// <summary>
/// 处理静态数据.
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
private List<Dictionary<string, string>> GetStaticList(FieldsModel model)
{
PropsBeanModel? props = model.props.props;
List<OptionsModel>? optionList = GetTreeOptions(model.options, props);
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
foreach (OptionsModel? item in optionList)
{
Dictionary<string, string> option = new Dictionary<string, string>();
option.Add(item.value, item.label);
list.Add(option);
}
return list;
}
/// <summary>
/// 获取数据字典数据 根据 类型Id.
/// </summary>
/// <param name="dictionaryTypeId"></param>
/// <returns>List.</returns>
private async Task<List<Dictionary<string, string>>> GetDictionaryList(string? dictionaryTypeId = null)
{
List<DictionaryDataEntity> dictionaryDataEntityList = await _db.AsSugarClient().Queryable<DictionaryDataEntity, DictionaryTypeEntity>((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.DictionaryTypeId))
.WhereIF(dictionaryTypeId.IsNotEmptyOrNull(), (a, b) => b.Id == dictionaryTypeId || b.EnCode == dictionaryTypeId).Where(a => a.DeleteMark == null).ToListAsync();
List<Dictionary<string, string>> dictionaryDataList = new List<Dictionary<string, string>>();
foreach (DictionaryDataEntity? item in dictionaryDataEntityList)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add(item.Id, item.FullName);
dictionary.Add(item.EnCode, item.FullName);
dictionaryDataList.Add(dictionary);
}
return dictionaryDataList;
}
/// <summary>
/// options无限级.
/// </summary>
/// <returns></returns>
private List<OptionsModel> GetTreeOptions(List<object> model, PropsBeanModel props)
{
List<OptionsModel> options = new List<OptionsModel>();
foreach (object? item in model)
{
OptionsModel option = new OptionsModel();
Dictionary<string, object>? dicObject = item.ToJsonString().ToObject<Dictionary<string, object>>();
option.label = dicObject[props.label].ToString();
option.value = dicObject[props.value].ToString();
if (dicObject.ContainsKey(props.children))
{
List<object>? children = dicObject[props.children].ToJsonString().ToObject<List<object>>();
options.AddRange(GetTreeOptions(children, props));
}
options.Add(option);
}
return options;
}
/// <summary>
/// 递归获取手动添加的省市区,名称处理成树形结构.
/// </summary>
/// <param name="addressEntityList"></param>
private string GetAddressByPList(List<ProvinceEntity> addressEntityList, ProvinceEntity pEntity)
{
if (pEntity.ParentId == null || pEntity.ParentId.Equals("-1"))
{
return pEntity.FullName;
}
else
{
var pItem = addressEntityList.Find(x => x.Id == pEntity.ParentId);
if (pItem != null) pEntity.QuickQuery = GetAddressByPList(addressEntityList, pItem) + "/" + pEntity.FullName;
else pEntity.QuickQuery = pEntity.FullName;
return pEntity.QuickQuery;
}
}
#endregion
#region
/// <summary>
/// 将系统组件生成的数据转换为数据.
/// </summary>
/// <param name="formData">表单模板.</param>
/// <param name="modelData">真实数据.</param>
/// <returns></returns>
public async Task<Dictionary<string, object>> GetSystemComponentsData(List<FieldsModel> formData, string modelData)
{
// 获取控件缓存数据
Dictionary<string, object> templateData = await GetVisualDevCaCheData(formData);
Dictionary<string, object> dataMap = modelData.ToObject<Dictionary<string, object>>(); // 数据库保存的F_Data
// 序列化后时间戳转换处理
List<FieldsModel>? timeList = formData.Where(x => x.__config__.jnpfKey == "createTime" || x.__config__.jnpfKey == "modifyTime").ToList();
if (timeList.Any())
{
timeList.ForEach(item =>
{
if (dataMap.ContainsKey(item.__vModel__) && dataMap[item.__vModel__] != null)
{
string value = dataMap[item.__vModel__].ToString();
if (value.IsNotEmptyOrNull())
{
dataMap.Remove(item.__vModel__);
DateTime dtDate;
if (!DateTime.TryParse(value, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", value.TimeStampToDateTime());
else value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", value.ParseToDateTime());
dataMap.Add(item.__vModel__, value);
}
}
});
}
int dicCount = dataMap.Keys.Count;
string[] strKey = new string[dicCount];
dataMap.Keys.CopyTo(strKey, 0);
// 自动生成的数据不在模板数据内
foreach (string? key in dataMap.Keys.ToList())
{
FieldsModel? model = formData.Where(f => f.__vModel__ == key).FirstOrDefault();
if (model == null) continue;
if (dataMap[key] != null)
{
string? dataValue = dataMap[key].ToString();
if (!string.IsNullOrEmpty(dataValue) && model != null)
{
ConfigModel configModel = model.__config__;
if (string.IsNullOrWhiteSpace(model.separator)) model.separator = ",";
switch (configModel.jnpfKey)
{
case JnpfKeyConst.UPLOADFZ: // 文件上传
case JnpfKeyConst.UPLOADIMG: // 图片上传
dataMap[key] = dataMap[key] == null ? new List<object>().ToJsonString() : dataMap[key];
break;
case JnpfKeyConst.CREATEUSER:
case JnpfKeyConst.MODIFYUSER:
dataMap[key] = await _db.AsSugarClient().Queryable<UserEntity>().Where(x => x.Id == dataValue).Select(x => SqlFunc.MergeString(x.RealName, "/", x.Account)).FirstAsync();
break;
case JnpfKeyConst.CURRPOSITION:
dataMap[key] = (await _db.AsSugarClient().Queryable<PositionEntity>().FirstAsync(p => p.Id == dataMap[key].ToString()))?.FullName;
if (dataMap[key].IsNullOrEmpty()) dataMap[key] = " ";
break;
case JnpfKeyConst.CURRORGANIZE:
{
var currOrganizeTemplateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + _userManager.TenantId + "_" + configModel.renderKey + "_" + key)).FirstOrDefault().Value?.ToJsonString().ToObject<List<Dictionary<string, string[]>>>();
var valueId = currOrganizeTemplateValue.Where(x => x.Keys.Contains(dataMap[key].ToString())).FirstOrDefault();
if (valueId != null)
{
if (model.showLevel == "all")
{
string[]? cascaderData = valueId[dataMap[key].ToString()];
if (cascaderData != null && !string.IsNullOrWhiteSpace(cascaderData.FirstOrDefault()))
{
List<string>? treeFullName = new List<string>();
cascaderData.FirstOrDefault()?.Split(',').ToList().ForEach(item =>
{
treeFullName.Add(currOrganizeTemplateValue.Find(x => x.Keys.Contains(item)).FirstOrDefault().Value?.LastOrDefault());
});
dataMap[key] = string.Join("/", treeFullName);
}
else
{
dataMap[key] = string.Empty;
}
}
else
{
string[]? cascaderData = valueId[dataMap[key].ToString()];
if (cascaderData != null && cascaderData[1] == "department") dataMap[key] = valueId[dataMap[key].ToString()]?.LastOrDefault();
else dataMap[key] = string.Empty;
}
}
else
{
dataMap[key] = string.Empty;
}
if (dataMap[key].IsNullOrEmpty()) dataMap[key] = " ";
}
break;
}
}
}
else
{
// 前端空数组提交 转换 .
switch (model.__config__.jnpfKey)
{
case JnpfKeyConst.CASCADER:
case JnpfKeyConst.CHECKBOX:
case JnpfKeyConst.UPLOADFZ: // 文件上传
case JnpfKeyConst.UPLOADIMG: // 图片上传
dataMap[key] = dataMap[key] == null ? new List<object>() : dataMap[key];
break;
case JnpfKeyConst.SELECT:
case JnpfKeyConst.ADDRESS:
case JnpfKeyConst.GROUPSELECT:
case JnpfKeyConst.POSSELECT:
case JnpfKeyConst.ROLESELECT:
case JnpfKeyConst.COMSELECT:
case JnpfKeyConst.DEPSELECT:
case JnpfKeyConst.TREESELECT:
case JnpfKeyConst.USERSELECT:
case JnpfKeyConst.POPUPTABLESELECT:
if (model.multiple) dataMap[key] = dataMap[key] == null ? new List<object>() : dataMap[key];
break;
}
}
}
return dataMap;
}
#endregion
#region
/// <summary>
/// 无表的数据筛选.
/// </summary>
/// <param name="list">数据列表.</param>
/// <param name="keyJsonMap">查询条件值.</param>
/// <param name="formData"></param>
/// <returns></returns>
public List<Dictionary<string, object>> GetNoTableFilteringData(List<VisualDevModelDataEntity> list, Dictionary<string, object> keyJsonMap, List<FieldsModel> formData)
{
List<Dictionary<string, object>> realList = new List<Dictionary<string, object>>();
foreach (var entity in list)
{
Dictionary<string, object> query = keyJsonMap;
Dictionary<string, object> realEntity = entity.Data.ToObject<Dictionary<string, object>>();
realEntity.Add("id", entity.Id);
if (query != null && query.Count != 0)
{
int m = 0;
int dicCount = query.Keys.Count;
string[] strKey = new string[dicCount];
query.Keys.CopyTo(strKey, 0);
for (int i = 0; i < strKey.Length; i++)
{
var keyValue = keyJsonMap[strKey[i]];
var queryEntity = realEntity.Where(e => e.Key == strKey[i]).FirstOrDefault();
var model = formData.Where(f => f.__vModel__ == strKey[i]).FirstOrDefault();
if (queryEntity.Value != null && !string.IsNullOrWhiteSpace(keyValue.ToString()))
{
var realValue = queryEntity.Value.ObjToString();
var type = model.__config__.jnpfKey;
switch (type)
{
case JnpfKeyConst.TIME:
{
var queryTime = new List<string>();
keyValue.ToObject<List<string>>().ForEach(item => { if (!string.IsNullOrWhiteSpace(item)) queryTime.Add(item.ParseToDateTime().ToLongTimeString()); });
if (Common.Extension.Extensions.IsInTimeRange(realValue.ParseToDateTime(), queryTime.First(), queryTime.Last(), 3)) m++;
}
break;
case JnpfKeyConst.DATE:
{
List<string> queryTime = keyValue.ToObject<List<string>>();
int formatType = 0;
if (model.format == "yyyy-MM") formatType = 1;
else if (model.format == "yyyy") formatType = 2;
string value1 = string.Format("{0:yyyy-MM-dd}", queryTime.First().ParseToDateTime());
string value2 = string.Format("{0:yyyy-MM-dd}", queryTime.Last().ParseToDateTime());
if (Common.Extension.Extensions.IsInTimeRange(realValue.ParseToDateTime(), value1, value2, formatType)) m++;
}
break;
case JnpfKeyConst.CREATETIME:
case JnpfKeyConst.MODIFYTIME:
{
List<string> dayTime1 = keyValue.ToObject<List<string>>();
string value1 = string.Format("{0:yyyy-MM-dd 00:00:00}", dayTime1.First().ParseToDateTime());
string value2 = string.Format("{0:yyyy-MM-dd 23:59:59}", dayTime1.Last().ParseToDateTime());
if (!string.IsNullOrEmpty(realValue) && Common.Extension.Extensions.IsInTimeRange(Convert.ToDateTime(realValue), value1, value2)) m++;
}
break;
case JnpfKeyConst.NUMINPUT:
case JnpfKeyConst.CALCULATE:
{
List<string> numArray = keyValue.ToObject<List<string>>();
var numA = numArray.First().ParseToInt();
var numB = numArray.Last() == null ? long.MaxValue : numArray.Last().ParseToInt();
var numC = realValue.ParseToInt();
if (numC >= numA && numC <= numB) m++;
}
break;
default:
if (realValue.IsNotEmptyOrNull() && keyValue != null)
{
string keyV = keyValue.ToString();
if (model.searchType == 2 && realValue.Contains(keyV)) m++;
else if (model.searchType == 1)
{
// 多选时为模糊查询
if ((model.multiple || type == "checkbox") && realValue.Contains(keyV)) m++;
else if (realValue.Equals(keyV)) m++;
}
else if (realValue.Replace(" ", "").Contains(keyV.Replace(" ", ""))) m++;
}
break;
}
}
if (m == dicCount) realList.Add(realEntity);
}
}
else
{
realList.Add(realEntity);
}
}
return realList;
}
#endregion
#region (Id Name)
/// <summary>
/// 将关键字key查询传输的id转换成名称还有动态数据id成名称.
/// </summary>
/// <param name="formData">数据库模板数据.</param>
/// <param name="list">真实数据.</param>
/// <param name="columnDesign"></param>
/// <param name="actionType"></param>
/// <param name="webType">表单类型1-纯表单、2-普通表单、3-工作流表单.</param>
/// <param name="primaryKey">数据主键.</param>
/// <param name="mainData">子表解析时调用 (控件联动可能需要主表的数据).</param>
/// <returns></returns>
public async Task<List<Dictionary<string, object>>> GetKeyData(
List<FieldsModel> formData,
List<Dictionary<string, object>> list,
ColumnDesignModel? columnDesign = null,
string actionType = "List",
int webType = 2,
string primaryKey = "F_Id",
Dictionary<string, object>? mainData = null)
{
// 获取控件缓存数据
Dictionary<string, object> templateData = await GetVisualDevCaCheData(formData);
// 转换数据
Dictionary<string, object>? convData = new Dictionary<string, object>();
// 存放 预缓存数据的控件的缓存数据 避免循环时重复序列化 耗资源
List<Dictionary<string, string[]>>? currOrganizeTemplateValue = new List<Dictionary<string, string[]>>(); // 组织
List<Dictionary<string, string>>? addressTemplateValue = new List<Dictionary<string, string>>(); // 地址 省市区 缓存
List<Dictionary<string, string>>? streetTemplateValue = new List<Dictionary<string, string>>(); // 地址 街道 缓存
List<Dictionary<string, string[]>>? comselectTemplateValue = new List<Dictionary<string, string[]>>(); // 公司
List<Dictionary<string, string>>? depselectTemplateValue = new List<Dictionary<string, string>>(); // 部门
List<Dictionary<string, string>>? userselectTemplateValue = new List<Dictionary<string, string>>(); // 用户
List<Dictionary<string, string>>? usersselectTemplateValue = new List<Dictionary<string, string>>(); // 用户组件
List<Dictionary<string, string>>? posselectTemplateValue = new List<Dictionary<string, string>>(); // 岗位
List<Dictionary<string, string>>? radioTemplateValue = new List<Dictionary<string, string>>(); // 单选框
List<Dictionary<string, string>>? checkboxTemplateValue = new List<Dictionary<string, string>>(); // 复选框
List<Dictionary<string, string>>? selectTemplateValue = new List<Dictionary<string, string>>(); // 下拉框
List<Dictionary<string, string>>? treeSelectTemplateValue = new List<Dictionary<string, string>>(); // 树
List<Dictionary<string, string>>? cascaderTemplateValue = new List<Dictionary<string, string>>(); // 级联选择
List<Dictionary<string, string>>? groupTemplateValue = new List<Dictionary<string, string>>(); // 分组
List<Dictionary<string, string>>? roleTemplateValue = new List<Dictionary<string, string>>(); // 角色
Dictionary<string, List<Dictionary<string, string>>>? templateValues = new Dictionary<string, List<Dictionary<string, string>>>(); // 其他
if (webType == 3)
{
var ids = list.Select(x => x[primaryKey]).ToList();
var flowTaskList = await _db.AsSugarClient().Queryable<FlowTaskEntity>().Where(x => ids.Contains(x.Id)).Select(x => new FlowTaskEntity() { Id = x.Id, Status = x.Status }).ToListAsync();
list.ForEach(item =>
{
if(flowTaskList.Any(x => x.Id.Equals(item[primaryKey].ToString())))
{
var flowTask = flowTaskList.Where(x => x.Id.Equals(item[primaryKey].ToString())).FirstOrDefault();
item["flowState"] = flowTask.Status;
item["flowState_name"] = flowTask.Status;
}
else
{
item["flowState"] = 0;
item["flowState_name"] = 0;
}
});
}
// 转换列表数据
foreach (Dictionary<string, object>? dataMap in list)
{
var oldDataMap = dataMap.Copy();
if (mainData != null) oldDataMap.Add("JnpfKeyConst_MainData", mainData);
if (dataMap.ContainsKey(primaryKey)) dataMap["id"] = dataMap[primaryKey].ToString(); // 主键
int dicCount = dataMap.Keys.Count;
string[] strKey = new string[dicCount];
dataMap.Keys.CopyTo(strKey, 0);
// 处理有缓存
for (int i = 0; i < strKey.Length; i++)
{
if (!(dataMap[strKey[i]] is null))
{
FieldsModel? form = formData.Where(f => f.__vModel__ == strKey[i]).FirstOrDefault();
if (form != null)
{
if (form.__vModel__.Contains(form.__config__.jnpfKey + "Field")) dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], form);
else dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], form, actionType);
string? jnpfKey = form.__config__.jnpfKey;
KeyValuePair<string, object> templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + _userManager.TenantId + "_" + form.__config__.renderKey + "_" + strKey[i])).FirstOrDefault();
#region
if (jnpfKey == JnpfKeyConst.USERSELECT)
{
templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_userSelect")).FirstOrDefault();
if (!templateData.ContainsKey(form.__config__.renderKey + "_" + strKey[i])) templateData.Add(form.__config__.renderKey + "_" + strKey[i], string.Empty);
}
if (jnpfKey == JnpfKeyConst.USERSSELECT)
{
templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_usersSelect")).FirstOrDefault();
if (!templateData.ContainsKey(form.__config__.renderKey + "_" + strKey[i])) templateData.Add(form.__config__.renderKey + "_" + strKey[i], string.Empty);
}
if (jnpfKey == JnpfKeyConst.ADDRESS)
{
templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_address1")).FirstOrDefault();
if (!templateData.ContainsKey(form.__config__.renderKey + "_" + strKey[i])) templateData.Add(form.__config__.renderKey + "_" + strKey[i], string.Empty);
}
#endregion
// 转换后的数据值
object? dataDicValue = dataMap[strKey[i]];
if (templateValue.Key != null && !(dataDicValue is null) && dataDicValue.ToString() != "[]")
{
IEnumerable<object>? moreValue = dataDicValue as IEnumerable<object>;
if (dataDicValue.IsNullOrEmpty()) jnpfKey = string.Empty; // 空数据直接赋值
// 不是List数据直接赋值 用逗号切割成 List
if (moreValue == null && !dataDicValue.ToString().Contains("[")) moreValue = dataDicValue.ToString().Split(",");
if (moreValue == null && dataDicValue.ToString().Contains("[[")) moreValue = dataDicValue.ToString().ToObject<List<List<object>>>();
if (moreValue == null && dataDicValue.ToString().Contains("[")) moreValue = dataDicValue.ToString().ToObject<List<string>>();
if (string.IsNullOrWhiteSpace(form.separator)) form.separator = ",";
switch (jnpfKey)
{
case JnpfKeyConst.COMSELECT:
{
var currOrganizeValues = new List<List<object>>();
if (form.multiple) currOrganizeValues = moreValue != null ? moreValue.ToJsonString().ToObject<List<List<object>>>() : dataDicValue.ToString().ToObject<List<List<object>>>();
else currOrganizeValues.Add(moreValue != null ? moreValue.ToJsonString().ToObject<List<object>>() : dataDicValue.ToString().ToObject<List<object>>());
var addNames = new List<string>();
if (comselectTemplateValue.Count < 1) comselectTemplateValue = templateValue.Value.ToJsonString().ToObject<List<Dictionary<string, string[]>>>();
foreach (var item in currOrganizeValues)
{
var addName = new List<string>();
foreach (var it in item)
{
var currOrganizeData = comselectTemplateValue.Where(a => a.ContainsKey(it.ToString())).FirstOrDefault();
if (currOrganizeData != null) addName.Add(currOrganizeData[it.ToString()].LastOrDefault());
}
addNames.Add(string.Join("/", addName));
}
if (addNames.Any()) dataMap[strKey[i]] = string.Join(form.separator, addNames);
}
break;
case JnpfKeyConst.ADDRESS:
{
var addressValues = new List<List<object>>();
if (form.multiple) addressValues = dataDicValue.ToJsonString().ToObject<List<List<object>>>();
else addressValues.Add(dataDicValue.ToJsonString().ToObject<List<object>>());
var addNames = new List<string>();
if (addressTemplateValue.Count < 1) addressTemplateValue = templateValue.Value.ToObject<List<Dictionary<string, string>>>();
if (form.level == 3 && streetTemplateValue.Count < 1)
streetTemplateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_address2")).FirstOrDefault().Value.ToObject<List<Dictionary<string, string>>>();
foreach (var item in addressValues)
{
if (item.Any())
{
var value = addressTemplateValue.Where(a => a.ContainsKey(item.LastOrDefault().ToString())).FirstOrDefault();
if (form.level == 3 && value == null) value = streetTemplateValue.Where(a => a.ContainsKey(item.LastOrDefault().ToString())).FirstOrDefault();
if (value != null) addNames.Add(value[item.LastOrDefault().ToString()]);
}
}
if (addNames.Count != 0) dataMap[strKey[i]] = string.Join(form.separator, addNames);
}
break;
case JnpfKeyConst.CURRORGANIZE:
{
if (currOrganizeTemplateValue.Count < 1) currOrganizeTemplateValue = templateValue.Value.ToJsonString().ToObject<List<Dictionary<string, string[]>>>();
var valueId = currOrganizeTemplateValue.Where(x => x.Keys.Contains(dataDicValue.ToString())).FirstOrDefault();
if (valueId != null)
{
if (form.showLevel == "all")
{
var cascaderData = valueId[dataDicValue.ToString()];
if (cascaderData != null && !string.IsNullOrWhiteSpace(cascaderData.FirstOrDefault()))
{
var treeFullName = new List<string>();
cascaderData.FirstOrDefault()?.Split(',').ToList().ForEach(item =>
{
treeFullName.Add(currOrganizeTemplateValue.Find(x => x.Keys.Contains(item)).FirstOrDefault().Value?.LastOrDefault());
});
dataMap[strKey[i]] = string.Join("/", treeFullName);
}
else
{
dataMap[strKey[i]] = string.Empty;
}
}
else
{
var cascaderData = valueId[dataDicValue.ToString()];
if (cascaderData != null && cascaderData[1] == "department") dataMap[strKey[i]] = valueId[dataDicValue.ToString()]?.LastOrDefault();
else dataMap[strKey[i]] = string.Empty;
}
}
else
{
dataMap[strKey[i]] = string.Empty;
}
}
break;
case JnpfKeyConst.DEPSELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(depselectTemplateValue, templateValue, moreValue, form);
break;
case JnpfKeyConst.USERSELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(userselectTemplateValue, templateValue, moreValue, form);
break;
case JnpfKeyConst.USERSSELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(usersselectTemplateValue, templateValue, moreValue, form);
break;
case JnpfKeyConst.POSSELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(posselectTemplateValue, templateValue, moreValue, form);
break;
case JnpfKeyConst.RADIO:
dataMap[strKey[i]] = GetTemplateDataValueByKey(radioTemplateValue, templateValue, moreValue, form, formData, oldDataMap);
break;
case JnpfKeyConst.CHECKBOX:
dataMap[strKey[i]] = GetTemplateDataValueByKey(checkboxTemplateValue, templateValue, moreValue, form, formData, oldDataMap);
break;
case JnpfKeyConst.SELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(selectTemplateValue, templateValue, moreValue, form, formData, oldDataMap);
break;
case JnpfKeyConst.TREESELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(treeSelectTemplateValue, templateValue, moreValue, form, formData, oldDataMap);
break;
case JnpfKeyConst.CASCADER:
dataMap[strKey[i]] = GetTemplateDataValueByKey(cascaderTemplateValue, templateValue, moreValue, form, formData, oldDataMap);
break;
case JnpfKeyConst.GROUPSELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(groupTemplateValue, templateValue, moreValue, form);
break;
case JnpfKeyConst.ROLESELECT:
dataMap[strKey[i]] = GetTemplateDataValueByKey(roleTemplateValue, templateValue, moreValue, form);
break;
default:
{
if (jnpfKey.IsNotEmptyOrNull())
{
if (!templateValues.ContainsKey(strKey[i])) templateValues.Add(strKey[i], templateValue.Value.ToJsonString().ToObject<List<Dictionary<string, string>>>());
var convertData = templateValues[strKey[i]].Where(t => t.ContainsKey(dataMap[strKey[i]].ToString())).FirstOrDefault();
if (convertData != null) dataMap[strKey[i]] = convertData.Values.FirstOrDefault().ToString();
}
else
{
dataMap[strKey[i]] = string.Empty;
}
}
break;
}
}
}
}
}
// 剪掉有缓存的,获取无缓存的 继续解析
List<string>? record = dataMap.Keys.Except(templateData.Keys.Select(x => x = x.Substring(14, x.Length - 14))).ToList();
// 针对有表的模板去除"rownum,主键"
record.RemoveAll(r => r == "ROWNUM");
record.RemoveAll(r => r == primaryKey);
foreach (string? key in record)
{
if (!(dataMap[key] is null) && dataMap[key].ToString() != string.Empty)
{
var dataValue = dataMap[key];
var model = formData.Where(f => f.__vModel__ == key).FirstOrDefault();
if (model != null)
{
ConfigModel configModel = model.__config__;
string type = configModel.jnpfKey;
if (string.IsNullOrWhiteSpace(model.separator)) model.separator = ",";
switch (type)
{
case JnpfKeyConst.SWITCH: // switch开关
dataMap[key] = dataMap[key].ParseToInt() == 0 ? model.inactiveTxt : model.activeTxt;
break;
case JnpfKeyConst.DATERANGE: // 日期范围
case JnpfKeyConst.TIMERANGE: // 时间范围
dataMap[key] = QueryDateTimeToString(dataValue, model.format, model.format);
break;
case JnpfKeyConst.DATE: // 日期选择
{
string value = string.Empty;
var keyValue = dataMap[key].ToString();
DateTime dtDate;
if (DateTime.TryParse(keyValue, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue);
else value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue.ParseToDateTime());
if (!string.IsNullOrEmpty(model.format))
{
value = string.Format("{0:" + model.format + "}", Convert.ToDateTime(value));
}
else
{
switch (model.type)
{
case "date":
value = string.Format("{0:yyyy-MM-dd}", Convert.ToDateTime(value));
break;
default:
value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Convert.ToDateTime(value));
break;
}
}
dataMap[key] = value;
}
break;
case JnpfKeyConst.TIME: // 日期选择
{
string value = string.Empty;
var keyValue = dataMap[key].ToString();
DateTime dtDate;
if (DateTime.TryParse(keyValue, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue);
else value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue.TimeStampToDateTime());
if (!string.IsNullOrEmpty(model.format)) value = string.Format("{0:" + model.format + "}", Convert.ToDateTime(value));
else value = dataMap[key].ToString();
dataMap[key] = value;
}
break;
case JnpfKeyConst.CURRDEPT:
dataMap[key] = (await _db.AsSugarClient().Queryable<OrganizeEntity>().FirstAsync(x => x.Id == dataValue.ToString()))?.FullName;
break;
case JnpfKeyConst.MODIFYUSER:
case JnpfKeyConst.CREATEUSER:
dataMap[key] = await _db.AsSugarClient().Queryable<UserEntity>().Where(x => x.Id == dataValue.ToString()).Select(x => SqlFunc.MergeString(x.RealName, "/", x.Account)).FirstAsync();
break;
case JnpfKeyConst.MODIFYTIME:
case JnpfKeyConst.CREATETIME:
dataMap[key] = string.Format("{0:yyyy-MM-dd HH:mm:ss}", dataMap[key].ToString().ParseToDateTime());
break;
case JnpfKeyConst.CURRPOSITION:
dataMap[key] = (await _db.AsSugarClient().Queryable<PositionEntity>().FirstAsync(x => x.Id == dataValue.ToString()))?.FullName;
break;
case JnpfKeyConst.POPUPTABLESELECT:
case JnpfKeyConst.POPUPSELECT:
{
// 获取远端数据
var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId);
if (dynamic == null) break;
List<Dictionary<string, string>> popupselectDataList = new List<Dictionary<string, string>>();
var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + model.__config__.jnpfKey + "_" + model.__config__.renderKey;
if (_cacheManager.Exists(redisName))
{
popupselectDataList = _cacheManager.Get(redisName).ToObject<List<Dictionary<string, string>>>();
}
else
{
switch (dynamic.DataType)
{
case 1: // SQL数据
{
_dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary<string, string>());
var pObj = await _dataInterfaceService.GetData(dynamic);
popupselectDataList = pObj.ToJsonString().ToObject<List<Dictionary<string, string>>>();
}
break;
case 2: // 静态数据
{
var children = model.props.props.children;
foreach (var data in JValue.Parse(dynamic.Query))
{
popupselectDataList.Add(new Dictionary<string, string>() { { data.Value<string>(model.props.props.value), data.Value<string>(model.props.props.label) } });
if (data.Value<object>(children) != null && data.Value<object>(children).ToString() != "")
popupselectDataList.AddRange(GetDynamicInfiniteData(data.Value<object>(children).ToString(), model.props.props));
}
}
break;
case 3: // Api数据
{
var result = await GetApiDataByTypePreview(dynamic); // 请求接口
popupselectDataList = result.ContainsKey("list") ? result["list"].ToObject<List<Dictionary<string, string>>>() : new List<Dictionary<string, string>>();
if ((popupselectDataList == null || !popupselectDataList.Any()) && result.ContainsKey("data"))
popupselectDataList = result["data"].ToObject<Dictionary<string, object>>().ContainsKey("list") ? result["data"]["list"].ToObject<List<Dictionary<string, string>>>() : new List<Dictionary<string, string>>();
}
break;
}
_cacheManager.Set(redisName, popupselectDataList.ToList(), TimeSpan.FromMinutes(10)); // 缓存10分钟
popupselectDataList = _cacheManager.Get(redisName).ToObject<List<Dictionary<string, string>>>();
}
switch (dynamic.DataType)
{
case 1: // SQL数据
{
var specificData = popupselectDataList.Where(it => it.ContainsKey(model.propsValue) && it.ContainsValue(dataMap[key].ToString())).FirstOrDefault();
if (specificData != null)
{
// 要用模板的 “显示字段 - relationField”来展示数据
if (model.relationField.IsNullOrEmpty())
{
var showField = model.columnOptions.First();
dataMap[key] = specificData[showField.value];
}
else
{
dataMap[key + "_id"] = dataValue;
dataMap[key] = specificData[model.relationField];
}
}
else
{
if (model.multiple)
{
var nameList = new List<string>();
dataMap[key].ToObject<List<string>>().ForEach(strIt =>
{
var specificData = popupselectDataList.Where(it => it.ContainsKey(model.propsValue) && it.ContainsValue(strIt)).FirstOrDefault();
if (specificData != null)
{
// 要用模板的 “显示字段 - relationField”来展示数据
if (model.relationField.IsNullOrEmpty())
{
var showField = model.columnOptions.First();
nameList.Add(specificData[showField.value]);
}
else
{
nameList.Add(specificData[model.relationField]);
}
}
});
if (nameList.Any())
{
dataMap[key] = string.Join(model.separator, nameList);
dataMap[key + "_id"] = dataValue;
}
}
else
{
dataMap[key] = dataMap[key].ToString().Contains("[") ? string.Join(model.separator, dataMap[key].ToObject<List<object>>()) : dataMap[key];
}
}
}
break;
case 2: // 静态数据
{
List<string> dataList = dataMap[key].ToJsonString().ToObject<List<string>>();
List<string> cascaderList = new List<string>();
foreach (var items in dataList)
{
var vara = popupselectDataList.Where(a => a.ContainsValue(items)).FirstOrDefault();
if (vara != null) cascaderList.Add(vara[model.props.props.label]);
}
dataMap[key + "_id"] = dataValue;
if (actionType == "List") dataMap[key] = string.Join(model.separator, cascaderList);
else dataMap[key] = cascaderList;
}
break;
case 3: // Api数据
{
List<object> cascaderList = new List<object>();
if (model.multiple && popupselectDataList != null)
{
popupselectDataList.ForEach(obj =>
{
dataValue.ToObject<List<string>>().ForEach(str => { if (obj[model.propsValue] == str) cascaderList.Add(obj[model.relationField]); });
});
}
else if (popupselectDataList != null)
{
popupselectDataList.ForEach(obj => { if (obj[model.propsValue] == dataValue.ToString()) cascaderList.Add(obj[model.relationField]); });
}
dataMap[key + "_id"] = dataValue;
dataMap[key] = string.Join(model.separator, cascaderList);
}
break;
}
}
break;
case JnpfKeyConst.RELATIONFORM: // 关联表单
{
List<Dictionary<string, object>> relationFormDataList = new List<Dictionary<string, object>>();
var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + model.__config__.jnpfKey + "_" + model.__config__.renderKey;
if (_cacheManager.Exists(redisName))
{
relationFormDataList = _cacheManager.Get(redisName).ToObject<List<Dictionary<string, object>>>();
}
else
{
// 根据可视化功能ID获取该模板全部数据
var relationFormModel = await _db.AsSugarClient().Queryable<VisualDevEntity>().FirstAsync(v => v.Id == model.modelId);
var newFieLdsModelList = relationFormModel.FormData.ToObject<FormDataModel>().fields.FindAll(x => model.relationField.Equals(x.__vModel__));
VisualDevModelListQueryInput listQueryInput = new VisualDevModelListQueryInput
{
dataType = "1",
sidx = columnDesign.defaultSidx,
sort = columnDesign.sort,
pageSize = 999999
};
Scoped.Create(async (_, scope) =>
{
var services = scope.ServiceProvider;
var _runService = App.GetService<IRunService>(services);
var res = await _runService.GetRelationFormList(relationFormModel, listQueryInput);
_cacheManager.Set(redisName, res.list.ToList(), TimeSpan.FromMinutes(10)); // 缓存10分钟
});
var cacheStr = _cacheManager.Get(redisName);
if(cacheStr.IsNotEmptyOrNull()) relationFormDataList = _cacheManager.Get(redisName).ToObject<List<Dictionary<string, object>>>();
}
var relationFormRealData = relationFormDataList.Where(it => it["id"].Equals(dataMap[key])).FirstOrDefault();
if (relationFormRealData != null && relationFormRealData.Count > 0)
{
dataMap[key + "_id"] = relationFormRealData["id"];
dataMap[key] = relationFormRealData.ContainsKey(model.relationField) ? relationFormRealData[model.relationField] : string.Empty;
}
else
{
dataMap[key] = string.Empty;
}
}
break;
}
}
}
}
}
return list;
}
/// <summary>
/// 从缓存读取数据,根据Key.
/// </summary>
/// <param name="keyTData">控件对应的缓存</param>
/// <param name="tValue">所有的缓存</param>
/// <param name="mValue">要转换的key</param>
/// <param name="form">组件</param>
/// <param name="fieldList">所有组件(控件联动会用到)</param>
/// <param name="dataMap">当前行数据(控件联动会用到)</param>
/// <returns></returns>
private string GetTemplateDataValueByKey(List<Dictionary<string, string>> keyTData, KeyValuePair<string, object> tValue, IEnumerable<object> mValue, FieldsModel? form, List<FieldsModel>? fieldList = null, Dictionary<string, object>? dataMap = null)
{
List<string>? data = new List<string>();
if (keyTData.Count < 1) keyTData = tValue.Value.ToObject<List<Dictionary<string, string>>>();
if (form != null && form.props != null && form.props.props != null && form.props.props.multiple)
{
foreach (object? item in mValue)
{
List<string>? sb = new List<string>();
item.ToJsonString().ToObject<List<string>>().ForEach(items =>
{
var cascaderData = keyTData.Where(c => c.ContainsKey(items)).FirstOrDefault();
if (cascaderData != null) sb.Add(cascaderData[items]);
});
if (sb.Count != 0) data.Add(string.Join("/", sb));
else data.Add(item.ToString());
}
}
else if (form.IsNotEmptyOrNull() && form.__config__.IsNotEmptyOrNull() && form.__config__.props.IsNotEmptyOrNull() && form.__config__.props.value.IsNotEmptyOrNull() && form.__config__.props.label.IsNotEmptyOrNull())
{
foreach (object? item in mValue)
{
var itemData = keyTData.FirstOrDefault(x => (x.ContainsKey(form.__config__.props.value) && x.ContainsValue(item.ToString())) || x.ContainsKey(item.ToString()));
if (itemData != null) data.Add(itemData.First().Value);
else data.Add(item.ToString());
}
}
else
{
foreach (object? item in mValue)
{
Dictionary<string, string>? comData = keyTData.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault();
if (comData != null) data.Add(comData[item.ToString()]);
else data.Add(item.ToString());
}
}
// 控件联动
if (data.ToJsonString().Equals(mValue.ToJsonString()) && (form.__config__.templateJson != null && form.__config__.templateJson.Any()))
{
data.Clear();
form.__config__.templateJson.ForEach(x =>
{
if (x.relationField.ToLower().Contains("tablefield") && x.relationField.Contains("-"))
{
var rField = x.relationField.Split("-").Last();
if (dataMap.ContainsKey(rField)) x.defaultValue = dataMap[rField] != null ? dataMap[rField]?.ToString() : x.defaultValue;
}
else
{
if (dataMap.ContainsKey(x.relationField))
{
x.defaultValue = dataMap[x.relationField] != null ? dataMap[x.relationField]?.ToString() : x.defaultValue;
}
else if (dataMap.ContainsKey("JnpfKeyConst_MainData"))
{
var mainData = dataMap["JnpfKeyConst_MainData"].ToObject<Dictionary<string, object>>();
if (mainData.ContainsKey(x.relationField)) x.defaultValue = mainData[x.relationField] != null ? mainData[x.relationField]?.ToString() : x.defaultValue;
}
}
});
_databaseService.ChangeDataBase(_databaseService.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName));
var res = _dataInterfaceService.GetResponseByType(form.__config__.propsUrl, 0, string.Empty, new Common.Dtos.VisualDev.VisualDevDataFieldDataListInput() { paramList = form.__config__.templateJson.Adapt<List<DataInterfaceReqParameterInfo>>(), pageSize = 500, currentPage = 1 }).Result;
var resList = res.ToObject<PageResult<Dictionary<string,object>>>();
if (resList != null && resList.list.Any())
{
foreach (object? item in mValue)
{
var comData = resList.list.Where(a => a.ContainsValue(item.ToString())).FirstOrDefault();
var props = form.__config__.props != null ? form.__config__.props.label : form.props.props.label;
if (comData != null) data.Add(comData[props].ToString());
else data.Add(item.ToString());
}
}
}
return string.Join(form.separator, data);
}
/// <summary>
/// 查询时间转成设定字符串.
/// </summary>
/// <returns></returns>
private List<string> QueryDateTimeToString(object value, string format1, string format2)
{
List<string>? jsonArray = value.ToJsonString().ToObject<List<string>>();
string value1 = string.Format("{0:" + format1 + "}", jsonArray.FirstOrDefault().ParseToDateTime());
string value2 = string.Format("{0:" + format2 + "}", jsonArray.LastOrDefault().ParseToDateTime());
jsonArray.Clear();
jsonArray.Add(value1 + "至");
jsonArray.Add(value2);
return jsonArray;
}
#endregion
#region
/// <summary>
/// 解析 处理 条形码和二维码.
/// </summary>
/// <param name="fieldsModels"></param>
/// <param name="_newDataMap"></param>
/// <param name="_dataMap"></param>
public void GetBARAndQR(List<FieldsModel> fieldsModels, Dictionary<string, object> _newDataMap, Dictionary<string, object> _dataMap)
{
fieldsModels.Where(x => x.__config__.jnpfKey == "barcode" || x.__config__.jnpfKey == "qrcode").Where(x => !string.IsNullOrWhiteSpace(x.relationField)).ToList().ForEach(item =>
{
if (!_newDataMap.ContainsKey(item.relationField + "_id") && _dataMap.ContainsKey(item.relationField))
_newDataMap.Add(item.relationField + "_id", _dataMap[item.relationField]);
});
}
/// <summary>
/// 获取弹窗选择 数据列表.
/// </summary>
/// <param name="interfaceId"></param>
/// <param name="model"></param>
/// <returns></returns>
public async Task<List<Dictionary<string, string>>?> GetPopupSelectDataList(string interfaceId, FieldsModel model)
{
List<Dictionary<string, string>>? result = new List<Dictionary<string, string>>();
// 获取远端数据
DataInterfaceEntity? dynamic = await _dataInterfaceService.GetInfo(interfaceId);
if (dynamic == null) return null;
switch (dynamic.DataType)
{
case 1: // SQL数据
{
_dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary<string, string>());
System.Data.DataTable? pObj = await _dataInterfaceService.GetData(dynamic);
result = pObj.ToJsonString().ToObject<List<Dictionary<string, string>>>();
}
break;
case 2: // 静态数据
{
List<Dictionary<string, string>> dynamicList = new List<Dictionary<string, string>>();
string? value = model.props.props.value;
string? label = model.props.props.label;
string? children = model.props.props.children;
foreach (JToken? data in JToken.Parse(dynamic.Query))
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic[value] = data.Value<string>(value);
dic[label] = data.Value<string>(label);
dynamicList.Add(dic);
if (data.Value<object>(children) != null && data.Value<object>(children).ToString() != string.Empty)
{
dynamicList.AddRange(GetDynamicInfiniteData(data.Value<object>(children).ToString(), model.props.props));
}
}
result = dynamicList;
}
break;
case 3: // Api数据
{
string? response = await new HttpRequestPart().SetRequestUrl(dynamic.Path).GetAsStringAsync(); // 请求接口
RESTfulResult<object>? res = response.ToObject<RESTfulResult<object>>();
result = res.data?.ToString().ToObject<Dictionary<string, List<Dictionary<string, string>>>>().FirstOrDefault().Value;
}
break;
default:
break;
}
return result;
}
#endregion
#region
/// <summary>
/// 获取动态无限级数据.
/// </summary>
/// <param name="data"></param>
/// <param name="props"></param>
/// <returns></returns>
private List<Dictionary<string, string>> GetDynamicInfiniteData(string data, PropsBeanModel props)
{
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
string? value = props.value;
string? label = props.label;
string? children = props.children;
foreach (JToken? info in JToken.Parse(data))
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic[info.Value<string>(value)] = info.Value<string>(label);
list.Add(dic);
if (info.Value<object>(children) != null && info.Value<object>(children).ToString() != string.Empty)
list.AddRange(GetDynamicInfiniteData(info.Value<object>(children).ToString(), props));
}
return list;
}
/// <summary>
/// 根据不同规则请求接口(预览).
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task<JObject> GetApiDataByTypePreview(DataInterfaceEntity entity)
{
var result = new JObject();
var parameters = entity.RequestParameters.ToObject<List<DataInterfaceReqParameter>>();
var parametersHerader = entity.RequestHeaders.ToObject<List<DataInterfaceReqParameter>>();
var dic = new Dictionary<string, object>();
var dicHerader = new Dictionary<string, object>();
dicHerader.Add("JNPF_API", true);
if (_userManager.ToKen != null && !_userManager.ToKen.Contains("::"))
dicHerader.Add("Authorization", _userManager.ToKen);
foreach (var key in parameters)
{
dic.Add(key.field, key.defaultValue);
}
foreach (var key in parametersHerader)
{
dicHerader[key.field] = key.defaultValue;
}
switch (entity.RequestMethod)
{
case "6":
result = (await entity.Path.SetHeaders(dicHerader).SetQueries(dic).GetAsStringAsync()).ToObject<JObject>();
break;
case "7":
result = (await entity.Path.SetHeaders(dicHerader).SetBody(dic).PostAsStringAsync()).ToObject<JObject>();
break;
}
return result;
}
#endregion
}