Exemplo n.º 1
0
        /// <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));
            });
        }
Exemplo n.º 2
0
        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);
        }