diff --git a/README.md b/README.md
index ebc01c885aa31628b42a994eaf7cf4ae5434711c..221b6f21708146a61e0176d5b1e4e2776d331d05 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,22 @@
# data-factory
#### 介绍
-为大规模微服务构建而创建的业务模拟数据生成平台,属于天画项目中的基础产品
-天画项目链接:https://gitee.com/sky-painting。
-data-factory 平台对各个相关服务领域的数据源进行聚合,同时基于业务模型帮助构建大规模大数据量的仿真业务数据。
-致力于在分布式微服务等架构落地的同时提供真正的高并发大数据量的实战数据环境。
-
-#### 软件架构
+为大规模微服务构建而创建的业务模拟数据生成平台,属于天画项目中的基础产品。本项目依托于API管理和领域模型管理对
+数据模拟和数据mock功能做深度实现和扩展。力图提供一个通用的数据构建和使用平台,本项目也顺带实现了API管理,模型管理的功能。
+所以在此项目中进行集中管理比较有利于发挥企业数据模型的价值,为研发效能和企业提供一定竞争力。
+
+适用于如下场景:
+1. 支持API First 理念,提供web界面和plantUML导入的方式管理API(HTTP,REST,DUBBO)
+2. 提供业务领域模型驱动,数据表结构模型驱动管理可视化功能(plantUML,web界面)
+3. 平台对各个相关服务领域的数据源进行聚合,同时基于业务模型帮助构建大规模大数据量的仿真业务数据。
+4. 在分布式微服务等架构落地的同时提供真正的高并发大数据量的实战数据环境
+5. 基于前后端接口数据协议进行数据mock,包括返回值和入参模型
+6. 基于业务数据模型构建大数据平台所需的大量仿真数据
+7. 在线接口调试,将构建的数据直接与微服务的接口进行绑定调试
+8. 为测试平台提供mock数据,比如联调期间mock下游依赖或者写单元测试的时候动态mock下游依赖
+
+
+#### 软件架构-1.0
1. 功能架构图
![image](doc/img/天画-数据工厂平台.png)
2. 数据模型图
@@ -17,40 +27,99 @@ data-factory 平台对各个相关服务领域的数据源进行聚合,同时
5. 应用架构图
![image](doc/img/天画-数据工厂项目功能架构图.png)
+#### 软件架构-2.0
+1. 技术架构
+![image](doc/img/数据工厂2.0技术架构.png)
+2. 应用架构
+![image](doc/img/数据工厂2.0应用架构图.png)
+
+#### 安装教程(2.0)
+1. 克隆本项目到工作空间
+2. 通过doc/sql/datafactory-db2.0.sql 文件中的sql脚本初始化
+3. 克隆https://gitee.com/codergit.com/javautils 工具类,并install coderman-utils(1.0.5版本)
+4. 修改start-local项目中的application.properties的数据库链接配置
+5. 后端项目启动: start-local Application springboot应用
+6. 前端项目启动(需要安装nodejs): 在cmd或者终端下到/webmanager目录,输入node server启动前端,访问链接:http://localhost:3000
+
+#### 界面展示
+1. 首页
+![image](doc/img/web/首页1.png)
-#### 安装教程
+2. API界面
+![image](doc/img/web/api界面.png)
-1. 通过sql文件中的sql脚本初始化
-2. 克隆本项目,并搭建本地nacos集群,进行服务注册调试
-3. 克隆https://gitee.com/codergit.com/javautils 工具类,并install coderman-utils
-4. 运行api工程中的DataSourceControllerTest,DataFactoryControllerTest 测试服务即可看到随机数据
+3. 业务模型管理
+![image](doc/img/web/业务模型.png)
-#### 使用api
+4. 表模型管理
+![image](doc/img/web/表模型管理.png)
-1. /data/source/regist 注册数据源
-2. /datafactory/generate/simple 构建简单数据源
-3. xxxx
+5. 数据源管理
+![image](doc/img/web/数据源管理.png)
+6. 接口出参mock
+![image](doc/img/web/接口出参mock.png)
-#### 使用场景
+6. 模型后缀配置
+![image](doc/img/web/模型后缀配置.png)
-1. xxxx
-2. xxxx
-3. xxxx
+#### 重点api(2.0)
-#### 内置数据源列表
+1. 前后端接口联调时接口的数据mock返回: http://localhost:8090/apimock?apiSign=&successData=
+2. api接口入参mock: http://localhost:8090/api/reqmock
+3. api接口出参mock: http://localhost:8090/api/respmock
+
+
+#### 内置数据源列表(2.0)
##### BankFunction
银行卡号生成
+
##### CardNumberFunction
身份证号生成
+
##### PinYinFunction
汉字转拼音,提取首字母
-##### UserFunction
-电话,随机数,日期,姓名
+
+##### RandomNumFunc
+随机N位整数
+
+##### RandomFloatFunc/RandomDoubleFunc
+随机浮点数
+
+##### TelPhoneFunc
+电话
+
+##### TelPhoneFunc
+邮箱
+
+##### ChineseNameFunc
+中文姓名(内置数据文件)
+
##### PassWordFunction
随机N位密码
+##### UUidFunc
+uuid
+
+##### SnowflakeIdFunc
+snowflakeId
+
+##### CurrentTimeFunc
+当前时间戳
+
+##### DateFunc
+日期(年月日)
+
+##### DateTimeFunc
+时间(年月日 时分秒)
+
+##### CommentFunc
+一段评论(内置数据文件)
+
+##### OneEnWordFunc
+随机英文名单词(内置数据文件)
+
#### 函数式客户端开发架构
@@ -58,16 +127,22 @@ data-factory 平台对各个相关服务领域的数据源进行聚合,同时
将内置函数实现与内置随机数据文件迁移到client工程,core工程只通过接口依赖client端函数和实现
因此core的迭代和开发不受随机函数的迭代开发影响。随机函数在客户端可以通过下面的步骤进行开发并可快速集成到core中
client端无需感知core端变化,因此服务设计上更加灵活。同时通过接口和门面模式将client与core进行隔离,达到高内聚低耦合的特性。
-##### 二次开发步骤
-1. 在datafactory-client工程中的InnerDataSourceCode定义
-唯一的内置数据源dataSourceCode.
-2. 在FileDataEnums增加文件名,描述枚举
-3. 在resources/defaultfactory中增加内置数据源文件.txt
-4. 实现com.coderman.tianhua.datafactory.client.function.Function接口,这里可以单独做单元测试
-5. 在接口实现类的随机数据方法上增加DataSourceFunction注解,标注对应的新增的内置数据源
-6. 启动nacos服务,并在datafactory-api中编写单元测试,引入该新增的内置数据源
-7. 测试新增的内置数据源函数是否正常在整个数据构建中生效
-
+##### 二次开发场景
+>这里的开发场景有三种,方便集成不同场景形态的数据源内容
+1. 针对于内置函数
+ 类似于随机数,时间函数等都相当于无中生有的数据内容。二次开发步骤如下:
+ 1. 定义数据源编码
+ 2. 实现client模块中的Function接口
+ 3. 通过web页面注册到数据源中
+2. 针对于文件类的内置函数
+ 类似于中国的百家姓和名称,通过数据文件提供数据源。二次开发步骤如下:
+ 1. 定义数据源编码,文件名
+ 2. 实现client模块中的Function接口
+ 3. 实现InnerParseService接口解析文件内容
+ 4. 通过web页面注册到数据源中
+
+4. 把指定的文件当做一种数据源,按照一定格式解析后可以被使用
+ 此类场景适用于文件是多个属性的,类似于特定的数据集,目前没完全开发完。
#### 版本发布
@@ -80,6 +155,22 @@ client端无需感知core端变化,因此服务设计上更加灵活。同时
5. 生成随机数据的核心功能完成
6. 生成数据的依赖数据源全面打通(自定义数据源,NACOS,内置数据源,spring boot api)
+##### 2.0.0-SNAPSHOT
+本次发版在1.0的基础上进行全面升级,主要内容如下:
+1. 支持将dubbo 查询api作为数据源接入
+2. 支持将springboot,cloud数据源接入
+3. 代码重构,支持复杂数据模型和大批量数据生成
+4. 基于百度Amis前端低代码框架,增加可视化管理界面
+5. 支持自定义数据集加载(数据加载,数据属性绑定,大文件映射,excel加载,txt加载,json加载)
+6. 调整工程模块,适应项目需求
+7. 管理api模型,领域模型,数据库模型,数据库表字段,实现生命周期全管理
+8. 使用field DSL Rule支持复杂对象参数和模型,返回结果的构建
+9. 实现http接口,dubbo接口,service方法的返回参数和入参模型的数据mock
+10. 相对1.0版本来说增加了几个常用的内置数据源
+11. 支持复杂对象关联数据生成
+
+
+
#### 参与贡献
1. Fork 本仓库
diff --git a/TODOLIST.md b/TODOLIST.md
new file mode 100644
index 0000000000000000000000000000000000000000..5cbc6b55e9020fde4840fed38dc17de11b7aa1f7
--- /dev/null
+++ b/TODOLIST.md
@@ -0,0 +1,45 @@
+### 2.0.0 交付内容
+1. 支持dubbo服务数据源接入(down)
+2. 支持springboot,cloud数据源接入
+3. 优化数据生成速度目前本地测(100条10个字段的模型大概2-3秒)(down)
+4. 增加可视化界面配置(down)
+5. 支持自定义数据集加载(数据加载,数据属性绑定,大文件映射,excel加载,txt加载,json加载)(down)
+6. 调整工程模块(down)
+7. 管理api模型,领域模型,数据库模型,数据库表字段,实现生命周期全管理(down)
+8. 支持复杂对象参数和模型,返回结果的构建,field dsl rule(数组,图,集合)(down)
+9. 实现http接口,返回接口的mock数据(入参为接口签名)(down)
+10. 丰富数据源(增加相对常见的数据构建函数)(down)
+11. 支持复杂对象关联数据生成(down)
+
+### 2.1.0 交付内容
+1. 支持构建的数据返回sql,excel,json的数据文本
+2. 基于消息的数据生成(将生成的数据直接通过restTemplate调用远程接口插入,dubbo远程调用),使用SPI+MQ+独立模块的方案
+3. 大数据量异步任务的方式数据生成,使用xxl-job的方案
+4. 开发dubbo接口,为测试平台提供调用接口
+5. 数据统计(支持项目统计,Api统计,参数模型统计,表字段统计,数据构建统计)
+6. 对接网关进行数据mock(与测试平台进行同步)
+7. client模块独立部署(构建api调用数据工厂远程平台)
+8. 实现dubbo接口,返回接口的mock数据(入参为接口签名)
+9. 支持多个注册中心,进行服务数据调用(主要spring cloud技术栈)
+10. 支持导出各个模型的plantuml文档
+11. 释放kv常量数据配置的能力
+12. 支持随机数据使用加密算法加密
+13. 支持属性间的脚本计算解析
+14. 支持jsonstr的构建特性
+15. 支持属性是枚举数据映射(如xxxType的值指定好之后根据枚举映射关系找到xxxTypeDesc)
+
+### 2.3.0 交付内容 data-connector
+1. 支持生成SQL Insert语句同步到数据库(优先Mysql)
+2. 支持生成数据同步到消息中间件(kafka,plusar,rocketmq,es)
+3. 支持生成接口入参并调用对应服务(springboot,http,dubbo)
+
+
+
+数据工厂的服务职责:
+1.对数据源进行管理
+2.快速根据接口模型构建仿真数据
+3.管理api模型,领域模型,数据库模型,数据库表字段模型
+4.将模型参数与api(包括对外接口,服务内部接口和方法)和数据源进行挂钩
+5.统一管理枚举,常量,配置项列表
+6.构建常见数据源(姓名,电话号码)
+
diff --git a/datafactory-api/pom.xml b/adapter/pom.xml
similarity index 55%
rename from datafactory-api/pom.xml
rename to adapter/pom.xml
index 8ac73ded62a064793f8d98970ff8dc460970ea86..5f2b430fe36987700478ce1331022a2e9890f3e2 100644
--- a/datafactory-api/pom.xml
+++ b/adapter/pom.xml
@@ -4,47 +4,26 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.coderman.tianhua.datafactory
- datafactory-api
- 1.0.0-SNAPSHOT
- org.springframework.boot
- spring-boot-starter-parent
- 2.1.8.RELEASE
-
+ com.tianhua.datafactory
+ datafactory-parent
+ 2.0.0-SNAPSHOT
- datafactory-api
+
+
+ com.tianhua.datafactory
+ adapter
+ 2.0.0-SNAPSHOT
+
+
+ adapter
http://www.example.com
1.8
-
-
-
- org.springframework.cloud
- spring-cloud-dependencies
- Greenwich.SR3
- pom
- import
-
-
- org.springframework.boot
- spring-boot-dependencies
- 2.1.8.RELEASE
- pom
- import
-
-
- com.alibaba.cloud
- spring-cloud-alibaba-dependencies
- 2.1.0.RELEASE
- pom
- import
-
-
-
+
@@ -56,22 +35,12 @@
org.springframework.boot
spring-boot-starter-web
-
- org.springframework.boot
- spring-boot-starter-freemarker
-
org.springframework.boot
spring-boot-configuration-processor
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- 1.3.2
-
-
junit
junit
@@ -79,23 +48,11 @@
test
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter-test
- 1.3.2
-
-
-
- commons-io
- commons-io
- 2.7
-
com.google.guava
guava
- 29.0-jre
@@ -104,12 +61,7 @@
4.0.1
-
-
- org.mybatis
- mybatis
- 3.4.1
-
+
com.alibaba
@@ -118,31 +70,17 @@
-
-
- org.mybatis
- mybatis-spring
- 1.3.0
-
-
com.alibaba
fastjson
- 1.2.61
org.apache.commons
commons-collections4
- 4.3
-
- mysql
- mysql-connector-java
- 8.0.11
-
org.slf4j
slf4j-api
@@ -150,23 +88,17 @@
compile
-
- org.freemarker
- freemarker-gae
- 2.3.26-incubating
-
-
cglib
cglib
- 3.2.6
org.apache.commons
commons-lang3
- 3.10
+ 3.8.1
+
org.springframework
spring-test
@@ -186,18 +118,35 @@
com.coderman.utils
coderman-utils
- 1.0.3-SNAPSHOT
+
org.projectlombok
lombok
- com.coderman.tianhua.datafactory
- datafactory-core
- 1.0.0-SNAPSHOT
+ com.tianhua.datafactory
+ app
+ 2.0.0-SNAPSHOT
+
+
+ org.springframework
+ spring-aop
+
+
+
+ org.aspectj
+ aspectjrt
+ 1.6.12
+
+
+ org.aspectj
+ aspectjweaver
+ 1.6.12
+
+
@@ -206,6 +155,14 @@
org.springframework.boot
spring-boot-maven-plugin
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 8
+
+
diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/Application.java b/adapter/src/main/java/com/tianhua/datafactory/Application.java
similarity index 80%
rename from datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/Application.java
rename to adapter/src/main/java/com/tianhua/datafactory/Application.java
index 2448a65f817eabbd03416341ffd43e237296622c..e51f104f2e75846f26809fa8581aefd07ddf0a07 100644
--- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/Application.java
+++ b/adapter/src/main/java/com/tianhua/datafactory/Application.java
@@ -1,10 +1,10 @@
-package com.coderman.tianhua.datafactory.api;
+/*
+package com.tianhua.datafactory;
import com.coderman.utils.bean.CglibConvertService;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
@@ -12,16 +12,18 @@ import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.client.RestTemplate;
+*/
/**
* @Description:应用启动入口
* @Author:fanchunshuai
* @CreateTime:2020-12-02 23:07:13
* @version v1.0
-*/
+*//*
+
@SpringBootApplication
@EnableDiscoveryClient
-@ComponentScan({"com.coderman.**","com.alibaba.nacos"})
-@MapperScan(value = "com.coderman.tianhua.datafactory.core.mapper")
+@ComponentScan({"com.tianhua.**","com.alibaba.nacos"})
+@MapperScan(value = "com.tianhua.datafactory.core.mapper")
public class Application {
@Bean
@@ -40,3 +42,4 @@ public class Application {
}
}
+*/
diff --git a/adapter/src/main/java/com/tianhua/datafactory/advisor/ControllerAdvisor.java b/adapter/src/main/java/com/tianhua/datafactory/advisor/ControllerAdvisor.java
new file mode 100644
index 0000000000000000000000000000000000000000..dde2f687d8cae02e8863fc39d57a82e7fd149071
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/advisor/ControllerAdvisor.java
@@ -0,0 +1,49 @@
+package com.tianhua.datafactory.advisor;
+
+
+import com.alibaba.fastjson.JSON;
+import com.coderman.utils.response.ResultDataDto;
+import com.tianhua.datafactory.vo.ResultAmisVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+
+@Component
+@Aspect
+@Slf4j
+public class ControllerAdvisor {
+ @Around(value = "execution( public * com.tianhua.datafactory.controller.admin..*(..))")
+ public Object transferException(ProceedingJoinPoint joinPoint) {
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+ Method method = signature.getMethod();
+ try {
+ log.info("{}.{} param:{}", method.getDeclaringClass().getName(), method.getName(), JSON.toJSONString(joinPoint.getArgs()));
+ Object result = joinPoint.proceed();
+ log.info("{}.{} result:{}", method.getDeclaringClass().getName(), method.getName(), JSON.toJSONString(result));
+ return result;
+ } catch (Throwable exception) {
+ if (!method.getReturnType().getName().equals(ResultDataDto.class.getName())) {
+ log.error("sdfadsfadsfasdfxxx.........");
+ }
+ log.warn("{}.{} throw exception:{}", method.getDeclaringClass().getName(), method.getName(), exception);
+ String msg = "未知错误";
+ if (StringUtils.isNotBlank(exception.getMessage())) {
+ msg = exception.getMessage();
+ }
+ ResultAmisVO resultAmisVO = new ResultAmisVO<>();
+ resultAmisVO.setStatus(-1);
+ resultAmisVO.setMsg(msg);
+ resultAmisVO.setCode("500");
+ log.warn("resultAmisVO = {}", JSON.toJSONString(resultAmisVO));
+
+ return resultAmisVO;
+ }
+ }
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/BaseController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/BaseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..5590762231b458e644b467ee3bc970532923deff
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/BaseController.java
@@ -0,0 +1,176 @@
+package com.tianhua.datafactory.controller;
+
+import com.tianhua.datafactory.domain.enums.ApiTypeEnum;
+import com.tianhua.datafactory.vo.OptionsVO;
+import com.tianhua.datafactory.vo.datasource.DataSourceVO;
+import com.tianhua.datafactory.vo.model.FieldVO;
+import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO;
+import com.tianhua.datafactory.vo.model.ParamModelVO;
+import com.tianhua.datafactory.vo.project.ApiVO;
+import com.tianhua.datafactory.vo.project.ProjectVO;
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+* @Description:控制层基础父类
+* @Author:fanchunshuai
+* @CreateTime:2020-12-02 23:07:13
+* @version v1.0
+*/
+public class BaseController{
+
+ protected Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+ /**
+ * 包装option适配amis框架
+ * @param projectConfigVOList
+ * @return
+ */
+ public OptionsVO wrapperProject(List projectConfigVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(projectConfigVOList)){
+ return optionsVO;
+ }
+ projectConfigVOList.stream().forEach(projectConfigVO -> {
+ optionsVO.addOptionItem(projectConfigVO.getProjectDesc(), projectConfigVO.getProjectCode());
+ });
+ return optionsVO;
+ }
+
+
+
+ /**
+ * 包装option适配amis框架
+ * @param dbNameSet
+ * @return
+ */
+ public OptionsVO wrapperDbNameList(Set dbNameSet){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(dbNameSet)){
+ return optionsVO;
+ }
+ dbNameSet.stream().forEach(dbName -> optionsVO.addOptionItem(dbName, dbName));
+ return optionsVO;
+ }
+
+ /**
+ * 包装option适配amis框架
+ * @param modelSuffixConfigVOList
+ * @return
+ */
+ public OptionsVO wrapperModelSuffix(List modelSuffixConfigVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(modelSuffixConfigVOList)){
+ return optionsVO;
+ }
+ modelSuffixConfigVOList.stream().forEach(modelSuffixConfigVO -> {
+ optionsVO.addOptionItem(modelSuffixConfigVO.getSuffix(), modelSuffixConfigVO.getSuffix());
+ });
+ return optionsVO;
+ }
+
+
+
+ /**
+ * 包装option适配amis框架
+ * @param dataSourceVOList
+ * @return
+ */
+ public OptionsVO wrapperDataSource(List dataSourceVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(dataSourceVOList)){
+ return optionsVO;
+ }
+ dataSourceVOList.stream().forEach(dataSourceVO -> {
+ optionsVO.addOptionItem(dataSourceVO.getSourceName(), dataSourceVO.getSourceCode());
+ });
+ return optionsVO;
+ }
+
+
+ /**
+ * 包装option适配amis框架
+ * @param paramModelVOList
+ * @return
+ */
+ public OptionsVO wrapperParamModel(List paramModelVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(paramModelVOList)){
+ return optionsVO;
+ }
+ paramModelVOList.stream().forEach(paramModelVO -> {
+ optionsVO.addOptionItem(paramModelVO.getParamClassName()+"("+paramModelVO.getParamClassDesc()+")", paramModelVO.getParamClassName());
+ });
+ return optionsVO;
+ }
+
+ /**
+ * 包装option适配amis框架
+ * @param fieldVOList
+ * @return
+ */
+ public OptionsVO wrapperFieldModel(List fieldVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(fieldVOList)){
+ return optionsVO;
+ }
+ fieldVOList.stream().forEach(fieldVO -> optionsVO.addOptionItem(fieldVO.getFieldType() + " "+ fieldVO.getFieldName(), fieldVO.getFieldName()));
+ return optionsVO;
+ }
+
+
+ /**
+ * 包装option适配amis框架
+ * @param apiVOList
+ * @return
+ */
+ public OptionsVO wrapperApiModel(List apiVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(apiVOList)){
+ return optionsVO;
+ }
+ apiVOList.stream().forEach(apiVO -> {
+ optionsVO.addOptionItem(apiVO.getApiSign(), apiVO.getApiSign());
+ });
+ return optionsVO;
+ }
+
+ /**
+ * 包装option适配amis框架
+ * @param apiVOList
+ * @return
+ */
+ public OptionsVO wrapperApiModelV2(List apiVOList){
+ OptionsVO optionsVO = new OptionsVO();
+ if(CollectionUtils.isEmpty(apiVOList)){
+ return optionsVO;
+ }
+ apiVOList.stream().forEach(apiVO -> {
+ String apiMethod;
+ if(apiVO.getReturnParam() != null){
+ apiMethod = apiVO.getReturnParam().getParamClassName() + " " + apiVO.getApiUrl();
+ }else {
+ apiMethod = "void " + apiVO.getApiUrl();
+ }
+ StringBuilder builder = new StringBuilder(apiMethod);
+ if(CollectionUtils.isNotEmpty(apiVO.getParamList())){
+ builder.append("(");
+ for (ParamModelVO paramModelVO : apiVO.getParamList()){
+ builder.append(paramModelVO.getParamClassName()+",");
+ }
+ builder = builder.deleteCharAt(builder.length() - 1);
+ builder.append(")");
+ }
+
+ optionsVO.addOptionItem(builder.toString(), apiVO.getApiSign());
+ });
+ return optionsVO;
+ }
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/FileUploadController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/FileUploadController.java
new file mode 100644
index 0000000000000000000000000000000000000000..858438b7bfc5abeb763b32b8a22fc1d8c6270ad0
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/FileUploadController.java
@@ -0,0 +1,64 @@
+package com.tianhua.datafactory.controller;
+
+import com.coderman.utils.response.ResultDataDto;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.ClassUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Description:
+ * date: 2022/4/11
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@Controller
+@Slf4j
+public class FileUploadController {
+
+ @PostMapping(value = "/apidoc/upload")
+ public @ResponseBody
+ ResultDataDto upload(MultipartFile file){
+ // 1. 获取要上传文件的文件名
+ // 1. 获取要上传文件的文件名
+ String fileName = file.getOriginalFilename();
+ System.out.println(fileName);
+ // 2. 自定义上传路径
+ String basePath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
+
+ log.info("basePath = {}",basePath);
+
+ String path = basePath + "\\doc";
+ // 3. 判断路径是否存在,不存在则新建
+ File apiDocFile = new File(path);
+ if (!apiDocFile.exists()){
+ apiDocFile.mkdir();
+ }
+
+ // 3.改名,避免重名,定义新文件的名字
+ String newName = path + File.separator + System.currentTimeMillis() +
+ fileName.substring(fileName.lastIndexOf("."));
+
+ try {
+ file.transferTo(new File(newName));
+ Map map = new HashMap<>();
+ map.put("value",newName);
+ return ResultDataDto.success(map);
+ } catch (IOException e) {
+ return ResultDataDto.fail("500","失败");
+ }
+ }
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ApiController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ApiController.java
new file mode 100644
index 0000000000000000000000000000000000000000..e13d9ac3768581c7f5408360efd9bf3ab60334ba
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ApiController.java
@@ -0,0 +1,268 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.ApiConverter;
+import com.tianhua.datafactory.convert.ParamConverter;
+import com.tianhua.datafactory.core.service.ApiMockDataAdapter;
+import com.tianhua.datafactory.core.service.PlantUMLApiModelBuilderService;
+import com.tianhua.datafactory.domain.bo.bean.PageBean;
+import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO;
+import com.tianhua.datafactory.domain.bo.model.ParamModelBO;
+import com.tianhua.datafactory.domain.bo.project.ApiBO;
+import com.tianhua.datafactory.domain.bo.project.ProjectBO;
+import com.tianhua.datafactory.domain.repository.ProjectQueryRepository;
+import com.tianhua.datafactory.domain.repository.ProjectRepository;
+import com.tianhua.datafactory.infrast.dataconvert.ApiConvert;
+import com.tianhua.datafactory.vo.PageVO;
+import com.tianhua.datafactory.vo.StatusChangeVO;
+import com.tianhua.datafactory.vo.project.ApiMockVO;
+import com.tianhua.datafactory.vo.project.ApiVO;
+import com.tianhua.datafactory.vo.query.ApiQueryVO;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.coderman.utils.response.ResultDataDto;
+
+
+/**
+* @Description:控制层
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@RestController
+public class ApiController extends BaseController {
+
+ protected Logger logger = LoggerFactory.getLogger(ApiController.class);
+
+
+ @Autowired
+ private ProjectQueryRepository projectQueryRepository;
+
+ @Autowired
+ private ProjectRepository projectRepository;
+
+
+ @Autowired
+ private PlantUMLApiModelBuilderService plantUMLApiModelBuilderService;
+ @Autowired
+ private ApiMockDataAdapter apiMockDataAdapter;
+
+ /**
+ *
+ * @Description 新建api信息
+ * @param apiVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/api/add",method = RequestMethod.POST)
+ public ResultDataDto add(@RequestBody ApiVO apiVO){
+ ApiBO apiBO = ApiConverter.INSTANCE.vo2bo(apiVO);
+ apiBO.init();
+ ParamModelBO returnParamModel = new ParamModelBO();
+ returnParamModel.setParamClassName(apiVO.getReturnParamClass());
+ apiBO.setReturnParamModel(returnParamModel);
+ apiBO.setReturnValue("");
+ ProjectBO projectBO = ProjectBO.getInstance();
+ projectBO.addApiBo(apiBO);
+ projectRepository.saveProject(projectBO);
+ return ResultDataDto.success(true);
+ }
+
+ /**
+ *
+ * @Description 分页获取api信息
+ * @param apiQueryVO
+ * @return PageVO
+ */
+ @RequestMapping(value = "/api/pagelist")
+ public ResultDataDto> getPageList(ApiQueryVO apiQueryVO){
+ PageBean pageBean = apiQueryVO.getPageBean();
+ pageBean = projectQueryRepository.queryApiPage(pageBean);
+ List apiVOList = ApiConverter.INSTANCE.BOs2VOs(projectQueryRepository.queryApiPage(pageBean).getRows());
+
+ apiQueryVO.setRows(apiVOList);
+ apiQueryVO.setCount(pageBean.getCount());
+ return ResultDataDto.success(apiQueryVO);
+ }
+
+ /**
+ *
+ * @Description 修改api信息
+ * @param id
+ * @param apiVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/api/update/{id}")
+ public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ApiVO apiVO){
+ ApiBO apiBO = ApiConverter.INSTANCE.vo2bo(apiVO);
+ apiBO.setId(id);
+
+ ProjectBO projectBO = ProjectBO.getInstance();
+ projectBO.addApiBo(apiBO);
+ projectRepository.updateProject(projectBO);
+ return ResultDataDto.success(true);
+ }
+
+
+ /**
+ *
+ * @Description 修改api状态
+ * amis bug, 迷之不好实现
+ * @param id
+ * @return Boolean
+ */
+ @Deprecated
+ @RequestMapping(value = "/api/status/{id}",method = RequestMethod.POST)
+ public ResultDataDto updateStatus(@PathVariable(value = "id") Long id,@RequestBody StatusChangeVO statusChangeVO){
+ logger.info("id = {}",id);
+ logger.info("statusChangeVO = {}",JSON.toJSONString(statusChangeVO));
+ ApiBO apiBO = projectQueryRepository.getApiById(id);
+
+ apiBO.updateStatus(statusChangeVO.getStatus());
+ ProjectBO projectBO = ProjectBO.getInstance();
+ projectBO.addApiBo(apiBO);
+ projectRepository.updateProject(projectBO);
+ return ResultDataDto.success(true);
+ }
+
+
+ /**
+ *
+ * @Description 搜索api信息
+ * @param content
+ * @return List
+ */
+ @RequestMapping(value = "/api/search")
+ public ResultDataDto> select(@RequestParam(value = "content", required = true) String content){
+ List list = projectQueryRepository.searchApi(content);
+ return ResultDataDto.success(ApiConverter.INSTANCE.BOs2VOs(list));
+ }
+
+ @RequestMapping(value = "/api/getById/{id}")
+ public ResultDataDto getById(@PathVariable(value = "id") Long id){
+ ApiBO apiBO = projectQueryRepository.getApiById(id);
+ return ResultDataDto.success(ApiConverter.INSTANCE.bo2VO(apiBO));
+ }
+
+
+ /**
+ * 以文件上传的方式批量构建api模型
+ * @param apiVO
+ * @return
+ */
+ @PostMapping("/api/batchBuild")
+ public ResultDataDto batchBuild(@RequestBody ApiVO apiVO){
+ plantUMLApiModelBuilderService.initPlantUMlModel(apiVO.getProjectCode(), apiVO.getFile());
+ return ResultDataDto.success();
+ }
+
+ /**
+ * 根据项目编码查询apiSign
+ * @param projectCode
+ * @return
+ */
+ @GetMapping("/api/searchApiSign")
+ public ResultDataDto searchApiSign(@RequestParam(value = "projectCode", required = false) String projectCode){
+ if(StringUtils.isEmpty(projectCode)){
+ return ResultDataDto.success();
+ }
+ List list = projectQueryRepository.getApiListByCode(projectCode);
+ return ResultDataDto.success(wrapperApiModel(ApiConverter.INSTANCE.BOs2VOs(list)));
+ }
+
+
+
+ /**
+ * 根据项目编码查询apiSign
+ * @param projectCode
+ * @return
+ */
+ @GetMapping("/api/searchApiSignV2")
+ public ResultDataDto searchApiSignV2(@RequestParam(value = "projectCode", required = false) String projectCode){
+ if(StringUtils.isEmpty(projectCode)){
+ return ResultDataDto.success();
+ }
+ List list = projectQueryRepository.getApiListByCode(projectCode);
+
+ return ResultDataDto.success(wrapperApiModelV2(ApiConverter.INSTANCE.BOs2VOs(list)));
+ }
+
+
+ /**
+ *
+ * @Description mock api接口出参mock
+ * @param apiMockVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/api/respmock",method = RequestMethod.POST)
+ public ResultDataDto reqMock(@RequestBody ApiMockVO apiMockVO) throws Exception {
+ if(StringUtils.isNotEmpty(apiMockVO.getApiMethod())){
+ apiMockVO.setApiSign(apiMockVO.getApiMethod());
+ }
+ if(apiMockVO.getMockCount() != null && apiMockVO.getMockCount() > 1000){
+ throw new Exception("web请求mock数量不可超过1000");
+ }
+ Object value = apiMockDataAdapter.getApiMockDataResp(ApiConverter.INSTANCE.vo2BOMock(apiMockVO));
+ String jsonValue = JSONObject.toJSONString(value, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullBooleanAsFalse);
+ apiMockVO.setMockResultData(jsonValue);
+ return ResultDataDto.success(apiMockVO);
+ }
+
+ /**
+ *
+ * @Description mock api接口入参mock
+ * @param apiMockVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/api/reqmock",method = RequestMethod.POST)
+ public ResultDataDto respMock(@RequestBody ApiMockVO apiMockVO) throws Exception {
+ if(StringUtils.isNotEmpty(apiMockVO.getApiMethod())){
+ apiMockVO.setApiSign(apiMockVO.getApiMethod());
+ }
+ if(apiMockVO.getMockCount() != null && apiMockVO.getMockCount() > 1000){
+ throw new Exception("web请求mock数量不可超过1000");
+ }
+ Object value = apiMockDataAdapter.getApiMockDataReq(ApiConverter.INSTANCE.vo2BOMock(apiMockVO));
+ String jsonValue = JSONObject.toJSONString(value, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullBooleanAsFalse);
+ apiMockVO.setMockResultData(jsonValue);
+ return ResultDataDto.success(apiMockVO);
+ }
+
+ @RequestMapping(value = "/api/getparamlist")
+ public ResultDataDto getFieldListV2(@RequestParam(value = "apiSign", required = false) String apiSign){
+
+ Map mapResult = new HashMap<>();
+ mapResult.put("rows", null);
+ mapResult.put("count", 0);
+ if(StringUtils.isEmpty(apiSign)){
+ return ResultDataDto.success(mapResult);
+ }
+
+ ApiBO apiBO = projectQueryRepository.getBySign(apiSign);
+
+ if(CollectionUtils.isEmpty(apiBO.getParamList())){
+ return ResultDataDto.success(mapResult);
+ }
+
+ ApiVO apiVO = ApiConverter.INSTANCE.bo2VO(apiBO);
+
+ //适配amis service组件 使用map封装一层
+ mapResult.put("rows", apiVO.getParamList());
+ mapResult.put("count",apiVO.getParamList().size());
+
+ return ResultDataDto.success(mapResult);
+ }
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataEnumController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataEnumController.java
new file mode 100644
index 0000000000000000000000000000000000000000..93f34d7dec3595e743d4114c645799028da93be5
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataEnumController.java
@@ -0,0 +1,84 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.coderman.utils.response.ResultDataDto;
+import com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum;
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.domain.enums.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Description:
+ * date: 2022/5/31
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@RestController
+@Slf4j
+public class DataEnumController extends BaseController {
+
+ /**
+ * @param enumCode
+ * @return ResultDataDto 构建结果
+ * @Description:根据数据源构建数据
+ * @version v1.0
+ */
+ @RequestMapping(value = "/dataEnum/{enumCode}", method = RequestMethod.GET)
+ public ResultDataDto generate(@PathVariable(value = "enumCode") String enumCode) {
+ if(ApiTypeEnum.isApiType(enumCode)){
+ return ResultDataDto.success(ApiTypeEnum.getOptionList());
+ }
+
+ if(DataSourceTypeEnum.isDataSourceType(enumCode)){
+ return ResultDataDto.success(DataSourceTypeEnum.getOptionList());
+ }
+
+ if(ModelTypeEnum.isModelType(enumCode)){
+ return ResultDataDto.success(ModelTypeEnum.getOptionList());
+ }
+
+ if(ModelValueMappingType.isModelValueMapping(enumCode)){
+ return ResultDataDto.success(ModelValueMappingType.getOptionList());
+ }
+
+ if(VisitStrategyEnums.isVisitStrategy(enumCode)){
+ return ResultDataDto.success(VisitStrategyEnums.getOptionList());
+ }
+
+ if(MethodTypeEnum.isMethodType(enumCode)){
+ return ResultDataDto.success(MethodTypeEnum.getOptionList());
+ }
+ if(RegistServerEnum.isRegistServer(enumCode)){
+ return ResultDataDto.success(RegistServerEnum.getOptionList());
+ }
+
+ if(ReturnWrapClassEnum.isReturnWrapClass(enumCode)){
+ return ResultDataDto.success(ReturnWrapClassEnum.getOptionList());
+ }
+
+ if(ReturnTypeEnum.isReturnType(enumCode)){
+ return ResultDataDto.success(ReturnTypeEnum.getOptionList());
+ }
+
+ if(ApiModelFieldStatusEnum.isApiModelFieldStatus(enumCode)){
+ return ResultDataDto.success(ApiModelFieldStatusEnum.getOptionList());
+ }
+
+ if(JavaFieldTypeEnum.isJavaFieldTypeEnum(enumCode)){
+ return ResultDataDto.success(JavaFieldTypeEnum.getOptionList());
+ }
+
+ if(ColumnTypeEnums.isColumnFieldTypeEnum(enumCode)){
+ return ResultDataDto.success(ColumnTypeEnums.getOptionList());
+ }
+
+
+ return ResultDataDto.success();
+ }
+
+
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataFactoryController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataFactoryController.java
new file mode 100644
index 0000000000000000000000000000000000000000..f601025ff280e78a3b0166b0dc4091edf6f86b5b
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataFactoryController.java
@@ -0,0 +1,70 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.DataFactoryConverter;
+import com.tianhua.datafactory.core.service.ApiMockDataAdapter;
+import com.tianhua.datafactory.core.service.DataFactoryService;
+import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO;
+import com.tianhua.datafactory.vo.datafactory.DataBuildRequestVo;
+import com.coderman.utils.response.ResultDataDto;
+import com.tianhua.datafactory.vo.datasource.DataSourceVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * description: DataFactoryController
+ * date: 2020/12/2 23:43
+ * author: coderman
+ * version: 1.0
+ */
+@RestController
+@Slf4j
+public class DataFactoryController extends BaseController {
+
+ @Autowired
+ private DataFactoryService dataFactoryService;
+
+ /**
+ * @param dataFactoryRequestVo
+ * @return ResultDataDto 构建结果
+ * @Description:根据数据源构建数据
+ * @version v1.0
+ */
+ @PostMapping(value = "/datafactory/generate")
+ public ResultDataDto generate(@RequestBody DataBuildRequestVo dataFactoryRequestVo) {
+ DataBuildRequestBO dataBuildRequestBO = DataFactoryConverter.INSTANCE.convert2BO(dataFactoryRequestVo);
+
+ try {
+ ResultDataDto>> resultDataDto = dataFactoryService.generateData(dataBuildRequestBO);
+
+ String jsonValue = JSONObject.toJSONString(resultDataDto.getData(), SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullBooleanAsFalse);
+ dataFactoryRequestVo.setMockResultData(jsonValue);
+ return ResultDataDto.success(dataFactoryRequestVo);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * @param dataFactoryRequestVo
+ * @return ResultDataDto 构建结果
+ * @Description:根据数据源构建数据 适用于单表,或者单模块构建
+ * @version v1.0
+ */
+ @RequestMapping(value = "/datafactory/generate/simple", method = RequestMethod.POST)
+ public ResultDataDto generateSimple(@RequestBody DataBuildRequestVo dataFactoryRequestVo) {
+ logger.info("dataFactoryRequestVo = {}", JSON.toJSONString(dataFactoryRequestVo));
+
+ ResultDataDto resultDataDto = new ResultDataDto();
+ return resultDataDto;
+ }
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataSourceController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataSourceController.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb997878039326633ee76d8881422cb42edccd71
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataSourceController.java
@@ -0,0 +1,154 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.DataSourceConverter;
+import com.coderman.utils.response.ResultDataDto;
+import com.coderman.utils.response.ResultDto;
+import com.tianhua.datafactory.domain.bo.bean.PageBean;
+import com.tianhua.datafactory.domain.enums.DataSourceTypeEnum;
+import com.tianhua.datafactory.domain.enums.VisitStrategyEnums;
+import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository;
+import com.tianhua.datafactory.domain.repository.DataSourceRepository;
+import com.tianhua.datafactory.vo.PageVO;
+import com.tianhua.datafactory.vo.datasource.DataSourceVO;
+import com.tianhua.datafactory.vo.query.DataSourceQueryVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+* @Description:数据源管理表控制层
+* @Author:fanchunshuai
+* @CreateTime:2020-12-02 23:07:13
+* @version v1.0
+*/
+@RestController
+@Slf4j
+public class DataSourceController extends BaseController {
+
+ @Autowired
+ private DataSourceRepository dataSourceRepository;
+
+
+ @Autowired
+ private DataSourceQueryRepository dataSourceQueryRepository;
+
+ /**
+ * @Description:新增数据源管理表
+ * @version v1.0
+ * @param dataSourceVo
+ * @return ResultDto
+ */
+ @RequestMapping(value = "/datasource/regist",method = RequestMethod.POST)
+ public ResultDto save(@RequestBody DataSourceVO dataSourceVo){
+ try {
+ dataSourceRepository.regist(DataSourceConverter.INSTANCE.vo2bo(dataSourceVo));
+ return ResultDto.success();
+ } catch (Exception e) {
+ log.error("保存失败",e);
+ return ResultDto.fail("500","保存失败");
+ }
+
+ }
+
+ /**
+ * @Description:修改数据源管理表
+ * @version v1.0
+ * @param dataSourceVo
+ * @return ResultDto
+ */
+ @RequestMapping(value = "/datasource/update/{id}",method = RequestMethod.POST)
+ public ResultDto update(@PathVariable(value = "id") Long id, @RequestBody DataSourceVO dataSourceVo){
+ try {
+ dataSourceVo.init();
+ dataSourceVo.setId(id);
+ dataSourceRepository.update(DataSourceConverter.INSTANCE.vo2bo(dataSourceVo));
+ return ResultDto.success();
+ } catch (Exception e) {
+ log.error("修改失败",e);
+ return ResultDto.fail("500","修改失败");
+ }
+ }
+
+ /**
+ * @Description:根据id删除数据源管理表
+ * @version v1.0
+ * @param id
+ * @return ResultDto
+ */
+ @PostMapping(value = "/datasource/delete/{id}")
+ public ResultDto delete(@PathVariable(value = "id") Long id){
+ dataSourceRepository.delete(id);
+ return ResultDto.success();
+ }
+
+ /**
+ * @Description:根据ID获取数据源管理表单条记录
+ * @version v1.0
+ * @param id
+ * @return ResultDataDto
+ */
+ @GetMapping("/datasource/getById/{id}")
+ public ResultDataDto getById(@PathVariable(value = "id") Long id){
+ try {
+ DataSourceVO dataSourceVO = DataSourceConverter.INSTANCE.bo2VO(dataSourceRepository.getById(id));
+ return ResultDataDto.success(dataSourceVO);
+ } catch (Exception e) {
+ log.error("查询失败",e);
+ return ResultDataDto.fail("500","查询失败");
+ }
+ }
+
+ /**
+ * @Description:分页获取数据源管理表记录
+ * @version v1.0
+ * @return ResultDataDto
+ */
+ @GetMapping("/datasource/pagelist")
+ public ResultDataDto> getPage(DataSourceQueryVO pageVO){
+ PageBean pageBean = pageVO.getPageBean();
+ List dataSourceVOList = DataSourceConverter.INSTANCE.bo2VOs(dataSourceRepository.getPageList(pageBean).getRows());
+ dataSourceVOList.stream().forEach(dataSourceVO -> {
+ dataSourceVO.setSourceTypeDesc(DataSourceTypeEnum.getDesc(dataSourceVO.getSourceType()));
+ dataSourceVO.setVisitStrategyDesc(VisitStrategyEnums.getDesc(dataSourceVO.getVisitStrategy()));
+ });
+ pageVO.setRows(dataSourceVOList);
+ pageVO.setCount(pageBean.getCount());
+ return ResultDataDto.success(pageVO);
+ }
+
+
+ /**
+ * @Description:启用数据源
+ * @version v1.0
+ * @param id
+ * @return ResultDataDto
+ */
+ @PostMapping("/datasource/enable/{id}")
+ public ResultDto enable(@PathVariable(name = "id") Long id){
+ dataSourceRepository.updateStatus(id,1);
+ return ResultDto.success();
+ }
+
+ /**
+ * @Description:启用数据源
+ * @version v1.0
+ * @param id
+ * @return ResultDataDto
+ */
+ @PostMapping("/datasource/disable/{id}")
+ public ResultDto disable(@PathVariable(name = "id") Long id){
+ dataSourceRepository.updateStatus(id,0);
+ return ResultDto.success();
+ }
+
+ @RequestMapping(value = "/datasource/search",method = RequestMethod.GET)
+ public ResultDataDto search(String content){
+ List dataSourceVOList = DataSourceConverter.INSTANCE.bo2VOs(dataSourceQueryRepository.search(content));
+ return ResultDataDto.success(wrapperDataSource(dataSourceVOList));
+ }
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelMappingController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelMappingController.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f101fd463f2e34f4189ddd28feea4824a163e12
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelMappingController.java
@@ -0,0 +1,99 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.coderman.utils.response.ResultDataDto;
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.ModelMappingConverter;
+import com.tianhua.datafactory.convert.ModelSuffixConverter;
+import com.tianhua.datafactory.core.service.ModelMappingBuilderService;
+import com.tianhua.datafactory.domain.bo.bean.PageBean;
+import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO;
+import com.tianhua.datafactory.domain.repository.ModelQueryRepository;
+import com.tianhua.datafactory.domain.repository.ModelRepository;
+import com.tianhua.datafactory.vo.model.ModelMappingVO;
+import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO;
+import com.tianhua.datafactory.vo.query.ModelMappingQueryVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Optional;
+
+
+/**
+* @Description:模型映射控制层
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@RestController
+public class ModelMappingController extends BaseController {
+
+ protected Logger logger = LoggerFactory.getLogger(ModelMappingController.class);
+
+
+ @Autowired
+ private ModelRepository modelRepository;
+
+ @Autowired
+ private ModelQueryRepository modelQueryRepository;
+
+ @Autowired
+ private ModelMappingBuilderService modelMappingBuilderService;
+ /**
+ *
+ * @Description 新建模型映射
+ * @param modelMappingVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/modelmapping/add",method = RequestMethod.POST)
+ public ResultDataDto add(@RequestBody ModelMappingVO modelMappingVO){
+ modelRepository.saveModelMapping(ModelMappingConverter.INSTANCE.vo2bo(modelMappingVO));
+ return ResultDataDto.success();
+ }
+
+ /**
+ *
+ * @Description 修改模型后缀
+ * @param id
+ * @param modelSuffixConfigVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/modelmapping/update/{id}",method = RequestMethod.POST)
+ public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ModelSuffixConfigVO modelSuffixConfigVO){
+ ModelSuffixConfigBO modelSuffixConfigBO = ModelSuffixConverter.INSTANCE.vo2bo(modelSuffixConfigVO);
+ modelSuffixConfigBO.setId(id);
+ modelRepository.updateModelSuffix(modelSuffixConfigBO);
+ return ResultDataDto.success();
+ }
+
+ @GetMapping(value = "/modelmapping/pagelist")
+ public ResultDataDto getList(ModelMappingQueryVO modelMappingQueryVO){
+ PageBean pageBean = modelMappingQueryVO.getPageBean();
+ List modelSuffixConfigVOList = ModelMappingConverter.INSTANCE.BOs2VOs(modelQueryRepository.queryModelMappingPage(pageBean).getRows());
+ modelMappingQueryVO.setRows(modelSuffixConfigVOList);
+ modelMappingQueryVO.setCount(pageBean.getCount());
+ return ResultDataDto.success(modelMappingQueryVO);
+ }
+
+
+ @GetMapping(value = "/modelmapping/getById/{id}")
+ public ResultDataDto getById(@PathVariable(value = "id") Long id){
+ Optional modelSuffixConfigBOOptional = modelQueryRepository.getModelSuffixConfigList().stream().filter(modelSuffixConfigBO -> modelSuffixConfigBO.getId().equals(id)).findFirst();
+ return ResultDataDto.success(ModelSuffixConverter.INSTANCE.bo2VO(modelSuffixConfigBOOptional.get()));
+ }
+
+
+ /**
+ * 快速构建映射模型
+ * @param modelMappingVO
+ * @return
+ */
+ @PostMapping(value = "/modelmapping/fast")
+ public ResultDataDto fastMapping(@RequestBody ModelMappingVO modelMappingVO){
+ modelMappingBuilderService.buildModelMappingBatch(ModelMappingConverter.INSTANCE.vo2bo(modelMappingVO));
+ return ResultDataDto.success();
+ }
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelSuffixController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelSuffixController.java
new file mode 100644
index 0000000000000000000000000000000000000000..7104633faa9f8d498ba3ee347e75a20418c66c76
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelSuffixController.java
@@ -0,0 +1,83 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.ModelSuffixConverter;
+import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO;
+import com.tianhua.datafactory.domain.repository.ModelQueryRepository;
+import com.tianhua.datafactory.domain.repository.ModelRepository;
+import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.coderman.utils.response.ResultDataDto;
+import java.util.List;
+import java.util.Optional;
+
+
+/**
+* @Description:控制层
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@RestController
+public class ModelSuffixController extends BaseController {
+
+ protected Logger logger = LoggerFactory.getLogger(ModelSuffixController.class);
+
+
+ @Autowired
+ private ModelRepository modelRepository;
+
+ @Autowired
+ private ModelQueryRepository modelQueryRepository;
+
+ /**
+ *
+ * @Description 新建模型后缀
+ * @param modelSuffixConfigVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/modelsuffix/add",method = RequestMethod.POST)
+ public ResultDataDto add(@RequestBody ModelSuffixConfigVO modelSuffixConfigVO){
+ modelRepository.saveModelSuffix(ModelSuffixConverter.INSTANCE.vo2bo(modelSuffixConfigVO));
+ return ResultDataDto.success();
+ }
+
+ /**
+ *
+ * @Description 修改模型后缀
+ * @param id
+ * @param modelSuffixConfigVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/modelsuffix/update/{id}",method = RequestMethod.POST)
+ public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ModelSuffixConfigVO modelSuffixConfigVO){
+ ModelSuffixConfigBO modelSuffixConfigBO = ModelSuffixConverter.INSTANCE.vo2bo(modelSuffixConfigVO);
+ modelSuffixConfigBO.setId(id);
+ modelRepository.updateModelSuffix(modelSuffixConfigBO);
+ return ResultDataDto.success();
+ }
+
+ @GetMapping(value = "/modelsuffix/list")
+ public ResultDataDto> getList(){
+ List modelSuffixConfigVOList = ModelSuffixConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelSuffixConfigList());
+ return ResultDataDto.success(modelSuffixConfigVOList);
+ }
+
+
+ @GetMapping(value = "/modelsuffix/getById/{id}")
+ public ResultDataDto getById(@PathVariable(value = "id") Long id){
+ Optional modelSuffixConfigBOOptional = modelQueryRepository.getModelSuffixConfigList().stream().filter(modelSuffixConfigBO -> modelSuffixConfigBO.getId().equals(id)).findFirst();
+ return ResultDataDto.success(ModelSuffixConverter.INSTANCE.bo2VO(modelSuffixConfigBOOptional.get()));
+ }
+
+
+ @GetMapping(value = "/modelsuffix/listoption")
+ public ResultDataDto getListOption(){
+ List modelSuffixConfigVOList = ModelSuffixConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelSuffixConfigList());
+ return ResultDataDto.success(wrapperModelSuffix(modelSuffixConfigVOList));
+ }
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ParamController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ParamController.java
new file mode 100644
index 0000000000000000000000000000000000000000..ddcdded506df7b9f89f5d328957492e487964656
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ParamController.java
@@ -0,0 +1,194 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.FieldConverter;
+import com.tianhua.datafactory.convert.ParamConverter;
+import com.tianhua.datafactory.core.service.PlantUMLDomainModelBuilderService;
+import com.tianhua.datafactory.domain.bo.bean.PageBean;
+import com.tianhua.datafactory.domain.bo.model.ParamModelBO;
+import com.tianhua.datafactory.domain.repository.ModelQueryRepository;
+import com.tianhua.datafactory.domain.repository.ModelRepository;
+import com.tianhua.datafactory.vo.OptionsVO;
+import com.tianhua.datafactory.vo.PageVO;
+import com.tianhua.datafactory.vo.model.FieldVO;
+import com.tianhua.datafactory.vo.model.ParamModelVO;
+import com.tianhua.datafactory.vo.query.ParamModelQueryVO;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import com.coderman.utils.response.ResultDataDto;
+
+
+/**
+* @Description:模型控制层
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@RestController
+public class ParamController extends BaseController {
+
+ protected Logger logger = LoggerFactory.getLogger(ParamController.class);
+
+ @Autowired
+ private ModelRepository modelRepository;
+
+ @Autowired
+ private ModelQueryRepository modelQueryRepository;
+
+ @Autowired
+ private PlantUMLDomainModelBuilderService plantUMLDomainModelBuilderService;
+
+ /**
+ * @param paramModelVO
+ * @return Boolean
+ * @Description 新建参数模型
+ */
+ @RequestMapping(value = "/parammodel/add", method = RequestMethod.POST)
+ @Transactional(rollbackFor = Exception.class)
+ public ResultDataDto add(@RequestBody ParamModelVO paramModelVO) {
+
+ ParamModelBO paramModelBO = ParamConverter.INSTANCE.vo2bo(paramModelVO);
+ modelRepository.saveParamModel(paramModelBO);
+ return ResultDataDto.success();
+ }
+
+ /**
+ * @param id
+ * @return Boolean
+ * @Description 根据code获取参数模型
+ */
+ @RequestMapping(value = "/parammodel/getById/{id}")
+ public ResultDataDto getByID(@PathVariable(value = "id") Long id) {
+ ParamModelBO paramModelBO = modelQueryRepository.getByParamId(id);
+ return ResultDataDto.success(ParamConverter.INSTANCE.bo2VO(paramModelBO));
+ }
+
+ /**
+ * @param pageVO
+ * @return PageVO
+ * @Description 分页获取参数模型
+ */
+ @RequestMapping(value = "/parammodel/pagelist")
+ public ResultDataDto> getPageList(ParamModelQueryVO pageVO) {
+ PageBean pageBean = pageVO.getPageBean();
+ List paramModelVOList = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.queryParamPage(pageBean).getRows());
+ pageVO.setRows(paramModelVOList);
+ pageVO.setCount(pageBean.getCount());
+ return ResultDataDto.success(pageVO);
+
+ }
+
+ /**
+ * @param id
+ * @param paramModelVO
+ * @return Boolean
+ * @Description 修改参数模型
+ */
+ @RequestMapping(value = "/parammodel/update/{id}")
+ public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ParamModelVO paramModelVO) {
+ ParamModelBO paramModelBO = ParamConverter.INSTANCE.vo2bo(paramModelVO);
+ paramModelBO.setId(id);
+ paramModelBO.getFieldBeanList().forEach(fieldBO -> {
+ fieldBO.setParamClassName(paramModelBO.getParamClassName());
+ fieldBO.setProjectCode(paramModelBO.getProjectCode());
+ });
+ modelRepository.updateParamModel(paramModelBO);
+ return ResultDataDto.success();
+ }
+
+ /**
+ * @param content
+ * @return List
+ * @Description 搜索参数模型
+ */
+ @RequestMapping(value = "/parammodel/search")
+ public ResultDataDto> select(@RequestParam(value = "content", required = true) String content) {
+ List paramModelVOS = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.searchParamModel(content));
+ return ResultDataDto.success(paramModelVOS);
+ }
+
+
+ /**
+ * @param projectCode
+ * @return List
+ * @Description 搜索参数模型
+ */
+ @RequestMapping(value = "/parammodel/getByProjectCode")
+ public ResultDataDto getByProjectCode(@RequestParam(value = "projectCode") String projectCode) {
+ if (StringUtils.isEmpty(projectCode)) {
+ return ResultDataDto.success(new OptionsVO());
+ }
+ List paramModelVOS = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelByProjectCode(projectCode));
+ return ResultDataDto.success(wrapperParamModel(paramModelVOS));
+ }
+
+
+ /**
+ * @param projectCode
+ * @return List
+ * @Description 搜索参数模型
+ */
+ @RequestMapping(value = "/parammodel/getFieldList/{projectCode}/{paramClassName}")
+ public ResultDataDto getFieldList(@RequestParam(value = "projectCode", required = false) String projectCode, @RequestParam(value = "paramClassName", required = false) String paramClassName) {
+ if (StringUtils.isEmpty(projectCode) || StringUtils.isEmpty(paramClassName)) {
+ return ResultDataDto.success(new OptionsVO());
+ }
+
+ List fieldVOList = FieldConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelField(projectCode, paramClassName));
+ return ResultDataDto.success(wrapperFieldModel(fieldVOList));
+ }
+
+ @PostMapping("/parammodel/batchBuild")
+ public ResultDataDto batchBuild(@RequestBody ParamModelVO paramModelVO) {
+ plantUMLDomainModelBuilderService.initPlantUMlDomainModel(paramModelVO.getProjectCode(), paramModelVO.getFile());
+ return ResultDataDto.success();
+ }
+
+ /**
+ * @param projectCode
+ * @return List
+ * @Description 搜索参数模型
+ */
+ @RequestMapping(value = "/parammodel/getByProjectCodeV2")
+ public ResultDataDto getByProjectCodeV2(@RequestParam(value = "projectCode", required = false) String projectCode) {
+ if (StringUtils.isEmpty(projectCode)) {
+ return ResultDataDto.success();
+ }
+ List paramModelVOS = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelByProjectCode(projectCode));
+ return ResultDataDto.success(wrapperParamModel(paramModelVOS));
+ }
+
+ @RequestMapping(value = "/parammodel/getFieldListV2")
+ public ResultDataDto getFieldListV2(@RequestParam(value = "projectCode", required = false) String projectCode, @RequestParam(value = "paramClassName", required = false) String paramClassName) {
+ if (StringUtils.isEmpty(projectCode) || StringUtils.isEmpty(paramClassName)) {
+ return ResultDataDto.success();
+ }
+ List fieldVOList = FieldConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelField(projectCode, paramClassName));
+ //适配amis service组件 使用map封装一层
+ Map mapResult = new HashMap<>();
+ mapResult.put("rows", fieldVOList);
+ mapResult.put("count", fieldVOList.size());
+
+ return ResultDataDto.success(mapResult);
+ }
+
+
+ @RequestMapping(value = "/parammodel/getFieldListV3")
+ public ResultDataDto getFieldListV3(@RequestParam(value = "projectCode", required = false) String projectCode, @RequestParam(value = "paramClassName", required = false) String paramClassName) {
+ if (StringUtils.isEmpty(projectCode) || StringUtils.isEmpty(paramClassName)) {
+ return ResultDataDto.success();
+ }
+ List fieldVOList = FieldConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelField(projectCode, paramClassName));
+
+ return ResultDataDto.success(wrapperFieldModel(fieldVOList));
+ }
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ProjectController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ProjectController.java
new file mode 100644
index 0000000000000000000000000000000000000000..8fdfdf190e4936d7fd105fb863300d144495f2e6
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ProjectController.java
@@ -0,0 +1,112 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.alibaba.fastjson.JSON;
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.ProjectConverter;
+import com.tianhua.datafactory.domain.bo.bean.PageBean;
+import com.tianhua.datafactory.domain.bo.project.ProjectBO;
+import com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum;
+import com.tianhua.datafactory.domain.repository.ProjectQueryRepository;
+import com.tianhua.datafactory.domain.repository.ProjectRepository;
+import com.tianhua.datafactory.vo.PageVO;
+import com.tianhua.datafactory.vo.project.ProjectVO;
+import com.tianhua.datafactory.vo.query.ProjectQueryVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import com.coderman.utils.response.ResultDataDto;
+
+
+/**
+* @Description:控制层
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@RestController
+public class ProjectController extends BaseController {
+
+ protected Logger logger = LoggerFactory.getLogger(ProjectController.class);
+
+ @Autowired
+ private ProjectRepository projectRepository;
+
+
+ @Autowired
+ private ProjectQueryRepository projectQueryRepository;
+
+
+ /**
+ *
+ * @Description 新建项目
+ * @param projectVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/project/add")
+ public ResultDataDto add(@RequestBody ProjectVO projectVO){
+ projectVO.init();
+ projectVO.setStatus(ApiModelFieldStatusEnum.USING.getStatus());
+ projectRepository.saveProject(ProjectConverter.INSTANCE.vo2bo(projectVO));
+ return ResultDataDto.success();
+ }
+
+ /**
+ *
+ * @Description 根据code获取项目详情
+ * @param projectCode
+ * @return Boolean
+ */
+ @RequestMapping(value = "/project/getByCode/{projectCode}")
+ public ResultDataDto getByCode(@PathVariable(value = "projectCode") String projectCode) throws Exception {
+ ProjectBO projectBO = projectRepository.getByCode(projectCode);
+ projectBO.setApiList(null);
+ return ResultDataDto.success(ProjectConverter.INSTANCE.bo2VO(projectBO));
+ }
+
+ /**
+ *
+ * @Description 分页获取项目信息
+ * @param pageVO
+ * @return PageVO
+ */
+ @RequestMapping(value = "/project/pagelist")
+ public ResultDataDto> getPageList(ProjectQueryVO pageVO){
+ PageBean pageBean = pageVO.getPageBean();
+ pageBean = projectQueryRepository.queryProjectPage(pageBean);
+ logger.info("ProjectQueryVO pageVo = "+ JSON.toJSONString(pageVO));
+ List moduleConfigVOList = ProjectConverter.INSTANCE.BOs2VOs(projectQueryRepository.queryProjectPage(pageBean).getRows());
+ pageVO.setRows(moduleConfigVOList);
+ pageVO.setCount(pageBean.getCount());
+ return ResultDataDto.success(pageVO);
+ }
+
+ /**
+ *
+ * @Description 修改项目信息
+ * @param projectVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/project/update/{projectCode}",method = RequestMethod.POST)
+ @Transactional(rollbackFor = Exception.class)
+ public ResultDataDto update(@PathVariable(value = "projectCode") String projectCode, @RequestBody ProjectVO projectVO){
+ projectRepository.updateProject(ProjectConverter.INSTANCE.vo2bo(projectVO));
+ return ResultDataDto.success();
+ }
+
+ /**
+ *
+ * @Description 搜索项目信息
+ * @param content
+ * @return List
+ */
+ @RequestMapping(value = "/project/search",method = RequestMethod.GET)
+ public ResultDataDto select(String content){
+ List projectBOList = projectQueryRepository.searchProject(content);
+ return ResultDataDto.success(wrapperProject(ProjectConverter.INSTANCE.BOs2VOs(projectBOList)));
+ }
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/TableController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/TableController.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f406e8a174a2101eb497eded26769b8199cfcba
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/TableController.java
@@ -0,0 +1,160 @@
+package com.tianhua.datafactory.controller.admin;
+
+import com.tianhua.datafactory.controller.BaseController;
+import com.tianhua.datafactory.convert.TableConverter;
+import com.tianhua.datafactory.core.service.TableModelBuilderService;
+import com.tianhua.datafactory.domain.bo.bean.PageBean;
+import com.tianhua.datafactory.domain.bo.model.TableBO;
+import com.tianhua.datafactory.domain.repository.ModelQueryRepository;
+import com.tianhua.datafactory.domain.repository.ModelRepository;
+import com.tianhua.datafactory.vo.PageVO;
+import com.tianhua.datafactory.vo.model.ColumnVO;
+import com.tianhua.datafactory.vo.model.TableVO;
+import com.tianhua.datafactory.vo.query.TableQueryVO;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.coderman.utils.response.ResultDataDto;
+
+
+/**
+* @Description:控制层
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@RestController
+public class TableController extends BaseController {
+
+ protected Logger logger = LoggerFactory.getLogger(TableController.class);
+
+ @Autowired
+ private ModelRepository modelRepository;
+
+ @Autowired
+ private ModelQueryRepository modelQueryRepository;
+
+ @Autowired
+ private TableModelBuilderService tableModelBuilderService;
+
+ /**
+ *
+ * @Description 新建表结构模型
+ * @param tableVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/table/add",method = RequestMethod.POST)
+ public ResultDataDto add(@RequestBody TableVO tableVO){
+ modelRepository.saveDBModel(TableConverter.INSTANCE.vo2bo(tableVO));
+ return ResultDataDto.success();
+ }
+
+ /**
+ *
+ * @Description 根据code获取表结构模型
+ * @param id
+ * @return Boolean
+ */
+ @RequestMapping(value = "/table/getById/{id}")
+ public ResultDataDto getByTableId(@PathVariable(value = "id") Long id){
+ TableBO tableBO = modelQueryRepository.getByTableId(id);
+ return ResultDataDto.success(TableConverter.INSTANCE.bo2VO(tableBO));
+ }
+
+ /**
+ *
+ * @Description 分页获取表结构模型
+ * @param pageVO
+ * @return PageVO
+ */
+ @RequestMapping(value = "/table/pagelist")
+ public ResultDataDto> getPageList(TableQueryVO pageVO){
+ PageBean pageBean = pageVO.getPageBean();
+ pageBean = modelQueryRepository.queryTablePage(pageBean);
+ List tableVOList = TableConverter.INSTANCE.BOs2VOs(modelQueryRepository.queryTablePage(pageBean).getRows());
+ pageVO.setRows(tableVOList);
+ pageVO.setCount(pageBean.getCount());
+ return ResultDataDto.success(pageVO);
+ }
+
+ /**
+ *
+ * @Description 修改表结构模型
+ * @param id
+ * @param tableVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/table/update/{id}")
+ public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody TableVO tableVO){
+ tableVO.init();
+ TableBO tableBO = TableConverter.INSTANCE.vo2bo(tableVO);
+ tableBO.setId(id);
+ modelRepository.updateDBModel(tableBO);
+ return ResultDataDto.success();
+ }
+
+ /**
+ *
+ * @Description 搜索表结构模型
+ * @param content
+ * @return List
+ */
+ @RequestMapping(value = "/table/search")
+ public ResultDataDto> select(@RequestParam(value = "content", required = true) String content){
+ List tableBOList = modelQueryRepository.searchTable(content);
+ return ResultDataDto.success(TableConverter.INSTANCE.BOs2VOs(tableBOList));
+ }
+
+ /**
+ *
+ * @Description 搜索表结构模型
+ * @param content
+ * @return List
+ */
+ @RequestMapping(value = "/table/searchdb",method = RequestMethod.GET)
+ public ResultDataDto searchdb(String content){
+ if(StringUtils.isEmpty(content)){
+ return ResultDataDto.success();
+ }
+ List tableBOList = modelQueryRepository.searchTable(content);
+ Set dbNameSet = tableBOList.stream().map(TableBO::getDbName).collect(Collectors.toSet());
+
+ return ResultDataDto.success(wrapperDbNameList(dbNameSet));
+ }
+
+
+
+ /**
+ *
+ * @Description 根据表ID获取表字段列表
+ * @param tableId
+ * @return Boolean
+ */
+ @RequestMapping(value = "/table/columns/{tableId}",method = RequestMethod.GET)
+ public ResultDataDto> update(@PathVariable(value = "tableId") Long tableId){
+ TableBO tableBO = modelQueryRepository.getByTableId(tableId);
+ TableVO tableVO = TableConverter.INSTANCE.bo2VO(tableBO);
+ return ResultDataDto.success(tableVO.getColumnList());
+ }
+
+ /**
+ *
+ * @Description 通过plantUML 文档 构建 表结构模型
+ * @param tableVO
+ * @return Boolean
+ */
+ @RequestMapping(value = "/table/upload",method = RequestMethod.POST)
+ public ResultDataDto build(@RequestBody TableVO tableVO){
+ tableModelBuilderService.buildERModel(TableConverter.INSTANCE.vo2bo(tableVO));
+ return ResultDataDto.success();
+ }
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/webmock/WebMockController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/webmock/WebMockController.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c664fd3c3741af6daaa23e8d1040782838a268c
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/controller/webmock/WebMockController.java
@@ -0,0 +1,74 @@
+package com.tianhua.datafactory.controller.webmock;
+
+import com.coderman.utils.response.ResultDataDto;
+import com.tianhua.datafactory.client.factory.ReturnWrapClassFactory;
+import com.tianhua.datafactory.convert.ApiConverter;
+import com.tianhua.datafactory.core.service.ApiMockDataAdapter;
+import com.tianhua.datafactory.core.service.DataFactoryService;
+import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO;
+import com.tianhua.datafactory.domain.bo.project.ApiBO;
+import com.tianhua.datafactory.domain.repository.ProjectQueryRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Description
+ * date: 2022/9/4
+ *
+ * @author shenshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@RestController
+@Slf4j
+public class WebMockController {
+
+ @Autowired
+ private ProjectQueryRepository projectQueryRepository;
+
+
+ @Autowired
+ private ApiMockDataAdapter apiMockDataAdapter;
+
+
+ /**
+ * 前后端接口联调时接口的数据mock返回
+ * @return
+ */
+ @RequestMapping(value = "/apimock",method = RequestMethod.GET)
+ public Object getApiResponseData(@RequestParam(value = "apiSign") String apiSign,@RequestParam(value = "successData",required = false) Boolean successData){
+ try {
+ ApiMockBO apiMockBO = new ApiMockBO();
+ apiMockBO.setApiSign(apiSign);
+ apiMockBO.setSuccessData(successData);
+ return apiMockDataAdapter.getApiMockDataResp(apiMockBO);
+ } catch (Exception e) {
+ log.error("获取数据失败",e);
+ }
+ return ResultDataDto.fail("500","获取mock数据失败,请联系管理员");
+ }
+
+
+ /**
+ * 获取基于项目的后端api签名列表
+ * @param projectCode
+ * @return
+ */
+ @RequestMapping(value = "/apisign/{projectCode}",method = RequestMethod.GET)
+ public ResultDataDto getApiSginData(@PathVariable(value = "projectCode") String projectCode){
+ ResultDataDto resultDataDto = new ResultDataDto<>();
+ List apiBOList = projectQueryRepository.getApiListByCode(projectCode);
+ //过滤掉非web接口
+ apiBOList = apiBOList.stream().filter(apiBO -> apiBO.getApiSign().contains("/")).collect(Collectors.toList());
+
+ resultDataDto.setData(ApiConverter.INSTANCE.BOs2VOs(apiBOList));
+ return resultDataDto;
+ }
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ApiConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ApiConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..db9e97ad05571574f45e558fd5c248dcca84e98c
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ApiConverter.java
@@ -0,0 +1,70 @@
+package com.tianhua.datafactory.convert;
+
+import java.util.List;
+
+import com.alibaba.fastjson.JSON;
+import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO;
+import com.tianhua.datafactory.domain.bo.model.ParamModelBO;
+import com.tianhua.datafactory.domain.bo.project.ApiBO;
+
+import com.tianhua.datafactory.vo.project.ApiMockVO;
+import com.tianhua.datafactory.vo.project.ApiVO;
+import org.apache.commons.lang3.StringUtils;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+/**
+* @Description:ApiConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface ApiConverter{
+ ApiConverter INSTANCE = Mappers.getMapper(ApiConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return ApiVO
+ */
+ @Mappings({
+ @Mapping(target = "apiReturnWrapTypeDesc",expression = "java(com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum.getDesc(apiBO.getApiReturnWrapType()))"),
+ @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(apiBO.getStatus()))"),
+ @Mapping(target = "returnParam",expression = "java(ParamConverter.INSTANCE.bo2VO(apiBO.getReturnParamModel()))"),
+ })
+ ApiVO bo2VO(ApiBO apiBO);
+ /**
+ *
+ * @Description:
+ * @return ApiBO
+ */
+ @Mappings({
+ @Mapping(target = "returnParamModel",expression = "java(ParamConverter.INSTANCE.vo2bo(apiVO.getReturnParam()))"),
+ })
+ ApiBO vo2bo(ApiVO apiVO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List apiBOList);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+
+ /**
+ * 接口mock请求
+ * @param apiMockVO
+ * @return
+ */
+ ApiMockBO vo2BOMock(ApiMockVO apiMockVO);
+
+
+
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataFactoryConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataFactoryConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..357c9dd85c8297cd873b32b4ba6dec8f8b68a9e1
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataFactoryConverter.java
@@ -0,0 +1,91 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.core.utils.DateUtils;
+import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO;
+import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO;
+import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum;
+import com.tianhua.datafactory.vo.datafactory.DataBuildRequestVo;
+import com.tianhua.datafactory.vo.model.FieldVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description
+ * date: 2022/9/9
+ *
+ * @author shenshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@Mapper
+public interface DataFactoryConverter {
+ DataFactoryConverter INSTANCE = Mappers.getMapper(DataFactoryConverter.class);
+
+
+ @Mappings({
+ @Mapping(target = "fieldBOList",expression = "java(convert2BO(dataBuildRequestVo.getFieldVOList()))"),
+ })
+ DataBuildRequestBO convert2BO(DataBuildRequestVo dataBuildRequestVo);
+
+ @Mappings({
+ @Mapping(target = "defaultValueList",expression = "java(getDefaultValueList(fieldVO.getDefaultValueList(),fieldVO.getFieldType()))"),
+ })
+ DataBuildRequestFieldBO convert2BO(FieldVO fieldVO);
+
+
+ List convert2BO(List fieldVOList);
+
+ default List getDefaultValueList(String defaultValueListStr,String type){
+ if(defaultValueListStr == null || defaultValueListStr == ""){
+ return null;
+ }
+ List defaultValueList = new ArrayList();
+ String [] valueArr = defaultValueListStr.split(",");
+ if(JavaFieldTypeEnum.isInt(type)){
+ for (String value : valueArr){
+ defaultValueList.add(Integer.parseInt(value));
+ }
+ }else if(JavaFieldTypeEnum.isLong(type)){
+ for (String value : valueArr){
+ defaultValueList.add(Long.parseLong(value));
+ }
+ }else if(JavaFieldTypeEnum.isFloat(type)){
+ for (String value : valueArr){
+ defaultValueList.add(Float.parseFloat(value));
+ }
+ }
+ else if(JavaFieldTypeEnum.isDouble(type)){
+ for (String value : valueArr){
+ defaultValueList.add(Double.parseDouble(value));
+ }
+ }
+ else if(JavaFieldTypeEnum.isString(type)){
+ for (String value : valueArr){
+ defaultValueList.add(value);
+ }
+ }
+ //yyyy-MM-dd
+ else if(JavaFieldTypeEnum.isDate(type)){
+ for (String value : valueArr){
+ defaultValueList.add(DateUtils.string2Date(value,"yyyy-MM-dd"));
+ }
+ }
+
+ //yyyy-MM-dd
+ else if(JavaFieldTypeEnum.isDateTime(type)){
+ for (String value : valueArr){
+ defaultValueList.add(DateUtils.string2Date(value,"yyyy-MM-dd HH:mm:ss"));
+ }
+ }
+
+ return defaultValueList;
+
+ }
+
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..26785757202ab9ee851e021e891e1f0eb5c4384d
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceConverter.java
@@ -0,0 +1,66 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO;
+import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO;
+import com.tianhua.datafactory.vo.datasource.DataSourceReqConfigVO;
+import com.tianhua.datafactory.vo.datasource.DataSourceVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * Description:
+ * date: 2022/5/30
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@Mapper(imports = {
+ DataSourceRespConverter.class,
+ DataSourceReqConverter.class,
+ KVPairConverter.class
+})
+public interface DataSourceConverter {
+ DataSourceConverter INSTANCE = Mappers.getMapper(DataSourceConverter.class);
+
+ /**
+ * bo聚合对象转换为vo聚合对象
+ * @Description:
+ * @return dataSourceBO
+ */
+ @Mappings({
+ @Mapping(target = "dataSourceReqConfigList",expression = "java(DataSourceReqConverter.INSTANCE.bo2VOs(dataSourceBO.getDataSourceReqConfigList()))"),
+ @Mapping(target = "dataSourceRespConfigList",expression = "java(DataSourceRespConverter.INSTANCE.bo2VOs(dataSourceBO.getDataSourceRespConfigList()))"),
+ @Mapping(target = "kvPairList",expression = "java(KVPairConverter.INSTANCE.BOs2VOs(dataSourceBO.getKvPairList()))"),
+ @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(dataSourceBO.getStatus()))"),
+ @Mapping(target = "visitStrategyDesc",expression = "java(com.tianhua.datafactory.domain.enums.VisitStrategyEnums.getDesc(dataSourceBO.getVisitStrategy()))"),
+ @Mapping(target = "sourceTypeDesc",expression = "java(com.tianhua.datafactory.domain.enums.DataSourceTypeEnum.getDesc(dataSourceBO.getSourceType()))"),
+
+ })
+ DataSourceVO bo2VO(DataSourceBO dataSourceBO);
+
+ /**
+ * vo聚合对象转换为bo聚合对象
+ * @param dataSourceVO
+ * @return
+ */
+ @Mappings({
+ @Mapping(target = "dataSourceReqConfigList",expression = "java(DataSourceReqConverter.INSTANCE.vo2BOs(dataSourceVO.getDataSourceReqConfigList()))"),
+ @Mapping(target = "dataSourceRespConfigList",expression = "java(DataSourceRespConverter.INSTANCE.vo2BOs(dataSourceVO.getDataSourceRespConfigList()))"),
+ @Mapping(target = "kvPairList",expression = "java(KVPairConverter.INSTANCE.VOs2BOs(dataSourceVO.getKvPairList()))")
+
+ })
+ DataSourceBO vo2bo(DataSourceVO dataSourceVO);
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBOList
+ */
+ List bo2VOs(List dataSourceBOList);
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceReqConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceReqConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..08e5988a1c1f4a7902521c151da9e9f7ff7123d9
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceReqConverter.java
@@ -0,0 +1,49 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO;
+import com.tianhua.datafactory.vo.datasource.DataSourceReqConfigVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * Description:
+ * date: 2022/5/30
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@Mapper
+public interface DataSourceReqConverter {
+ DataSourceReqConverter INSTANCE = Mappers.getMapper(DataSourceReqConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBO
+ */
+ DataSourceReqConfigVO bo2VO(DataSourceReqConfigBO dataSourceReqConfigBO);
+ /**
+ *
+ * @Description:
+ * @return dataSourceRespConfigVO
+ */
+ DataSourceReqConfigBO vo2bo(DataSourceReqConfigVO dataSourceRespConfigVO);
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBOList
+ */
+ List bo2VOs(List dataSourceRespConfigBOList);
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBOList
+ */
+ List vo2BOs(List dataSourceReqConfigVOList);
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceRespConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceRespConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..099fc8be42229b445b3e1789960550ff5372aecd
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceRespConverter.java
@@ -0,0 +1,50 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.bo.datasource.DataSourceRespConfigBO;
+import com.tianhua.datafactory.vo.datasource.DataSourceRespConfigVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * Description:
+ * date: 2022/5/30
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@Mapper
+public interface DataSourceRespConverter {
+ DataSourceRespConverter INSTANCE = Mappers.getMapper(DataSourceRespConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBO
+ */
+ DataSourceRespConfigVO bo2VO(DataSourceRespConfigBO dataSourceBO);
+ /**
+ *
+ * @Description:
+ * @return DataSourceBO
+ */
+ DataSourceRespConfigBO vo2bo(DataSourceRespConfigVO dataSourceRespConfigVO);
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBOList
+ */
+ List bo2VOs(List dataSourceRespConfigBOList);
+
+
+ /**
+ *
+ * @Description:
+ * @return dataSourceBOList
+ */
+ List vo2BOs(List dataSourceRespConfigVOList);
+
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/FieldConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/FieldConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..56b123712582944538555dd2ca3a583b1d5793a9
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/FieldConverter.java
@@ -0,0 +1,109 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.bo.model.FieldBO;
+import com.tianhua.datafactory.domain.bo.model.FieldExtBO;
+import com.tianhua.datafactory.vo.model.FieldVO;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Lists;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @Description:paramConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface FieldConverter {
+ FieldConverter INSTANCE = Mappers.getMapper(FieldConverter.class);
+
+ /**
+ * vo列表转换成bo列表
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+
+ /**
+ * vo转换成bo
+ * @Description:
+ * @return ParamModelBO
+ */
+ @Mappings({
+ @Mapping(target = "fieldExtBO",expression = "java(vo2boExt(fieldVO))"),
+ })
+ FieldBO vo2bo(FieldVO fieldVO);
+
+ /**
+ * vo转换成bo
+ * @Description:
+ * @return ParamModelBO
+ */
+ @Mappings({
+ @Mapping(target = "defaultValueList",expression = "java(split(fieldVO.getDefaultValueList()))"),
+ })
+ FieldExtBO vo2boExt(FieldVO fieldVO);
+
+ /**
+ * bo转换成vo
+ * @Description:
+ * @return fieldBO
+ */
+ @Mappings({
+ @Mapping(target = "dataSourceCode",expression = "java(fieldBO.getFieldExtBO().getDataSourceCode())"),
+ @Mapping(target = "bizUnique",expression = "java(fieldBO.getFieldExtBO().getBizUnique())"),
+ @Mapping(target = "bizIdentifier",expression = "java(fieldBO.getFieldExtBO().getBizIdentifier())"),
+ @Mapping(target = "complexStruct",expression = "java(fieldBO.getFieldExtBO().getComplexStruct())"),
+ @Mapping(target = "checkRule",expression = "java(fieldBO.getFieldExtBO().getCheckRule())"),
+ @Mapping(target = "mappingDBColumn",expression = "java(fieldBO.getFieldExtBO().getMappingDBColumn())"),
+ @Mapping(target = "defaultValueList",expression = "java(join(fieldBO.getFieldExtBO().getDefaultValueList()))"),
+
+ })
+ FieldVO bo2VO(FieldBO fieldBO);
+
+
+
+ @Mappings({
+ @Mapping(target = "defaultValueList",expression = "java(join(fieldExtBO.getDefaultValueList()))"),
+ })
+ FieldVO vo2boExt(FieldExtBO fieldExtBO);
+
+
+
+ /**
+ * bo列表转换成vo列表
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List fieldBOList);
+
+ default String join(List list){
+ if(CollectionUtils.isEmpty(list)){
+ return "";
+ }
+ return StringUtils.join(list,",");
+ }
+
+
+ default List split(String str){
+ if(StringUtils.isEmpty(str)){
+ return Lists.newArrayList();
+ }
+ if(str.contains(",")){
+ String [] arr = StringUtils.split(str,",");
+ List list = new ArrayList<>();
+ for (String ele : arr){
+ list.add(ele);
+ }
+ return list;
+ }
+ return Lists.newArrayList(str);
+ }
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/KVPairConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/KVPairConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..d04ff6fa206e79dcd7aa5e28f9324dc76850b063
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/KVPairConverter.java
@@ -0,0 +1,47 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.support.kvpair.KVPairBO;
+import com.tianhua.datafactory.vo.datasource.KVPairVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* @Description:
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface KVPairConverter {
+ KVPairConverter INSTANCE = Mappers.getMapper(KVPairConverter.class);
+
+ /**
+ * vo列表转换成bo列表
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+
+ /**
+ * vo转换成bo
+ * @Description:
+ * @return ParamModelBO
+ */
+ KVPairBO vo2bo(KVPairVO KVPairVO);
+
+ /**
+ * bo转换成vo
+ * @Description:
+ * @return KVPairBO
+ */
+ KVPairVO bo2VO(KVPairBO KVPairBO);
+
+ /**
+ * bo列表转换成vo列表
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List KVPairBOList);
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ModelMappingConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelMappingConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..a952a244e27a552509df905c16ecc42d8a11e6a3
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelMappingConverter.java
@@ -0,0 +1,44 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.bo.model.ModelMappingBO;
+import com.tianhua.datafactory.vo.model.ModelMappingVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* @Description:ModelSuffixConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface ModelMappingConverter {
+ ModelMappingConverter INSTANCE = Mappers.getMapper(ModelMappingConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return ModelSuffixConfigBO
+ */
+ ModelMappingBO vo2bo(ModelMappingVO modelMappingVO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List modelSuffixConfigBOList);
+ /**
+ *
+ * @Description:
+ * @return ModelSuffixConfigVO
+ */
+ ModelMappingVO bo2VO(ModelMappingBO modelMappingBO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ModelSuffixConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelSuffixConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec21751265ab6444069ac5809bd24d47c341a6a2
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelSuffixConverter.java
@@ -0,0 +1,46 @@
+package com.tianhua.datafactory.convert;
+
+import java.util.List;
+import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO;
+
+import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+/**
+* @Description:ModelSuffixConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface ModelSuffixConverter{
+ ModelSuffixConverter INSTANCE = Mappers.getMapper(ModelSuffixConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return ModelSuffixConfigBO
+ */
+ ModelSuffixConfigBO vo2bo(ModelSuffixConfigVO modelSuffixConfigVO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List modelSuffixConfigBOList);
+ /**
+ *
+ * @Description:
+ * @return ModelSuffixConfigVO
+ */
+ ModelSuffixConfigVO bo2VO(ModelSuffixConfigBO modelSuffixConfigBO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ParamConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ParamConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5c104ec3bc09556ecda18e1702d2788c0b8524f
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ParamConverter.java
@@ -0,0 +1,53 @@
+package com.tianhua.datafactory.convert;
+
+import java.util.List;
+import com.tianhua.datafactory.domain.bo.model.ParamModelBO;
+
+import com.tianhua.datafactory.vo.model.ParamModelVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+/**
+* @Description:paramConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface ParamConverter{
+ ParamConverter INSTANCE = Mappers.getMapper(ParamConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+ /**
+ *
+ * @Description:
+ * @return ParamModelBO
+ */
+ @Mappings({
+ @Mapping(target = "fieldBeanList",expression = "java(FieldConverter.INSTANCE.VOs2BOs(paramModelVO.getFieldBeanList()))"),
+ })
+ ParamModelBO vo2bo(ParamModelVO paramModelVO);
+ /**
+ *
+ * @Description:
+ * @return ParamModelVO
+ */
+ @Mappings({
+ @Mapping(target = "fieldBeanList",expression = "java(FieldConverter.INSTANCE.BOs2VOs(paramModelBO.getFieldBeanList()))"),
+ @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(paramModelBO.getStatus()))"),
+ })
+ ParamModelVO bo2VO(ParamModelBO paramModelBO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List paramModelBOList);
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ProjectConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ProjectConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..a04ff8a0d7909aa0ee10dba01fd2e26a61000451
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ProjectConverter.java
@@ -0,0 +1,49 @@
+package com.tianhua.datafactory.convert;
+
+import java.util.List;
+import com.tianhua.datafactory.domain.bo.project.ProjectBO;
+
+import com.tianhua.datafactory.vo.project.ProjectVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+/**
+* @Description:projectConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface ProjectConverter{
+ ProjectConverter INSTANCE = Mappers.getMapper(ProjectConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List projectBOList);
+ /**
+ *
+ * @Description:
+ * @return ProjectVO
+ */
+ @Mappings({
+ @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(projectBO.getStatus()))"),
+ })
+ ProjectVO bo2VO(ProjectBO projectBO);
+ /**
+ *
+ * @Description:
+ * @return ProjectBO
+ */
+ ProjectBO vo2bo(ProjectVO projectVO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/TableConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/TableConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..5357da2c11b9bf4c4553e2815cac928f0e78974e
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/convert/TableConverter.java
@@ -0,0 +1,49 @@
+package com.tianhua.datafactory.convert;
+
+import com.tianhua.datafactory.domain.bo.model.TableBO;
+import java.util.List;
+
+import com.tianhua.datafactory.vo.model.TableVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+/**
+* @Description:tableConvertervobo接口
+* @Author:
+* @CreateTime:2022-05-27 17:45:38
+* @version v1.0
+*/
+@Mapper
+public interface TableConverter{
+ TableConverter INSTANCE = Mappers.getMapper(TableConverter.class);
+
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List BOs2VOs(List tableBOList);
+ /**
+ *
+ * @Description:
+ * @return TableBO
+ */
+ TableBO vo2bo(TableVO tableVO);
+ /**
+ *
+ * @Description:
+ * @return TableVO
+ */
+ @Mappings({
+ @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(tableBO.getStatus()))"),
+ })
+ TableVO bo2VO(TableBO tableBO);
+ /**
+ *
+ * @Description:
+ * @return List
+ */
+ List VOs2BOs(List vOList);
+}
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/package-info.java b/adapter/src/main/java/com/tianhua/datafactory/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..aec72340ba22d5d644b8a6186960c6e61b572bc2
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/package-info.java
@@ -0,0 +1 @@
+package com.tianhua.datafactory;
\ No newline at end of file
diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/BaseVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/BaseVO.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f90de0f03edfc562ef328035d0494702a3ca89b
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/vo/BaseVO.java
@@ -0,0 +1,86 @@
+package com.tianhua.datafactory.vo;
+
+import java.util.Date;
+
+/**
+ * Description:
+ * date: 2022/4/24
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+public class BaseVO {
+ /** 创建时间 **/
+ public Date dateCreate;
+ /** 修改时间 **/
+ public Date dateUpdate;
+ /** 修改人 **/
+ public Long updateUserId;
+ /** 创建人 **/
+ public Long createUserId;
+
+ /**
+ * 状态
+ * @See com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum
+ */
+ private Integer status;
+ public String statusDesc;
+
+
+
+ public void init(){
+ this.createUserId = 1L;
+ this.updateUserId = 1L;
+ this.dateCreate = new Date();
+ this.dateUpdate = new Date();
+ }
+
+ public Date getDateCreate() {
+ return dateCreate;
+ }
+
+ public void setDateCreate(Date dateCreate) {
+ this.dateCreate = dateCreate;
+ }
+
+ public Date getDateUpdate() {
+ return dateUpdate;
+ }
+
+ public void setDateUpdate(Date dateUpdate) {
+ this.dateUpdate = dateUpdate;
+ }
+
+ public Long getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(Long updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public Long getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(Long createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public String getStatusDesc() {
+ return statusDesc;
+ }
+
+ public void setStatusDesc(String statusDesc) {
+ this.statusDesc = statusDesc;
+ }
+}
diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/OptionsVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/OptionsVO.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0800b5064bbf46455435ff55da3ec54a33d6f36
--- /dev/null
+++ b/adapter/src/main/java/com/tianhua/datafactory/vo/OptionsVO.java
@@ -0,0 +1,32 @@
+package com.tianhua.datafactory.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description:
+ * date: 2022/5/17
+ *
+ * @author fanchunshuai
+ * @version 1.0.0
+ * @since JDK 1.8
+ */
+@Data
+public class OptionsVO {
+
+ private List