Jelajahi Sumber

优化动态表单,增加集群,tag支持

zhouhao 6 tahun lalu
induk
melakukan
13dfa76e16
16 mengubah file dengan 234 tambahan dan 233 penghapusan
  1. 6 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/entity/form/DynamicFormEntity.java
  2. 5 205
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/entity/form/SimpleDynamicFormEntity.java
  3. 1 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/DynamicFormService.java
  4. 18 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/FormDeployService.java
  5. 14 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/events/FormDeployEvent.java
  6. 14 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/events/FormUnDeployEvent.java
  7. 11 1
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/SimpleDatabaseRepository.java
  8. 4 11
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormOperationService.java
  9. 52 12
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormService.java
  10. 51 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/cluster/ClusterDatabase.java
  11. 49 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/cluster/ClusterDatabaseInit.java
  12. 1 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/form/DynamicFormMapper.xml
  13. 1 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-starter/src/main/resources/hsweb-starter.js
  14. 2 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ActivityConfigServiceImpl.java
  15. 1 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ProcessDefineConfigServiceImpl.java
  16. 4 4
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/hsweb-starter.js

+ 6 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/entity/form/DynamicFormEntity.java

@@ -67,6 +67,8 @@ public interface DynamicFormEntity extends GenericEntity<String> {
      */
     String type              = "type";
 
+    String tags = "tags";
+
     /**
      * @return 表单名称
      */
@@ -209,4 +211,8 @@ public interface DynamicFormEntity extends GenericEntity<String> {
      */
     void setType(String type);
 
+    String getTags();
+
+    void setTags(String tags);
+
 }

+ 5 - 205
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/entity/form/SimpleDynamicFormEntity.java

@@ -1,5 +1,7 @@
 package org.hswebframework.web.entity.form;
 
+import lombok.Getter;
+import lombok.Setter;
 import org.hswebframework.web.commons.entity.SimpleGenericEntity;
 
 /**
@@ -7,6 +9,8 @@ import org.hswebframework.web.commons.entity.SimpleGenericEntity;
  *
  * @author hsweb-generator-online
  */
+@Getter
+@Setter
 public class SimpleDynamicFormEntity extends SimpleGenericEntity<String> implements DynamicFormEntity {
     //表单名称
     private String  name;
@@ -35,211 +39,7 @@ public class SimpleDynamicFormEntity extends SimpleGenericEntity<String> impleme
     //表单类型
     private String  type;
 
-    /**
-     * @return 表单名称
-     */
-    @Override
-    public String getName() {
-        return this.name;
-    }
+    private String tags;
 
-    /**
-     * @param name 表单名称
-     */
-    @Override
-    public void setName(String name) {
-        this.name = name;
-    }
 
-    /**
-     * @return 数据库表名
-     */
-    @Override
-    public String getDatabaseTableName() {
-        return this.databaseTableName;
-    }
-
-    /**
-     * @param databaseTableName 数据库表名
-     */
-    @Override
-    public void setDatabaseTableName(String databaseTableName) {
-        this.databaseTableName = databaseTableName;
-    }
-
-    /**
-     * @return 备注
-     */
-    @Override
-    public String getDescribe() {
-        return this.describe;
-    }
-
-    /**
-     * @param describe 备注
-     */
-    @Override
-    public void setDescribe(String describe) {
-        this.describe = describe;
-    }
-
-    /**
-     * @return 版本
-     */
-    @Override
-    public Long getVersion() {
-        return this.version;
-    }
-
-    /**
-     * @param version 版本
-     */
-    @Override
-    public void setVersion(Long version) {
-        this.version = version;
-    }
-
-    /**
-     * @return 创建人id
-     */
-    @Override
-    public String getCreatorId() {
-        return this.creatorId;
-    }
-
-    /**
-     * @param creatorId 创建人id
-     */
-    @Override
-    public void setCreatorId(String creatorId) {
-        this.creatorId = creatorId;
-    }
-
-    /**
-     * @return 创建时间
-     */
-    @Override
-    public Long getCreateTime() {
-        return this.createTime;
-    }
-
-    /**
-     * @param createTime 创建时间
-     */
-    @Override
-    public void setCreateTime(Long createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
-     * @return 修改时间
-     */
-    @Override
-    public Long getUpdateTime() {
-        return this.updateTime;
-    }
-
-    /**
-     * @param updateTime 修改时间
-     */
-    @Override
-    public void setUpdateTime(Long updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    /**
-     * @return 是否已发布
-     */
-    @Override
-    public Boolean getDeployed() {
-        return this.deployed;
-    }
-
-    /**
-     * @param deployed 是否已发布
-     */
-    @Override
-    public void setDeployed(Boolean deployed) {
-        this.deployed = deployed;
-    }
-
-    /**
-     * @return 别名
-     */
-    @Override
-    public String getAlias() {
-        return this.alias;
-    }
-
-    /**
-     * @param alias 别名
-     */
-    @Override
-    public void setAlias(String alias) {
-        this.alias = alias;
-    }
-
-    /**
-     * @return 触发器
-     */
-    @Override
-    public String getTriggers() {
-        return this.triggers;
-    }
-
-    /**
-     * @param triggers 触发器
-     */
-    @Override
-    public void setTriggers(String triggers) {
-        this.triggers = triggers;
-    }
-
-    /**
-     * @return 表链接
-     */
-    @Override
-    public String getCorrelations() {
-        return this.correlations;
-    }
-
-    /**
-     * @param correlations 表链接
-     */
-    @Override
-    public void setCorrelations(String correlations) {
-        this.correlations = correlations;
-    }
-
-    /**
-     * @return 数据源id, 为空使用默认数据源
-     */
-    @Override
-    public String getDataSourceId() {
-        return this.dataSourceId;
-    }
-
-    /**
-     * @param dataSourceId 数据源id,为空使用默认数据源
-     */
-    @Override
-    public void setDataSourceId(String dataSourceId) {
-        this.dataSourceId = dataSourceId;
-    }
-
-    /**
-     * @return 表单类型
-     */
-    @Override
-    public String getType() {
-        return this.type;
-    }
-
-    /**
-     * @param type 表单类型
-     */
-    @Override
-    public void setType(String type) {
-        this.type = type;
-    }
 }

+ 1 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/DynamicFormService.java

@@ -39,4 +39,5 @@ public interface DynamicFormService extends CrudService<DynamicFormEntity, Strin
 
     DynamicFormColumnBindEntity selectDeployed(String formId, int version);
 
+    long selectDeployedVersion(String formId);
 }

+ 18 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/FormDeployService.java

@@ -0,0 +1,18 @@
+package org.hswebframework.web.service.form;
+
+import org.hswebframework.web.entity.form.DynamicFormColumnEntity;
+import org.hswebframework.web.entity.form.DynamicFormEntity;
+
+import java.util.List;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public interface FormDeployService {
+    void deploy(String formId);
+
+    void deploy(DynamicFormEntity form, List<DynamicFormColumnEntity> columns, boolean updateMeta);
+
+    void unDeploy(String formId);
+}

+ 14 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/events/FormDeployEvent.java

@@ -0,0 +1,14 @@
+package org.hswebframework.web.service.form.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@AllArgsConstructor
+@Getter
+public class FormDeployEvent {
+    private String formId;
+}

+ 14 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/service/form/events/FormUnDeployEvent.java

@@ -0,0 +1,14 @@
+package org.hswebframework.web.service.form.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@AllArgsConstructor
+@Getter
+public class FormUnDeployEvent {
+    private String formId;
+}

+ 11 - 1
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/SimpleDatabaseRepository.java

@@ -12,8 +12,12 @@ import org.hswebframework.web.datasource.DataSourceHolder;
 import org.hswebframework.web.datasource.DatabaseType;
 import org.hswebframework.web.datasource.DynamicDataSource;
 import org.hswebframework.web.service.form.DatabaseRepository;
+import org.hswebframework.web.service.form.DynamicFormService;
+import org.hswebframework.web.service.form.FormDeployService;
 import org.hswebframework.web.service.form.events.DatabaseInitEvent;
+import org.hswebframework.web.service.form.simple.cluster.ClusterDatabase;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 
@@ -30,6 +34,9 @@ public class SimpleDatabaseRepository implements DatabaseRepository {
     private volatile RDBDatabase defaultDatabase = null;
     private          SqlExecutor sqlExecutor     = null;
 
+    @Value("${hsweb.dynamic-form.cluster:false}")
+    private boolean cluster = false;
+
     @Autowired
     private ApplicationEventPublisher eventPublisher;
 
@@ -99,7 +106,10 @@ public class SimpleDatabaseRepository implements DatabaseRepository {
         Supplier<AbstractRDBDatabaseMetaData> supplier = databaseMetaSuppliers.get(databaseType);
         Objects.requireNonNull(supplier, "database type" + databaseType + " is not support");
         AbstractRDBDatabaseMetaData metaData = supplier.get();
-        SimpleDatabase database = new SimpleDatabase(metaData, sqlExecutor);
+
+        SimpleDatabase database = cluster ?
+                new ClusterDatabase(metaData, sqlExecutor) :
+                new SimpleDatabase(metaData, sqlExecutor);
         database.setAutoParse(true);
         eventPublisher.publishEvent(new DatabaseInitEvent(database));
         return database;

+ 4 - 11
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormOperationService.java

@@ -17,6 +17,7 @@ import org.hswebframework.web.entity.form.DynamicFormEntity;
 import org.hswebframework.web.service.form.DatabaseRepository;
 import org.hswebframework.web.service.form.DynamicFormOperationService;
 import org.hswebframework.web.service.form.DynamicFormService;
+import org.hswebframework.web.service.form.FormDeployService;
 import org.hswebframework.web.service.form.events.FormDataInsertBeforeEvent;
 import org.hswebframework.web.service.form.events.FormDataUpdateBeforeEvent;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,23 +36,15 @@ import java.util.Objects;
 @Transactional(rollbackFor = Throwable.class)
 public class SimpleDynamicFormOperationService implements DynamicFormOperationService {
 
+    @Autowired
     private DynamicFormService dynamicFormService;
 
+    @Autowired
     private DatabaseRepository databaseRepository;
 
     @Autowired
     private ApplicationEventPublisher eventPublisher;
 
-    @Autowired
-    public void setDynamicFormService(DynamicFormService dynamicFormService) {
-        this.dynamicFormService = dynamicFormService;
-    }
-
-    @Autowired
-    public void setDatabaseRepository(DatabaseRepository databaseRepository) {
-        this.databaseRepository = databaseRepository;
-    }
-
     protected <T> RDBTable<T> getTable(String formId) {
         DynamicFormEntity form = dynamicFormService.selectByPk(formId);
         if (null == form || Boolean.FALSE.equals(form.getDeployed())) {
@@ -167,7 +160,7 @@ public class SimpleDynamicFormOperationService implements DynamicFormOperationSe
     public <T> T selectById(String formId, Object id) {
         Objects.requireNonNull(id, "主键不能为空");
         RDBTable<T> table = getTable(formId);
-        return table.createQuery().where(idProperty,id).single();
+        return table.createQuery().where(idProperty, id).single();
     }
 
     @Override

+ 52 - 12
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormService.java

@@ -28,22 +28,23 @@ import org.hswebframework.web.service.DefaultDSLDeleteService;
 import org.hswebframework.web.service.DefaultDSLQueryService;
 import org.hswebframework.web.service.DefaultDSLUpdateService;
 import org.hswebframework.web.service.GenericEntityService;
-import org.hswebframework.web.service.form.DatabaseRepository;
-import org.hswebframework.web.service.form.DynamicFormDeployLogService;
-import org.hswebframework.web.service.form.DynamicFormService;
-import org.hswebframework.web.service.form.OptionalConvertBuilder;
+import org.hswebframework.web.service.form.*;
+import org.hswebframework.web.service.form.events.FormDeployEvent;
 import org.hswebframework.web.service.form.initialize.ColumnInitializeContext;
 import org.hswebframework.web.service.form.initialize.DynamicFormInitializeCustomer;
 import org.hswebframework.web.service.form.initialize.TableInitializeContext;
+import org.hswebframework.web.service.form.simple.cluster.ClusterDatabase;
 import org.hswebframework.web.service.form.simple.convert.SmartValueConverter;
 import org.hswebframework.web.service.form.simple.dict.EnumDictValueConverter;
 import org.hswebframework.web.validator.group.CreateGroup;
 import org.hswebframework.web.validator.group.UpdateGroup;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Caching;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -65,7 +66,11 @@ import java.util.stream.Collectors;
 @Service("dynamicFormService")
 @CacheConfig(cacheNames = "dyn-form")
 public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEntity, String>
-        implements DynamicFormService {
+        implements DynamicFormService, FormDeployService {
+
+    @Value("${hsweb.dynamic-form.tags:none}")
+    private String tags;
+
     @Autowired
     private DynamicFormDao dynamicFormDao;
 
@@ -90,6 +95,9 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
     @Autowired(required = false)
     private ObjectWrapperFactory objectWrapperFactory;
 
+    @Autowired
+    private ApplicationEventPublisher eventPublisher;
+
     @Override
     protected IDGenerator<String> getIDGenerator() {
         return IDGenerator.MD5;
@@ -110,6 +118,7 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         List<DynamicFormEntity> entities = createQuery()
                 .select(DynamicFormEntity.id)
                 .where(DynamicFormEntity.deployed, true)
+                .and(DynamicFormEntity.tags, tags)
                 .listNoPaging();
         if (logger.isDebugEnabled()) {
             logger.debug("do deploy all form , size:{}", entities.size());
@@ -156,7 +165,7 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         if (logger.isDebugEnabled()) {
             logger.debug("do deploy form {} , columns size:{}", form.getName(), columns.size());
         }
-        deploy(form, columns);
+        deploy(form, columns, true);
     }
 
 
@@ -166,6 +175,7 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         entity.setDeployed(false);
         entity.setVersion(1L);
         entity.setCreateTime(System.currentTimeMillis());
+        entity.setTags(tags);
         return super.insert(entity);
     }
 
@@ -185,6 +195,10 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         return super.updateByPk(id, entity);
     }
 
+    protected void initDatabase(RDBDatabase database) {
+
+    }
+
     @Override
     @Caching(evict = {
             @CacheEvict(value = "dyn-form-deploy", allEntries = true),
@@ -201,6 +215,7 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
                 : databaseRepository.getDatabase(form.getDataSourceId());
         database.removeTable(form.getDatabaseTableName());
         createUpdate().set(DynamicFormEntity.deployed, false).where(DynamicFormEntity.id, formId).exec();
+        eventPublisher.publishEvent(new FormDeployEvent(formId));
     }
 
     private String saveOrUpdate0(DynamicFormColumnEntity columnEntity) {
@@ -342,15 +357,29 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
     @Cacheable(value = "dyn-form-deploy", key = "'form-deploy:'+#formId+':'+#version")
     public DynamicFormColumnBindEntity selectDeployed(String formId, int version) {
         DynamicFormDeployLogEntity entity = dynamicFormDeployLogService.selectDeployed(formId, version);
-        assertNotNull(entity);
+        if (entity == null) {
+            return null;
+        }
         return JSON.parseObject(entity.getMetaData(), DynamicFormColumnBindEntity.class);
     }
 
+    @Override
+    @Cacheable(value = "dyn-form-deploy", key = "'form-deploy-version:'+#formId")
+    public long selectDeployedVersion(String formId) {
+        DynamicFormColumnBindEntity entity = selectLatestDeployed(formId);
+        if (null != entity) {
+            return entity.getForm().getVersion();
+        }
+        return 0L;
+    }
+
     @Override
     @Cacheable(value = "dyn-form-deploy", key = "'form-deploy:'+#formId+':latest'")
     public DynamicFormColumnBindEntity selectLatestDeployed(String formId) {
         DynamicFormDeployLogEntity entity = dynamicFormDeployLogService.selectLastDeployed(formId);
-        assertNotNull(entity);
+        if (entity == null) {
+            return null;
+        }
         return JSON.parseObject(entity.getMetaData(), DynamicFormColumnBindEntity.class);
     }
 
@@ -362,6 +391,7 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
 
     @Override
     @Caching(evict = {
+            @CacheEvict(value = "dyn-form-deploy", key = "'form-deploy-version:'+#formId"),
             @CacheEvict(value = "dyn-form-deploy", key = "'form-deploy:'+#formId+':latest'"),
             @CacheEvict(value = "dyn-form", allEntries = true)
     })
@@ -373,27 +403,32 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
             dynamicFormDeployLogService.cancelDeployed(formId);
         }
         List<DynamicFormColumnEntity> columns = selectColumnsByFormId(formId);
-        deploy(formEntity, columns);
+        deploy(formEntity, columns, true);
         createUpdate().set(DynamicFormEntity.deployed, true).where(DynamicFormEntity.id, formId).exec();
         try {
             dynamicFormDeployLogService.insert(createDeployLog(formEntity, columns));
+            eventPublisher.publishEvent(new FormDeployEvent(formId));
         } catch (Exception e) {
             unDeploy(formId);
             throw e;
         }
     }
 
-    protected void deploy(DynamicFormEntity form, List<DynamicFormColumnEntity> columns) {
+    public void deploy(DynamicFormEntity form, List<DynamicFormColumnEntity> columns, boolean updateMeta) {
         RDBDatabase database = StringUtils.isEmpty(form.getDataSourceId())
                 ? databaseRepository.getDefaultDatabase()
                 : databaseRepository.getDatabase(form.getDataSourceId());
+        initDatabase(database);
         RDBTableMetaData metaData = buildTable(database, form, columns);
-        metaData.setValidator(validatorFactory.createValidator(metaData));
         try {
             if (!database.getMeta().getParser().tableExists(metaData.getName())) {
                 database.createTable(metaData);
             } else {
-                database.alterTable(metaData);
+                if (!updateMeta) {
+                    database.reloadTable(metaData);
+                } else {
+                    database.alterTable(metaData);
+                }
             }
         } catch (SQLException e) {
             throw new DynamicFormException("部署失败:" + e.getMessage(), e);
@@ -464,6 +499,9 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         if (null != form.getProperties()) {
             metaData.setProperties(form.getProperties());
         }
+        metaData.setProperty("version", form.getVersion());
+        metaData.setProperty("formId", form.getId());
+
         metaData.setAlias(form.getAlias());
         metaData.setCorrelations(buildCorrelations(form.getCorrelations()));
         buildTrigger(form.getTriggers()).forEach(metaData::on);
@@ -509,6 +547,8 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         if (objectWrapperFactory != null) {
             metaData.setObjectWrapper(objectWrapperFactory.createObjectWrapper(metaData));
         }
+        metaData.setValidator(validatorFactory.createValidator(metaData));
+
         customTableSetting(database, form, metaData);
         //没有主键并且没有id字段
         if (metaData.getColumns().stream().noneMatch(RDBColumnMetaData::isPrimaryKey) && metaData.findColumn("id") == null) {

+ 51 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/cluster/ClusterDatabase.java

@@ -0,0 +1,51 @@
+package org.hswebframework.web.service.form.simple.cluster;
+
+import org.hswebframework.ezorm.rdb.RDBTable;
+import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
+import org.hswebframework.ezorm.rdb.meta.RDBDatabaseMetaData;
+import org.hswebframework.ezorm.rdb.meta.RDBTableMetaData;
+import org.hswebframework.ezorm.rdb.simple.SimpleDatabase;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public class ClusterDatabase extends SimpleDatabase {
+    public ClusterDatabase(RDBDatabaseMetaData metaData, SqlExecutor sqlExecutor) {
+        super(metaData, sqlExecutor);
+    }
+
+    private volatile Consumer<RDBTableMetaData> versionChanged;
+
+    private volatile Function<RDBTableMetaData, Long> latestVersionGetter;
+
+    public void setVersionChanged(Consumer<RDBTableMetaData> versionChanged) {
+        this.versionChanged = versionChanged;
+    }
+
+    public void setLatestVersionGetter(Function<RDBTableMetaData, Long> latestVersionGetter) {
+        this.latestVersionGetter = latestVersionGetter;
+    }
+
+    @Override
+    public <T> RDBTable<T> getTable(String name) {
+        RDBTable<T> table = super.getTable(name);
+        if (versionChanged == null || latestVersionGetter == null) {
+            return table;
+        }
+        if (table != null) {
+            long version = table.getMeta().getProperty("version", -1L).getValue();
+            if (version == -1L) {
+                return table;
+            }
+            if (version != latestVersionGetter.apply(table.getMeta())) {
+                versionChanged.accept(table.getMeta());
+            }
+            return super.getTable(name);
+        }
+        return null;
+    }
+}

+ 49 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/cluster/ClusterDatabaseInit.java

@@ -0,0 +1,49 @@
+package org.hswebframework.web.service.form.simple.cluster;
+
+import org.hswebframework.ezorm.rdb.RDBDatabase;
+import org.hswebframework.web.entity.form.DynamicFormColumnBindEntity;
+import org.hswebframework.web.service.form.DynamicFormService;
+import org.hswebframework.web.service.form.FormDeployService;
+import org.hswebframework.web.service.form.events.DatabaseInitEvent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Component
+public class ClusterDatabaseInit {
+
+    @Autowired
+    private DynamicFormService dynamicFormService;
+
+    @Autowired
+    private FormDeployService formDeployService;
+
+    @EventListener
+    public void handleDatabaseInit(DatabaseInitEvent event) {
+        RDBDatabase database = event.getDatabase();
+
+        if (database instanceof ClusterDatabase) {
+            ClusterDatabase clusterDatabase = ((ClusterDatabase) database);
+            clusterDatabase.setVersionChanged(meta -> {
+                String formId = meta.getProperty("formId").getValue();
+                if (formId != null) {
+                    DynamicFormColumnBindEntity entity = dynamicFormService.selectLatestDeployed(formId);
+                    if (null != entity) {
+                        formDeployService.deploy(entity.getForm(), entity.getColumns(), true);
+                    }
+                }
+            });
+            clusterDatabase.setLatestVersionGetter(meta -> {
+                String formId = meta.getProperty("formId").getValue();
+                if (formId != null) {
+                    return dynamicFormService.selectDeployedVersion(formId);
+                }
+                return -1L;
+            });
+        }
+    }
+}

+ 1 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/form/DynamicFormMapper.xml

@@ -19,6 +19,7 @@
         <result property="dataSourceId" column="data_source_id" javaType="String" jdbcType="VARCHAR"/>
         <result property="properties" column="properties" javaType="java.util.Map" jdbcType="CLOB"/>
         <result property="type" column="type" javaType="String" jdbcType="VARCHAR"/>
+        <result property="tags" column="tags" javaType="String" jdbcType="VARCHAR"/>
     </resultMap>
 
     <!--用于动态生成sql所需的配置-->

+ 1 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-starter/src/main/resources/hsweb-starter.js

@@ -36,6 +36,7 @@ function install(context) {
         .addColumn().name("create_time").alias("createTime").comment("创建时间").jdbcType(java.sql.JDBCType.DECIMAL).length(32, 0).commit()
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").jdbcType(java.sql.JDBCType.DECIMAL).length(32, 0).commit()
         .addColumn().name("properties").alias("properties").comment("其他配置").jdbcType(java.sql.JDBCType.CLOB).commit()
+        .addColumn().name("tags").alias("tags").comment("标签").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .comment("动态表单").commit();
 
     database.createOrAlter("s_dyn_form_column")

+ 2 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ActivityConfigServiceImpl.java

@@ -1,5 +1,6 @@
 package org.hswebframework.web.workflow.service.imp;
 
+import org.hswebframework.web.commons.entity.DataStatus;
 import org.hswebframework.web.dao.CrudDao;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.service.EnableCacheGenericEntityService;
@@ -46,6 +47,7 @@ public class ActivityConfigServiceImpl extends GenericEntityService<ActivityConf
     public String insert(ActivityConfigEntity entity) {
         entity.setCreateTime(new Date());
         entity.setUpdateTime(new Date());
+        entity.setStatus(DataStatus.STATUS_ENABLED);
         return super.insert(entity);
     }
 

+ 1 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ProcessDefineConfigServiceImpl.java

@@ -47,6 +47,7 @@ public class ProcessDefineConfigServiceImpl extends EnableCacheGenericEntityServ
     public String insert(ProcessDefineConfigEntity entity) {
         entity.setCreateTime(new Date());
         entity.setUpdateTime(new Date());
+        entity.setStatus(DataStatus.STATUS_ENABLED);
         return super.insert(entity);
     }
 

+ 4 - 4
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/hsweb-starter.js

@@ -25,8 +25,8 @@ function install(context) {
         .addColumn().name("u_id").alias("id").comment("ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).primaryKey().commit()
         .addColumn().name("proc_def_key").alias("processDefineKey").comment("模板定义KEY").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("proc_def_id").alias("processDefineId").comment("模板定义ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
-        .addColumn().name("form_id").alias("formId").comment("表单ID").jdbcType(java.sql.JDBCType.VARCHAR).commit()
-        .addColumn().name("template_id").alias("formTemplateId").comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("form_id").alias("formId").comment("表单ID").length(32).jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("template_id").alias("formTemplateId").length(32).comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
         .addColumn().name("permission_dimension").alias("permissionDimension").comment("启动权限配置").jdbcType(java.sql.JDBCType.CLOB).length(32).commit()
         .addColumn().name("create_time").alias("createTime").comment("创建时间").datetime().commit()
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()
@@ -39,8 +39,8 @@ function install(context) {
         .addColumn().name("proc_def_key").alias("processDefineKey").comment("模板定义KEY").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("proc_def_id").alias("processDefineId").comment("模板定义ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("act_id").alias("activityId").comment("元图ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
-        .addColumn().name("form_id").alias("formId").comment("表单ID").jdbcType(java.sql.JDBCType.VARCHAR).commit()
-        .addColumn().name("template_id").alias("formTemplateId").comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("form_id").alias("formId").comment("表单ID").length(32).jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("template_id").alias("formTemplateId").length(32).comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
         .addColumn().name("candidate_dimension").alias("candidateDimension").comment("候选人维度").jdbcType(java.sql.JDBCType.CLOB).length(32).commit()
         .addColumn().name("create_time").alias("createTime").comment("创建时间").datetime().commit()
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()