using Furion.Extras.iWare.Wms.Util.LowCode.Front.Att;
using Furion.Extras.iWare.Wms.Util.LowCode.Front.Interface;
using Furion.Extras.iWare.Wms.Util.LowCode.Front.Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Reflection;
namespace Furion.Extras.iWare.Wms.Util.LowCode.Front.Code
{
///
/// json解析为动态表单
///
public static class AutoCode_Front
{
public static Front_Model ConvertToFront(this string json)
{
FrontTypes();
var JData = JsonConvert.DeserializeObject(json);
return new Front_Model()
{
List = ReadFront(JData["list"].Values().ToList()),
Config = JsonConvert.DeserializeObject(JData["config"].ToString())
};
}
public static List ReadFront(List JData)
{
List list = new List();
JData.ForEach(JItem =>
{
list.Add(ReadFront(JItem));
});
return list;
}
public static List ReadFront_BindDatabase(this IFront front, string providerName)
{
var item = List.Where(x => x.Type == front.Type).FirstOrDefault();
if (item == null || item.BindDatabase == null || !item.BindDatabase.Any()) return new List();
if (item.BindDatabase.Where(x => x.ProviderName == providerName).Any())
return item.BindDatabase.Where(x => x.ProviderName == providerName).ToList();
providerName = item.BindDatabase.Select(x => x.ProviderName).FirstOrDefault();
return item.BindDatabase.Where(x => x.ProviderName == providerName).ToList();
}
private static IFront ReadFront(JObject JData)
{
var type = JData["type"].Value();
var item = List.Where(x => x.Type == type).FirstOrDefault();
if (item == null)
throw new NotFoundFrontException($"未找到组件:{type}");
if (item.T.GetInterfaces().Where(x => x == typeof(IFrontLayout)).Any())
{
IFrontLayout layout = Activator.CreateInstance(item.T) as IFrontLayout;
return layout.ConvertFront(JData);
}
else
{
return (IFront)JData.ToObject(item.T);
}
}
private static List List { get; set; }
private static List FrontTypes()
{
if (List == null)
{
List = new List();
Assembly.GetExecutingAssembly().GetTypes().Where(o => o.IsClass && o.Namespace == "Furion.Extras.iWare.Wms.Util.LowCode.Front").ToList().ForEach(type =>
{
var FrontTypeAttribute = type.GetCustomAttribute();
if (FrontTypeAttribute != null)
{
List.Add(new Front_Convert()
{
T = type
,
Type = FrontTypeAttribute.Type
,
BindDatabase = type.GetCustomAttributes().ToList()
});
}
});
}
return List;
}
}
}