schangxiang@126.com
2024-09-06 05f2a20bb792169bf7b8a101af8718b96449f55a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#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);
            }
        }
    }
}