/// <summary> /// 添加系统字段 /// </summary> /// <param name="id"></param> public void AddSystemAttrs(string id) { var columns = new List <Column>() { { new Column() { Name = "name", LogicalName = "名称", Type = DataType.Varchar, Length = 100, IsRequire = false } }, { new Column() { Name = "createdBy", LogicalName = "创建人", Type = DataType.Varchar, Length = 40, IsRequire = true } }, { new Column() { Name = "createdByName", LogicalName = "创建人", Type = DataType.Varchar, Length = 100, IsRequire = true } }, { new Column() { Name = "createdOn", LogicalName = "创建日期", Type = DataType.Timestamp, IsRequire = true } }, { new Column() { Name = "modifiedBy", LogicalName = "修改人", Type = DataType.Varchar, Length = 40, IsRequire = true } }, { new Column() { Name = "modifiedByName", LogicalName = "修改人", Type = DataType.Varchar, Length = 100, IsRequire = true } }, { new Column() { Name = "modifiedOn", LogicalName = "修改日期", Type = DataType.Timestamp, IsRequire = true } } }; Broker.ExecuteTransaction(() => { var entity = Broker.Retrieve <sys_entity>(id); columns.ForEach(item => { var sql = @" SELECT * FROM sys_attrs WHERE entityid = @id AND code = @code; "; var count = Broker.Query <sys_attrs>(sql, new Dictionary <string, object>() { { "@id", entity.Id }, { "@code", item.Name } }).Count(); AssertUtil.CheckBoolean <SpException>(count > 0, $"实体{entity.code}已存在{item.Name}字段,请勿重复添加", "E86150F7-52CC-4FB7-A6C4-B743BF382E92"); var attrModel = new sys_attrs() { Id = Guid.NewGuid().ToString(), code = item.Name, name = item.LogicalName, entityid = entity.Id, entityidname = entity.name, attr_type = item.Type.ToString().ToLower(), attr_length = item.Length, isrequire = item.IsRequire == true, default_value = ConvertUtil.ConToString(item.DefaultValue) }; Broker.Create(attrModel, false); }); Broker.Execute(Broker.DbClient.Driver.GetAddColumnSql(entity.code, columns)); }); }
public static IApplicationBuilder UseEntityWatcher(this IApplicationBuilder app) { var logger = LogFactory.GetLogger("entity"); UserIdentityUtil.SetCurrentUser(UserIdentityUtil.GetSystem()); var broker = PersistBrokerFactory.GetPersistBroker(); var dialect = broker.DbClient.Driver; var entityList = ServiceContainer.ResolveAll <IEntity>().OrderByDescending(item => item.GetEntityName() == typeof(sys_attrs).Name); broker.ExecuteTransaction(() => { #region 创建表 entityList.Each(item => { var entity = broker.Query(dialect.GetTable(item.GetEntityName())); var attrs = item.GetAttrs(); if (entity == null || entity.Rows.Count == 0) { var attrSql = attrs .Select(e => { return($"{e.Name} {e.Type.GetDescription()}{(e.Length != null ? $"({e.Length.Value})" : "")} {(e.IsRequire.HasValue && e.IsRequire.Value ? "NOT NULL" : "")}{(e.Name == $"{item.GetEntityName()}id" ? " PRIMARY KEY" : "")}"); }) .Aggregate((a, b) => a + ",\r\n" + b); // 创建表 var sql = $@"CREATE TABLE public.{item.GetEntityName()} ({attrSql})"; broker.Execute(sql); logger.Info($"实体{item.GetLogicalName()}({item.GetEntityName()})创建成功"); } }); #endregion #region 创建实体记录和实体字段数据 entityList.Each(item => { #region 实体添加自动写入记录 var entityName = item.GetEntityName(); var entity = broker.Retrieve <sys_entity>("select * from sys_entity where code = @code", new Dictionary <string, object>() { { "@code", entityName } }); if (entity == null) { entity = new sys_entity() { Id = Guid.NewGuid().ToString(), name = item.GetLogicalName(), code = item.GetEntityName(), is_sys = item.IsSystemEntity() }; broker.Create(entity, false); } #endregion var attrs = item.GetAttrs(); var attrsList = new SysEntityService(broker).GetEntityAttrs(entity.Id).Select(e => e.code); #region 实体字段变更(删除字段) attrsList.Each(attr => { if (!attrs.Any(item => item.Name.ToLower() == attr.ToLower())) { var sql = @"DELETE FROM sys_attrs WHERE lower(code) = @code AND entityid = @entityid"; broker.Execute(sql, new Dictionary <string, object>() { { "@code", attr.ToLower() }, { "@entityid", EntityCache.GetEntity(item.GetEntityName())?.Id } }); sql = broker.DbClient.Driver.GetDropColumnSql(item.GetEntityName(), new List <Column>() { new Column() { Name = attr } }); broker.Execute(sql); logger.Debug($"实体{item.GetLogicalName()} ({item.GetEntityName()})删除字段:{attr}"); } }); #endregion #region 实体字段变更(新增字段) attrs.Each(attr => { if (!attrsList.Contains(attr.Name)) { var _attr = new sys_attrs() { Id = Guid.NewGuid().ToString(), name = attr.LogicalName, code = attr.Name, entityid = entity.Id, entityidname = entity.name, entityCode = entity.code, attr_type = attr.Type.ToString().ToLower(), attr_length = attr.Length, isrequire = attr.IsRequire.HasValue && attr.IsRequire.Value, default_value = ConvertUtil.ConToString(attr.DefaultValue) }; broker.Create(_attr); logger.Debug($"实体{item.GetLogicalName()}({item.GetEntityName()})创建字段:{attr.LogicalName}({attr.Name})成功"); } }); #endregion }); #endregion #region 执行版本更新脚本 { var vLogger = LogFactory.GetLogger("version"); FileHelper.GetFileList("*.sql", FolderType.Version) .OrderBy(item => Path.GetFileName(item)) .ToList() .Each(sqlFile => { try { var count = new VersionScriptExecutionLogService(broker).ExecuteScript(sqlFile); if (count == 1) { vLogger.Info($"脚本:{Path.GetFileName(sqlFile)}执行成功"); } } catch (Exception ex) { vLogger.Error($"脚本:{Path.GetFileName(sqlFile)}执行失败", ex); } }); } #endregion }); return(app); }