123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- using System.Reflection;
- namespace etoy
- {
- /// <summary>
- /// Common表数据
- /// </summary>
- class Table
- {
- /// <summary>
- /// 表名
- /// </summary>
- public string Name;
- /// <summary>
- /// 表描述
- /// </summary>
- public string Description;
- /// <summary>
- /// 原始表路径
- /// </summary>
- public string Path;
- /// <summary>
- /// 表Tag
- /// </summary>
- public TableTag TableTag;
- /// <summary>
- /// 格子数据
- /// </summary>
- public List<Row> Rows;
- /// <summary>
- /// 表结构
- /// </summary>
- public FieldInfo[] FieldInfos;
- /// <summary>
- /// 配置表额外生成的枚举
- /// </summary>
- public TableEnum tableEnum;
- // 获取PK字段信息
- public FieldInfo GetPKFieldInfo()
- {
- if (FieldInfos == null)
- return null;
- foreach (var fieldInfo in FieldInfos)
- {
- if (fieldInfo.Column == 0 && (fieldInfo.FieldType == FieldTypeDefine.Int || fieldInfo.FieldType == FieldTypeDefine.Long))
- { // 第0列为int或者long,默认为主键
- return fieldInfo;
- }
- if (fieldInfo.TagInfos == null)
- continue;
- foreach (var tagInfo in fieldInfo.TagInfos)
- if (tagInfo.Key == FieldTag.PrimaryKey)
- return fieldInfo;
- }
- return null;
- }
- }
- /// <summary>
- /// 行
- /// </summary>
- class Row
- {
- /// <summary>
- /// 格子
- /// </summary>
- public List<Cell> Cells;
- }
- /// <summary>
- /// 字段信息
- /// </summary>
- class FieldInfo
- {
- public int Column;
- public string FieldName;
- public string FieldType;
- public bool IsRepeated;
- public string Description;
- public string Tags;
- public FieldTagInfo[] TagInfos;
- /// <summary>
- /// 是否是服务端字段
- /// </summary>
- public bool IsServerField => OutputTag.HasFlag(TableTag.Server);
- /// <summary>
- /// 是否是客户端字段
- /// </summary>
- public bool IsClientField => OutputTag.HasFlag(TableTag.Client);
- /// <summary>
- /// 是否是Editor字段
- /// </summary>
- public bool IsEditorField => OutputTag.HasFlag(TableTag.Editor);
- public TableTag OutputTag
- {
- get
- {
- if (TryGetTagValue(FieldTag.Output, out string tagValue))
- {
- if (tagValue == "e")
- return TableTag.Editor;
- var result = TableTag.Editor;
- if (tagValue.Contains('c', StringComparison.OrdinalIgnoreCase))
- {
- result |= TableTag.Client;
- }
- if (tagValue.Contains('s', StringComparison.OrdinalIgnoreCase))
- {
- result |= TableTag.Server;
- }
- if (result == TableTag.Editor)
- {
- throw new Exception($"error tag, FieldName({FieldName}) tags({Tags})");
- }
- return result;
- }
- return TableTag.All;
- }
- }
- /// <summary>
- /// 默认值
- /// </summary>
- public string DefaultValue
- {
- get
- {
- if (TryGetTagValue(FieldTag.Default, out var tagValue))
- {
- return tagValue;
- }
- else
- {
- if (IsRepeated)
- {
- return "[]";
- }
- else
- {
- string result = FieldType switch
- {
- FieldTypeDefine.String => string.Empty,
- FieldTypeDefine.Int => default(int).ToString(),
- FieldTypeDefine.Long => default(long).ToString(),
- FieldTypeDefine.Boolean => default(bool).ToString(),
- FieldTypeDefine.Float => default(float).ToString(),
- FieldTypeDefine.Double => default(double).ToString(),
- _ => string.Empty,
- };
- return result;
- }
- }
- }
- }
- /// <summary>
- /// 是否是i18n字段
- /// </summary>
- public bool Isi18nField
- {
- get
- {
- if (TryGetTagValue(FieldTag.i18n, out var tagValue))
- return tagValue == "true";
- return false;
- }
- }
- /// <summary>
- /// 是否是主键
- /// </summary>
- public bool IsPrimaryKey
- {
- get
- {
- if (Column == 0 && (FieldType == FieldTypeDefine.Int || FieldType == FieldTypeDefine.Long))
- { // 第0列为int或者long,默认为主键
- return true;
- }
- return ContainsTag(FieldTag.PrimaryKey);
- }
- }
- bool ContainsTag(FieldTag tag)
- {
- if (TagInfos == null)
- return false;
- foreach (var tagInfo in TagInfos)
- if (tagInfo.Key == tag)
- return true;
- return false;
- }
- bool TryGetTagValue(FieldTag tag, out string value)
- {
- value = null;
- if (TagInfos == null)
- return false;
- foreach (var tagInfo in TagInfos)
- if (tagInfo.Key == tag)
- {
- value = tagInfo.Value;
- return true;
- }
- return false;
- }
- }
- /// <summary>
- /// 格子信息
- /// </summary>
- class Cell
- {
- string _value;
- public int Column;
- public int Row;
- public FieldInfo FieldInfo;
- public string Value
- {
- get
- {
- if (string.IsNullOrEmpty(_value))
- _value = FieldInfo.DefaultValue.ToCellValue();
- return _value;
- }
- set => _value = value;
- }
- }
- /// <summary>
- /// 字段tag信息
- /// </summary>
- class FieldTagInfo
- {
- public FieldTag Key;
- public string Value;
- }
- /// <summary>
- /// 字段tag, 对应Excel第4行, 忽略大小写
- /// </summary>
- enum FieldTag
- {
- /// <summary>
- /// 主键
- /// </summary>
- PrimaryKey,
- /// <summary>
- /// 默认值
- /// </summary>
- Default,
- /// <summary>
- /// 输出去向 (output:c output:s)
- /// </summary>
- Output,
- /// <summary>
- /// 翻译
- /// </summary>
- i18n,
- i18nPlot,
- i18nHashKey,
- i18nUnvalidJson,
- NoTranslate,
- i18nStrKey,
- }
- /// <summary>
- /// 表格Tag, 指定Table为客户端或服务端。
- /// 1.SheetName以 "c_" 或者 "s_" 开头以示区分, 未填则all。
- /// 2.忽略大小写
- /// </summary>
- enum TableTag
- {
- Client = 0x1,
- Server = 0x10,
- Editor = 0x100,
- All = Client | Server | Editor,
- }
- /// <summary>
- /// 配置表转枚举
- /// 有些表需要将id转成枚举方便使用
- /// </summary>
- class TableEnum
- {
- /// <summary>
- /// 枚举名字
- /// </summary>
- public string name;
- /// <summary>
- /// 枚举类型的配置表字段名
- /// </summary>
- public string key;
- /// <summary>
- /// 枚举值的配置表字段名
- /// </summary>
- public string value;
- /// <summary>
- /// 枚举注释的配置表字段名
- /// </summary>
- public string summary;
- }
- }
|