#nullable enable
|
using Furion.DatabaseAccessor;
|
using System.ComponentModel;
|
using System.Reflection;
|
|
namespace iWare.Wms.Core.Util
|
{
|
public static class DataConvertUtil
|
{
|
public static void ToExcelData<T>(List<T> source,
|
IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep,
|
IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep,
|
out List<string> headers, out List<List<object>> data, out string sheetName)
|
{
|
headers = new List<string>();
|
data = new List<List<object>>();
|
var type = typeof(T);
|
sheetName = ((DescriptionAttribute?)type.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无";
|
List<string> enumClassNames = new();
|
foreach (var field in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
{
|
if ("Id".Equals(field.Name)) continue;
|
headers.Add(((DescriptionAttribute?)field.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无");
|
var dataType = StringUtil.ParseTrueType2(field.PropertyType.FullName ?? "");
|
if (TypeUtil.GetType(dataType)?.IsEnum ?? false)
|
{
|
if (!enumClassNames.Contains(dataType))
|
{
|
enumClassNames.Add(dataType);
|
}
|
}
|
}
|
|
var dictTypeList = sysDictTypeRep.DetachedEntities.Where(x => enumClassNames.Contains(x.EnumClassName)).ToList();
|
List<long> dictTypeIds = dictTypeList.Select(x => x.Id).ToList();
|
Dictionary<long, SysDictType> dictTypeDictionary = new();
|
dictTypeList.ForEach(x => dictTypeDictionary.Add(x.Id, x));
|
var dictDataList = sysDictDataRep.DetachedEntities.Where(x => dictTypeIds.Contains(x.TypeId)).ToList();
|
dictDataList.ForEach(x =>
|
{
|
if (dictTypeDictionary.ContainsKey(x.TypeId))
|
{
|
var dictType = dictTypeDictionary[x.TypeId];
|
if (dictType?.SysDictDatas == null)
|
{
|
if (dictType != null)
|
{
|
dictType.SysDictDatas = new List<SysDictData>();
|
}
|
}
|
dictType?.SysDictDatas?.Add(x);
|
}
|
});
|
Dictionary<string, string> map = new();
|
dictTypeList.ForEach(x =>
|
{
|
if (x?.SysDictDatas != null)
|
{
|
foreach (SysDictData dictData in x.SysDictDatas)
|
{
|
if (dictData != null) map.Add(x.EnumClassName + "#" + dictData.Code, dictData.Value);
|
}
|
}
|
});
|
|
foreach (var t in source)
|
{
|
List<object> objectList = new();
|
foreach (var field in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
{
|
var fieldName = field.Name;
|
if ("Id".Equals(fieldName)) continue;
|
var v = t?.GetType()?.GetProperty(fieldName)?.GetValue(t);
|
var dataType = StringUtil.ParseTrueType2(field.PropertyType.FullName ?? "");
|
if (TypeUtil.GetType(dataType)?.IsEnum ?? false)
|
{
|
v = Convert.ToInt32(v);
|
if (map.ContainsKey(dataType + "#" + v)) v = map[dataType + "#" + v];
|
}
|
else if ("System.DateTimeOffset".Equals(dataType))
|
{
|
v = (((DateTimeOffset?)v)?.ToString("yyyy/MM/dd HH:mm:ss")) ?? "";
|
}
|
else if ("System.DateTime".Equals(dataType))
|
{
|
v = (((DateTime?)v)?.ToString("yyyy/MM/dd HH:mm:ss")) ?? "";
|
}
|
objectList.Add(v ?? "");
|
}
|
data.Add(objectList);
|
}
|
}
|
}
|
}
|