Files
zszq-trs/YLErpDAL/Modules/SuperviseReportModule/SAC/Common/Sac_TranslateHelper.cs
T

260 lines
7.5 KiB
C#

using System.Reflection;
using YLErp.Modules.SuperviseReportModule.SAC.Model;
namespace YLErp.Modules.SuperviseReportModule.SAC.Common
{
class Sac_TranslateHelper
{
private static SacMap? Map = null;
private static List<SacMap> GetSacInfo(PropertyInfo[] properties)
{
var result = new List<SacMap>();
foreach (var item in properties)
{
var sacInfo = new SacMap(item.Name, item.Name);
if (item.GetCustomAttributes(typeof(SacDescriptionAttribute)).FirstOrDefault() is SacDescriptionAttribute info)
{
sacInfo.FieldName = info.FieldName;
sacInfo.FieldName_CN = info.FieldName_CN;
sacInfo.FieldLength = info.FieldLength;
sacInfo.Required = info.Required;
sacInfo.FieldDescription = info.FieldDescription;
}
var att = item.PropertyType.GetGenericArguments();
if (att.Length == 0)
{
att = new[] { item.PropertyType };
}
if (att.Length == 1 && att[0].Namespace.StartsWith("YLErp.Modules.SuperviseReportModule"))
{
sacInfo.SubMaps.AddRange(GetSacInfo(att[0].GetProperties()));
}
//if(item.)
result.Add(sacInfo);
}
return result;
}
private static void Init()
{
Map = new SacMap("Root", "报文");
var root = typeof(ReportRootModel);
var properties = root.GetProperties();
Map.SubMaps.AddRange(GetSacInfo(properties));
}
public static SacMap TranslateFieldName(params string[] paths)
{
if (paths.Length == 0)
{
throw new ArgumentNullException(nameof(paths));
}
if (Map == null)
{
Init();
}
var map = Map;
foreach (var item in paths)
{
if (item == "Root")
{
continue;
}
if (map == null ||
map.SubMaps == null ||
(map = map.SubMaps.Where(O => O.FieldName == item).FirstOrDefault()) == null)
{
map = new SacMap(item, item);
}
}
return map;
}
public static string TranslateFieldName(string fieldName, string fileType = "")
{
if (Map == null)
{
Init();
}
SacMap map = Map;
return getFieldName_CN(map, fieldName, fileType);
}
private static string getFieldName_CN(SacMap map, string fieldName, string fileType = "")
{
if (map.FieldName == fieldName)
{
return map.FieldName_CN;
}
if (map.SubMaps.Count > 0)
{
foreach (var m in map.SubMaps)
{
if (map.FieldName == "Body")
{
if (!string.IsNullOrWhiteSpace(fileType) && m.FieldName != fileType)
{
continue;
}
}
var ret = getFieldName_CN(m, fieldName, fileType);
if (!string.IsNullOrWhiteSpace(ret))
{
return ret;
}
}
}
return "";
}
}
/// <summary>
/// 字段说明属性类
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
public class SacDescriptionAttribute : Attribute
{
/// <summary>
/// 字段名
/// </summary>
public string FieldName { get; set; }
/// <summary>
/// 字段中文名
/// </summary>
public string FieldName_CN { get; set; }
/// <summary>
/// 字段长度
/// </summary>
public string FieldLength { get; set; }
/// <summary>
/// 必填
/// </summary>
public bool Required { get; set; }
/// <summary>
/// 字段说明
/// </summary>
public string FieldDescription { get; set; }
public SacDescriptionAttribute() { }
public SacDescriptionAttribute(string fieldName, string fieldName_CN, string fileLength, bool required, string fieldDescription)
{
FieldName = fieldName;
FieldName_CN = fieldName_CN;
FieldLength = fileLength;
Required = required;
FieldDescription = fieldDescription;
}
}
/// <summary>
/// 用于预览
/// </summary>
public class SacMap : SacDescriptionAttribute
{
/// <summary>
/// 子节点
/// </summary>
public List<SacMap> SubMaps { get; set; }
public SacMap() { }
public SacMap(string fieldName, string fieldName_CN)
{
FieldName = fieldName;
FieldName_CN = fieldName_CN;
SubMaps = new List<SacMap>();
}
public override string ToString()
{
return $"{FieldName}_{FieldDescription}_{SubMaps.Count}";
}
}
public class SacInfo : SacDescriptionAttribute
{
/// <summary>
/// 对象序号
/// </summary>
public int Index { get; set; }
/// <summary>
/// 值
/// </summary>
public string FieldValue { get; set; }
/// <summary>
/// 检查结果
/// </summary>
public string Message { get; set; }
/// <summary>
/// 子信息
/// </summary>
public List<SacInfo> SubMaps { get; set; }
public SacInfo()
{ }
public SacInfo(string fileName)
: this(fileName, "", "")
{
}
public SacInfo(string fileName, int index)
: this(fileName, "", "")
{
Index = index;
}
public SacInfo(string fileName, object value)
: this(fileName, value, "")
{
}
public SacInfo(string fileName, object value, string message)
{
FieldName = fileName;
FieldValue = (value as string) ?? "";
Message = message;
Index = -1;
SubMaps = new List<SacInfo>();
}
public void formatFieldDescription(params string[] paths)
{
var list = new List<string>(paths)
{
FieldName
};
var arr = list.ToArray();
var info = Sac_TranslateHelper.TranslateFieldName(arr);
FieldName = info.FieldName;
FieldName_CN = info.FieldName_CN;
FieldLength = info.FieldLength;
FieldDescription = info.FieldDescription;
Required = info.Required;
if (this.SubMaps != null && this.SubMaps.Count > 0)
{
SubMaps?.ForEach(O =>
{
if (O == null)
{
return;
}
O.formatFieldDescription(arr);
});
}
}
}
public class ExceptionExtensionInfo
{
public List<SacInfo> Tag { get; set; }
public string ErrFilePath { get; set; }
}
}