using System; using System.Collections.Generic; using System.Text; namespace etoy { /// /// 规则中心辅助类 /// static class RuleCenterUtil { private static string _defatultSqlType = RuleCenterTypeDefine.Varchar; private static Dictionary _typeMap = new Dictionary { {FieldTypeDefine.Boolean, RuleCenterTypeDefine.Tinyint}, {FieldTypeDefine.Int, RuleCenterTypeDefine.Int}, {FieldTypeDefine.Long, RuleCenterTypeDefine.Bigint}, {FieldTypeDefine.Float, RuleCenterTypeDefine.Double}, {FieldTypeDefine.Double, RuleCenterTypeDefine.Double}, {FieldTypeDefine.String, RuleCenterTypeDefine.Varchar}, }; /// /// 将系统类型转换成规则中心类型 /// /// /// public static string ToRuleCenterType(string systemType, bool repeated) { if (repeated) return RuleCenterTypeDefine.Longtext; if (_typeMap.TryGetValue(systemType, out var sqltype)) return sqltype; return _defatultSqlType; } /// /// 获取字符串字节数 /// /// /// public static int GetJsonStringLength(string str) { return Encoding.UTF8.GetByteCount(str); } /// /// 逐字段写入 /// /// /// public static void OnFields(this JsonWriter writer, Dictionary fieldMap) { writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields).NewLine().ArrayBracket().Indent(); { writer.EnumeratorToJson(fieldMap, fieldMap.Count, (_, field) => { writer.NewLine(); writer.OnSingleField(field.Value); }); } writer.Dedent().NewLine().EndArrayBracket(); } /// /// 单个字段写入 /// /// public static void OnSingleField(this JsonWriter writer, RuleCenterField field) { writer.Bracket(); { writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields_Name).Append(field.name).Dot(); writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields_Type).Append(field.type); if (field.len >= 0) { writer.Dot(); writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields_Length) .ArrayBracket().Append(field.len).EndArrayBracket(); } } writer.EndBracket(); } /// /// 逐格写入 /// /// public static void OnCell(this JsonWriter writer, Cell cell, RuleCenterField field) { var value = cell.Value; if (cell.FieldInfo.FieldType == FieldTypeDefine.String) { value = cell.Value.ToInlayString(); writer.AppendKey(cell.FieldInfo.FieldName).Append(value); } else { writer.AppendKey(cell.FieldInfo.FieldName).AppendForce(value); } if (field.type == RuleCenterTypeDefine.Varchar) field.len = Math.Max(field.len, RuleCenterUtil.GetJsonStringLength(value)); } /// /// 单行写入 /// /// public static void OnSingleRow(this JsonWriter writer, Row row, Dictionary fieldsmap) { // 去除对规则中心无用属性 var cells = row.Cells.FindAll((cell) => { return fieldsmap.ContainsKey(cell.FieldInfo.FieldName); }); writer.Bracket(); { writer.EnumeratorToJson(cells, cells.Count, (_, cell) => { writer.OnCell(cell, fieldsmap[cell.FieldInfo.FieldName]); }); } writer.EndBracket(); } /// /// 逐行写入 /// /// public static void OnRows(this JsonWriter writer, List rows, Dictionary fieldsmap) { writer.AppendKey(RuleCenterJsonStructureDefine.Table_Rows).NewLine().ArrayBracket().Indent(); { // 需上传至服务端属性都为0的话,就不管 if (fieldsmap.Count > 0) { writer.EnumeratorToJson(rows, rows.Count, (_, row) => { writer.NewLine(); writer.OnSingleRow(row, fieldsmap); }); } } writer.Dedent().NewLine().EndArrayBracket(); } } }