using JNPF.Common.Const;
using JNPF.Common.Extension;
using JNPF.Common.Manager;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.Systems.Entitys.Permission;
using JNPF.VisualDev.Engine;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Newtonsoft.Json.Linq;
using SqlSugar;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.RemoteRequest.Extensions;
using JNPF.Systems.Entitys.Model.DataInterFace;
using JNPF.Common.Core.Manager;
namespace JNPF.Common.CodeGen.DataParsing;
public class ControlParsing : ITransient
{
///
/// 服务基础仓储.
///
private readonly ISqlSugarRepository _repository;
///
/// 缓存管理.
///
private readonly ICacheManager _cacheManager;
///
/// 用户管理.
///
private readonly IUserManager _userManager;
///
/// 数据接口.
///
private readonly IDataInterfaceService _dataInterfaceService;
///
/// 构造函数.
///
public ControlParsing(
IUserManager userManager,
ISqlSugarRepository repositoryRepository,
IDataInterfaceService dataInterfaceService,
ICacheManager cacheManager)
{
_userManager = userManager;
_repository = repositoryRepository;
_cacheManager = cacheManager;
_dataInterfaceService = dataInterfaceService;
}
///
/// 解析控件数据.
///
/// 原数据集合.
/// 解析的字段集合 多个需以 ,号隔开.
/// 控件类型 (JnpfKeyConst).
/// 租户Id.
/// 控件属性 (vModel ,属性字符串).
///
public async Task>> GetParsDataList(List> oldDatas, string vModelStr, string jnpfKeyConst, string tenantId, List? vModelAttr = null)
{
var vModels = new Dictionary();
var vModelList = vModelStr.Split(',');
oldDatas.ForEach(items =>
{
foreach (var item in items)
{
if (vModelList.Contains(item.Key) && !vModels.ContainsKey(item.Key)) vModels.Add(item.Key, jnpfKeyConst);
// 子表
if (item.Value != null && item.Key.ToLower().Contains("tablefield") && (item.Value is List> || item.Value.GetType().Name.Equals("JArray")))
{
var ctOldDatas = item.Value.ToObject>>();
ctOldDatas.ForEach(ctItems =>
{
foreach (var ctItem in ctItems)
{
if (vModelList.Contains(item.Key + "-" + ctItem.Key) && !vModels.ContainsKey(item.Key + "-" + ctItem.Key))
vModels.Add(item.Key + "-" + ctItem.Key, jnpfKeyConst);
}
});
}
}
});
return await GetParsDataByList(vModelAttr, oldDatas, vModels, tenantId);
}
///
/// 获取解析数据.
///
/// 模板集合.
/// 原数据集合.
/// 需解析的字段 (字段名,JnpfKeyConst/子表dictionary).
/// 租户Id.
///
private async Task>> GetParsDataByList(List fields, List> oldDatas, Dictionary vModels, string tenantId)
{
var cacheData = await GetCaCheData(vModels, tenantId);
var usersselectDatas = cacheData.Where(t => t.Key.Equals(CommonConst.CodeGenDynamic + "_usersSelect_" + tenantId)).FirstOrDefault().Value.ToObject>(); // 用户组件
foreach (var items in oldDatas)
{
for(var i = 0; i < items.Count; i++)
{
var item = items.ToList()[i];
if (vModels.Any(x => x.Key.Equals(item.Key)) && items[item.Key] != null)
{
FieldsModel model = fields.Any(x=>x.__vModel__.Equals(item.Key)) ? fields.Find(x=> x.__vModel__.Equals(item.Key)) : (fields.Any(x => x.__vModel__.Equals(item.Key.Replace("_name", string.Empty))) ? fields.Find(x => x.__vModel__.Equals(item.Key.Replace("_name", string.Empty))) : new FieldsModel());
model.separator = ",";
var jnpfKey = vModels.FirstOrDefault(x => x.Key.Equals(item.Key)).Value;
switch (jnpfKey)
{
case JnpfKeyConst.USERSSELECT:
{
var itemValue = item.Value;
if (itemValue == null && items.ContainsKey(item.Key.Replace("_name", string.Empty))) itemValue = items[item.Key.Replace("_name", string.Empty)];
if (itemValue != null)
{
var vList = new List();
if (itemValue.ToString().Contains("[")) vList = itemValue.ToString().ToObject>();
else vList.Add(itemValue.ToString());
var itemValues = new List();
vList.ForEach(it =>
{
if (usersselectDatas.ContainsKey(it)) itemValues.Add(usersselectDatas[it]);
});
if (itemValues.Any()) items[item.Key] = string.Join(",", itemValues);
}
}
break;
case JnpfKeyConst.POPUPSELECT: // 弹窗选择
{
if (model.interfaceId.IsNullOrEmpty()) continue;
List> popupselectDataList = new List>();
// 获取远端数据
var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId);
var redisName = CommonConst.CodeGenDynamic + "_" + model.interfaceId + "_" + tenantId;
if (_cacheManager.Exists(redisName))
{
popupselectDataList = _cacheManager.Get(redisName).ToObject>>();
}
else
{
if (dynamic == null) break;
switch (dynamic.DataType)
{
case 1: // SQL数据
{
_dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary());
var pObj = await _dataInterfaceService.GetData(dynamic);
popupselectDataList = pObj.ToJsonString().ToObject>>();
}
break;
case 2: // 静态数据
{
var children = model.props.props.children;
foreach (var data in JValue.Parse(dynamic.Query))
{
popupselectDataList.Add(new Dictionary() { { data.Value(model.props.props.value), data.Value(model.props.props.label) } });
if (data.Value